tools/testing/selftests/bpf/progs/test_tc_dtime.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/bpf/progs/test_tc_dtime.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/bpf/progs/test_tc_dtime.c
Extension
.c
Size
8357 bytes
Lines
393
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

if (v6_equal(ip6h->saddr, (struct in6_addr){{ip6_src}}))
			ns = SRC_NS;
		else if (v6_equal(ip6h->saddr, (struct in6_addr){{ip6_dst}}))
			ns = DST_NS;
		inet_proto = ip6h->nexthdr;
		trans = ip6h + 1;
		break;
	default:
		return 0;
	}

	/* skb is not from src_ns or dst_ns.
	 * skb is not the testing IPPROTO.
	 */
	if (!ns || inet_proto != get_proto())
		return 0;

	switch (inet_proto) {
	case IPPROTO_TCP:
		th = trans;
		if (th + 1 > data_end)
			return -1;
		sport = th->source;
		dport = th->dest;
		break;
	case IPPROTO_UDP:
		uh = trans;
		if (uh + 1 > data_end)
			return -1;
		sport = uh->source;
		dport = uh->dest;
		break;
	default:
		return 0;
	}

	/* The skb is the testing traffic */
	if ((ns == SRC_NS && dport == dst_ns_port) ||
	    (ns == DST_NS && sport == dst_ns_port))
		return (ns << 8 | inet_proto);

	return 0;
}

/* format: direction@iface@netns
 * egress@veth_(src|dst)@ns_(src|dst)
 */
SEC("tc")
int egress_host(struct __sk_buff *skb)
{
	int skb_type;

	skb_type = skb_get_type(skb);
	if (skb_type == -1)
		return TC_ACT_SHOT;
	if (!skb_type)
		return TC_ACT_OK;

	if (skb_proto(skb_type) == IPPROTO_TCP) {
		if (skb->tstamp_type == BPF_SKB_CLOCK_MONOTONIC &&
		    skb->tstamp)
			inc_dtimes(EGRESS_ENDHOST);
		else
			inc_errs(EGRESS_ENDHOST);
	} else if (skb_proto(skb_type) == IPPROTO_UDP) {
		if (skb->tstamp_type == BPF_SKB_CLOCK_TAI &&
		    skb->tstamp)
			inc_dtimes(EGRESS_ENDHOST);
		else
			inc_errs(EGRESS_ENDHOST);
	} else {
		if (skb->tstamp_type == BPF_SKB_CLOCK_REALTIME &&
		    skb->tstamp)
			inc_errs(EGRESS_ENDHOST);
	}

	skb->tstamp = EGRESS_ENDHOST_MAGIC;

	return TC_ACT_OK;
}

/* ingress@veth_(src|dst)@ns_(src|dst) */
SEC("tc")
int ingress_host(struct __sk_buff *skb)
{
	int skb_type;

	skb_type = skb_get_type(skb);
	if (skb_type == -1)
		return TC_ACT_SHOT;

Annotation

Implementation Notes