<font face="arial" size="2"><p style="margin:0;padding:0;">Good step.  Why not allow 9K byte jumbos when one's packets traverse a path that is internal to the local area, and all the 1 GigE links support 9K?</p>
<p style="margin:0;padding:0;"> </p>
<p style="margin:0;padding:0;">-----Original Message-----<br />From: "Robert Bradley" <robert.bradley1@gmail.com><br />Sent: Friday, June 22, 2012 3:12pm<br />To: cerowrt-devel@lists.bufferbloat.net<br />Subject: [Cerowrt-devel] Fwd: [PATCH] ag71xx: Added support for baby-jumbo packets.<br /><br /></p>
<div id="SafeStyles1340395807">
<p style="margin:0;padding:0;">For those of you not following the openwrt-devel mailing list, this is<br />an updated version of the baby-jumbo patch I posted previously in<br />response to Alexander's post.  This version is slightly less<br />conservative about extended frame lengths (up to 1518 octets), but<br />removes the awkward magic constant.  The maximum MTU is now calculated<br />by subtracting header lengths from AG71XX_TX_MTU_LEN.  I also use this<br />to calculate the maximum received packet size.  Defining<br />AG71XX_MAX_DATA_LEN as 1500 (or ETH_DATA_LEN) restores the original<br />behaviour.<br /><br /><br />---------- Forwarded message ----------<br />From: Robert Bradley <robert.bradley1@gmail.com><br />Date: 22 June 2012 13:50<br />Subject: [PATCH] ag71xx: Added support for baby-jumbo packets.<br />To: openwrt-devel@lists.openwrt.org<br /><br /><br />RFC 4638 support means that a full 1500-octet frame can be transmitted<br />through a PPPoE tunnel.  For this to work, the network card must support<br />baby-jumbo frames of 1508 octets plus headers.  This patch enables the use<br />of MTUs up to 1518 octets (derived from the existing AG71XX_TX_MTU_LEN<br />value by subtracting header sizes).<br /><br />The default MTU size is unchanged; if large frames are desired, ifconfig<br />must be used to set the new MTU.<br /><br />Signed-off-by: Robert Bradley <robert.bradley1@gmail.com><br />---<br /> .../files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h | 17 ++++++++++++++++-<br /> .../drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c  | 18 +++++++++++++++++-<br /> 2 files changed, 33 insertions(+), 2 deletions(-)<br /><br />diff --git a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h<br />b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h<br />index b9d95ad..7f77a59 100644<br />--- a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h<br />+++ b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx.h<br />@@ -51,8 +51,23 @@<br /> #define AG71XX_INT_INIT        (AG71XX_INT_ERR | AG71XX_INT_POLL)<br /><br /> #define AG71XX_TX_MTU_LEN      1540<br />+/*<br />+ * AG71XX_MAX_DATA_LEN equals the maximum possible MTU that a frame of length<br />+ * AG71XX_TX_MTU_LEN can have.  This may be larger than ETH_DATA_LEN!  This<br />+ * define is necessary for baby jumbo packet support (as per RFC 4638).<br />+ *<br />+ * Redefining this as ETH_DATA_LEN restores the 1500-octet MTU limit.<br />+ */<br />+#define AG71XX_MAX_DATA_LEN    \<br />+       (AG71XX_TX_MTU_LEN - (ETH_FCS_LEN + VLAN_HLEN + ETH_HLEN))<br />+/*<br />+ * Define AG71XX_RX_PKT_SIZE using AG71XX_MAX_DATA_LEN + ETH_HLEN rather than<br />+ * ETH_FRAME_LEN so that baby jumbo frames can be used safely.  This definition<br />+ * means that setting AG71XX_MAX_DATA_LEN to ETH_DATA_LEN restores the old<br />+ * values, which are safe for standard frames.<br />+ */<br /> #define AG71XX_RX_PKT_SIZE     \<br />-       (ETH_FRAME_LEN + ETH_FCS_LEN + VLAN_HLEN)<br />+       (AG71XX_MAX_DATA_LEN + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN)<br /> #define AG71XX_RX_BUF_SIZE (AG71XX_RX_PKT_SIZE + NET_SKB_PAD + NET_IP_ALIGN)<br /><br /> #define AG71XX_TX_RING_SIZE_DEFAULT    64<br />diff --git a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c<br />b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c<br />index fb99d27..d3e850b 100644<br />--- a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c<br />+++ b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c<br />@@ -1042,13 +1042,29 @@ static void ag71xx_netpoll(struct net_device *dev)<br /> }<br /> #endif<br /><br />+/*<br />+ * ag71xx_change_mtu: set interface MTU.<br />+ * A modified eth_change_mtu, changing the upper limit from ETH_DATA_LEN to<br />+ * AG71XX_MAX_DATA_LEN.  This means that baby jumbo packets may be used by<br />+ * PPPoE users, assuming that AG71XX_MAX_DATA_LEN > ETH_DATA_LEN.<br />+ *<br />+ * Returns 0 on success, -EINVAL otherwise.<br />+ */<br />+static int ag71xx_change_mtu(struct net_device *dev, int new_mtu)<br />+{<br />+       if (new_mtu < 68 || new_mtu > AG71XX_MAX_DATA_LEN)<br />+                       return -EINVAL;<br />+       dev->mtu = new_mtu;<br />+       return 0;<br />+}<br />+<br /> static const struct net_device_ops ag71xx_netdev_ops = {<br /> .ndo_open               = ag71xx_open,<br /> .ndo_stop               = ag71xx_stop,<br /> .ndo_start_xmit         = ag71xx_hard_start_xmit,<br /> .ndo_do_ioctl           = ag71xx_do_ioctl,<br /> .ndo_tx_timeout         = ag71xx_tx_timeout,<br />-       .ndo_change_mtu         = eth_change_mtu,<br />+       .ndo_change_mtu         = ag71xx_change_mtu,<br /> .ndo_set_mac_address    = eth_mac_addr,<br /> .ndo_validate_addr      = eth_validate_addr,<br /> #ifdef CONFIG_NET_POLL_CONTROLLER<br />--<br />Robert Bradley<br /><br /><br />-- <br />Robert Bradley<br />_______________________________________________<br />Cerowrt-devel mailing list<br />Cerowrt-devel@lists.bufferbloat.net<br />https://lists.bufferbloat.net/listinfo/cerowrt-devel</p>
</div></font>