Message ID | 1456147304-13355-6-git-send-email-jhs@emojatatu.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On 02/22/2016 02:21 PM, Jamal Hadi Salim wrote: [...] > Note: as of the time of submission skbedit of queue map doesnt work > (just in case you try to use it) Yep, setting queue mapping doesn't work. ;) > Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com> > --- > net/sched/Kconfig | 5 +++ > net/sched/Makefile | 1 + > net/sched/act_meta_qmap.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++ [...] > +static int __init ifeqmap_init_module(void) > +{ > + pr_emerg("Loaded IFE qmap\n"); pr_emerg() means "system is unusable" ... ;) > + return register_ife_op(&ife_qmap_ops); > +} > + > +static void __exit ifeqmap_cleanup_module(void) > +{ > + pr_emerg("Unloaded IFE qmap\n"); > + unregister_ife_op(&ife_qmap_ops); > +} > + > +module_init(ifeqmap_init_module); > +module_exit(ifeqmap_cleanup_module); > + > +MODULE_AUTHOR("Jamal Hadi Salim(2015)"); > +MODULE_DESCRIPTION("Inter-FE skb qmap metadata action"); > +MODULE_LICENSE("GPL"); > +MODULE_ALIAS_IFE_META(IFE_META_QMAP); >
On 16-02-22 05:21 AM, Jamal Hadi Salim wrote: > From: Jamal Hadi Salim <jhs@mojatatu.com> > > hard code static value of 10 for qmap > mark of 12 > prio of 13 > and hashid of 11 > > sudo tc filter add dev $ETH parent 1: protocol ip prio 10 \ > u32 match ip protocol 1 0xff flowid 1:2 \ > action ife encode \ > type 0xDEAD \ > use mark 12 \ > use prio 13 \ > use hashid 11 \ > use qmap 10 \ > dst 02:15:15:15:15:15 > > Note: as of the time of submission skbedit of queue map doesnt work > (just in case you try to use it) > > Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com> > --- Well the skbedit queue_mapping action does work I'm just guessing it is not working as you expect? We probably haven't done a good job explaining how to set it up. If you set it on the clsact egress filter chain for example it will map traffic to a queue if you disable XPS and get sk_tx_queue() to return -1. This is because XPS and socket mappings have a higher precedence in queue selection. Anyways just tested on net-next and it works, the following puts ip traffic with src 15.0.0.1 on hardware queue 6, ./tc/tc qdisc add dev eth4 clsact ./tc/tc filter add dev eth4 egress protocol ip \ u32 ht 800: order 1 \ match ip src 15.0.0.1/32 \ action skbedit queue_mapping 6 Thanks, .John
On 16-02-22 04:03 PM, John Fastabend wrote: > On 16-02-22 05:21 AM, Jamal Hadi Salim wrote: >> From: Jamal Hadi Salim <jhs@mojatatu.com> >> >> hard code static value of 10 for qmap >> mark of 12 >> prio of 13 >> and hashid of 11 >> >> sudo tc filter add dev $ETH parent 1: protocol ip prio 10 \ >> u32 match ip protocol 1 0xff flowid 1:2 \ >> action ife encode \ >> type 0xDEAD \ >> use mark 12 \ >> use prio 13 \ >> use hashid 11 \ >> use qmap 10 \ >> dst 02:15:15:15:15:15 >> >> Note: as of the time of submission skbedit of queue map doesnt work >> (just in case you try to use it) >> >> Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com> >> --- > > Well the skbedit queue_mapping action does work I'm just guessing it > is not working as you expect? We probably haven't done a good job > explaining how to set it up. > > If you set it on the clsact egress filter chain for example it will > map traffic to a queue if you disable XPS and get sk_tx_queue() to > return -1. This is because XPS and socket mappings have a higher > precedence in queue selection. > Ok, I am going to use your comment in the commit log. When i have time i will test it. > Anyways just tested on net-next and it works, the following > puts ip traffic with src 15.0.0.1 on hardware queue 6, > > ./tc/tc qdisc add dev eth4 clsact > ./tc/tc filter add dev eth4 egress protocol ip \ > u32 ht 800: order 1 \ > match ip src 15.0.0.1/32 \ > action skbedit queue_mapping 6 > I used a asimilar example: sudo tc filter add dev $ETH parent 1: protocol ip prio 10 \ u32 match ip protocol 1 0xff flowid 1:2 \ action skbedit queue_mapping 49 BTW: You didnt have flow/classid in your example rule; weird things could happen when you dont have one (unfortunately we dont check at user space). cheers, jamal
On 16-02-23 04:17 AM, Jamal Hadi Salim wrote: > On 16-02-22 04:03 PM, John Fastabend wrote: >> On 16-02-22 05:21 AM, Jamal Hadi Salim wrote: >>> From: Jamal Hadi Salim <jhs@mojatatu.com> >>> >>> hard code static value of 10 for qmap >>> mark of 12 >>> prio of 13 >>> and hashid of 11 >>> >>> sudo tc filter add dev $ETH parent 1: protocol ip prio 10 \ >>> u32 match ip protocol 1 0xff flowid 1:2 \ >>> action ife encode \ >>> type 0xDEAD \ >>> use mark 12 \ >>> use prio 13 \ >>> use hashid 11 \ >>> use qmap 10 \ >>> dst 02:15:15:15:15:15 >>> >>> Note: as of the time of submission skbedit of queue map doesnt work >>> (just in case you try to use it) >>> >>> Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com> >>> --- >> >> Well the skbedit queue_mapping action does work I'm just guessing it >> is not working as you expect? We probably haven't done a good job >> explaining how to set it up. >> >> If you set it on the clsact egress filter chain for example it will >> map traffic to a queue if you disable XPS and get sk_tx_queue() to >> return -1. This is because XPS and socket mappings have a higher >> precedence in queue selection. >> > > Ok, I am going to use your comment in the commit log. > When i have time i will test it. > >> Anyways just tested on net-next and it works, the following >> puts ip traffic with src 15.0.0.1 on hardware queue 6, >> >> ./tc/tc qdisc add dev eth4 clsact >> ./tc/tc filter add dev eth4 egress protocol ip \ >> u32 ht 800: order 1 \ >> match ip src 15.0.0.1/32 \ >> action skbedit queue_mapping 6 >> > > > > I used a asimilar example: > > sudo tc filter add dev $ETH parent 1: protocol ip prio 10 \ > u32 match ip protocol 1 0xff flowid 1:2 \ > action skbedit queue_mapping 49 ah if its not obvious setting queue_mapping from inside a qdisc has no effect except on multiq because the tx queue has already been selected. Maybe I need to do a man page update. Also please don't use multiq I'm tempted to remove it now that we have mq and mqprio with clsact there is no reason to use it. > > BTW: You didnt have flow/classid in your example rule; > weird things could happen when you dont have one (unfortunately > we dont check at user space). Its safe as far as I can tell on many qdiscs including clsact and ingress. fq_codel is an example of a qdisc where it would break things however. > > cheers, > jamal
diff --git a/net/sched/Kconfig b/net/sched/Kconfig index 4c0c694..c25b192 100644 --- a/net/sched/Kconfig +++ b/net/sched/Kconfig @@ -766,6 +766,11 @@ config NET_IFE_SKBHASH depends on NET_ACT_IFE ---help--- +config NET_IFE_SKBQMAP + tristate "Support to encoding decoding skb queue_map on IFE action" + depends on NET_ACT_IFE + ---help--- + config NET_CLS_IND bool "Incoming device classification" depends on NET_CLS_U32 || NET_CLS_FW diff --git a/net/sched/Makefile b/net/sched/Makefile index 321a9bc..fa97501 100644 --- a/net/sched/Makefile +++ b/net/sched/Makefile @@ -23,6 +23,7 @@ obj-$(CONFIG_NET_ACT_IFE) += act_ife.o obj-$(CONFIG_NET_IFE_SKBMARK) += act_meta_mark.o obj-$(CONFIG_NET_IFE_SKBPRIO) += act_meta_skbprio.o obj-$(CONFIG_NET_IFE_SKBHASH) += act_meta_skbhash.o +obj-$(CONFIG_NET_IFE_SKBQMAP) += act_meta_qmap.o obj-$(CONFIG_NET_SCH_FIFO) += sch_fifo.o obj-$(CONFIG_NET_SCH_CBQ) += sch_cbq.o obj-$(CONFIG_NET_SCH_HTB) += sch_htb.o diff --git a/net/sched/act_meta_qmap.c b/net/sched/act_meta_qmap.c new file mode 100644 index 0000000..e5e8dbe --- /dev/null +++ b/net/sched/act_meta_qmap.c @@ -0,0 +1,100 @@ +/* + * net/sched/act_meta_qmap.c skb queue map encoder/decoder + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + * + * copyright Jamal Hadi Salim (2015) + * +*/ + +#include <linux/types.h> +#include <linux/kernel.h> +#include <linux/string.h> +#include <linux/errno.h> +#include <linux/skbuff.h> +#include <linux/rtnetlink.h> +#include <linux/module.h> +#include <linux/init.h> +#include <net/netlink.h> +#include <net/pkt_sched.h> +#include <uapi/linux/tc_act/tc_ife.h> +#include <net/tc_act/tc_ife.h> +#include <linux/ip.h> /*XXX*/ + +int skbqmap_check(struct sk_buff *skb, struct tcf_meta_info *e) +{ + //XXX: skb_get_queue_mapping()? + u32 ifeqmap = skb->queue_mapping; + + if (e->metaval) { + ifeqmap = *(u32 *)e->metaval; + } + + if (!ifeqmap) + return 0; + /* data + pad + LV = 2+2+4 */ + return 8; +} + +int skbqmap_encode(struct sk_buff *skb, void *skbdata, struct tcf_meta_info *e) +{ + /*(XXX: skb_get_queue_mapping()? */ + u16 ifeqmap = skb->queue_mapping; + + if (e->metaval) { + ifeqmap = *(u16 *)e->metaval; + } + + if (!ifeqmap) + return 0; + + ifeqmap = htons(ifeqmap); + + return tlv_meta_encode(skbdata, e->metaid, 2, &ifeqmap); +} + +int qmap_decode(struct sk_buff *skb, void *data, u16 len) +{ + u16 qm = *(u16 *) data; + + skb->queue_mapping = ntohs(qm); + return 0; +} + +static struct tcf_meta_ops ife_qmap_ops = { + .metaid = IFE_META_QMAP, + .metatype = NLA_U16, + .name = "skbqmap", + .synopsis = "skb queue map 16 bit metadata", + .check_presence = skbqmap_check, + .encode = skbqmap_encode, + .decode = qmap_decode, + .get = get_meta_u16, + .alloc = alloc_meta_u16, + .owner = THIS_MODULE, +}; + +static int __init ifeqmap_init_module(void) +{ + pr_emerg("Loaded IFE qmap\n"); + + return register_ife_op(&ife_qmap_ops); +} + +static void __exit ifeqmap_cleanup_module(void) +{ + pr_emerg("Unloaded IFE qmap\n"); + unregister_ife_op(&ife_qmap_ops); +} + +module_init(ifeqmap_init_module); +module_exit(ifeqmap_cleanup_module); + +MODULE_AUTHOR("Jamal Hadi Salim(2015)"); +MODULE_DESCRIPTION("Inter-FE skb qmap metadata action"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS_IFE_META(IFE_META_QMAP);