summaryrefslogtreecommitdiffstats
path: root/net/core
diff options
context:
space:
mode:
authorHannes Frederic Sowa <hannes@stressinduktion.org>2015-05-21 16:59:58 +0200
committerDavid S. Miller <davem@davemloft.net>2015-05-25 00:06:58 -0400
commitbe12a1fe298e8be04d5215364f94654dff81b0bc (patch)
tree46d7ade56605d55a306c400ab54fed896ec63361 /net/core
parentd98c3edcbbbfae903f138edd7855544cd8d09bc2 (diff)
downloadlinux-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.c18
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