On Fri, Sep 11, 2015 at 3:24 PM, Akshat Kakkar <akshat.1...@gmail.com> wrote: > There is no handle with fw filter. That's the whole point is. If > handle and class (flow id) is not specified, then whatever be the mark > on the packet, its automatically set as flowid. So if mark is 0x10003, > then this fw filter > > tc filter add dev eth0 parent 1:0 protocol ip fw > > will cause 0x10003 being set as classid I.e. 1:3. > > > tc qdisc add dev eth0 root handle 1: htb > tc class add dev eth0 parent 1: classid 1:a htb rate 1mbit > tc class add dev eth0 parent 1: classid 1:b htb rate 1mbit > tc class add dev eth0 parent 1: classid 1:c htb rate 1mbit > tc filter add dev eth0 parent 1:0 protocol ip fw > > iptables -t mangle -I OUTPUT -o eth0 -p tcp -j MARK --set-mark 0x1000a > iptables -t mangle -I OUTPUT -o eth0 -p icmp -j MARK --set-mark 0x1000b > iptables -t mangle -I OUTPUT -o eth0 -p udp -j MARK --set-mark 0x1000c
Hmm, I didn't know that before either. Looks like my tp->init change breaks it. Could you try the following patch? Thanks!
diff --git a/net/sched/cls_fw.c b/net/sched/cls_fw.c index 715e01e..b6394ab 100644 --- a/net/sched/cls_fw.c +++ b/net/sched/cls_fw.c @@ -34,6 +34,7 @@ struct fw_head { u32 mask; bool mask_set; + bool old_method; struct fw_filter __rcu *ht[HTSIZE]; struct rcu_head rcu; }; @@ -65,7 +66,7 @@ static int fw_classify(struct sk_buff *skb, const struct tcf_proto *tp, int r; u32 id = skb->mark; - if (head != NULL) { + if (!head->old_method) { id &= head->mask; for (f = rcu_dereference_bh(head->ht[fw_hash(id)]); f; @@ -120,6 +121,7 @@ static int fw_init(struct tcf_proto *tp) if (head == NULL) return -ENOBUFS; + head->old_method = true; head->mask_set = false; rcu_assign_pointer(tp->root, head); return 0; @@ -302,6 +304,7 @@ static int fw_change(struct net *net, struct sk_buff *in_skb, if (!handle) return -EINVAL; + head->old_method = false; if (!head->mask_set) { head->mask = 0xFFFFFFFF; if (tb[TCA_FW_MASK])