]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - tc/f_u32.c
tc: flower: fix port value truncation
[mirror_iproute2.git] / tc / f_u32.c
index 0926461dc92853016bf9d9e4545fc6c7bc91a40b..e0a322d5a11c891107b95520ce480a50b41b689a 100644 (file)
@@ -14,7 +14,6 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
-#include <syslog.h>
 #include <fcntl.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include "utils.h"
 #include "tc_util.h"
 
-extern int show_pretty;
-
 static void explain(void)
 {
        fprintf(stderr,
                "Usage: ... u32 [ match SELECTOR ... ] [ link HTID ] [ classid CLASSID ]\n"
                "               [ action ACTION_SPEC ] [ offset OFFSET_SPEC ]\n"
                "               [ ht HTID ] [ hashkey HASHKEY_SPEC ]\n"
-               "               [ sample SAMPLE ] [skip-hw | skip-sw]\n"
+               "               [ sample SAMPLE ] [skip_hw | skip_sw]\n"
                "or         u32 divisor DIVISOR\n"
                "\n"
                "Where: SELECTOR := SAMPLE SAMPLE ...\n"
@@ -385,8 +382,7 @@ static int parse_ip6_addr(int *argc_p, char ***argv_p,
 
        plen = addr.bitlen;
        for (i = 0; i < plen; i += 32) {
-               /* if (((i + 31) & ~0x1F) <= plen) { */
-               if (i + 31 <= plen) {
+               if (i + 31 < plen) {
                        res = pack_key(sel, addr.data[i / 32],
                                       0xFFFFFFFF, off + 4 * (i / 32), offmask);
                        if (res < 0)
@@ -967,7 +963,7 @@ static void show_keys(FILE *f, const struct tc_u32_key *key)
 {
        int i = 0;
 
-       if (!show_pretty)
+       if (!pretty)
                goto show_k;
 
        for (i = 0; i < ARRAY_SIZE(u32_pprinters); i++) {
@@ -988,7 +984,7 @@ static int u32_parse_opt(struct filter_util *qu, char *handle,
        struct {
                struct tc_u32_sel sel;
                struct tc_u32_key keys[128];
-       } sel;
+       } sel = {};
        struct tcmsg *t = NLMSG_DATA(n);
        struct rtattr *tail;
        int sel_ok = 0, terminal_ok = 0;
@@ -997,8 +993,6 @@ static int u32_parse_opt(struct filter_util *qu, char *handle,
        __u32 order = 0;
        __u32 flags = 0;
 
-       memset(&sel, 0, sizeof(sel));
-
        if (handle && get_u32_handle(&t->tcm_handle, handle)) {
                fprintf(stderr, "Illegal filter ID\n");
                return -1;
@@ -1007,8 +1001,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) {
@@ -1073,7 +1066,7 @@ static int u32_parse_opt(struct filter_util *qu, char *handle,
                                fprintf(stderr, "\"link\" must be a hash table.\n");
                                return -1;
                        }
-                       addattr_l(n, MAX_MSG, TCA_U32_LINK, &handle, 4);
+                       addattr_l(n, MAX_MSG, TCA_U32_LINK, &linkid, 4);
                } else if (strcmp(*argv, "ht") == 0) {
                        unsigned int ht;
 
@@ -1093,12 +1086,11 @@ static int u32_parse_opt(struct filter_util *qu, char *handle,
                } else if (strcmp(*argv, "sample") == 0) {
                        __u32 hash;
                        unsigned int divisor = 0x100;
-
                        struct {
                                struct tc_u32_sel sel;
                                struct tc_u32_key keys[4];
-                       } sel2;
-                       memset(&sel2, 0, sizeof(sel2));
+                       } sel2 = {};
+
                        NEXT_ARG();
                        if (parse_selector(&argc, &argv, &sel2.sel, n)) {
                                fprintf(stderr, "Illegal \"sample\"\n");
@@ -1125,9 +1117,8 @@ static int u32_parse_opt(struct filter_util *qu, char *handle,
                        sample_ok = 1;
                        continue;
                } else if (strcmp(*argv, "indev") == 0) {
-                       char ind[IFNAMSIZ + 1];
+                       char ind[IFNAMSIZ + 1] = {};
 
-                       memset(ind, 0, sizeof(ind));
                        argc--;
                        argv++;
                        if (argc < 1) {
@@ -1156,13 +1147,9 @@ static int u32_parse_opt(struct filter_util *qu, char *handle,
                        terminal_ok++;
                        continue;
                } else if (strcmp(*argv, "skip_hw") == 0) {
-                       NEXT_ARG();
                        flags |= TCA_CLS_FLAGS_SKIP_HW;
-                       continue;
                } else if (strcmp(*argv, "skip_sw") == 0) {
-                       NEXT_ARG();
                        flags |= TCA_CLS_FLAGS_SKIP_SW;
-                       continue;
                } else if (strcmp(*argv, "help") == 0) {
                        explain();
                        return -1;
@@ -1174,7 +1161,7 @@ static int u32_parse_opt(struct filter_util *qu, char *handle,
                argc--; argv++;
        }
 
-       /* We dont necessarily need class/flowids */
+       /* We don't necessarily need class/flowids */
        if (terminal_ok)
                sel.sel.flags |= TC_U32_TERMINAL;
 
@@ -1203,7 +1190,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;
 }
 
@@ -1268,6 +1255,11 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
                        fprintf(f, "skip_hw ");
                if (flags & TCA_CLS_FLAGS_SKIP_SW)
                        fprintf(f, "skip_sw ");
+
+               if (flags & TCA_CLS_FLAGS_IN_HW)
+                       fprintf(f, "in_hw ");
+               else if (flags & TCA_CLS_FLAGS_NOT_IN_HW)
+                       fprintf(f, "not_in_hw ");
        }
 
        if (tb[TCA_U32_PCNT]) {
@@ -1336,7 +1328,7 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt,
        }
 
        if (tb[TCA_U32_ACT])
-               tc_print_action(f, tb[TCA_U32_ACT]);
+               tc_print_action(f, tb[TCA_U32_ACT], 0);
 
        return 0;
 }