in pkg/tc/tc.go [143:177]
func (m *bpfTc) TCIngressDetach(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: %v", interfaceName, err)
return err
}
//Currently supports only one handle, in future we might need to cache the handle
filterHandle := uint32(constdef.DEFAULT_BPF_FILTER_HANDLE)
filterParent := uint32(netlink.HANDLE_MIN_INGRESS)
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 ingress filter detach done")
return nil
}
}
return fmt.Errorf("no active filter to detach-%s", interfaceName)
}