Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso...
[firefly-linux-kernel-4.4.55.git] / net / sched / cls_fw.c
index 9b97172db84a7c72c31c2b6bd36141149859eb1c..a366537f82c6b7981472cdcc51e977a139f3b540 100644 (file)
@@ -41,16 +41,11 @@ 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;
 };
 
-static const struct tcf_ext_map fw_ext_map = {
-       .action = TCA_FW_ACT,
-       .police = TCA_FW_POLICE
-};
-
 static inline int fw_hash(u32 handle)
 {
        if (HTSIZE == 4096)
@@ -80,7 +75,7 @@ static inline int fw_hash(u32 handle)
 static int fw_classify(struct sk_buff *skb, const struct tcf_proto *tp,
                          struct tcf_result *res)
 {
-       struct fw_head *head = (struct fw_head *)tp->root;
+       struct fw_head *head = tp->root;
        struct fw_filter *f;
        int r;
        u32 id = skb->mark;
@@ -91,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);
@@ -116,7 +111,7 @@ static int fw_classify(struct sk_buff *skb, const struct tcf_proto *tp,
 
 static unsigned long fw_get(struct tcf_proto *tp, u32 handle)
 {
-       struct fw_head *head = (struct fw_head *)tp->root;
+       struct fw_head *head = tp->root;
        struct fw_filter *f;
 
        if (head == NULL)
@@ -165,7 +160,7 @@ static void fw_destroy(struct tcf_proto *tp)
 
 static int fw_delete(struct tcf_proto *tp, unsigned long arg)
 {
-       struct fw_head *head = (struct fw_head *)tp->root;
+       struct fw_head *head = tp->root;
        struct fw_filter *f = (struct fw_filter *)arg;
        struct fw_filter **fp;
 
@@ -195,12 +190,13 @@ static int
 fw_change_attrs(struct net *net, struct tcf_proto *tp, struct fw_filter *f,
        struct nlattr **tb, struct nlattr **tca, unsigned long base)
 {
-       struct fw_head *head = (struct fw_head *)tp->root;
+       struct fw_head *head = tp->root;
        struct tcf_exts e;
        u32 mask;
        int err;
 
-       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, &fw_ext_map);
+       tcf_exts_init(&e, TCA_FW_ACT, TCA_FW_POLICE);
+       err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e);
        if (err < 0)
                return err;
 
@@ -211,9 +207,13 @@ 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) {
+                       err = ret;
                        goto errout;
+               }
+               f->ifindex = ret;
        }
 #endif /* CONFIG_NET_CLS_IND */
 
@@ -239,7 +239,7 @@ static int fw_change(struct net *net, struct sk_buff *in_skb,
                     struct nlattr **tca,
                     unsigned long *arg)
 {
-       struct fw_head *head = (struct fw_head *)tp->root;
+       struct fw_head *head = tp->root;
        struct fw_filter *f = (struct fw_filter *) *arg;
        struct nlattr *opt = tca[TCA_OPTIONS];
        struct nlattr *tb[TCA_FW_MAX + 1];
@@ -280,6 +280,7 @@ static int fw_change(struct net *net, struct sk_buff *in_skb,
        if (f == NULL)
                return -ENOBUFS;
 
+       tcf_exts_init(&f->exts, TCA_FW_ACT, TCA_FW_POLICE);
        f->id = handle;
 
        err = fw_change_attrs(net, tp, f, tb, tca, base);
@@ -301,7 +302,7 @@ errout:
 
 static void fw_walk(struct tcf_proto *tp, struct tcf_walker *arg)
 {
-       struct fw_head *head = (struct fw_head *)tp->root;
+       struct fw_head *head = tp->root;
        int h;
 
        if (head == NULL)
@@ -327,10 +328,10 @@ static void fw_walk(struct tcf_proto *tp, struct tcf_walker *arg)
        }
 }
 
-static int fw_dump(struct tcf_proto *tp, unsigned long fh,
+static int fw_dump(struct net *net, struct tcf_proto *tp, unsigned long fh,
                   struct sk_buff *skb, struct tcmsg *t)
 {
-       struct fw_head *head = (struct fw_head *)tp->root;
+       struct fw_head *head = tp->root;
        struct fw_filter *f = (struct fw_filter *)fh;
        unsigned char *b = skb_tail_pointer(skb);
        struct nlattr *nest;
@@ -351,20 +352,23 @@ static int fw_dump(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))
                goto nla_put_failure;
 
-       if (tcf_exts_dump(skb, &f->exts, &fw_ext_map) < 0)
+       if (tcf_exts_dump(skb, &f->exts) < 0)
                goto nla_put_failure;
 
        nla_nest_end(skb, nest);
 
-       if (tcf_exts_dump_stats(skb, &f->exts, &fw_ext_map) < 0)
+       if (tcf_exts_dump_stats(skb, &f->exts) < 0)
                goto nla_put_failure;
 
        return skb->len;