From: Prashant Bhole <prashantbhole.linux@gmail.com>
To: "David S . Miller" <davem@davemloft.net>,
"Michael S . Tsirkin" <mst@redhat.com>,
Alexei Starovoitov <ast@kernel.org>,
Daniel Borkmann <daniel@iogearbox.net>,
Jesper Dangaard Brouer <hawk@kernel.org>
Cc: Prashant Bhole <prashantbhole.linux@gmail.com>,
Jason Wang <jasowang@redhat.com>, David Ahern <dsahern@gmail.com>,
Jakub Kicinski <jakub.kicinski@netronome.com>,
John Fastabend <john.fastabend@gmail.com>,
Toshiaki Makita <toshiaki.makita1@gmail.com>,
Martin KaFai Lau <kafai@fb.com>, Song Liu <songliubraving@fb.com>,
Yonghong Song <yhs@fb.com>, Andrii Nakryiko <andriin@fb.com>,
netdev@vger.kernel.org
Subject: [RFC v2 net-next 04/12] libbpf: set xdp program in tx path
Date: Thu, 26 Dec 2019 11:31:52 +0900 [thread overview]
Message-ID: <20191226023200.21389-5-prashantbhole.linux@gmail.com> (raw)
In-Reply-To: <20191226023200.21389-1-prashantbhole.linux@gmail.com>
Existing libbpf APIs to set/get XDP attributes of a link were
written for rx path. This patch extends the new APIs introduced
in last patch. We need to set the tx_path parameter in struct
bpf_link_xdp_opts to attach the program in tx path.
Signed-off-by: Prashant Bhole <prashantbhole.linux@gmail.com>
---
tools/lib/bpf/libbpf.h | 4 ++++
tools/lib/bpf/netlink.c | 36 ++++++++++++++++++++++++++++++------
2 files changed, 34 insertions(+), 6 deletions(-)
diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
index 8178fd5a1e8f..c073d0eb3bf5 100644
--- a/tools/lib/bpf/libbpf.h
+++ b/tools/lib/bpf/libbpf.h
@@ -449,6 +449,7 @@ struct bpf_link_xdp_opts {
__u32 flags;
__u32 prog_id;
int prog_fd;
+ bool tx_path;
};
/*
@@ -459,13 +460,16 @@ struct bpf_link_xdp_opts {
* - link_info
* - link_info_sz
* - flags
+ * - tx_path
*
* BPF_LINK_SET_XDP_FD uses fields:
* - flags
+ * - tx_path
*
* BPF_LINK_SET_XDP_FD uses fields:
* - prog_fd
* - flags
+ * - tx_path
*/
enum bpf_link_cmd {
BPF_LINK_GET_XDP_INFO,
diff --git a/tools/lib/bpf/netlink.c b/tools/lib/bpf/netlink.c
index 1274b540a9ad..c839495e8f03 100644
--- a/tools/lib/bpf/netlink.c
+++ b/tools/lib/bpf/netlink.c
@@ -133,6 +133,7 @@ static int __bpf_set_link_xdp_fd(int ifindex, struct bpf_link_xdp_opts *opts)
{
int fd = opts->prog_fd;
__u32 flags = opts->flags;
+ bool tx = opts->tx_path;
int sock, seq = 0, ret;
struct nlattr *nla, *nla_xdp;
struct {
@@ -158,7 +159,8 @@ static int __bpf_set_link_xdp_fd(int ifindex, struct bpf_link_xdp_opts *opts)
/* started nested attribute for XDP */
nla = (struct nlattr *)(((char *)&req)
+ NLMSG_ALIGN(req.nh.nlmsg_len));
- nla->nla_type = NLA_F_NESTED | IFLA_XDP;
+ nla->nla_type = NLA_F_NESTED;
+ nla->nla_type |= tx ? IFLA_XDP_TX : IFLA_XDP;
nla->nla_len = NLA_HDRLEN;
/* add XDP fd */
@@ -196,6 +198,7 @@ int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags)
opts.prog_fd = fd;
opts.flags = flags;
+ /* opts.tx_path is already 0 */
return bpf_set_link_opts(ifindex, &opts, BPF_LINK_SET_XDP_FD);
}
@@ -215,20 +218,20 @@ static int __dump_link_nlmsg(struct nlmsghdr *nlh,
return dump_link_nlmsg(cookie, ifi, tb);
}
-static int get_xdp_info(void *cookie, void *msg, struct nlattr **tb)
+static int __get_xdp_info(void *cookie, void *msg, struct nlattr **tb, bool tx)
{
struct nlattr *xdp_tb[IFLA_XDP_MAX + 1];
struct xdp_id_md *xdp_id = cookie;
struct ifinfomsg *ifinfo = msg;
+ struct nlattr *attr;
int ret;
if (xdp_id->ifindex && xdp_id->ifindex != ifinfo->ifi_index)
return 0;
- if (!tb[IFLA_XDP])
- return 0;
+ attr = tx ? tb[IFLA_XDP_TX] : tb[IFLA_XDP];
- ret = libbpf_nla_parse_nested(xdp_tb, IFLA_XDP_MAX, tb[IFLA_XDP], NULL);
+ ret = libbpf_nla_parse_nested(xdp_tb, IFLA_XDP_MAX, attr, NULL);
if (ret)
return ret;
@@ -260,12 +263,27 @@ static int get_xdp_info(void *cookie, void *msg, struct nlattr **tb)
return 0;
}
+static int get_xdp_tx_info(void *cookie, void *msg, struct nlattr **tb)
+{
+ if (!tb[IFLA_XDP_TX])
+ return 0;
+ return __get_xdp_info(cookie, msg, tb, true);
+}
+
+static int get_xdp_info(void *cookie, void *msg, struct nlattr **tb)
+{
+ if (!tb[IFLA_XDP])
+ return 0;
+ return __get_xdp_info(cookie, msg, tb, false);
+}
+
static int __bpf_get_link_xdp_info(int ifindex, struct bpf_link_xdp_opts *opts)
{
struct xdp_link_info *info = opts->link_info;
size_t info_size = opts->link_info_sz;
struct xdp_id_md xdp_id = {};
__u32 flags = opts->flags;
+ int tx = opts->tx_path;
int sock, ret;
__u32 nl_pid;
__u32 mask;
@@ -286,7 +304,11 @@ static int __bpf_get_link_xdp_info(int ifindex, struct bpf_link_xdp_opts *opts)
xdp_id.ifindex = ifindex;
xdp_id.flags = flags;
- ret = libbpf_nl_get_link(sock, nl_pid, get_xdp_info, &xdp_id);
+ if (tx)
+ ret = libbpf_nl_get_link(sock, nl_pid, get_xdp_tx_info,
+ &xdp_id);
+ else
+ ret = libbpf_nl_get_link(sock, nl_pid, get_xdp_info, &xdp_id);
if (!ret) {
size_t sz = min(info_size, sizeof(xdp_id.info));
@@ -306,6 +328,7 @@ int bpf_get_link_xdp_info(int ifindex, struct xdp_link_info *info,
opts.link_info = info;
opts.link_info_sz = info_size;
opts.flags = flags;
+ /* opts.tx_path is already 0 */
return bpf_get_link_opts(ifindex, &opts, BPF_LINK_GET_XDP_INFO);
}
@@ -502,6 +525,7 @@ int bpf_get_link_opts(int ifindex, struct bpf_link_xdp_opts *opts,
int ret;
tmp_opts.flags = opts->flags;
+ tmp_opts.tx_path = opts->tx_path;
tmp_opts.link_info = &link_info;
tmp_opts.link_info_sz = sizeof(link_info);
ret = __bpf_get_link_xdp_info(ifindex, &tmp_opts);
--
2.21.0
next prev parent reply other threads:[~2019-12-26 2:33 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-26 2:31 [RFC v2 net-next 00/12] XDP in tx path Prashant Bhole
2019-12-26 2:31 ` [RFC v2 net-next 01/12] net: introduce BPF_XDP_EGRESS attach type for XDP Prashant Bhole
2019-12-27 14:27 ` Jesper Dangaard Brouer
2019-12-28 0:15 ` Prashant Bhole
2020-01-07 11:35 ` Toke Høiland-Jørgensen
2020-01-11 0:53 ` Prashant Bhole
2019-12-26 2:31 ` [RFC v2 net-next 02/12] tools: sync kernel uapi/linux/if_link.h header Prashant Bhole
2019-12-26 2:31 ` [RFC v2 net-next 03/12] libbpf: api for getting/setting link xdp options Prashant Bhole
2019-12-30 4:49 ` Andrii Nakryiko
2020-01-03 11:04 ` Prashant Bhole
2019-12-26 2:31 ` Prashant Bhole [this message]
2019-12-26 2:31 ` [RFC v2 net-next 05/12] samples/bpf: xdp1, add XDP tx support Prashant Bhole
2019-12-26 2:31 ` [RFC v2 net-next 06/12] net: core: rename netif_receive_generic_xdp() to do_generic_xdp_core() Prashant Bhole
2019-12-26 2:31 ` [RFC v2 net-next 07/12] net: core: export do_xdp_generic_core() Prashant Bhole
2019-12-26 2:31 ` [RFC v2 net-next 08/12] tuntap: check tun_msg_ctl type at necessary places Prashant Bhole
2019-12-26 2:31 ` [RFC v2 net-next 09/12] vhost_net: user tap recvmsg api to access ptr ring Prashant Bhole
2019-12-26 9:05 ` kbuild test robot
2019-12-26 2:31 ` [RFC v2 net-next 10/12] tuntap: remove usage of ptr ring in vhost_net Prashant Bhole
2019-12-26 2:31 ` [RFC v2 net-next 11/12] tun: set tx path XDP program Prashant Bhole
2019-12-26 2:32 ` [RFC v2 net-next 12/12] tun: run XDP program in tx path Prashant Bhole
2019-12-26 19:23 ` [RFC v2 net-next 00/12] XDP " Tom Herbert
2019-12-27 1:35 ` Prashant Bhole
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191226023200.21389-5-prashantbhole.linux@gmail.com \
--to=prashantbhole.linux@gmail.com \
--cc=andriin@fb.com \
--cc=ast@kernel.org \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=dsahern@gmail.com \
--cc=hawk@kernel.org \
--cc=jakub.kicinski@netronome.com \
--cc=jasowang@redhat.com \
--cc=john.fastabend@gmail.com \
--cc=kafai@fb.com \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=songliubraving@fb.com \
--cc=toshiaki.makita1@gmail.com \
--cc=yhs@fb.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.