File tree Expand file tree Collapse file tree 3 files changed +138
-1
lines changed Expand file tree Collapse file tree 3 files changed +138
-1
lines changed Original file line number Diff line number Diff line change @@ -28,6 +28,18 @@ type DERPMap struct {
28
28
OmitDefaultRegions bool `json:"omitDefaultRegions,omitempty"`
29
29
}
30
30
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
+
31
43
// / RegionIDs returns the sorted region IDs.
32
44
func (m * DERPMap ) RegionIDs () []int {
33
45
ret := make ([]int , 0 , len (m .Regions ))
Original file line number Diff line number Diff line change @@ -729,3 +729,121 @@ func TestCurrentCapabilityVersion(t *testing.T) {
729
729
t .Errorf ("CurrentCapabilityVersion = %d; want %d" , CurrentCapabilityVersion , max )
730
730
}
731
731
}
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
+ }
Original file line number Diff line number Diff line change @@ -536,7 +536,7 @@ func (c *Conn) updateEndpoints(why string) {
536
536
c .muCond .Broadcast ()
537
537
}()
538
538
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" {
540
540
c .mu .Lock ()
541
541
closed := c .closed
542
542
c .mu .Unlock ()
@@ -560,6 +560,13 @@ func (c *Conn) updateEndpoints(why string) {
560
560
}
561
561
}
562
562
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
+
563
570
// setEndpoints records the new endpoints, reporting whether they're changed.
564
571
// It takes ownership of the slice.
565
572
func (c * Conn ) setEndpoints (endpoints []tailcfg.Endpoint ) (changed bool ) {
You can’t perform that action at this time.
0 commit comments