| .. | .. |
|---|
| 552 | 552 | return -1; |
|---|
| 553 | 553 | } |
|---|
| 554 | 554 | |
|---|
| 555 | | - if (skb_cloned(skb)) { |
|---|
| 556 | | - if (pskb_expand_head(skb, IPV6_RPL_SRH_WORST_SWAP_SIZE, 0, |
|---|
| 557 | | - GFP_ATOMIC)) { |
|---|
| 558 | | - __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), |
|---|
| 559 | | - IPSTATS_MIB_OUTDISCARDS); |
|---|
| 560 | | - kfree_skb(skb); |
|---|
| 561 | | - return -1; |
|---|
| 562 | | - } |
|---|
| 563 | | - } else { |
|---|
| 564 | | - err = skb_cow_head(skb, IPV6_RPL_SRH_WORST_SWAP_SIZE); |
|---|
| 565 | | - if (unlikely(err)) { |
|---|
| 566 | | - kfree_skb(skb); |
|---|
| 567 | | - return -1; |
|---|
| 568 | | - } |
|---|
| 569 | | - } |
|---|
| 570 | | - |
|---|
| 571 | | - hdr = (struct ipv6_rpl_sr_hdr *)skb_transport_header(skb); |
|---|
| 572 | | - |
|---|
| 573 | 555 | if (!pskb_may_pull(skb, ipv6_rpl_srh_size(n, hdr->cmpri, |
|---|
| 574 | 556 | hdr->cmpre))) { |
|---|
| 575 | 557 | kfree_skb(skb); |
|---|
| .. | .. |
|---|
| 615 | 597 | skb_pull(skb, ((hdr->hdrlen + 1) << 3)); |
|---|
| 616 | 598 | skb_postpull_rcsum(skb, oldhdr, |
|---|
| 617 | 599 | sizeof(struct ipv6hdr) + ((hdr->hdrlen + 1) << 3)); |
|---|
| 600 | + if (unlikely(!hdr->segments_left)) { |
|---|
| 601 | + if (pskb_expand_head(skb, sizeof(struct ipv6hdr) + ((chdr->hdrlen + 1) << 3), 0, |
|---|
| 602 | + GFP_ATOMIC)) { |
|---|
| 603 | + __IP6_INC_STATS(net, ip6_dst_idev(skb_dst(skb)), IPSTATS_MIB_OUTDISCARDS); |
|---|
| 604 | + kfree_skb(skb); |
|---|
| 605 | + kfree(buf); |
|---|
| 606 | + return -1; |
|---|
| 607 | + } |
|---|
| 608 | + |
|---|
| 609 | + oldhdr = ipv6_hdr(skb); |
|---|
| 610 | + } |
|---|
| 618 | 611 | skb_push(skb, ((chdr->hdrlen + 1) << 3) + sizeof(struct ipv6hdr)); |
|---|
| 619 | 612 | skb_reset_network_header(skb); |
|---|
| 620 | 613 | skb_mac_header_rebuild(skb); |
|---|