netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/3] multicast event support for ioam6
@ 2024-02-20 19:44 Justin Iurman
  2024-02-20 19:44 ` [PATCH net-next 1/3] uapi: ioam6: API for netlink multicast events Justin Iurman
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Justin Iurman @ 2024-02-20 19:44 UTC (permalink / raw)
  To: netdev; +Cc: davem, dsahern, edumazet, kuba, pabeni, linux-kernel,
	justin.iurman

Add generic netlink multicast event support to ioam6 as another solution
to share IOAM data with user space. The other one being via IPv6 raw
sockets combined with ancillary data. This patchset focuses on the IOAM
Pre-allocated Trace (the only Option-Type currently supported), and so
on IOAM "trace" events. See an example of a consumer here [1].

  [1] https://github.com/Advanced-Observability/ioam-agent-python/blob/netlink_event/ioam-agent.py

Suggested-By: Paolo Abeni <pabeni@redhat.com>

Justin Iurman (3):
  uapi: ioam6: API for netlink multicast events
  ioam6: multicast event
  net: exthdrs: ioam6: send trace event

 include/net/ioam6.h             |  4 +++
 include/uapi/linux/ioam6_genl.h | 20 +++++++++++
 net/ipv6/exthdrs.c              |  5 +++
 net/ipv6/ioam6.c                | 61 +++++++++++++++++++++++++++++++++
 4 files changed, 90 insertions(+)


base-commit: a6e0cb150c514efba4aaba4069927de43d80bb59
-- 
2.34.1


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

* [PATCH net-next 1/3] uapi: ioam6: API for netlink multicast events
  2024-02-20 19:44 [PATCH net-next 0/3] multicast event support for ioam6 Justin Iurman
@ 2024-02-20 19:44 ` Justin Iurman
  2024-02-20 19:44 ` [PATCH net-next 2/3] ioam6: multicast event Justin Iurman
  2024-02-20 19:44 ` [PATCH net-next 3/3] net: exthdrs: ioam6: send trace event Justin Iurman
  2 siblings, 0 replies; 5+ messages in thread
From: Justin Iurman @ 2024-02-20 19:44 UTC (permalink / raw)
  To: netdev; +Cc: davem, dsahern, edumazet, kuba, pabeni, linux-kernel,
	justin.iurman

Add new api to support ioam6 events for generic netlink multicast. A
first "trace" event is added to the list of ioam6 events, which will
represent an IOAM Trace. It provides another solution to share IOAM data
with user space (an alternative to IPv6 raw sockets combined with
ancillary data).

Signed-off-by: Justin Iurman <justin.iurman@uliege.be>
---
 include/uapi/linux/ioam6_genl.h | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/include/uapi/linux/ioam6_genl.h b/include/uapi/linux/ioam6_genl.h
index ca4b22833754..1733fbc51fb5 100644
--- a/include/uapi/linux/ioam6_genl.h
+++ b/include/uapi/linux/ioam6_genl.h
@@ -49,4 +49,24 @@ enum {
 
 #define IOAM6_CMD_MAX (__IOAM6_CMD_MAX - 1)
 
+#define IOAM6_GENL_EV_GRP_NAME "ioam6_events"
+
+enum ioam6_event_type {
+	IOAM6_EVENT_UNSPEC,
+	IOAM6_EVENT_TRACE,
+};
+
+enum ioam6_event_attr {
+	IOAM6_EVENT_ATTR_UNSPEC,
+
+	IOAM6_EVENT_ATTR_TRACE_NAMESPACE,	/* u16 */
+	IOAM6_EVENT_ATTR_TRACE_NODELEN,		/* u8 */
+	IOAM6_EVENT_ATTR_TRACE_TYPE,		/* u32 */
+	IOAM6_EVENT_ATTR_TRACE_DATA,		/* Binary */
+
+	__IOAM6_EVENT_ATTR_MAX
+};
+
+#define IOAM6_EVENT_ATTR_MAX (__IOAM6_EVENT_ATTR_MAX - 1)
+
 #endif /* _UAPI_LINUX_IOAM6_GENL_H */
-- 
2.34.1


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

* [PATCH net-next 2/3] ioam6: multicast event
  2024-02-20 19:44 [PATCH net-next 0/3] multicast event support for ioam6 Justin Iurman
  2024-02-20 19:44 ` [PATCH net-next 1/3] uapi: ioam6: API for netlink multicast events Justin Iurman
@ 2024-02-20 19:44 ` Justin Iurman
  2024-02-21 14:18   ` kernel test robot
  2024-02-20 19:44 ` [PATCH net-next 3/3] net: exthdrs: ioam6: send trace event Justin Iurman
  2 siblings, 1 reply; 5+ messages in thread
From: Justin Iurman @ 2024-02-20 19:44 UTC (permalink / raw)
  To: netdev; +Cc: davem, dsahern, edumazet, kuba, pabeni, linux-kernel,
	justin.iurman

Add a multicast group to the ioam6 generic netlink family and provide
ioam6_event() to send an ioam6 event to the multicast group.

Signed-off-by: Justin Iurman <justin.iurman@uliege.be>
---
 include/net/ioam6.h |  4 +++
 net/ipv6/ioam6.c    | 61 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 65 insertions(+)

diff --git a/include/net/ioam6.h b/include/net/ioam6.h
index 781d2d8b2f29..2cbbee6e806a 100644
--- a/include/net/ioam6.h
+++ b/include/net/ioam6.h
@@ -12,6 +12,7 @@
 #include <linux/net.h>
 #include <linux/ipv6.h>
 #include <linux/ioam6.h>
+#include <linux/ioam6_genl.h>
 #include <linux/rhashtable-types.h>
 
 struct ioam6_namespace {
@@ -65,4 +66,7 @@ void ioam6_exit(void);
 int ioam6_iptunnel_init(void);
 void ioam6_iptunnel_exit(void);
 
+void ioam6_event(enum ioam6_event_type type, struct net *net, gfp_t gfp,
+		 void *opt, unsigned int opt_len);
+
 #endif /* _NET_IOAM6_H */
diff --git a/net/ipv6/ioam6.c b/net/ipv6/ioam6.c
index 571f0e4d9cf3..d06a406658f6 100644
--- a/net/ipv6/ioam6.c
+++ b/net/ipv6/ioam6.c
@@ -612,6 +612,65 @@ static const struct genl_ops ioam6_genl_ops[] = {
 	},
 };
 
+#define IOAM6_GENL_EV_GRP_OFFSET 0
+
+static const struct genl_multicast_group ioam6_mcgrps[] = {
+	[IOAM6_GENL_EV_GRP_OFFSET] = { .name = IOAM6_GENL_EV_GRP_NAME,
+				       .flags = GENL_MCAST_CAP_NET_ADMIN },
+};
+
+static int ioam6_event_put_trace(struct sk_buff *skb,
+				 struct ioam6_trace_hdr *trace,
+				 unsigned int trace_len)
+{
+	if (nla_put_u16(skb, IOAM6_EVENT_ATTR_TRACE_NAMESPACE,
+			be16_to_cpu(trace->namespace_id)) ||
+	    nla_put_u8(skb, IOAM6_EVENT_ATTR_TRACE_NODELEN, trace->nodelen) ||
+	    nla_put_u32(skb, IOAM6_EVENT_ATTR_TRACE_TYPE,
+			be32_to_cpu(trace->type_be32)) ||
+	    nla_put(skb, IOAM6_EVENT_ATTR_TRACE_DATA,
+		    trace_len - sizeof(struct ioam6_trace_hdr) - trace->remlen*4,
+		    trace->data + trace->remlen*4))
+		return 1;
+
+	return 0;
+}
+
+void ioam6_event(enum ioam6_event_type type, struct net *net, gfp_t gfp,
+		 void *opt, unsigned int opt_len)
+{
+	struct nlmsghdr *nlh;
+	struct sk_buff *skb;
+
+	if (!genl_has_listeners(&ioam6_genl_family, net,
+				IOAM6_GENL_EV_GRP_OFFSET))
+		return;
+
+	skb = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
+	if (!skb)
+		return;
+
+	nlh = genlmsg_put(skb, 0, 0, &ioam6_genl_family, 0, type);
+	if (!nlh)
+		goto nla_put_failure;
+
+	switch (type) {
+	case IOAM6_EVENT_TRACE:
+		if (ioam6_event_put_trace(skb, (struct ioam6_trace_hdr *)opt,
+					  opt_len))
+			goto nla_put_failure;
+		break;
+	}
+
+	genlmsg_end(skb, nlh);
+	genlmsg_multicast_netns(&ioam6_genl_family, net, skb, 0,
+				IOAM6_GENL_EV_GRP_OFFSET, gfp);
+	return;
+
+nla_put_failure:
+	nlmsg_free(skb);
+}
+
 static struct genl_family ioam6_genl_family __ro_after_init = {
 	.name		= IOAM6_GENL_NAME,
 	.version	= IOAM6_GENL_VERSION,
@@ -620,6 +679,8 @@ static struct genl_family ioam6_genl_family __ro_after_init = {
 	.ops		= ioam6_genl_ops,
 	.n_ops		= ARRAY_SIZE(ioam6_genl_ops),
 	.resv_start_op	= IOAM6_CMD_NS_SET_SCHEMA + 1,
+	.mcgrps		= ioam6_mcgrps,
+	.n_mcgrps	= ARRAY_SIZE(ioam6_mcgrps),
 	.module		= THIS_MODULE,
 };
 
-- 
2.34.1


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

* [PATCH net-next 3/3] net: exthdrs: ioam6: send trace event
  2024-02-20 19:44 [PATCH net-next 0/3] multicast event support for ioam6 Justin Iurman
  2024-02-20 19:44 ` [PATCH net-next 1/3] uapi: ioam6: API for netlink multicast events Justin Iurman
  2024-02-20 19:44 ` [PATCH net-next 2/3] ioam6: multicast event Justin Iurman
@ 2024-02-20 19:44 ` Justin Iurman
  2 siblings, 0 replies; 5+ messages in thread
From: Justin Iurman @ 2024-02-20 19:44 UTC (permalink / raw)
  To: netdev; +Cc: davem, dsahern, edumazet, kuba, pabeni, linux-kernel,
	justin.iurman

If we're processing an IOAM Pre-allocated Trace Option-Type (the only
one supported currently), and if we're the destination, then send the
trace as an ioam6 event to the multicast group. This way, user space
apps will be able to collect IOAM data (for a trace, it only makes sense
to send events if we're the destination).

Signed-off-by: Justin Iurman <justin.iurman@uliege.be>
---
 net/ipv6/exthdrs.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
index 4952ae792450..d1f96a28e190 100644
--- a/net/ipv6/exthdrs.c
+++ b/net/ipv6/exthdrs.c
@@ -50,6 +50,7 @@
 #endif
 #include <net/rpl.h>
 #include <linux/ioam6.h>
+#include <linux/ioam6_genl.h>
 #include <net/ioam6.h>
 #include <net/dst_metadata.h>
 
@@ -944,6 +945,10 @@ static bool ipv6_hop_ioam(struct sk_buff *skb, int optoff)
 			ip6_route_input(skb);
 
 		ioam6_fill_trace_data(skb, ns, trace, true);
+
+		if (skb_dst(skb)->dev->flags & IFF_LOOPBACK)
+			ioam6_event(IOAM6_EVENT_TRACE, dev_net(skb->dev),
+				    GFP_ATOMIC, (void *)trace, hdr->opt_len-2);
 		break;
 	default:
 		break;
-- 
2.34.1


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

* Re: [PATCH net-next 2/3] ioam6: multicast event
  2024-02-20 19:44 ` [PATCH net-next 2/3] ioam6: multicast event Justin Iurman
@ 2024-02-21 14:18   ` kernel test robot
  0 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2024-02-21 14:18 UTC (permalink / raw)
  To: Justin Iurman, netdev
  Cc: oe-kbuild-all, davem, dsahern, edumazet, kuba, pabeni,
	linux-kernel, justin.iurman

Hi Justin,

kernel test robot noticed the following build warnings:

[auto build test WARNING on a6e0cb150c514efba4aaba4069927de43d80bb59]

url:    https://github.com/intel-lab-lkp/linux/commits/Justin-Iurman/uapi-ioam6-API-for-netlink-multicast-events/20240221-034623
base:   a6e0cb150c514efba4aaba4069927de43d80bb59
patch link:    https://lore.kernel.org/r/20240220194444.36127-3-justin.iurman%40uliege.be
patch subject: [PATCH net-next 2/3] ioam6: multicast event
config: parisc-defconfig (https://download.01.org/0day-ci/archive/20240221/202402212253.mfysd5E1-lkp@intel.com/config)
compiler: hppa-linux-gcc (GCC) 13.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240221/202402212253.mfysd5E1-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202402212253.mfysd5E1-lkp@intel.com/

All warnings (new ones prefixed by >>):

   net/ipv6/ioam6.c: In function 'ioam6_event':
>> net/ipv6/ioam6.c:657:9: warning: enumeration value 'IOAM6_EVENT_UNSPEC' not handled in switch [-Wswitch]
     657 |         switch (type) {
         |         ^~~~~~


vim +/IOAM6_EVENT_UNSPEC +657 net/ipv6/ioam6.c

   638	
   639	void ioam6_event(enum ioam6_event_type type, struct net *net, gfp_t gfp,
   640			 void *opt, unsigned int opt_len)
   641	{
   642		struct nlmsghdr *nlh;
   643		struct sk_buff *skb;
   644	
   645		if (!genl_has_listeners(&ioam6_genl_family, net,
   646					IOAM6_GENL_EV_GRP_OFFSET))
   647			return;
   648	
   649		skb = nlmsg_new(NLMSG_DEFAULT_SIZE, gfp);
   650		if (!skb)
   651			return;
   652	
   653		nlh = genlmsg_put(skb, 0, 0, &ioam6_genl_family, 0, type);
   654		if (!nlh)
   655			goto nla_put_failure;
   656	
 > 657		switch (type) {
   658		case IOAM6_EVENT_TRACE:
   659			if (ioam6_event_put_trace(skb, (struct ioam6_trace_hdr *)opt,
   660						  opt_len))
   661				goto nla_put_failure;
   662			break;
   663		}
   664	
   665		genlmsg_end(skb, nlh);
   666		genlmsg_multicast_netns(&ioam6_genl_family, net, skb, 0,
   667					IOAM6_GENL_EV_GRP_OFFSET, gfp);
   668		return;
   669	
   670	nla_put_failure:
   671		nlmsg_free(skb);
   672	}
   673	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

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

end of thread, other threads:[~2024-02-21 14:19 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-20 19:44 [PATCH net-next 0/3] multicast event support for ioam6 Justin Iurman
2024-02-20 19:44 ` [PATCH net-next 1/3] uapi: ioam6: API for netlink multicast events Justin Iurman
2024-02-20 19:44 ` [PATCH net-next 2/3] ioam6: multicast event Justin Iurman
2024-02-21 14:18   ` kernel test robot
2024-02-20 19:44 ` [PATCH net-next 3/3] net: exthdrs: ioam6: send trace event Justin Iurman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).