]> rtime.felk.cvut.cz Git - lisovros/iproute2_canprio.git/blobdiff - tc/f_fw.c
Convert to use rta_getattr_ functions
[lisovros/iproute2_canprio.git] / tc / f_fw.c
index 6d1490b46a16c00bda68ff92fcac7a919c386de3..161e2f70df03ac33c0eda9f7722fac03c38433ba 100644 (file)
--- a/tc/f_fw.c
+++ b/tc/f_fw.c
@@ -28,24 +28,21 @@ static void explain(void)
        fprintf(stderr, "Usage: ... fw [ classid CLASSID ] [ police POLICE_SPEC ]\n");
        fprintf(stderr, "       POLICE_SPEC := ... look at TBF\n");
        fprintf(stderr, "       CLASSID := X:Y\n");
+       fprintf(stderr, "\nNOTE: CLASSID is parsed as hexadecimal input.\n");
 }
 
-#define usage() return(-1)
-
 static int fw_parse_opt(struct filter_util *qu, char *handle, int argc, char **argv, struct nlmsghdr *n)
 {
        struct tc_police tp;
        struct tcmsg *t = NLMSG_DATA(n);
        struct rtattr *tail;
+       __u32 mask = 0;
+       int mask_set = 0;
 
        memset(&tp, 0, sizeof(tp));
 
-       tail = NLMSG_TAIL(n);
-       addattr_l(n, 4096, TCA_OPTIONS, NULL, 0);
-
        if (handle) {
                char *slash;
-               __u32 mask = 0;
                if ((slash = strchr(handle, '/')) != NULL)
                        *slash = '\0';
                if (get_u32(&t->tcm_handle, handle, 0)) {
@@ -57,13 +54,19 @@ static int fw_parse_opt(struct filter_util *qu, char *handle, int argc, char **a
                                fprintf(stderr, "Illegal \"handle\" mask\n");
                                return -1;
                        }
-                       addattr32(n, MAX_MSG, TCA_FW_MASK, mask);
+                       mask_set = 1;
                }
        }
 
        if (argc == 0)
                return 0;
 
+       tail = NLMSG_TAIL(n);
+       addattr_l(n, 4096, TCA_OPTIONS, NULL, 0);
+
+       if (mask_set)
+               addattr32(n, MAX_MSG, TCA_FW_MASK, mask);
+
        while (argc > 0) {
                if (matches(*argv, "classid") == 0 ||
                    matches(*argv, "flowid") == 0) {
@@ -127,7 +130,7 @@ static int fw_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, __u
                if(handle)
                        mark = handle;
                if(tb[TCA_FW_MASK] &&
-                   (mask = *(__u32*)RTA_DATA(tb[TCA_FW_MASK])) != 0xFFFFFFFF)
+                   (mask = rta_getattr_u32(tb[TCA_FW_MASK])) != 0xFFFFFFFF)
                        fprintf(f, "handle 0x%x/0x%x ", mark, mask);
                else
                        fprintf(f, "handle 0x%x ", handle);
@@ -135,14 +138,14 @@ static int fw_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, __u
 
        if (tb[TCA_FW_CLASSID]) {
                SPRINT_BUF(b1);
-               fprintf(f, "classid %s ", sprint_tc_classid(*(__u32*)RTA_DATA(tb[TCA_FW_CLASSID]), b1));
+               fprintf(f, "classid %s ", sprint_tc_classid(rta_getattr_u32(tb[TCA_FW_CLASSID]), b1));
        }
 
        if (tb[TCA_FW_POLICE])
                tc_print_police(f, tb[TCA_FW_POLICE]);
        if (tb[TCA_FW_INDEV]) {
                struct rtattr *idev = tb[TCA_FW_INDEV];
-               fprintf(f, "input dev %s ",(char *)RTA_DATA(idev));
+               fprintf(f, "input dev %s ",rta_getattr_str(idev));
        }
 
        if (tb[TCA_FW_ACT]) {