]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
tc: flower no need to specify the ethertype
authorJamal Hadi Salim <jhs@mojatatu.com>
Sun, 10 Jan 2016 19:56:31 +0000 (14:56 -0500)
committerStephen Hemminger <stephen@networkplumber.org>
Mon, 11 Jan 2016 16:24:01 +0000 (08:24 -0800)
since all tc classifiers are required to specify ethertype as part of grammar
By not allowing eth_type to be specified we remove contradiction for
example when a user specifies:
tc filter add ... priority xxx protocol ip flower eth_type ipv6
This patch removes that contradiction

Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
tc/f_flower.c

index a9b2c4df476fcce4af8533f06eed261a7aa2e751..db9cc2961fec3832742d2586113f77efc660874a 100644 (file)
@@ -31,7 +31,7 @@ static void explain(void)
        fprintf(stderr, "       MATCH      := { indev DEV-NAME | \n");
        fprintf(stderr, "                       dst_mac MAC-ADDR | \n");
        fprintf(stderr, "                       src_mac MAC-ADDR | \n");
-       fprintf(stderr, "                       eth_type [ipv4 | ipv6 | ETH-TYPE ] | \n");
+       fprintf(stderr, "                       [ipv4 | ipv6 ] | \n");
        fprintf(stderr, "                       ip_proto [tcp | udp | IP-PROTO ] | \n");
        fprintf(stderr, "                       dst_ip [ IPV4-ADDR | IPV6-ADDR ] | \n");
        fprintf(stderr, "                       src_ip [ IPV4-ADDR | IPV6-ADDR ] | \n");
@@ -60,29 +60,6 @@ static int flower_parse_eth_addr(char *str, int addr_type, int mask_type,
        return 0;
 }
 
-static int flower_parse_eth_type(char *str, int type, __be16 *p_eth_type,
-                                struct nlmsghdr *n)
-{
-       int ret;
-       __be16 eth_type;
-
-       if (matches(str, "ipv4") == 0) {
-               eth_type = htons(ETH_P_IP);
-       } else if (matches(str, "ipv6") == 0) {
-               eth_type = htons(ETH_P_IPV6);
-       } else {
-               __u16 tmp;
-
-               ret = get_u16(&tmp, str, 16);
-               if (ret)
-                       return -1;
-               eth_type = htons(tmp);
-       }
-       addattr16(n, MAX_MSG, type, eth_type);
-       *p_eth_type = eth_type;
-       return 0;
-}
-
 static int flower_parse_ip_proto(char *str, __be16 eth_type, int type,
                                 __u8 *p_ip_proto, struct nlmsghdr *n)
 {
@@ -188,12 +165,9 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
        int ret;
        struct tcmsg *t = NLMSG_DATA(n);
        struct rtattr *tail;
-       __be16 eth_type = 0;
+       __be16 eth_type = TC_H_MIN(t->tcm_info);
        __u8 ip_proto = 0xff;
 
-       if (argc == 0)
-               return 0;
-
        if (handle) {
                ret = get_u32(&t->tcm_handle, handle, 0);
                if (ret) {
@@ -205,6 +179,11 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
        tail = (struct rtattr *) (((void *) n) + NLMSG_ALIGN(n->nlmsg_len));
        addattr_l(n, MAX_MSG, TCA_OPTIONS, NULL, 0);
 
+       if (argc == 0) {
+               /*at minimal we will match all ethertype packets */
+               goto parse_done;
+       }
+
        while (argc > 0) {
                if (matches(*argv, "classid") == 0 ||
                    matches(*argv, "flowid") == 0) {
@@ -244,15 +223,6 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
                                fprintf(stderr, "Illegal \"src_mac\"\n");
                                return -1;
                        }
-               } else if (matches(*argv, "eth_type") == 0) {
-                       NEXT_ARG();
-                       ret = flower_parse_eth_type(*argv,
-                                                   TCA_FLOWER_KEY_ETH_TYPE,
-                                                   &eth_type, n);
-                       if (ret < 0) {
-                               fprintf(stderr, "Illegal \"eth_type\"\n");
-                               return -1;
-                       }
                } else if (matches(*argv, "ip_proto") == 0) {
                        NEXT_ARG();
                        ret = flower_parse_ip_proto(*argv, eth_type,
@@ -323,6 +293,14 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
                argc--; argv++;
        }
 
+parse_done:
+       ret = addattr16(n, MAX_MSG, TCA_FLOWER_KEY_ETH_TYPE, eth_type);
+       if (ret) {
+               fprintf(stderr, "Illegal \"eth_type\"(0x%x)\n",
+                       ntohs(eth_type));
+               return -1;
+       }
+
        tail->rta_len = (((void*)n)+n->nlmsg_len) - (void*)tail;
 
        return 0;
@@ -489,7 +467,8 @@ static int flower_print_opt(struct filter_util *qu, FILE *f,
        if (tb[TCA_FLOWER_CLASSID]) {
                SPRINT_BUF(b1);
                fprintf(f, "classid %s ",
-                       sprint_tc_classid(rta_getattr_u32(tb[TCA_FLOWER_CLASSID]), b1));
+                       sprint_tc_classid(rta_getattr_u32(tb[TCA_FLOWER_CLASSID]),
+                                         b1));
        }
 
        if (tb[TCA_FLOWER_INDEV]) {