Skip to content

Commit c821c9c

Browse files
authored
chore: avoid logging netcheck send errors if STUN is disabled (#40)
1 parent 8d4d23e commit c821c9c

File tree

3 files changed

+138
-1
lines changed

3 files changed

+138
-1
lines changed

tailcfg/derpmap.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ type DERPMap struct {
2828
OmitDefaultRegions bool `json:"omitDefaultRegions,omitempty"`
2929
}
3030

31+
// HasSTUN returns true if there are any STUN servers in the DERPMap.
32+
func (m *DERPMap) HasSTUN() bool {
33+
for _, r := range m.Regions {
34+
for _, n := range r.Nodes {
35+
if n.STUNPort >= 0 {
36+
return true
37+
}
38+
}
39+
}
40+
return false
41+
}
42+
3143
// / RegionIDs returns the sorted region IDs.
3244
func (m *DERPMap) RegionIDs() []int {
3345
ret := make([]int, 0, len(m.Regions))

tailcfg/tailcfg_test.go

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -729,3 +729,121 @@ func TestCurrentCapabilityVersion(t *testing.T) {
729729
t.Errorf("CurrentCapabilityVersion = %d; want %d", CurrentCapabilityVersion, max)
730730
}
731731
}
732+
733+
func TestDERPMapHasSTUN(t *testing.T) {
734+
cases := []struct {
735+
name string
736+
derpMap *DERPMap
737+
want bool
738+
}{
739+
{
740+
name: "None",
741+
derpMap: &DERPMap{
742+
Regions: map[int]*DERPRegion{
743+
1: {
744+
RegionID: 1,
745+
Nodes: []*DERPNode{
746+
{
747+
RegionID: 1,
748+
Name: "1a",
749+
STUNPort: -1,
750+
},
751+
},
752+
},
753+
2: {
754+
RegionID: 2,
755+
Nodes: []*DERPNode{
756+
{
757+
RegionID: 2,
758+
Name: "2a",
759+
STUNPort: -1,
760+
},
761+
},
762+
},
763+
},
764+
},
765+
want: false,
766+
},
767+
{
768+
name: "One",
769+
derpMap: &DERPMap{
770+
Regions: map[int]*DERPRegion{
771+
1: {
772+
RegionID: 1,
773+
Nodes: []*DERPNode{
774+
{
775+
RegionID: 1,
776+
Name: "1a",
777+
STUNPort: -1,
778+
},
779+
},
780+
},
781+
2: {
782+
RegionID: 2,
783+
Nodes: []*DERPNode{
784+
{
785+
RegionID: 2,
786+
Name: "2a",
787+
STUNPort: -1,
788+
},
789+
{
790+
RegionID: 2,
791+
Name: "2b",
792+
STUNPort: 0, // default
793+
},
794+
},
795+
},
796+
},
797+
},
798+
want: true,
799+
},
800+
{
801+
name: "Some",
802+
derpMap: &DERPMap{
803+
Regions: map[int]*DERPRegion{
804+
1: {
805+
RegionID: 1,
806+
Nodes: []*DERPNode{
807+
{
808+
RegionID: 1,
809+
Name: "1a",
810+
STUNPort: -1,
811+
},
812+
{
813+
RegionID: 1,
814+
Name: "1b",
815+
STUNPort: 1234,
816+
},
817+
},
818+
},
819+
2: {
820+
RegionID: 2,
821+
Nodes: []*DERPNode{
822+
{
823+
RegionID: 2,
824+
Name: "2a",
825+
STUNPort: -1,
826+
},
827+
{
828+
RegionID: 2,
829+
Name: "2b",
830+
STUNPort: 4321,
831+
},
832+
},
833+
},
834+
},
835+
},
836+
want: true,
837+
},
838+
}
839+
840+
for _, c := range cases {
841+
c := c
842+
t.Run(c.name, func(t *testing.T) {
843+
got := c.derpMap.HasSTUN()
844+
if got != c.want {
845+
t.Errorf("got %v; want %v", got, c.want)
846+
}
847+
})
848+
}
849+
}

wgengine/magicsock/magicsock.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ func (c *Conn) updateEndpoints(why string) {
536536
c.muCond.Broadcast()
537537
}()
538538
c.dlogf("[v1] magicsock: starting endpoint update (%s)", why)
539-
if c.noV4Send.Load() && runtime.GOOS != "js" {
539+
if c.noV4Send.Load() && c.derpMapHasSTUNNodes() && runtime.GOOS != "js" {
540540
c.mu.Lock()
541541
closed := c.closed
542542
c.mu.Unlock()
@@ -560,6 +560,13 @@ func (c *Conn) updateEndpoints(why string) {
560560
}
561561
}
562562

563+
// c.mu must NOT be held.
564+
func (c *Conn) derpMapHasSTUNNodes() bool {
565+
c.mu.Lock()
566+
defer c.mu.Unlock()
567+
return c.derpMap != nil && c.derpMap.HasSTUN()
568+
}
569+
563570
// setEndpoints records the new endpoints, reporting whether they're changed.
564571
// It takes ownership of the slice.
565572
func (c *Conn) setEndpoints(endpoints []tailcfg.Endpoint) (changed bool) {

0 commit comments

Comments
 (0)