net_sched: optimize tcf_match_indev()
[cascardo/linux.git] / net / sched / cls_fw.c
index d605285..ca662aa 100644 (file)
@@ -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))