net: Fix IPv6 PMTU disc. w/ asymmetric routes
Signed-off-by: Maciej Żenczykowski <maze@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
173e79fb70
commit
ae878ae280
1 changed files with 24 additions and 4 deletions
|
@ -1556,14 +1556,13 @@ out:
|
||||||
* i.e. Path MTU discovery
|
* i.e. Path MTU discovery
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr,
|
static void rt6_do_pmtu_disc(struct in6_addr *daddr, struct in6_addr *saddr,
|
||||||
struct net_device *dev, u32 pmtu)
|
struct net *net, u32 pmtu, int ifindex)
|
||||||
{
|
{
|
||||||
struct rt6_info *rt, *nrt;
|
struct rt6_info *rt, *nrt;
|
||||||
struct net *net = dev_net(dev);
|
|
||||||
int allfrag = 0;
|
int allfrag = 0;
|
||||||
|
|
||||||
rt = rt6_lookup(net, daddr, saddr, dev->ifindex, 0);
|
rt = rt6_lookup(net, daddr, saddr, ifindex, 0);
|
||||||
if (rt == NULL)
|
if (rt == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1631,6 +1630,27 @@ out:
|
||||||
dst_release(&rt->dst);
|
dst_release(&rt->dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr,
|
||||||
|
struct net_device *dev, u32 pmtu)
|
||||||
|
{
|
||||||
|
struct net *net = dev_net(dev);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RFC 1981 states that a node "MUST reduce the size of the packets it
|
||||||
|
* is sending along the path" that caused the Packet Too Big message.
|
||||||
|
* Since it's not possible in the general case to determine which
|
||||||
|
* interface was used to send the original packet, we update the MTU
|
||||||
|
* on the interface that will be used to send future packets. We also
|
||||||
|
* update the MTU on the interface that received the Packet Too Big in
|
||||||
|
* case the original packet was forced out that interface with
|
||||||
|
* SO_BINDTODEVICE or similar. This is the next best thing to the
|
||||||
|
* correct behaviour, which would be to update the MTU on all
|
||||||
|
* interfaces.
|
||||||
|
*/
|
||||||
|
rt6_do_pmtu_disc(daddr, saddr, net, pmtu, 0);
|
||||||
|
rt6_do_pmtu_disc(daddr, saddr, net, pmtu, dev->ifindex);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Misc support functions
|
* Misc support functions
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue