lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 15 Nov 2007 20:35:08 -0800 From: Stephen Hemminger <shemminger@...ux-foundation.org> To: "Jon Nelson" <jnelson@...poni.net> Cc: "Jarek Poplawski" <jarkao2@...pl>, "Andrew Morton" <akpm@...ux-foundation.org>, "David S. Miller" <davem@...emloft.net>, netdev@...r.kernel.org, jnelson-kernel-bugzilla@...poni.net Subject: Re: [PATCH] via-velocity: don't oops on MTU change. On Thu, 15 Nov 2007 20:42:55 -0600 "Jon Nelson" <jnelson@...poni.net> wrote: > On 11/15/07, Jarek Poplawski <jarkao2@...pl> wrote: > .. > > > Sure! I was only worried velocity_open() treats dev->mtu > > a bit different than velocity_change_mtu(), so eg. after: > > > > velocity_change_mtu() // dev is down > > velocity_open() > > velocity_change_mtu() // dev is up > > > > with the same mtu, vptr->rx_buf_sz could be different than after: > > > > velocity_open() > > velocity_change_mtu() // dev is up > > > > But, probably, I miss someting. > > There is a snag here: if I change the MTU after the device is UP > something ends up rather broken. A tcpdump shows nearly every outgoing > frame has a bad TCP checksum (and the card does not support H/W > checksumming or it is turned off as reported by ethtool). > Does this fix the problem. Note: reading the code the driver has other problems (besides crappy style). It does pci_map_single()/unmap in a way that doesn't account correctly for the padding that was added. --- a/drivers/net/via-velocity.c 2007-11-15 20:11:12.000000000 -0800 +++ b/drivers/net/via-velocity.c 2007-11-15 20:32:14.000000000 -0800 @@ -1242,6 +1242,9 @@ static int velocity_rx_refill(struct vel static int velocity_init_rd_ring(struct velocity_info *vptr) { int ret; + int mtu = vptr->dev->mtu; + + vptr->rx_buf_sz = (mtu <= ETH_DATA_LEN) ? PKT_BUF_SZ : mtu + 32; vptr->rd_info = kcalloc(vptr->options.numrx, sizeof(struct velocity_rd_info), GFP_KERNEL); @@ -1898,8 +1901,6 @@ static int velocity_open(struct net_devi struct velocity_info *vptr = netdev_priv(dev); int ret; - vptr->rx_buf_sz = (dev->mtu <= 1504 ? PKT_BUF_SZ : dev->mtu + 32); - ret = velocity_init_rings(vptr); if (ret < 0) goto out; @@ -1978,12 +1979,6 @@ static int velocity_change_mtu(struct ne velocity_free_rd_ring(vptr); dev->mtu = new_mtu; - if (new_mtu > 8192) - vptr->rx_buf_sz = 9 * 1024; - else if (new_mtu > 4096) - vptr->rx_buf_sz = 8192; - else - vptr->rx_buf_sz = 4 * 1024; ret = velocity_init_rd_ring(vptr); if (ret < 0) -- Stephen Hemminger <shemminger@...ux-foundation.org> - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists