func()

in pkg/tc/tc.go [231:265]


func (m *bpfTc) TCEgressDetach(interfaceName string) error {

	if err := mismatchedInterfacePrefix(interfaceName, m.InterfacePrefix); err != nil {
		return err
	}

	intf, err := netlink.LinkByName(interfaceName)
	if err != nil {
		log.Errorf("failed to find device by name %s: %w", interfaceName, err)
		return err
	}

	//Currently supports only one handle, in future we might need to cache the handle
	filterHandle := uint32(0x1)
	filterParent := uint32(netlink.HANDLE_MIN_EGRESS)

	filters, err := netlink.FilterList(intf, filterParent)
	if err != nil {
		log.Errorf("failed to get filter list: %v", err)
		return err
	}

	for _, filter := range filters {
		if filter.Attrs().Handle == filterHandle {
			err = netlink.FilterDel(filter)
			if err != nil {
				log.Errorf("delete filter failed on intf %s : %v", interfaceName, err)
				return errors.New(FILTER_CLEANUP_FAILED)
			}
			log.Infof("TC egress filter detach done")
			return nil
		}
	}
	return fmt.Errorf("no active filter to detach-%s", interfaceName)
}