|
@@ -41,7 +41,7 @@ struct fw_filter {
|
|
|
u32 id;
|
|
|
struct tcf_result res;
|
|
|
#ifdef CONFIG_NET_CLS_IND
|
|
|
- char indev[IFNAMSIZ];
|
|
|
+ int ifindex;
|
|
|
#endif /* CONFIG_NET_CLS_IND */
|
|
|
struct tcf_exts exts;
|
|
|
};
|
|
@@ -86,7 +86,7 @@ static int fw_classify(struct sk_buff *skb, const struct tcf_proto *tp,
|
|
|
if (f->id == id) {
|
|
|
*res = f->res;
|
|
|
#ifdef CONFIG_NET_CLS_IND
|
|
|
- if (!tcf_match_indev(skb, f->indev))
|
|
|
+ if (!tcf_match_indev(skb, f->ifindex))
|
|
|
continue;
|
|
|
#endif /* CONFIG_NET_CLS_IND */
|
|
|
r = tcf_exts_exec(skb, &f->exts, res);
|
|
@@ -207,9 +207,11 @@ fw_change_attrs(struct net *net, struct tcf_proto *tp, struct fw_filter *f,
|
|
|
|
|
|
#ifdef CONFIG_NET_CLS_IND
|
|
|
if (tb[TCA_FW_INDEV]) {
|
|
|
- err = tcf_change_indev(tp, f->indev, tb[TCA_FW_INDEV]);
|
|
|
- if (err < 0)
|
|
|
+ int ret;
|
|
|
+ ret = tcf_change_indev(net, tb[TCA_FW_INDEV]);
|
|
|
+ if (ret < 0)
|
|
|
goto errout;
|
|
|
+ f->ifindex = ret;
|
|
|
}
|
|
|
#endif /* CONFIG_NET_CLS_IND */
|
|
|
|
|
@@ -348,9 +350,12 @@ static int fw_dump(struct net *net, struct tcf_proto *tp, unsigned long fh,
|
|
|
nla_put_u32(skb, TCA_FW_CLASSID, f->res.classid))
|
|
|
goto nla_put_failure;
|
|
|
#ifdef CONFIG_NET_CLS_IND
|
|
|
- if (strlen(f->indev) &&
|
|
|
- nla_put_string(skb, TCA_FW_INDEV, f->indev))
|
|
|
- goto nla_put_failure;
|
|
|
+ if (f->ifindex) {
|
|
|
+ struct net_device *dev;
|
|
|
+ dev = __dev_get_by_index(net, f->ifindex);
|
|
|
+ if (dev && nla_put_string(skb, TCA_FW_INDEV, dev->name))
|
|
|
+ goto nla_put_failure;
|
|
|
+ }
|
|
|
#endif /* CONFIG_NET_CLS_IND */
|
|
|
if (head->mask != 0xFFFFFFFF &&
|
|
|
nla_put_u32(skb, TCA_FW_MASK, head->mask))
|