Skip to content

Commit 9039779

Browse files
committed
ipn/proxies: always create new wg on add/protochanges
1 parent 4b524ba commit 9039779

File tree

2 files changed

+24
-13
lines changed

2 files changed

+24
-13
lines changed

intra/ipn/proxies.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1081,7 +1081,7 @@ func (px *proxifier) RefreshProto(l3 string, mtu int, force bool) {
10811081
// -> ipn.ProxyFor -> px.Lock() -> deadlock
10821082
if cfg, readd := curp.OnProtoChange(newlp); readd {
10831083
// px.addProxy -> px.add -> px.Lock() -> deadlock
1084-
_, err := px.addProxy(id, cfg)
1084+
_, err := px.forceAddProxy(id, cfg)
10851085
// TODO: preserve hop?
10861086
log.I("proxy: refreshProto (forced? %t): (%s/%s/%s) re-add; err? %v",
10871087
force, id, curp.Type(), curp.GetAddr(), err)

intra/ipn/proxy.go

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ func (pxr *proxifier) addRpnProxy(acc RpnAcc, cc string) (Proxy, error) {
115115

116116
rpnid := typ + cc
117117

118-
p, err := pxr.addProxy(rpnid, txt)
118+
p, err := pxr.forceAddProxy(rpnid, txt)
119119
if p == nil {
120120
pxr.postAddRpnProxyError(acc) // remove from pxr.rp if exists
121121
return nil, core.JoinErr(err, errAddProxy)
@@ -181,7 +181,15 @@ func (pxr *proxifier) postAddRpnProxyError(acc RpnAcc) (removed bool) {
181181
return pxr.unregisterRpn(acc.ProviderID()) // unregisters if it exists
182182
}
183183

184+
func (pxr *proxifier) forceAddProxy(id, txt string) (p Proxy, err error) {
185+
return pxr.addOrUpdateProxy(id, txt, true /*force*/)
186+
}
187+
184188
func (pxr *proxifier) addProxy(id, txt string) (p Proxy, err error) {
189+
return pxr.addOrUpdateProxy(id, txt, false /*force*/)
190+
}
191+
192+
func (pxr *proxifier) addOrUpdateProxy(id, txt string, force bool) (p Proxy, err error) {
185193
if len(id) <= 0 {
186194
return nil, errAddProxy
187195
}
@@ -197,20 +205,23 @@ func (pxr *proxifier) addProxy(id, txt string) (p Proxy, err error) {
197205
pxr.Lock()
198206
lp := pxr.lp
199207
pxr.Unlock()
200-
if p, _ = pxr.proxyFor(id); p != nil {
208+
if force {
209+
p, err = NewWgProxy(id, pxr.ctl, pxr, lp, txt)
210+
} else if p, _ = pxr.proxyFor(id); p != nil {
201211
if wgp, ok := p.(WgProxy); ok && wgp.update(id, txt) {
202212
newcfg, readd := wgp.OnProtoChange(lp)
203213
if readd || len(newcfg) > 0 {
204214
log.W("proxy: add: cannot update wg(%s); readd it!", id)
205-
return nil, errProxyReadd
215+
} else {
216+
log.I("proxy: add: updated wg %s/%s/%s", id, lp, p.GetAddr())
217+
return
206218
}
207-
208-
log.I("proxy: add: updated wg %s/%s/%s", id, lp, p.GetAddr())
209-
return
210219
} // else: recreate
211-
} // else: new
212-
// txt is both wg ifconfig and peercfg
213-
p, err = NewWgProxy(id, pxr.ctl, pxr, lp, txt)
220+
}
221+
if p == nil {
222+
// txt is both wg ifconfig and peercfg
223+
p, err = NewWgProxy(id, pxr.ctl, pxr, lp, txt)
224+
}
214225
} else if len(txt) <= 0 {
215226
p = NewBasicProxy(id, pxr.ctx, pxr.ctl, pxr)
216227
err = nil
@@ -240,17 +251,17 @@ func (pxr *proxifier) addProxy(id, txt string) (p Proxy, err error) {
240251

241252
if err != nil {
242253
log.P("proxy: add: %s failed; cfg: %v", id, txt)
243-
log.W("proxy: add: %s failed; err: %v", id, err)
254+
log.W("proxy: add: %s failed; force? %t; err: %v", id, force, err)
244255
return nil, err
245256
} else if p == nil {
246257
log.P("proxy: add: %s nil; cfg: %v", id, txt)
247-
log.W("proxy: add: %s nil; txt: %d", id, len(txt))
258+
log.W("proxy: add: %s nil; force? %t; txt: %d", id, force, len(txt))
248259
return nil, errAddProxy
249260
} else if ok := pxr.add(p); !ok {
250261
return nil, errAddProxy
251262
}
252263

253-
log.I("proxy: add: done %s/%s/%s", p.ID(), p.Type(), p.GetAddr())
264+
log.I("proxy: add: force? %t; done %s/%s/%s", force, p.ID(), p.Type(), p.GetAddr())
254265
return
255266
}
256267

0 commit comments

Comments
 (0)