Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4024fcf7 authored by Daniel Borkmann's avatar Daniel Borkmann Committed by David S. Miller
Browse files

vxlan: fix missing options_len update on RX with collect metadata



When signalling to metadata consumers that the metadata_dst entry
carries additional GBP extension data for vxlan (TUNNEL_VXLAN_OPT),
the dst's vxlan_metadata information is populated, but options_len
is left to zero. F.e. in ovs, ovs_flow_key_extract() checks for
options_len before extracting the data through ip_tunnel_info_opts_get().

Geneve uses ip_tunnel_info_opts_set() helper in receive path, which
sets options_len internally, vxlan however uses ip_tunnel_info_opts(),
so when filling vxlan_metadata, we do need to update options_len.

Fixes: 4c222798 ("ip-tunnel: Use API to access tunnel metadata options.")
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Acked-by: default avatarThomas Graf <tgraf@suug.ch>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 42a67c9b
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -1308,8 +1308,10 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
		gbp = (struct vxlanhdr_gbp *)vxh;
		gbp = (struct vxlanhdr_gbp *)vxh;
		md->gbp = ntohs(gbp->policy_id);
		md->gbp = ntohs(gbp->policy_id);


		if (tun_dst)
		if (tun_dst) {
			tun_dst->u.tun_info.key.tun_flags |= TUNNEL_VXLAN_OPT;
			tun_dst->u.tun_info.key.tun_flags |= TUNNEL_VXLAN_OPT;
			tun_dst->u.tun_info.options_len = sizeof(*md);
		}


		if (gbp->dont_learn)
		if (gbp->dont_learn)
			md->gbp |= VXLAN_GBP_DONT_LEARN;
			md->gbp |= VXLAN_GBP_DONT_LEARN;