Skip to content

Commit cfda453

Browse files
committed
compat: Backport ip_skb_dst_mtu().
>From upstream f87c10a8aa1e ("ipv4: introduce ip_dst_mtu_maybe_forward and protect forwarding path against pmtu spoofing") Signed-off-by: Joe Stringer <joestringer@nicira.com> Acked-by: Pravin B Shelar <pshelar@nicira.com>
1 parent 3f506f0 commit cfda453

2 files changed

Lines changed: 40 additions & 0 deletions

File tree

acinclude.m4

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [
348348
OVS_GREP_IFELSE([$KSRC/include/net/ip.h], [inet_get_local_port_range.*net],
349349
[OVS_DEFINE([HAVE_INET_GET_LOCAL_PORT_RANGE_USING_NET])])
350350
OVS_GREP_IFELSE([$KSRC/include/net/ip.h], [ip_is_fragment])
351+
OVS_GREP_IFELSE([$KSRC/include/net/ip.h], [ip_skb_dst_mtu])
351352
OVS_GREP_IFELSE([$KSRC/include/net/dst_metadata.h], [metadata_dst])
352353
353354
OVS_GREP_IFELSE([$KSRC/include/linux/net.h], [sock_create_kern.*net],

datapath/linux/compat/include/net/ip.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,43 @@ static inline void rpl_inet_get_local_port_range(struct net *net, int *low,
2222

2323
#endif
2424

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+
2564
#endif

0 commit comments

Comments
 (0)