|
@@ -2282,6 +2282,13 @@ static const struct bpf_func_proto bpf_msg_cork_bytes_proto = {
|
|
|
.arg2_type = ARG_ANYTHING,
|
|
|
};
|
|
|
|
|
|
+#define sk_msg_iter_var(var) \
|
|
|
+ do { \
|
|
|
+ var++; \
|
|
|
+ if (var == MAX_SKB_FRAGS) \
|
|
|
+ var = 0; \
|
|
|
+ } while (0)
|
|
|
+
|
|
|
BPF_CALL_4(bpf_msg_pull_data,
|
|
|
struct sk_msg_buff *, msg, u32, start, u32, end, u64, flags)
|
|
|
{
|
|
@@ -2302,9 +2309,7 @@ BPF_CALL_4(bpf_msg_pull_data,
|
|
|
if (start < offset + len)
|
|
|
break;
|
|
|
offset += len;
|
|
|
- i++;
|
|
|
- if (i == MAX_SKB_FRAGS)
|
|
|
- i = 0;
|
|
|
+ sk_msg_iter_var(i);
|
|
|
} while (i != msg->sg_end);
|
|
|
|
|
|
if (unlikely(start >= offset + len))
|
|
@@ -2330,9 +2335,7 @@ BPF_CALL_4(bpf_msg_pull_data,
|
|
|
*/
|
|
|
do {
|
|
|
copy += sg[i].length;
|
|
|
- i++;
|
|
|
- if (i == MAX_SKB_FRAGS)
|
|
|
- i = 0;
|
|
|
+ sk_msg_iter_var(i);
|
|
|
if (bytes_sg_total <= copy)
|
|
|
break;
|
|
|
} while (i != msg->sg_end);
|
|
@@ -2358,9 +2361,7 @@ BPF_CALL_4(bpf_msg_pull_data,
|
|
|
sg[i].length = 0;
|
|
|
put_page(sg_page(&sg[i]));
|
|
|
|
|
|
- i++;
|
|
|
- if (i == MAX_SKB_FRAGS)
|
|
|
- i = 0;
|
|
|
+ sk_msg_iter_var(i);
|
|
|
} while (i != last_sg);
|
|
|
|
|
|
sg[first_sg].length = copy;
|
|
@@ -2377,7 +2378,8 @@ BPF_CALL_4(bpf_msg_pull_data,
|
|
|
if (!shift)
|
|
|
goto out;
|
|
|
|
|
|
- i = first_sg + 1;
|
|
|
+ i = first_sg;
|
|
|
+ sk_msg_iter_var(i);
|
|
|
do {
|
|
|
int move_from;
|
|
|
|
|
@@ -2394,9 +2396,7 @@ BPF_CALL_4(bpf_msg_pull_data,
|
|
|
sg[move_from].page_link = 0;
|
|
|
sg[move_from].offset = 0;
|
|
|
|
|
|
- i++;
|
|
|
- if (i == MAX_SKB_FRAGS)
|
|
|
- i = 0;
|
|
|
+ sk_msg_iter_var(i);
|
|
|
} while (1);
|
|
|
msg->sg_end -= shift;
|
|
|
if (msg->sg_end < 0)
|