From: "Jeff Kirsher" <jeffrey.t.kirsher@intel.com>
To: shemminger@vyatta.com
Cc: netdev@vger.kernel.org,
"Alexander Duyck" <alexander.h.duyck@intel.com>,
"Jeff Kirsher" <jeffrey.t.kirsher@intel.com>,
davem@davemloft.net
Subject: Re: [PATCH 1/2] IPROUTE: add support for skbedit action
Date: Fri, 12 Dec 2008 02:31:41 -0800 [thread overview]
Message-ID: <9929d2390812120231u20161604jd0abf90478112439@mail.gmail.com> (raw)
In-Reply-To: <20081205221609.7949.26787.stgit@gitlost.lost>
On Fri, Dec 5, 2008 at 2:16 PM, Jeff Kirsher
<jeffrey.t.kirsher@intel.com> wrote:
> From: Alexander Duyck <alexander.h.duyck@intel.com>
>
> Add support for skbedit action.
> Provides ability to edit queue_mapping field
> Provides ability to edit priority field
>
> usage: action skbedit [queue_mapping QUEUE_MAPPING] [priority PRIORITY]
> at least one option must be select, or both at the same time
>
> Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
> ---
>
> include/linux/tc_act/tc_skbedit.h | 43 ++++++++
> tc/Makefile | 1
> tc/m_skbedit.c | 192 +++++++++++++++++++++++++++++++++++++
> 3 files changed, 236 insertions(+), 0 deletions(-)
> create mode 100644 include/linux/tc_act/tc_skbedit.h
> create mode 100644 tc/m_skbedit.c
>
> diff --git a/include/linux/tc_act/tc_skbedit.h b/include/linux/tc_act/tc_skbedit.h
> new file mode 100644
> index 0000000..98311f0
> --- /dev/null
> +++ b/include/linux/tc_act/tc_skbedit.h
> @@ -0,0 +1,43 @@
> +/* Copyright (c) 2008, Intel Corporation.
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope it will be useful, but WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along with
> + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
> + * Place - Suite 330, Boston, MA 02111-1307 USA.
> + *
> + * Author: Alexander Duyck <alexander.h.duyck@intel.com>
> + */
> +
> +#ifndef __LINUX_TC_SKBEDIT_H
> +#define __LINUX_TC_SKBEDIT_H
> +
> +#include <linux/pkt_cls.h>
> +
> +#define TCA_ACT_SKBEDIT 11
> +
> +#define SKBEDIT_F_PRIORITY 0x1
> +#define SKBEDIT_F_QUEUE_MAPPING 0x2
> +
> +struct tc_skbedit {
> + tc_gen;
> +};
> +
> +enum {
> + TCA_SKBEDIT_UNSPEC,
> + TCA_SKBEDIT_TM,
> + TCA_SKBEDIT_PARMS,
> + TCA_SKBEDIT_PRIORITY,
> + TCA_SKBEDIT_QUEUE_MAPPING,
> + __TCA_SKBEDIT_MAX
> +};
> +#define TCA_SKBEDIT_MAX (__TCA_SKBEDIT_MAX - 1)
> +
> +#endif
> diff --git a/tc/Makefile b/tc/Makefile
> index a3005e9..2fdfdc8 100644
> --- a/tc/Makefile
> +++ b/tc/Makefile
> @@ -30,6 +30,7 @@ TCMODULES += m_mirred.o
> TCMODULES += m_ipt.o
> TCMODULES += m_nat.o
> TCMODULES += m_pedit.o
> +TCMODULES += m_skbedit.o
> TCMODULES += p_ip.o
> TCMODULES += p_icmp.o
> TCMODULES += p_tcp.o
> diff --git a/tc/m_skbedit.c b/tc/m_skbedit.c
> new file mode 100644
> index 0000000..55e3f89
> --- /dev/null
> +++ b/tc/m_skbedit.c
> @@ -0,0 +1,192 @@
> +/*
> + * m_skbedit.c SKB Editing module
> + *
> + * Copyright (c) 2008, Intel Corporation.
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope it will be useful, but WITHOUT
> + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
> + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
> + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along with
> + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
> + * Place - Suite 330, Boston, MA 02111-1307 USA.
> + *
> + * Authors: Alexander Duyck <alexander.h.duyck@intel.com>
> + *
> + */
> +
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <string.h>
> +#include "utils.h"
> +#include "tc_util.h"
> +#include <linux/tc_act/tc_skbedit.h>
> +
> +static void
> +explain(void)
> +{
> + fprintf(stderr, "Usage: ... skbedit "
> + "queue_mapping QUEUE_MAPPING | priority PRIORITY \n"
> + "QUEUE_MAPPING = device transmit queue to use\n"
> + "PRIORITY = classID to assign to priority field\n");
> +}
> +
> +static void
> +usage(void)
> +{
> + explain();
> + exit(-1);
> +}
> +
> +static int
> +parse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
> + struct nlmsghdr *n)
> +{
> + struct tc_skbedit sel;
> + int argc = *argc_p;
> + char **argv = *argv_p;
> + int ok = 0;
> + struct rtattr *tail;
> + unsigned int tmp;
> + __u16 queue_mapping;
> + __u32 flags = 0, priority;
> +
> + if (matches(*argv, "skbedit") != 0)
> + return -1;
> +
> + NEXT_ARG();
> +
> + while (argc > 0) {
> + if (matches(*argv, "queue_mapping") == 0) {
> + flags |= SKBEDIT_F_QUEUE_MAPPING;
> + NEXT_ARG();
> + if (get_unsigned(&tmp, *argv, 10) || tmp > 65535) {
> + fprintf(stderr, "Illegal queue_mapping\n");
> + return -1;
> + }
> + queue_mapping = tmp;
> + ok++;
> + } else if (matches(*argv, "priority") == 0) {
> + flags |= SKBEDIT_F_PRIORITY;
> + NEXT_ARG();
> + if (get_tc_classid(&priority, *argv)) {
> + fprintf(stderr, "Illegal priority\n");
> + return -1;
> + }
> + ok++;
> + } else if (matches(*argv, "help") == 0) {
> + usage();
> + } else {
> + break;
> + }
> + argc--;
> + argv++;
> + }
> +
> + if (argc) {
> + if (matches(*argv, "reclassify") == 0) {
> + sel.action = TC_ACT_RECLASSIFY;
> + NEXT_ARG();
> + } else if (matches(*argv, "pipe") == 0) {
> + sel.action = TC_ACT_PIPE;
> + NEXT_ARG();
> + } else if (matches(*argv, "drop") == 0 ||
> + matches(*argv, "shot") == 0) {
> + sel.action = TC_ACT_SHOT;
> + NEXT_ARG();
> + } else if (matches(*argv, "continue") == 0) {
> + sel.action = TC_ACT_UNSPEC;
> + NEXT_ARG();
> + } else if (matches(*argv, "pass") == 0) {
> + sel.action = TC_ACT_OK;
> + NEXT_ARG();
> + }
> + }
> +
> + if (argc) {
> + if (matches(*argv, "index") == 0) {
> + NEXT_ARG();
> + if (get_u32(&sel.index, *argv, 10)) {
> + fprintf(stderr, "Pedit: Illegal \"index\"\n");
> + return -1;
> + }
> + argc--;
> + argv++;
> + ok++;
> + }
> + }
> +
> + if (!ok) {
> + explain();
> + return -1;
> + }
> +
> +
> + tail = NLMSG_TAIL(n);
> + addattr_l(n, MAX_MSG, tca_id, NULL, 0);
> + addattr_l(n, MAX_MSG, TCA_SKBEDIT_PARMS, &sel, sizeof(sel));
> + if (flags & SKBEDIT_F_QUEUE_MAPPING)
> + addattr_l(n, MAX_MSG, TCA_SKBEDIT_QUEUE_MAPPING,
> + &queue_mapping, sizeof(queue_mapping));
> + if (flags & SKBEDIT_F_PRIORITY)
> + addattr_l(n, MAX_MSG, TCA_SKBEDIT_PRIORITY,
> + &priority, sizeof(priority));
> + tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
> +
> + *argc_p = argc;
> + *argv_p = argv;
> + return 0;
> +}
> +
> +static int print_skbedit(struct action_util *au, FILE *f, struct rtattr *arg)
> +{
> + struct tc_skbedit *sel;
> + struct rtattr *tb[TCA_SKBEDIT_MAX + 1];
> + SPRINT_BUF(b1);
> + __u32 *priority;
> + __u16 *queue_mapping;
> +
> + if (arg == NULL)
> + return -1;
> +
> + parse_rtattr_nested(tb, TCA_SKBEDIT_MAX, arg);
> +
> + if (tb[TCA_SKBEDIT_PARMS] == NULL) {
> + fprintf(f, "[NULL skbedit parameters]");
> + return -1;
> + }
> +
> + sel = RTA_DATA(tb[TCA_SKBEDIT_PARMS]);
> +
> + fprintf(f, " skbedit");
> +
> + if (tb[TCA_SKBEDIT_QUEUE_MAPPING] != NULL) {
> + queue_mapping = RTA_DATA(tb[TCA_SKBEDIT_QUEUE_MAPPING]);
> + fprintf(f, " queue_mapping %u", *queue_mapping);
> + }
> + if (tb[TCA_SKBEDIT_PRIORITY] != NULL) {
> + priority = RTA_DATA(tb[TCA_SKBEDIT_PRIORITY]);
> + fprintf(f, " priority %s", sprint_tc_classid(*priority, b1));
> + }
> +
> + if (show_stats) {
> + if (tb[TCA_SKBEDIT_TM]) {
> + struct tcf_t *tm = RTA_DATA(tb[TCA_SKBEDIT_TM]);
> + print_tm(f, tm);
> + }
> + }
> +
> + return 0;
> +}
> +
> +struct action_util skbedit_action_util = {
> + .id = "skbedit",
> + .parse_aopt = parse_skbedit,
> + .print_aopt = print_skbedit,
> +};
>
> --
>
What is the status of this series of patches? Stephen?
--
Cheers,
Jeff
next prev parent reply other threads:[~2008-12-12 10:31 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-05 22:16 [PATCH 1/2] IPROUTE: add support for skbedit action Jeff Kirsher
2008-12-05 22:16 ` [PATCH 2/2] IPROUTE: add support for multiq qdisc Jeff Kirsher
2008-12-12 10:31 ` Jeff Kirsher [this message]
2008-12-12 18:44 ` [PATCH 1/2] IPROUTE: add support for skbedit action Stephen Hemminger
2009-01-07 3:30 ` Stephen Hemminger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9929d2390812120231u20161604jd0abf90478112439@mail.gmail.com \
--to=jeffrey.t.kirsher@intel.com \
--cc=alexander.h.duyck@intel.com \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
--cc=shemminger@vyatta.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).