sunvnet: generate ICMP PTMUD messages for smaller port MTUs
Subsystems (2)
PATCH 3/3 sunvnet: generate ICMP PTMUD messages for smaller port MTUs
This patch sends ICMP and ICMPv6 messages for Path MTU Discovery when a remote port MTU is smaller than the device MTU. This allows mixing newer VIO protocol devices that support MTU negotiation with older devices that do not on the same vswitch. It also allows Linux-Linux LDOMs to use 64K-1 data packets even though Solaris vswitch is limited to <16K MTU.
--- drivers/net/ethernet/sun/sunvnet.c | 35 +++++++++++++++++++++++++++++++++++ 1 files changed, 35 insertions(+), 0 deletions(-)
drivers/net/ethernet/sun/sunvnet.c +6 -0
@@ -17,6 +17,13 @@#include <linux/mutex.h> #include <linux/if_vlan.h> +#if IS_ENABLED(CONFIG_IPV6) +#include <linux/icmpv6.h> +#endif + +#include <net/icmp.h> +#include <net/route.h> +#include <asm/vio.h> #include <asm/ldc.h> @@ -752,6 +759,34 @@ static int vnet_start_xmit(struct sk_buff *skb, struct net_device *dev)
goto out_dropped;
if (skb->len > port->vio.rmtu) {
+ unsigned long localmtu = port->vio.rmtu - ETH_HLEN;
+
+ if (port->vio.ver.major == 1 && port->vio.ver.minor >= 3)
+ localmtu -= VLAN_HLEN;
+
+ if (skb->protocol == htons(ETH_P_IP))
+ {
+ struct flowi4 fl4;
+ struct rtable *rt = NULL;
+
+ memset(&fl4, 0, sizeof(fl4));
+ fl4.flowi4_oif = dev->ifindex;
+ fl4.flowi4_tos = RT_TOS(ip_hdr(skb)->tos);
+ fl4.daddr = ip_hdr(skb)->daddr;
+ fl4.saddr = ip_hdr(skb)->saddr;
+
+ rt = ip_route_output_key(dev_net(dev), &fl4);
+ if (!IS_ERR(rt)) {
+ skb_dst_set(skb, &rt->dst);
+ icmp_send(skb, ICMP_DEST_UNREACH,
+ ICMP_FRAG_NEEDED,
+ htonl(localmtu));
+ }
+ }
+#if IS_ENABLED(CONFIG_IPV6)
+ else if (skb->protocol == htons(ETH_P_IPV6))
+ icmpv6_send(skb, ICMPV6_PKT_TOOBIG, 0, localmtu);
+#endif
goto out_dropped;
}
-- 1.7.1
David Miller
maintainerFrom: David L Stevens <[email protected]>
Date: Fri, 12 Sep 2014 18:22:52 -0400
Review
Quoted 2 lines
(quoted diff) +2
-0+ if (skb->protocol == htons(ETH_P_IP)) + {
Openning braces should be on the same line as the if() statement.
Hello.
Quoted 16 lines · David L Stevens
This patch sends ICMP and ICMPv6 messages for Path MTU Discovery when a remote port MTU is smaller than the device MTU. This allows mixing newer VIO protocol devices that support MTU negotiation with older devices that do not on the same vswitch. It also allows Linux-Linux LDOMs to use 64K-1 data packets even though Solaris vswitch is limited to <16K MTU.
Signed-off-by David L Stevens <[email protected]>--- drivers/net/ethernet/sun/sunvnet.c | 35 +++++++++++++++++++++++++++++++++++ 1 files changed, 35 insertions(+), 0 deletions(-)drivers/net/ethernet/sun/sunvnet.c +0
-0
drivers/net/ethernet/sun/sunvnet.c line 19
Quoted 3 lines
drivers/net/ethernet/sun/sunvnet.c +0
-0@@ -17,6 +17,13 @@#include <linux/mutex.h> #include <linux/if_vlan.h> +#if IS_ENABLED(CONFIG_IPV6)
Patch spoiled as well...
drivers/net/ethernet/sun/sunvnet.c line 27
Quoted 8 lines
drivers/net/ethernet/sun/sunvnet.c +6
-0+#include <linux/icmpv6.h> +#endif + +#include <net/icmp.h> +#include <net/route.h> +#include <asm/vio.h> #include <asm/ldc.h>
WBR, Sergei
Quoted 1 line · Sergei Shtylyov
Patch spoiled as well...
Yes, it was mangled by my mailer. I think PATCHv3, the latest I sent, is ok, but please try that. And, of course, let me know if it doesn't work.
+-DLS