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>
This commit is contained in:
parent
dd767856a3
commit
9e903e0852
87 changed files with 387 additions and 357 deletions
|
@ -244,11 +244,11 @@ static void lro_add_frags(struct net_lro_desc *lro_desc,
|
|||
skb->truesize += truesize;
|
||||
|
||||
skb_frags[0].page_offset += hlen;
|
||||
skb_frags[0].size -= hlen;
|
||||
skb_frag_size_sub(&skb_frags[0], hlen);
|
||||
|
||||
while (tcp_data_len > 0) {
|
||||
*(lro_desc->next_frag) = *skb_frags;
|
||||
tcp_data_len -= skb_frags->size;
|
||||
tcp_data_len -= skb_frag_size(skb_frags);
|
||||
lro_desc->next_frag++;
|
||||
skb_frags++;
|
||||
skb_shinfo(skb)->nr_frags++;
|
||||
|
@ -400,14 +400,14 @@ static struct sk_buff *lro_gen_skb(struct net_lro_mgr *lro_mgr,
|
|||
skb_frags = skb_shinfo(skb)->frags;
|
||||
while (data_len > 0) {
|
||||
*skb_frags = *frags;
|
||||
data_len -= frags->size;
|
||||
data_len -= skb_frag_size(frags);
|
||||
skb_frags++;
|
||||
frags++;
|
||||
skb_shinfo(skb)->nr_frags++;
|
||||
}
|
||||
|
||||
skb_shinfo(skb)->frags[0].page_offset += hdr_len;
|
||||
skb_shinfo(skb)->frags[0].size -= hdr_len;
|
||||
skb_frag_size_sub(&skb_shinfo(skb)->frags[0], hdr_len);
|
||||
|
||||
skb->ip_summed = ip_summed;
|
||||
skb->csum = sum;
|
||||
|
|
|
@ -599,8 +599,8 @@ static int ip_frag_reasm(struct ipq *qp, struct sk_buff *prev,
|
|||
head->next = clone;
|
||||
skb_shinfo(clone)->frag_list = skb_shinfo(head)->frag_list;
|
||||
skb_frag_list_init(head);
|
||||
for (i=0; i<skb_shinfo(head)->nr_frags; i++)
|
||||
plen += skb_shinfo(head)->frags[i].size;
|
||||
for (i = 0; i < skb_shinfo(head)->nr_frags; i++)
|
||||
plen += skb_frag_size(&skb_shinfo(head)->frags[i]);
|
||||
clone->len = clone->data_len = head->data_len - plen;
|
||||
head->data_len -= clone->len;
|
||||
head->len -= clone->len;
|
||||
|
|
|
@ -1015,13 +1015,13 @@ alloc_new_skb:
|
|||
err = -EMSGSIZE;
|
||||
goto error;
|
||||
}
|
||||
if (getfrag(from, skb_frag_address(frag)+frag->size,
|
||||
if (getfrag(from, skb_frag_address(frag)+skb_frag_size(frag),
|
||||
offset, copy, skb->len, skb) < 0) {
|
||||
err = -EFAULT;
|
||||
goto error;
|
||||
}
|
||||
cork->off += copy;
|
||||
frag->size += copy;
|
||||
skb_frag_size_add(frag, copy);
|
||||
skb->len += copy;
|
||||
skb->data_len += copy;
|
||||
skb->truesize += copy;
|
||||
|
@ -1230,7 +1230,7 @@ ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page,
|
|||
if (len > size)
|
||||
len = size;
|
||||
if (skb_can_coalesce(skb, i, page, offset)) {
|
||||
skb_shinfo(skb)->frags[i-1].size += len;
|
||||
skb_frag_size_add(&skb_shinfo(skb)->frags[i-1], len);
|
||||
} else if (i < MAX_SKB_FRAGS) {
|
||||
get_page(page);
|
||||
skb_fill_page_desc(skb, i, page, offset, len);
|
||||
|
|
|
@ -813,7 +813,7 @@ new_segment:
|
|||
goto wait_for_memory;
|
||||
|
||||
if (can_coalesce) {
|
||||
skb_shinfo(skb)->frags[i - 1].size += copy;
|
||||
skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy);
|
||||
} else {
|
||||
get_page(page);
|
||||
skb_fill_page_desc(skb, i, page, offset, copy);
|
||||
|
@ -1058,8 +1058,7 @@ new_segment:
|
|||
|
||||
/* Update the skb. */
|
||||
if (merge) {
|
||||
skb_shinfo(skb)->frags[i - 1].size +=
|
||||
copy;
|
||||
skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy);
|
||||
} else {
|
||||
skb_fill_page_desc(skb, i, page, off, copy);
|
||||
if (TCP_PAGE(sk)) {
|
||||
|
@ -3031,8 +3030,8 @@ int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *hp,
|
|||
for (i = 0; i < shi->nr_frags; ++i) {
|
||||
const struct skb_frag_struct *f = &shi->frags[i];
|
||||
struct page *page = skb_frag_page(f);
|
||||
sg_set_page(&sg, page, f->size, f->page_offset);
|
||||
if (crypto_hash_update(desc, &sg, f->size))
|
||||
sg_set_page(&sg, page, skb_frag_size(f), f->page_offset);
|
||||
if (crypto_hash_update(desc, &sg, skb_frag_size(f)))
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -1094,14 +1094,16 @@ static void __pskb_trim_head(struct sk_buff *skb, int len)
|
|||
eat = len;
|
||||
k = 0;
|
||||
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
|
||||
if (skb_shinfo(skb)->frags[i].size <= eat) {
|
||||
int size = skb_frag_size(&skb_shinfo(skb)->frags[i]);
|
||||
|
||||
if (size <= eat) {
|
||||
skb_frag_unref(skb, i);
|
||||
eat -= skb_shinfo(skb)->frags[i].size;
|
||||
eat -= size;
|
||||
} else {
|
||||
skb_shinfo(skb)->frags[k] = skb_shinfo(skb)->frags[i];
|
||||
if (eat) {
|
||||
skb_shinfo(skb)->frags[k].page_offset += eat;
|
||||
skb_shinfo(skb)->frags[k].size -= eat;
|
||||
skb_frag_size_sub(&skb_shinfo(skb)->frags[k], eat);
|
||||
eat = 0;
|
||||
}
|
||||
k++;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue