nfp: flower: set ip tunnel ttl from encap action
authorJohn Hurley <john.hurley@netronome.com>
Tue, 7 Aug 2018 15:35:58 +0000 (17:35 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 7 Aug 2018 19:22:14 +0000 (12:22 -0700)
The TTL for encapsulating headers in IPv4 UDP tunnels is taken from a
route lookup. Modify this to first check if a user has specified a TTL to
be used in the TC action.

Signed-off-by: John Hurley <john.hurley@netronome.com>
Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/flower/action.c

index e56b815a8dc6c81729083eb7abe717402a6a347b..a79d078ab3e82983c81ff8c45d028ab4e8cf0451 100644 (file)
@@ -238,18 +238,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;
 
-       net = dev_net(netdev);
-
        set_tun->head.jump_id = NFP_FL_ACTION_OPCODE_SET_IPV4_TUNNEL;
        set_tun->head.len_lw = act_size >> NFP_FL_LW_SIZ;
 
@@ -261,19 +255,28 @@ 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);
+       if (ip_tun->key.ttl) {
+               set_tun->ttl = ip_tun->key.ttl;
        } else {
-               set_tun->ttl = net->ipv4.sysctl_ip_default_ttl;
+               struct net *net = dev_net(netdev);
+               struct flowi4 flow = {};
+               struct rtable *rt;
+               int err;
+
+               /* 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;
+               }
        }
 
        set_tun->tos = ip_tun->key.tos;