MCPcopy Index your code
hub / github.com/tailscale/tailscale / checkDerp

Function checkDerp

cmd/tailscaled/debug.go:214–283  ·  view source on GitHub ↗
(ctx context.Context, derpRegion string)

Source from the content-addressed store, hash-verified

212}
213
214func checkDerp(ctx context.Context, derpRegion string) (err error) {
215 bus := eventbus.New()
216 defer bus.Close()
217 ht := health.NewTracker(bus)
218 req, err := http.NewRequestWithContext(ctx, "GET", ipn.DefaultControlURL+"/derpmap/default", nil)
219 if err != nil {
220 return fmt.Errorf("create derp map request: %w", err)
221 }
222 res, err := http.DefaultClient.Do(req)
223 if err != nil {
224 return fmt.Errorf("fetch derp map failed: %w", err)
225 }
226 defer res.Body.Close()
227 b, err := io.ReadAll(io.LimitReader(res.Body, 1<<20))
228 if err != nil {
229 return fmt.Errorf("fetch derp map failed: %w", err)
230 }
231 if res.StatusCode != 200 {
232 return fmt.Errorf("fetch derp map: %v: %s", res.Status, b)
233 }
234 var dmap tailcfg.DERPMap
235 if err = json.Unmarshal(b, &dmap); err != nil {
236 return fmt.Errorf("fetch DERP map: %w", err)
237 }
238 getRegion := func() *tailcfg.DERPRegion {
239 for _, r := range dmap.Regions {
240 if r.RegionCode == derpRegion {
241 return r
242 }
243 }
244 for _, r := range dmap.Regions {
245 log.Printf("Known region: %q", r.RegionCode)
246 }
247 log.Fatalf("unknown region %q", derpRegion)
248 panic("unreachable")
249 }
250
251 priv1 := key.NewNode()
252 priv2 := key.NewNode()
253
254 c1 := derphttp.NewRegionClient(priv1, log.Printf, nil, getRegion)
255 c2 := derphttp.NewRegionClient(priv2, log.Printf, nil, getRegion)
256 c1.HealthTracker = ht
257 c2.HealthTracker = ht
258 defer func() {
259 if err != nil {
260 c1.Close()
261 c2.Close()
262 }
263 }()
264
265 c2.NotePreferred(true) // just to open it
266
267 m, err := c2.Recv()
268 log.Printf("c2 got %T, %v", m, err)
269
270 t0 := time.Now()
271 if err := c1.Send(priv2.Public(), []byte("hello")); err != nil {

Callers 1

debugModeFunction · 0.85

Calls 15

NewFunction · 0.92
NewTrackerFunction · 0.92
NewNodeFunction · 0.92
NewRegionClientFunction · 0.92
PrintfMethod · 0.80
CloseMethod · 0.65
ErrorfMethod · 0.65
DoMethod · 0.65
FatalfMethod · 0.65
NowMethod · 0.65
SinceMethod · 0.65
NotePreferredMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…