Skip to contentSkip to conversation

sunvnet: generate ICMP PTMUD messages for smaller port MTUs

PATCH Superseded David L Stevens 3 participants 4 messages Sep 12, 2014 – Sep 14, 2014

Subsystems (2)

v1 of 9 Superseded Latest is v9 →

lore
Share & tools
lore
#0 lore raw

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
index b557ec4..1251603 100644
@@ -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

maintainer
#1 lore raw

From: 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.

#2 lore raw
In reply to David L Stevens

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.

---
  drivers/net/ethernet/sun/sunvnet.c |   35 +++++++++++++++++++++++++++++++++++
  1 files changed, 35 insertions(+), 0 deletions(-)
drivers/net/ethernet/sun/sunvnet.c +0 -0
index b557ec4..1251603 100644

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

#3 lore raw
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