Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[firefly-linux-kernel-4.4.55.git] / net / sched / sch_api.c
index c297e2a8e2a10d79fb560d2bcea112be204c873c..2b935e7cfe7b7bbb78c3cc914a39929f1db766a8 100644 (file)
@@ -971,13 +971,13 @@ check_loop_fn(struct Qdisc *q, unsigned long cl, struct qdisc_walker *w)
  * Delete/get qdisc.
  */
 
-static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
+static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n)
 {
        struct net *net = sock_net(skb->sk);
        struct tcmsg *tcm = nlmsg_data(n);
        struct nlattr *tca[TCA_MAX + 1];
        struct net_device *dev;
-       u32 clid = tcm->tcm_parent;
+       u32 clid;
        struct Qdisc *q = NULL;
        struct Qdisc *p = NULL;
        int err;
@@ -985,14 +985,15 @@ static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
        if ((n->nlmsg_type != RTM_GETQDISC) && !capable(CAP_NET_ADMIN))
                return -EPERM;
 
-       dev = __dev_get_by_index(net, tcm->tcm_ifindex);
-       if (!dev)
-               return -ENODEV;
-
        err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, NULL);
        if (err < 0)
                return err;
 
+       dev = __dev_get_by_index(net, tcm->tcm_ifindex);
+       if (!dev)
+               return -ENODEV;
+
+       clid = tcm->tcm_parent;
        if (clid) {
                if (clid != TC_H_ROOT) {
                        if (TC_H_MAJ(clid) != TC_H_MAJ(TC_H_INGRESS)) {
@@ -1038,7 +1039,7 @@ static int tc_get_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
  * Create/change qdisc.
  */
 
-static int tc_modify_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
+static int tc_modify_qdisc(struct sk_buff *skb, struct nlmsghdr *n)
 {
        struct net *net = sock_net(skb->sk);
        struct tcmsg *tcm;
@@ -1053,6 +1054,10 @@ static int tc_modify_qdisc(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
 
 replay:
        /* Reinit, just in case something touches this. */
+       err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, NULL);
+       if (err < 0)
+               return err;
+
        tcm = nlmsg_data(n);
        clid = tcm->tcm_parent;
        q = p = NULL;
@@ -1061,9 +1066,6 @@ replay:
        if (!dev)
                return -ENODEV;
 
-       err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, NULL);
-       if (err < 0)
-               return err;
 
        if (clid) {
                if (clid != TC_H_ROOT) {
@@ -1372,7 +1374,7 @@ done:
 
 
 
-static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
+static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n)
 {
        struct net *net = sock_net(skb->sk);
        struct tcmsg *tcm = nlmsg_data(n);
@@ -1382,22 +1384,22 @@ static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
        const struct Qdisc_class_ops *cops;
        unsigned long cl = 0;
        unsigned long new_cl;
-       u32 portid = tcm->tcm_parent;
-       u32 clid = tcm->tcm_handle;
-       u32 qid = TC_H_MAJ(clid);
+       u32 portid;
+       u32 clid;
+       u32 qid;
        int err;
 
        if ((n->nlmsg_type != RTM_GETTCLASS) && !capable(CAP_NET_ADMIN))
                return -EPERM;
 
-       dev = __dev_get_by_index(net, tcm->tcm_ifindex);
-       if (!dev)
-               return -ENODEV;
-
        err = nlmsg_parse(n, sizeof(*tcm), tca, TCA_MAX, NULL);
        if (err < 0)
                return err;
 
+       dev = __dev_get_by_index(net, tcm->tcm_ifindex);
+       if (!dev)
+               return -ENODEV;
+
        /*
           parent == TC_H_UNSPEC - unspecified parent.
           parent == TC_H_ROOT   - class is root, which has no parent.
@@ -1413,6 +1415,10 @@ static int tc_ctl_tclass(struct sk_buff *skb, struct nlmsghdr *n, void *arg)
 
        /* Step 1. Determine qdisc handle X:0 */
 
+       portid = tcm->tcm_parent;
+       clid = tcm->tcm_handle;
+       qid = TC_H_MAJ(clid);
+
        if (portid != TC_H_ROOT) {
                u32 qid1 = TC_H_MAJ(portid);
 
@@ -1636,7 +1642,7 @@ static int tc_dump_tclass(struct sk_buff *skb, struct netlink_callback *cb)
        struct net_device *dev;
        int t, s_t;
 
-       if (cb->nlh->nlmsg_len < NLMSG_LENGTH(sizeof(*tcm)))
+       if (nlmsg_len(cb->nlh) < sizeof(*tcm))
                return 0;
        dev = dev_get_by_index(net, tcm->tcm_ifindex);
        if (!dev)