Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ipv6: rpl: Remove pskb(_may)?_pull() in ipv6_rpl_srh_rcv().

As Eric Dumazet pointed out [0], ipv6_rthdr_rcv() pulls these data

- Segment Routing Header : 8
- Hdr Ext Len : skb_transport_header(skb)[1] << 3

needed by ipv6_rpl_srh_rcv(). We can remove pskb_may_pull() and
replace pskb_pull() with skb_pull() in ipv6_rpl_srh_rcv().

Link: https://lore.kernel.org/netdev/CANn89iLboLwLrHXeHJucAqBkEL_S0rJFog68t7wwwXO-aNf5Mg@mail.gmail.com/ [0]
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Kuniyuki Iwashima and committed by
Jakub Kicinski
ac9d8a66 9a94d764

+1 -26
-3
include/net/rpl.h
··· 23 23 static inline void rpl_exit(void) {} 24 24 #endif 25 25 26 - size_t ipv6_rpl_srh_size(unsigned char n, unsigned char cmpri, 27 - unsigned char cmpre); 28 - 29 26 void ipv6_rpl_srh_decompress(struct ipv6_rpl_sr_hdr *outhdr, 30 27 const struct ipv6_rpl_sr_hdr *inhdr, 31 28 const struct in6_addr *daddr, unsigned char n);
+1 -16
net/ipv6/exthdrs.c
··· 517 517 518 518 skb_postpull_rcsum(skb, skb_network_header(skb), 519 519 skb_network_header_len(skb)); 520 - 521 - if (!pskb_pull(skb, offset)) { 522 - kfree_skb(skb); 523 - return -1; 524 - } 520 + skb_pull(skb, offset); 525 521 skb_postpull_rcsum(skb, skb_transport_header(skb), 526 522 offset); 527 523 ··· 539 543 return 1; 540 544 } 541 545 542 - if (!pskb_may_pull(skb, sizeof(*hdr))) { 543 - kfree_skb(skb); 544 - return -1; 545 - } 546 - 547 546 n = (hdr->hdrlen << 3) - hdr->pad - (16 - hdr->cmpre); 548 547 r = do_div(n, (16 - hdr->cmpri)); 549 548 /* checks if calculation was without remainder and n fits into ··· 555 564 icmpv6_param_prob(skb, ICMPV6_HDR_FIELD, 556 565 ((&hdr->segments_left) - 557 566 skb_network_header(skb))); 558 - return -1; 559 - } 560 - 561 - if (!pskb_may_pull(skb, ipv6_rpl_srh_size(n, hdr->cmpri, 562 - hdr->cmpre))) { 563 - kfree_skb(skb); 564 567 return -1; 565 568 } 566 569
-7
net/ipv6/rpl.c
··· 29 29 return (void *)&hdr->rpl_segdata[i * IPV6_PFXTAIL_LEN(hdr->cmpri)]; 30 30 } 31 31 32 - size_t ipv6_rpl_srh_size(unsigned char n, unsigned char cmpri, 33 - unsigned char cmpre) 34 - { 35 - return sizeof(struct ipv6_rpl_sr_hdr) + (n * IPV6_PFXTAIL_LEN(cmpri)) + 36 - IPV6_PFXTAIL_LEN(cmpre); 37 - } 38 - 39 32 void ipv6_rpl_srh_decompress(struct ipv6_rpl_sr_hdr *outhdr, 40 33 const struct ipv6_rpl_sr_hdr *inhdr, 41 34 const struct in6_addr *daddr, unsigned char n)