mctp: Add flow extension to skb
authorJeremy Kerr <jk@codeconstruct.com.au>
Fri, 29 Oct 2021 03:01:44 +0000 (11:01 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 29 Oct 2021 12:23:51 +0000 (13:23 +0100)
This change adds a new skb extension for MCTP, to represent a
request/response flow.

The intention is to use this in a later change to allow i2c controllers
to correctly configure a multiplexer over a flow.

Since we have a cleanup function in the core path (if an extension is
present), we'll need to make CONFIG_MCTP a bool, rather than a tristate.

Includes a fix for a build warning with clang:
Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Jeremy Kerr <jk@codeconstruct.com.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h
include/net/mctp.h
net/core/skbuff.c
net/mctp/Kconfig

index cb96f1e6460c5fced5553d15a1786f894c353c9b..0bd6520329f6fd04420c9e1772277b948931ac99 100644 (file)
@@ -4243,6 +4243,9 @@ enum skb_ext_id {
 #endif
 #if IS_ENABLED(CONFIG_MPTCP)
        SKB_EXT_MPTCP,
+#endif
+#if IS_ENABLED(CONFIG_MCTP_FLOWS)
+       SKB_EXT_MCTP,
 #endif
        SKB_EXT_NUM, /* must be last */
 };
index 23bec708f4c75b432cdb3d118fc777c551096c46..7a5ba801703c52c272cda3e51b8670811b0cc3f7 100644 (file)
@@ -189,6 +189,13 @@ static inline struct mctp_skb_cb *mctp_cb(struct sk_buff *skb)
        return (void *)(skb->cb);
 }
 
+/* If CONFIG_MCTP_FLOWS, we may add one of these as a SKB extension,
+ * indicating the flow to the device driver.
+ */
+struct mctp_flow {
+       struct mctp_sk_key *key;
+};
+
 /* Route definition.
  *
  * These are held in the pernet->mctp.routes list, with RCU protection for
index 09b8cf8ab23479e4582bc8e6252839cc1a1f74a8..67a9188d8a49c83ce722f68d3064e9ba0545ea37 100644 (file)
@@ -70,6 +70,7 @@
 #include <net/xfrm.h>
 #include <net/mpls.h>
 #include <net/mptcp.h>
+#include <net/mctp.h>
 #include <net/page_pool.h>
 
 #include <linux/uaccess.h>
@@ -4440,6 +4441,9 @@ static const u8 skb_ext_type_len[] = {
 #if IS_ENABLED(CONFIG_MPTCP)
        [SKB_EXT_MPTCP] = SKB_EXT_CHUNKSIZEOF(struct mptcp_ext),
 #endif
+#if IS_ENABLED(CONFIG_MCTP_FLOWS)
+       [SKB_EXT_MCTP] = SKB_EXT_CHUNKSIZEOF(struct mctp_flow),
+#endif
 };
 
 static __always_inline unsigned int skb_ext_total_length(void)
@@ -4456,6 +4460,9 @@ static __always_inline unsigned int skb_ext_total_length(void)
 #endif
 #if IS_ENABLED(CONFIG_MPTCP)
                skb_ext_type_len[SKB_EXT_MPTCP] +
+#endif
+#if IS_ENABLED(CONFIG_MCTP_FLOWS)
+               skb_ext_type_len[SKB_EXT_MCTP] +
 #endif
                0;
 }
@@ -6529,6 +6536,14 @@ static void skb_ext_put_sp(struct sec_path *sp)
 }
 #endif
 
+#ifdef CONFIG_MCTP_FLOWS
+static void skb_ext_put_mctp(struct mctp_flow *flow)
+{
+       if (flow->key)
+               mctp_key_unref(flow->key);
+}
+#endif
+
 void __skb_ext_del(struct sk_buff *skb, enum skb_ext_id id)
 {
        struct skb_ext *ext = skb->extensions;
@@ -6564,6 +6579,10 @@ free_now:
        if (__skb_ext_exist(ext, SKB_EXT_SEC_PATH))
                skb_ext_put_sp(skb_ext_get_ptr(ext, SKB_EXT_SEC_PATH));
 #endif
+#ifdef CONFIG_MCTP_FLOWS
+       if (__skb_ext_exist(ext, SKB_EXT_MCTP))
+               skb_ext_put_mctp(skb_ext_get_ptr(ext, SKB_EXT_MCTP));
+#endif
 
        kmem_cache_free(skbuff_ext_cache, ext);
 }
index 868c92272cbd3032599a362e92a7efc504e3ade0..3a5c0e70da776cbdde4ef267576c277383074ee1 100644 (file)
@@ -1,7 +1,7 @@
 
 menuconfig MCTP
        depends on NET
-       tristate "MCTP core protocol support"
+       bool "MCTP core protocol support"
        help
          Management Component Transport Protocol (MCTP) is an in-system
          protocol for communicating between management controllers and
@@ -16,3 +16,8 @@ config MCTP_TEST
         bool "MCTP core tests" if !KUNIT_ALL_TESTS
         depends on MCTP=y && KUNIT=y
         default KUNIT_ALL_TESTS
+
+config MCTP_FLOWS
+       bool
+       depends on MCTP
+       select SKB_EXTENSIONS