ieee1394: eth1394: allow MTU bigger than 1500
authorStefan Richter <stefanr@s5r6.in-berlin.de>
Tue, 3 Apr 2007 21:55:40 +0000 (23:55 +0200)
committerStefan Richter <stefanr@s5r6.in-berlin.de>
Sun, 29 Apr 2007 22:00:31 +0000 (00:00 +0200)
RFC 2734 says: "IP-capable nodes may operate with an MTU size larger
than the default [1500 octets], but the means by which a larger MTU is
configured are beyond the scope of this document."

Allow users to set an MTU bigger than 1500.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
drivers/ieee1394/eth1394.c

index 8f19f5b77a59b0da8fc6c624a5d85d55011e5d44..aee82922e6b778d551de6eacabc1de894e0fcf70 100644 (file)
@@ -136,9 +136,6 @@ static const int hdr_type_len[] = {
        sizeof(struct eth1394_sf_hdr)
 };
 
-/* For now, this needs to be 1500, so that XP works with us */
-#define ETH1394_DATA_LEN       ETH_DATA_LEN
-
 static const u16 eth1394_speedto_maxpayload[] = {
 /*     S100, S200, S400, S800, S1600, S3200 */
        512, 1024, 2048, 4096,  4096,  4096
@@ -262,17 +259,27 @@ static void ether1394_tx_timeout(struct net_device *dev)
        ether1394_host_reset(host);
 }
 
+static inline int ether1394_max_mtu(struct hpsb_host* host)
+{
+       return (1 << (host->csr.max_rec + 1))
+                       - sizeof(union eth1394_hdr) - ETHER1394_GASP_OVERHEAD;
+}
+
 static int ether1394_change_mtu(struct net_device *dev, int new_mtu)
 {
-       int max_rec =
-               ((struct eth1394_priv *)netdev_priv(dev))->host->csr.max_rec;
+       int max_mtu;
 
-       if (new_mtu < 68 ||
-           new_mtu > ETH1394_DATA_LEN ||
-           new_mtu > (1 << (max_rec + 1)) - sizeof(union eth1394_hdr) -
-                     ETHER1394_GASP_OVERHEAD)
+       if (new_mtu < 68)
                return -EINVAL;
 
+       max_mtu = ether1394_max_mtu(
+                       ((struct eth1394_priv *)netdev_priv(dev))->host);
+       if (new_mtu > max_mtu) {
+               ETH1394_PRINT(KERN_INFO, dev->name,
+                             "Local node constrains MTU to %d\n", max_mtu);
+               return -ERANGE;
+       }
+
        dev->mtu = new_mtu;
        return 0;
 }
@@ -476,13 +483,10 @@ static void ether1394_reset_priv(struct net_device *dev, int set_mtu)
                        max_speed = host->speed[i];
        priv->bc_sspd = max_speed;
 
-       /* We'll use our maximum payload as the default MTU */
        if (set_mtu) {
-               int max_payload = 1 << (host->csr.max_rec + 1);
-
-               dev->mtu = min(ETH1394_DATA_LEN,
-                              (int)(max_payload - sizeof(union eth1394_hdr) -
-                                    ETHER1394_GASP_OVERHEAD));
+               /* Use the RFC 2734 default 1500 octets or the maximum payload
+                * as initial MTU */
+               dev->mtu = min(1500, ether1394_max_mtu(host));
 
                /* Set our hardware address while we're at it */
                memcpy(dev->dev_addr, &guid, sizeof(u64));