|
@@ -1816,13 +1816,8 @@ int tc_classify_compat(struct sk_buff *skb, const struct tcf_proto *tp,
|
|
|
continue;
|
|
|
err = tp->classify(skb, tp, res);
|
|
|
|
|
|
- if (err >= 0) {
|
|
|
-#ifdef CONFIG_NET_CLS_ACT
|
|
|
- if (err != TC_ACT_RECLASSIFY && skb->tc_verd)
|
|
|
- skb->tc_verd = SET_TC_VERD(skb->tc_verd, 0);
|
|
|
-#endif
|
|
|
+ if (err >= 0)
|
|
|
return err;
|
|
|
- }
|
|
|
}
|
|
|
return -1;
|
|
|
}
|
|
@@ -1834,23 +1829,22 @@ int tc_classify(struct sk_buff *skb, const struct tcf_proto *tp,
|
|
|
int err = 0;
|
|
|
#ifdef CONFIG_NET_CLS_ACT
|
|
|
const struct tcf_proto *otp = tp;
|
|
|
+ int limit = 0;
|
|
|
reclassify:
|
|
|
#endif
|
|
|
|
|
|
err = tc_classify_compat(skb, tp, res);
|
|
|
#ifdef CONFIG_NET_CLS_ACT
|
|
|
if (err == TC_ACT_RECLASSIFY) {
|
|
|
- u32 verd = G_TC_VERD(skb->tc_verd);
|
|
|
tp = otp;
|
|
|
|
|
|
- if (verd++ >= MAX_REC_LOOP) {
|
|
|
+ if (unlikely(limit++ >= MAX_REC_LOOP)) {
|
|
|
net_notice_ratelimited("%s: packet reclassify loop rule prio %u protocol %02x\n",
|
|
|
tp->q->ops->id,
|
|
|
tp->prio & 0xffff,
|
|
|
ntohs(tp->protocol));
|
|
|
return TC_ACT_SHOT;
|
|
|
}
|
|
|
- skb->tc_verd = SET_TC_VERD(skb->tc_verd, verd);
|
|
|
goto reclassify;
|
|
|
}
|
|
|
#endif
|