On Wed, 2007-02-14 at 01:06 +1100, Herbert Xu wrote: > On Tue, Feb 13, 2007 at 01:15:18PM +1100, Rusty Russell wrote: > > > > Good spotting! This function needs to be passed skb_headlen(skb), > > rather than skb->len. Patch is below (I renamed the parameter as well, > > for clarity). > > How about just dropping that parameter and using skb_headlen(skb) > directly? It's also used to generate dma structs for outgoing packets. In that case, skb_headlen() == 0: static struct sk_buff *lguestnet_alloc_skb(struct net_device *dev, int gfpflags) { struct sk_buff *skb; skb = alloc_skb(16 + ETH_HLEN + DATA_SIZE, gfpflags); if (!skb) return NULL; skb->dev = dev; skb_reserve(skb, 16); return skb; } /* Find a new skb to put in this slot in shared mem. */ static int fill_slot(struct net_device *dev, unsigned int slot) { struct lguestnet_info *info = dev->priv; /* Try to create and register a new one. */ info->skb[slot] = lguestnet_alloc_skb(dev, GFP_ATOMIC); if (!info->skb[slot]) { printk("%s: could not fill slot %i\n", dev->name, slot); return -ENOMEM; } skb_to_dma(info->skb[slot], ETH_HLEN + DATA_SIZE, &info->dma[slot]); Cheers, Rusty.