OSDN Git Service

net/ipv4: Add helper to return path MTU based on fib result
authorDavid Ahern <dsahern@gmail.com>
Mon, 21 May 2018 16:08:13 +0000 (09:08 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 22 May 2018 08:51:09 +0000 (10:51 +0200)
Determine path MTU from a FIB lookup result. Logic is a distillation of
ip_dst_mtu_maybe_forward.

Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
include/net/ip_fib.h
net/ipv4/route.c

index 81d0f21..69c91d1 100644 (file)
@@ -449,4 +449,6 @@ static inline void fib_proc_exit(struct net *net)
 }
 #endif
 
+u32 ip_mtu_from_fib_result(struct fib_result *res, __be32 daddr);
+
 #endif  /* _NET_FIB_H */
index 29268ef..ac3b22b 100644 (file)
@@ -1352,6 +1352,37 @@ static struct fib_nh_exception *find_exception(struct fib_nh *nh, __be32 daddr)
        return NULL;
 }
 
+/* MTU selection:
+ * 1. mtu on route is locked - use it
+ * 2. mtu from nexthop exception
+ * 3. mtu from egress device
+ */
+
+u32 ip_mtu_from_fib_result(struct fib_result *res, __be32 daddr)
+{
+       struct fib_info *fi = res->fi;
+       struct fib_nh *nh = &fi->fib_nh[res->nh_sel];
+       struct net_device *dev = nh->nh_dev;
+       u32 mtu = 0;
+
+       if (dev_net(dev)->ipv4.sysctl_ip_fwd_use_pmtu ||
+           fi->fib_metrics->metrics[RTAX_LOCK - 1] & (1 << RTAX_MTU))
+               mtu = fi->fib_mtu;
+
+       if (likely(!mtu)) {
+               struct fib_nh_exception *fnhe;
+
+               fnhe = find_exception(nh, daddr);
+               if (fnhe && !time_after_eq(jiffies, fnhe->fnhe_expires))
+                       mtu = fnhe->fnhe_pmtu;
+       }
+
+       if (likely(!mtu))
+               mtu = min(READ_ONCE(dev->mtu), IP_MAX_MTU);
+
+       return mtu - lwtunnel_headroom(nh->nh_lwtstate, mtu);
+}
+
 static bool rt_bind_exception(struct rtable *rt, struct fib_nh_exception *fnhe,
                              __be32 daddr, const bool do_cache)
 {