@@ -1863,10 +1863,7 @@ static const struct bpf_func_proto bpf_sk_fullsock_proto = {
1863
1863
static inline int sk_skb_try_make_writable (struct sk_buff * skb ,
1864
1864
unsigned int write_len )
1865
1865
{
1866
- int err = __bpf_try_make_writable (skb , write_len );
1867
-
1868
- bpf_compute_data_end_sk_skb (skb );
1869
- return err ;
1866
+ return __bpf_try_make_writable (skb , write_len );
1870
1867
}
1871
1868
1872
1869
BPF_CALL_2 (sk_skb_pull_data , struct sk_buff * , skb , u32 , len )
@@ -3577,7 +3574,6 @@ BPF_CALL_4(sk_skb_adjust_room, struct sk_buff *, skb, s32, len_diff,
3577
3574
return - ENOMEM ;
3578
3575
__skb_pull (skb , len_diff_abs );
3579
3576
}
3580
- bpf_compute_data_end_sk_skb (skb );
3581
3577
if (tls_sw_has_ctx_rx (skb -> sk )) {
3582
3578
struct strp_msg * rxm = strp_msg (skb );
3583
3579
@@ -3742,10 +3738,7 @@ static const struct bpf_func_proto bpf_skb_change_tail_proto = {
3742
3738
BPF_CALL_3 (sk_skb_change_tail , struct sk_buff * , skb , u32 , new_len ,
3743
3739
u64 , flags )
3744
3740
{
3745
- int ret = __bpf_skb_change_tail (skb , new_len , flags );
3746
-
3747
- bpf_compute_data_end_sk_skb (skb );
3748
- return ret ;
3741
+ return __bpf_skb_change_tail (skb , new_len , flags );
3749
3742
}
3750
3743
3751
3744
static const struct bpf_func_proto sk_skb_change_tail_proto = {
@@ -3808,10 +3801,7 @@ static const struct bpf_func_proto bpf_skb_change_head_proto = {
3808
3801
BPF_CALL_3 (sk_skb_change_head , struct sk_buff * , skb , u32 , head_room ,
3809
3802
u64 , flags )
3810
3803
{
3811
- int ret = __bpf_skb_change_head (skb , head_room , flags );
3812
-
3813
- bpf_compute_data_end_sk_skb (skb );
3814
- return ret ;
3804
+ return __bpf_skb_change_head (skb , head_room , flags );
3815
3805
}
3816
3806
3817
3807
static const struct bpf_func_proto sk_skb_change_head_proto = {
@@ -9655,22 +9645,40 @@ static u32 sock_ops_convert_ctx_access(enum bpf_access_type type,
9655
9645
return insn - insn_buf ;
9656
9646
}
9657
9647
9648
+ /* data_end = skb->data + skb_headlen() */
9649
+ static struct bpf_insn * bpf_convert_data_end_access (const struct bpf_insn * si ,
9650
+ struct bpf_insn * insn )
9651
+ {
9652
+ /* si->dst_reg = skb->data */
9653
+ * insn ++ = BPF_LDX_MEM (BPF_FIELD_SIZEOF (struct sk_buff , data ),
9654
+ si -> dst_reg , si -> src_reg ,
9655
+ offsetof(struct sk_buff , data ));
9656
+ /* AX = skb->len */
9657
+ * insn ++ = BPF_LDX_MEM (BPF_FIELD_SIZEOF (struct sk_buff , len ),
9658
+ BPF_REG_AX , si -> src_reg ,
9659
+ offsetof(struct sk_buff , len ));
9660
+ /* si->dst_reg = skb->data + skb->len */
9661
+ * insn ++ = BPF_ALU64_REG (BPF_ADD , si -> dst_reg , BPF_REG_AX );
9662
+ /* AX = skb->data_len */
9663
+ * insn ++ = BPF_LDX_MEM (BPF_FIELD_SIZEOF (struct sk_buff , data_len ),
9664
+ BPF_REG_AX , si -> src_reg ,
9665
+ offsetof(struct sk_buff , data_len ));
9666
+ /* si->dst_reg = skb->data + skb->len - skb->data_len */
9667
+ * insn ++ = BPF_ALU64_REG (BPF_SUB , si -> dst_reg , BPF_REG_AX );
9668
+
9669
+ return insn ;
9670
+ }
9671
+
9658
9672
static u32 sk_skb_convert_ctx_access (enum bpf_access_type type ,
9659
9673
const struct bpf_insn * si ,
9660
9674
struct bpf_insn * insn_buf ,
9661
9675
struct bpf_prog * prog , u32 * target_size )
9662
9676
{
9663
9677
struct bpf_insn * insn = insn_buf ;
9664
- int off ;
9665
9678
9666
9679
switch (si -> off ) {
9667
9680
case offsetof(struct __sk_buff , data_end ):
9668
- off = si -> off ;
9669
- off -= offsetof(struct __sk_buff , data_end );
9670
- off += offsetof(struct sk_buff , cb );
9671
- off += offsetof(struct tcp_skb_cb , bpf .data_end );
9672
- * insn ++ = BPF_LDX_MEM (BPF_SIZEOF (void * ), si -> dst_reg ,
9673
- si -> src_reg , off );
9681
+ insn = bpf_convert_data_end_access (si , insn );
9674
9682
break ;
9675
9683
default :
9676
9684
return bpf_convert_ctx_access (type , si , insn_buf , prog ,
0 commit comments