in plugins/vpc-shared-eni/network/bridge_linux.go [580:653]
func (nb *BridgeBuilder) deleteBridge(
bridgeName string,
bridgeType string,
sharedENI *eni.ENI) error {
// Delete bridge layer2 configuration.
if bridgeType == config.BridgeTypeL2 {
// Delete the MAC DNAT rule that broadcasts ARP replies ingress shared ENI.
broadcastMACAddr, _ := net.ParseMAC("ff:ff:ff:ff:ff:ff")
err := ebtables.NAT.Delete(
ebtables.PreRouting,
&ebtables.Rule{
Protocol: "ARP",
In: sharedENI.GetLinkName(),
Match: &ebtables.ARPMatch{
Op: "Reply",
},
Target: &ebtables.DNATTarget{
ToDst: broadcastMACAddr,
Target: ebtables.Accept,
},
},
)
if err != nil && !os.IsNotExist(err) {
log.Errorf("Failed to delete DNAT rule for ENI link %s: %v.", sharedENI, err)
return err
}
// Delete the MAC SNAT rule to shared ENI's MAC address.
err = ebtables.NAT.Delete(
ebtables.PostRouting,
&ebtables.Rule{
Out: sharedENI.GetLinkName(),
SrcType: "unicast",
Target: &ebtables.SNATTarget{
ToSrc: sharedENI.GetMACAddress(),
ARP: true,
Target: ebtables.Accept,
},
},
)
if err != nil && !os.IsNotExist(err) {
log.Errorf("Failed to delete SNAT rule for ENI link %s: %v.", sharedENI, err)
return err
}
}
// Delete the dummy link for the bridge.
la := netlink.NewLinkAttrs()
la.Name = fmt.Sprintf(dummyNameFormat, bridgeName)
dummyLink := &netlink.Dummy{LinkAttrs: la}
log.Infof("Deleting dummy link %+v.", dummyLink)
err := netlink.LinkDel(dummyLink)
if err != nil && !os.IsNotExist(err) {
log.Errorf("Failed to delete dummy link: %v.", err)
return err
}
// Delete the bridge.
la = netlink.NewLinkAttrs()
la.Name = bridgeName
bridgeLink := &netlink.Bridge{LinkAttrs: la}
log.Infof("Deleting bridge link %+v.", bridgeLink)
err = netlink.LinkDel(bridgeLink)
if err != nil && !os.IsNotExist(err) {
log.Errorf("Failed to delete bridge %s: %v.", bridgeName, err)
return err
}
return nil
}