Skip to content

Commit 591fd20

Browse files
committed
netstack/seamless: swap fd or endpoint
1 parent 830c227 commit 591fd20

1 file changed

Lines changed: 19 additions & 11 deletions

File tree

intra/netstack/seamless.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ import (
2020
// packets will be truncated to snapLen.
2121
const SnapLen uint32 = 2048 // in bytes; some sufficient value
2222

23-
var errNoFdSwapper = errors.New("magiclink: no FdSwapper")
24-
2523
type FdSwapper interface {
2624
// Swap closes existing FDs; uses new fd.
2725
Swap(fd int) error
@@ -154,14 +152,23 @@ func PcapModes() string {
154152
}
155153

156154
// Swap implements SeamlessEndpoint.
157-
func (l *magiclink) Swap(fd int) error {
155+
func (l *magiclink) Swap(fd int) (err error) {
158156
e := l.e.Load()
159-
if e == nil {
160-
return errNoFdSwapper
157+
hasSwappedFd := false
158+
needsNewEndpoint := e == nil
159+
if e != nil {
160+
err = e.Swap(fd)
161+
hasSwappedFd = err == nil
162+
needsNewEndpoint = errors.Is(err, errNeedsNewEndpoint)
163+
}
164+
165+
if !needsNewEndpoint {
166+
logei(!hasSwappedFd)("netstack: magic(%d); swap: ok? %t; err? %v",
167+
fd, hasSwappedFd, err)
168+
return err
161169
}
162170

163-
err := e.Swap(fd)
164-
if errors.Is(err, errNeedsNewEndpoint) {
171+
if needsNewEndpoint {
165172
umtu := uint32(l.MTU())
166173
opt := Options{
167174
FDs: []int{fd},
@@ -170,13 +177,13 @@ func (l *magiclink) Swap(fd int) error {
170177

171178
ep, err := newFdbasedInjectableEndpoint(&opt)
172179
if err != nil {
173-
log.E("netstack: magic(%d); err %v", fd, err)
180+
log.E("netstack: magic(%d); swap: err %v", fd, err)
174181
return err
175182
}
176183

177184
link, err := newSnoopyEndpoint(ep, l.s, false /*write header*/)
178185
if err != nil {
179-
log.E("netstack: magic(%d); err %v", fd, err)
186+
log.E("netstack: magic(%d); swap: err %v", fd, err)
180187
return err
181188
}
182189

@@ -190,10 +197,11 @@ func (l *magiclink) Swap(fd int) error {
190197
} else {
191198
ep.Attach(l) // attach the new endpoint to the existing dispatcher
192199
}
193-
logei(d == nil)("netstack: %d magic(mtu: %d); new ep... dispatch? %t", fd, umtu, d != nil)
200+
logei(d == nil)("netstack: magic(%d) mtu: %d; swap: new ep... dispatch? %t",
201+
fd, umtu, d != nil)
194202
}
195203

196-
return err
204+
return nil
197205
}
198206

199207
// Dispose implements SeamlessEndpoint.

0 commit comments

Comments
 (0)