link_create
link_srv->create_link = link_create;
struct dc_link *link_create(const struct link_init_data *init_params);
attr->link_create.target_ifindex,
attr->link_create.attach_type);
attr->link_create.flags,
attr->link_create.netkit.relative_fd,
attr->link_create.netkit.expected_revision);
&netkit_link_lops, prog, attr->link_create.attach_type);
} link_create;
if (attr->link_create.target_fd || attr->link_create.flags)
ulinfo = make_bpfptr(attr->link_create.iter_info, uattr.is_kernel);
linfo_len = attr->link_create.iter_info_len;
attr->link_create.attach_type);
map = bpf_map_get(attr->link_create.map_fd);
attr->link_create.attach_type);
if (attr->link_create.flags & (~BPF_F_LINK_ATTACH_MASK))
cgrp = cgroup_get_from_fd(attr->link_create.target_fd);
prog, attr->link_create.attach_type);
link->link.attach_type, BPF_F_ALLOW_MULTI | attr->link_create.flags,
attr->link_create.cgroup.relative_fd,
attr->link_create.cgroup.expected_revision);
if (attr->link_create.flags)
type = attr->link_create.attach_type;
net = get_net_ns_by_fd(attr->link_create.target_fd);
if (attr->link_create.flags)
perf_file = perf_event_get(attr->link_create.target_fd);
attr->link_create.attach_type);
err = perf_event_set_bpf_prog(event, prog, attr->link_create.perf_event.bpf_cookie);
#define BPF_LINK_CREATE_LAST_FIELD link_create.uprobe_multi.pid
if (attr->link_create.attach_type == BPF_STRUCT_OPS)
prog = bpf_prog_get(attr->link_create.prog_fd);
attr->link_create.attach_type);
attr->link_create.target_fd,
attr->link_create.target_btf_id,
attr->link_create.tracing.cookie,
attr->link_create.attach_type);
if (attr->link_create.attach_type != prog->expected_attach_type) {
ret = bpf_raw_tp_link_attach(prog, NULL, attr->link_create.tracing.cookie,
attr->link_create.attach_type);
attr->link_create.target_fd,
attr->link_create.target_btf_id,
attr->link_create.tracing.cookie,
attr->link_create.attach_type);
if (attr->link_create.attach_type == BPF_TCX_INGRESS ||
attr->link_create.attach_type == BPF_TCX_EGRESS)
if (attr->link_create.attach_type == BPF_PERF_EVENT)
else if (attr->link_create.attach_type == BPF_TRACE_KPROBE_MULTI ||
attr->link_create.attach_type == BPF_TRACE_KPROBE_SESSION)
else if (attr->link_create.attach_type == BPF_TRACE_UPROBE_MULTI ||
attr->link_create.attach_type == BPF_TRACE_UPROBE_SESSION)
err = link_create(&attr, uattr);
attr->link_create.attach_type);
dev = __dev_get_by_index(net, attr->link_create.target_ifindex);
ret = tcx_link_prog_attach(&tcx->link, attr->link_create.flags,
attr->link_create.tcx.relative_fd,
attr->link_create.tcx.expected_revision);
if (attr->link_create.flags)
flags = attr->link_create.kprobe_multi.flags;
uaddrs = u64_to_user_ptr(attr->link_create.kprobe_multi.addrs);
usyms = u64_to_user_ptr(attr->link_create.kprobe_multi.syms);
cnt = attr->link_create.kprobe_multi.cnt;
ucookies = u64_to_user_ptr(attr->link_create.kprobe_multi.cookies);
&bpf_kprobe_multi_link_lops, prog, attr->link_create.attach_type);
if (attr->link_create.flags)
flags = attr->link_create.uprobe_multi.flags;
upath = u64_to_user_ptr(attr->link_create.uprobe_multi.path);
uoffsets = u64_to_user_ptr(attr->link_create.uprobe_multi.offsets);
cnt = attr->link_create.uprobe_multi.cnt;
pid = attr->link_create.uprobe_multi.pid;
uref_ctr_offsets = u64_to_user_ptr(attr->link_create.uprobe_multi.ref_ctr_offsets);
ucookies = u64_to_user_ptr(attr->link_create.uprobe_multi.cookies);
&bpf_uprobe_multi_link_lops, prog, attr->link_create.attach_type);
dev = dev_get_by_index(net, attr->link_create.target_ifindex);
attr->link_create.attach_type);
link->flags = attr->link_create.flags;
if (attr->link_create.flags)
map = bpf_map_get_with_uref(attr->link_create.target_fd);
attach_type = attr->link_create.attach_type;
switch (attr->link_create.netfilter.pf) {
if (attr->link_create.netfilter.hooknum >= NF_INET_NUMHOOKS)
if (attr->link_create.netfilter.flags & ~BPF_F_NETFILTER_IP_DEFRAG)
prio = attr->link_create.netfilter.priority;
else if ((attr->link_create.netfilter.flags & BPF_F_NETFILTER_IP_DEFRAG) &&
if (attr->link_create.flags)
attr->link_create.attach_type);
link->hook_ops.pf = attr->link_create.netfilter.pf;
link->hook_ops.priority = attr->link_create.netfilter.priority;
link->hook_ops.hooknum = attr->link_create.netfilter.hooknum;
if (attr->link_create.netfilter.flags & BPF_F_NETFILTER_IP_DEFRAG) {
} link_create;
const size_t attr_sz = offsetofend(union bpf_attr, link_create);
attr.link_create.prog_fd = prog_fd;
attr.link_create.target_fd = target_fd;
attr.link_create.attach_type = attach_type;
attr.link_create.flags = OPTS_GET(opts, flags, 0);
attr.link_create.target_btf_id = target_btf_id;
attr.link_create.iter_info = ptr_to_u64(OPTS_GET(opts, iter_info, (void *)0));
attr.link_create.iter_info_len = iter_info_len;
attr.link_create.perf_event.bpf_cookie = OPTS_GET(opts, perf_event.bpf_cookie, 0);
attr.link_create.kprobe_multi.flags = OPTS_GET(opts, kprobe_multi.flags, 0);
attr.link_create.kprobe_multi.cnt = OPTS_GET(opts, kprobe_multi.cnt, 0);
attr.link_create.kprobe_multi.syms = ptr_to_u64(OPTS_GET(opts, kprobe_multi.syms, 0));
attr.link_create.kprobe_multi.addrs = ptr_to_u64(OPTS_GET(opts, kprobe_multi.addrs, 0));
attr.link_create.kprobe_multi.cookies = ptr_to_u64(OPTS_GET(opts, kprobe_multi.cookies, 0));
attr.link_create.uprobe_multi.flags = OPTS_GET(opts, uprobe_multi.flags, 0);
attr.link_create.uprobe_multi.cnt = OPTS_GET(opts, uprobe_multi.cnt, 0);
attr.link_create.uprobe_multi.path = ptr_to_u64(OPTS_GET(opts, uprobe_multi.path, 0));
attr.link_create.uprobe_multi.offsets = ptr_to_u64(OPTS_GET(opts, uprobe_multi.offsets, 0));
attr.link_create.uprobe_multi.ref_ctr_offsets = ptr_to_u64(OPTS_GET(opts, uprobe_multi.ref_ctr_offsets, 0));
attr.link_create.uprobe_multi.cookies = ptr_to_u64(OPTS_GET(opts, uprobe_multi.cookies, 0));
attr.link_create.uprobe_multi.pid = OPTS_GET(opts, uprobe_multi.pid, 0);
attr.link_create.tracing.cookie = OPTS_GET(opts, tracing.cookie, 0);
attr.link_create.netfilter.pf = OPTS_GET(opts, netfilter.pf, 0);
attr.link_create.netfilter.hooknum = OPTS_GET(opts, netfilter.hooknum, 0);
attr.link_create.netfilter.priority = OPTS_GET(opts, netfilter.priority, 0);
attr.link_create.netfilter.flags = OPTS_GET(opts, netfilter.flags, 0);
attr.link_create.tcx.relative_id = relative_id;
attr.link_create.flags |= BPF_F_ID;
attr.link_create.tcx.relative_fd = relative_fd;
attr.link_create.tcx.expected_revision = OPTS_GET(opts, tcx.expected_revision, 0);
attr.link_create.netkit.relative_id = relative_id;
attr.link_create.flags |= BPF_F_ID;
attr.link_create.netkit.relative_fd = relative_fd;
attr.link_create.netkit.expected_revision = OPTS_GET(opts, netkit.expected_revision, 0);
attr.link_create.cgroup.relative_id = relative_id;
attr.link_create.flags |= BPF_F_ID;
attr.link_create.cgroup.relative_fd = relative_fd;
attr.link_create.cgroup.expected_revision =
if (attr.link_create.target_fd || attr.link_create.target_btf_id)
const size_t attr_sz = offsetofend(union bpf_attr, link_create.iter_info_len);
attr.link_create.prog_fd = prog_fd;
attr.link_create.target_fd = target_fd;
attr.link_create.attach_type = attach_type;