mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-30 21:44:27 -04:00 
			
		
		
		
	kernel: act_ctinfo: update backport
Since the original backports from kernel 5.3 a few things have been tweaked by kernel bumps & other upstream changes. Update the backport to reflect upstream as closely as possible and remove the bitrot. Functions remain the same, error reporting improved. Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
This commit is contained in:
		
							parent
							
								
									f6385f30bd
								
							
						
					
					
						commit
						1d608a10a0
					
				| @ -1,47 +1,110 @@ | |||||||
| From e3777dd42dc6f1b9cb099836707a3e7971dcf4df Mon Sep 17 00:00:00 2001 | From a06ece503d941eefa92ba48dc981ccaa4093330b Mon Sep 17 00:00:00 2001 | ||||||
| From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | ||||||
| Date: Wed, 13 Mar 2019 20:54:49 +0000 | Date: Wed, 13 Mar 2019 20:54:49 +0000 | ||||||
| Subject: [PATCH] net: sched: Introduce act_ctinfo action | Subject: [PATCH] net: sched: Backport Introduce act_ctinfo action | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
| 
 | 
 | ||||||
| ctinfo is a new tc filter action module.  It is designed to restore DSCPs | ctinfo is a new tc filter action module.  It is designed to restore | ||||||
| stored in conntrack marks | information contained in firewall conntrack marks to other packet fields | ||||||
|  | and is typically used on packet ingress paths.  At present it has two | ||||||
|  | independent sub-functions or operating modes, DSCP restoration mode & | ||||||
|  | skb mark restoration mode. | ||||||
| 
 | 
 | ||||||
| The feature is intended for use and has been found useful for restoring | The DSCP restore mode: | ||||||
| ingress classifications based on egress classifications across links | 
 | ||||||
| that bleach or otherwise change DSCP, typically home ISP Internet links. | This mode copies DSCP values that have been placed in the firewall | ||||||
| Restoring DSCP on ingress on the WAN link allows qdiscs such as CAKE to | conntrack mark back into the IPv4/v6 diffserv fields of relevant | ||||||
| shape inbound packets according to policies that are easier to implement | packets. | ||||||
| on egress. | 
 | ||||||
|  | The DSCP restoration is intended for use and has been found useful for | ||||||
|  | restoring ingress classifications based on egress classifications across | ||||||
|  | links that bleach or otherwise change DSCP, typically home ISP Internet | ||||||
|  | links.  Restoring DSCP on ingress on the WAN link allows qdiscs such as | ||||||
|  | but by no means limited to CAKE to shape inbound packets according to | ||||||
|  | policies that are easier to set & mark on egress. | ||||||
| 
 | 
 | ||||||
| Ingress classification is traditionally a challenging task since | Ingress classification is traditionally a challenging task since | ||||||
| iptables rules haven't yet run and tc filter/eBPF programs are pre-NAT | iptables rules haven't yet run and tc filter/eBPF programs are pre-NAT | ||||||
| lookups, hence are unable to see internal IPv4 addresses as used on the | lookups, hence are unable to see internal IPv4 addresses as used on the | ||||||
| typical home masquerading gateway. | typical home masquerading gateway.  Thus marking the connection in some | ||||||
|  | manner on egress for later restoration of classification on ingress is | ||||||
|  | easier to implement. | ||||||
| 
 | 
 | ||||||
| ctinfo understands the following parameters: | Parameters related to DSCP restore mode: | ||||||
| 
 | 
 | ||||||
| dscp mask[/statemask] | dscpmask - a 32 bit mask of 6 contiguous bits and indicate bits of the | ||||||
| 
 | conntrack mark field contain the DSCP value to be restored. | ||||||
| mask - a 32 bit mask of at least 6 contiguous bits where conndscp will |  | ||||||
| place the DSCP in conntrack mark.  The DSCP is left-shifted by the |  | ||||||
| number of unset lower bits of the mask before storing into the mark |  | ||||||
| field. |  | ||||||
| 
 | 
 | ||||||
| statemask - a 32 bit mask of (usually) 1 bit length, outside the area | statemask - a 32 bit mask of (usually) 1 bit length, outside the area | ||||||
| specified by mask.  This represents a conditional operation flag the | specified by dscpmask.  This represents a conditional operation flag | ||||||
| DSCP is only restored if the flag is set.  This is useful to implement a | whereby the DSCP is only restored if the flag is set.  This is useful to | ||||||
| 'one shot' iptables based classification where the 'complicated' | implement a 'one shot' iptables based classification where the | ||||||
| iptables rules are only run once to classify the connection on initial | 'complicated' iptables rules are only run once to classify the | ||||||
| (egress) packet and subsequent packets are all marked/restored with the | connection on initial (egress) packet and subsequent packets are all | ||||||
| same DSCP.  A mask of zero disables the conditional behaviour. | marked/restored with the same DSCP.  A mask of zero disables the | ||||||
|  | conditional behaviour ie. the conntrack mark DSCP bits are always | ||||||
|  | restored to the ip diffserv field (assuming the conntrack entry is found | ||||||
|  | & the skb is an ipv4/ipv6 type) | ||||||
| 
 | 
 | ||||||
| optional parameters: | e.g. dscpmask 0xfc000000 statemask 0x01000000 | ||||||
|  | 
 | ||||||
|  | |----0xFC----conntrack mark----000000---| | ||||||
|  | | Bits 31-26 | bit 25 | bit24 |~~~ Bit 0| | ||||||
|  | | DSCP       | unused | flag  |unused   | | ||||||
|  | |-----------------------0x01---000000---| | ||||||
|  |       |                   | | ||||||
|  |       |                   | | ||||||
|  |       ---|             Conditional flag | ||||||
|  |          v             only restore if set | ||||||
|  | |-ip diffserv-| | ||||||
|  | | 6 bits      | | ||||||
|  | |-------------| | ||||||
|  | 
 | ||||||
|  | The skb mark restore mode (cpmark): | ||||||
|  | 
 | ||||||
|  | This mode copies the firewall conntrack mark to the skb's mark field. | ||||||
|  | It is completely the functional equivalent of the existing act_connmark | ||||||
|  | action with the additional feature of being able to apply a mask to the | ||||||
|  | restored value. | ||||||
|  | 
 | ||||||
|  | Parameters related to skb mark restore mode: | ||||||
|  | 
 | ||||||
|  | mask - a 32 bit mask applied to the firewall conntrack mark to mask out | ||||||
|  | bits unwanted for restoration.  This can be useful where the conntrack | ||||||
|  | mark is being used for different purposes by different applications.  If | ||||||
|  | not specified and by default the whole mark field is copied (i.e. | ||||||
|  | default mask of 0xffffffff) | ||||||
|  | 
 | ||||||
|  | e.g. mask 0x00ffffff to mask out the top 8 bits being used by the | ||||||
|  | aforementioned DSCP restore mode. | ||||||
|  | 
 | ||||||
|  | |----0x00----conntrack mark----ffffff---| | ||||||
|  | | Bits 31-24 |                          | | ||||||
|  | | DSCP & flag|      some value here     | | ||||||
|  | |---------------------------------------| | ||||||
|  | 			| | ||||||
|  | 			| | ||||||
|  | 			v | ||||||
|  | |------------skb mark-------------------| | ||||||
|  | |            |                          | | ||||||
|  | |  zeroed    |                          | | ||||||
|  | |---------------------------------------| | ||||||
|  | 
 | ||||||
|  | Overall parameters: | ||||||
| 
 | 
 | ||||||
| zone - conntrack zone | zone - conntrack zone | ||||||
| 
 | 
 | ||||||
| control - action related control (reclassify | pipe | drop | continue | | control - action related control (reclassify | pipe | drop | continue | | ||||||
| ok | goto chain <CHAIN_INDEX> | ok | goto chain <CHAIN_INDEX>) | ||||||
| 
 | 
 | ||||||
|  | Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | ||||||
|  | Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com> | ||||||
|  | Acked-by: Cong Wang <xiyou.wangcong@gmail.com> | ||||||
|  | Signed-off-by: David S. Miller <davem@davemloft.net> | ||||||
|  | 
 | ||||||
|  | Backport | ||||||
| Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | ||||||
| ---
 | ---
 | ||||||
|  include/net/tc_act/tc_ctinfo.h        |  33 +++ |  include/net/tc_act/tc_ctinfo.h        |  33 +++ | ||||||
| @ -49,8 +112,8 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | |||||||
|  include/uapi/linux/tc_act/tc_ctinfo.h |  29 ++ |  include/uapi/linux/tc_act/tc_ctinfo.h |  29 ++ | ||||||
|  net/sched/Kconfig                     |  13 + |  net/sched/Kconfig                     |  13 + | ||||||
|  net/sched/Makefile                    |   1 + |  net/sched/Makefile                    |   1 + | ||||||
|  net/sched/act_ctinfo.c                | 394 ++++++++++++++++++++++++++ |  net/sched/act_ctinfo.c                | 407 ++++++++++++++++++++++++++ | ||||||
|  6 files changed, 472 insertions(+), 1 deletion(-) |  6 files changed, 485 insertions(+), 1 deletion(-) | ||||||
|  create mode 100644 include/net/tc_act/tc_ctinfo.h |  create mode 100644 include/net/tc_act/tc_ctinfo.h | ||||||
|  create mode 100644 include/uapi/linux/tc_act/tc_ctinfo.h |  create mode 100644 include/uapi/linux/tc_act/tc_ctinfo.h | ||||||
|  create mode 100644 net/sched/act_ctinfo.c |  create mode 100644 net/sched/act_ctinfo.c | ||||||
| @ -169,7 +232,7 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | |||||||
|  obj-$(CONFIG_NET_IFE_SKBMARK)	+= act_meta_mark.o |  obj-$(CONFIG_NET_IFE_SKBMARK)	+= act_meta_mark.o | ||||||
| --- /dev/null
 | --- /dev/null
 | ||||||
| +++ b/net/sched/act_ctinfo.c
 | +++ b/net/sched/act_ctinfo.c
 | ||||||
| @@ -0,0 +1,394 @@
 | @@ -0,0 +1,407 @@
 | ||||||
| +// SPDX-License-Identifier: GPL-2.0+
 | +// SPDX-License-Identifier: GPL-2.0+
 | ||||||
| +/* net/sched/act_ctinfo.c  netfilter ctinfo connmark actions
 | +/* net/sched/act_ctinfo.c  netfilter ctinfo connmark actions
 | ||||||
| + *
 | + *
 | ||||||
| @ -337,15 +400,20 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | |||||||
| +	u8 dscpmaskshift;
 | +	u8 dscpmaskshift;
 | ||||||
| +	int ret = 0, err;
 | +	int ret = 0, err;
 | ||||||
| +
 | +
 | ||||||
| +	if (!nla)
 | +	if (!nla) {
 | ||||||
|  | +		NL_SET_ERR_MSG_MOD(extack, "ctinfo requires attributes to be passed");
 | ||||||
| +		return -EINVAL;
 | +		return -EINVAL;
 | ||||||
|  | +	}
 | ||||||
| +
 | +
 | ||||||
| +	err = nla_parse_nested(tb, TCA_CTINFO_MAX, nla, ctinfo_policy, NULL);
 | +	err = nla_parse_nested(tb, TCA_CTINFO_MAX, nla, ctinfo_policy, NULL);
 | ||||||
| +	if (err < 0)
 | +	if (err < 0)
 | ||||||
| +		return err;
 | +		return err;
 | ||||||
| +
 | +
 | ||||||
| +	if (!tb[TCA_CTINFO_ACT])
 | +	if (!tb[TCA_CTINFO_ACT]) {
 | ||||||
|  | +		NL_SET_ERR_MSG_MOD(extack,
 | ||||||
|  | +				   "Missing required TCA_CTINFO_ACT attribute");
 | ||||||
| +		return -EINVAL;
 | +		return -EINVAL;
 | ||||||
|  | +	}
 | ||||||
| +	actparm = nla_data(tb[TCA_CTINFO_ACT]);
 | +	actparm = nla_data(tb[TCA_CTINFO_ACT]);
 | ||||||
| +
 | +
 | ||||||
| +	/* do some basic validation here before dynamically allocating things */
 | +	/* do some basic validation here before dynamically allocating things */
 | ||||||
| @ -354,14 +422,22 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | |||||||
| +		dscpmask = nla_get_u32(tb[TCA_CTINFO_PARMS_DSCP_MASK]);
 | +		dscpmask = nla_get_u32(tb[TCA_CTINFO_PARMS_DSCP_MASK]);
 | ||||||
| +		/* need contiguous 6 bit mask */
 | +		/* need contiguous 6 bit mask */
 | ||||||
| +		dscpmaskshift = dscpmask ? __ffs(dscpmask) : 0;
 | +		dscpmaskshift = dscpmask ? __ffs(dscpmask) : 0;
 | ||||||
| +		if ((~0 & (dscpmask >> dscpmaskshift)) != 0x3f)
 | +		if ((~0 & (dscpmask >> dscpmaskshift)) != 0x3f) {
 | ||||||
|  | +			NL_SET_ERR_MSG_ATTR(extack,
 | ||||||
|  | +					    tb[TCA_CTINFO_PARMS_DSCP_MASK],
 | ||||||
|  | +					    "dscp mask must be 6 contiguous bits");
 | ||||||
| +			return -EINVAL;
 | +			return -EINVAL;
 | ||||||
|  | +		}
 | ||||||
| +		dscpstatemask = tb[TCA_CTINFO_PARMS_DSCP_STATEMASK] ?
 | +		dscpstatemask = tb[TCA_CTINFO_PARMS_DSCP_STATEMASK] ?
 | ||||||
| +			nla_get_u32(tb[TCA_CTINFO_PARMS_DSCP_STATEMASK]) : 0;
 | +			nla_get_u32(tb[TCA_CTINFO_PARMS_DSCP_STATEMASK]) : 0;
 | ||||||
| +		/* mask & statemask must not overlap */
 | +		/* mask & statemask must not overlap */
 | ||||||
| +		if (dscpmask & dscpstatemask)
 | +		if (dscpmask & dscpstatemask) {
 | ||||||
|  | +			NL_SET_ERR_MSG_ATTR(extack,
 | ||||||
|  | +					    tb[TCA_CTINFO_PARMS_DSCP_STATEMASK],
 | ||||||
|  | +					    "dscp statemask must not overlap dscp mask");
 | ||||||
| +			return -EINVAL;
 | +			return -EINVAL;
 | ||||||
| +		}
 | +		}
 | ||||||
|  | +	}
 | ||||||
| +	/* done the validation:now to the actual action allocation */
 | +	/* done the validation:now to the actual action allocation */
 | ||||||
| +	err = tcf_idr_check(tn, actparm->index, a, bind);
 | +	err = tcf_idr_check(tn, actparm->index, a, bind);
 | ||||||
| +	if (!err) {
 | +	if (!err) {
 | ||||||
|  | |||||||
| @ -1,29 +1,41 @@ | |||||||
| From c17877e414155b9b97d10416ff62b102d25019a1 Mon Sep 17 00:00:00 2001 | From 6d8071bbbdcd9d3a2fbb49e55b51617906e3b816 Mon Sep 17 00:00:00 2001 | ||||||
| From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | ||||||
| Date: Wed, 13 Mar 2019 20:54:49 +0000 | Date: Wed, 13 Mar 2019 20:54:49 +0000 | ||||||
| Subject: [PATCH] net: sched: Introduce act_ctinfo action | Subject: [PATCH] net: sched: Backport Introduce act_ctinfo action | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
| 
 | 
 | ||||||
| ctinfo is a new tc filter action module.  It is designed to restore DSCPs | ctinfo is a new tc filter action module.  It is designed to restore | ||||||
| stored in conntrack marks into the ipv4/v6 diffserv field. | information contained in firewall conntrack marks to other packet fields | ||||||
|  | and is typically used on packet ingress paths.  At present it has two | ||||||
|  | independent sub-functions or operating modes, DSCP restoration mode & | ||||||
|  | skb mark restoration mode. | ||||||
| 
 | 
 | ||||||
| The feature is intended for use and has been found useful for restoring | The DSCP restore mode: | ||||||
| ingress classifications based on egress classifications across links | 
 | ||||||
| that bleach or otherwise change DSCP, typically home ISP Internet links. | This mode copies DSCP values that have been placed in the firewall | ||||||
| Restoring DSCP on ingress on the WAN link allows qdiscs such as CAKE to | conntrack mark back into the IPv4/v6 diffserv fields of relevant | ||||||
| shape inbound packets according to policies that are easier to indicate | packets. | ||||||
| on egress. | 
 | ||||||
|  | The DSCP restoration is intended for use and has been found useful for | ||||||
|  | restoring ingress classifications based on egress classifications across | ||||||
|  | links that bleach or otherwise change DSCP, typically home ISP Internet | ||||||
|  | links.  Restoring DSCP on ingress on the WAN link allows qdiscs such as | ||||||
|  | but by no means limited to CAKE to shape inbound packets according to | ||||||
|  | policies that are easier to set & mark on egress. | ||||||
| 
 | 
 | ||||||
| Ingress classification is traditionally a challenging task since | Ingress classification is traditionally a challenging task since | ||||||
| iptables rules haven't yet run and tc filter/eBPF programs are pre-NAT | iptables rules haven't yet run and tc filter/eBPF programs are pre-NAT | ||||||
| lookups, hence are unable to see internal IPv4 addresses as used on the | lookups, hence are unable to see internal IPv4 addresses as used on the | ||||||
| typical home masquerading gateway. | typical home masquerading gateway.  Thus marking the connection in some | ||||||
|  | manner on egress for later restoration of classification on ingress is | ||||||
|  | easier to implement. | ||||||
| 
 | 
 | ||||||
| ctinfo understands the following parameters: | Parameters related to DSCP restore mode: | ||||||
| 
 | 
 | ||||||
| dscp dscpmask[/statemask] | dscpmask - a 32 bit mask of 6 contiguous bits and indicate bits of the | ||||||
| 
 | conntrack mark field contain the DSCP value to be restored. | ||||||
| dscpmask - a 32 bit mask of at least 6 contiguous bits and indicates |  | ||||||
| where ctinfo will find the DSCP bits stored in the conntrack mark. |  | ||||||
| 
 | 
 | ||||||
| statemask - a 32 bit mask of (usually) 1 bit length, outside the area | statemask - a 32 bit mask of (usually) 1 bit length, outside the area | ||||||
| specified by dscpmask.  This represents a conditional operation flag | specified by dscpmask.  This represents a conditional operation flag | ||||||
| @ -36,14 +48,7 @@ conditional behaviour ie. the conntrack mark DSCP bits are always | |||||||
| restored to the ip diffserv field (assuming the conntrack entry is found | restored to the ip diffserv field (assuming the conntrack entry is found | ||||||
| & the skb is an ipv4/ipv6 type) | & the skb is an ipv4/ipv6 type) | ||||||
| 
 | 
 | ||||||
| optional parameters: | e.g. dscpmask 0xfc000000 statemask 0x01000000 | ||||||
| 
 |  | ||||||
| zone - conntrack zone |  | ||||||
| 
 |  | ||||||
| control - action related control (reclassify | pipe | drop | continue | |  | ||||||
| ok | goto chain <CHAIN_INDEX>) |  | ||||||
| 
 |  | ||||||
| e.g. dscp 0xfc000000/0x01000000 |  | ||||||
| 
 | 
 | ||||||
| |----0xFC----conntrack mark----000000---| | |----0xFC----conntrack mark----000000---| | ||||||
| | Bits 31-26 | bit 25 | bit24 |~~~ Bit 0| | | Bits 31-26 | bit 25 | bit24 |~~~ Bit 0| | ||||||
| @ -57,6 +62,49 @@ e.g. dscp 0xfc000000/0x01000000 | |||||||
| | 6 bits      | | | 6 bits      | | ||||||
| |-------------| | |-------------| | ||||||
| 
 | 
 | ||||||
|  | The skb mark restore mode (cpmark): | ||||||
|  | 
 | ||||||
|  | This mode copies the firewall conntrack mark to the skb's mark field. | ||||||
|  | It is completely the functional equivalent of the existing act_connmark | ||||||
|  | action with the additional feature of being able to apply a mask to the | ||||||
|  | restored value. | ||||||
|  | 
 | ||||||
|  | Parameters related to skb mark restore mode: | ||||||
|  | 
 | ||||||
|  | mask - a 32 bit mask applied to the firewall conntrack mark to mask out | ||||||
|  | bits unwanted for restoration.  This can be useful where the conntrack | ||||||
|  | mark is being used for different purposes by different applications.  If | ||||||
|  | not specified and by default the whole mark field is copied (i.e. | ||||||
|  | default mask of 0xffffffff) | ||||||
|  | 
 | ||||||
|  | e.g. mask 0x00ffffff to mask out the top 8 bits being used by the | ||||||
|  | aforementioned DSCP restore mode. | ||||||
|  | 
 | ||||||
|  | |----0x00----conntrack mark----ffffff---| | ||||||
|  | | Bits 31-24 |                          | | ||||||
|  | | DSCP & flag|      some value here     | | ||||||
|  | |---------------------------------------| | ||||||
|  | 			| | ||||||
|  | 			| | ||||||
|  | 			v | ||||||
|  | |------------skb mark-------------------| | ||||||
|  | |            |                          | | ||||||
|  | |  zeroed    |                          | | ||||||
|  | |---------------------------------------| | ||||||
|  | 
 | ||||||
|  | Overall parameters: | ||||||
|  | 
 | ||||||
|  | zone - conntrack zone | ||||||
|  | 
 | ||||||
|  | control - action related control (reclassify | pipe | drop | continue | | ||||||
|  | ok | goto chain <CHAIN_INDEX>) | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | ||||||
|  | Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com> | ||||||
|  | Acked-by: Cong Wang <xiyou.wangcong@gmail.com> | ||||||
|  | Signed-off-by: David S. Miller <davem@davemloft.net> | ||||||
|  | 
 | ||||||
|  | Backport | ||||||
| Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | ||||||
| ---
 | ---
 | ||||||
|  include/net/tc_act/tc_ctinfo.h            |  33 ++ |  include/net/tc_act/tc_ctinfo.h            |  33 ++ | ||||||
| @ -64,9 +112,9 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | |||||||
|  include/uapi/linux/tc_act/tc_ctinfo.h     |  29 ++ |  include/uapi/linux/tc_act/tc_ctinfo.h     |  29 ++ | ||||||
|  net/sched/Kconfig                         |  17 + |  net/sched/Kconfig                         |  17 + | ||||||
|  net/sched/Makefile                        |   1 + |  net/sched/Makefile                        |   1 + | ||||||
|  net/sched/act_ctinfo.c                    | 395 ++++++++++++++++++++++ |  net/sched/act_ctinfo.c                    | 409 ++++++++++++++++++++++ | ||||||
|  tools/testing/selftests/tc-testing/config |   1 + |  tools/testing/selftests/tc-testing/config |   1 + | ||||||
|  7 files changed, 478 insertions(+), 1 deletion(-) |  7 files changed, 492 insertions(+), 1 deletion(-) | ||||||
|  create mode 100644 include/net/tc_act/tc_ctinfo.h |  create mode 100644 include/net/tc_act/tc_ctinfo.h | ||||||
|  create mode 100644 include/uapi/linux/tc_act/tc_ctinfo.h |  create mode 100644 include/uapi/linux/tc_act/tc_ctinfo.h | ||||||
|  create mode 100644 net/sched/act_ctinfo.c |  create mode 100644 net/sched/act_ctinfo.c | ||||||
| @ -189,7 +237,7 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | |||||||
|  obj-$(CONFIG_NET_IFE_SKBMARK)	+= act_meta_mark.o |  obj-$(CONFIG_NET_IFE_SKBMARK)	+= act_meta_mark.o | ||||||
| --- /dev/null
 | --- /dev/null
 | ||||||
| +++ b/net/sched/act_ctinfo.c
 | +++ b/net/sched/act_ctinfo.c
 | ||||||
| @@ -0,0 +1,395 @@
 | @@ -0,0 +1,409 @@
 | ||||||
| +// SPDX-License-Identifier: GPL-2.0+
 | +// SPDX-License-Identifier: GPL-2.0+
 | ||||||
| +/* net/sched/act_ctinfo.c  netfilter ctinfo connmark actions
 | +/* net/sched/act_ctinfo.c  netfilter ctinfo connmark actions
 | ||||||
| + *
 | + *
 | ||||||
| @ -347,24 +395,29 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | |||||||
| +			   struct netlink_ext_ack *extack)
 | +			   struct netlink_ext_ack *extack)
 | ||||||
| +{
 | +{
 | ||||||
| +	struct tc_action_net *tn = net_generic(net, ctinfo_net_id);
 | +	struct tc_action_net *tn = net_generic(net, ctinfo_net_id);
 | ||||||
|  | +	u32 dscpmask = 0, dscpstatemask, index;
 | ||||||
| +	struct nlattr *tb[TCA_CTINFO_MAX + 1];
 | +	struct nlattr *tb[TCA_CTINFO_MAX + 1];
 | ||||||
| +	struct tcf_ctinfo_params *cp_new;
 | +	struct tcf_ctinfo_params *cp_new;
 | ||||||
| +/*	struct tcf_chain *goto_ch = NULL; */
 | +/*	struct tcf_chain *goto_ch = NULL; */
 | ||||||
| +	u32 dscpmask = 0, dscpstatemask;
 |  | ||||||
| +	struct tc_ctinfo *actparm;
 | +	struct tc_ctinfo *actparm;
 | ||||||
| +	struct tcf_ctinfo *ci;
 | +	struct tcf_ctinfo *ci;
 | ||||||
| +	u8 dscpmaskshift;
 | +	u8 dscpmaskshift;
 | ||||||
| +	int ret = 0, err;
 | +	int ret = 0, err;
 | ||||||
| +
 | +
 | ||||||
| +	if (!nla)
 | +	if (!nla) {
 | ||||||
|  | +		NL_SET_ERR_MSG_MOD(extack, "ctinfo requires attributes to be passed");
 | ||||||
| +		return -EINVAL;
 | +		return -EINVAL;
 | ||||||
|  | +	}
 | ||||||
| +
 | +
 | ||||||
| +	err = nla_parse_nested(tb, TCA_CTINFO_MAX, nla, ctinfo_policy, NULL);
 | +	err = nla_parse_nested(tb, TCA_CTINFO_MAX, nla, ctinfo_policy, extack);
 | ||||||
| +	if (err < 0)
 | +	if (err < 0)
 | ||||||
| +		return err;
 | +		return err;
 | ||||||
| +
 | +
 | ||||||
| +	if (!tb[TCA_CTINFO_ACT])
 | +	if (!tb[TCA_CTINFO_ACT]) {
 | ||||||
|  | +		NL_SET_ERR_MSG_MOD(extack,
 | ||||||
|  | +				   "Missing required TCA_CTINFO_ACT attribute");
 | ||||||
| +		return -EINVAL;
 | +		return -EINVAL;
 | ||||||
|  | +	}
 | ||||||
| +	actparm = nla_data(tb[TCA_CTINFO_ACT]);
 | +	actparm = nla_data(tb[TCA_CTINFO_ACT]);
 | ||||||
| +
 | +
 | ||||||
| +	/* do some basic validation here before dynamically allocating things */
 | +	/* do some basic validation here before dynamically allocating things */
 | ||||||
| @ -373,22 +426,31 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | |||||||
| +		dscpmask = nla_get_u32(tb[TCA_CTINFO_PARMS_DSCP_MASK]);
 | +		dscpmask = nla_get_u32(tb[TCA_CTINFO_PARMS_DSCP_MASK]);
 | ||||||
| +		/* need contiguous 6 bit mask */
 | +		/* need contiguous 6 bit mask */
 | ||||||
| +		dscpmaskshift = dscpmask ? __ffs(dscpmask) : 0;
 | +		dscpmaskshift = dscpmask ? __ffs(dscpmask) : 0;
 | ||||||
| +		if ((~0 & (dscpmask >> dscpmaskshift)) != 0x3f)
 | +		if ((~0 & (dscpmask >> dscpmaskshift)) != 0x3f) {
 | ||||||
|  | +			NL_SET_ERR_MSG_ATTR(extack,
 | ||||||
|  | +					    tb[TCA_CTINFO_PARMS_DSCP_MASK],
 | ||||||
|  | +					    "dscp mask must be 6 contiguous bits");
 | ||||||
| +			return -EINVAL;
 | +			return -EINVAL;
 | ||||||
|  | +		}
 | ||||||
| +		dscpstatemask = tb[TCA_CTINFO_PARMS_DSCP_STATEMASK] ?
 | +		dscpstatemask = tb[TCA_CTINFO_PARMS_DSCP_STATEMASK] ?
 | ||||||
| +			nla_get_u32(tb[TCA_CTINFO_PARMS_DSCP_STATEMASK]) : 0;
 | +			nla_get_u32(tb[TCA_CTINFO_PARMS_DSCP_STATEMASK]) : 0;
 | ||||||
| +		/* mask & statemask must not overlap */
 | +		/* mask & statemask must not overlap */
 | ||||||
| +		if (dscpmask & dscpstatemask)
 | +		if (dscpmask & dscpstatemask) {
 | ||||||
|  | +			NL_SET_ERR_MSG_ATTR(extack,
 | ||||||
|  | +					    tb[TCA_CTINFO_PARMS_DSCP_STATEMASK],
 | ||||||
|  | +					    "dscp statemask must not overlap dscp mask");
 | ||||||
| +			return -EINVAL;
 | +			return -EINVAL;
 | ||||||
| +		}
 | +		}
 | ||||||
|  | +	}
 | ||||||
| +
 | +
 | ||||||
| +	/* done the validation:now to the actual action allocation */
 | +	/* done the validation:now to the actual action allocation */
 | ||||||
| +	err = tcf_idr_check_alloc(tn, &actparm->index, a, bind);
 | +	index = actparm->index;
 | ||||||
|  | +	err = tcf_idr_check_alloc(tn, &index, a, bind);
 | ||||||
| +	if (!err) {
 | +	if (!err) {
 | ||||||
| +		ret = tcf_idr_create(tn, actparm->index, est, a,
 | +		ret = tcf_idr_create(tn, index, est, a,
 | ||||||
| +				     &act_ctinfo_ops, bind, false);
 | +				     &act_ctinfo_ops, bind, false);
 | ||||||
| +		if (ret) {
 | +		if (ret) {
 | ||||||
| +			tcf_idr_cleanup(tn, actparm->index);
 | +			tcf_idr_cleanup(tn, index);
 | ||||||
| +			return ret;
 | +			return ret;
 | ||||||
| +		}
 | +		}
 | ||||||
| +		ret = ACT_P_CREATED;
 | +		ret = ACT_P_CREATED;
 | ||||||
| @ -587,11 +649,11 @@ Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | |||||||
| +MODULE_LICENSE("GPL");
 | +MODULE_LICENSE("GPL");
 | ||||||
| --- a/tools/testing/selftests/tc-testing/config
 | --- a/tools/testing/selftests/tc-testing/config
 | ||||||
| +++ b/tools/testing/selftests/tc-testing/config
 | +++ b/tools/testing/selftests/tc-testing/config
 | ||||||
| @@ -37,6 +37,7 @@ CONFIG_NET_ACT_SKBEDIT=m
 | @@ -38,6 +38,7 @@ CONFIG_NET_ACT_CSUM=m
 | ||||||
|  CONFIG_NET_ACT_CSUM=m |  | ||||||
|  CONFIG_NET_ACT_VLAN=m |  CONFIG_NET_ACT_VLAN=m | ||||||
|  CONFIG_NET_ACT_BPF=m |  CONFIG_NET_ACT_BPF=m | ||||||
| +CONFIG_NET_ACT_CONNDSCP=m
 |  | ||||||
|  CONFIG_NET_ACT_CONNMARK=m |  CONFIG_NET_ACT_CONNMARK=m | ||||||
|  | +CONFIG_NET_ACT_CONNCTINFO=m
 | ||||||
|  CONFIG_NET_ACT_SKBMOD=m |  CONFIG_NET_ACT_SKBMOD=m | ||||||
|  CONFIG_NET_ACT_IFE=m |  CONFIG_NET_ACT_IFE=m | ||||||
|  |  CONFIG_NET_ACT_TUNNEL_KEY=m | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user