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

Commit ed21b637 authored by John Hurley's avatar John Hurley Committed by David S. Miller
Browse files

nfp: flower: extract ipv4 udp tunnel ttl from route



Previously the ttl for ipv4 udp tunnels was set to the namespace default.
Modify this to attempt to extract the ttl from a full route lookup on the
tunnel destination. If this is not possible then resort to the default.

Signed-off-by: default avatarJohn Hurley <john.hurley@netronome.com>
Reviewed-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarSimon Horman <simon.horman@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ed8f2b52
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -236,9 +236,12 @@ nfp_fl_set_ipv4_udp_tun(struct nfp_fl_set_ipv4_udp_tun *set_tun,
	size_t act_size = sizeof(struct nfp_fl_set_ipv4_udp_tun);
	struct ip_tunnel_info *ip_tun = tcf_tunnel_info(action);
	u32 tmp_set_ip_tun_type_index = 0;
	struct flowi4 flow = {};
	/* Currently support one pre-tunnel so index is always 0. */
	int pretun_idx = 0;
	struct rtable *rt;
	struct net *net;
	int err;

	if (ip_tun->options_len)
		return -EOPNOTSUPP;
@@ -255,7 +258,21 @@ nfp_fl_set_ipv4_udp_tun(struct nfp_fl_set_ipv4_udp_tun *set_tun,

	set_tun->tun_type_index = cpu_to_be32(tmp_set_ip_tun_type_index);
	set_tun->tun_id = ip_tun->key.tun_id;

	/* Do a route lookup to determine ttl - if fails then use default.
	 * Note that CONFIG_INET is a requirement of CONFIG_NET_SWITCHDEV so
	 * must be defined here.
	 */
	flow.daddr = ip_tun->key.u.ipv4.dst;
	flow.flowi4_proto = IPPROTO_UDP;
	rt = ip_route_output_key(net, &flow);
	err = PTR_ERR_OR_ZERO(rt);
	if (!err) {
		set_tun->ttl = ip4_dst_hoplimit(&rt->dst);
		ip_rt_put(rt);
	} else {
		set_tun->ttl = net->ipv4.sysctl_ip_default_ttl;
	}

	/* Complete pre_tunnel action. */
	pre_tun->ipv4_dst = ip_tun->key.u.ipv4.dst;