@@ -168,14 +168,14 @@ func (d *driver) peerDbAdd(nid, eid string, peerIP net.IP, peerIPMask net.IPMask
168168}
169169
170170func (d * driver ) peerDbDelete (nid , eid string , peerIP net.IP , peerIPMask net.IPMask ,
171- peerMac net.HardwareAddr , vtep net.IP ) bool {
171+ peerMac net.HardwareAddr , vtep net.IP ) peerEntry {
172172 peerDbWg .Wait ()
173173
174174 d .peerDb .Lock ()
175175 pMap , ok := d .peerDb .mp [nid ]
176176 if ! ok {
177177 d .peerDb .Unlock ()
178- return false
178+ return peerEntry {}
179179 }
180180 d .peerDb .Unlock ()
181181
@@ -186,19 +186,20 @@ func (d *driver) peerDbDelete(nid, eid string, peerIP net.IP, peerIPMask net.IPM
186186
187187 pMap .Lock ()
188188
189- if pEntry , ok := pMap .mp [pKey .String ()]; ok {
189+ pEntry , ok := pMap .mp [pKey .String ()]
190+ if ok {
190191 // Mismatched endpoint ID(possibly outdated). Do not
191192 // delete peerdb
192193 if pEntry .eid != eid {
193194 pMap .Unlock ()
194- return false
195+ return pEntry
195196 }
196197 }
197198
198199 delete (pMap .mp , pKey .String ())
199200 pMap .Unlock ()
200201
201- return true
202+ return pEntry
202203}
203204
204205func (d * driver ) peerDbUpdateSandbox (nid string ) {
@@ -312,10 +313,9 @@ func (d *driver) peerDelete(nid, eid string, peerIP net.IP, peerIPMask net.IPMas
312313 return err
313314 }
314315
316+ var pEntry peerEntry
315317 if updateDb {
316- if ! d .peerDbDelete (nid , eid , peerIP , peerIPMask , peerMac , vtep ) {
317- return nil
318- }
318+ pEntry = d .peerDbDelete (nid , eid , peerIP , peerIPMask , peerMac , vtep )
319319 }
320320
321321 n := d .network (nid )
@@ -328,14 +328,24 @@ func (d *driver) peerDelete(nid, eid string, peerIP net.IP, peerIPMask net.IPMas
328328 return nil
329329 }
330330
331- // Delete fdb entry to the bridge for the peer mac
332- if err := sbox .DeleteNeighbor (vtep , peerMac ); err != nil {
333- return fmt .Errorf ("could not delete fdb entry into the sandbox: %v" , err )
331+ // Delete fdb entry to the bridge for the peer mac only if the
332+ // entry existed in local peerdb. If it is a stale delete
333+ // request, still call DeleteNeighbor but only to cleanup any
334+ // leftover sandbox neighbor cache and not actually delete the
335+ // kernel state.
336+ if (eid == pEntry .eid && vtep .Equal (pEntry .vtep )) ||
337+ (eid != pEntry .eid && ! vtep .Equal (pEntry .vtep )) {
338+ if err := sbox .DeleteNeighbor (vtep , peerMac ,
339+ eid == pEntry .eid && vtep .Equal (pEntry .vtep )); err != nil {
340+ return fmt .Errorf ("could not delete fdb entry into the sandbox: %v" , err )
341+ }
334342 }
335343
336344 // Delete neighbor entry for the peer IP
337- if err := sbox .DeleteNeighbor (peerIP , peerMac ); err != nil {
338- return fmt .Errorf ("could not delete neighbor entry into the sandbox: %v" , err )
345+ if eid == pEntry .eid {
346+ if err := sbox .DeleteNeighbor (peerIP , peerMac , true ); err != nil {
347+ return fmt .Errorf ("could not delete neighbor entry into the sandbox: %v" , err )
348+ }
339349 }
340350
341351 if err := d .checkEncryption (nid , vtep , 0 , false , false ); err != nil {
0 commit comments