Hi Pravin,
A couple more comments around the GTP_METADATA bits:
On 23/01/2021 20:59, Jonas Bonn wrote:
From: Pravin B Shelar <pbshe...@fb.com>
This patch adds support for flow based tunneling, allowing to send and
receive GTP tunneled packets via the (lightweight) tunnel metadata
mechanism. This would allow integration with OVS and eBPF using flow
based tunneling APIs.
The mechanism used here is to get the required GTP tunnel parameters
from the tunnel metadata instead of looking up a pre-configured PDP
context. The tunnel metadata contains the necessary information for
creating the GTP header.
Signed-off-by: Jonas Bonn <jo...@norrbonn.se>
---
drivers/net/gtp.c | 160 +++++++++++++++++++++++++----
include/uapi/linux/gtp.h | 12 +++
include/uapi/linux/if_tunnel.h | 1 +
tools/include/uapi/linux/if_link.h | 1 +
4 files changed, 156 insertions(+), 18 deletions(-)
<...>
+static int gtp_set_tun_dst(struct pdp_ctx *pctx, struct sk_buff *skb,
+ unsigned int hdrlen)
+{
+ struct metadata_dst *tun_dst;
+ struct gtp1_header *gtp1;
+ int opts_len = 0;
+ __be64 tid;
+
+ gtp1 = (struct gtp1_header *)(skb->data + sizeof(struct udphdr));
+
+ tid = key32_to_tunnel_id(gtp1->tid);
+
+ if (unlikely(gtp1->flags & GTP1_F_MASK))
+ opts_len = sizeof(struct gtpu_metadata);
So if there are GTP flags sets, you're saying that this no longer a
T-PDU but something else. That's wrong... the flags indicate the
presence of extensions to the GTP header itself.
+
+ tun_dst = udp_tun_rx_dst(skb,
+ pctx->sk->sk_family, TUNNEL_KEY, tid, opts_len);
+ if (!tun_dst) {
+ netdev_dbg(pctx->dev, "Failed to allocate tun_dst");
+ goto err;
+ }
+
+ netdev_dbg(pctx->dev, "attaching metadata_dst to skb, gtp ver %d hdrlen
%d\n",
+ pctx->gtp_version, hdrlen);
+ if (unlikely(opts_len)) {
+ struct gtpu_metadata *opts;
+
+ opts = ip_tunnel_info_opts(&tun_dst->u.tun_info);
+ opts->ver = GTP_METADATA_V1;
+ opts->flags = gtp1->flags;
+ opts->type = gtp1->type;
+ netdev_dbg(pctx->dev, "recved control pkt: flag %x type: %d\n",
+ opts->flags, opts->type);
+ tun_dst->u.tun_info.key.tun_flags |= TUNNEL_GTPU_OPT;
+ tun_dst->u.tun_info.options_len = opts_len;
+ skb->protocol = htons(0xffff); /* Unknown */
It might be relevant to set protocol to unknown for 'end markers' (i.e.
gtp1->type == 0xfe), but not for everything that happens to have flag
bits set. 'flags' and 'type' are independent of each other and need to
handled as such.
/Jonas