Commit 2761ed4b authored by Maxim Mikityanskiy's avatar Maxim Mikityanskiy Committed by Daniel Borkmann
Browse files

libbpf: Support getsockopt XDP_OPTIONS



Query XDP_OPTIONS in libbpf to determine if the zero-copy mode is active
or not.

Signed-off-by: default avatarMaxim Mikityanskiy <maximmi@mellanox.com>
Signed-off-by: default avatarTariq Toukan <tariqt@mellanox.com>
Acked-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
Acked-by: default avatarBjörn Töpel <bjorn.topel@intel.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent 2640d3c8
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ struct xsk_socket {
	int xsks_map_fd;
	__u32 queue_id;
	char ifname[IFNAMSIZ];
	bool zc;
};

struct xsk_nl_info {
@@ -480,6 +481,7 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname,
	void *rx_map = NULL, *tx_map = NULL;
	struct sockaddr_xdp sxdp = {};
	struct xdp_mmap_offsets off;
	struct xdp_options opts;
	struct xsk_socket *xsk;
	socklen_t optlen;
	int err;
@@ -597,6 +599,16 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname,
	}

	xsk->prog_fd = -1;

	optlen = sizeof(opts);
	err = getsockopt(xsk->fd, SOL_XDP, XDP_OPTIONS, &opts, &optlen);
	if (err) {
		err = -errno;
		goto out_mmap_tx;
	}

	xsk->zc = opts.flags & XDP_OPTIONS_ZEROCOPY;

	if (!(xsk->config.libbpf_flags & XSK_LIBBPF_FLAGS__INHIBIT_PROG_LOAD)) {
		err = xsk_setup_xdp_prog(xsk);
		if (err)