From: Anil Kaushik <anilkaushikwireless@gmail.com>
To: Pablo Neira Ayuso <pablo@netfilter.org>,
Harald Welte <laforge@gnumonks.org>,
Donald Hunter <donald.hunter@gmail.com>,
Jakub Kicinski <kuba@kernel.org>
Cc: "David S . Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Paolo Abeni <pabeni@redhat.com>, Simon Horman <horms@kernel.org>,
netdev@vger.kernel.org, osmocom-net-gprs@lists.osmocom.org,
linux-kernel@vger.kernel.org,
Anil Kaushik <anilkaushikwireless@gmail.com>
Subject: [PATCH net-next v2 3/3] selftests: net: add a test for the gtp netlink family
Date: Thu, 8 Oct 2026 18:10:31 +0000 [thread overview]
Message-ID: <20261008181031.4129029-4-anilkaushikwireless@gmail.com> (raw)
In-Reply-To: <20261008181031.4129029-1-anilkaushikwireless@gmail.com>
Exercise the gtp generic netlink family through its ynl spec: create a
gtp device, add a PDP context with newpdp, check getpdp lists it and
delpdp removes it. Two more cases check that two contexts are dumped and
that deleting an unknown context fails.
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/gtp.py | 77 +++++++++++++++++++
.../testing/selftests/net/lib/py/__init__.py | 5 +-
tools/testing/selftests/net/lib/py/ynl.py | 8 +-
5 files changed, 89 insertions(+), 3 deletions(-)
create mode 100644 tools/testing/selftests/net/gtp.py
diff --git a/MAINTAINERS b/MAINTAINERS
index a6e43995e..8ac817a78 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 d4ca82fec..5366de878 100644
--- a/tools/testing/selftests/net/Makefile
+++ b/tools/testing/selftests/net/Makefile
@@ -44,6 +44,7 @@ TEST_PROGS := \
fin_ack_lat.sh \
fou_mcast_encap.sh \
fq_band_pktlimit.sh \
+ gtp.py \
gre_gso.sh \
gre_ipv6_lladdr.sh \
icmp.sh \
diff --git a/tools/testing/selftests/net/gtp.py b/tools/testing/selftests/net/gtp.py
new file mode 100644
index 000000000..984c626b7
--- /dev/null
+++ b/tools/testing/selftests/net/gtp.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0
+
+"""Tests for the gtp netlink family."""
+
+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
+
+
+def _add_gtp_dev(ns):
+ try:
+ ip("link add gtp0 type gtp role ggsn", ns=str(ns))
+ except CmdExitFailure:
+ raise KsftSkipEx("no gtp support (CONFIG_GTP, iproute2)")
+ defer(ip, "link del gtp0", ns=str(ns))
+ ip("link set gtp0 up", ns=str(ns))
+ return ip("-d link show gtp0", ns=str(ns), json=True)[0]["ifindex"]
+
+
+def _iteis(contexts):
+ return [c.get("i-tei") for c in contexts]
+
+
+def add_del_pdp(gtp, ns) -> None:
+ link = _add_gtp_dev(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 gtp.getpdp({}, dump=True) 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, "ms-address": "10.0.0.1"})
+ ksft_not_in(0x100, _iteis(gtp.getpdp({}, dump=True)))
+
+
+def add_two_pdp(gtp, ns) -> None:
+ link = _add_gtp_dev(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(gtp.getpdp({}, dump=True))
+ ksft_in(0x111, iteis)
+ ksft_in(0x112, iteis)
+
+
+def del_unknown_pdp(gtp, ns) -> None:
+ link = _add_gtp_dev(ns)
+ with ksft_raises(NlError):
+ gtp.delpdp({"link": link, "version": 1,
+ "i-tei": 0x999, "ms-address": "10.9.9.9"})
+
+
+def main() -> None:
+ with NetNS() as ns:
+ with NetNSEnter(str(ns)):
+ gtp = GtpFamily()
+ ksft_run([add_del_pdp, add_two_pdp, del_unknown_pdp], args=(gtp, 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 71df5880b..8d34f2659 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, PSPFamily, GtpFamily, 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", "PSPFamily", "GtpFamily",
+ "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 08deff756..492994812 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",
+ "PSPFamily", "GtpFamily",
]
#
@@ -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
next prev parent reply other threads:[~2026-10-08 18:11 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-08 18:10 [PATCH net-next v2 0/3] gtp: ynl spec for the GTP netlink family, a reply-command fix, and a selftest Anil Kaushik
2026-10-08 18:10 ` [PATCH net-next v2 1/3] gtp: set a valid genl command in PDP context get and dump replies Anil Kaushik
2026-10-08 18:10 ` [PATCH net-next v2 2/3] netlink: specs: add genetlink-legacy spec for GTP Anil Kaushik
2026-10-08 18:10 ` Anil Kaushik [this message]
2026-10-09 0:11 ` [PATCH net-next v2 3/3] selftests: net: add a test for the gtp netlink family Jakub Kicinski
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=20261008181031.4129029-4-anilkaushikwireless@gmail.com \
--to=anilkaushikwireless@gmail.com \
--cc=davem@davemloft.net \
--cc=donald.hunter@gmail.com \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=laforge@gnumonks.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=osmocom-net-gprs@lists.osmocom.org \
--cc=pabeni@redhat.com \
--cc=pablo@netfilter.org \
/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