1 #ifndef __NET_IP_WRAPPER_H
2 #define __NET_IP_WRAPPER_H 1
4 #include_next <net/ip.h>
6 #include <linux/version.h>
8 #ifndef HAVE_IP_IS_FRAGMENT
9 static inline bool ip_is_fragment(const struct iphdr *iph)
11 return (iph->frag_off & htons(IP_MF | IP_OFFSET)) != 0;
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,
19 inet_get_local_port_range(low, high);
21 #define inet_get_local_port_range rpl_inet_get_local_port_range
25 /* IPv4 datagram length is stored into 16bit field (tot_len) */
27 #define IP_MAX_MTU 0xFFFFU
30 #ifndef HAVE_IP_SKB_DST_MTU
31 static inline bool rpl_ip_sk_use_pmtu(const struct sock *sk)
33 return inet_sk(sk)->pmtudisc < IP_PMTUDISC_PROBE;
35 #define ip_sk_use_pmtu rpl_ip_sk_use_pmtu
37 static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst,
40 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)
41 struct net *net = dev_net(dst->dev);
43 if (net->ipv4.sysctl_ip_fwd_use_pmtu ||
44 dst_metric_locked(dst, RTAX_MTU) ||
49 return min(dst->dev->mtu, IP_MAX_MTU);
52 static inline unsigned int rpl_ip_skb_dst_mtu(const struct sk_buff *skb)
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);
58 return min(skb_dst(skb)->dev->mtu, IP_MAX_MTU);
61 #define ip_skb_dst_mtu rpl_ip_skb_dst_mtu
62 #endif /* HAVE_IP_SKB_DST_MTU */