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)
}