@@ -20,8 +20,6 @@ import (
2020// packets will be truncated to snapLen.
2121const SnapLen uint32 = 2048 // in bytes; some sufficient value
2222
23- var errNoFdSwapper = errors .New ("magiclink: no FdSwapper" )
24-
2523type 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