BPF:结构__skbuff中的标记不可写吗?

时间:2019-07-16 10:29:58

标签: c linux-kernel network-programming iptables ebpf

我有一个BPF代码(“ classifier”部分)。我使用它来使用tc(流量控制器)实用程序加载到接口。我的代码更改了__skbuff中的标记。稍后,当我尝试使用iptables捕获该标记时,发现我编辑的标记消失了。

代码:

__section("classifier")
int function(struct __sk_buff *skb)
{
    skb->mark = 0x123;

我使用iptable mangle表的以下规则来查看标记是否正确写入。

# iptables -t mangle -A PREROUTING -i <my_interface> \
    -m mark --mark 0x123 \
    -j LOG --log-prefix "MY_PRINTS" --log-level 7

以下是我用来加载bpf程序的TC命令;

# tc qdisc add dev <myInterface> root handle 1: prio
# tc filter add dev <myInterface> parent 1: bpf obj bpf.o flowid 1:1 direct-action

1 个答案:

答案 0 :(得分:0)

问题出在您的tc命令中。您正在将过滤器连接到出口侧。

root父节点是指出口侧,用于流量整形。相反,如果您要将过滤器附加在入口端,则应使用类似以下内容(无需处理):

# tc qdisc add dev <myInterface> ingress
# tc filter add dev <myInterface> ingress bpf obj bpf.o direct-action

或者,更好的做法是,使用特定于BPF的qdisc clsact,它可以用于为入口和出口附加过滤器(除其commit log和{{3之外,没有很多文档}}(搜索clsact):

# tc qdisc add dev <myInterface> clsact
# tc filter add dev <myInterface> ingress bpf obj bpf.o direct-action