Skip to content

Commit

Permalink
chore: avoid logging netcheck send errors if STUN is disabled (#40)
Browse files Browse the repository at this point in the history
  • Loading branch information
deansheather authored Sep 21, 2023
1 parent 8d4d23e commit c821c9c
Show file tree
Hide file tree
Showing 3 changed files with 138 additions and 1 deletion.
12 changes: 12 additions & 0 deletions tailcfg/derpmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,18 @@ type DERPMap struct {
OmitDefaultRegions bool `json:"omitDefaultRegions,omitempty"`
}

// HasSTUN returns true if there are any STUN servers in the DERPMap.
func (m *DERPMap) HasSTUN() bool {
for _, r := range m.Regions {
for _, n := range r.Nodes {
if n.STUNPort >= 0 {
return true
}
}
}
return false
}

// / RegionIDs returns the sorted region IDs.
func (m *DERPMap) RegionIDs() []int {
ret := make([]int, 0, len(m.Regions))
Expand Down
118 changes: 118 additions & 0 deletions tailcfg/tailcfg_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -729,3 +729,121 @@ func TestCurrentCapabilityVersion(t *testing.T) {
t.Errorf("CurrentCapabilityVersion = %d; want %d", CurrentCapabilityVersion, max)
}
}

func TestDERPMapHasSTUN(t *testing.T) {
cases := []struct {
name string
derpMap *DERPMap
want bool
}{
{
name: "None",
derpMap: &DERPMap{
Regions: map[int]*DERPRegion{
1: {
RegionID: 1,
Nodes: []*DERPNode{
{
RegionID: 1,
Name: "1a",
STUNPort: -1,
},
},
},
2: {
RegionID: 2,
Nodes: []*DERPNode{
{
RegionID: 2,
Name: "2a",
STUNPort: -1,
},
},
},
},
},
want: false,
},
{
name: "One",
derpMap: &DERPMap{
Regions: map[int]*DERPRegion{
1: {
RegionID: 1,
Nodes: []*DERPNode{
{
RegionID: 1,
Name: "1a",
STUNPort: -1,
},
},
},
2: {
RegionID: 2,
Nodes: []*DERPNode{
{
RegionID: 2,
Name: "2a",
STUNPort: -1,
},
{
RegionID: 2,
Name: "2b",
STUNPort: 0, // default
},
},
},
},
},
want: true,
},
{
name: "Some",
derpMap: &DERPMap{
Regions: map[int]*DERPRegion{
1: {
RegionID: 1,
Nodes: []*DERPNode{
{
RegionID: 1,
Name: "1a",
STUNPort: -1,
},
{
RegionID: 1,
Name: "1b",
STUNPort: 1234,
},
},
},
2: {
RegionID: 2,
Nodes: []*DERPNode{
{
RegionID: 2,
Name: "2a",
STUNPort: -1,
},
{
RegionID: 2,
Name: "2b",
STUNPort: 4321,
},
},
},
},
},
want: true,
},
}

for _, c := range cases {
c := c
t.Run(c.name, func(t *testing.T) {
got := c.derpMap.HasSTUN()
if got != c.want {
t.Errorf("got %v; want %v", got, c.want)
}
})
}
}
9 changes: 8 additions & 1 deletion wgengine/magicsock/magicsock.go
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,7 @@ func (c *Conn) updateEndpoints(why string) {
c.muCond.Broadcast()
}()
c.dlogf("[v1] magicsock: starting endpoint update (%s)", why)
if c.noV4Send.Load() && runtime.GOOS != "js" {
if c.noV4Send.Load() && c.derpMapHasSTUNNodes() && runtime.GOOS != "js" {
c.mu.Lock()
closed := c.closed
c.mu.Unlock()
Expand All @@ -560,6 +560,13 @@ func (c *Conn) updateEndpoints(why string) {
}
}

// c.mu must NOT be held.
func (c *Conn) derpMapHasSTUNNodes() bool {
c.mu.Lock()
defer c.mu.Unlock()
return c.derpMap != nil && c.derpMap.HasSTUN()
}

// setEndpoints records the new endpoints, reporting whether they're changed.
// It takes ownership of the slice.
func (c *Conn) setEndpoints(endpoints []tailcfg.Endpoint) (changed bool) {
Expand Down

0 comments on commit c821c9c

Please sign in to comment.