]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
rsvp classifier support for multiple actions
authorJamal Hadi Salim <jhs@mojatatu.com>
Sun, 28 Sep 2014 16:49:53 +0000 (12:49 -0400)
committerStephen Hemminger <stephen@networkplumber.org>
Mon, 29 Sep 2014 15:47:33 +0000 (08:47 -0700)
Example setup:

sudo tc qdisc del dev eth0 root handle 1:0 prio
sudo tc qdisc add dev eth0 root handle 1:0 prio

sudo tc filter add dev eth0 pref 10 proto ip parent 1:0 \
rsvp session 10.0.0.1 ipproto icmp \
classid 1:1  \
action police rate 1kbit burst 90k pipe \
action ok

tc -s filter show dev eth0 parent 1:0

filter protocol ip pref 10 rsvp
filter protocol ip pref 10 rsvp fh 0x0001100a flowid 1:1 session
10.0.0.1 ipproto icmp
        action order 1:  police 0x5 rate 1Kbit burst 23440b mtu 2Kb
action pipe overhead 0b
ref 1 bind 1
        Action statistics:
        Sent 98000 bytes 1000 pkt (dropped 0, overlimits 761 requeues 0)
        backlog 0b 0p requeues 0

        action order 2: gact action pass
         random type none pass val 0
         index 2 ref 1 bind 1 installed 60 sec used 3 sec
        Action statistics:
        Sent 74578 bytes 761 pkt (dropped 0, overlimits 0 requeues 0)
        backlog 0b 0p requeues 0

Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
Tested-by: John Fastabend <john.r.fastabend@intel.com>
tc/f_rsvp.c

index 44d3bdfcf780470d7d6cd73890ee890f93b0b31f..14f24b10bf904ccdb41fe732369acf2ced4d36fa 100644 (file)
@@ -261,6 +261,13 @@ static int rsvp_parse_opt(struct filter_util *qu, char *handle, int argc, char *
                        }
                        pinfo.tunnelhdr = tid;
                        pinfo_ok++;
+               } else if (matches(*argv, "action") == 0) {
+                       NEXT_ARG();
+                       if (parse_action(&argc, &argv, TCA_RSVP_ACT, n)) {
+                               fprintf(stderr, "Illegal \"action\"\n");
+                               return -1;
+                       }
+                       continue;
                } else if (matches(*argv, "police") == 0) {
                        NEXT_ARG();
                        if (parse_police(&argc, &argv, TCA_RSVP_POLICE, n)) {
@@ -385,6 +392,10 @@ static int rsvp_print_opt(struct filter_util *qu, FILE *f, struct rtattr *opt, _
                SPRINT_BUF(b2);
                fprintf(f, "sender [NONE]%s ", sprint_spi(&pinfo->spi, 0, b2));
        }
+
+       if (tb[TCA_RSVP_ACT]) {
+               tc_print_action(f, tb[TCA_RSVP_ACT]);
+       }
        if (tb[TCA_RSVP_POLICE])
                tc_print_police(f, tb[TCA_RSVP_POLICE]);
        return 0;