diff options
author | Hannes Frederic Sowa <hannes@stressinduktion.org> | 2015-05-21 16:59:58 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-05-25 00:06:58 -0400 |
commit | be12a1fe298e8be04d5215364f94654dff81b0bc (patch) | |
tree | 46d7ade56605d55a306c400ab54fed896ec63361 /net/core | |
parent | d98c3edcbbbfae903f138edd7855544cd8d09bc2 (diff) | |
download | linux-be12a1fe298e8be04d5215364f94654dff81b0bc.tar.bz2 |
net: skbuff: add skb_append_pagefrags and use it
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/skbuff.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index f3fe9bd9e672..4f2babeaf18d 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -2915,6 +2915,24 @@ int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb, } EXPORT_SYMBOL(skb_append_datato_frags); +int skb_append_pagefrags(struct sk_buff *skb, struct page *page, + int offset, size_t size) +{ + int i = skb_shinfo(skb)->nr_frags; + + if (skb_can_coalesce(skb, i, page, offset)) { + skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], size); + } else if (i < MAX_SKB_FRAGS) { + get_page(page); + skb_fill_page_desc(skb, i, page, offset, size); + } else { + return -EMSGSIZE; + } + + return 0; +} +EXPORT_SYMBOL_GPL(skb_append_pagefrags); + /** * skb_pull_rcsum - pull skb and update receive checksum * @skb: buffer to update |