@@ -2602,6 +2602,22 @@ BPF_CALL_2(bpf_msg_cork_bytes, struct sk_msg *, msg, u32, bytes)
2602
2602
return 0 ;
2603
2603
}
2604
2604
2605
+ static void sk_msg_reset_curr (struct sk_msg * msg )
2606
+ {
2607
+ u32 i = msg -> sg .start ;
2608
+ u32 len = 0 ;
2609
+
2610
+ do {
2611
+ len += sk_msg_elem (msg , i )-> length ;
2612
+ sk_msg_iter_var_next (i );
2613
+ if (len >= msg -> sg .size )
2614
+ break ;
2615
+ } while (i != msg -> sg .end );
2616
+
2617
+ msg -> sg .curr = i ;
2618
+ msg -> sg .copybreak = 0 ;
2619
+ }
2620
+
2605
2621
static const struct bpf_func_proto bpf_msg_cork_bytes_proto = {
2606
2622
.func = bpf_msg_cork_bytes ,
2607
2623
.gpl_only = false,
@@ -2721,6 +2737,7 @@ BPF_CALL_4(bpf_msg_pull_data, struct sk_msg *, msg, u32, start,
2721
2737
msg -> sg .end - shift + NR_MSG_FRAG_IDS :
2722
2738
msg -> sg .end - shift ;
2723
2739
out :
2740
+ sk_msg_reset_curr (msg );
2724
2741
msg -> data = sg_virt (& msg -> sg .data [first_sge ]) + start - offset ;
2725
2742
msg -> data_end = msg -> data + bytes ;
2726
2743
return 0 ;
@@ -2857,6 +2874,7 @@ BPF_CALL_4(bpf_msg_push_data, struct sk_msg *, msg, u32, start,
2857
2874
msg -> sg .data [new ] = rsge ;
2858
2875
}
2859
2876
2877
+ sk_msg_reset_curr (msg );
2860
2878
sk_msg_compute_data_pointers (msg );
2861
2879
return 0 ;
2862
2880
}
@@ -3025,6 +3043,7 @@ BPF_CALL_4(bpf_msg_pop_data, struct sk_msg *, msg, u32, start,
3025
3043
3026
3044
sk_mem_uncharge (msg -> sk , len - pop );
3027
3045
msg -> sg .size -= (len - pop );
3046
+ sk_msg_reset_curr (msg );
3028
3047
sk_msg_compute_data_pointers (msg );
3029
3048
return 0 ;
3030
3049
}
0 commit comments