func()

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
}