[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20240731172332.683815-9-tom@herbertland.com>
Date: Wed, 31 Jul 2024 10:23:28 -0700
From: Tom Herbert <tom@...bertland.com>
To: davem@...emloft.net,
kuba@...nel.org,
edumazet@...gle.com,
netdev@...r.kernel.org,
felipe@...anda.io
Cc: Tom Herbert <tom@...bertland.com>
Subject: [PATCH 08/12] flow_dissector: Parse foo-over-udp (FOU)
Parse FOU by getting the FOU protocol from the matching socket.
This includes moving "struct fou" and "fou_from_sock" to fou.h
Signed-off-by: Tom Herbert <tom@...bertland.com>
---
include/net/fou.h | 16 ++++++++++++++++
net/core/flow_dissector.c | 13 ++++++++++++-
net/ipv4/fou_core.c | 16 ----------------
3 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/include/net/fou.h b/include/net/fou.h
index 824eb4b231fd..8574767b91b6 100644
--- a/include/net/fou.h
+++ b/include/net/fou.h
@@ -17,6 +17,22 @@ int __fou_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
int __gue_build_header(struct sk_buff *skb, struct ip_tunnel_encap *e,
u8 *protocol, __be16 *sport, int type);
+struct fou {
+ struct socket *sock;
+ u8 protocol;
+ u8 flags;
+ __be16 port;
+ u8 family;
+ u16 type;
+ struct list_head list;
+ struct rcu_head rcu;
+};
+
+static inline struct fou *fou_from_sock(struct sock *sk)
+{
+ return sk->sk_user_data;
+}
+
int register_fou_bpf(void);
#endif
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
index 6ad45b09dda4..68906c4bb474 100644
--- a/net/core/flow_dissector.c
+++ b/net/core/flow_dissector.c
@@ -8,6 +8,7 @@
#include <linux/filter.h>
#include <net/dsa.h>
#include <net/dst_metadata.h>
+#include <net/fou.h>
#include <net/ip.h>
#include <net/ipv6.h>
#include <net/gre.h>
@@ -865,11 +866,11 @@ __skb_flow_dissect_udp(const struct sk_buff *skb, struct net *net,
int *p_nhoff, int hlen, __be16 *p_proto,
u8 *p_ip_proto, int bpoff, unsigned int flags)
{
+ __u8 encap_type, fou_protocol;
enum flow_dissect_ret ret;
const struct udphdr *udph;
struct udphdr _udph;
struct sock *sk;
- __u8 encap_type;
int nhoff;
if (!(flags & FLOW_DISSECTOR_F_PARSE_UDP_ENCAPS))
@@ -902,6 +903,9 @@ __skb_flow_dissect_udp(const struct sk_buff *skb, struct net *net,
}
encap_type = udp_sk(sk)->encap_type;
+ if (encap_type == UDP_ENCAP_FOU)
+ fou_protocol = fou_from_sock(sk)->protocol;
+
rcu_read_unlock();
break;
@@ -932,6 +936,9 @@ __skb_flow_dissect_udp(const struct sk_buff *skb, struct net *net,
}
encap_type = udp_sk(sk)->encap_type;
+ if (encap_type == UDP_ENCAP_FOU)
+ fou_protocol = fou_from_sock(sk)->protocol;
+
rcu_read_unlock();
break;
@@ -944,6 +951,10 @@ __skb_flow_dissect_udp(const struct sk_buff *skb, struct net *net,
ret = FLOW_DISSECT_RET_OUT_GOOD;
switch (encap_type) {
+ case UDP_ENCAP_FOU:
+ *p_ip_proto = fou_protocol;
+ ret = FLOW_DISSECT_RET_IPPROTO_AGAIN;
+ break;
case UDP_ENCAP_VXLAN:
case UDP_ENCAP_VXLAN_GPE:
ret = __skb_flow_dissect_vxlan(skb, flow_dissector,
diff --git a/net/ipv4/fou_core.c b/net/ipv4/fou_core.c
index 8241f762e45b..137eb80c56a2 100644
--- a/net/ipv4/fou_core.c
+++ b/net/ipv4/fou_core.c
@@ -21,17 +21,6 @@
#include "fou_nl.h"
-struct fou {
- struct socket *sock;
- u8 protocol;
- u8 flags;
- __be16 port;
- u8 family;
- u16 type;
- struct list_head list;
- struct rcu_head rcu;
-};
-
#define FOU_F_REMCSUM_NOPARTIAL BIT(0)
struct fou_cfg {
@@ -48,11 +37,6 @@ struct fou_net {
struct mutex fou_lock;
};
-static inline struct fou *fou_from_sock(struct sock *sk)
-{
- return sk->sk_user_data;
-}
-
static int fou_recv_pull(struct sk_buff *skb, struct fou *fou, size_t len)
{
/* Remove 'len' bytes from the packet (UDP header and
--
2.34.1
Powered by blists - more mailing lists