Messages in this thread | | | Date | Tue, 15 Sep 2009 02:09:03 -0700 (PDT) | Subject | Re: alloc skb based on a given data buffer | From | David Miller <> |
| |
From: Zhu Yi <yi.zhu@intel.com> Date: Tue, 15 Sep 2009 16:57:29 +0800
> Thanks. So we can put the 8K buffer into 2 skb_shinfo()->frags[] slots > and set nr_frags to 2, right? Is this supported allover the network code > already? At a first glance, I didn't find any frags handling in mac80211 > stack.
You have to pre-pull the link level protocol headers into the linear area, but that's it.
Again, see niu.c for details, it does:
static void niu_rx_skb_append(struct sk_buff *skb, struct page *page, u32 offset, u32 size) { int i = skb_shinfo(skb)->nr_frags; skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
frag->page = page; frag->page_offset = offset; frag->size = size;
skb->len += size; skb->data_len += size; skb->truesize += size;
skb_shinfo(skb)->nr_frags = i + 1; }
to add pages to SKBs and then at the end it goes:
skb_reserve(skb, NET_IP_ALIGN); __pskb_pull_tail(skb, min(len, NIU_RXPULL_MAX));
Right before giving the SKB to the networking stack. NIU_RXPULL_MAX should be a value that will be large enough to cover the largest possible link level header.
| |