* [PATCH net-next v5 0/3] gtp: ynl spec for the GTP netlink family, a reply-command fix, and a selftest
@ 2026-10-12 2:47 Anil Kaushik
2026-10-12 2:47 ` [PATCH net-next v5 1/3] gtp: set a valid genl command in PDP context get and dump replies Anil Kaushik
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Anil Kaushik @ 2026-10-12 2:47 UTC (permalink / raw)
To: Pablo Neira Ayuso, Harald Welte, Donald Hunter, Jakub Kicinski
Cc: David S . Miller, Eric Dumazet, Paolo Abeni, Simon Horman,
Andrew Lunn, Shuah Khan, osmocom-net-gprs, netdev, linux-kernel,
linux-kselftest, Anil Kaushik
This adds a ynl spec for the gtp genetlink family, a small driver fix
it needed, and a selftest.
Patch 1: the GET and dump replies carried the family id in the command
field, so ynl dropped them. Use GTP_CMD_GETPDP instead.
Patch 2: the spec (NEWPDP/DELPDP/GETPDP/ECHOREQ), no uapi change.
Patch 3: a selftest that adds, dumps and deletes PDP contexts.
The multicast notifications are not in the spec: they reuse the request
command values, which the ynl C generator can't express with the
current uapi header. I can look at generator support as a follow-up.
v5:
- ynl: add CFLAGS_gtp so the generated code builds with older headers
- spec: doc fixes (notifications, version 0, echoreq ms-address,
ms-addr6 /64), min-len for the IPv6 attributes
- selftest: only skip when GTP is unavailable, close the ynl handle
v4:
- spec: request/reply attributes now match the handlers
- selftest: fix the gtp.ko autoload crash, check ENOENT, delete by
TEI and by MS address
v4: https://lore.kernel.org/netdev/20261010105740.223992-1-anilkaushikwireless@gmail.com/
v3: https://lore.kernel.org/netdev/20261009060615.4177402-1-anilkaushikwireless@gmail.com/
v2: https://lore.kernel.org/netdev/20261008181031.4129029-1-anilkaushikwireless@gmail.com/
Anil Kaushik (3):
gtp: set a valid genl command in PDP context get and dump replies
netlink: specs: add genetlink-legacy spec for GTP
selftests: net: add a test for the gtp netlink family
Documentation/netlink/specs/gtp.yaml | 183 ++++++++++++++++++
MAINTAINERS | 2 +
drivers/net/gtp.c | 4 +-
tools/net/ynl/Makefile.deps | 1 +
tools/testing/selftests/net/Makefile | 1 +
tools/testing/selftests/net/config | 1 +
tools/testing/selftests/net/gtp.py | 122 ++++++++++++
.../testing/selftests/net/lib/py/__init__.py | 5 +-
tools/testing/selftests/net/lib/py/ynl.py | 8 +-
9 files changed, 322 insertions(+), 5 deletions(-)
create mode 100644 Documentation/netlink/specs/gtp.yaml
create mode 100755 tools/testing/selftests/net/gtp.py
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH net-next v5 1/3] gtp: set a valid genl command in PDP context get and dump replies
2026-10-12 2:47 [PATCH net-next v5 0/3] gtp: ynl spec for the GTP netlink family, a reply-command fix, and a selftest Anil Kaushik
@ 2026-10-12 2:47 ` Anil Kaushik
2026-10-12 2:47 ` [PATCH net-next v5 2/3] netlink: specs: add genetlink-legacy spec for GTP Anil Kaushik
2026-10-12 2:48 ` [PATCH net-next v5 3/3] selftests: net: add a test for the gtp netlink family Anil Kaushik
2 siblings, 0 replies; 6+ messages in thread
From: Anil Kaushik @ 2026-10-12 2:47 UTC (permalink / raw)
To: Pablo Neira Ayuso, Harald Welte, Donald Hunter, Jakub Kicinski
Cc: David S . Miller, Eric Dumazet, Paolo Abeni, Simon Horman,
Andrew Lunn, Shuah Khan, osmocom-net-gprs, netdev, linux-kernel,
linux-kselftest, Anil Kaushik
gtp_genl_fill_info() stamps the reply with the command its callers pass
in. gtp_genl_get_pdp() and gtp_genl_dump_pdp() pass nlmsg_type, which in
a genl message is the dynamically assigned family id rather than a
GTP_CMD_* value, so replies to a PDP context get or dump carry a
meaningless command number.
libgtpnl ignores the command and is unaffected, but parsers that check
it (for example the ynl tooling) treat the reply as an unknown command
and discard it. Pass GTP_CMD_GETPDP, as gtp_tunnel_notify() already
passes a real command on the notification path. No uapi change.
Fixes: 459aa660eb1d ("gtp: add initial driver for datapath of GPRS Tunneling Protocol (GTP-U)")
Signed-off-by: Anil Kaushik <anilkaushikwireless@gmail.com>
---
drivers/net/gtp.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c
index 4aff23bcfdd1..99836b773e5c 100644
--- a/drivers/net/gtp.c
+++ b/drivers/net/gtp.c
@@ -2279,7 +2279,7 @@ static int gtp_genl_get_pdp(struct sk_buff *skb, struct genl_info *info)
}
err = gtp_genl_fill_info(skb2, NETLINK_CB(skb).portid, info->snd_seq,
- 0, info->nlhdr->nlmsg_type, pctx);
+ 0, GTP_CMD_GETPDP, pctx);
if (err < 0)
goto err_unlock_free;
@@ -2326,7 +2326,7 @@ static int gtp_genl_dump_pdp(struct sk_buff *skb,
NETLINK_CB(cb->skb).portid,
cb->nlh->nlmsg_seq,
NLM_F_MULTI,
- cb->nlh->nlmsg_type, pctx)) {
+ GTP_CMD_GETPDP, pctx)) {
cb->args[0] = i;
cb->args[1] = j;
cb->args[2] = (unsigned long)gtp;
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net-next v5 2/3] netlink: specs: add genetlink-legacy spec for GTP
2026-10-12 2:47 [PATCH net-next v5 0/3] gtp: ynl spec for the GTP netlink family, a reply-command fix, and a selftest Anil Kaushik
2026-10-12 2:47 ` [PATCH net-next v5 1/3] gtp: set a valid genl command in PDP context get and dump replies Anil Kaushik
@ 2026-10-12 2:47 ` Anil Kaushik
2026-10-13 2:48 ` netdev-bot+sashiko
2026-10-12 2:48 ` [PATCH net-next v5 3/3] selftests: net: add a test for the gtp netlink family Anil Kaushik
2 siblings, 1 reply; 6+ messages in thread
From: Anil Kaushik @ 2026-10-12 2:47 UTC (permalink / raw)
To: Pablo Neira Ayuso, Harald Welte, Donald Hunter, Jakub Kicinski
Cc: David S . Miller, Eric Dumazet, Paolo Abeni, Simon Horman,
Andrew Lunn, Shuah Khan, osmocom-net-gprs, netdev, linux-kernel,
linux-kselftest, Anil Kaushik
The GTP (GPRS Tunnelling Protocol, user plane) generic netlink family
has no YAML specification under Documentation/netlink/specs/, so it
cannot be consumed by the ynl tooling used for user-space clients,
documentation and selftests.
Add a genetlink-legacy spec describing the existing family: the PDP
context management commands (NEWPDP, DELPDP, GETPDP) and the GTP-U echo
request (ECHOREQ), the GTPA_* attribute set, and the "gtp" multicast
group. Command and attribute values are taken from
include/uapi/linux/gtp.h and match it one-to-one. The request
attributes of each command are the ones its handler in
drivers/net/gtp.c reads, and the reply attributes the ones
gtp_genl_fill_info() emits.
The notifications sent on the "gtp" group are not described: they reuse
the command values of the NEWPDP, DELPDP and ECHOREQ requests, which
the ynl code generator cannot express with the existing uapi header.
The family doc says so.
Add the matching CFLAGS_gtp entry to tools/net/ynl/Makefile.deps, so
the generated code is built against the tree's gtp.h instead of an
older one installed on the host.
This only adds the description; there is no kernel code or uapi change.
Signed-off-by: Anil Kaushik <anilkaushikwireless@gmail.com>
---
Documentation/netlink/specs/gtp.yaml | 183 +++++++++++++++++++++++++++
MAINTAINERS | 1 +
tools/net/ynl/Makefile.deps | 1 +
3 files changed, 185 insertions(+)
create mode 100644 Documentation/netlink/specs/gtp.yaml
diff --git a/Documentation/netlink/specs/gtp.yaml b/Documentation/netlink/specs/gtp.yaml
new file mode 100644
index 000000000000..6a6b49ad2f06
--- /dev/null
+++ b/Documentation/netlink/specs/gtp.yaml
@@ -0,0 +1,183 @@
+# SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause)
+---
+name: gtp
+
+protocol: genetlink-legacy
+
+doc: |
+ GPRS Tunnelling Protocol, user plane (GTP-U).
+
+ The gtp netdevice encapsulates and decapsulates user plane packets in
+ GTP-U tunnels (GTPv0 and GTPv1-U, see 3GPP TS 29.060 and TS 29.281).
+ This family manages the PDP contexts that describe the tunnels and
+ triggers GTP-U echo requests. It is driven by user space control planes
+ such as those built on libgtpnl.
+
+ The kernel registers the family with version 0, which the
+ genetlink-legacy schema cannot express.
+
+ The notifications multicast on the "gtp" group are not described: PDP
+ context additions and deletions, and GTP-U echo responses, reuse the
+ NEWPDP, DELPDP and ECHOREQ command values of the requests.
+
+kernel-policy: global
+
+attribute-sets:
+ -
+ name: gtp
+ name-prefix: gtpa-
+ attributes:
+ -
+ name: link
+ type: u32
+ doc: ifindex of the gtp netdevice the context is attached to.
+ -
+ name: version
+ type: u32
+ doc: GTP version of the context, 0 for GTPv0 or 1 for GTPv1-U.
+ -
+ name: tid
+ type: u64
+ doc: Tunnel identifier, GTPv0 only.
+ -
+ name: peer-address
+ type: u32
+ byte-order: big-endian
+ display-hint: ipv4
+ doc: |
+ IPv4 address of the remote GSN peer (GGSN or SGSN). Also known
+ as GTPA_SGSN_ADDRESS, kept for legacy user space.
+ -
+ name: ms-address
+ type: u32
+ byte-order: big-endian
+ display-hint: ipv4
+ doc: IPv4 address of the mobile subscriber served by the context.
+ -
+ name: flow
+ type: u16
+ doc: Flow label, GTPv0 only.
+ -
+ name: net-ns-fd
+ type: u32
+ doc: File descriptor of the network namespace of the gtp netdevice.
+ -
+ name: i-tei
+ type: u32
+ doc: Ingress Tunnel Endpoint Identifier, GTPv1-U only.
+ -
+ name: o-tei
+ type: u32
+ doc: Egress Tunnel Endpoint Identifier, GTPv1-U only.
+ -
+ name: pad
+ type: pad
+ -
+ name: peer-addr6
+ type: binary
+ checks:
+ min-len: 16
+ byte-order: big-endian
+ display-hint: ipv6
+ doc: IPv6 address of the remote GSN peer (GGSN or SGSN).
+ -
+ name: ms-addr6
+ type: binary
+ checks:
+ min-len: 16
+ byte-order: big-endian
+ display-hint: ipv6
+ doc: |
+ IPv6 prefix of the mobile subscriber served by the context: a /64
+ prefix, with the lower 64 bits set to zero.
+ -
+ name: family
+ type: u8
+ doc: Address family (AF_INET or AF_INET6) of the context addresses.
+
+operations:
+ list:
+ -
+ name: newpdp
+ doc: Create or update a PDP context.
+ attribute-set: gtp
+ value: 0
+ dont-validate: [strict, dump]
+ flags: [admin-perm]
+ do:
+ request: &pdp-attrs
+ attributes:
+ - link
+ - version
+ - tid
+ - peer-address
+ - peer-addr6
+ - ms-address
+ - ms-addr6
+ - flow
+ - i-tei
+ - o-tei
+ - family
+ - net-ns-fd
+ -
+ name: delpdp
+ doc: Delete a PDP context.
+ attribute-set: gtp
+ dont-validate: [strict, dump]
+ flags: [admin-perm]
+ do:
+ request: &pdp-find
+ attributes:
+ - link
+ - version
+ - tid
+ - ms-address
+ - ms-addr6
+ - i-tei
+ - family
+ - net-ns-fd
+ -
+ name: getpdp
+ doc: Get or dump one or more PDP contexts.
+ attribute-set: gtp
+ dont-validate: [strict, dump]
+ flags: [admin-perm]
+ do:
+ request: *pdp-find
+ reply: &pdp-reply
+ attributes:
+ - link
+ - version
+ - tid
+ - peer-address
+ - peer-addr6
+ - ms-address
+ - ms-addr6
+ - flow
+ - i-tei
+ - o-tei
+ - family
+ dump:
+ reply: *pdp-reply
+ -
+ name: echoreq
+ doc: |
+ Send a GTP-U echo request to a peer. ms-address is not a mobile
+ subscriber address here, but the local IPv4 address used as source
+ of the request.
+ attribute-set: gtp
+ dont-validate: [strict, dump]
+ flags: [admin-perm]
+ do:
+ request:
+ attributes:
+ - link
+ - version
+ - peer-address
+ - ms-address
+ - net-ns-fd
+
+mcast-groups:
+ list:
+ -
+ name: gtp
diff --git a/MAINTAINERS b/MAINTAINERS
index 51873349ba91..a6e43995ea58 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -11421,6 +11421,7 @@ M: Harald Welte <laforge@gnumonks.org>
L: osmocom-net-gprs@lists.osmocom.org
S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/pablo/gtp.git
+F: Documentation/netlink/specs/gtp.yaml
F: drivers/net/gtp.c
GUID PARTITION TABLE (GPT)
diff --git a/tools/net/ynl/Makefile.deps b/tools/net/ynl/Makefile.deps
index 1e746e25e2bc..9fd8f3321680 100644
--- a/tools/net/ynl/Makefile.deps
+++ b/tools/net/ynl/Makefile.deps
@@ -24,6 +24,7 @@ CFLAGS_ethtool:=$(call get_hdr_inc,_LINUX_TYPELIMITS_H,typelimits.h) \
$(call get_hdr_inc,_LINUX_ETHTOOL_H,ethtool.h) \
$(call get_hdr_inc,_LINUX_ETHTOOL_NETLINK_H_,ethtool_netlink.h) \
$(call get_hdr_inc,_LINUX_ETHTOOL_NETLINK_GENERATED_H,ethtool_netlink_generated.h)
+CFLAGS_gtp:=$(call get_hdr_inc,_LINUX_GTP_H_,gtp.h)
CFLAGS_handshake:=$(call get_hdr_inc,_LINUX_HANDSHAKE_H,handshake.h)
CFLAGS_lockd_netlink:=$(call get_hdr_inc,_LINUX_LOCKD_NETLINK_H,lockd_netlink.h)
CFLAGS_mptcp_pm:=$(call get_hdr_inc,_LINUX_MPTCP_PM_H,mptcp_pm.h)
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH net-next v5 3/3] selftests: net: add a test for the gtp netlink family
2026-10-12 2:47 [PATCH net-next v5 0/3] gtp: ynl spec for the GTP netlink family, a reply-command fix, and a selftest Anil Kaushik
2026-10-12 2:47 ` [PATCH net-next v5 1/3] gtp: set a valid genl command in PDP context get and dump replies Anil Kaushik
2026-10-12 2:47 ` [PATCH net-next v5 2/3] netlink: specs: add genetlink-legacy spec for GTP Anil Kaushik
@ 2026-10-12 2:48 ` Anil Kaushik
2026-10-13 2:48 ` netdev-bot+sashiko
2 siblings, 1 reply; 6+ messages in thread
From: Anil Kaushik @ 2026-10-12 2:48 UTC (permalink / raw)
To: Pablo Neira Ayuso, Harald Welte, Donald Hunter, Jakub Kicinski
Cc: David S . Miller, Eric Dumazet, Paolo Abeni, Simon Horman,
Andrew Lunn, Shuah Khan, osmocom-net-gprs, netdev, linux-kernel,
linux-kselftest, Anil Kaushik
Exercise the gtp generic netlink family through its ynl spec: create a
gtp device, add a PDP context with newpdp, check getpdp dumps it on that
device with the expected TEIDs and addresses, and that delpdp by TEI
removes it. Two more cases check that two contexts are dumped and one
can be deleted by its MS address, and that deleting an unknown context
fails with ENOENT, both by TEI and by MS address.
ynl resolves the family ids once per process, with a CTRL_CMD_GETFAMILY
dump which does not autoload modules, so the gtp device is created
before the family handle: that loads gtp.ko through its rtnl link alias.
The test is skipped when the kernel or iproute2 lack GTP support; any
other failure to create the device fails it.
Add a GtpFamily ynl wrapper and register the test.
Signed-off-by: Anil Kaushik <anilkaushikwireless@gmail.com>
---
MAINTAINERS | 1 +
tools/testing/selftests/net/Makefile | 1 +
tools/testing/selftests/net/config | 1 +
tools/testing/selftests/net/gtp.py | 122 ++++++++++++++++++
.../testing/selftests/net/lib/py/__init__.py | 5 +-
tools/testing/selftests/net/lib/py/ynl.py | 8 +-
6 files changed, 135 insertions(+), 3 deletions(-)
create mode 100755 tools/testing/selftests/net/gtp.py
diff --git a/MAINTAINERS b/MAINTAINERS
index a6e43995ea58..8ac817a78bb0 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -11423,6 +11423,7 @@ S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/pablo/gtp.git
F: Documentation/netlink/specs/gtp.yaml
F: drivers/net/gtp.c
+F: tools/testing/selftests/net/gtp.py
GUID PARTITION TABLE (GPT)
M: Davidlohr Bueso <dave@stgolabs.net>
diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile
index d4ca82fec0b4..6b54e04a6430 100644
--- a/tools/testing/selftests/net/Makefile
+++ b/tools/testing/selftests/net/Makefile
@@ -46,6 +46,7 @@ TEST_PROGS := \
fq_band_pktlimit.sh \
gre_gso.sh \
gre_ipv6_lladdr.sh \
+ gtp.py \
icmp.sh \
icmp_redirect.sh \
io_uring_zerocopy_tx.sh \
diff --git a/tools/testing/selftests/net/config b/tools/testing/selftests/net/config
index 737e7e6327b3..c4534e15fb7a 100644
--- a/tools/testing/selftests/net/config
+++ b/tools/testing/selftests/net/config
@@ -15,6 +15,7 @@ CONFIG_DEBUG_INFO_BTF=y
CONFIG_DEBUG_INFO_BTF_MODULES=n
CONFIG_DUMMY=y
CONFIG_GENEVE=m
+CONFIG_GTP=m
CONFIG_IFB=y
CONFIG_INET_DIAG=y
CONFIG_INET_ESP=y
diff --git a/tools/testing/selftests/net/gtp.py b/tools/testing/selftests/net/gtp.py
new file mode 100755
index 000000000000..199bc4409190
--- /dev/null
+++ b/tools/testing/selftests/net/gtp.py
@@ -0,0 +1,122 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0
+
+"""Tests for the gtp netlink family."""
+
+import errno
+
+from lib.py import ksft_run, ksft_exit
+from lib.py import ksft_eq, ksft_in, ksft_not_in, ksft_raises
+from lib.py import KsftSkipEx
+from lib.py import NetNS, NetNSEnter
+from lib.py import GtpFamily, NlError
+from lib.py import CmdExitFailure
+from lib.py import ip, defer
+
+_NO_GTP_ERRORS = ("Operation not supported", "Garbage instead of arguments")
+
+
+def _setup(ns):
+ """Return a gtp family handle, and the ifindex of a new gtp device.
+
+ Create the device first: that loads gtp.ko through its rtnl link
+ alias. ynl resolves the family ids once per process, with a
+ CTRL_CMD_GETFAMILY dump which does not autoload modules, so the
+ family must be registered before the first family handle is created.
+ """
+ try:
+ ip("link add gtp0 type gtp role ggsn", ns=str(ns))
+ except CmdExitFailure as e:
+ # gtp.ko not available, or iproute2 without gtp support: any other
+ # failure to create the device is a real error.
+ if not any(msg in e.cmd.stderr for msg in _NO_GTP_ERRORS):
+ raise
+ raise KsftSkipEx("no gtp support (CONFIG_GTP, iproute2)") from e
+ defer(ip, "link del gtp0", ns=str(ns))
+ ip("link set gtp0 up", ns=str(ns))
+ link = ip("-d link show gtp0", ns=str(ns), json=True)[0]["ifindex"]
+
+ with NetNSEnter(str(ns)):
+ gtp = GtpFamily()
+ defer(gtp.close)
+
+ return gtp, link
+
+
+def _contexts(gtp, link):
+ return [c for c in gtp.getpdp({}, dump=True) if c.get("link") == link]
+
+
+def _iteis(contexts):
+ return [c.get("i-tei") for c in contexts]
+
+
+def add_del_pdp(ns) -> None:
+ """Add a PDP context, query it, then delete it by TEI.
+
+ The dump must return the context with the link, TEIDs and addresses
+ it was created with, and it must be gone after the delete. The delete
+ only identifies the context by its TEI, to use the GTPv1 TEI lookup.
+ """
+ gtp, link = _setup(ns)
+
+ gtp.newpdp({"link": link, "version": 1,
+ "i-tei": 0x100, "o-tei": 0x200,
+ "ms-address": "10.0.0.1", "peer-address": "192.0.2.1"})
+
+ pdp = [c for c in _contexts(gtp, link) if c.get("i-tei") == 0x100]
+ ksft_eq(len(pdp), 1)
+ ksft_eq(pdp[0]["o-tei"], 0x200)
+ ksft_eq(pdp[0]["ms-address"], "10.0.0.1")
+ ksft_eq(pdp[0]["peer-address"], "192.0.2.1")
+
+ gtp.delpdp({"link": link, "version": 1, "i-tei": 0x100})
+ ksft_not_in(0x100, _iteis(_contexts(gtp, link)))
+
+
+def add_two_pdp(ns) -> None:
+ """Add two PDP contexts, check both are dumped, delete one by address.
+
+ The delete identifies the context by its MS address, and must leave
+ the other context in place.
+ """
+ gtp, link = _setup(ns)
+
+ for i_tei, o_tei, ms in ((0x111, 0x211, "10.0.1.1"),
+ (0x112, 0x212, "10.0.1.2")):
+ gtp.newpdp({"link": link, "version": 1,
+ "i-tei": i_tei, "o-tei": o_tei,
+ "ms-address": ms, "peer-address": "192.0.2.5"})
+
+ iteis = _iteis(_contexts(gtp, link))
+ ksft_in(0x111, iteis)
+ ksft_in(0x112, iteis)
+
+ gtp.delpdp({"link": link, "version": 1, "ms-address": "10.0.1.1"})
+ iteis = _iteis(_contexts(gtp, link))
+ ksft_not_in(0x111, iteis)
+ ksft_in(0x112, iteis)
+
+
+def del_unknown_pdp(ns) -> None:
+ """Deleting a context that was never added must fail with ENOENT.
+
+ Both lookups are checked: by TEI, and by MS address.
+ """
+ gtp, link = _setup(ns)
+
+ for attrs in ({"i-tei": 0x999}, {"ms-address": "10.9.9.9"}):
+ with ksft_raises(NlError) as cm:
+ gtp.delpdp({"link": link, "version": 1, **attrs})
+ ksft_eq(cm.exception.error, errno.ENOENT)
+
+
+def main() -> None:
+ """Run the PDP context tests in a temporary netns."""
+ with NetNS() as ns:
+ ksft_run([add_del_pdp, add_two_pdp, del_unknown_pdp], args=(ns,))
+ ksft_exit()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/tools/testing/selftests/net/lib/py/__init__.py b/tools/testing/selftests/net/lib/py/__init__.py
index 71df5880b356..e269a260d58e 100644
--- a/tools/testing/selftests/net/lib/py/__init__.py
+++ b/tools/testing/selftests/net/lib/py/__init__.py
@@ -18,7 +18,7 @@ from .utils import CmdExitFailure, fd_read_timeout, cmd, bkg, defer, \
from .bpf import bpf_map_set, bpf_map_dump, bpf_prog_map_ids
from .ynl import NlError, NlctrlFamily, YnlFamily, \
EthtoolFamily, NetdevFamily, RtnlFamily, RtnlAddrFamily, RtnlRouteFamily
-from .ynl import NetshaperFamily, DevlinkFamily, PSPFamily, Netlink
+from .ynl import NetshaperFamily, DevlinkFamily, GtpFamily, PSPFamily, Netlink
__all__ = ["KSRC",
"KsftFailEx", "KsftSkipEx", "KsftXfailEx", "ksft_pr", "ksft_eq",
@@ -32,6 +32,7 @@ __all__ = ["KSRC",
"wait_port_listen", "ctl_file_write", "wait_file", "tool", "tc",
"bpf_map_set", "bpf_map_dump", "bpf_prog_map_ids",
"NetdevSim", "NetdevSimDev",
- "NetshaperFamily", "DevlinkFamily", "PSPFamily", "NlError",
+ "NetshaperFamily", "DevlinkFamily", "GtpFamily", "PSPFamily",
+ "NlError",
"YnlFamily", "EthtoolFamily", "NetdevFamily", "RtnlFamily",
"NlctrlFamily", "RtnlAddrFamily", "RtnlRouteFamily", "Netlink"]
diff --git a/tools/testing/selftests/net/lib/py/ynl.py b/tools/testing/selftests/net/lib/py/ynl.py
index 08deff756f29..7edb74971023 100644
--- a/tools/testing/selftests/net/lib/py/ynl.py
+++ b/tools/testing/selftests/net/lib/py/ynl.py
@@ -31,7 +31,7 @@ __all__ = [
"NlError", "NlPolicy", "Netlink", "YnlFamily", "SPEC_PATH",
"EthtoolFamily", "RtnlFamily", "RtnlAddrFamily", "RtnlRouteFamily",
"NetdevFamily", "NetshaperFamily", "NlctrlFamily", "DevlinkFamily",
- "PSPFamily",
+ "GtpFamily", "PSPFamily",
]
#
@@ -85,3 +85,9 @@ class PSPFamily(YnlFamily):
def __init__(self, recv_size=0):
super().__init__((SPEC_PATH / Path('psp.yaml')).as_posix(),
schema='', recv_size=recv_size)
+
+
+class GtpFamily(YnlFamily):
+ def __init__(self, recv_size=0):
+ super().__init__((SPEC_PATH / Path('gtp.yaml')).as_posix(),
+ schema='', recv_size=recv_size)
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH net-next v5 2/3] netlink: specs: add genetlink-legacy spec for GTP
2026-10-12 2:47 ` [PATCH net-next v5 2/3] netlink: specs: add genetlink-legacy spec for GTP Anil Kaushik
@ 2026-10-13 2:48 ` netdev-bot+sashiko
0 siblings, 0 replies; 6+ messages in thread
From: netdev-bot+sashiko @ 2026-10-13 2:48 UTC (permalink / raw)
To: anilkaushikwireless
Cc: pablo, laforge, donald.hunter, kuba, davem, edumazet, pabeni,
horms, andrew+netdev, shuah, osmocom-net-gprs, netdev,
linux-kernel, linux-kselftest
Thank you for your contribution! Sashiko AI review found more severe
issue(s) in other patches of this series. This mail is only an FYI, in case
you want to address the nit picks below when you respin.
Low priority / nit picks for your consideration:
- [Low] include/uapi/linux/gtp.h defines `enum gtp_version { GTP_V0 = 0,
GTP_V1, }` for GTPA_VERSION values, and drivers/net/gtp.c compares…
- [Low] The `family` attribute doc in
Documentation/netlink/specs/gtp.yaml (line 96) reads "Address family…
--
netlink: specs: add genetlink-legacy spec for GTP
This commit adds a genetlink-legacy YAML spec for the existing GTP
generic netlink family. The spec covers the NEWPDP, DELPDP, GETPDP and
ECHOREQ commands, the GTPA_* attribute set and the "gtp" multicast group.
It also adds a CFLAGS_gtp entry to tools/net/ynl/Makefile.deps.
> diff --git a/Documentation/netlink/specs/gtp.yaml b/Documentation/netlink/specs/gtp.yaml
> new file mode 100644
> index 0000000000000..6a6b49ad2f067
> --- /dev/null
> +++ b/Documentation/netlink/specs/gtp.yaml
[ ... ]
> +attribute-sets:
> + -
> + name: gtp
> + name-prefix: gtpa-
> + attributes:
> + -
> + name: link
> + type: u32
> + doc: ifindex of the gtp netdevice the context is attached to.
> + -
> + name: version
> + type: u32
> + doc: GTP version of the context, 0 for GTPv0 or 1 for GTPv1-U.
[Severity: Low]
Should this attribute reference an enum? include/uapi/linux/gtp.h already
defines the values for GTPA_VERSION:
include/uapi/linux/gtp.h:
enum gtp_version {
GTP_V0 = 0,
GTP_V1,
};
drivers/net/gtp.c compares against these values, for example in
gtp_pdp_add() and gtp_genl_fill_info():
switch (pctx->gtp_version) {
case GTP_V0:
...
case GTP_V1:
The spec has no definitions section, so the valid values only appear in
the doc string. That means ynl clients see version as a raw integer and
cannot encode or decode it by name.
Other legacy specs reference their uapi enums like this, for example
fou.yaml uses "enum: encap-type". Would a definitions entry for
gtp-version plus an enum reference on this attribute work here?
[ ... ]
> + -
> + name: family
> + type: u8
> + doc: Address family (AF_INET or AF_INET6) of the context addresses.
[Severity: Low]
Is this description accurate? In drivers/net/gtp.c, GTPA_FAMILY only
selects the family of the mobile subscriber address, and it defaults to
AF_INET when the attribute is absent.
In gtp_pdp_add(), family only picks between GTPA_MS_ADDRESS and
GTPA_MS_ADDR6. The peer address is checked against the socket family
instead:
drivers/net/gtp.c:gtp_pdp_add() {
...
family = nla_get_u8_default(info->attrs[GTPA_FAMILY], AF_INET);
...
if ((info->attrs[GTPA_PEER_ADDRESS] &&
sk->sk_family == AF_INET6) ||
(info->attrs[GTPA_PEER_ADDR6] &&
sk->sk_family == AF_INET))
return ERR_PTR(-EAFNOSUPPORT);
switch (family) {
case AF_INET:
if (!info->attrs[GTPA_MS_ADDRESS] ||
...
}
The reply side uses the same split. gtp_genl_fill_info() picks the MS
attribute by pctx->af and the peer attribute by pctx->sk->sk_family:
drivers/net/gtp.c:gtp_genl_fill_info() {
...
nla_put_u8(skb, GTPA_FAMILY, pctx->af))
...
switch (pctx->af) {
case AF_INET:
if (nla_put_be32(skb, GTPA_MS_ADDRESS, pctx->ms.addr.s_addr))
...
switch (pctx->sk->sk_family) {
case AF_INET:
if (nla_put_be32(skb, GTPA_PEER_ADDRESS, pctx->peer.addr.s_addr))
...
}
As a result, a valid context with an IPv4 subscriber over IPv6 transport
reports family=AF_INET together with peer-addr6. "of the context
addresses" does not describe that case.
Could the doc say that family applies to the ms-address / ms-addr6
attribute only, and that it defaults to AF_INET when absent?
--
Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20261012024800.400616-1-anilkaushikwireless%40gmail.com
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH net-next v5 3/3] selftests: net: add a test for the gtp netlink family
2026-10-12 2:48 ` [PATCH net-next v5 3/3] selftests: net: add a test for the gtp netlink family Anil Kaushik
@ 2026-10-13 2:48 ` netdev-bot+sashiko
0 siblings, 0 replies; 6+ messages in thread
From: netdev-bot+sashiko @ 2026-10-13 2:48 UTC (permalink / raw)
To: anilkaushikwireless
Cc: pablo, laforge, donald.hunter, kuba, davem, edumazet, pabeni,
horms, andrew+netdev, shuah, osmocom-net-gprs, netdev,
linux-kernel, linux-kselftest
Thank you for your contribution! Sashiko AI review found 1 potential
issue(s) to consider.
Critical: 0 · High: 0 · Medium: 1 · Low: 0
If you believe none of the issues are legitimate, please reply to each
issue of Medium severity or higher and explain why the AI is wrong.
If any of them are legitimate and you plan to respin, please let patchwork
know by including "pw-bot: cr" as a separate line at the end of your reply
(one such reply per series is enough).
- [Medium] The test does not skip when the kernel lacks GTP support,
although the commit message says it will.
--
selftests: net: add a test for the gtp netlink family
This adds a Python selftest that uses the gtp ynl spec to exercise the gtp
generic netlink family. It creates a gtp device, then adds, dumps and
deletes PDP contexts by TEI and by MS address. It also adds a GtpFamily
ynl wrapper and registers the test.
> diff --git a/tools/testing/selftests/net/gtp.py b/tools/testing/selftests/net/gtp.py
> new file mode 100755
> index 0000000000000..199bc44091909
> --- /dev/null
> +++ b/tools/testing/selftests/net/gtp.py
[ ... ]
> +_NO_GTP_ERRORS = ("Operation not supported", "Garbage instead of arguments")
> +
> +
> +def _setup(ns):
[ ... ]
> + try:
> + ip("link add gtp0 type gtp role ggsn", ns=str(ns))
> + except CmdExitFailure as e:
> + # gtp.ko not available, or iproute2 without gtp support: any other
> + # failure to create the device is a real error.
> + if not any(msg in e.cmd.stderr for msg in _NO_GTP_ERRORS):
> + raise
> + raise KsftSkipEx("no gtp support (CONFIG_GTP, iproute2)") from e
[Severity: Medium]
Will this skip when the kernel has no GTP support? The commit message says
"The test is skipped when the kernel or iproute2 lack GTP support".
With CONFIG_GTP=n, or with gtp.ko not installed, request_module() for
rtnl-link-gtp finds nothing and ops stays NULL. The request then reaches
this branch in __rtnl_newlink() in net/core/rtnetlink.c:
if (!ops) {
NL_SET_ERR_MSG(extack, "Unknown device type");
return -EOPNOTSUPP;
}
iproute2 requests extended ACKs. When an extack message is present it
prints only "Error: Unknown device type." and returns early, so it never
prints the "RTNETLINK answers: Operation not supported" line.
Neither string in _NO_GTP_ERRORS matches that output. _setup() then
re-raises CmdExitFailure, and add_del_pdp, add_two_pdp and del_unknown_pdp
each report a failure instead of a skip.
The iproute2-without-gtp case ("Garbage instead of arguments") looks like
it is handled correctly. The "Operation not supported" string seems to
match only iproute2 builds without extack support.
Could "Unknown device type" be added to _NO_GTP_ERRORS? Another option is
to check whether the gtp link kind is available before creating the
device.
> + defer(ip, "link del gtp0", ns=str(ns))
> + ip("link set gtp0 up", ns=str(ns))
[ ... ]
--
Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20261012024800.400616-1-anilkaushikwireless%40gmail.com
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-10-13 2:48 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-10-12 2:47 [PATCH net-next v5 0/3] gtp: ynl spec for the GTP netlink family, a reply-command fix, and a selftest Anil Kaushik
2026-10-12 2:47 ` [PATCH net-next v5 1/3] gtp: set a valid genl command in PDP context get and dump replies Anil Kaushik
2026-10-12 2:47 ` [PATCH net-next v5 2/3] netlink: specs: add genetlink-legacy spec for GTP Anil Kaushik
2026-10-13 2:48 ` netdev-bot+sashiko
2026-10-12 2:48 ` [PATCH net-next v5 3/3] selftests: net: add a test for the gtp netlink family Anil Kaushik
2026-10-13 2:48 ` netdev-bot+sashiko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox