Loading net/ipv6/route.c +24 −4 Original line number Diff line number Diff line Loading @@ -1556,14 +1556,13 @@ out: * i.e. Path MTU discovery */ void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr, struct net_device *dev, u32 pmtu) static void rt6_do_pmtu_disc(struct in6_addr *daddr, struct in6_addr *saddr, struct net *net, u32 pmtu, int ifindex) { struct rt6_info *rt, *nrt; struct net *net = dev_net(dev); int allfrag = 0; rt = rt6_lookup(net, daddr, saddr, dev->ifindex, 0); rt = rt6_lookup(net, daddr, saddr, ifindex, 0); if (rt == NULL) return; Loading Loading @@ -1631,6 +1630,27 @@ out: 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 */ Loading Loading
net/ipv6/route.c +24 −4 Original line number Diff line number Diff line Loading @@ -1556,14 +1556,13 @@ out: * i.e. Path MTU discovery */ void rt6_pmtu_discovery(struct in6_addr *daddr, struct in6_addr *saddr, struct net_device *dev, u32 pmtu) static void rt6_do_pmtu_disc(struct in6_addr *daddr, struct in6_addr *saddr, struct net *net, u32 pmtu, int ifindex) { struct rt6_info *rt, *nrt; struct net *net = dev_net(dev); int allfrag = 0; rt = rt6_lookup(net, daddr, saddr, dev->ifindex, 0); rt = rt6_lookup(net, daddr, saddr, ifindex, 0); if (rt == NULL) return; Loading Loading @@ -1631,6 +1630,27 @@ out: 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 */ Loading