Skip to content

Commit 2d67fde

Browse files
committed
ipn/wg: pause new pid if existing is paused
1 parent 7132dd2 commit 2d67fde

4 files changed

Lines changed: 21 additions & 10 deletions

File tree

intra/ipn/proxies.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -343,11 +343,18 @@ func (px *proxifier) add(p Proxy) (ok bool) {
343343
defer px.Unlock()
344344

345345
defer func() {
346-
if ok {
347-
core.Go2("pxr.add: "+id, px.obs.OnProxyAdded, id, hdl)
346+
if ok { // added
347+
core.Go2("pxr.add."+id, px.obs.OnProxyAdded, id, hdl)
348348
// new proxy, invoke Stop on old proxy
349349
if old != nil && !Same(old, p) {
350-
// holding px.lock, so exec stop in a goroutine
350+
// change status with px lock held, so we know no other
351+
// conflicting id is being added/got at the same time
352+
st := old.Status()
353+
if st == TPU {
354+
didpause := p.Pause()
355+
log.I("proxy: add: %s (%s => %s); new proxy paused? %t", id, idhandle(old), idhandle(p), didpause)
356+
}
357+
// do not hold px.lock, exec stop in a goroutine
351358
core.Go("pxr.add.stop: "+id, func() {
352359
if oldVia, _ := old.Router().Via(); oldVia != nil {
353360
px.Hop(oldVia.ID(), id)

intra/ipn/proxy.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ func (pxr *proxifier) addRpnProxy(acc RpnAcc, cc string) (Proxy, *x.RpnServer, e
116116
rpnid := typ + cc
117117

118118
// TODO: addProxy may update wg in-place, even if DNS addrs have changed
119-
p, err := pxr.forceAddProxy(rpnid, txt)
119+
p, err := pxr.addProxy(rpnid, txt)
120120
if p == nil {
121121
pxr.postAddRpnProxyError(acc) // remove from pxr.rp if exists
122122
return nil, srv, core.JoinErr(err, errAddProxy)
@@ -191,7 +191,7 @@ func (pxr *proxifier) addProxy(id, txt string) (p Proxy, err error) {
191191
return pxr.addOrUpdateProxy(id, txt, false /*force*/)
192192
}
193193

194-
func (pxr *proxifier) addOrUpdateProxy(id, txt string, force bool) (p Proxy, err error) {
194+
func (pxr *proxifier) addOrUpdateProxy(id, txt string, forceAdd bool) (p Proxy, err error) {
195195
if len(id) <= 0 {
196196
return nil, errAddProxy
197197
}
@@ -207,7 +207,7 @@ func (pxr *proxifier) addOrUpdateProxy(id, txt string, force bool) (p Proxy, err
207207
pxr.RLock()
208208
lp := pxr.lp
209209
pxr.RUnlock()
210-
if force {
210+
if forceAdd {
211211
p, err = NewWgProxy(pxr.ctx, id, pxr.ctl, pxr, lp, txt)
212212
} else if p, _ = pxr.proxyFor(id); p != nil {
213213
hdl := hdlstr(p)
@@ -227,7 +227,7 @@ func (pxr *proxifier) addOrUpdateProxy(id, txt string, force bool) (p Proxy, err
227227
log.W("proxy: add: update not ok for wg(%s@%s); readd...", id, hdl)
228228
}
229229
}
230-
if !force && p == nil {
230+
if !forceAdd && p == nil {
231231
// txt is both wg ifconfig and peercfg
232232
p, err = NewWgProxy(pxr.ctx, id, pxr.ctl, pxr, lp, txt)
233233
}
@@ -260,17 +260,17 @@ func (pxr *proxifier) addOrUpdateProxy(id, txt string, force bool) (p Proxy, err
260260

261261
if err != nil {
262262
log.P("proxy: add: %s failed; cfg: %v", id, txt)
263-
log.W("proxy: add: %s failed; force? %t; err: %v", id, force, err)
263+
log.W("proxy: add: %s failed; force? %t; err: %v", id, forceAdd, err)
264264
return nil, err
265265
} else if p == nil {
266266
log.P("proxy: add: %s nil; cfg: %v", id, txt)
267-
log.W("proxy: add: %s nil; force? %t; txt: %d", id, force, len(txt))
267+
log.W("proxy: add: %s nil; force? %t; txt: %d", id, forceAdd, len(txt))
268268
return nil, errAddProxy
269269
} else if ok := pxr.add(p); !ok {
270270
return nil, errAddProxy
271271
}
272272

273-
log.I("proxy: add: force? %t; done %s@%s/%s/%s", force, idstr(p), hdlstr(p), typstr(p), p.GetAddr())
273+
log.I("proxy: add: force? %t; done %s@%s/%s/%s", forceAdd, idstr(p), hdlstr(p), typstr(p), p.GetAddr())
274274
return
275275
}
276276

intra/ipn/rpn.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@ func (r *rpnp) fork(cc string) (x.Proxy, error) {
356356

357357
log.I("proxy: rpn: fork: %s[%s]", provider, cc)
358358

359+
// forked proxy must start paused if existing is paused
359360
// re-adds + updates if the proxy already exists
360361
kid, srv, err := r.pxr.addRpnProxy(acc, cc)
361362

intra/ipn/wgproxy.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,7 @@ func (w *wgproxy) update(id, txt string) (ok bool) {
514514
}
515515

516516
if opts.willreplacepeers {
517+
// Must remove current remote endpoint and add new ones
517518
log.W("proxy: wg: update(%s<>%s): peers will be replaced", id, w.who())
518519
}
519520

@@ -553,6 +554,7 @@ func (w *wgproxy) update(id, txt string) (ok bool) {
553554
log.W("proxy: updating wg(%s<>%s) ipcset; err %v", id, w.who(), ipcerr)
554555
return anew
555556
}
557+
// wgconn, if paused, must remain paused
556558
// w.Device is assumed to be Up? Send an EventDown first?
557559
w.events <- tun.EventUp // re-apply interface config to wg device
558560
w.uapicfg.Store(txt) // persist the updated UAPI peer config
@@ -1765,6 +1767,7 @@ func (h *wgtun) listener(op wg.PktDir, err error) (ended bool) {
17651767
h.latestWrite.Store(now)
17661768
}
17671769
} else { // ok
1770+
// if s is TNT, ignore zero len reads / writes as TOK?
17681771
s = TOK
17691772
why = "TOK: ok"
17701773
if op == wg.Rcv { // read ok

0 commit comments

Comments
 (0)