]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
Import patch iproute2.115
authornet[shemminger]!shemminger <net[shemminger]!shemminger>
Mon, 17 Jan 2005 23:27:56 +0000 (23:27 +0000)
committernet[shemminger]!shemminger <net[shemminger]!shemminger>
Mon, 17 Jan 2005 23:27:56 +0000 (23:27 +0000)
(Logical change 1.117)

ChangeLog
include/linux/pkt_cls.h
tc/f_u32.c

index 1e2e398733c6ff63a4fce9a777ea11ccc1fe27b3..b9ee19db4298f065147d44788f942dde084cb173 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2005-01-12  "Catalin(ux aka Dino) BOIE" <util@deuroconsult.ro>
+
+       * Add the possibility to use fwmark in u32 filters
+       
 2005-01-12  Andi Kleen <ak@suse.de>
 
        * Add netlink manual page
index 1bcdd11e0c8ddd8e3168594ebdd0b73181d833a2..00238b95aa7f3101b69d61a334c5180f2c1e36e9 100644 (file)
@@ -190,6 +190,7 @@ enum
        TCA_U32_ACT,   
        TCA_U32_INDEV,
        TCA_U32_PCNT,
+       TCA_U32_MARK,
        __TCA_U32_MAX
 };
 
@@ -224,6 +225,14 @@ struct tc_u32_pcnt
        __u64 rhit;
        __u64 kcnts[0];
 };
+
+struct tc_u32_mark
+{
+       __u32   val;
+       __u32   mask;
+       __u32   success;
+};
+
 /* Flags */
 
 #define TC_U32_TERMINAL                1
index 56fea713c86dab3f82c52e12620ea860f12109c7..d661f52b3be877bf5f48a5587da83e3bb30be664 100644 (file)
@@ -7,6 +7,7 @@
  *             2 of the License, or (at your option) any later version.
  *
  * Authors:    Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
+ *             Match mark added by Catalin(ux aka Dino) BOIE <catab at umbrella.ro> [5 nov 2004]
  *
  */
 
@@ -33,7 +34,7 @@ static void explain(void)
        fprintf(stderr, "or         u32 divisor DIVISOR\n");
        fprintf(stderr, "\n");
        fprintf(stderr, "Where: SELECTOR := SAMPLE SAMPLE ...\n");
-       fprintf(stderr, "       SAMPLE := { ip | ip6 | udp | tcp | icmp | u{32|16|8} } SAMPLE_ARGS\n");
+       fprintf(stderr, "       SAMPLE := { ip | ip6 | udp | tcp | icmp | u{32|16|8} | mark } SAMPLE_ARGS\n");
        fprintf(stderr, "       FILTERID := X:Y:Z\n");
 }
 
@@ -590,9 +591,42 @@ done:
        return res;
 }
 
+static int parse_mark(int *argc_p, char ***argv_p, struct nlmsghdr *n)
+{
+       int res = -1;
+       int argc = *argc_p;
+       char **argv = *argv_p;
+       struct tc_u32_mark mark;
+
+       if (argc <= 1)
+               return -1;
+
+       if (get_u32(&mark.val, *argv, 0)) {
+               fprintf(stderr, "Illegal \"mark\" value\n");
+               return -1;
+       }
+       NEXT_ARG();
+
+       if (get_u32(&mark.mask, *argv, 0)) {
+               fprintf(stderr, "Illegal \"mark\" mask\n");
+               return -1;
+       }
+       NEXT_ARG();
+
+       if ((mark.val & mark.mask) != mark.val) {
+               fprintf(stderr, "Illegal \"mark\" (impossible combination)\n");
+               return -1;
+       }
 
+       addattr_l(n, MAX_MSG, TCA_U32_MARK, &mark, sizeof(mark));
+       res = 0;
+
+       *argc_p = argc;
+       *argv_p = argv;
+       return res;
+}
 
-static int parse_selector(int *argc_p, char ***argv_p, struct tc_u32_sel *sel)
+static int parse_selector(int *argc_p, char ***argv_p, struct tc_u32_sel *sel, struct nlmsghdr *n)
 {
        int argc = *argc_p;
        char **argv = *argv_p;
@@ -641,6 +675,12 @@ static int parse_selector(int *argc_p, char ***argv_p, struct tc_u32_sel *sel)
                res = parse_icmp(&argc, &argv, sel);
                goto done;
        }
+       if (matches(*argv, "mark") == 0) {
+               NEXT_ARG();
+               res = parse_mark(&argc, &argv, n);
+               goto done;
+       }
+
        return -1;
 
 done:
@@ -760,7 +800,7 @@ static int u32_parse_opt(struct filter_util *qu, char *handle, int argc, char **
        while (argc > 0) {
                if (matches(*argv, "match") == 0) {
                        NEXT_ARG();
-                       if (parse_selector(&argc, &argv, &sel.sel)) {
+                       if (parse_selector(&argc, &argv, &sel.sel, n)) {
                                fprintf(stderr, "Illegal \"match\"\n");
                                return -1;
                        }
@@ -839,7 +879,7 @@ static int u32_parse_opt(struct filter_util *qu, char *handle, int argc, char **
                                struct tc_u32_key keys[4];
                        } sel2;
                        NEXT_ARG();
-                       if (parse_selector(&argc, &argv, &sel2.sel)) {
+                       if (parse_selector(&argc, &argv, &sel2.sel, n)) {
                                fprintf(stderr, "Illegal \"sample\"\n");
                                return -1;
                        }
@@ -964,11 +1004,22 @@ static int u32_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, __
                pf = RTA_DATA(tb[TCA_U32_PCNT]);
        }
 
+       if (sel && show_stats && NULL != pf)
+               fprintf(f, " (rule hit %llu success %llu)",pf->rcnt,pf->rhit);
+
+       if (tb[TCA_U32_MARK]) {
+               struct tc_u32_mark *mark = RTA_DATA(tb[TCA_U32_MARK]);
+               if (RTA_PAYLOAD(tb[TCA_U32_MARK]) < sizeof(*mark)) {
+                       fprintf(f, "\n  Invalid mark (kernel&iproute2 mismatch)\n");
+               } else {
+                       fprintf(f, "\n  mark 0x%04x 0x%04x (success %d)",
+                               mark->val, mark->mask, mark->success);
+               }
+       }
+
        if (sel) {
                int i;
                struct tc_u32_key *key = sel->keys;
-               if (show_stats && NULL != pf)
-                       fprintf(f, " (rule hit %llu success %llu)",pf->rcnt,pf->rhit);
                if (sel->nkeys) {
                        for (i=0; i<sel->nkeys; i++, key++) {
                                fprintf(f, "\n  match %08x/%08x at %s%d",