@@ -15,22 +15,24 @@ import (
1515// NewDERPMap constructs a DERPMap from a set of STUN addresses and optionally a remote
1616// URL to fetch a mapping from e.g. https://controlplane.tailscale.com/derpmap/default.
1717func NewDERPMap (ctx context.Context , region * tailcfg.DERPRegion , stunAddrs []string , remoteURL string ) (* tailcfg.DERPMap , error ) {
18- for index , stunAddr := range stunAddrs {
19- host , rawPort , err := net .SplitHostPort (stunAddr )
20- if err != nil {
21- return nil , xerrors .Errorf ("split host port for %q: %w" , stunAddr , err )
22- }
23- port , err := strconv .Atoi (rawPort )
24- if err != nil {
25- return nil , xerrors .Errorf ("parse port for %q: %w" , stunAddr , err )
18+ if region != nil {
19+ for index , stunAddr := range stunAddrs {
20+ host , rawPort , err := net .SplitHostPort (stunAddr )
21+ if err != nil {
22+ return nil , xerrors .Errorf ("split host port for %q: %w" , stunAddr , err )
23+ }
24+ port , err := strconv .Atoi (rawPort )
25+ if err != nil {
26+ return nil , xerrors .Errorf ("parse port for %q: %w" , stunAddr , err )
27+ }
28+ region .Nodes = append ([]* tailcfg.DERPNode {{
29+ Name : fmt .Sprintf ("%dstun%d" , region .RegionID , index ),
30+ RegionID : region .RegionID ,
31+ HostName : host ,
32+ STUNOnly : true ,
33+ STUNPort : port ,
34+ }}, region .Nodes ... )
2635 }
27- region .Nodes = append ([]* tailcfg.DERPNode {{
28- Name : fmt .Sprintf ("%dstun%d" , region .RegionID , index ),
29- RegionID : region .RegionID ,
30- HostName : host ,
31- STUNOnly : true ,
32- STUNPort : port ,
33- }}, region .Nodes ... )
3436 }
3537
3638 derpMap := & tailcfg.DERPMap {
@@ -51,10 +53,12 @@ func NewDERPMap(ctx context.Context, region *tailcfg.DERPRegion, stunAddrs []str
5153 return nil , xerrors .Errorf ("fetch derpmap: %w" , err )
5254 }
5355 }
54- _ , conflicts := derpMap .Regions [region .RegionID ]
55- if conflicts {
56- return nil , xerrors .Errorf ("the default region ID conflicts with a remote region from %q" , remoteURL )
56+ if region != nil {
57+ _ , conflicts := derpMap .Regions [region .RegionID ]
58+ if conflicts {
59+ return nil , xerrors .Errorf ("the default region ID conflicts with a remote region from %q" , remoteURL )
60+ }
61+ derpMap .Regions [region .RegionID ] = region
5762 }
58- derpMap .Regions [region .RegionID ] = region
5963 return derpMap , nil
6064}
0 commit comments