mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Merge net into net-next because some upcoming net-next changes build on top of bug fixes that went into net. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
e6ff4c75f9
630 changed files with 6557 additions and 4149 deletions
|
@ -2887,6 +2887,7 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb,
|
|||
unsigned int mss;
|
||||
struct sk_buff *gso_skb = skb;
|
||||
__sum16 newcheck;
|
||||
bool ooo_okay, copy_destructor;
|
||||
|
||||
if (!pskb_may_pull(skb, sizeof(*th)))
|
||||
goto out;
|
||||
|
@ -2927,10 +2928,18 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb,
|
|||
goto out;
|
||||
}
|
||||
|
||||
copy_destructor = gso_skb->destructor == tcp_wfree;
|
||||
ooo_okay = gso_skb->ooo_okay;
|
||||
/* All segments but the first should have ooo_okay cleared */
|
||||
skb->ooo_okay = 0;
|
||||
|
||||
segs = skb_segment(skb, features);
|
||||
if (IS_ERR(segs))
|
||||
goto out;
|
||||
|
||||
/* Only first segment might have ooo_okay set */
|
||||
segs->ooo_okay = ooo_okay;
|
||||
|
||||
delta = htonl(oldlen + (thlen + mss));
|
||||
|
||||
skb = segs;
|
||||
|
@ -2950,6 +2959,17 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb,
|
|||
thlen, skb->csum));
|
||||
|
||||
seq += mss;
|
||||
if (copy_destructor) {
|
||||
skb->destructor = gso_skb->destructor;
|
||||
skb->sk = gso_skb->sk;
|
||||
/* {tcp|sock}_wfree() use exact truesize accounting :
|
||||
* sum(skb->truesize) MUST be exactly be gso_skb->truesize
|
||||
* So we account mss bytes of 'true size' for each segment.
|
||||
* The last segment will contain the remaining.
|
||||
*/
|
||||
skb->truesize = mss;
|
||||
gso_skb->truesize -= mss;
|
||||
}
|
||||
skb = skb->next;
|
||||
th = tcp_hdr(skb);
|
||||
|
||||
|
@ -2962,7 +2982,7 @@ struct sk_buff *tcp_tso_segment(struct sk_buff *skb,
|
|||
* is freed at TX completion, and not right now when gso_skb
|
||||
* is freed by GSO engine
|
||||
*/
|
||||
if (gso_skb->destructor == tcp_wfree) {
|
||||
if (copy_destructor) {
|
||||
swap(gso_skb->sk, skb->sk);
|
||||
swap(gso_skb->destructor, skb->destructor);
|
||||
swap(gso_skb->truesize, skb->truesize);
|
||||
|
@ -3213,8 +3233,11 @@ 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, skb_frag_size(f), f->page_offset);
|
||||
unsigned int offset = f->page_offset;
|
||||
struct page *page = skb_frag_page(f) + (offset >> PAGE_SHIFT);
|
||||
|
||||
sg_set_page(&sg, page, skb_frag_size(f),
|
||||
offset_in_page(offset));
|
||||
if (crypto_hash_update(desc, &sg, skb_frag_size(f)))
|
||||
return 1;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue