diff options
Diffstat (limited to 'net/ipv4/route.c')
-rw-r--r-- | net/ipv4/route.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 655506af47ca..41df5297a412 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -1711,6 +1711,34 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, u32 mtu) | |||
1711 | } | 1711 | } |
1712 | } | 1712 | } |
1713 | 1713 | ||
1714 | void ipv4_update_pmtu(struct sk_buff *skb, struct net *net, u32 mtu, | ||
1715 | int oif, u32 mark, u8 protocol, int flow_flags) | ||
1716 | { | ||
1717 | const struct iphdr *iph = (const struct iphdr *)skb->data; | ||
1718 | struct flowi4 fl4; | ||
1719 | struct rtable *rt; | ||
1720 | |||
1721 | flowi4_init_output(&fl4, oif, mark, RT_TOS(iph->tos), RT_SCOPE_UNIVERSE, | ||
1722 | protocol, flow_flags | FLOWI_FLAG_PRECOW_METRICS, | ||
1723 | iph->daddr, iph->saddr, 0, 0); | ||
1724 | rt = __ip_route_output_key(net, &fl4); | ||
1725 | if (!IS_ERR(rt)) { | ||
1726 | ip_rt_update_pmtu(&rt->dst, mtu); | ||
1727 | ip_rt_put(rt); | ||
1728 | } | ||
1729 | } | ||
1730 | EXPORT_SYMBOL_GPL(ipv4_update_pmtu); | ||
1731 | |||
1732 | void ipv4_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, u32 mtu) | ||
1733 | { | ||
1734 | const struct inet_sock *inet = inet_sk(sk); | ||
1735 | |||
1736 | return ipv4_update_pmtu(skb, sock_net(sk), mtu, | ||
1737 | sk->sk_bound_dev_if, sk->sk_mark, | ||
1738 | inet->hdrincl ? IPPROTO_RAW : sk->sk_protocol, | ||
1739 | inet_sk_flowi_flags(sk)); | ||
1740 | } | ||
1741 | EXPORT_SYMBOL_GPL(ipv4_sk_update_pmtu); | ||
1714 | 1742 | ||
1715 | static void ipv4_validate_peer(struct rtable *rt) | 1743 | static void ipv4_validate_peer(struct rtable *rt) |
1716 | { | 1744 | { |