Commit 6de6c1f8 authored by Nikita V. Shirokov's avatar Nikita V. Shirokov Committed by Alexei Starovoitov
Browse files

bpf: Allow to change skb mark in test_run



allow to pass skb's mark field into bpf_prog_test_run ctx
for BPF_PROG_TYPE_SCHED_CLS prog type. that would allow
to test bpf programs which are doing decision based on this
field

Signed-off-by: default avatarNikita V. Shirokov <tehnerd@tehnerd.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent dacce641
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -251,7 +251,13 @@ static int convert___skb_to_skb(struct sk_buff *skb, struct __sk_buff *__skb)
		return 0;

	/* make sure the fields we don't use are zeroed */
	if (!range_is_zero(__skb, 0, offsetof(struct __sk_buff, priority)))
	if (!range_is_zero(__skb, 0, offsetof(struct __sk_buff, mark)))
		return -EINVAL;

	/* mark is allowed */

	if (!range_is_zero(__skb, offsetofend(struct __sk_buff, mark),
			   offsetof(struct __sk_buff, priority)))
		return -EINVAL;

	/* priority is allowed */
@@ -274,6 +280,7 @@ static int convert___skb_to_skb(struct sk_buff *skb, struct __sk_buff *__skb)
			   sizeof(struct __sk_buff)))
		return -EINVAL;

	skb->mark = __skb->mark;
	skb->priority = __skb->priority;
	skb->tstamp = __skb->tstamp;
	memcpy(&cb->data, __skb->cb, QDISC_CB_PRIV_LEN);
@@ -301,6 +308,7 @@ static void convert_skb_to___skb(struct sk_buff *skb, struct __sk_buff *__skb)
	if (!__skb)
		return;

	__skb->mark = skb->mark;
	__skb->priority = skb->priority;
	__skb->tstamp = skb->tstamp;
	memcpy(__skb->cb, &cb->data, QDISC_CB_PRIV_LEN);
+5 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ void test_skb_ctx(void)
		.tstamp = 7,
		.wire_len = 100,
		.gso_segs = 8,
		.mark = 9,
	};
	struct bpf_prog_test_run_attr tattr = {
		.data_in = &pkt_v4,
@@ -93,4 +94,8 @@ void test_skb_ctx(void)
		   "ctx_out_tstamp",
		   "skb->tstamp == %lld, expected %d\n",
		   skb.tstamp, 8);
	CHECK_ATTR(skb.mark != 10,
		   "ctx_out_mark",
		   "skb->mark == %u, expected %d\n",
		   skb.mark, 10);
}
+1 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ int process(struct __sk_buff *skb)
	}
	skb->priority++;
	skb->tstamp++;
	skb->mark++;

	if (skb->wire_len != 100)
		return 1;