diff options
Diffstat (limited to 'tools/lib/bpf/netlink.c')
| -rw-r--r-- | tools/lib/bpf/netlink.c | 20 | 
1 files changed, 17 insertions, 3 deletions
| diff --git a/tools/lib/bpf/netlink.c b/tools/lib/bpf/netlink.c index 68a2def17175..c997e69d507f 100644 --- a/tools/lib/bpf/netlink.c +++ b/tools/lib/bpf/netlink.c @@ -529,9 +529,9 @@ int bpf_xdp_query_id(int ifindex, int flags, __u32 *prog_id)  } -typedef int (*qdisc_config_t)(struct libbpf_nla_req *req); +typedef int (*qdisc_config_t)(struct libbpf_nla_req *req, const struct bpf_tc_hook *hook); -static int clsact_config(struct libbpf_nla_req *req) +static int clsact_config(struct libbpf_nla_req *req, const struct bpf_tc_hook *hook)  {  	req->tc.tcm_parent = TC_H_CLSACT;  	req->tc.tcm_handle = TC_H_MAKE(TC_H_CLSACT, 0); @@ -539,6 +539,16 @@ static int clsact_config(struct libbpf_nla_req *req)  	return nlattr_add(req, TCA_KIND, "clsact", sizeof("clsact"));  } +static int qdisc_config(struct libbpf_nla_req *req, const struct bpf_tc_hook *hook) +{ +	const char *qdisc = OPTS_GET(hook, qdisc, NULL); + +	req->tc.tcm_parent = OPTS_GET(hook, parent, TC_H_ROOT); +	req->tc.tcm_handle = OPTS_GET(hook, handle, 0); + +	return nlattr_add(req, TCA_KIND, qdisc, strlen(qdisc) + 1); +} +  static int attach_point_to_config(struct bpf_tc_hook *hook,  				  qdisc_config_t *config)  { @@ -552,6 +562,9 @@ static int attach_point_to_config(struct bpf_tc_hook *hook,  		return 0;  	case BPF_TC_CUSTOM:  		return -EOPNOTSUPP; +	case BPF_TC_QDISC: +		*config = &qdisc_config; +		return 0;  	default:  		return -EINVAL;  	} @@ -596,7 +609,7 @@ static int tc_qdisc_modify(struct bpf_tc_hook *hook, int cmd, int flags)  	req.tc.tcm_family  = AF_UNSPEC;  	req.tc.tcm_ifindex = OPTS_GET(hook, ifindex, 0); -	ret = config(&req); +	ret = config(&req, hook);  	if (ret < 0)  		return ret; @@ -639,6 +652,7 @@ int bpf_tc_hook_destroy(struct bpf_tc_hook *hook)  	case BPF_TC_INGRESS:  	case BPF_TC_EGRESS:  		return libbpf_err(__bpf_tc_detach(hook, NULL, true)); +	case BPF_TC_QDISC:  	case BPF_TC_INGRESS | BPF_TC_EGRESS:  		return libbpf_err(tc_qdisc_delete(hook));  	case BPF_TC_CUSTOM: | 
