in pkg/tc/tc.go [179:229]
func (m *bpfTc) TCEgressAttach(interfaceName string, progFD int, funcName 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
}
attrs := netlink.QdiscAttrs{
LinkIndex: intf.Attrs().Index,
Handle: netlink.MakeHandle(constdef.QDISC_HANDLE, 0),
Parent: netlink.HANDLE_CLSACT,
}
if enableQdisc(intf) {
qdisc := &netlink.GenericQdisc{
QdiscAttrs: attrs,
QdiscType: "clsact",
}
if err := netlink.QdiscAdd(qdisc); err != nil {
log.Errorf("cannot add clsact qdisc: %v", err)
return err
}
}
// construct the filter
filter := &netlink.BpfFilter{
FilterAttrs: netlink.FilterAttrs{
LinkIndex: attrs.LinkIndex,
Parent: uint32(netlink.HANDLE_MIN_EGRESS),
Handle: constdef.DEFAULT_BPF_FILTER_HANDLE,
Protocol: unix.ETH_P_ALL,
Priority: 1,
},
Fd: progFD,
Name: funcName,
DirectAction: true,
}
if err = netlink.FilterAdd(filter); err != nil {
log.Errorf("while loading egress program %q on fd %d: %v", "handle egress", progFD, err)
return err
}
log.Infof("TC filter egress add done %s", interfaceName)
return nil
}