]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
treewide: Use addattr_nest()/addattr_nest_end() to handle nested attributes
authorSerhey Popovych <serhe.popovych@gmail.com>
Wed, 31 Jan 2018 08:15:08 +0000 (10:15 +0200)
committerDavid Ahern <dsahern@gmail.com>
Fri, 2 Feb 2018 23:01:09 +0000 (15:01 -0800)
We have helper routines to support nested attribute addition into
netlink buffer: use them instead of open coding.

Use addattr_nest_compat()/addattr_nest_compat_end() where appropriate.

Signed-off-by: Serhey Popovych <serhe.popovych@gmail.com>
Signed-off-by: David Ahern <dsahern@gmail.com>
51 files changed:
ip/iplink.c
ip/iplink_vlan.c
ip/iplink_vxcan.c
ip/link_veth.c
tc/f_flow.c
tc/f_fw.c
tc/f_route.c
tc/f_rsvp.c
tc/f_tcindex.c
tc/f_u32.c
tc/m_action.c
tc/m_bpf.c
tc/m_connmark.c
tc/m_csum.c
tc/m_ematch.c
tc/m_gact.c
tc/m_ife.c
tc/m_ipt.c
tc/m_mirred.c
tc/m_nat.c
tc/m_pedit.c
tc/m_police.c
tc/m_sample.c
tc/m_simple.c
tc/m_skbedit.c
tc/m_skbmod.c
tc/m_tunnel_key.c
tc/m_vlan.c
tc/m_xt.c
tc/m_xt_old.c
tc/q_atm.c
tc/q_cbq.c
tc/q_cbs.c
tc/q_choke.c
tc/q_codel.c
tc/q_drr.c
tc/q_dsmark.c
tc/q_fq.c
tc/q_fq_codel.c
tc/q_gred.c
tc/q_hfsc.c
tc/q_hhf.c
tc/q_htb.c
tc/q_mqprio.c
tc/q_netem.c
tc/q_pie.c
tc/q_qfq.c
tc/q_red.c
tc/q_sfb.c
tc/q_tbf.c
tc/tc_qdisc.c

index 8231fae7f3775cefd921403e8a5b8edfea648381..3d7f7fa2c861912ec0d284071d2dffc05a9bf655 100644 (file)
@@ -1025,9 +1025,9 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
                else
                        iflatype = IFLA_INFO_DATA;
                if (lu && argc) {
-                       struct rtattr *data
-                               = addattr_nest(&req.n,
-                                              sizeof(req), iflatype);
+                       struct rtattr *data;
+
+                       data = addattr_nest(&req.n, sizeof(req), iflatype);
 
                        if (lu->parse_opt &&
                            lu->parse_opt(lu, argc, argv, &req.n))
index 4d78cf9e4b3a9fe4ed6b27b5e1621f241c9db877..74f4614a2193129fb46a46e7cb3349e99c4d14bb 100644 (file)
@@ -56,8 +56,7 @@ static int vlan_parse_qos_map(int *argcp, char ***argvp, struct nlmsghdr *n,
        struct ifla_vlan_qos_mapping m;
        struct rtattr *tail;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, attrtype, NULL, 0);
+       tail = addattr_nest(n, 1024, attrtype);
 
        while (argc > 0) {
                char *colon = strchr(*argv, ':');
@@ -75,7 +74,7 @@ static int vlan_parse_qos_map(int *argcp, char ***argvp, struct nlmsghdr *n,
                addattr_l(n, 1024, IFLA_VLAN_QOS_MAPPING, &m, sizeof(m));
        }
 
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *)tail;
+       addattr_nest_end(n, tail);
 
        *argcp = argc;
        *argvp = argv;
index 87be5a673f7eeb69dbdd8b4bc83d27caef3063b3..ebe9e5683b88c3c9fe03a66f833ba6809bcad59d 100644 (file)
@@ -55,8 +55,7 @@ static int vxcan_parse_opt(struct link_util *lu, int argc, char **argv,
        ifm->ifi_flags = 0;
        ifm->ifi_change = 0;
 
-       data = NLMSG_TAIL(n);
-       addattr_l(n, 1024, VXCAN_INFO_PEER, NULL, 0);
+       data = addattr_nest(n, 1024, VXCAN_INFO_PEER);
 
        n->nlmsg_len += sizeof(struct ifinfomsg);
 
@@ -83,7 +82,7 @@ static int vxcan_parse_opt(struct link_util *lu, int argc, char **argv,
        if (group != -1)
                addattr32(n, 1024, IFLA_GROUP, group);
 
-       data->rta_len = (void *)NLMSG_TAIL(n) - (void *)data;
+       addattr_nest_end(n, data);
        return argc - 1 - err;
 }
 
index e6219e72bdb18a1b21f9eaa9a83b4116fbde829e..a8e7cf7f38ae537cf8458675cf2ddad179f1183e 100644 (file)
@@ -53,8 +53,7 @@ static int veth_parse_opt(struct link_util *lu, int argc, char **argv,
        ifm->ifi_flags = 0;
        ifm->ifi_change = 0;
 
-       data = NLMSG_TAIL(n);
-       addattr_l(n, 1024, VETH_INFO_PEER, NULL, 0);
+       data = addattr_nest(n, 1024, VETH_INFO_PEER);
 
        n->nlmsg_len += sizeof(struct ifinfomsg);
 
@@ -81,7 +80,7 @@ static int veth_parse_opt(struct link_util *lu, int argc, char **argv,
        if (group != -1)
                addattr32(n, 1024, IFLA_GROUP, group);
 
-       data->rta_len = (void *)NLMSG_TAIL(n) - (void *)data;
+       addattr_nest_end(n, data);
        return argc - 1 - err;
 }
 
index b15710497d1244fe3cac97d8bc282c28f07d0132..badeaa2907285db2ad55c7e8639ec06b304cc124 100644 (file)
@@ -147,8 +147,7 @@ static int flow_parse_opt(struct filter_util *fu, char *handle,
                }
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 4096, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 4096, TCA_OPTIONS);
 
        while (argc > 0) {
                if (matches(*argv, "map") == 0) {
@@ -259,7 +258,7 @@ static int flow_parse_opt(struct filter_util *fu, char *handle,
                addattr32(n, 4096, TCA_FLOW_XOR, xor);
        }
 
-       tail->rta_len = (void *)NLMSG_TAIL(n) - (void *)tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 77474849952a7ae5ca3a3b763c0a1494caadc39c..adce2bdb7d8af353133af9a852b0494e2dd36e15 100644 (file)
--- a/tc/f_fw.c
+++ b/tc/f_fw.c
@@ -67,8 +67,7 @@ static int fw_parse_opt(struct filter_util *qu, char *handle, int argc, char **a
        if (argc == 0)
                return 0;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 4096, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 4096, TCA_OPTIONS);
 
        if (mask_set)
                addattr32(n, MAX_MSG, TCA_FW_MASK, mask);
@@ -119,7 +118,7 @@ static int fw_parse_opt(struct filter_util *qu, char *handle, int argc, char **a
                }
                argc--; argv++;
        }
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 655321f9fa4f4f3e9283ef475471168d8527f204..e52da6441fb0897cc09448280fb028e8f8629616 100644 (file)
@@ -50,8 +50,7 @@ static int route_parse_opt(struct filter_util *qu, char *handle, int argc, char
        if (argc == 0)
                return 0;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 4096, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 4096, TCA_OPTIONS);
 
        while (argc > 0) {
                if (matches(*argv, "to") == 0) {
@@ -128,7 +127,7 @@ static int route_parse_opt(struct filter_util *qu, char *handle, int argc, char
                }
                argc--; argv++;
        }
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        if (order) {
                fh &= ~0x7F00;
                fh |= (order<<8)&0x7F00;
index 1ce37340e9ef830918d3c05aac8387539221a303..bddd4740501a07bd77ab6fa6ffd96d60de03ec67 100644 (file)
@@ -188,8 +188,7 @@ static int rsvp_parse_opt(struct filter_util *qu, char *handle, int argc,
        if (argc == 0)
                return 0;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 4096, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 4096, TCA_OPTIONS);
 
        while (argc > 0) {
                if (matches(*argv, "session") == 0) {
@@ -294,7 +293,7 @@ static int rsvp_parse_opt(struct filter_util *qu, char *handle, int argc,
 
        if (pinfo_ok)
                addattr_l(n, 4096, TCA_RSVP_PINFO, &pinfo, sizeof(pinfo));
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 749273dbd9abb4c3cfe0838a73f392ac7d58763e..159cf41461b5b35c02a415a384668dafc78f7a47 100644 (file)
@@ -37,8 +37,7 @@ static int tcindex_parse_opt(struct filter_util *qu, char *handle, int argc,
                }
        }
        if (!argc) return 0;
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 4096, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 4096, TCA_OPTIONS);
        while (argc) {
                if (!strcmp(*argv, "hash")) {
                        int hash;
@@ -113,7 +112,7 @@ static int tcindex_parse_opt(struct filter_util *qu, char *handle, int argc,
                argc--;
                argv++;
        }
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 1fafb4af7eb5bba3e6602a6281f4dfeff1f2f0df..019d56c653a4afc076bf30945c598bf71ff29158 100644 (file)
@@ -1003,8 +1003,7 @@ static int u32_parse_opt(struct filter_util *qu, char *handle,
        if (argc == 0)
                return 0;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, TCA_OPTIONS);
 
        while (argc > 0) {
                if (matches(*argv, "match") == 0) {
@@ -1197,7 +1196,7 @@ static int u32_parse_opt(struct filter_util *qu, char *handle,
                addattr_l(n, MAX_MSG, TCA_U32_FLAGS, &flags, 4);
        }
 
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 445d0b69bb7566586830dbe9e0dc765dbfeb21c2..744bde416ad356aa80420338fcb5d7b258d29410 100644 (file)
@@ -166,9 +166,7 @@ int parse_action(int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n)
        if (argc <= 0)
                return -1;
 
-       tail = tail2 = NLMSG_TAIL(n);
-
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail2 = addattr_nest(n, MAX_MSG, tca_id);
 
        while (argc > 0) {
 
@@ -213,8 +211,7 @@ done0:
                                goto bad_val;
 
 
-                       tail = NLMSG_TAIL(n);
-                       addattr_l(n, MAX_MSG, ++prio, NULL, 0);
+                       tail = addattr_nest(n, MAX_MSG, ++prio);
                        addattr_l(n, MAX_MSG, TCA_ACT_KIND, k, strlen(k) + 1);
 
                        ret = a->parse_aopt(a, &argc, &argv, TCA_ACT_OPTIONS,
@@ -252,7 +249,7 @@ done0:
                                addattr_l(n, MAX_MSG, TCA_ACT_COOKIE,
                                          &act_ck, act_ck_len);
 
-                       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+                       addattr_nest_end(n, tail);
                        ok++;
                }
        }
@@ -262,7 +259,7 @@ done0:
                goto bad_val;
        }
 
-       tail2->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail2;
+       addattr_nest_end(n, tail2);
 
 done:
        *argc_p = argc;
@@ -468,8 +465,7 @@ static int tc_action_gd(int cmd, unsigned int flags,
        argv += 1;
 
 
-       tail = NLMSG_TAIL(&req.n);
-       addattr_l(&req.n, MAX_MSG, TCA_ACT_TAB, NULL, 0);
+       tail = addattr_nest(&req.n, MAX_MSG, TCA_ACT_TAB);
 
        while (argc > 0) {
                if (strcmp(*argv, "action") == 0) {
@@ -518,16 +514,15 @@ static int tc_action_gd(int cmd, unsigned int flags,
                        goto bad_val;
                }
 
-               tail2 = NLMSG_TAIL(&req.n);
-               addattr_l(&req.n, MAX_MSG, ++prio, NULL, 0);
+               tail2 = addattr_nest(&req.n, MAX_MSG, ++prio);
                addattr_l(&req.n, MAX_MSG, TCA_ACT_KIND, k, strlen(k) + 1);
                if (i > 0)
                        addattr32(&req.n, MAX_MSG, TCA_ACT_INDEX, i);
-               tail2->rta_len = (void *) NLMSG_TAIL(&req.n) - (void *) tail2;
+               addattr_nest_end(&req.n, tail2);
 
        }
 
-       tail->rta_len = (void *) NLMSG_TAIL(&req.n) - (void *) tail;
+       addattr_nest_end(&req.n, tail);
 
        req.n.nlmsg_seq = rth.dump = ++rth.seq;
 
@@ -626,8 +621,7 @@ static int tc_act_list_or_flush(int *argc_p, char ***argv_p, int event)
                .t.tca_family = AF_UNSPEC,
        };
 
-       tail = NLMSG_TAIL(&req.n);
-       addattr_l(&req.n, MAX_MSG, TCA_ACT_TAB, NULL, 0);
+       tail = addattr_nest(&req.n, MAX_MSG, TCA_ACT_TAB);
        tail2 = NLMSG_TAIL(&req.n);
 
        strncpy(k, *argv, sizeof(k) - 1);
@@ -659,7 +653,7 @@ static int tc_act_list_or_flush(int *argc_p, char ***argv_p, int event)
        addattr_l(&req.n, MAX_MSG, ++prio, NULL, 0);
        addattr_l(&req.n, MAX_MSG, TCA_ACT_KIND, k, strlen(k) + 1);
        tail2->rta_len = (void *) NLMSG_TAIL(&req.n) - (void *) tail2;
-       tail->rta_len = (void *) NLMSG_TAIL(&req.n) - (void *) tail;
+       addattr_nest_end(&req.n, tail);
 
        tail3 = NLMSG_TAIL(&req.n);
        flag_select.value |= TCA_FLAG_LARGE_DUMP_ON;
index 576f69ccdab098668ea92e48c6bb4c57959bad70..27dcfd7fddfb230f5b1478c4c94a2ad9c35f1578 100644 (file)
@@ -90,8 +90,7 @@ static int bpf_parse_opt(struct action_util *a, int *ptr_argc, char ***ptr_argv,
 
        NEXT_ARG();
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
 
        while (argc > 0) {
                if (matches(*argv, "run") == 0) {
@@ -144,7 +143,7 @@ opt_bpf:
        }
 
        addattr_l(n, MAX_MSG, TCA_ACT_BPF_PARMS, &parm, sizeof(parm));
-       tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
+       addattr_nest_end(n, tail);
 
        if (bpf_uds_name)
                ret = bpf_send_map_fds(bpf_uds_name, bpf_obj);
index 47c7a8c2b17e7495fd25471e067741bdd6038c19..56d1db929769c9f2e5f37eeecb1e1445c37eaf76 100644 (file)
@@ -96,10 +96,9 @@ parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
                }
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        addattr_l(n, MAX_MSG, TCA_CONNMARK_PARMS, &sel, sizeof(sel));
-       tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
+       addattr_nest_end(n, tail);
 
        *argc_p = argc;
        *argv_p = argv;
index e1352c0820f69fdebebf71fd0c1630a8030bd69f..42d37ababbf6486a71308129810b29e706fd2445 100644 (file)
@@ -139,10 +139,9 @@ parse_csum(struct action_util *a, int *argc_p,
                }
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        addattr_l(n, MAX_MSG, TCA_CSUM_PARMS, &sel, sizeof(sel));
-       tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
+       addattr_nest_end(n, tail);
 
        *argc_p = argc;
        *argv_p = argv;
index d2bb5c38038202e439ab48d6776f1e9fadaace21..7dbc2e758e732b7a1a2b4eb3dbecd9c0ecf9b95b 100644 (file)
@@ -175,13 +175,13 @@ static int parse_tree(struct nlmsghdr *n, struct ematch *tree)
        struct ematch *t;
 
        for (t = tree; t; t = t->next) {
-               struct rtattr *tail = NLMSG_TAIL(n);
+               struct rtattr *tail;
                struct tcf_ematch_hdr hdr = { .flags = t->relation };
 
                if (t->inverted)
                        hdr.flags |= TCF_EM_INVERT;
 
-               addattr_l(n, MAX_MSG, index++, NULL, 0);
+               tail = addattr_nest(n, MAX_MSG, index++);
 
                if (t->child) {
                        __u32 r = t->child_ref;
@@ -216,7 +216,7 @@ static int parse_tree(struct nlmsghdr *n, struct ematch *tree)
                                return -1;
                }
 
-               tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+               addattr_nest_end(n, tail);
        }
 
        return 0;
@@ -341,18 +341,16 @@ int parse_ematch(int *argc_p, char ***argv_p, int tca_id, struct nlmsghdr *n)
                        .progid = TCF_EM_PROG_TC
                };
 
-               tail = NLMSG_TAIL(n);
-               addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+               tail = addattr_nest(n, MAX_MSG, tca_id);
                addattr_l(n, MAX_MSG, TCA_EMATCH_TREE_HDR, &hdr, sizeof(hdr));
 
-               tail_list = NLMSG_TAIL(n);
-               addattr_l(n, MAX_MSG, TCA_EMATCH_TREE_LIST, NULL, 0);
+               tail_list = addattr_nest(n, MAX_MSG, TCA_EMATCH_TREE_LIST);
 
                if (parse_tree(n, ematch_root) < 0)
                        return -1;
 
-               tail_list->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail_list;
-               tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+               addattr_nest_end(n, tail_list);
+               addattr_nest_end(n, tail);
        }
 
        *argc_p = ematch_argc;
index b30b0420bb1e14ff202c2ca0539afbfd28a1103e..ccad4f2228e145e12f801f10d5b16ac9e63661ca 100644 (file)
@@ -148,14 +148,13 @@ parse_gact(struct action_util *a, int *argc_p, char ***argv_p,
                }
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        addattr_l(n, MAX_MSG, TCA_GACT_PARMS, &p, sizeof(p));
 #ifdef CONFIG_GACT_PROB
        if (rd)
                addattr_l(n, MAX_MSG, TCA_GACT_PROB, &pp, sizeof(pp));
 #endif
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
 
        *argc_p = argc;
        *argv_p = argv;
index 4647f6a6e779c4befef631e1e166ee2b37ec80fb..43d89181b7368448109ef9c58f1795ab8e8d2505 100644 (file)
@@ -178,8 +178,7 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p,
                ife_usage();
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        addattr_l(n, MAX_MSG, TCA_IFE_PARMS, &p, sizeof(p));
 
        if (!(p.flags & IFE_ENCODE))
@@ -194,8 +193,7 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p,
        if (saddr)
                addattr_l(n, MAX_MSG, TCA_IFE_SMAC, sbuf, ETH_ALEN);
 
-       tail2 = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, TCA_IFE_METALST, NULL, 0);
+       tail2 = addattr_nest(n, MAX_MSG, TCA_IFE_METALST);
        if (ife_mark || ife_mark_v) {
                if (ife_mark_v)
                        addattr_l(n, MAX_MSG, IFE_META_SKBMARK, &ife_mark_v, 4);
@@ -216,10 +214,10 @@ static int parse_ife(struct action_util *a, int *argc_p, char ***argv_p,
                        addattr_l(n, MAX_MSG, IFE_META_TCINDEX, NULL, 0);
        }
 
-       tail2->rta_len = (void *)NLMSG_TAIL(n) - (void *)tail2;
+       addattr_nest_end(n, tail2);
 
 skip_encode:
-       tail->rta_len = (void *)NLMSG_TAIL(n) - (void *)tail;
+       addattr_nest_end(n, tail);
 
        *argc_p = argc;
        *argv_p = argv;
index 1c3c240f6fc3ab4c679470a5e6655cf263e232b6..b48cc0a9c85f93e78b7b7ab5287098a117d2bfae 100644 (file)
@@ -383,8 +383,7 @@ static int parse_ipt(struct action_util *a, int *argc_p,
                }
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        fprintf(stdout, "tablename: %s hook: %s\n ", tname, ipthooks[hook]);
        fprintf(stdout, "\ttarget: ");
 
@@ -405,7 +404,7 @@ static int parse_ipt(struct action_util *a, int *argc_p,
        addattr_l(n, MAX_MSG, TCA_IPT_INDEX, &index, 4);
        if (m)
                addattr_l(n, MAX_MSG, TCA_IPT_TARG, m->t, m->t->u.target_size);
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
 
        argc -= optind;
        argv += optind;
index aa7ce6d923cce233801933827bc911e7c17eb879..eb42b7c13bec75bab75469f2efd7081ee1ad8ebe 100644 (file)
@@ -225,10 +225,9 @@ parse_direction(struct action_util *a, int *argc_p, char ***argv_p,
                }
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        addattr_l(n, MAX_MSG, TCA_MIRRED_PARMS, &p, sizeof(p));
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
 
        *argc_p = argc;
        *argv_p = argv;
index f5de4d4cac9f376b68bccefce3bc524a24b3f443..1bb6495b99c96c297220ea102fe25241e9b57acd 100644 (file)
@@ -129,10 +129,9 @@ parse_nat(struct action_util *a, int *argc_p, char ***argv_p, int tca_id, struct
                }
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        addattr_l(n, MAX_MSG, TCA_NAT_PARMS, &sel, sizeof(sel));
-       tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
+       addattr_nest_end(n, tail);
 
        *argc_p = argc;
        *argv_p = argv;
index dc57f14ae1ce5fae75052d04115eb6e7cef7e07a..2d41f0a0be2b5c30338882d60cf8b9cef506dbaa 100644 (file)
@@ -686,8 +686,7 @@ int parse_pedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
                }
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        if (!sel.extended) {
                addattr_l(n, MAX_MSG, TCA_PEDIT_PARMS, &sel,
                          sizeof(sel.sel) +
@@ -700,7 +699,7 @@ int parse_pedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
                pedit_keys_ex_addattr(&sel, n);
        }
 
-       tail->rta_len = (void *)NLMSG_TAIL(n) - (void *)tail;
+       addattr_nest_end(n, tail);
 
        *argc_p = argc;
        *argv_p = argv;
index ff1dcb7d0323c7fa7b5952fab411e8b08be92a0f..f85da49fc4ec81364c7033585de81b571c017cd5 100644 (file)
@@ -228,8 +228,7 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p,
                }
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        addattr_l(n, MAX_MSG, TCA_POLICE_TBF, &p, sizeof(p));
        if (p.rate.rate)
                addattr_l(n, MAX_MSG, TCA_POLICE_RATE, rtab, 1024);
@@ -240,7 +239,7 @@ int act_parse_police(struct action_util *a, int *argc_p, char ***argv_p,
        if (presult)
                addattr32(n, MAX_MSG, TCA_POLICE_RESULT, presult);
 
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        res = 0;
 
        *argc_p = argc;
index 31774c0e806b4a3f9fa56163d67c07124bed39a5..fe892adcac89ada853c8cd6568b8b87c94c79de0 100644 (file)
@@ -122,8 +122,7 @@ static int parse_sample(struct action_util *a, int *argc_p, char ***argv_p,
                usage();
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        addattr_l(n, MAX_MSG, TCA_SAMPLE_PARMS, &p, sizeof(p));
        if (rate_set)
                addattr32(n, MAX_MSG, TCA_SAMPLE_RATE, rate);
@@ -132,7 +131,7 @@ static int parse_sample(struct action_util *a, int *argc_p, char ***argv_p,
        if (trunc_set)
                addattr32(n, MAX_MSG, TCA_SAMPLE_TRUNC_SIZE, trunc);
 
-       tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
+       addattr_nest_end(n, tail);
 
        *argc_p = argc;
        *argv_p = argv;
index a687b9f83f658b88ac23eaa86030b1ae1c113406..886606f9f8b4e754c035d3c74932f753126abd89 100644 (file)
@@ -146,12 +146,11 @@ parse_simple(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
 
        sel.action = TC_ACT_PIPE;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        addattr_l(n, MAX_MSG, TCA_DEF_PARMS, &sel, sizeof(sel));
        if (simpdata)
                addattr_l(n, MAX_MSG, TCA_DEF_DATA, simpdata, SIMP_MAX_DATA);
-       tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
+       addattr_nest_end(n, tail);
 
        *argc_p = argc;
        *argv_p = argv;
index c41a7bb082dad1b1982dcba689c03f27023c7ac3..c1eda30cef35f04d1897643a6447155b3acae8ae 100644 (file)
@@ -143,8 +143,7 @@ parse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
        }
 
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        addattr_l(n, MAX_MSG, TCA_SKBEDIT_PARMS, &sel, sizeof(sel));
        if (flags & SKBEDIT_F_QUEUE_MAPPING)
                addattr_l(n, MAX_MSG, TCA_SKBEDIT_QUEUE_MAPPING,
@@ -158,7 +157,7 @@ parse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
        if (flags & SKBEDIT_F_PTYPE)
                addattr_l(n, MAX_MSG, TCA_SKBEDIT_PTYPE,
                          &ptype, sizeof(ptype));
-       tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
+       addattr_nest_end(n, tail);
 
        *argc_p = argc;
        *argv_p = argv;
index bc268dfd5827a2a7809552f88e68921090a64b91..6721f87db08b973bff095242d0985221179b7c6f 100644 (file)
@@ -143,8 +143,7 @@ static int parse_skbmod(struct action_util *a, int *argc_p, char ***argv_p,
                skbmod_usage();
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        addattr_l(n, MAX_MSG, TCA_SKBMOD_PARMS, &p, sizeof(p));
 
        if (daddr)
@@ -154,7 +153,7 @@ static int parse_skbmod(struct action_util *a, int *argc_p, char ***argv_p,
        if (saddr)
                addattr_l(n, MAX_MSG, TCA_SKBMOD_SMAC, sbuf, ETH_ALEN);
 
-       tail->rta_len = (void *)NLMSG_TAIL(n) - (void *)tail;
+       addattr_nest_end(n, tail);
 
        *argc_p = argc;
        *argv_p = argv;
index 2dc91879c237566a376bd28b8b3221fabc3de5ad..8d4cee125bc1562644532d01658bc1bc9b3926e4 100644 (file)
@@ -98,8 +98,7 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
        if (matches(*argv, "tunnel_key") != 0)
                return -1;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
 
        NEXT_ARG();
 
@@ -197,7 +196,7 @@ static int parse_tunnel_key(struct action_util *a, int *argc_p, char ***argv_p,
 
        parm.t_action = action;
        addattr_l(n, MAX_MSG, TCA_TUNNEL_KEY_PARMS, &parm, sizeof(parm));
-       tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
+       addattr_nest_end(n, tail);
 
        *argc_p = argc;
        *argv_p = argv;
index edae0d1e6f70755c480ab9c9f830ba3516175237..9ee52da2ca431128eadce9f01aad444f2e4717d6 100644 (file)
@@ -152,8 +152,7 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p,
        }
 
        parm.v_action = action;
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        addattr_l(n, MAX_MSG, TCA_VLAN_PARMS, &parm, sizeof(parm));
        if (id_set)
                addattr_l(n, MAX_MSG, TCA_VLAN_PUSH_VLAN_ID, &id, 2);
@@ -170,7 +169,7 @@ static int parse_vlan(struct action_util *a, int *argc_p, char ***argv_p,
        if (prio_set)
                addattr8(n, MAX_MSG, TCA_VLAN_PUSH_VLAN_PRIORITY, prio);
 
-       tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
+       addattr_nest_end(n, tail);
 
        *argc_p = argc;
        *argv_p = argv;
index a1137be9614f1f28636882292433f0bb16fc45a1..29574bd41f93eefb46214e969cec8772f568e72c 100644 (file)
--- a/tc/m_xt.c
+++ b/tc/m_xt.c
@@ -264,8 +264,7 @@ static int parse_ipt(struct action_util *a, int *argc_p,
                }
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        fprintf(stdout, "tablename: %s hook: %s\n ", tname, ipthooks[hook]);
        fprintf(stdout, "\ttarget: ");
 
@@ -290,7 +289,7 @@ static int parse_ipt(struct action_util *a, int *argc_p,
        addattr_l(n, MAX_MSG, TCA_IPT_INDEX, &index, 4);
        if (m)
                addattr_l(n, MAX_MSG, TCA_IPT_TARG, m->t, m->t->u.target_size);
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
 
        argv += optind;
        *argc_p -= argc;
index 21d90877357c595eaa07048d486923bb5febf385..313bea61cc7e05bb8ed24168b48dd320c63a31bb 100644 (file)
@@ -308,8 +308,7 @@ static int parse_ipt(struct action_util *a, int *argc_p,
                }
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+       tail = addattr_nest(n, MAX_MSG, tca_id);
        fprintf(stdout, "tablename: %s hook: %s\n ", tname, ipthooks[hook]);
        fprintf(stdout, "\ttarget: ");
 
@@ -330,7 +329,7 @@ static int parse_ipt(struct action_util *a, int *argc_p,
        addattr_l(n, MAX_MSG, TCA_IPT_INDEX, &index, 4);
        if (m)
                addattr_l(n, MAX_MSG, TCA_IPT_TARG, m->t, m->t->u.target_size);
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
 
        argc -= optind;
        argv += optind;
index 3ea4cf4eb986f66192709699f56143e30ff66338..f8215f06507a69d4862abc69c73274c9bec49730 100644 (file)
@@ -167,12 +167,13 @@ static int atm_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
                        perror("ioctl ATMARP_MKIP");
                        return -1;
                }
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        addattr_l(n, 1024, TCA_ATM_FD, &s, sizeof(s));
-       if (excess) addattr_l(n, 1024, TCA_ATM_EXCESS, &excess, sizeof(excess));
-       if (hdr_len != -1) addattr_l(n, 1024, TCA_ATM_HDR, hdr, hdr_len);
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       if (excess)
+               addattr_l(n, 1024, TCA_ATM_EXCESS, &excess, sizeof(excess));
+       if (hdr_len != -1)
+               addattr_l(n, 1024, TCA_ATM_HDR, hdr, hdr_len);
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index d05fe9c88808d79f696656d4d5c97ec912d32781..e7f1a3bfaf5dbb2565d4f1bafdab9639d8a2ec06 100644 (file)
@@ -165,8 +165,7 @@ static int cbq_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nl
        lss.change = TCF_CBQ_LSS_MAXIDLE|TCF_CBQ_LSS_EWMA|TCF_CBQ_LSS_AVPKT;
        lss.avpkt = avpkt;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        addattr_l(n, 1024, TCA_CBQ_RATE, &r, sizeof(r));
        addattr_l(n, 1024, TCA_CBQ_LSSOPT, &lss, sizeof(lss));
        addattr_l(n, 3024, TCA_CBQ_RTAB, rtab, 1024);
@@ -177,7 +176,7 @@ static int cbq_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nl
                        printf("%u ", rtab[i]);
                printf("\n");
        }
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
@@ -419,8 +418,7 @@ static int cbq_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, str
                lss.change |= TCF_CBQ_LSS_EWMA;
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        if (lss.change) {
                lss.change |= TCF_CBQ_LSS_FLAGS;
                addattr_l(n, 1024, TCA_CBQ_LSSOPT, &lss, sizeof(lss));
@@ -440,7 +438,7 @@ static int cbq_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, str
                        printf("\n");
                }
        }
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index b57390571e181811deb2f35d6fe2c97564194263..a2ffb1db385247a66a96602b1840181c795bc1c9 100644 (file)
@@ -102,10 +102,9 @@ static int cbs_parse_opt(struct qdisc_util *qu, int argc,
                argc--; argv++;
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        addattr_l(n, 2024, TCA_CBS_PARMS, &opt, sizeof(opt));
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 50ac4ad4ecb8093e00b46e439fd50a7f10186c5f..b269b1338b6d92377645cc65dc542c6a454dc2a6 100644 (file)
@@ -156,13 +156,12 @@ static int choke_parse_opt(struct qdisc_util *qu, int argc, char **argv,
        if (ecn_ok)
                opt.flags |= TC_RED_ECN;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        addattr_l(n, 1024, TCA_CHOKE_PARMS, &opt, sizeof(opt));
        addattr_l(n, 1024, TCA_CHOKE_STAB, sbuf, 256);
        max_P = probability * pow(2, 32);
        addattr_l(n, 1024, TCA_CHOKE_MAX_P, &max_P, sizeof(max_P));
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 62d6dd68a0998cb6f0f0e79bb58105f960f3e911..8a2a871671cbe89382db378e913947855074eef1 100644 (file)
@@ -107,8 +107,7 @@ static int codel_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                argc--; argv++;
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        if (limit)
                addattr_l(n, 1024, TCA_CODEL_LIMIT, &limit, sizeof(limit));
        if (interval)
@@ -121,7 +120,7 @@ static int codel_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                addattr_l(n, 1024, TCA_CODEL_CE_THRESHOLD,
                          &ce_threshold, sizeof(ce_threshold));
 
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 5e541c09abe11b433e879f5df323230027ec8281..f9c90f3035f388163d8dcb41331fabd726bde2fc 100644 (file)
@@ -55,8 +55,7 @@ static int drr_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
        struct rtattr *tail;
        __u32 tmp;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
 
        while (argc > 0) {
                if (strcmp(*argv, "quantum") == 0) {
@@ -77,7 +76,7 @@ static int drr_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
                argc--; argv++;
        }
 
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *)tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 967fd89214156f990f3b915cae77c0eec198b0a4..d3e8292d777cc2be5385cde5a13bdeb5c966aabc 100644 (file)
@@ -64,16 +64,16 @@ static int dsmark_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                explain();
                return -1;
        }
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        addattr_l(n, 1024, TCA_DSMARK_INDICES, &ind, sizeof(ind));
        if (dflt != -1) {
            __u16 tmp = dflt;
 
            addattr_l(n, 1024, TCA_DSMARK_DEFAULT_INDEX, &tmp, sizeof(tmp));
        }
-       if (set_tc_index) addattr_l(n, 1024, TCA_DSMARK_SET_TC_INDEX, NULL, 0);
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       if (set_tc_index)
+               addattr_l(n, 1024, TCA_DSMARK_SET_TC_INDEX, NULL, 0);
+       addattr_nest_end(n, tail);
        return 0;
 }
 
@@ -91,8 +91,7 @@ static int dsmark_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
        __u8 tmp;
        char *end;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        while (argc > 0) {
                if (!strcmp(*argv, "mask")) {
                        NEXT_ARG();
@@ -117,7 +116,7 @@ static int dsmark_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
                argc--;
                argv++;
        }
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 51b5bc367cab4d7a3a0cb558609498bc50f10721..f3dbf2ba0c6f520ec1080b90fa4f08c968325102 100644 (file)
--- a/tc/q_fq.c
+++ b/tc/q_fq.c
@@ -190,8 +190,7 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                argc--; argv++;
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        if (buckets) {
                unsigned int log = ilog2(buckets);
 
@@ -227,7 +226,7 @@ static int fq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
        if (set_orphan_mask)
                addattr_l(n, 1024, TCA_FQ_ORPHAN_MASK,
                          &orphan_mask, sizeof(refill_delay));
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index fd1f59c89f50d3e9e5924f1b702e60e9180542de..9e3736fea1f73744bfd1ab764ca0dc9aaac9d298 100644 (file)
@@ -126,8 +126,7 @@ static int fq_codel_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                argc--; argv++;
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        if (limit)
                addattr_l(n, 1024, TCA_FQ_CODEL_LIMIT, &limit, sizeof(limit));
        if (flows)
@@ -147,7 +146,7 @@ static int fq_codel_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                addattr_l(n, 1024, TCA_FQ_CODEL_MEMORY_LIMIT,
                          &memory, sizeof(memory));
 
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 5b5761eebd05e307319a05adb469a2c3b5e78dd4..e63fac72a883d690762b62d51f6d44b345e384ec 100644 (file)
@@ -105,12 +105,11 @@ static int init_gred(struct qdisc_util *qu, int argc, char **argv,
 
        DPRINTF("TC_GRED: sending DPs=%u def_DP=%u\n", opt.DPs, opt.def_DP);
        n->nlmsg_flags |= NLM_F_CREATE;
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        addattr_l(n, 1024, TCA_GRED_DPS, &opt, sizeof(struct tc_gred_sopt));
        if (limit)
                addattr32(n, 1024, TCA_GRED_LIMIT, limit);
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 /*
@@ -257,13 +256,12 @@ static int gred_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct n
        }
        opt.Scell_log = parm;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        addattr_l(n, 1024, TCA_GRED_PARMS, &opt, sizeof(opt));
        addattr_l(n, 1024, TCA_GRED_STAB, sbuf, 256);
        max_P = probability * pow(2, 32);
        addattr32(n, 1024, TCA_GRED_MAX_P, max_P);
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index c19e87f98761ea472871f9018b07de6d6224fffa..f34b1b2fe2a98f10c5f65ac4f20b26686fcbae4f 100644 (file)
@@ -201,9 +201,7 @@ hfsc_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
                return -1;
        }
 
-       tail = NLMSG_TAIL(n);
-
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        if (rsc_ok)
                addattr_l(n, 1024, TCA_HFSC_RSC, &rsc, sizeof(rsc));
        if (fsc_ok)
@@ -211,7 +209,7 @@ hfsc_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
        if (usc_ok)
                addattr_l(n, 1024, TCA_HFSC_USC, &usc, sizeof(usc));
 
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 66c7188663547ec21f31574977649476750aab20..21186a92c017ab6e1bd7c30b4178122c1a6a4456 100644 (file)
@@ -91,8 +91,7 @@ static int hhf_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                argc--; argv++;
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        if (limit)
                addattr_l(n, 1024, TCA_HHF_BACKLOG_LIMIT, &limit,
                          sizeof(limit));
@@ -113,7 +112,7 @@ static int hhf_parse_opt(struct qdisc_util *qu, int argc, char **argv,
        if (non_hh_weight)
                addattr_l(n, 1024, TCA_HHF_NON_HH_WEIGHT, &non_hh_weight,
                          sizeof(non_hh_weight));
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 3fc2acb3be3265dd2f639343241185946cb15a74..7d5f6ce4477393c16359a1e37df79f8b96a97c47 100644 (file)
@@ -98,13 +98,12 @@ static int htb_parse_opt(struct qdisc_util *qu, int argc,
                }
                argc--; argv++;
        }
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        addattr_l(n, 2024, TCA_HTB_INIT, &opt, NLMSG_ALIGN(sizeof(opt)));
        if (direct_qlen != ~0U)
                addattr_l(n, 2024, TCA_HTB_DIRECT_QLEN,
                          &direct_qlen, sizeof(direct_qlen));
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
@@ -254,8 +253,7 @@ static int htb_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, str
        }
        opt.cbuffer = tc_calc_xmittime(ceil64, cbuffer);
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
 
        if (rate64 >= (1ULL << 32))
                addattr_l(n, 1124, TCA_HTB_RATE64, &rate64, sizeof(rate64));
@@ -266,7 +264,7 @@ static int htb_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, str
        addattr_l(n, 2024, TCA_HTB_PARMS, &opt, sizeof(opt));
        addattr_l(n, 3024, TCA_HTB_RTAB, rtab, 1024);
        addattr_l(n, 4024, TCA_HTB_CTAB, ctab, 1024);
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 89b460020e27ea8e63e07c2d98eff04ef5819ac3..207d6441d8fa35adb8c68dcde68b1ba270702c28 100644 (file)
@@ -173,8 +173,7 @@ static int mqprio_parse_opt(struct qdisc_util *qu, int argc,
                argc--; argv++;
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
+       tail = addattr_nest_compat(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
 
        if (flags & TC_MQPRIO_F_MODE)
                addattr_l(n, 1024, TCA_MQPRIO_MODE,
@@ -209,7 +208,7 @@ static int mqprio_parse_opt(struct qdisc_util *qu, int argc,
                addattr_nest_end(n, start);
        }
 
-       tail->rta_len = (void *)NLMSG_TAIL(n) - (void *)tail;
+       addattr_nest_compat_end(n, tail);
 
        return 0;
 }
index 9f9a9b3df255f89fac5269c3f1a43ddb86a8cf71..623ec9038ad37ae09b91b7936c8f5b6050761009 100644 (file)
@@ -422,8 +422,6 @@ static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                }
        }
 
-       tail = NLMSG_TAIL(n);
-
        if (reorder.probability) {
                if (opt.latency == 0) {
                        fprintf(stderr, "reordering not possible without specifying some delay\n");
@@ -452,8 +450,7 @@ static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                return -1;
        }
 
-       if (addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt)) < 0)
-               return -1;
+       tail = addattr_nest_compat(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
 
        if (present[TCA_NETEM_CORR] &&
            addattr_l(n, 1024, TCA_NETEM_CORR, &cor, sizeof(cor)) < 0)
@@ -512,7 +509,7 @@ static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                        return -1;
                free(dist_data);
        }
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_compat_end(n, tail);
        return 0;
 }
 
index b89f53c73a44987641928d547762f38ade23ed84..f7924ef5e76cbc275729b745d22763007caba4ac 100644 (file)
@@ -103,8 +103,7 @@ static int pie_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                argv++;
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        if (limit)
                addattr_l(n, 1024, TCA_PIE_LIMIT, &limit, sizeof(limit));
        if (tupdate)
@@ -121,7 +120,7 @@ static int pie_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                addattr_l(n, 1024, TCA_PIE_BYTEMODE, &bytemode,
                          sizeof(bytemode));
 
-       tail->rta_len = (void *)NLMSG_TAIL(n) - (void *)tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index d70ca1ba817e25199fbeac9c5616ce110bd1e22e..eb8fa4b849273c4771a1a6d00db8a354d045e0a5 100644 (file)
@@ -53,8 +53,7 @@ static int qfq_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
        struct rtattr *tail;
        __u32 tmp;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 4096, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 4096, TCA_OPTIONS);
 
        while (argc > 0) {
                if (matches(*argv, "weight") == 0) {
@@ -80,7 +79,7 @@ static int qfq_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
                argc--; argv++;
        }
 
-       tail->rta_len = (void *)NLMSG_TAIL(n) - (void *)tail;
+       addattr_nest_end(n, tail);
 
        return 0;
 }
index 40ba7c3e07c174a61dd0780e021fddad914d25a3..49fd4ac8051309189526a48d5c008a83687bfa90 100644 (file)
@@ -148,13 +148,12 @@ static int red_parse_opt(struct qdisc_util *qu, int argc, char **argv,
        }
        opt.Scell_log = parm;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        addattr_l(n, 1024, TCA_RED_PARMS, &opt, sizeof(opt));
        addattr_l(n, 1024, TCA_RED_STAB, sbuf, 256);
        max_P = probability * pow(2, 32);
        addattr_l(n, 1024, TCA_RED_MAX_P, &max_P, sizeof(max_P));
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 4b366ddd915c967a88774ba63212922f43ac83b5..7f48c6e0ef393f703dd8639227b7041f6165bf8f 100644 (file)
@@ -132,10 +132,9 @@ static int sfb_parse_opt(struct qdisc_util *qu, int argc, char **argv,
        if (opt.bin_size == 0)
                opt.bin_size = (opt.max * 4 + 3) / 5;
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        addattr_l(n, 1024, TCA_SFB_PARMS, &opt, sizeof(opt));
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index dfaa5d383ae596b8104e3772e080ed45a0599539..b9465b20d2beadafef3bce9729f08cf86f158672 100644 (file)
@@ -241,8 +241,7 @@ static int tbf_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                opt.mtu = tc_calc_xmittime(opt.peakrate.rate, mtu);
        }
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
+       tail = addattr_nest(n, 1024, TCA_OPTIONS);
        addattr_l(n, 2024, TCA_TBF_PARMS, &opt, sizeof(opt));
        addattr_l(n, 2124, TCA_TBF_BURST, &buffer, sizeof(buffer));
        if (rate64 >= (1ULL << 32))
@@ -254,7 +253,7 @@ static int tbf_parse_opt(struct qdisc_util *qu, int argc, char **argv,
                addattr_l(n, 3224, TCA_TBF_PBURST, &mtu, sizeof(mtu));
                addattr_l(n, 4096, TCA_TBF_PTAB, ptab, 1024);
        }
-       tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
+       addattr_nest_end(n, tail);
        return 0;
 }
 
index 8cc4b73d9d10733191db898d90d6d73b4ee66de1..2fcf04c336dfe9da17362cc0f93768080b87b5e4 100644 (file)
@@ -182,14 +182,13 @@ static int tc_qdisc_modify(int cmd, unsigned int flags, int argc, char **argv)
                        return -1;
                }
 
-               tail = NLMSG_TAIL(&req.n);
-               addattr_l(&req.n, sizeof(req), TCA_STAB, NULL, 0);
+               tail = addattr_nest(&req.n, sizeof(req), TCA_STAB);
                addattr_l(&req.n, sizeof(req), TCA_STAB_BASE, &stab.szopts,
                          sizeof(stab.szopts));
                if (stab.data)
                        addattr_l(&req.n, sizeof(req), TCA_STAB_DATA, stab.data,
                                  stab.szopts.tsize * sizeof(__u16));
-               tail->rta_len = (void *)NLMSG_TAIL(&req.n) - (void *)tail;
+               addattr_nest_end(&req.n, tail);
                if (stab.data)
                        free(stab.data);
        }