ieee1394: eth1394: allow MTU bigger than 1500
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>
This commit is contained in:
parent
f982e5ffcf
commit
17bab407d5
@ -136,9 +136,6 @@ static const int hdr_type_len[] = {
|
|||||||
sizeof(struct eth1394_sf_hdr)
|
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[] = {
|
static const u16 eth1394_speedto_maxpayload[] = {
|
||||||
/* S100, S200, S400, S800, S1600, S3200 */
|
/* S100, S200, S400, S800, S1600, S3200 */
|
||||||
512, 1024, 2048, 4096, 4096, 4096
|
512, 1024, 2048, 4096, 4096, 4096
|
||||||
@ -262,17 +259,27 @@ static void ether1394_tx_timeout(struct net_device *dev)
|
|||||||
ether1394_host_reset(host);
|
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)
|
static int ether1394_change_mtu(struct net_device *dev, int new_mtu)
|
||||||
{
|
{
|
||||||
int max_rec =
|
int max_mtu;
|
||||||
((struct eth1394_priv *)netdev_priv(dev))->host->csr.max_rec;
|
|
||||||
|
|
||||||
if (new_mtu < 68 ||
|
if (new_mtu < 68)
|
||||||
new_mtu > ETH1394_DATA_LEN ||
|
|
||||||
new_mtu > (1 << (max_rec + 1)) - sizeof(union eth1394_hdr) -
|
|
||||||
ETHER1394_GASP_OVERHEAD)
|
|
||||||
return -EINVAL;
|
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;
|
dev->mtu = new_mtu;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -476,13 +483,10 @@ static void ether1394_reset_priv(struct net_device *dev, int set_mtu)
|
|||||||
max_speed = host->speed[i];
|
max_speed = host->speed[i];
|
||||||
priv->bc_sspd = max_speed;
|
priv->bc_sspd = max_speed;
|
||||||
|
|
||||||
/* We'll use our maximum payload as the default MTU */
|
|
||||||
if (set_mtu) {
|
if (set_mtu) {
|
||||||
int max_payload = 1 << (host->csr.max_rec + 1);
|
/* Use the RFC 2734 default 1500 octets or the maximum payload
|
||||||
|
* as initial MTU */
|
||||||
dev->mtu = min(ETH1394_DATA_LEN,
|
dev->mtu = min(1500, ether1394_max_mtu(host));
|
||||||
(int)(max_payload - sizeof(union eth1394_hdr) -
|
|
||||||
ETHER1394_GASP_OVERHEAD));
|
|
||||||
|
|
||||||
/* Set our hardware address while we're at it */
|
/* Set our hardware address while we're at it */
|
||||||
memcpy(dev->dev_addr, &guid, sizeof(u64));
|
memcpy(dev->dev_addr, &guid, sizeof(u64));
|
||||||
|
Loading…
Reference in New Issue
Block a user