========

The patch set add a new PMD driver for AF_XDP which is a proposed
faster version of AF_PACKET interface in Linux, see below link for
detail AF_XDP introduction:
https://lwn.net/Articles/750845/
https://fosdem.org/2018/schedule/event/af_xdp/

AF_XDP roadmap
==============
- The kernel 4.18 is out and af_xdp is included.
  https://kernelnewbies.org/Linux_4.18
- So far there is no zero copy supported driver be merged, but some are
  on the way.

Change logs
===========

v3:
- Re-work base on AF_XDP's interface changes.
- Support multi-queues, each dpdk queue has its own xdp socket.
  An xdp socket is always bound to a netdev queue.
  We assume all xdp socket from the same ethdev are bound to the
  same netdev queue, though a netdev queue still can be bound by
  xdp sockets from different ethdev instances.
  Below is an example of the mapping.
  ------------------------------------------------------
  | dpdk q0 | dpdk q1 | dpdk q0    | dpdk q0 | dpdk q1 |
  ------------------------------------------------------
  | xsk A   | xsk B   | xsk C      | xsk D   | xsk E   |<---|
  ------------------------------------------------------    |
  |  ETHDEV 0         | ETHDEV 1   |  ETHDEV 2         |    |  DPDK
  ------------------------------------------------------------------ 
  |  netdev queue 0                |   netdev queue 1  |    |  KERNEL
  ------------------------------------------------------    |
  |                  NETDEV eth0                       |    |
  ------------------------------------------------------    |
  |                    key   xsk                       |    |
  |  ----------       --------------                   |    |
  |  |         |      | 0  | xsk A |                   |    |
  |  |         |      --------------                   |    |
  |  |         |      | 2  | xsk B |                   |    |
  |  | ebpf    |      ---------------------------------------
  |  |         |      | 3  | xsk C |                   |
  |  |     redirect ->|--------------                  |
  |  |         |      | 4  | xsk D |                   |
  |  |         |      --------------                   |
  |  |---------|      | 5  | xsk E |                   |
  |                   --------------                   |
  |-----------------------------------------------------

- It is an open question that how to load ebpf to kernel and link to
  specific netdev in DPDK, should it be part of PMD, or it should be handled by
  an independent tool? In this patchset, it takes the second option, there will
  be a "bind" stage before we start AF_XDP PMD, this includes below steps:
  a) load ebpf program to the kernel, (the ebpf program must contain the
     logic to redirect packet to a xdp socket base on a redirect map).
  b) link ebpf program to specific network interface.
  c) expose the xdp socket redirect map id and entries number to user,
     so this will be parsed to PMD, and PMD will create xdp socket
     for each queue and update the redirect map correctly.
     (example: --vdev,iface=eth0,xsk_map_id=53,xsk_map_key_base=0,xsk_map_key_count=4)

v2:
- fix lisence header
- clean up bpf dependency, bpf program is embedded,  no "xdpsock_kern.o"
  required
- clean up make file, only linux_header is required
- fix all the compile warning.
- fix packet number return in Tx.

How to try
==========

1. Take the kernel v4.18.
   make sure you turn on XDP sockets when compiling
   Networking support -->
        Networking options -->
                [ * ] XDP sockets
2. in the kernel source code, apply below patch and compile the bpf sample code.
   #make samples/bpf/
   so the sample xdpsock can be used as a bind/unbind tool for af_xdp
   PMD, sorry for this ugly, but in future, there could be a dedicated
   tool in DPDK, if we agree with the idea that bpf configure in the kernel
   should be separated from PMD.

~~~~~~~~~~~~~~~~~~~~~~~PATCH START~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

diff --git a/samples/bpf/xdpsock_user.c b/samples/bpf/xdpsock_user.c
index d69c8d78d3fd..44a6318043e7 100644
--- a/samples/bpf/xdpsock_user.c
+++ b/samples/bpf/xdpsock_user.c
@@ -76,6 +76,8 @@ static int opt_poll;
 static int opt_shared_packet_buffer;
 static int opt_interval = 1;
 static u32 opt_xdp_bind_flags;
+static int opt_bind;
+static int opt_unbind;
 
 struct xdp_umem_uqueue {
 	u32 cached_prod;
@@ -662,6 +664,8 @@ static void usage(const char *prog)
 		"  -S, --xdp-skb=n	Use XDP skb-mod\n"
 		"  -N, --xdp-native=n	Enfore XDP native mode\n"
 		"  -n, --interval=n	Specify statistics update interval (default 1 sec).\n"
+		"  -b, --bind		Bind only.\n"
+		"  -u, --unbind		Unbind only.\n"
 		"\n";
 	fprintf(stderr, str, prog);
 	exit(EXIT_FAILURE);
@@ -674,7 +678,7 @@ static void parse_command_line(int argc, char **argv)
 	opterr = 0;
 
 	for (;;) {
-		c = getopt_long(argc, argv, "rtli:q:psSNn:", long_options,
+		c = getopt_long(argc, argv, "rtli:q:psSNn:bu", long_options,
 				&option_index);
 		if (c == -1)
 			break;
@@ -711,6 +715,12 @@ static void parse_command_line(int argc, char **argv)
 		case 'n':
 			opt_interval = atoi(optarg);
 			break;
+		case 'b':
+			opt_bind = 1;
+			break;
+		case 'u':
+			opt_unbind = 1;
+			break;
 		default:
 			usage(basename(argv[0]));
 		}
@@ -898,6 +908,12 @@ int main(int argc, char **argv)
 		exit(EXIT_FAILURE);
 	}
 
+	if (opt_unbind) {
+		bpf_set_link_xdp_fd(opt_ifindex, -1, opt_xdp_flags);

~~~~~~~~~~~~~~~~~~~~~~~PATCH END~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3. bind
  #./samples/bpf/xdpsock -i eth0 -b

  in this step, an ebpf binary xdpsock_kern.o is be loaded into the kernel
