compat: Backport ip_skb_dst_mtu().
[cascardo/ovs.git] / datapath / linux / compat / include / net / ip.h
1 #ifndef __NET_IP_WRAPPER_H
2 #define __NET_IP_WRAPPER_H 1
3
4 #include_next <net/ip.h>
5
6 #include <linux/version.h>
7
8 #ifndef HAVE_IP_IS_FRAGMENT
9 static inline bool ip_is_fragment(const struct iphdr *iph)
10 {
11         return (iph->frag_off & htons(IP_MF | IP_OFFSET)) != 0;
12 }
13 #endif
14
15 #ifndef HAVE_INET_GET_LOCAL_PORT_RANGE_USING_NET
16 static inline void rpl_inet_get_local_port_range(struct net *net, int *low,
17                                              int *high)
18 {
19         inet_get_local_port_range(low, high);
20 }
21 #define inet_get_local_port_range rpl_inet_get_local_port_range
22
23 #endif
24
25 /* IPv4 datagram length is stored into 16bit field (tot_len) */
26 #ifndef IP_MAX_MTU
27 #define IP_MAX_MTU      0xFFFFU
28 #endif
29
30 #ifndef HAVE_IP_SKB_DST_MTU
31 static inline bool rpl_ip_sk_use_pmtu(const struct sock *sk)
32 {
33         return inet_sk(sk)->pmtudisc < IP_PMTUDISC_PROBE;
34 }
35 #define ip_sk_use_pmtu rpl_ip_sk_use_pmtu
36
37 static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst,
38                                                     bool forwarding)
39 {
40 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)
41         struct net *net = dev_net(dst->dev);
42
43         if (net->ipv4.sysctl_ip_fwd_use_pmtu ||
44             dst_metric_locked(dst, RTAX_MTU) ||
45             !forwarding)
46                 return dst_mtu(dst);
47 #endif
48
49         return min(dst->dev->mtu, IP_MAX_MTU);
50 }
51
52 static inline unsigned int rpl_ip_skb_dst_mtu(const struct sk_buff *skb)
53 {
54         if (!skb->sk || ip_sk_use_pmtu(skb->sk)) {
55                 bool forwarding = IPCB(skb)->flags & IPSKB_FORWARDED;
56                 return ip_dst_mtu_maybe_forward(skb_dst(skb), forwarding);
57         } else {
58                 return min(skb_dst(skb)->dev->mtu, IP_MAX_MTU);
59         }
60 }
61 #define ip_skb_dst_mtu rpl_ip_skb_dst_mtu
62 #endif /* HAVE_IP_SKB_DST_MTU */
63
64 #endif