[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <a9246112-fd2d-1042-4eb7-12a3096c6923@norrbonn.se>
Date: Sun, 24 Jan 2021 15:27:47 +0100
From: Jonas Bonn <jonas@...rbonn.se>
To: laforge@...monks.org, netdev@...r.kernel.org, pbshelar@...com,
kuba@...nel.org
Cc: pablo@...filter.org
Subject: Re: [RFC PATCH 14/16] gtp: add support for flow based tunneling
Hi Pravin,
A couple more comments around the GTP_METADATA bits:
On 23/01/2021 20:59, Jonas Bonn wrote:
> From: Pravin B Shelar <pbshelar@...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 <jonas@...rbonn.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
Powered by blists - more mailing lists