diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2011-10-18 17:00:24 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-10-19 03:10:46 -0400 |
commit | 9e903e085262ffbf1fc44a17ac06058aca03524a (patch) | |
tree | 4acefc97ba38c1733474d25c0b2053b56af97db1 /net | |
parent | dd767856a36e00b631d65ebc4bb81b19915532d6 (diff) |
net: add skb frag size accessors
To ease skb->truesize sanitization, its better to be able to localize
all references to skb frags size.
Define accessors : skb_frag_size() to fetch frag size, and
skb_frag_size_{set|add|sub}() to manipulate it.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/appletalk/ddp.c | 5 | ||||
-rw-r--r-- | net/core/datagram.c | 16 | ||||
-rw-r--r-- | net/core/dev.c | 6 | ||||
-rw-r--r-- | net/core/pktgen.c | 12 | ||||
-rw-r--r-- | net/core/skbuff.c | 72 | ||||
-rw-r--r-- | net/core/user_dma.c | 4 | ||||
-rw-r--r-- | net/ipv4/inet_lro.c | 8 | ||||
-rw-r--r-- | net/ipv4/ip_fragment.c | 4 | ||||
-rw-r--r-- | net/ipv4/ip_output.c | 6 | ||||
-rw-r--r-- | net/ipv4/tcp.c | 9 | ||||
-rw-r--r-- | net/ipv4/tcp_output.c | 8 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 5 | ||||
-rw-r--r-- | net/ipv6/netfilter/nf_conntrack_reasm.c | 4 | ||||
-rw-r--r-- | net/ipv6/reassembly.c | 4 | ||||
-rw-r--r-- | net/xfrm/xfrm_ipcomp.c | 2 |
15 files changed, 85 insertions, 80 deletions
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index b1fe7c35e8d1..bfa9ab93eda5 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c | |||
@@ -951,13 +951,12 @@ static unsigned long atalk_sum_skb(const struct sk_buff *skb, int offset, | |||
951 | /* checksum stuff in frags */ | 951 | /* checksum stuff in frags */ |
952 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 952 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
953 | int end; | 953 | int end; |
954 | 954 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | |
955 | WARN_ON(start > offset + len); | 955 | WARN_ON(start > offset + len); |
956 | 956 | ||
957 | end = start + skb_shinfo(skb)->frags[i].size; | 957 | end = start + skb_frag_size(frag); |
958 | if ((copy = end - offset) > 0) { | 958 | if ((copy = end - offset) > 0) { |
959 | u8 *vaddr; | 959 | u8 *vaddr; |
960 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
961 | 960 | ||
962 | if (copy > len) | 961 | if (copy > len) |
963 | copy = len; | 962 | copy = len; |
diff --git a/net/core/datagram.c b/net/core/datagram.c index 6449bed457d4..68bbf9f65cb0 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
@@ -324,14 +324,14 @@ int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset, | |||
324 | /* Copy paged appendix. Hmm... why does this look so complicated? */ | 324 | /* Copy paged appendix. Hmm... why does this look so complicated? */ |
325 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 325 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
326 | int end; | 326 | int end; |
327 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
327 | 328 | ||
328 | WARN_ON(start > offset + len); | 329 | WARN_ON(start > offset + len); |
329 | 330 | ||
330 | end = start + skb_shinfo(skb)->frags[i].size; | 331 | end = start + skb_frag_size(frag); |
331 | if ((copy = end - offset) > 0) { | 332 | if ((copy = end - offset) > 0) { |
332 | int err; | 333 | int err; |
333 | u8 *vaddr; | 334 | u8 *vaddr; |
334 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
335 | struct page *page = skb_frag_page(frag); | 335 | struct page *page = skb_frag_page(frag); |
336 | 336 | ||
337 | if (copy > len) | 337 | if (copy > len) |
@@ -410,14 +410,14 @@ int skb_copy_datagram_const_iovec(const struct sk_buff *skb, int offset, | |||
410 | /* Copy paged appendix. Hmm... why does this look so complicated? */ | 410 | /* Copy paged appendix. Hmm... why does this look so complicated? */ |
411 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 411 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
412 | int end; | 412 | int end; |
413 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
413 | 414 | ||
414 | WARN_ON(start > offset + len); | 415 | WARN_ON(start > offset + len); |
415 | 416 | ||
416 | end = start + skb_shinfo(skb)->frags[i].size; | 417 | end = start + skb_frag_size(frag); |
417 | if ((copy = end - offset) > 0) { | 418 | if ((copy = end - offset) > 0) { |
418 | int err; | 419 | int err; |
419 | u8 *vaddr; | 420 | u8 *vaddr; |
420 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
421 | struct page *page = skb_frag_page(frag); | 421 | struct page *page = skb_frag_page(frag); |
422 | 422 | ||
423 | if (copy > len) | 423 | if (copy > len) |
@@ -500,14 +500,14 @@ int skb_copy_datagram_from_iovec(struct sk_buff *skb, int offset, | |||
500 | /* Copy paged appendix. Hmm... why does this look so complicated? */ | 500 | /* Copy paged appendix. Hmm... why does this look so complicated? */ |
501 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 501 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
502 | int end; | 502 | int end; |
503 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
503 | 504 | ||
504 | WARN_ON(start > offset + len); | 505 | WARN_ON(start > offset + len); |
505 | 506 | ||
506 | end = start + skb_shinfo(skb)->frags[i].size; | 507 | end = start + skb_frag_size(frag); |
507 | if ((copy = end - offset) > 0) { | 508 | if ((copy = end - offset) > 0) { |
508 | int err; | 509 | int err; |
509 | u8 *vaddr; | 510 | u8 *vaddr; |
510 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
511 | struct page *page = skb_frag_page(frag); | 511 | struct page *page = skb_frag_page(frag); |
512 | 512 | ||
513 | if (copy > len) | 513 | if (copy > len) |
@@ -585,15 +585,15 @@ static int skb_copy_and_csum_datagram(const struct sk_buff *skb, int offset, | |||
585 | 585 | ||
586 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 586 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
587 | int end; | 587 | int end; |
588 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
588 | 589 | ||
589 | WARN_ON(start > offset + len); | 590 | WARN_ON(start > offset + len); |
590 | 591 | ||
591 | end = start + skb_shinfo(skb)->frags[i].size; | 592 | end = start + skb_frag_size(frag); |
592 | if ((copy = end - offset) > 0) { | 593 | if ((copy = end - offset) > 0) { |
593 | __wsum csum2; | 594 | __wsum csum2; |
594 | int err = 0; | 595 | int err = 0; |
595 | u8 *vaddr; | 596 | u8 *vaddr; |
596 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
597 | struct page *page = skb_frag_page(frag); | 597 | struct page *page = skb_frag_page(frag); |
598 | 598 | ||
599 | if (copy > len) | 599 | if (copy > len) |
diff --git a/net/core/dev.c b/net/core/dev.c index 8b6118a16b87..cbb5918e4fc5 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -3489,9 +3489,9 @@ pull: | |||
3489 | skb->data_len -= grow; | 3489 | skb->data_len -= grow; |
3490 | 3490 | ||
3491 | skb_shinfo(skb)->frags[0].page_offset += grow; | 3491 | skb_shinfo(skb)->frags[0].page_offset += grow; |
3492 | skb_shinfo(skb)->frags[0].size -= grow; | 3492 | skb_frag_size_sub(&skb_shinfo(skb)->frags[0], grow); |
3493 | 3493 | ||
3494 | if (unlikely(!skb_shinfo(skb)->frags[0].size)) { | 3494 | if (unlikely(!skb_frag_size(&skb_shinfo(skb)->frags[0]))) { |
3495 | skb_frag_unref(skb, 0); | 3495 | skb_frag_unref(skb, 0); |
3496 | memmove(skb_shinfo(skb)->frags, | 3496 | memmove(skb_shinfo(skb)->frags, |
3497 | skb_shinfo(skb)->frags + 1, | 3497 | skb_shinfo(skb)->frags + 1, |
@@ -3559,7 +3559,7 @@ void skb_gro_reset_offset(struct sk_buff *skb) | |||
3559 | !PageHighMem(skb_frag_page(&skb_shinfo(skb)->frags[0]))) { | 3559 | !PageHighMem(skb_frag_page(&skb_shinfo(skb)->frags[0]))) { |
3560 | NAPI_GRO_CB(skb)->frag0 = | 3560 | NAPI_GRO_CB(skb)->frag0 = |
3561 | skb_frag_address(&skb_shinfo(skb)->frags[0]); | 3561 | skb_frag_address(&skb_shinfo(skb)->frags[0]); |
3562 | NAPI_GRO_CB(skb)->frag0_len = skb_shinfo(skb)->frags[0].size; | 3562 | NAPI_GRO_CB(skb)->frag0_len = skb_frag_size(&skb_shinfo(skb)->frags[0]); |
3563 | } | 3563 | } |
3564 | } | 3564 | } |
3565 | EXPORT_SYMBOL(skb_gro_reset_offset); | 3565 | EXPORT_SYMBOL(skb_gro_reset_offset); |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 796044ac0bf3..38d657737498 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -2606,13 +2606,13 @@ static void pktgen_finalize_skb(struct pktgen_dev *pkt_dev, struct sk_buff *skb, | |||
2606 | skb_shinfo(skb)->frags[i].page_offset = 0; | 2606 | skb_shinfo(skb)->frags[i].page_offset = 0; |
2607 | /*last fragment, fill rest of data*/ | 2607 | /*last fragment, fill rest of data*/ |
2608 | if (i == (frags - 1)) | 2608 | if (i == (frags - 1)) |
2609 | skb_shinfo(skb)->frags[i].size = | 2609 | skb_frag_size_set(&skb_shinfo(skb)->frags[i], |
2610 | (datalen < PAGE_SIZE ? datalen : PAGE_SIZE); | 2610 | (datalen < PAGE_SIZE ? datalen : PAGE_SIZE)); |
2611 | else | 2611 | else |
2612 | skb_shinfo(skb)->frags[i].size = frag_len; | 2612 | skb_frag_size_set(&skb_shinfo(skb)->frags[i], frag_len); |
2613 | datalen -= skb_shinfo(skb)->frags[i].size; | 2613 | datalen -= skb_frag_size(&skb_shinfo(skb)->frags[i]); |
2614 | skb->len += skb_shinfo(skb)->frags[i].size; | 2614 | skb->len += skb_frag_size(&skb_shinfo(skb)->frags[i]); |
2615 | skb->data_len += skb_shinfo(skb)->frags[i].size; | 2615 | skb->data_len += skb_frag_size(&skb_shinfo(skb)->frags[i]); |
2616 | i++; | 2616 | i++; |
2617 | skb_shinfo(skb)->nr_frags = i; | 2617 | skb_shinfo(skb)->nr_frags = i; |
2618 | } | 2618 | } |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index a7f855dca922..ce357d986251 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -659,7 +659,7 @@ int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask) | |||
659 | } | 659 | } |
660 | vaddr = kmap_skb_frag(&skb_shinfo(skb)->frags[i]); | 660 | vaddr = kmap_skb_frag(&skb_shinfo(skb)->frags[i]); |
661 | memcpy(page_address(page), | 661 | memcpy(page_address(page), |
662 | vaddr + f->page_offset, f->size); | 662 | vaddr + f->page_offset, skb_frag_size(f)); |
663 | kunmap_skb_frag(vaddr); | 663 | kunmap_skb_frag(vaddr); |
664 | page->private = (unsigned long)head; | 664 | page->private = (unsigned long)head; |
665 | head = page; | 665 | head = page; |
@@ -1190,14 +1190,14 @@ int ___pskb_trim(struct sk_buff *skb, unsigned int len) | |||
1190 | goto drop_pages; | 1190 | goto drop_pages; |
1191 | 1191 | ||
1192 | for (; i < nfrags; i++) { | 1192 | for (; i < nfrags; i++) { |
1193 | int end = offset + skb_shinfo(skb)->frags[i].size; | 1193 | int end = offset + skb_frag_size(&skb_shinfo(skb)->frags[i]); |
1194 | 1194 | ||
1195 | if (end < len) { | 1195 | if (end < len) { |
1196 | offset = end; | 1196 | offset = end; |
1197 | continue; | 1197 | continue; |
1198 | } | 1198 | } |
1199 | 1199 | ||
1200 | skb_shinfo(skb)->frags[i++].size = len - offset; | 1200 | skb_frag_size_set(&skb_shinfo(skb)->frags[i++], len - offset); |
1201 | 1201 | ||
1202 | drop_pages: | 1202 | drop_pages: |
1203 | skb_shinfo(skb)->nr_frags = i; | 1203 | skb_shinfo(skb)->nr_frags = i; |
@@ -1306,9 +1306,11 @@ unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta) | |||
1306 | /* Estimate size of pulled pages. */ | 1306 | /* Estimate size of pulled pages. */ |
1307 | eat = delta; | 1307 | eat = delta; |
1308 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 1308 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
1309 | if (skb_shinfo(skb)->frags[i].size >= eat) | 1309 | int size = skb_frag_size(&skb_shinfo(skb)->frags[i]); |
1310 | |||
1311 | if (size >= eat) | ||
1310 | goto pull_pages; | 1312 | goto pull_pages; |
1311 | eat -= skb_shinfo(skb)->frags[i].size; | 1313 | eat -= size; |
1312 | } | 1314 | } |
1313 | 1315 | ||
1314 | /* If we need update frag list, we are in troubles. | 1316 | /* If we need update frag list, we are in troubles. |
@@ -1371,14 +1373,16 @@ pull_pages: | |||
1371 | eat = delta; | 1373 | eat = delta; |
1372 | k = 0; | 1374 | k = 0; |
1373 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 1375 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
1374 | if (skb_shinfo(skb)->frags[i].size <= eat) { | 1376 | int size = skb_frag_size(&skb_shinfo(skb)->frags[i]); |
1377 | |||
1378 | if (size <= eat) { | ||
1375 | skb_frag_unref(skb, i); | 1379 | skb_frag_unref(skb, i); |
1376 | eat -= skb_shinfo(skb)->frags[i].size; | 1380 | eat -= size; |
1377 | } else { | 1381 | } else { |
1378 | skb_shinfo(skb)->frags[k] = skb_shinfo(skb)->frags[i]; | 1382 | skb_shinfo(skb)->frags[k] = skb_shinfo(skb)->frags[i]; |
1379 | if (eat) { | 1383 | if (eat) { |
1380 | skb_shinfo(skb)->frags[k].page_offset += eat; | 1384 | skb_shinfo(skb)->frags[k].page_offset += eat; |
1381 | skb_shinfo(skb)->frags[k].size -= eat; | 1385 | skb_frag_size_sub(&skb_shinfo(skb)->frags[k], eat); |
1382 | eat = 0; | 1386 | eat = 0; |
1383 | } | 1387 | } |
1384 | k++; | 1388 | k++; |
@@ -1433,7 +1437,7 @@ int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len) | |||
1433 | 1437 | ||
1434 | WARN_ON(start > offset + len); | 1438 | WARN_ON(start > offset + len); |
1435 | 1439 | ||
1436 | end = start + skb_shinfo(skb)->frags[i].size; | 1440 | end = start + skb_frag_size(&skb_shinfo(skb)->frags[i]); |
1437 | if ((copy = end - offset) > 0) { | 1441 | if ((copy = end - offset) > 0) { |
1438 | u8 *vaddr; | 1442 | u8 *vaddr; |
1439 | 1443 | ||
@@ -1632,7 +1636,7 @@ static int __skb_splice_bits(struct sk_buff *skb, struct pipe_inode_info *pipe, | |||
1632 | const skb_frag_t *f = &skb_shinfo(skb)->frags[seg]; | 1636 | const skb_frag_t *f = &skb_shinfo(skb)->frags[seg]; |
1633 | 1637 | ||
1634 | if (__splice_segment(skb_frag_page(f), | 1638 | if (__splice_segment(skb_frag_page(f), |
1635 | f->page_offset, f->size, | 1639 | f->page_offset, skb_frag_size(f), |
1636 | offset, len, skb, spd, 0, sk, pipe)) | 1640 | offset, len, skb, spd, 0, sk, pipe)) |
1637 | return 1; | 1641 | return 1; |
1638 | } | 1642 | } |
@@ -1742,7 +1746,7 @@ int skb_store_bits(struct sk_buff *skb, int offset, const void *from, int len) | |||
1742 | 1746 | ||
1743 | WARN_ON(start > offset + len); | 1747 | WARN_ON(start > offset + len); |
1744 | 1748 | ||
1745 | end = start + frag->size; | 1749 | end = start + skb_frag_size(frag); |
1746 | if ((copy = end - offset) > 0) { | 1750 | if ((copy = end - offset) > 0) { |
1747 | u8 *vaddr; | 1751 | u8 *vaddr; |
1748 | 1752 | ||
@@ -1815,7 +1819,7 @@ __wsum skb_checksum(const struct sk_buff *skb, int offset, | |||
1815 | 1819 | ||
1816 | WARN_ON(start > offset + len); | 1820 | WARN_ON(start > offset + len); |
1817 | 1821 | ||
1818 | end = start + skb_shinfo(skb)->frags[i].size; | 1822 | end = start + skb_frag_size(&skb_shinfo(skb)->frags[i]); |
1819 | if ((copy = end - offset) > 0) { | 1823 | if ((copy = end - offset) > 0) { |
1820 | __wsum csum2; | 1824 | __wsum csum2; |
1821 | u8 *vaddr; | 1825 | u8 *vaddr; |
@@ -1890,7 +1894,7 @@ __wsum skb_copy_and_csum_bits(const struct sk_buff *skb, int offset, | |||
1890 | 1894 | ||
1891 | WARN_ON(start > offset + len); | 1895 | WARN_ON(start > offset + len); |
1892 | 1896 | ||
1893 | end = start + skb_shinfo(skb)->frags[i].size; | 1897 | end = start + skb_frag_size(&skb_shinfo(skb)->frags[i]); |
1894 | if ((copy = end - offset) > 0) { | 1898 | if ((copy = end - offset) > 0) { |
1895 | __wsum csum2; | 1899 | __wsum csum2; |
1896 | u8 *vaddr; | 1900 | u8 *vaddr; |
@@ -2163,7 +2167,7 @@ static inline void skb_split_no_header(struct sk_buff *skb, | |||
2163 | skb->data_len = len - pos; | 2167 | skb->data_len = len - pos; |
2164 | 2168 | ||
2165 | for (i = 0; i < nfrags; i++) { | 2169 | for (i = 0; i < nfrags; i++) { |
2166 | int size = skb_shinfo(skb)->frags[i].size; | 2170 | int size = skb_frag_size(&skb_shinfo(skb)->frags[i]); |
2167 | 2171 | ||
2168 | if (pos + size > len) { | 2172 | if (pos + size > len) { |
2169 | skb_shinfo(skb1)->frags[k] = skb_shinfo(skb)->frags[i]; | 2173 | skb_shinfo(skb1)->frags[k] = skb_shinfo(skb)->frags[i]; |
@@ -2179,8 +2183,8 @@ static inline void skb_split_no_header(struct sk_buff *skb, | |||
2179 | */ | 2183 | */ |
2180 | skb_frag_ref(skb, i); | 2184 | skb_frag_ref(skb, i); |
2181 | skb_shinfo(skb1)->frags[0].page_offset += len - pos; | 2185 | skb_shinfo(skb1)->frags[0].page_offset += len - pos; |
2182 | skb_shinfo(skb1)->frags[0].size -= len - pos; | 2186 | skb_frag_size_sub(&skb_shinfo(skb1)->frags[0], len - pos); |
2183 | skb_shinfo(skb)->frags[i].size = len - pos; | 2187 | skb_frag_size_set(&skb_shinfo(skb)->frags[i], len - pos); |
2184 | skb_shinfo(skb)->nr_frags++; | 2188 | skb_shinfo(skb)->nr_frags++; |
2185 | } | 2189 | } |
2186 | k++; | 2190 | k++; |
@@ -2258,7 +2262,7 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen) | |||
2258 | } else { | 2262 | } else { |
2259 | merge = to - 1; | 2263 | merge = to - 1; |
2260 | 2264 | ||
2261 | todo -= fragfrom->size; | 2265 | todo -= skb_frag_size(fragfrom); |
2262 | if (todo < 0) { | 2266 | if (todo < 0) { |
2263 | if (skb_prepare_for_shift(skb) || | 2267 | if (skb_prepare_for_shift(skb) || |
2264 | skb_prepare_for_shift(tgt)) | 2268 | skb_prepare_for_shift(tgt)) |
@@ -2268,8 +2272,8 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen) | |||
2268 | fragfrom = &skb_shinfo(skb)->frags[from]; | 2272 | fragfrom = &skb_shinfo(skb)->frags[from]; |
2269 | fragto = &skb_shinfo(tgt)->frags[merge]; | 2273 | fragto = &skb_shinfo(tgt)->frags[merge]; |
2270 | 2274 | ||
2271 | fragto->size += shiftlen; | 2275 | skb_frag_size_add(fragto, shiftlen); |
2272 | fragfrom->size -= shiftlen; | 2276 | skb_frag_size_sub(fragfrom, shiftlen); |
2273 | fragfrom->page_offset += shiftlen; | 2277 | fragfrom->page_offset += shiftlen; |
2274 | 2278 | ||
2275 | goto onlymerged; | 2279 | goto onlymerged; |
@@ -2293,9 +2297,9 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen) | |||
2293 | fragfrom = &skb_shinfo(skb)->frags[from]; | 2297 | fragfrom = &skb_shinfo(skb)->frags[from]; |
2294 | fragto = &skb_shinfo(tgt)->frags[to]; | 2298 | fragto = &skb_shinfo(tgt)->frags[to]; |
2295 | 2299 | ||
2296 | if (todo >= fragfrom->size) { | 2300 | if (todo >= skb_frag_size(fragfrom)) { |
2297 | *fragto = *fragfrom; | 2301 | *fragto = *fragfrom; |
2298 | todo -= fragfrom->size; | 2302 | todo -= skb_frag_size(fragfrom); |
2299 | from++; | 2303 | from++; |
2300 | to++; | 2304 | to++; |
2301 | 2305 | ||
@@ -2303,10 +2307,10 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen) | |||
2303 | __skb_frag_ref(fragfrom); | 2307 | __skb_frag_ref(fragfrom); |
2304 | fragto->page = fragfrom->page; | 2308 | fragto->page = fragfrom->page; |
2305 | fragto->page_offset = fragfrom->page_offset; | 2309 | fragto->page_offset = fragfrom->page_offset; |
2306 | fragto->size = todo; | 2310 | skb_frag_size_set(fragto, todo); |
2307 | 2311 | ||
2308 | fragfrom->page_offset += todo; | 2312 | fragfrom->page_offset += todo; |
2309 | fragfrom->size -= todo; | 2313 | skb_frag_size_sub(fragfrom, todo); |
2310 | todo = 0; | 2314 | todo = 0; |
2311 | 2315 | ||
2312 | to++; | 2316 | to++; |
@@ -2321,7 +2325,7 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen) | |||
2321 | fragfrom = &skb_shinfo(skb)->frags[0]; | 2325 | fragfrom = &skb_shinfo(skb)->frags[0]; |
2322 | fragto = &skb_shinfo(tgt)->frags[merge]; | 2326 | fragto = &skb_shinfo(tgt)->frags[merge]; |
2323 | 2327 | ||
2324 | fragto->size += fragfrom->size; | 2328 | skb_frag_size_add(fragto, skb_frag_size(fragfrom)); |
2325 | __skb_frag_unref(fragfrom); | 2329 | __skb_frag_unref(fragfrom); |
2326 | } | 2330 | } |
2327 | 2331 | ||
@@ -2419,7 +2423,7 @@ next_skb: | |||
2419 | 2423 | ||
2420 | while (st->frag_idx < skb_shinfo(st->cur_skb)->nr_frags) { | 2424 | while (st->frag_idx < skb_shinfo(st->cur_skb)->nr_frags) { |
2421 | frag = &skb_shinfo(st->cur_skb)->frags[st->frag_idx]; | 2425 | frag = &skb_shinfo(st->cur_skb)->frags[st->frag_idx]; |
2422 | block_limit = frag->size + st->stepped_offset; | 2426 | block_limit = skb_frag_size(frag) + st->stepped_offset; |
2423 | 2427 | ||
2424 | if (abs_offset < block_limit) { | 2428 | if (abs_offset < block_limit) { |
2425 | if (!st->frag_data) | 2429 | if (!st->frag_data) |
@@ -2437,7 +2441,7 @@ next_skb: | |||
2437 | } | 2441 | } |
2438 | 2442 | ||
2439 | st->frag_idx++; | 2443 | st->frag_idx++; |
2440 | st->stepped_offset += frag->size; | 2444 | st->stepped_offset += skb_frag_size(frag); |
2441 | } | 2445 | } |
2442 | 2446 | ||
2443 | if (st->frag_data) { | 2447 | if (st->frag_data) { |
@@ -2567,13 +2571,13 @@ int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb, | |||
2567 | left = PAGE_SIZE - frag->page_offset; | 2571 | left = PAGE_SIZE - frag->page_offset; |
2568 | copy = (length > left)? left : length; | 2572 | copy = (length > left)? left : length; |
2569 | 2573 | ||
2570 | ret = getfrag(from, skb_frag_address(frag) + frag->size, | 2574 | ret = getfrag(from, skb_frag_address(frag) + skb_frag_size(frag), |
2571 | offset, copy, 0, skb); | 2575 | offset, copy, 0, skb); |
2572 | if (ret < 0) | 2576 | if (ret < 0) |
2573 | return -EFAULT; | 2577 | return -EFAULT; |
2574 | 2578 | ||
2575 | /* copy was successful so update the size parameters */ | 2579 | /* copy was successful so update the size parameters */ |
2576 | frag->size += copy; | 2580 | skb_frag_size_add(frag, copy); |
2577 | skb->len += copy; | 2581 | skb->len += copy; |
2578 | skb->data_len += copy; | 2582 | skb->data_len += copy; |
2579 | offset += copy; | 2583 | offset += copy; |
@@ -2720,11 +2724,11 @@ struct sk_buff *skb_segment(struct sk_buff *skb, u32 features) | |||
2720 | while (pos < offset + len && i < nfrags) { | 2724 | while (pos < offset + len && i < nfrags) { |
2721 | *frag = skb_shinfo(skb)->frags[i]; | 2725 | *frag = skb_shinfo(skb)->frags[i]; |
2722 | __skb_frag_ref(frag); | 2726 | __skb_frag_ref(frag); |
2723 | size = frag->size; | 2727 | size = skb_frag_size(frag); |
2724 | 2728 | ||
2725 | if (pos < offset) { | 2729 | if (pos < offset) { |
2726 | frag->page_offset += offset - pos; | 2730 | frag->page_offset += offset - pos; |
2727 | frag->size -= offset - pos; | 2731 | skb_frag_size_sub(frag, offset - pos); |
2728 | } | 2732 | } |
2729 | 2733 | ||
2730 | skb_shinfo(nskb)->nr_frags++; | 2734 | skb_shinfo(nskb)->nr_frags++; |
@@ -2733,7 +2737,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, u32 features) | |||
2733 | i++; | 2737 | i++; |
2734 | pos += size; | 2738 | pos += size; |
2735 | } else { | 2739 | } else { |
2736 | frag->size -= pos + size - (offset + len); | 2740 | skb_frag_size_sub(frag, pos + size - (offset + len)); |
2737 | goto skip_fraglist; | 2741 | goto skip_fraglist; |
2738 | } | 2742 | } |
2739 | 2743 | ||
@@ -2813,7 +2817,7 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb) | |||
2813 | } while (--i); | 2817 | } while (--i); |
2814 | 2818 | ||
2815 | frag->page_offset += offset; | 2819 | frag->page_offset += offset; |
2816 | frag->size -= offset; | 2820 | skb_frag_size_sub(frag, offset); |
2817 | 2821 | ||
2818 | skb->truesize -= skb->data_len; | 2822 | skb->truesize -= skb->data_len; |
2819 | skb->len -= skb->data_len; | 2823 | skb->len -= skb->data_len; |
@@ -2865,7 +2869,7 @@ merge: | |||
2865 | unsigned int eat = offset - headlen; | 2869 | unsigned int eat = offset - headlen; |
2866 | 2870 | ||
2867 | skbinfo->frags[0].page_offset += eat; | 2871 | skbinfo->frags[0].page_offset += eat; |
2868 | skbinfo->frags[0].size -= eat; | 2872 | skb_frag_size_sub(&skbinfo->frags[0], eat); |
2869 | skb->data_len -= eat; | 2873 | skb->data_len -= eat; |
2870 | skb->len -= eat; | 2874 | skb->len -= eat; |
2871 | offset = headlen; | 2875 | offset = headlen; |
@@ -2936,7 +2940,7 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len) | |||
2936 | 2940 | ||
2937 | WARN_ON(start > offset + len); | 2941 | WARN_ON(start > offset + len); |
2938 | 2942 | ||
2939 | end = start + skb_shinfo(skb)->frags[i].size; | 2943 | end = start + skb_frag_size(&skb_shinfo(skb)->frags[i]); |
2940 | if ((copy = end - offset) > 0) { | 2944 | if ((copy = end - offset) > 0) { |
2941 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | 2945 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; |
2942 | 2946 | ||
diff --git a/net/core/user_dma.c b/net/core/user_dma.c index 34e9664cae3b..2d7cf3d52b4c 100644 --- a/net/core/user_dma.c +++ b/net/core/user_dma.c | |||
@@ -71,13 +71,13 @@ int dma_skb_copy_datagram_iovec(struct dma_chan *chan, | |||
71 | /* Copy paged appendix. Hmm... why does this look so complicated? */ | 71 | /* Copy paged appendix. Hmm... why does this look so complicated? */ |
72 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 72 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
73 | int end; | 73 | int end; |
74 | const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
74 | 75 | ||
75 | WARN_ON(start > offset + len); | 76 | WARN_ON(start > offset + len); |
76 | 77 | ||
77 | end = start + skb_shinfo(skb)->frags[i].size; | 78 | end = start + skb_frag_size(frag); |
78 | copy = end - offset; | 79 | copy = end - offset; |
79 | if (copy > 0) { | 80 | if (copy > 0) { |
80 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
81 | struct page *page = skb_frag_page(frag); | 81 | struct page *page = skb_frag_page(frag); |
82 | 82 | ||
83 | if (copy > len) | 83 | if (copy > len) |
diff --git a/net/ipv4/inet_lro.c b/net/ipv4/inet_lro.c index 8e6be5aad115..cc280a3f4f96 100644 --- a/net/ipv4/inet_lro.c +++ b/net/ipv4/inet_lro.c | |||
@@ -244,11 +244,11 @@ static void lro_add_frags(struct net_lro_desc *lro_desc, | |||
244 | skb->truesize += truesize; | 244 | skb->truesize += truesize; |
245 | 245 | ||
246 | skb_frags[0].page_offset += hlen; | 246 | skb_frags[0].page_offset += hlen; |
247 | skb_frags[0].size -= hlen; | 247 | skb_frag_size_sub(&skb_frags[0], hlen); |
248 | 248 | ||
249 | while (tcp_data_len > 0) { | 249 | while (tcp_data_len > 0) { |
250 | *(lro_desc->next_frag) = *skb_frags; | 250 | *(lro_desc->next_frag) = *skb_frags; |
251 | tcp_data_len -= skb_frags->size; | 251 | tcp_data_len -= skb_frag_size(skb_frags); |
252 | lro_desc->next_frag++; | 252 | lro_desc->next_frag++; |
253 | skb_frags++; | 253 | skb_frags++; |
254 | skb_shinfo(skb)->nr_frags++; | 254 | skb_shinfo(skb)->nr_frags++; |
@@ -400,14 +400,14 @@ static struct sk_buff *lro_gen_skb(struct net_lro_mgr *lro_mgr, | |||
400 | skb_frags = skb_shinfo(skb)->frags; | 400 | skb_frags = skb_shinfo(skb)->frags; |
401 | while (data_len > 0) { | 401 | while (data_len > 0) { |
402 | *skb_frags = *frags; | 402 | *skb_frags = *frags; |
403 | data_len -= frags->size; | 403 | data_len -= skb_frag_size(frags); |
404 | skb_frags++; | 404 | skb_frags++; |
405 | frags++; | 405 | frags++; |
406 | skb_shinfo(skb)->nr_frags++; | 406 | skb_shinfo(skb)->nr_frags++; |
407 | } | 407 | } |
408 | 408 | ||
409 | skb_shinfo(skb)->frags[0].page_offset += hdr_len; | 409 | skb_shinfo(skb)->frags[0].page_offset += hdr_len; |
410 | skb_shinfo(skb)->frags[0].size -= hdr_len; | 410 | skb_frag_size_sub(&skb_shinfo(skb)->frags[0], hdr_len); |
411 | 411 | ||
412 | skb->ip_summed = ip_summed; | 412 | skb->ip_summed = ip_summed; |
413 | skb->csum = sum; | 413 | skb->csum = sum; |
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index 763589ad673d..fdaabf2f2b68 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
@@ -599,8 +599,8 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev, | |||
599 | head->next = clone; | 599 | head->next = clone; |
600 | skb_shinfo(clone)->frag_list = skb_shinfo(head)->frag_list; | 600 | skb_shinfo(clone)->frag_list = skb_shinfo(head)->frag_list; |
601 | skb_frag_list_init(head); | 601 | skb_frag_list_init(head); |
602 | for (i=0; i<skb_shinfo(head)->nr_frags; i++) | 602 | for (i = 0; i < skb_shinfo(head)->nr_frags; i++) |
603 | plen += skb_shinfo(head)->frags[i].size; | 603 | plen += skb_frag_size(&skb_shinfo(head)->frags[i]); |
604 | clone->len = clone->data_len = head->data_len - plen; | 604 | clone->len = clone->data_len = head->data_len - plen; |
605 | head->data_len -= clone->len; | 605 | head->data_len -= clone->len; |
606 | head->len -= clone->len; | 606 | head->len -= clone->len; |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index ae3bb147affd..e1374ab034bb 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -1015,13 +1015,13 @@ alloc_new_skb: | |||
1015 | err = -EMSGSIZE; | 1015 | err = -EMSGSIZE; |
1016 | goto error; | 1016 | goto error; |
1017 | } | 1017 | } |
1018 | if (getfrag(from, skb_frag_address(frag)+frag->size, | 1018 | if (getfrag(from, skb_frag_address(frag)+skb_frag_size(frag), |
1019 | offset, copy, skb->len, skb) < 0) { | 1019 | offset, copy, skb->len, skb) < 0) { |
1020 | err = -EFAULT; | 1020 | err = -EFAULT; |
1021 | goto error; | 1021 | goto error; |
1022 | } | 1022 | } |
1023 | cork->off += copy; | 1023 | cork->off += copy; |
1024 | frag->size += copy; | 1024 | skb_frag_size_add(frag, copy); |
1025 | skb->len += copy; | 1025 | skb->len += copy; |
1026 | skb->data_len += copy; | 1026 | skb->data_len += copy; |
1027 | skb->truesize += copy; | 1027 | skb->truesize += copy; |
@@ -1230,7 +1230,7 @@ ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page, | |||
1230 | if (len > size) | 1230 | if (len > size) |
1231 | len = size; | 1231 | len = size; |
1232 | if (skb_can_coalesce(skb, i, page, offset)) { | 1232 | if (skb_can_coalesce(skb, i, page, offset)) { |
1233 | skb_shinfo(skb)->frags[i-1].size += len; | 1233 | skb_frag_size_add(&skb_shinfo(skb)->frags[i-1], len); |
1234 | } else if (i < MAX_SKB_FRAGS) { | 1234 | } else if (i < MAX_SKB_FRAGS) { |
1235 | get_page(page); | 1235 | get_page(page); |
1236 | skb_fill_page_desc(skb, i, page, offset, len); | 1236 | skb_fill_page_desc(skb, i, page, offset, len); |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 4c0da24fb649..132be081cd00 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -813,7 +813,7 @@ new_segment: | |||
813 | goto wait_for_memory; | 813 | goto wait_for_memory; |
814 | 814 | ||
815 | if (can_coalesce) { | 815 | if (can_coalesce) { |
816 | skb_shinfo(skb)->frags[i - 1].size += copy; | 816 | skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy); |
817 | } else { | 817 | } else { |
818 | get_page(page); | 818 | get_page(page); |
819 | skb_fill_page_desc(skb, i, page, offset, copy); | 819 | skb_fill_page_desc(skb, i, page, offset, copy); |
@@ -1058,8 +1058,7 @@ new_segment: | |||
1058 | 1058 | ||
1059 | /* Update the skb. */ | 1059 | /* Update the skb. */ |
1060 | if (merge) { | 1060 | if (merge) { |
1061 | skb_shinfo(skb)->frags[i - 1].size += | 1061 | skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy); |
1062 | copy; | ||
1063 | } else { | 1062 | } else { |
1064 | skb_fill_page_desc(skb, i, page, off, copy); | 1063 | skb_fill_page_desc(skb, i, page, off, copy); |
1065 | if (TCP_PAGE(sk)) { | 1064 | if (TCP_PAGE(sk)) { |
@@ -3031,8 +3030,8 @@ int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *hp, | |||
3031 | for (i = 0; i < shi->nr_frags; ++i) { | 3030 | for (i = 0; i < shi->nr_frags; ++i) { |
3032 | const struct skb_frag_struct *f = &shi->frags[i]; | 3031 | const struct skb_frag_struct *f = &shi->frags[i]; |
3033 | struct page *page = skb_frag_page(f); | 3032 | struct page *page = skb_frag_page(f); |
3034 | sg_set_page(&sg, page, f->size, f->page_offset); | 3033 | sg_set_page(&sg, page, skb_frag_size(f), f->page_offset); |
3035 | if (crypto_hash_update(desc, &sg, f->size)) | 3034 | if (crypto_hash_update(desc, &sg, skb_frag_size(f))) |
3036 | return 1; | 3035 | return 1; |
3037 | } | 3036 | } |
3038 | 3037 | ||
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index dde6b5768316..ed96c543f1cf 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -1094,14 +1094,16 @@ static void __pskb_trim_head(struct sk_buff *skb, int len) | |||
1094 | eat = len; | 1094 | eat = len; |
1095 | k = 0; | 1095 | k = 0; |
1096 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 1096 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
1097 | if (skb_shinfo(skb)->frags[i].size <= eat) { | 1097 | int size = skb_frag_size(&skb_shinfo(skb)->frags[i]); |
1098 | |||
1099 | if (size <= eat) { | ||
1098 | skb_frag_unref(skb, i); | 1100 | skb_frag_unref(skb, i); |
1099 | eat -= skb_shinfo(skb)->frags[i].size; | 1101 | eat -= size; |
1100 | } else { | 1102 | } else { |
1101 | skb_shinfo(skb)->frags[k] = skb_shinfo(skb)->frags[i]; | 1103 | skb_shinfo(skb)->frags[k] = skb_shinfo(skb)->frags[i]; |
1102 | if (eat) { | 1104 | if (eat) { |
1103 | skb_shinfo(skb)->frags[k].page_offset += eat; | 1105 | skb_shinfo(skb)->frags[k].page_offset += eat; |
1104 | skb_shinfo(skb)->frags[k].size -= eat; | 1106 | skb_frag_size_sub(&skb_shinfo(skb)->frags[k], eat); |
1105 | eat = 0; | 1107 | eat = 0; |
1106 | } | 1108 | } |
1107 | k++; | 1109 | k++; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 1e20b64e646c..1c9bf8b5c30a 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -1512,13 +1512,14 @@ alloc_new_skb: | |||
1512 | err = -EMSGSIZE; | 1512 | err = -EMSGSIZE; |
1513 | goto error; | 1513 | goto error; |
1514 | } | 1514 | } |
1515 | if (getfrag(from, skb_frag_address(frag)+frag->size, | 1515 | if (getfrag(from, |
1516 | skb_frag_address(frag) + skb_frag_size(frag), | ||
1516 | offset, copy, skb->len, skb) < 0) { | 1517 | offset, copy, skb->len, skb) < 0) { |
1517 | err = -EFAULT; | 1518 | err = -EFAULT; |
1518 | goto error; | 1519 | goto error; |
1519 | } | 1520 | } |
1520 | sk->sk_sndmsg_off += copy; | 1521 | sk->sk_sndmsg_off += copy; |
1521 | frag->size += copy; | 1522 | skb_frag_size_add(frag, copy); |
1522 | skb->len += copy; | 1523 | skb->len += copy; |
1523 | skb->data_len += copy; | 1524 | skb->data_len += copy; |
1524 | skb->truesize += copy; | 1525 | skb->truesize += copy; |
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 085727263812..e8762c73b170 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
@@ -378,8 +378,8 @@ nf_ct_frag6_reasm(struct nf_ct_frag6_queue *fq, struct net_device *dev) | |||
378 | head->next = clone; | 378 | head->next = clone; |
379 | skb_shinfo(clone)->frag_list = skb_shinfo(head)->frag_list; | 379 | skb_shinfo(clone)->frag_list = skb_shinfo(head)->frag_list; |
380 | skb_frag_list_init(head); | 380 | skb_frag_list_init(head); |
381 | for (i=0; i<skb_shinfo(head)->nr_frags; i++) | 381 | for (i = 0; i < skb_shinfo(head)->nr_frags; i++) |
382 | plen += skb_shinfo(head)->frags[i].size; | 382 | plen += skb_frag_size(&skb_shinfo(head)->frags[i]); |
383 | clone->len = clone->data_len = head->data_len - plen; | 383 | clone->len = clone->data_len = head->data_len - plen; |
384 | head->data_len -= clone->len; | 384 | head->data_len -= clone->len; |
385 | head->len -= clone->len; | 385 | head->len -= clone->len; |
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index 7b954e2539d0..cc22099ac8b6 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
@@ -464,8 +464,8 @@ static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, | |||
464 | head->next = clone; | 464 | head->next = clone; |
465 | skb_shinfo(clone)->frag_list = skb_shinfo(head)->frag_list; | 465 | skb_shinfo(clone)->frag_list = skb_shinfo(head)->frag_list; |
466 | skb_frag_list_init(head); | 466 | skb_frag_list_init(head); |
467 | for (i=0; i<skb_shinfo(head)->nr_frags; i++) | 467 | for (i = 0; i < skb_shinfo(head)->nr_frags; i++) |
468 | plen += skb_shinfo(head)->frags[i].size; | 468 | plen += skb_frag_size(&skb_shinfo(head)->frags[i]); |
469 | clone->len = clone->data_len = head->data_len - plen; | 469 | clone->len = clone->data_len = head->data_len - plen; |
470 | head->data_len -= clone->len; | 470 | head->data_len -= clone->len; |
471 | head->len -= clone->len; | 471 | head->len -= clone->len; |
diff --git a/net/xfrm/xfrm_ipcomp.c b/net/xfrm/xfrm_ipcomp.c index f781b9ab8a54..e5246fbe36c4 100644 --- a/net/xfrm/xfrm_ipcomp.c +++ b/net/xfrm/xfrm_ipcomp.c | |||
@@ -90,7 +90,7 @@ static int ipcomp_decompress(struct xfrm_state *x, struct sk_buff *skb) | |||
90 | len = dlen; | 90 | len = dlen; |
91 | 91 | ||
92 | frag->page_offset = 0; | 92 | frag->page_offset = 0; |
93 | frag->size = len; | 93 | skb_frag_size_set(frag, len); |
94 | memcpy(skb_frag_address(frag), scratch, len); | 94 | memcpy(skb_frag_address(frag), scratch, len); |
95 | 95 | ||
96 | skb->truesize += len; | 96 | skb->truesize += len; |