All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH iproute2-next 0/2] PFCP support
@ 2024-04-10 10:14 Wojciech Drewek
  2024-04-10 10:14 ` [PATCH iproute2-next 1/2] ip: PFCP device support Wojciech Drewek
  2024-04-10 10:14 ` [PATCH iproute2-next 2/2] f_flower: implement pfcp opts Wojciech Drewek
  0 siblings, 2 replies; 6+ messages in thread
From: Wojciech Drewek @ 2024-04-10 10:14 UTC (permalink / raw
  To: netdev; +Cc: dsahern, stephen

New PFCP module was accepted in the kernel together with cls_flower
changes which allow to filter the packets using PFCP specific fields [1].
Packet Forwarding Control Protocol is a 3GPP Protocol defined in
TS 29.244 [2].

Extended ip link with the support for the new PFCP device.
Add pfcp_opts support in tc-flower.

[1] https://lore.kernel.org/netdev/171196563119.11638.12210788830829801735.git-patchwork-notify@kernel.org/
[2] https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=3111

Michal Swiatkowski (1):
  f_flower: implement pfcp opts

Wojciech Drewek (1):
  ip: PFCP device support

 include/libnetlink.h         |   6 ++
 include/uapi/linux/pkt_cls.h |  14 ++++
 ip/iplink.c                  |   2 +-
 man/man8/ip-link.8.in        |  10 +++
 man/man8/tc-flower.8         |  11 +++
 tc/f_flower.c                | 126 +++++++++++++++++++++++++++++++++++
 6 files changed, 168 insertions(+), 1 deletion(-)

-- 
2.40.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH iproute2-next 1/2] ip: PFCP device support
  2024-04-10 10:14 [PATCH iproute2-next 0/2] PFCP support Wojciech Drewek
@ 2024-04-10 10:14 ` Wojciech Drewek
  2024-04-10 10:14 ` [PATCH iproute2-next 2/2] f_flower: implement pfcp opts Wojciech Drewek
  1 sibling, 0 replies; 6+ messages in thread
From: Wojciech Drewek @ 2024-04-10 10:14 UTC (permalink / raw
  To: netdev; +Cc: dsahern, stephen

Packet Forwarding Control Protocol is a 3GPP Protocol defined in
TS 29.244 [1]. Add support for PFCP device type in ip link.
It is capable of receiving PFCP messages and extracting its
metadata (session ID).

Its only purpose is to be used together with tc flower to create
SW/HW filters.

PFCP module does not take any netlink attributes so there is no
need to parse any args. Add new sections to the man to let the
user know about new device type.

[1] https://portal.3gpp.org/desktopmodules/Specifications/SpecificationDetails.aspx?specificationId=3111

Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com>
---
 ip/iplink.c           |  2 +-
 man/man8/ip-link.8.in | 10 ++++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/ip/iplink.c b/ip/iplink.c
index 95314af5ab1c..73d4cd428047 100644
--- a/ip/iplink.c
+++ b/ip/iplink.c
@@ -44,7 +44,7 @@ void iplink_types_usage(void)
 		"          ip6erspan | ip6gre | ip6gretap | ip6tnl |\n"
 		"          ipip | ipoib | ipvlan | ipvtap |\n"
 		"          macsec | macvlan | macvtap | netdevsim |\n"
-		"          netkit | nlmon | rmnet | sit | team | team_slave |\n"
+		"          netkit | nlmon | pfcp | rmnet | sit | team | team_slave |\n"
 		"          vcan | veth | vlan | vrf | vti | vxcan | vxlan | wwan |\n"
 		"          xfrm | virt_wifi }\n");
 }
diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in
index 31e2d7f0f5b8..2654f8c361ae 100644
--- a/man/man8/ip-link.8.in
+++ b/man/man8/ip-link.8.in
@@ -249,6 +249,7 @@ ip-link \- network device configuration
 .BR netdevsim " |"
 .BR netkit " |"
 .BR nlmon " |"
+.BR pfcp " |"
 .BR rmnet " |"
 .BR sit " |"
 .BR vcan " | "
@@ -391,6 +392,9 @@ Link types:
 .BR nlmon
 - Netlink monitoring device
 .sp
+.BR pfcp
+- Packet Forwarding Control Protocol device
+.sp
 .BR rmnet
 - Qualcomm rmnet device
 .sp
@@ -2124,6 +2128,12 @@ the following additional arguments are supported:
 .BI restart_count " RESTART_COUNT "
 - GTP instance restart counter
 
+.TP
+PFCP Type Support
+For a link of type
+.I PFCP
+no additional arguments are supported
+
 .in -8
 
 .SS ip link delete - delete virtual link
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH iproute2-next 2/2] f_flower: implement pfcp opts
  2024-04-10 10:14 [PATCH iproute2-next 0/2] PFCP support Wojciech Drewek
  2024-04-10 10:14 ` [PATCH iproute2-next 1/2] ip: PFCP device support Wojciech Drewek
@ 2024-04-10 10:14 ` Wojciech Drewek
  2024-04-10 15:53   ` Stephen Hemminger
  1 sibling, 1 reply; 6+ messages in thread
From: Wojciech Drewek @ 2024-04-10 10:14 UTC (permalink / raw
  To: netdev; +Cc: dsahern, stephen

From: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>

Allow adding tc filter for PFCP header.

Add support for parsing TCA_FLOWER_KEY_ENC_OPTS_PFCP.
Options are as follows: TYPE:SEID.

TYPE is a 8-bit value represented in hex and can be  1
for session header and 0 for node header. In PFCP packet
this is S flag in header.

SEID is a 64-bit session id value represented in hex.

This patch enables adding hardware filters using PFCP fields, see [1].

[1] https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=d823265dd45bbf14bd67aa476057108feb4143ce

Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com>
---
 include/libnetlink.h         |   6 ++
 include/uapi/linux/pkt_cls.h |  14 ++++
 man/man8/tc-flower.8         |  11 +++
 tc/f_flower.c                | 126 +++++++++++++++++++++++++++++++++++
 4 files changed, 157 insertions(+)

diff --git a/include/libnetlink.h b/include/libnetlink.h
index 35a9bb57d685..30f0c2d22d49 100644
--- a/include/libnetlink.h
+++ b/include/libnetlink.h
@@ -274,6 +274,12 @@ static inline __u64 rta_getattr_uint(const struct rtattr *rta)
 	}
 	return -1ULL;
 }
+
+static inline __be64 rta_getattr_be64(const struct rtattr *rta)
+{
+	return htobe64(rta_getattr_u64(rta));
+}
+
 static inline __s32 rta_getattr_s32(const struct rtattr *rta)
 {
 	return *(__s32 *)RTA_DATA(rta);
diff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h
index ea277039f89d..229fc925ec3a 100644
--- a/include/uapi/linux/pkt_cls.h
+++ b/include/uapi/linux/pkt_cls.h
@@ -587,6 +587,10 @@ enum {
 					 * TCA_FLOWER_KEY_ENC_OPT_GTP_
 					 * attributes
 					 */
+	TCA_FLOWER_KEY_ENC_OPTS_PFCP,	/* Nested
+					 * TCA_FLOWER_KEY_ENC_IPT_PFCP
+					 * attributes
+					 */
 	__TCA_FLOWER_KEY_ENC_OPTS_MAX,
 };
 
@@ -636,6 +640,16 @@ enum {
 #define TCA_FLOWER_KEY_ENC_OPT_GTP_MAX \
 		(__TCA_FLOWER_KEY_ENC_OPT_GTP_MAX - 1)
 
+enum {
+	TCA_FLOWER_KEY_ENC_OPT_PFCP_UNSPEC,
+	TCA_FLOWER_KEY_ENC_OPT_PFCP_TYPE,		/* u8 */
+	TCA_FLOWER_KEY_ENC_OPT_PFCP_SEID,		/* be64 */
+	__TCA_FLOWER_KEY_ENC_OPT_PFCP_MAX,
+};
+
+#define TCA_FLOWER_KEY_ENC_OPT_PFCP_MAX \
+		(__TCA_FLOWER_KEY_ENC_OPT_PFCP_MAX - 1)
+
 enum {
 	TCA_FLOWER_KEY_MPLS_OPTS_UNSPEC,
 	TCA_FLOWER_KEY_MPLS_OPTS_LSE,
diff --git a/man/man8/tc-flower.8 b/man/man8/tc-flower.8
index 832458138c74..929f9d9b4200 100644
--- a/man/man8/tc-flower.8
+++ b/man/man8/tc-flower.8
@@ -97,6 +97,8 @@ flower \- flow based traffic control filter
 .B erspan_opts
 |
 .B gtp_opts
+|
+.B pfcp_opts
 }
 .IR OPTIONS " | "
 .BR ip_flags
@@ -453,6 +455,8 @@ Match the connection zone, and can be masked.
 .BI erspan_opts " OPTIONS"
 .TQ
 .BI gtp_opts " OPTIONS"
+.TQ
+.BI pfcp_opts " OPTIONS"
 Match on IP tunnel metadata. Key id
 .I NUMBER
 is a 32 bit tunnel key id (e.g. VNI for VXLAN tunnel).
@@ -494,6 +498,13 @@ doesn't support multiple options, and it consists of a key followed by a slash
 and corresponding mask. If the mask is missing, \fBtc\fR assumes a full-length
 match. The option can be described in the form PDU_TYPE:QFI/PDU_TYPE_MASK:QFI_MASK
 where both PDU_TYPE and QFI are represented as a 8bit hexadecimal values.
+pfcp_opts
+.I OPTIONS
+doesn't support multiple options, and it consists of a key followed by a slash
+and corresponding mask. If the mask is missing, \fBtc\fR assumes a full-length
+match. The option can be described in the form TYPE:SEID/TYPE_MASK:SEID_MASK
+where TYPE is represented as a 8bit number, SEID is represented by 64bit, both
+of them are in hex.
 .TP
 .BI ip_flags " IP_FLAGS"
 .I IP_FLAGS
diff --git a/tc/f_flower.c b/tc/f_flower.c
index 53188f1cd87a..bc918b4bd3ff 100644
--- a/tc/f_flower.c
+++ b/tc/f_flower.c
@@ -91,6 +91,7 @@ static void explain(void)
 		"			vxlan_opts MASKED-OPTIONS |\n"
 		"			erspan_opts MASKED-OPTIONS |\n"
 		"			gtp_opts MASKED-OPTIONS |\n"
+		"			pfcp_opts MASKED-OPTIONS |\n"
 		"			ip_flags IP-FLAGS |\n"
 		"			l2_miss L2_MISS |\n"
 		"			enc_dst_port [ port_number ] |\n"
@@ -1152,6 +1153,58 @@ static int flower_parse_gtp_opt(char *str, struct nlmsghdr *n)
 	return 0;
 }
 
+static int flower_parse_pfcp_opt(char *str, struct nlmsghdr *n)
+{
+	struct rtattr *nest;
+	char *token;
+	int i, err;
+
+	nest = addattr_nest(n, MAX_MSG,
+			    TCA_FLOWER_KEY_ENC_OPTS_PFCP | NLA_F_NESTED);
+
+	i = 1;
+	token = strsep(&str, ":");
+	while (token) {
+		switch (i) {
+		case TCA_FLOWER_KEY_ENC_OPT_PFCP_TYPE:
+		{
+			__u8 opt_type;
+
+			if (!strlen(token))
+				break;
+			err = get_u8(&opt_type, token, 16);
+			if (err)
+				return err;
+
+			addattr8(n, MAX_MSG, i, opt_type);
+			break;
+		}
+		case TCA_FLOWER_KEY_ENC_OPT_PFCP_SEID:
+		{
+			__be64 opt_seid;;
+
+			if (!strlen(token))
+				break;
+			err = get_be64(&opt_seid, token, 16);
+			if (err)
+				return err;
+
+			addattr64(n, MAX_MSG, i, opt_seid);
+			break;
+		}
+		default:
+			fprintf(stderr, "Unknown \"pfcp_opts\" type\n");
+			return -1;
+		}
+
+		token = strsep(&str, ":");
+		i++;
+	}
+	addattr_nest_end(n, nest);
+
+	return 0;
+}
+
 static int flower_parse_geneve_opts(char *str, struct nlmsghdr *n)
 {
 	char *token;
@@ -1370,6 +1423,44 @@ static int flower_parse_enc_opts_gtp(char *str, struct nlmsghdr *n)
 	return 0;
 }
 
+static int flower_parse_enc_opts_pfcp(char *str, struct nlmsghdr *n)
+{
+	char key[XATTR_SIZE_MAX], mask[XATTR_SIZE_MAX];
+	struct rtattr *nest;
+	char *slash;
+	int err;
+
+
+	slash = strchr(str, '/');
+	if (slash) {
+		*slash++ = '\0';
+		if (strlen(slash) > XATTR_SIZE_MAX)
+			return -1;
+		strcpy(mask, slash);
+	} else {
+		strcpy(mask, "ff:ffffffffffffffff");
+	}
+
+	if (strlen(str) > XATTR_SIZE_MAX)
+		return -1;
+	strcpy(key, str);
+
+	nest = addattr_nest(n, MAX_MSG, TCA_FLOWER_KEY_ENC_OPTS | NLA_F_NESTED);
+	err = flower_parse_pfcp_opt(key, n);
+	if (err)
+		return err;
+	addattr_nest_end(n, nest);
+
+	nest = addattr_nest(n, MAX_MSG,
+			    TCA_FLOWER_KEY_ENC_OPTS_MASK | NLA_F_NESTED);
+	err = flower_parse_pfcp_opt(mask, n);
+	if (err)
+		return err;
+	addattr_nest_end(n, nest);
+
+	return 0;
+}
+
 static int flower_parse_mpls_lse(int *argc_p, char ***argv_p,
 				 struct nlmsghdr *nlh)
 {
@@ -2150,6 +2241,13 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
 				fprintf(stderr, "Illegal \"gtp_opts\"\n");
 				return -1;
 			}
+		} else if (!strcmp(*argv, "pfcp_opts")) {
+			NEXT_ARG();
+			ret = flower_parse_enc_opts_pfcp(*argv, n);
+			if (ret < 0) {
+				fprintf(stderr, "Illegal \"pfcp_opts\"\n");
+				return -1;
+			}
 		} else if (matches(*argv, "action") == 0) {
 			NEXT_ARG();
 			ret = parse_action(&argc, &argv, TCA_FLOWER_ACT, n);
@@ -2646,6 +2744,22 @@ static void flower_print_gtp_opts(const char *name, struct rtattr *attr,
 	snprintf(strbuf, len, "%02x:%02x", pdu_type, qfi);
 }
 
+static void flower_print_pfcp_opts(const char *name, struct rtattr *attr,
+				   char *strbuf, int len)
+{
+	struct rtattr *tb[TCA_FLOWER_KEY_ENC_OPT_PFCP_MAX + 1];
+	struct rtattr *i = RTA_DATA(attr);
+	int rem = RTA_PAYLOAD(attr);
+	__be64 seid;
+	__u8 type;
+
+	parse_rtattr(tb, TCA_FLOWER_KEY_ENC_OPT_PFCP_MAX, i, rem);
+	type = rta_getattr_u8(tb[TCA_FLOWER_KEY_ENC_OPT_PFCP_TYPE]);
+	seid = rta_getattr_be64(tb[TCA_FLOWER_KEY_ENC_OPT_PFCP_SEID]);
+
+	snprintf(strbuf, len, "%02x:%llx", type, seid);
+}
+
 static void __attribute__((format(printf, 2, 0)))
 flower_print_enc_parts(const char *name, const char *namefrm,
 		       struct rtattr *attr, char *key, char *mask)
@@ -2738,6 +2852,18 @@ static void flower_print_enc_opts(const char *name, struct rtattr *attr,
 
 		flower_print_enc_parts(name, "  gtp_opts %s", attr, key,
 				       msk);
+	} else if (key_tb[TCA_FLOWER_KEY_ENC_OPTS_PFCP]) {
+		flower_print_pfcp_opts("pfcp_opt_key",
+				key_tb[TCA_FLOWER_KEY_ENC_OPTS_PFCP],
+				key, len);
+
+		if (msk_tb[TCA_FLOWER_KEY_ENC_OPTS_PFCP])
+			flower_print_pfcp_opts("pfcp_opt_mask",
+				msk_tb[TCA_FLOWER_KEY_ENC_OPTS_PFCP],
+				msk, len);
+
+		flower_print_enc_parts(name, "  pfcp_opts %s", attr, key,
+				       msk);
 	}
 
 	free(msk);
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH iproute2-next 2/2] f_flower: implement pfcp opts
  2024-04-10 10:14 ` [PATCH iproute2-next 2/2] f_flower: implement pfcp opts Wojciech Drewek
@ 2024-04-10 15:53   ` Stephen Hemminger
  2024-04-11 11:32     ` Wojciech Drewek
  0 siblings, 1 reply; 6+ messages in thread
From: Stephen Hemminger @ 2024-04-10 15:53 UTC (permalink / raw
  To: Wojciech Drewek; +Cc: netdev, dsahern

On Wed, 10 Apr 2024 12:14:40 +0200
Wojciech Drewek <wojciech.drewek@intel.com> wrote:

> +pfcp_opts
> +.I OPTIONS
> +doesn't support multiple options, and it consists of a key followed by a slash
> +and corresponding mask. If the mask is missing, \fBtc\fR assumes a full-length
> +match. The option can be described in the form TYPE:SEID/TYPE_MASK:SEID_MASK
> +where TYPE is represented as a 8bit number, SEID is represented by 64bit, both
> +of them are in hex.

Best practices in English writing style is to make all clauses have similar
starting phrase.

Existing paragraph here is a mess already, so not unique to this.
That part of tc-flower man page needs some grammar fixes, as well
as being broken up.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH iproute2-next 2/2] f_flower: implement pfcp opts
  2024-04-10 15:53   ` Stephen Hemminger
@ 2024-04-11 11:32     ` Wojciech Drewek
  2024-04-12 14:41       ` David Ahern
  0 siblings, 1 reply; 6+ messages in thread
From: Wojciech Drewek @ 2024-04-11 11:32 UTC (permalink / raw
  To: Stephen Hemminger; +Cc: netdev, dsahern



On 10.04.2024 17:53, Stephen Hemminger wrote:
> On Wed, 10 Apr 2024 12:14:40 +0200
> Wojciech Drewek <wojciech.drewek@intel.com> wrote:
> 
>> +pfcp_opts
>> +.I OPTIONS
>> +doesn't support multiple options, and it consists of a key followed by a slash
>> +and corresponding mask. If the mask is missing, \fBtc\fR assumes a full-length
>> +match. The option can be described in the form TYPE:SEID/TYPE_MASK:SEID_MASK
>> +where TYPE is represented as a 8bit number, SEID is represented by 64bit, both
>> +of them are in hex.
> 
> Best practices in English writing style is to make all clauses have similar
> starting phrase.

pfcp_opts
.I OPTIONS
doesn't support multiple options. It consists of a key followed by a slash
and corresponding mask. If the mask is missing, \fBtc\fR assumes a full-length
match. The option can be described in the form TYPE:SEID/TYPE_MASK:SEID_MASK
where TYPE is represented as a 8bit number, SEID is represented by 64bit. Both
TYPE and SEID are provided in hex.

Does it look better?

> 
> Existing paragraph here is a mess already, so not unique to this.
> That part of tc-flower man page needs some grammar fixes, as well
> as being broken up.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH iproute2-next 2/2] f_flower: implement pfcp opts
  2024-04-11 11:32     ` Wojciech Drewek
@ 2024-04-12 14:41       ` David Ahern
  0 siblings, 0 replies; 6+ messages in thread
From: David Ahern @ 2024-04-12 14:41 UTC (permalink / raw
  To: Wojciech Drewek, Stephen Hemminger; +Cc: netdev

On 4/11/24 5:32 AM, Wojciech Drewek wrote:
> 
> 
> On 10.04.2024 17:53, Stephen Hemminger wrote:
>> On Wed, 10 Apr 2024 12:14:40 +0200
>> Wojciech Drewek <wojciech.drewek@intel.com> wrote:
>>
>>> +pfcp_opts
>>> +.I OPTIONS
>>> +doesn't support multiple options, and it consists of a key followed by a slash
>>> +and corresponding mask. If the mask is missing, \fBtc\fR assumes a full-length
>>> +match. The option can be described in the form TYPE:SEID/TYPE_MASK:SEID_MASK
>>> +where TYPE is represented as a 8bit number, SEID is represented by 64bit, both
>>> +of them are in hex.
>>
>> Best practices in English writing style is to make all clauses have similar
>> starting phrase.
> 
> pfcp_opts
> .I OPTIONS
> doesn't support multiple options. It consists of a key followed by a slash
> and corresponding mask. If the mask is missing, \fBtc\fR assumes a full-length
> match. The option can be described in the form TYPE:SEID/TYPE_MASK:SEID_MASK
> where TYPE is represented as a 8bit number, SEID is represented by 64bit. Both
> TYPE and SEID are provided in hex.

expand the contraction (doen't -> does not); otherwise I am fine with it

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2024-04-12 14:41 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-04-10 10:14 [PATCH iproute2-next 0/2] PFCP support Wojciech Drewek
2024-04-10 10:14 ` [PATCH iproute2-next 1/2] ip: PFCP device support Wojciech Drewek
2024-04-10 10:14 ` [PATCH iproute2-next 2/2] f_flower: implement pfcp opts Wojciech Drewek
2024-04-10 15:53   ` Stephen Hemminger
2024-04-11 11:32     ` Wojciech Drewek
2024-04-12 14:41       ` David Ahern

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.