diff mbox

[ODP/PATCHv2,REQUIRE,TESTING] rework packet io selection

Message ID 20140328153845.GA26897@8470w
State Superseded
Headers show

Commit Message

Anders Roxell March 28, 2014, 3:38 p.m. UTC
On 2014-03-28 19:08, Maxim Uvarov wrote:
> Dynamically select type of packet I/O
> sock_params->type =
> 	ODP_PKTIO_TYPE_SOCKET_BASIC
> 	ODP_PKTIO_TYPE_SOCKET_MMSG
> 	ODP_PKTIO_TYPE_SOCKET_MMAP
> 	ODP_PKTIO_TYPE_NETMAP
> sock_params->fanout = 1;
> pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool, &params);
> 
> v2:
>  - remove NETMAP define in enum;
>  - add command line parameters to odp_example_pktio for I/O selection.
> 
> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
> ---
>  .../linux-generic/include/api/odp_pktio_socket.h   |   1 +
>  .../linux-generic/include/api/odp_pktio_types.h    |   8 +-
>  .../linux-generic/include/odp_packet_io_internal.h |   1 +
>  platform/linux-generic/include/odp_packet_socket.h |  55 ++++-------
>  platform/linux-generic/source/odp_packet_io.c      |  61 +++++++++---
>  platform/linux-generic/source/odp_packet_socket.c  | 103 +++++++++------------
>  test/packet/odp_example_pktio.c                    |  30 +++++-
>  7 files changed, 146 insertions(+), 113 deletions(-)
> 
> diff --git a/platform/linux-generic/include/api/odp_pktio_socket.h b/platform/linux-generic/include/api/odp_pktio_socket.h
> index e0211bf..deeeeed 100644
> --- a/platform/linux-generic/include/api/odp_pktio_socket.h
> +++ b/platform/linux-generic/include/api/odp_pktio_socket.h
> @@ -15,6 +15,7 @@ extern "C" {
>  
>  typedef struct {
>  	odp_pktio_type_t type;
> +	int fanout;
>  } socket_params_t;
>  
>  #ifdef __cplusplus
> diff --git a/platform/linux-generic/include/api/odp_pktio_types.h b/platform/linux-generic/include/api/odp_pktio_types.h
> index e6b4cbf..8d195a5 100644
> --- a/platform/linux-generic/include/api/odp_pktio_types.h
> +++ b/platform/linux-generic/include/api/odp_pktio_types.h
> @@ -17,10 +17,10 @@ extern "C" {
>   */
>  
>  typedef enum {
> -	ODP_PKTIO_TYPE_SOCKET = 0x01,
> -#ifdef ODP_HAVE_NETMAP
> -	ODP_PKTIO_TYPE_NETMAP = 0x02,
> -#endif
> +	ODP_PKTIO_TYPE_SOCKET_BASIC = 0x1,
> +	ODP_PKTIO_TYPE_SOCKET_MMSG,
> +	ODP_PKTIO_TYPE_SOCKET_MMAP,
> +	ODP_PKTIO_TYPE_NETMAP,
>  } odp_pktio_type_t;
>  
>  #include <odp_pktio_socket.h>
> diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h
> index ba1ee9b..3ab7fa0 100644
> --- a/platform/linux-generic/include/odp_packet_io_internal.h
> +++ b/platform/linux-generic/include/odp_packet_io_internal.h
> @@ -31,6 +31,7 @@ struct pktio_entry {
>  	odp_queue_t outq_default;	/**< default out queue */
>  	odp_pktio_params_t params;	/**< pktio parameters */
>  	pkt_sock_t pkt_sock;		/**< using socket API for IO */
> +	pkt_sock_mmap_t pkt_sock_mmap;	/**< using socket mmap API for IO */
>  #ifdef ODP_HAVE_NETMAP
>  	pkt_netmap_t pkt_nm;		/**< using netmap API for IO */
>  #endif
> diff --git a/platform/linux-generic/include/odp_packet_socket.h b/platform/linux-generic/include/odp_packet_socket.h
> index fe216bb..086de05 100644
> --- a/platform/linux-generic/include/odp_packet_socket.h
> +++ b/platform/linux-generic/include/odp_packet_socket.h
> @@ -20,37 +20,15 @@
>  
>  #include <linux/version.h>
>  
> -
>  /*
>   * Packet socket config:
>   */
> -#define ODP_PACKET_SOCKET_BASIC 0 /** use recv()/send() */
> -#define ODP_PACKET_SOCKET_MMSG  1 /** use recvmmsg()/sendmmsg() */
> -#define ODP_PACKET_SOCKET_MMAP  2 /** use PACKET_MMAP */
> -
> -
> -#if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 1, 0)
> -/* PACKET_FANOUT feature not supported */
> -#define ODP_PACKET_SOCKET_FANOUT 0
> -#define ODP_PACKET_SOCKET_MODE (ODP_PACKET_SOCKET_BASIC)
> -#else
> -/** PACKET_FANOUT mode spreads incoming packets over multiple sockets*/
> -#define ODP_PACKET_SOCKET_FANOUT 1 /* 0=Off, 1=On */
> -/** Choose one from the alternatives above */
> -#define ODP_PACKET_SOCKET_MODE (ODP_PACKET_SOCKET_MMAP)
> -#endif
> -
>  
>  /** Max receive (Rx) burst size*/
>  #define ODP_PACKET_SOCKET_MAX_BURST_RX 32
>  /** Max transmit (Tx) burst size*/
>  #define ODP_PACKET_SOCKET_MAX_BURST_TX 32
>  
> -
> -
> -#if (ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_BASIC) || \
> -	(ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMSG)
> -
>  typedef struct {
>  	int sockfd; /**< socket descriptor */
>  	odp_buffer_pool_t pool; /**< buffer pool to alloc packets from */
> @@ -60,12 +38,6 @@ typedef struct {
>  	unsigned char if_mac[ETH_ALEN];	/**< IF eth mac addr */
>  } pkt_sock_t;
>  
> -#elif ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMAP
> -
> -#if ODP_PACKET_SOCKET_FANOUT == 0
> -#error "ODP_PACKET_SOCKET_MMAP requires ODP_PACKET_SOCKET_FANOUT=1"
> -#endif
> -
>  /** packet mmap ring */
>  struct ring {
>  	struct iovec *rd;
> @@ -99,31 +71,44 @@ typedef struct {
>  	unsigned mmap_len;
>  	unsigned char if_mac[ETH_ALEN];
>  	struct sockaddr_ll ll;
> -} pkt_sock_t;
> -
> -#else
> -#error "Unsupported ODP_PACKET_SOCKET_MODE!"
> -#endif
> +} pkt_sock_mmap_t;
>  
>  /**
>   * Open & configure a raw packet socket
>   */
>  int setup_pkt_sock(pkt_sock_t * const pkt_sock, char *netdev,
>  		   odp_buffer_pool_t pool);
> +
> +int setup_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock, char *netdev,
> +		   odp_buffer_pool_t pool, int fanout);
> +
>  /**
>   * Close a packet socket
>   */
>  int close_pkt_sock(pkt_sock_t * const pkt_sock);
>  
> +int close_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock);
> +
>  /**
>   * Receive packets from the packet socket
>   */
> -int recv_pkt_sock(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
> +int recv_pkt_sock_basic(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
>  		  unsigned len);
> +
> +int recv_pkt_sock_mmsg(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
> +		  unsigned len);
> +
> +int recv_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
> +		  odp_packet_t pkt_table[], unsigned len);
>  /**
>   * Send packets through the packet socket
>   */
> -int send_pkt_sock(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
> +int send_pkt_sock_basic(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
> +		  unsigned len);
> +
> +int send_pkt_sock_mmsg(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
>  		  unsigned len);
>  
> +int send_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
> +		  odp_packet_t pkt_table[], unsigned len);
>  #endif
> diff --git a/platform/linux-generic/source/odp_packet_io.c b/platform/linux-generic/source/odp_packet_io.c
> index 92aed34..e33cf35 100644
> --- a/platform/linux-generic/source/odp_packet_io.c
> +++ b/platform/linux-generic/source/odp_packet_io.c
> @@ -117,8 +117,12 @@ static void init_pktio_entry(pktio_entry_t *entry, odp_pktio_params_t *params)
>  	set_taken(entry);
>  	entry->s.inq_default = ODP_QUEUE_INVALID;
>  	switch (params->type) {
> -	case ODP_PKTIO_TYPE_SOCKET:
> +	case ODP_PKTIO_TYPE_SOCKET_BASIC:
> +	case ODP_PKTIO_TYPE_SOCKET_MMSG:
> +	case ODP_PKTIO_TYPE_SOCKET_MMAP:
>  		memset(&entry->s.pkt_sock, 0, sizeof(entry->s.pkt_sock));
> +		memset(&entry->s.pkt_sock_mmap, 0,
> +		      sizeof(entry->s.pkt_sock_mmap));
>  		break;
>  #ifdef ODP_HAVE_NETMAP
>  	case ODP_PKTIO_TYPE_NETMAP:
> @@ -177,7 +181,9 @@ odp_pktio_t odp_pktio_open(char *dev, odp_buffer_pool_t pool,
>  	}
>  
>  	switch (params->type) {
> -	case ODP_PKTIO_TYPE_SOCKET:
> +	case ODP_PKTIO_TYPE_SOCKET_BASIC:
> +	case ODP_PKTIO_TYPE_SOCKET_MMSG:
> +	case ODP_PKTIO_TYPE_SOCKET_MMAP:
>  		ODP_DBG("Allocating socket pktio\n");
>  		break;
>  #ifdef ODP_HAVE_NETMAP
> @@ -200,7 +206,8 @@ odp_pktio_t odp_pktio_open(char *dev, odp_buffer_pool_t pool,
>  	pktio_entry = get_entry(id);
>  
>  	switch (params->type) {
> -	case ODP_PKTIO_TYPE_SOCKET:
> +	case ODP_PKTIO_TYPE_SOCKET_BASIC:
> +	case ODP_PKTIO_TYPE_SOCKET_MMSG:
>  		res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
>  		if (res == -1) {
>  			close_pkt_sock(&pktio_entry->s.pkt_sock);
> @@ -208,10 +215,19 @@ odp_pktio_t odp_pktio_open(char *dev, odp_buffer_pool_t pool,
>  			id = ODP_PKTIO_INVALID;
>  		}
>  		break;
> +	case ODP_PKTIO_TYPE_SOCKET_MMAP:
> +		res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev,
> +				pool, params->sock_params.fanout);
> +		if (res == -1) {
> +			close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
> +			free_pktio_entry(id);
> +			id = ODP_PKTIO_INVALID;
> +		}
> +		break;
>  #ifdef ODP_HAVE_NETMAP
>  	case ODP_PKTIO_TYPE_NETMAP:
>  		res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
> -				       pool, &params->nm_params);
> +				pool, &params->nm_params);
>  		if (res == -1) {
>  			close_pkt_netmap(&pktio_entry->s.pkt_nm);
>  			free_pktio_entry(id);
> @@ -237,9 +253,13 @@ int odp_pktio_close(odp_pktio_t id)
>  	lock_entry(entry);
>  	if (!is_free(entry)) {
>  		switch (entry->s.params.type) {
> -		case ODP_PKTIO_TYPE_SOCKET:
> +		case ODP_PKTIO_TYPE_SOCKET_BASIC:
> +		case ODP_PKTIO_TYPE_SOCKET_MMSG:
>  			res  = close_pkt_sock(&entry->s.pkt_sock);
>  			break;
> +		case ODP_PKTIO_TYPE_SOCKET_MMAP:
> +			res  = close_pkt_sock_mmap(&entry->s.pkt_sock_mmap);
> +			break;
>  #ifdef ODP_HAVE_NETMAP
>  		case ODP_PKTIO_TYPE_NETMAP:
>  			res  = close_pkt_netmap(&entry->s.pkt_nm);
> @@ -247,7 +267,7 @@ int odp_pktio_close(odp_pktio_t id)
>  #endif
>  		default:
>  			break;
> -		res |= free_pktio_entry(id);
> +			res |= free_pktio_entry(id);
>  		}
>  	}
>  	unlock_entry(entry);
> @@ -279,8 +299,17 @@ int odp_pktio_recv(odp_pktio_t id, odp_packet_t pkt_table[], unsigned len)
>  
>  	lock_entry(pktio_entry);
>  	switch (pktio_entry->s.params.type) {
> -	case ODP_PKTIO_TYPE_SOCKET:
> -		pkts = recv_pkt_sock(&pktio_entry->s.pkt_sock, pkt_table, len);
> +	case ODP_PKTIO_TYPE_SOCKET_BASIC:
> +		pkts = recv_pkt_sock_basic(&pktio_entry->s.pkt_sock,
> +				pkt_table, len);
> +		break;
> +	case ODP_PKTIO_TYPE_SOCKET_MMSG:
> +		pkts = recv_pkt_sock_mmsg(&pktio_entry->s.pkt_sock,
> +				pkt_table, len);
> +		break;
> +	case ODP_PKTIO_TYPE_SOCKET_MMAP:
> +		pkts = recv_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
> +				pkt_table, len);
>  		break;
>  #ifdef ODP_HAVE_NETMAP
>  	case ODP_PKTIO_TYPE_NETMAP:
> @@ -312,12 +341,22 @@ int odp_pktio_send(odp_pktio_t id, odp_packet_t pkt_table[], unsigned len)
>  
>  	lock_entry(pktio_entry);
>  	switch (pktio_entry->s.params.type) {
> -	case ODP_PKTIO_TYPE_SOCKET:
> -		pkts = send_pkt_sock(&pktio_entry->s.pkt_sock, pkt_table, len);
> +	case ODP_PKTIO_TYPE_SOCKET_BASIC:
> +		pkts = send_pkt_sock_basic(&pktio_entry->s.pkt_sock,
> +				pkt_table, len);
> +		break;
> +	case ODP_PKTIO_TYPE_SOCKET_MMSG:
> +		pkts = send_pkt_sock_mmsg(&pktio_entry->s.pkt_sock,
> +				pkt_table, len);
> +		break;
> +	case ODP_PKTIO_TYPE_SOCKET_MMAP:
> +		pkts = send_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
> +				pkt_table, len);
>  		break;
>  #ifdef ODP_HAVE_NETMAP
>  	case ODP_PKTIO_TYPE_NETMAP:
> -		pkts = send_pkt_netmap(&pktio_entry->s.pkt_nm, pkt_table, len);
> +		pkts = send_pkt_netmap(&pktio_entry->s.pkt_nm,
> +				pkt_table, len);
>  		break;
>  #endif
>  	default:
> diff --git a/platform/linux-generic/source/odp_packet_socket.c b/platform/linux-generic/source/odp_packet_socket.c
> index aaf2605..4e5803f 100644
> --- a/platform/linux-generic/source/odp_packet_socket.c
> +++ b/platform/linux-generic/source/odp_packet_socket.c
> @@ -63,10 +63,9 @@ static inline int ethaddrs_equal(unsigned char mac_a[], unsigned char mac_b[])
>  	return !memcmp(mac_a, mac_b, ETH_ALEN);
>  }
>  
> -static int set_pkt_sock_fanout(pkt_sock_t * const pkt_sock, int sock_group_idx)
> +static int set_pkt_sock_fanout_mmap(pkt_sock_mmap_t * const pkt_sock,
> +		int sock_group_idx)
>  {
> -#if ODP_PACKET_SOCKET_FANOUT == 1
> -	/* Use FANOUT-mode for socket */
>  	int sockfd = pkt_sock->sockfd;
>  	int val;
>  	int err;
> @@ -80,16 +79,9 @@ static int set_pkt_sock_fanout(pkt_sock_t * const pkt_sock, int sock_group_idx)
>  		perror("set_pkt_sock_fanout() - setsockopt(PACKET_FANOUT)");
>  		return -1;
>  	}
> -#else
> -	(void)pkt_sock;
> -	(void)sock_group_idx;
> -#endif
> -
>  	return 0;
>  }
>  
> -#if (ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_BASIC) || \
> -	(ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMSG)
>  /*
>   * ODP_PACKET_SOCKET_BASIC:
>   * ODP_PACKET_SOCKET_MMSG:
> @@ -163,11 +155,6 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock, char *netdev,
>  		return -1;
>  	}
>  
> -	/* configure PACKET_FANOUT mode for socket (if mode enabled) */
> -	err = set_pkt_sock_fanout(pkt_sock, if_idx);
> -	if (err != 0)
> -		return -1;
> -
>  	return sockfd;
>  }
>  
> @@ -184,13 +171,11 @@ int close_pkt_sock(pkt_sock_t * const pkt_sock)
>  
>  	return 0;
>  }
> -#endif
>  
> -#if ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_BASIC
>  /*
>   * ODP_PACKET_SOCKET_BASIC:
>   */
> -int recv_pkt_sock(pkt_sock_t *const pkt_sock,
> +int recv_pkt_sock_basic(pkt_sock_t *const pkt_sock,
>  		  odp_packet_t pkt_table[], unsigned len)
>  {
>  	ssize_t recv_bytes;
> @@ -240,7 +225,7 @@ int recv_pkt_sock(pkt_sock_t *const pkt_sock,
>  /*
>   * ODP_PACKET_SOCKET_BASIC:
>   */
> -int send_pkt_sock(pkt_sock_t * const pkt_sock,
> +int send_pkt_sock_basic(pkt_sock_t * const pkt_sock,
>  		  odp_packet_t pkt_table[], unsigned len)
>  {
>  	odp_packet_t pkt;
> @@ -281,11 +266,10 @@ int send_pkt_sock(pkt_sock_t * const pkt_sock,
>  	return nb_tx;
>  }
>  
> -#elif ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMSG
>  /*
>   * ODP_PACKET_SOCKET_MMSG:
>   */
> -int recv_pkt_sock(pkt_sock_t * const pkt_sock,
> +int recv_pkt_sock_mmsg(pkt_sock_t * const pkt_sock,
>  		  odp_packet_t pkt_table[], unsigned len)
>  {
>  	const int sockfd = pkt_sock->sockfd;
> @@ -348,7 +332,7 @@ int recv_pkt_sock(pkt_sock_t * const pkt_sock,
>  /*
>   * ODP_PACKET_SOCKET_MMSG:
>   */
> -int send_pkt_sock(pkt_sock_t * const pkt_sock,
> +int send_pkt_sock_mmsg(pkt_sock_t * const pkt_sock,
>  		  odp_packet_t pkt_table[], unsigned len)
>  {
>  	struct mmsghdr msgvec[ODP_PACKET_SOCKET_MAX_BURST_TX];
> @@ -387,7 +371,6 @@ int send_pkt_sock(pkt_sock_t * const pkt_sock,
>  	return len;
>  }
>  
> -#elif ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMAP
>  /*
>   * ODP_PACKET_SOCKET_MMAP:
>   */
> @@ -402,7 +385,7 @@ union frame_map {
>  	void *raw;
>  };
>  
> -static int pkt_socket(void)
> +static int mmap_pkt_socket(void)
>  {
>  	int ver = TPACKET_V2;
>  
> @@ -421,23 +404,23 @@ static int pkt_socket(void)
>  	return sock;
>  }
>  
> -static inline int rx_kernel_ready(struct tpacket2_hdr *hdr)
> +static inline int mmap_rx_kernel_ready(struct tpacket2_hdr *hdr)
>  {
>  	return ((hdr->tp_status & TP_STATUS_USER) == TP_STATUS_USER);
>  }
>  
> -static inline void rx_user_ready(struct tpacket2_hdr *hdr)
> +static inline void mmap_rx_user_ready(struct tpacket2_hdr *hdr)
>  {
>  	hdr->tp_status = TP_STATUS_KERNEL;
>  	__sync_synchronize();
>  }
>  
> -static inline int tx_kernel_ready(struct tpacket2_hdr *hdr)
> +static inline int mmap_tx_kernel_ready(struct tpacket2_hdr *hdr)
>  {
>  	return !(hdr->tp_status & (TP_STATUS_SEND_REQUEST | TP_STATUS_SENDING));
>  }
>  
> -static inline void tx_user_ready(struct tpacket2_hdr *hdr)
> +static inline void mmap_tx_user_ready(struct tpacket2_hdr *hdr)
>  {
>  	hdr->tp_status = TP_STATUS_SEND_REQUEST;
>  	__sync_synchronize();
> @@ -462,7 +445,7 @@ static inline unsigned pkt_mmap_v2_rx(int sock, struct ring *ring,
>  	frame_num = ring->frame_num;
>  
>  	while (i < len) {
> -		if (rx_kernel_ready(ring->rd[frame_num].iov_base)) {
> +		if (mmap_rx_kernel_ready(ring->rd[frame_num].iov_base)) {
>  			ppd.raw = ring->rd[frame_num].iov_base;
>  
>  			next_frame_num = (frame_num + 1) % ring->rd_num;
> @@ -474,7 +457,7 @@ static inline unsigned pkt_mmap_v2_rx(int sock, struct ring *ring,
>  			eth_hdr = (struct ethhdr *)pkt_buf;
>  			if (odp_unlikely(ethaddrs_equal(if_mac,
>  							eth_hdr->h_source))) {
> -				rx_user_ready(ppd.raw); /* drop */
> +				mmap_rx_user_ready(ppd.raw); /* drop */
>  				continue;
>  			}
>  
> @@ -486,7 +469,7 @@ static inline unsigned pkt_mmap_v2_rx(int sock, struct ring *ring,
>  				 + frame_offset;
>  			memcpy(l2_hdr, pkt_buf, pkt_len);
>  
> -			rx_user_ready(ppd.raw);
> +			mmap_rx_user_ready(ppd.raw);
>  
>  			/* Parse and set packet header data */
>  			odp_packet_parse(pkt_table[i], pkt_len, frame_offset);
> @@ -516,7 +499,7 @@ static inline unsigned pkt_mmap_v2_tx(int sock, struct ring *ring,
>  	frame_num = ring->frame_num;
>  
>  	while (i < len) {
> -		if (tx_kernel_ready(ring->rd[frame_num].iov_base)) {
> +		if (mmap_tx_kernel_ready(ring->rd[frame_num].iov_base)) {
>  			ppd.raw = ring->rd[frame_num].iov_base;
>  
>  			next_frame_num = (frame_num + 1) % ring->rd_num;
> @@ -530,7 +513,7 @@ static inline unsigned pkt_mmap_v2_tx(int sock, struct ring *ring,
>  			memcpy((uint8_t *)ppd.raw + TPACKET2_HDRLEN -
>  			       sizeof(struct sockaddr_ll), pkt_buf, pkt_len);
>  
> -			tx_user_ready(ppd.raw);
> +			mmap_tx_user_ready(ppd.raw);
>  
>  			odp_packet_free(pkt_table[i]);
>  			frame_num = next_frame_num;
> @@ -553,7 +536,7 @@ static inline unsigned pkt_mmap_v2_tx(int sock, struct ring *ring,
>  	return i;
>  }
>  
> -static void fill_ring(struct ring *ring, unsigned blocks)
> +static void mmap_fill_ring(struct ring *ring, unsigned blocks)
>  {
>  	ring->req.tp_block_size = getpagesize() << 2;
>  	ring->req.tp_frame_size = TPACKET_ALIGNMENT << 7;
> @@ -567,7 +550,7 @@ static void fill_ring(struct ring *ring, unsigned blocks)
>  	ring->flen = ring->req.tp_frame_size;
>  }
>  
> -static int set_packet_loss_discard(int sock)
> +static int mmap_set_packet_loss_discard(int sock)
>  {
>  	int ret, discard = 1;
>  
> @@ -581,7 +564,7 @@ static int set_packet_loss_discard(int sock)
>  	return 0;
>  }
>  
> -static int setup_ring(int sock, struct ring *ring, int type)
> +static int mmap_setup_ring(int sock, struct ring *ring, int type)
>  {
>  	int ret = 0;
>  	unsigned blocks = 256;
> @@ -591,12 +574,12 @@ static int setup_ring(int sock, struct ring *ring, int type)
>  	ring->version = TPACKET_V2;
>  
>  	if (type == PACKET_TX_RING) {
> -		ret = set_packet_loss_discard(sock);
> +		ret = mmap_set_packet_loss_discard(sock);
>  		if (ret != 0)
>  			return -1;
>  	}
>  
> -	fill_ring(ring, blocks);
> +	mmap_fill_ring(ring, blocks);
>  
>  	ret = setsockopt(sock, SOL_PACKET, type, &ring->req, sizeof(ring->req));
>  	if (ret == -1) {
> @@ -614,7 +597,7 @@ static int setup_ring(int sock, struct ring *ring, int type)
>  	return 0;
>  }
>  
> -static int mmap_sock(pkt_sock_t *pkt_sock)
> +static int mmap_sock(pkt_sock_mmap_t *pkt_sock)
>  {
>  	int i;
>  	int sock = pkt_sock->sockfd;
> @@ -655,14 +638,14 @@ static int mmap_sock(pkt_sock_t *pkt_sock)
>  	return 0;
>  }
>  
> -static void unmap_sock(pkt_sock_t *pkt_sock)
> +static void mmap_unmap_sock(pkt_sock_mmap_t *pkt_sock)
>  {
>  	munmap(pkt_sock->mmap_base, pkt_sock->mmap_len);
>  	free(pkt_sock->rx_ring.rd);
>  	free(pkt_sock->tx_ring.rd);
>  }
>  
> -static int bind_sock(pkt_sock_t *pkt_sock, char *netdev)
> +static int mmap_bind_sock(pkt_sock_mmap_t *pkt_sock, char *netdev)
>  {
>  	int ret;
>  
> @@ -684,7 +667,7 @@ static int bind_sock(pkt_sock_t *pkt_sock, char *netdev)
>  	return 0;
>  }
>  
> -static int store_hw_addr(pkt_sock_t * const pkt_sock, char *netdev)
> +static int mmap_store_hw_addr(pkt_sock_mmap_t * const pkt_sock, char *netdev)
>  {
>  	struct ifreq ethreq;
>  	int ret;
> @@ -707,8 +690,8 @@ static int store_hw_addr(pkt_sock_t * const pkt_sock, char *netdev)
>  /*
>   * ODP_PACKET_SOCKET_MMAP:
>   */
> -int setup_pkt_sock(pkt_sock_t * const pkt_sock, char *netdev,
> -		   odp_buffer_pool_t pool)
> +int setup_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock, char *netdev,
> +		   odp_buffer_pool_t pool, int fanout)
>  {
>  	odp_packet_t pkt;
>  	uint8_t *pkt_buf;
> @@ -733,17 +716,19 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock, char *netdev,
>  	odp_packet_free(pkt);
>  
>  	pkt_sock->pool = pool;
> -	pkt_sock->sockfd = pkt_socket();
> +	pkt_sock->sockfd = mmap_pkt_socket();
>  
> -	ret = bind_sock(pkt_sock, netdev);
> +	ret = mmap_bind_sock(pkt_sock, netdev);
>  	if (ret != 0)
>  		return -1;
>  
> -	ret = setup_ring(pkt_sock->sockfd, &pkt_sock->tx_ring, PACKET_TX_RING);
> +	ret = mmap_setup_ring(pkt_sock->sockfd, &pkt_sock->tx_ring,
> +			PACKET_TX_RING);
>  	if (ret != 0)
>  		return -1;
>  
> -	ret = setup_ring(pkt_sock->sockfd, &pkt_sock->rx_ring, PACKET_RX_RING);
> +	ret = mmap_setup_ring(pkt_sock->sockfd, &pkt_sock->rx_ring,
> +			PACKET_RX_RING);
>  	if (ret != 0)
>  		return -1;
>  
> @@ -751,7 +736,7 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock, char *netdev,
>  	if (ret != 0)
>  		return -1;
>  
> -	ret = store_hw_addr(pkt_sock, netdev);
> +	ret = mmap_store_hw_addr(pkt_sock, netdev);
>  	if (ret != 0)
>  		return -1;
>  
> @@ -761,9 +746,11 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock, char *netdev,
>  		return -1;
>  	}
>  
> -	ret = set_pkt_sock_fanout(pkt_sock, if_idx);
> -	if (ret != 0)
> -		return -1;
> +	if (fanout) {
> +		ret = set_pkt_sock_fanout_mmap(pkt_sock, if_idx);
> +		if (ret != 0)
> +			return -1;
> +	}
>  
>  	return pkt_sock->sockfd;
>  }
> @@ -771,9 +758,9 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock, char *netdev,
>  /*
>   * ODP_PACKET_SOCKET_MMAP:
>   */
> -int close_pkt_sock(pkt_sock_t * const pkt_sock)
> +int close_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock)
>  {
> -	unmap_sock(pkt_sock);
> +	mmap_unmap_sock(pkt_sock);
>  	if (close(pkt_sock->sockfd) != 0) {
>  		perror("close_pkt_sock() - close(sockfd)");
>  		return -1;
> @@ -785,7 +772,7 @@ int close_pkt_sock(pkt_sock_t * const pkt_sock)
>  /*
>   * ODP_PACKET_SOCKET_MMAP:
>   */
> -int recv_pkt_sock(pkt_sock_t * const pkt_sock,
> +int recv_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
>  		  odp_packet_t pkt_table[], unsigned len)
>  {
>  	return pkt_mmap_v2_rx(pkt_sock->rx_ring.sock, &pkt_sock->rx_ring,
> @@ -796,13 +783,9 @@ int recv_pkt_sock(pkt_sock_t * const pkt_sock,
>  /*
>   * ODP_PACKET_SOCKET_MMAP:
>   */
> -int send_pkt_sock(pkt_sock_t * const pkt_sock,
> +int send_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
>  		  odp_packet_t pkt_table[], unsigned len)
>  {
>  	return pkt_mmap_v2_tx(pkt_sock->tx_ring.sock, &pkt_sock->tx_ring,
>  			      pkt_table, len);
>  }
> -
> -#else
> -#error "Unsupported ODP_PACKET_SOCKET_MODE!"
> -#endif
> diff --git a/test/packet/odp_example_pktio.c b/test/packet/odp_example_pktio.c
> index 85bbdd7..2b1ce3d 100644
> --- a/test/packet/odp_example_pktio.c
> +++ b/test/packet/odp_example_pktio.c
> @@ -42,6 +42,8 @@ typedef struct {
>  	int if_count;		/**< Number of interfaces to be used */
>  	char **if_names;	/**< Array of pointers to interface names */
>  	int mode;		/**< Packet IO mode */
> +	int type;		/**< Packet IO type */
> +	int fanout;		/**< Packet IO fanout */
>  	odp_buffer_pool_t pool;	/**< Buffer pool for packet IO */
>  } appl_args_t;
>  
> @@ -52,6 +54,8 @@ typedef struct {
>  	char *pktio_dev;	/**< Interface name to use */
>  	odp_buffer_pool_t pool;	/**< Buffer pool for packet IO */
>  	int mode;		/**< Thread mode */
> +	int type;		/**< Thread i/o type */
> +	int fanout;		/**< Thread i/o fanout */
>  } thread_args_t;
>  
>  /**
> @@ -111,7 +115,8 @@ static void *pktio_queue_thread(void *arg)
>  	}
>  
>  	/* Open a packet IO instance for this thread */
> -	sock_params->type = ODP_PKTIO_TYPE_SOCKET;
> +	sock_params->type = thr_args->type;
> +	sock_params->fanout = thr_args->fanout;
>  	pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool, &params);
>  	if (pktio == ODP_PKTIO_INVALID) {
>  		ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
> @@ -223,7 +228,8 @@ static void *pktio_ifburst_thread(void *arg)
>  	}
>  
>  	/* Open a packet IO instance for this thread */
> -	sock_params->type = ODP_PKTIO_TYPE_SOCKET;
> +	sock_params->type = thr_args->type;
> +	sock_params->fanout = thr_args->fanout;
>  	pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool, &params);
>  	if (pktio == ODP_PKTIO_INVALID) {
>  		ODP_ERR("  [%02i] Error: pktio create failed.\n", thr);
> @@ -357,6 +363,8 @@ int main(int argc, char *argv[])
>  		args->thread[i].pktio_dev = args->appl.if_names[if_idx];
>  		args->thread[i].pool = pool;
>  		args->thread[i].mode = args->appl.mode;
> +		args->thread[i].type = args->appl.type;
> +		args->thread[i].fanout = args->appl.fanout;
>  
>  		if (args->appl.mode == APPL_MODE_PKT_BURST)
>  			thr_run_func = pktio_ifburst_thread;
> @@ -470,9 +478,11 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
>  	};
>  
>  	appl_args->mode = -1; /* Invalid, must be changed by parsing */
> +	appl_args->type = 3;  /* 3: ODP_PKTIO_TYPE_SOCKET_MMAP */
> +	appl_args->fanout = 1; /* turn of fanout by default for mmap */
>  
>  	while (1) {
> -		opt = getopt_long(argc, argv, "+c:i:m:h",
> +		opt = getopt_long(argc, argv, "+c:i:m:t:f:h",
>  				  longopts, &long_index);
>  
>  		if (opt == -1)
> @@ -533,6 +543,14 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
>  				appl_args->mode = APPL_MODE_PKT_QUEUE;
>  			break;
>  
> +		case 't':
> +			appl_args->type = atoi(optarg);
> +			break;
> +
> +		case 'f':
> +			appl_args->type = atoi(optarg);
> +			break;
> +
>  		case 'h':
>  			usage(argv[0]);
>  			exit(EXIT_SUCCESS);
> @@ -602,6 +620,12 @@ static void usage(char *progname)
>  	       "  -i, --interface Eth interfaces (comma-separated, no spaces)\n"
>  	       "  -m, --mode      0: Burst send&receive packets (no queues)\n"
>  	       "                  1: Send&receive packets through ODP queues.\n"
> +	       " -t, --type   1: ODP_PKTIO_TYPE_SOCKET_BASIC\n"
> +	       "	      2: ODP_PKTIO_TYPE_SOCKET_MMSG\n"
> +	       "	      3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
> +	       "	      4: ODP_PKTIO_TYPE_NETMAP\n"
> +	       "	 Default: 3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
> +	       " -f, --fanout 0: off 1: on (Default 1: on)\n"
>  	       "\n"
>  	       "Optional OPTIONS\n"
>  	       "  -c, --count <number> Core count.\n"
> -- 
> 1.8.5.1.163.gd7aced9

Dosn't build!

$ make
make -C /home/anders/src/odp/platform/linux-generic libs
make[1]: Entering directory
`/home/anders/src/odp/platform/linux-generic'
Compiling source/odp_packet_io.c
cc -c -MD -I../../include -I./include -I./include/api -fPIC
-DODP_DEBUG=1 -O3 -pthread -W -Wall -Werror -Wstrict-prototypes
-Wmissing-prototypes -Wmissing-declarations -Wold-style-definition
-Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual
-Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings  -o
obj/odp_packet_io.o source/odp_packet_io.c
source/odp_packet_io.c: In function ‘init_pktio_entry’:
source/odp_packet_io.c:119:2: error: enumeration value
‘ODP_PKTIO_TYPE_NETMAP’ not handled in switch [-Werror=switch]
  switch (params->type) {
    ^
    source/odp_packet_io.c: In function ‘odp_pktio_open’:
    source/odp_packet_io.c:208:2: error: enumeration value
    ‘ODP_PKTIO_TYPE_NETMAP’ not handled in switch [-Werror=switch]
      switch (params->type) {
        ^
	cc1: all warnings being treated as errors
	make[1]: *** [obj/odp_packet_io.o] Error 1
	make[1]: Leaving directory
	`/home/anders/src/odp/platform/linux-generic'
	make: *** [lib] Error 2


need to do something like this:
 $ git df


Cheers,
Anders

Comments

Ola Liljedahl March 28, 2014, 9:15 p.m. UTC | #1
What's the benefit of using recvmmsg()/sendmmsg() compared to using
recv()/send()? Is it actually a different mechanism or just different
system calls?




On 28 March 2014 16:38, Anders Roxell <anders.roxell@linaro.org> wrote:

> On 2014-03-28 19:08, Maxim Uvarov wrote:
> > Dynamically select type of packet I/O
> > sock_params->type =
> >       ODP_PKTIO_TYPE_SOCKET_BASIC
> >       ODP_PKTIO_TYPE_SOCKET_MMSG
> >       ODP_PKTIO_TYPE_SOCKET_MMAP
> >       ODP_PKTIO_TYPE_NETMAP
> > sock_params->fanout = 1;
> > pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool, &params);
> >
> > v2:
> >  - remove NETMAP define in enum;
> >  - add command line parameters to odp_example_pktio for I/O selection.
> >
> > Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
> > ---
> >  .../linux-generic/include/api/odp_pktio_socket.h   |   1 +
> >  .../linux-generic/include/api/odp_pktio_types.h    |   8 +-
> >  .../linux-generic/include/odp_packet_io_internal.h |   1 +
> >  platform/linux-generic/include/odp_packet_socket.h |  55 ++++-------
> >  platform/linux-generic/source/odp_packet_io.c      |  61 +++++++++---
> >  platform/linux-generic/source/odp_packet_socket.c  | 103
> +++++++++------------
> >  test/packet/odp_example_pktio.c                    |  30 +++++-
> >  7 files changed, 146 insertions(+), 113 deletions(-)
> >
> > diff --git a/platform/linux-generic/include/api/odp_pktio_socket.h
> b/platform/linux-generic/include/api/odp_pktio_socket.h
> > index e0211bf..deeeeed 100644
> > --- a/platform/linux-generic/include/api/odp_pktio_socket.h
> > +++ b/platform/linux-generic/include/api/odp_pktio_socket.h
> > @@ -15,6 +15,7 @@ extern "C" {
> >
> >  typedef struct {
> >       odp_pktio_type_t type;
> > +     int fanout;
> >  } socket_params_t;
> >
> >  #ifdef __cplusplus
> > diff --git a/platform/linux-generic/include/api/odp_pktio_types.h
> b/platform/linux-generic/include/api/odp_pktio_types.h
> > index e6b4cbf..8d195a5 100644
> > --- a/platform/linux-generic/include/api/odp_pktio_types.h
> > +++ b/platform/linux-generic/include/api/odp_pktio_types.h
> > @@ -17,10 +17,10 @@ extern "C" {
> >   */
> >
> >  typedef enum {
> > -     ODP_PKTIO_TYPE_SOCKET = 0x01,
> > -#ifdef ODP_HAVE_NETMAP
> > -     ODP_PKTIO_TYPE_NETMAP = 0x02,
> > -#endif
> > +     ODP_PKTIO_TYPE_SOCKET_BASIC = 0x1,
> > +     ODP_PKTIO_TYPE_SOCKET_MMSG,
> > +     ODP_PKTIO_TYPE_SOCKET_MMAP,
> > +     ODP_PKTIO_TYPE_NETMAP,
> >  } odp_pktio_type_t;
> >
> >  #include <odp_pktio_socket.h>
> > diff --git a/platform/linux-generic/include/odp_packet_io_internal.h
> b/platform/linux-generic/include/odp_packet_io_internal.h
> > index ba1ee9b..3ab7fa0 100644
> > --- a/platform/linux-generic/include/odp_packet_io_internal.h
> > +++ b/platform/linux-generic/include/odp_packet_io_internal.h
> > @@ -31,6 +31,7 @@ struct pktio_entry {
> >       odp_queue_t outq_default;       /**< default out queue */
> >       odp_pktio_params_t params;      /**< pktio parameters */
> >       pkt_sock_t pkt_sock;            /**< using socket API for IO */
> > +     pkt_sock_mmap_t pkt_sock_mmap;  /**< using socket mmap API for IO
> */
> >  #ifdef ODP_HAVE_NETMAP
> >       pkt_netmap_t pkt_nm;            /**< using netmap API for IO */
> >  #endif
> > diff --git a/platform/linux-generic/include/odp_packet_socket.h
> b/platform/linux-generic/include/odp_packet_socket.h
> > index fe216bb..086de05 100644
> > --- a/platform/linux-generic/include/odp_packet_socket.h
> > +++ b/platform/linux-generic/include/odp_packet_socket.h
> > @@ -20,37 +20,15 @@
> >
> >  #include <linux/version.h>
> >
> > -
> >  /*
> >   * Packet socket config:
> >   */
> > -#define ODP_PACKET_SOCKET_BASIC 0 /** use recv()/send() */
> > -#define ODP_PACKET_SOCKET_MMSG  1 /** use recvmmsg()/sendmmsg() */
> > -#define ODP_PACKET_SOCKET_MMAP  2 /** use PACKET_MMAP */
> > -
> > -
> > -#if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 1, 0)
> > -/* PACKET_FANOUT feature not supported */
> > -#define ODP_PACKET_SOCKET_FANOUT 0
> > -#define ODP_PACKET_SOCKET_MODE (ODP_PACKET_SOCKET_BASIC)
> > -#else
> > -/** PACKET_FANOUT mode spreads incoming packets over multiple sockets*/
> > -#define ODP_PACKET_SOCKET_FANOUT 1 /* 0=Off, 1=On */
> > -/** Choose one from the alternatives above */
> > -#define ODP_PACKET_SOCKET_MODE (ODP_PACKET_SOCKET_MMAP)
> > -#endif
> > -
> >
> >  /** Max receive (Rx) burst size*/
> >  #define ODP_PACKET_SOCKET_MAX_BURST_RX 32
> >  /** Max transmit (Tx) burst size*/
> >  #define ODP_PACKET_SOCKET_MAX_BURST_TX 32
> >
> > -
> > -
> > -#if (ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_BASIC) || \
> > -     (ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMSG)
> > -
> >  typedef struct {
> >       int sockfd; /**< socket descriptor */
> >       odp_buffer_pool_t pool; /**< buffer pool to alloc packets from */
> > @@ -60,12 +38,6 @@ typedef struct {
> >       unsigned char if_mac[ETH_ALEN]; /**< IF eth mac addr */
> >  } pkt_sock_t;
> >
> > -#elif ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMAP
> > -
> > -#if ODP_PACKET_SOCKET_FANOUT == 0
> > -#error "ODP_PACKET_SOCKET_MMAP requires ODP_PACKET_SOCKET_FANOUT=1"
> > -#endif
> > -
> >  /** packet mmap ring */
> >  struct ring {
> >       struct iovec *rd;
> > @@ -99,31 +71,44 @@ typedef struct {
> >       unsigned mmap_len;
> >       unsigned char if_mac[ETH_ALEN];
> >       struct sockaddr_ll ll;
> > -} pkt_sock_t;
> > -
> > -#else
> > -#error "Unsupported ODP_PACKET_SOCKET_MODE!"
> > -#endif
> > +} pkt_sock_mmap_t;
> >
> >  /**
> >   * Open & configure a raw packet socket
> >   */
> >  int setup_pkt_sock(pkt_sock_t * const pkt_sock, char *netdev,
> >                  odp_buffer_pool_t pool);
> > +
> > +int setup_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock, char *netdev,
> > +                odp_buffer_pool_t pool, int fanout);
> > +
> >  /**
> >   * Close a packet socket
> >   */
> >  int close_pkt_sock(pkt_sock_t * const pkt_sock);
> >
> > +int close_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock);
> > +
> >  /**
> >   * Receive packets from the packet socket
> >   */
> > -int recv_pkt_sock(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
> > +int recv_pkt_sock_basic(pkt_sock_t * const pkt_sock, odp_packet_t
> pkt_table[],
> >                 unsigned len);
> > +
> > +int recv_pkt_sock_mmsg(pkt_sock_t * const pkt_sock, odp_packet_t
> pkt_table[],
> > +               unsigned len);
> > +
> > +int recv_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
> > +               odp_packet_t pkt_table[], unsigned len);
> >  /**
> >   * Send packets through the packet socket
> >   */
> > -int send_pkt_sock(pkt_sock_t * const pkt_sock, odp_packet_t pkt_table[],
> > +int send_pkt_sock_basic(pkt_sock_t * const pkt_sock, odp_packet_t
> pkt_table[],
> > +               unsigned len);
> > +
> > +int send_pkt_sock_mmsg(pkt_sock_t * const pkt_sock, odp_packet_t
> pkt_table[],
> >                 unsigned len);
> >
> > +int send_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
> > +               odp_packet_t pkt_table[], unsigned len);
> >  #endif
> > diff --git a/platform/linux-generic/source/odp_packet_io.c
> b/platform/linux-generic/source/odp_packet_io.c
> > index 92aed34..e33cf35 100644
> > --- a/platform/linux-generic/source/odp_packet_io.c
> > +++ b/platform/linux-generic/source/odp_packet_io.c
> > @@ -117,8 +117,12 @@ static void init_pktio_entry(pktio_entry_t *entry,
> odp_pktio_params_t *params)
> >       set_taken(entry);
> >       entry->s.inq_default = ODP_QUEUE_INVALID;
> >       switch (params->type) {
> > -     case ODP_PKTIO_TYPE_SOCKET:
> > +     case ODP_PKTIO_TYPE_SOCKET_BASIC:
> > +     case ODP_PKTIO_TYPE_SOCKET_MMSG:
> > +     case ODP_PKTIO_TYPE_SOCKET_MMAP:
> >               memset(&entry->s.pkt_sock, 0, sizeof(entry->s.pkt_sock));
> > +             memset(&entry->s.pkt_sock_mmap, 0,
> > +                   sizeof(entry->s.pkt_sock_mmap));
> >               break;
> >  #ifdef ODP_HAVE_NETMAP
> >       case ODP_PKTIO_TYPE_NETMAP:
> > @@ -177,7 +181,9 @@ odp_pktio_t odp_pktio_open(char *dev,
> odp_buffer_pool_t pool,
> >       }
> >
> >       switch (params->type) {
> > -     case ODP_PKTIO_TYPE_SOCKET:
> > +     case ODP_PKTIO_TYPE_SOCKET_BASIC:
> > +     case ODP_PKTIO_TYPE_SOCKET_MMSG:
> > +     case ODP_PKTIO_TYPE_SOCKET_MMAP:
> >               ODP_DBG("Allocating socket pktio\n");
> >               break;
> >  #ifdef ODP_HAVE_NETMAP
> > @@ -200,7 +206,8 @@ odp_pktio_t odp_pktio_open(char *dev,
> odp_buffer_pool_t pool,
> >       pktio_entry = get_entry(id);
> >
> >       switch (params->type) {
> > -     case ODP_PKTIO_TYPE_SOCKET:
> > +     case ODP_PKTIO_TYPE_SOCKET_BASIC:
> > +     case ODP_PKTIO_TYPE_SOCKET_MMSG:
> >               res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
> >               if (res == -1) {
> >                       close_pkt_sock(&pktio_entry->s.pkt_sock);
> > @@ -208,10 +215,19 @@ odp_pktio_t odp_pktio_open(char *dev,
> odp_buffer_pool_t pool,
> >                       id = ODP_PKTIO_INVALID;
> >               }
> >               break;
> > +     case ODP_PKTIO_TYPE_SOCKET_MMAP:
> > +             res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
> dev,
> > +                             pool, params->sock_params.fanout);
> > +             if (res == -1) {
> > +                     close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
> > +                     free_pktio_entry(id);
> > +                     id = ODP_PKTIO_INVALID;
> > +             }
> > +             break;
> >  #ifdef ODP_HAVE_NETMAP
> >       case ODP_PKTIO_TYPE_NETMAP:
> >               res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
> > -                                    pool, &params->nm_params);
> > +                             pool, &params->nm_params);
> >               if (res == -1) {
> >                       close_pkt_netmap(&pktio_entry->s.pkt_nm);
> >                       free_pktio_entry(id);
> > @@ -237,9 +253,13 @@ int odp_pktio_close(odp_pktio_t id)
> >       lock_entry(entry);
> >       if (!is_free(entry)) {
> >               switch (entry->s.params.type) {
> > -             case ODP_PKTIO_TYPE_SOCKET:
> > +             case ODP_PKTIO_TYPE_SOCKET_BASIC:
> > +             case ODP_PKTIO_TYPE_SOCKET_MMSG:
> >                       res  = close_pkt_sock(&entry->s.pkt_sock);
> >                       break;
> > +             case ODP_PKTIO_TYPE_SOCKET_MMAP:
> > +                     res  =
> close_pkt_sock_mmap(&entry->s.pkt_sock_mmap);
> > +                     break;
> >  #ifdef ODP_HAVE_NETMAP
> >               case ODP_PKTIO_TYPE_NETMAP:
> >                       res  = close_pkt_netmap(&entry->s.pkt_nm);
> > @@ -247,7 +267,7 @@ int odp_pktio_close(odp_pktio_t id)
> >  #endif
> >               default:
> >                       break;
> > -             res |= free_pktio_entry(id);
> > +                     res |= free_pktio_entry(id);
> >               }
> >       }
> >       unlock_entry(entry);
> > @@ -279,8 +299,17 @@ int odp_pktio_recv(odp_pktio_t id, odp_packet_t
> pkt_table[], unsigned len)
> >
> >       lock_entry(pktio_entry);
> >       switch (pktio_entry->s.params.type) {
> > -     case ODP_PKTIO_TYPE_SOCKET:
> > -             pkts = recv_pkt_sock(&pktio_entry->s.pkt_sock, pkt_table,
> len);
> > +     case ODP_PKTIO_TYPE_SOCKET_BASIC:
> > +             pkts = recv_pkt_sock_basic(&pktio_entry->s.pkt_sock,
> > +                             pkt_table, len);
> > +             break;
> > +     case ODP_PKTIO_TYPE_SOCKET_MMSG:
> > +             pkts = recv_pkt_sock_mmsg(&pktio_entry->s.pkt_sock,
> > +                             pkt_table, len);
> > +             break;
> > +     case ODP_PKTIO_TYPE_SOCKET_MMAP:
> > +             pkts = recv_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
> > +                             pkt_table, len);
> >               break;
> >  #ifdef ODP_HAVE_NETMAP
> >       case ODP_PKTIO_TYPE_NETMAP:
> > @@ -312,12 +341,22 @@ int odp_pktio_send(odp_pktio_t id, odp_packet_t
> pkt_table[], unsigned len)
> >
> >       lock_entry(pktio_entry);
> >       switch (pktio_entry->s.params.type) {
> > -     case ODP_PKTIO_TYPE_SOCKET:
> > -             pkts = send_pkt_sock(&pktio_entry->s.pkt_sock, pkt_table,
> len);
> > +     case ODP_PKTIO_TYPE_SOCKET_BASIC:
> > +             pkts = send_pkt_sock_basic(&pktio_entry->s.pkt_sock,
> > +                             pkt_table, len);
> > +             break;
> > +     case ODP_PKTIO_TYPE_SOCKET_MMSG:
> > +             pkts = send_pkt_sock_mmsg(&pktio_entry->s.pkt_sock,
> > +                             pkt_table, len);
> > +             break;
> > +     case ODP_PKTIO_TYPE_SOCKET_MMAP:
> > +             pkts = send_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
> > +                             pkt_table, len);
> >               break;
> >  #ifdef ODP_HAVE_NETMAP
> >       case ODP_PKTIO_TYPE_NETMAP:
> > -             pkts = send_pkt_netmap(&pktio_entry->s.pkt_nm, pkt_table,
> len);
> > +             pkts = send_pkt_netmap(&pktio_entry->s.pkt_nm,
> > +                             pkt_table, len);
> >               break;
> >  #endif
> >       default:
> > diff --git a/platform/linux-generic/source/odp_packet_socket.c
> b/platform/linux-generic/source/odp_packet_socket.c
> > index aaf2605..4e5803f 100644
> > --- a/platform/linux-generic/source/odp_packet_socket.c
> > +++ b/platform/linux-generic/source/odp_packet_socket.c
> > @@ -63,10 +63,9 @@ static inline int ethaddrs_equal(unsigned char
> mac_a[], unsigned char mac_b[])
> >       return !memcmp(mac_a, mac_b, ETH_ALEN);
> >  }
> >
> > -static int set_pkt_sock_fanout(pkt_sock_t * const pkt_sock, int
> sock_group_idx)
> > +static int set_pkt_sock_fanout_mmap(pkt_sock_mmap_t * const pkt_sock,
> > +             int sock_group_idx)
> >  {
> > -#if ODP_PACKET_SOCKET_FANOUT == 1
> > -     /* Use FANOUT-mode for socket */
> >       int sockfd = pkt_sock->sockfd;
> >       int val;
> >       int err;
> > @@ -80,16 +79,9 @@ static int set_pkt_sock_fanout(pkt_sock_t * const
> pkt_sock, int sock_group_idx)
> >               perror("set_pkt_sock_fanout() -
> setsockopt(PACKET_FANOUT)");
> >               return -1;
> >       }
> > -#else
> > -     (void)pkt_sock;
> > -     (void)sock_group_idx;
> > -#endif
> > -
> >       return 0;
> >  }
> >
> > -#if (ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_BASIC) || \
> > -     (ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMSG)
> >  /*
> >   * ODP_PACKET_SOCKET_BASIC:
> >   * ODP_PACKET_SOCKET_MMSG:
> > @@ -163,11 +155,6 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock,
> char *netdev,
> >               return -1;
> >       }
> >
> > -     /* configure PACKET_FANOUT mode for socket (if mode enabled) */
> > -     err = set_pkt_sock_fanout(pkt_sock, if_idx);
> > -     if (err != 0)
> > -             return -1;
> > -
> >       return sockfd;
> >  }
> >
> > @@ -184,13 +171,11 @@ int close_pkt_sock(pkt_sock_t * const pkt_sock)
> >
> >       return 0;
> >  }
> > -#endif
> >
> > -#if ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_BASIC
> >  /*
> >   * ODP_PACKET_SOCKET_BASIC:
> >   */
> > -int recv_pkt_sock(pkt_sock_t *const pkt_sock,
> > +int recv_pkt_sock_basic(pkt_sock_t *const pkt_sock,
> >                 odp_packet_t pkt_table[], unsigned len)
> >  {
> >       ssize_t recv_bytes;
> > @@ -240,7 +225,7 @@ int recv_pkt_sock(pkt_sock_t *const pkt_sock,
> >  /*
> >   * ODP_PACKET_SOCKET_BASIC:
> >   */
> > -int send_pkt_sock(pkt_sock_t * const pkt_sock,
> > +int send_pkt_sock_basic(pkt_sock_t * const pkt_sock,
> >                 odp_packet_t pkt_table[], unsigned len)
> >  {
> >       odp_packet_t pkt;
> > @@ -281,11 +266,10 @@ int send_pkt_sock(pkt_sock_t * const pkt_sock,
> >       return nb_tx;
> >  }
> >
> > -#elif ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMSG
> >  /*
> >   * ODP_PACKET_SOCKET_MMSG:
> >   */
> > -int recv_pkt_sock(pkt_sock_t * const pkt_sock,
> > +int recv_pkt_sock_mmsg(pkt_sock_t * const pkt_sock,
> >                 odp_packet_t pkt_table[], unsigned len)
> >  {
> >       const int sockfd = pkt_sock->sockfd;
> > @@ -348,7 +332,7 @@ int recv_pkt_sock(pkt_sock_t * const pkt_sock,
> >  /*
> >   * ODP_PACKET_SOCKET_MMSG:
> >   */
> > -int send_pkt_sock(pkt_sock_t * const pkt_sock,
> > +int send_pkt_sock_mmsg(pkt_sock_t * const pkt_sock,
> >                 odp_packet_t pkt_table[], unsigned len)
> >  {
> >       struct mmsghdr msgvec[ODP_PACKET_SOCKET_MAX_BURST_TX];
> > @@ -387,7 +371,6 @@ int send_pkt_sock(pkt_sock_t * const pkt_sock,
> >       return len;
> >  }
> >
> > -#elif ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMAP
> >  /*
> >   * ODP_PACKET_SOCKET_MMAP:
> >   */
> > @@ -402,7 +385,7 @@ union frame_map {
> >       void *raw;
> >  };
> >
> > -static int pkt_socket(void)
> > +static int mmap_pkt_socket(void)
> >  {
> >       int ver = TPACKET_V2;
> >
> > @@ -421,23 +404,23 @@ static int pkt_socket(void)
> >       return sock;
> >  }
> >
> > -static inline int rx_kernel_ready(struct tpacket2_hdr *hdr)
> > +static inline int mmap_rx_kernel_ready(struct tpacket2_hdr *hdr)
> >  {
> >       return ((hdr->tp_status & TP_STATUS_USER) == TP_STATUS_USER);
> >  }
> >
> > -static inline void rx_user_ready(struct tpacket2_hdr *hdr)
> > +static inline void mmap_rx_user_ready(struct tpacket2_hdr *hdr)
> >  {
> >       hdr->tp_status = TP_STATUS_KERNEL;
> >       __sync_synchronize();
> >  }
> >
> > -static inline int tx_kernel_ready(struct tpacket2_hdr *hdr)
> > +static inline int mmap_tx_kernel_ready(struct tpacket2_hdr *hdr)
> >  {
> >       return !(hdr->tp_status & (TP_STATUS_SEND_REQUEST |
> TP_STATUS_SENDING));
> >  }
> >
> > -static inline void tx_user_ready(struct tpacket2_hdr *hdr)
> > +static inline void mmap_tx_user_ready(struct tpacket2_hdr *hdr)
> >  {
> >       hdr->tp_status = TP_STATUS_SEND_REQUEST;
> >       __sync_synchronize();
> > @@ -462,7 +445,7 @@ static inline unsigned pkt_mmap_v2_rx(int sock,
> struct ring *ring,
> >       frame_num = ring->frame_num;
> >
> >       while (i < len) {
> > -             if (rx_kernel_ready(ring->rd[frame_num].iov_base)) {
> > +             if (mmap_rx_kernel_ready(ring->rd[frame_num].iov_base)) {
> >                       ppd.raw = ring->rd[frame_num].iov_base;
> >
> >                       next_frame_num = (frame_num + 1) % ring->rd_num;
> > @@ -474,7 +457,7 @@ static inline unsigned pkt_mmap_v2_rx(int sock,
> struct ring *ring,
> >                       eth_hdr = (struct ethhdr *)pkt_buf;
> >                       if (odp_unlikely(ethaddrs_equal(if_mac,
> >
> eth_hdr->h_source))) {
> > -                             rx_user_ready(ppd.raw); /* drop */
> > +                             mmap_rx_user_ready(ppd.raw); /* drop */
> >                               continue;
> >                       }
> >
> > @@ -486,7 +469,7 @@ static inline unsigned pkt_mmap_v2_rx(int sock,
> struct ring *ring,
> >                                + frame_offset;
> >                       memcpy(l2_hdr, pkt_buf, pkt_len);
> >
> > -                     rx_user_ready(ppd.raw);
> > +                     mmap_rx_user_ready(ppd.raw);
> >
> >                       /* Parse and set packet header data */
> >                       odp_packet_parse(pkt_table[i], pkt_len,
> frame_offset);
> > @@ -516,7 +499,7 @@ static inline unsigned pkt_mmap_v2_tx(int sock,
> struct ring *ring,
> >       frame_num = ring->frame_num;
> >
> >       while (i < len) {
> > -             if (tx_kernel_ready(ring->rd[frame_num].iov_base)) {
> > +             if (mmap_tx_kernel_ready(ring->rd[frame_num].iov_base)) {
> >                       ppd.raw = ring->rd[frame_num].iov_base;
> >
> >                       next_frame_num = (frame_num + 1) % ring->rd_num;
> > @@ -530,7 +513,7 @@ static inline unsigned pkt_mmap_v2_tx(int sock,
> struct ring *ring,
> >                       memcpy((uint8_t *)ppd.raw + TPACKET2_HDRLEN -
> >                              sizeof(struct sockaddr_ll), pkt_buf,
> pkt_len);
> >
> > -                     tx_user_ready(ppd.raw);
> > +                     mmap_tx_user_ready(ppd.raw);
> >
> >                       odp_packet_free(pkt_table[i]);
> >                       frame_num = next_frame_num;
> > @@ -553,7 +536,7 @@ static inline unsigned pkt_mmap_v2_tx(int sock,
> struct ring *ring,
> >       return i;
> >  }
> >
> > -static void fill_ring(struct ring *ring, unsigned blocks)
> > +static void mmap_fill_ring(struct ring *ring, unsigned blocks)
> >  {
> >       ring->req.tp_block_size = getpagesize() << 2;
> >       ring->req.tp_frame_size = TPACKET_ALIGNMENT << 7;
> > @@ -567,7 +550,7 @@ static void fill_ring(struct ring *ring, unsigned
> blocks)
> >       ring->flen = ring->req.tp_frame_size;
> >  }
> >
> > -static int set_packet_loss_discard(int sock)
> > +static int mmap_set_packet_loss_discard(int sock)
> >  {
> >       int ret, discard = 1;
> >
> > @@ -581,7 +564,7 @@ static int set_packet_loss_discard(int sock)
> >       return 0;
> >  }
> >
> > -static int setup_ring(int sock, struct ring *ring, int type)
> > +static int mmap_setup_ring(int sock, struct ring *ring, int type)
> >  {
> >       int ret = 0;
> >       unsigned blocks = 256;
> > @@ -591,12 +574,12 @@ static int setup_ring(int sock, struct ring *ring,
> int type)
> >       ring->version = TPACKET_V2;
> >
> >       if (type == PACKET_TX_RING) {
> > -             ret = set_packet_loss_discard(sock);
> > +             ret = mmap_set_packet_loss_discard(sock);
> >               if (ret != 0)
> >                       return -1;
> >       }
> >
> > -     fill_ring(ring, blocks);
> > +     mmap_fill_ring(ring, blocks);
> >
> >       ret = setsockopt(sock, SOL_PACKET, type, &ring->req,
> sizeof(ring->req));
> >       if (ret == -1) {
> > @@ -614,7 +597,7 @@ static int setup_ring(int sock, struct ring *ring,
> int type)
> >       return 0;
> >  }
> >
> > -static int mmap_sock(pkt_sock_t *pkt_sock)
> > +static int mmap_sock(pkt_sock_mmap_t *pkt_sock)
> >  {
> >       int i;
> >       int sock = pkt_sock->sockfd;
> > @@ -655,14 +638,14 @@ static int mmap_sock(pkt_sock_t *pkt_sock)
> >       return 0;
> >  }
> >
> > -static void unmap_sock(pkt_sock_t *pkt_sock)
> > +static void mmap_unmap_sock(pkt_sock_mmap_t *pkt_sock)
> >  {
> >       munmap(pkt_sock->mmap_base, pkt_sock->mmap_len);
> >       free(pkt_sock->rx_ring.rd);
> >       free(pkt_sock->tx_ring.rd);
> >  }
> >
> > -static int bind_sock(pkt_sock_t *pkt_sock, char *netdev)
> > +static int mmap_bind_sock(pkt_sock_mmap_t *pkt_sock, char *netdev)
> >  {
> >       int ret;
> >
> > @@ -684,7 +667,7 @@ static int bind_sock(pkt_sock_t *pkt_sock, char
> *netdev)
> >       return 0;
> >  }
> >
> > -static int store_hw_addr(pkt_sock_t * const pkt_sock, char *netdev)
> > +static int mmap_store_hw_addr(pkt_sock_mmap_t * const pkt_sock, char
> *netdev)
> >  {
> >       struct ifreq ethreq;
> >       int ret;
> > @@ -707,8 +690,8 @@ static int store_hw_addr(pkt_sock_t * const
> pkt_sock, char *netdev)
> >  /*
> >   * ODP_PACKET_SOCKET_MMAP:
> >   */
> > -int setup_pkt_sock(pkt_sock_t * const pkt_sock, char *netdev,
> > -                odp_buffer_pool_t pool)
> > +int setup_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock, char *netdev,
> > +                odp_buffer_pool_t pool, int fanout)
> >  {
> >       odp_packet_t pkt;
> >       uint8_t *pkt_buf;
> > @@ -733,17 +716,19 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock,
> char *netdev,
> >       odp_packet_free(pkt);
> >
> >       pkt_sock->pool = pool;
> > -     pkt_sock->sockfd = pkt_socket();
> > +     pkt_sock->sockfd = mmap_pkt_socket();
> >
> > -     ret = bind_sock(pkt_sock, netdev);
> > +     ret = mmap_bind_sock(pkt_sock, netdev);
> >       if (ret != 0)
> >               return -1;
> >
> > -     ret = setup_ring(pkt_sock->sockfd, &pkt_sock->tx_ring,
> PACKET_TX_RING);
> > +     ret = mmap_setup_ring(pkt_sock->sockfd, &pkt_sock->tx_ring,
> > +                     PACKET_TX_RING);
> >       if (ret != 0)
> >               return -1;
> >
> > -     ret = setup_ring(pkt_sock->sockfd, &pkt_sock->rx_ring,
> PACKET_RX_RING);
> > +     ret = mmap_setup_ring(pkt_sock->sockfd, &pkt_sock->rx_ring,
> > +                     PACKET_RX_RING);
> >       if (ret != 0)
> >               return -1;
> >
> > @@ -751,7 +736,7 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock, char
> *netdev,
> >       if (ret != 0)
> >               return -1;
> >
> > -     ret = store_hw_addr(pkt_sock, netdev);
> > +     ret = mmap_store_hw_addr(pkt_sock, netdev);
> >       if (ret != 0)
> >               return -1;
> >
> > @@ -761,9 +746,11 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock,
> char *netdev,
> >               return -1;
> >       }
> >
> > -     ret = set_pkt_sock_fanout(pkt_sock, if_idx);
> > -     if (ret != 0)
> > -             return -1;
> > +     if (fanout) {
> > +             ret = set_pkt_sock_fanout_mmap(pkt_sock, if_idx);
> > +             if (ret != 0)
> > +                     return -1;
> > +     }
> >
> >       return pkt_sock->sockfd;
> >  }
> > @@ -771,9 +758,9 @@ int setup_pkt_sock(pkt_sock_t * const pkt_sock, char
> *netdev,
> >  /*
> >   * ODP_PACKET_SOCKET_MMAP:
> >   */
> > -int close_pkt_sock(pkt_sock_t * const pkt_sock)
> > +int close_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock)
> >  {
> > -     unmap_sock(pkt_sock);
> > +     mmap_unmap_sock(pkt_sock);
> >       if (close(pkt_sock->sockfd) != 0) {
> >               perror("close_pkt_sock() - close(sockfd)");
> >               return -1;
> > @@ -785,7 +772,7 @@ int close_pkt_sock(pkt_sock_t * const pkt_sock)
> >  /*
> >   * ODP_PACKET_SOCKET_MMAP:
> >   */
> > -int recv_pkt_sock(pkt_sock_t * const pkt_sock,
> > +int recv_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
> >                 odp_packet_t pkt_table[], unsigned len)
> >  {
> >       return pkt_mmap_v2_rx(pkt_sock->rx_ring.sock, &pkt_sock->rx_ring,
> > @@ -796,13 +783,9 @@ int recv_pkt_sock(pkt_sock_t * const pkt_sock,
> >  /*
> >   * ODP_PACKET_SOCKET_MMAP:
> >   */
> > -int send_pkt_sock(pkt_sock_t * const pkt_sock,
> > +int send_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
> >                 odp_packet_t pkt_table[], unsigned len)
> >  {
> >       return pkt_mmap_v2_tx(pkt_sock->tx_ring.sock, &pkt_sock->tx_ring,
> >                             pkt_table, len);
> >  }
> > -
> > -#else
> > -#error "Unsupported ODP_PACKET_SOCKET_MODE!"
> > -#endif
> > diff --git a/test/packet/odp_example_pktio.c
> b/test/packet/odp_example_pktio.c
> > index 85bbdd7..2b1ce3d 100644
> > --- a/test/packet/odp_example_pktio.c
> > +++ b/test/packet/odp_example_pktio.c
> > @@ -42,6 +42,8 @@ typedef struct {
> >       int if_count;           /**< Number of interfaces to be used */
> >       char **if_names;        /**< Array of pointers to interface names
> */
> >       int mode;               /**< Packet IO mode */
> > +     int type;               /**< Packet IO type */
> > +     int fanout;             /**< Packet IO fanout */
> >       odp_buffer_pool_t pool; /**< Buffer pool for packet IO */
> >  } appl_args_t;
> >
> > @@ -52,6 +54,8 @@ typedef struct {
> >       char *pktio_dev;        /**< Interface name to use */
> >       odp_buffer_pool_t pool; /**< Buffer pool for packet IO */
> >       int mode;               /**< Thread mode */
> > +     int type;               /**< Thread i/o type */
> > +     int fanout;             /**< Thread i/o fanout */
> >  } thread_args_t;
> >
> >  /**
> > @@ -111,7 +115,8 @@ static void *pktio_queue_thread(void *arg)
> >       }
> >
> >       /* Open a packet IO instance for this thread */
> > -     sock_params->type = ODP_PKTIO_TYPE_SOCKET;
> > +     sock_params->type = thr_args->type;
> > +     sock_params->fanout = thr_args->fanout;
> >       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool,
> &params);
> >       if (pktio == ODP_PKTIO_INVALID) {
> >               ODP_ERR("  [%02i] Error: pktio create failed\n", thr);
> > @@ -223,7 +228,8 @@ static void *pktio_ifburst_thread(void *arg)
> >       }
> >
> >       /* Open a packet IO instance for this thread */
> > -     sock_params->type = ODP_PKTIO_TYPE_SOCKET;
> > +     sock_params->type = thr_args->type;
> > +     sock_params->fanout = thr_args->fanout;
> >       pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool,
> &params);
> >       if (pktio == ODP_PKTIO_INVALID) {
> >               ODP_ERR("  [%02i] Error: pktio create failed.\n", thr);
> > @@ -357,6 +363,8 @@ int main(int argc, char *argv[])
> >               args->thread[i].pktio_dev = args->appl.if_names[if_idx];
> >               args->thread[i].pool = pool;
> >               args->thread[i].mode = args->appl.mode;
> > +             args->thread[i].type = args->appl.type;
> > +             args->thread[i].fanout = args->appl.fanout;
> >
> >               if (args->appl.mode == APPL_MODE_PKT_BURST)
> >                       thr_run_func = pktio_ifburst_thread;
> > @@ -470,9 +478,11 @@ static void parse_args(int argc, char *argv[],
> appl_args_t *appl_args)
> >       };
> >
> >       appl_args->mode = -1; /* Invalid, must be changed by parsing */
> > +     appl_args->type = 3;  /* 3: ODP_PKTIO_TYPE_SOCKET_MMAP */
> > +     appl_args->fanout = 1; /* turn of fanout by default for mmap */
> >
> >       while (1) {
> > -             opt = getopt_long(argc, argv, "+c:i:m:h",
> > +             opt = getopt_long(argc, argv, "+c:i:m:t:f:h",
> >                                 longopts, &long_index);
> >
> >               if (opt == -1)
> > @@ -533,6 +543,14 @@ static void parse_args(int argc, char *argv[],
> appl_args_t *appl_args)
> >                               appl_args->mode = APPL_MODE_PKT_QUEUE;
> >                       break;
> >
> > +             case 't':
> > +                     appl_args->type = atoi(optarg);
> > +                     break;
> > +
> > +             case 'f':
> > +                     appl_args->type = atoi(optarg);
> > +                     break;
> > +
> >               case 'h':
> >                       usage(argv[0]);
> >                       exit(EXIT_SUCCESS);
> > @@ -602,6 +620,12 @@ static void usage(char *progname)
> >              "  -i, --interface Eth interfaces (comma-separated, no
> spaces)\n"
> >              "  -m, --mode      0: Burst send&receive packets (no
> queues)\n"
> >              "                  1: Send&receive packets through ODP
> queues.\n"
> > +            " -t, --type   1: ODP_PKTIO_TYPE_SOCKET_BASIC\n"
> > +            "              2: ODP_PKTIO_TYPE_SOCKET_MMSG\n"
> > +            "              3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
> > +            "              4: ODP_PKTIO_TYPE_NETMAP\n"
> > +            "         Default: 3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
> > +            " -f, --fanout 0: off 1: on (Default 1: on)\n"
> >              "\n"
> >              "Optional OPTIONS\n"
> >              "  -c, --count <number> Core count.\n"
> > --
> > 1.8.5.1.163.gd7aced9
>
> Dosn't build!
>
> $ make
> make -C /home/anders/src/odp/platform/linux-generic libs
> make[1]: Entering directory
> `/home/anders/src/odp/platform/linux-generic'
> Compiling source/odp_packet_io.c
> cc -c -MD -I../../include -I./include -I./include/api -fPIC
> -DODP_DEBUG=1 -O3 -pthread -W -Wall -Werror -Wstrict-prototypes
> -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition
> -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual
> -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings  -o
> obj/odp_packet_io.o source/odp_packet_io.c
> source/odp_packet_io.c: In function 'init_pktio_entry':
> source/odp_packet_io.c:119:2: error: enumeration value
> 'ODP_PKTIO_TYPE_NETMAP' not handled in switch [-Werror=switch]
>   switch (params->type) {
>     ^
>     source/odp_packet_io.c: In function 'odp_pktio_open':
>     source/odp_packet_io.c:208:2: error: enumeration value
>     'ODP_PKTIO_TYPE_NETMAP' not handled in switch [-Werror=switch]
>       switch (params->type) {
>         ^
>         cc1: all warnings being treated as errors
>         make[1]: *** [obj/odp_packet_io.o] Error 1
>         make[1]: Leaving directory
>         `/home/anders/src/odp/platform/linux-generic'
>         make: *** [lib] Error 2
>
>
> need to do something like this:
>  $ git df
> diff --git a/platform/linux-generic/source/odp_packet_io.c
> b/platform/linux-generic/
> index e33cf35..71da4d2 100644
> --- a/platform/linux-generic/source/odp_packet_io.c
> +++ b/platform/linux-generic/source/odp_packet_io.c
> @@ -124,11 +124,11 @@ static void init_pktio_entry(pktio_entry_t *entry,
> odp_pktio_p
>                 memset(&entry->s.pkt_sock_mmap, 0,
>                       sizeof(entry->s.pkt_sock_mmap));
>                 break;
> -#ifdef ODP_HAVE_NETMAP
>         case ODP_PKTIO_TYPE_NETMAP:
> +#ifdef ODP_HAVE_NETMAP
>                 memset(&entry->s.pkt_nm, 0, sizeof(entry->s.pkt_nm));
> -               break;
>  #endif
> +               break;
>         }
>         /* Save pktio parameters, type is the most useful */
>         memcpy(&entry->s.params, params, sizeof(*params));
> @@ -224,8 +224,8 @@ odp_pktio_t odp_pktio_open(char *dev,
> odp_buffer_pool_t pool,
>                         id = ODP_PKTIO_INVALID;
>                 }
>                 break;
> -#ifdef ODP_HAVE_NETMAP
>         case ODP_PKTIO_TYPE_NETMAP:
> +#ifdef ODP_HAVE_NETMAP
>                 res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
>                                 pool, &params->nm_params);
>                 if (res == -1) {
> @@ -233,8 +233,8 @@ odp_pktio_t odp_pktio_open(char *dev,
> odp_buffer_pool_t pool,
>                         free_pktio_entry(id);
>                         id = ODP_PKTIO_INVALID;
>                 }
> -               break;
>  #endif
> +               break;
>         }
>
>         unlock_entry(pktio_entry);
>
>
> Cheers,
> Anders
>
> --
> You received this message because you are subscribed to the Google Groups
> "LNG ODP Sub-team - lng-odp@linaro.org" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to lng-odp+unsubscribe@linaro.org.
> To post to this group, send email to lng-odp@linaro.org.
> Visit this group at http://groups.google.com/a/linaro.org/group/lng-odp/.
> To view this discussion on the web visit
> https://groups.google.com/a/linaro.org/d/msgid/lng-odp/20140328153845.GA26897%408470w
> .
> For more options, visit https://groups.google.com/a/linaro.org/d/optout.
>
Maxim Uvarov March 29, 2014, 5:26 p.m. UTC | #2
On 03/29/2014 01:15 AM, Ola Liljedahl wrote:
> What's the benefit of using recvmmsg()/sendmmsg() compared to using 
> recv()/send()? Is it actually a different mechanism or just different 
> system calls?
>

man recvmmsg

NAME
recvmmsg - receive multiple messages on a socket

SYNOPSIS
#define _GNU_SOURCE
#include <sys/socket.h>

int recvmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
unsigned int flags, struct timespec *timeout);

DESCRIPTION
The recvmmsg() system call is an extension of recvmsg(2) that allows
the caller to receive multiple messages from a socket using a single
system call. (This has performance benefits for some applications.) A
further extension over recvmsg(2) is support for a timeout on the
receive operation.


Maxim.
>
>
>
> On 28 March 2014 16:38, Anders Roxell <anders.roxell@linaro.org 
> <mailto:anders.roxell@linaro.org>> wrote:
>
>     On 2014-03-28 19:08, Maxim Uvarov wrote:
>     > Dynamically select type of packet I/O
>     > sock_params->type =
>     > ODP_PKTIO_TYPE_SOCKET_BASIC
>     > ODP_PKTIO_TYPE_SOCKET_MMSG
>     > ODP_PKTIO_TYPE_SOCKET_MMAP
>     > ODP_PKTIO_TYPE_NETMAP
>     > sock_params->fanout = 1;
>     > pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool,
>     &params);
>     >
>     > v2:
>     > - remove NETMAP define in enum;
>     > - add command line parameters to odp_example_pktio for I/O
>     selection.
>     >
>     > Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org
>     <mailto:maxim.uvarov@linaro.org>>
>     > ---
>     > .../linux-generic/include/api/odp_pktio_socket.h | 1 +
>     > .../linux-generic/include/api/odp_pktio_types.h | 8 +-
>     > .../linux-generic/include/odp_packet_io_internal.h | 1 +
>     > platform/linux-generic/include/odp_packet_socket.h | 55 ++++-------
>     > platform/linux-generic/source/odp_packet_io.c | 61 +++++++++---
>     > platform/linux-generic/source/odp_packet_socket.c | 103
>     +++++++++------------
>     > test/packet/odp_example_pktio.c | 30 +++++-
>     > 7 files changed, 146 insertions(+), 113 deletions(-)
>     >
>     > diff --git
>     a/platform/linux-generic/include/api/odp_pktio_socket.h
>     b/platform/linux-generic/include/api/odp_pktio_socket.h
>     > index e0211bf..deeeeed 100644
>     > --- a/platform/linux-generic/include/api/odp_pktio_socket.h
>     > +++ b/platform/linux-generic/include/api/odp_pktio_socket.h
>     > @@ -15,6 +15,7 @@ extern "C" {
>     >
>     > typedef struct {
>     > odp_pktio_type_t type;
>     > + int fanout;
>     > } socket_params_t;
>     >
>     > #ifdef __cplusplus
>     > diff --git
>     a/platform/linux-generic/include/api/odp_pktio_types.h
>     b/platform/linux-generic/include/api/odp_pktio_types.h
>     > index e6b4cbf..8d195a5 100644
>     > --- a/platform/linux-generic/include/api/odp_pktio_types.h
>     > +++ b/platform/linux-generic/include/api/odp_pktio_types.h
>     > @@ -17,10 +17,10 @@ extern "C" {
>     > */
>     >
>     > typedef enum {
>     > - ODP_PKTIO_TYPE_SOCKET = 0x01,
>     > -#ifdef ODP_HAVE_NETMAP
>     > - ODP_PKTIO_TYPE_NETMAP = 0x02,
>     > -#endif
>     > + ODP_PKTIO_TYPE_SOCKET_BASIC = 0x1,
>     > + ODP_PKTIO_TYPE_SOCKET_MMSG,
>     > + ODP_PKTIO_TYPE_SOCKET_MMAP,
>     > + ODP_PKTIO_TYPE_NETMAP,
>     > } odp_pktio_type_t;
>     >
>     > #include <odp_pktio_socket.h>
>     > diff --git
>     a/platform/linux-generic/include/odp_packet_io_internal.h
>     b/platform/linux-generic/include/odp_packet_io_internal.h
>     > index ba1ee9b..3ab7fa0 100644
>     > --- a/platform/linux-generic/include/odp_packet_io_internal.h
>     > +++ b/platform/linux-generic/include/odp_packet_io_internal.h
>     > @@ -31,6 +31,7 @@ struct pktio_entry {
>     > odp_queue_t outq_default; /**< default out queue */
>     > odp_pktio_params_t params; /**< pktio parameters */
>     > pkt_sock_t pkt_sock; /**< using socket API for IO */
>     > + pkt_sock_mmap_t pkt_sock_mmap; /**< using socket mmap API for
>     IO */
>     > #ifdef ODP_HAVE_NETMAP
>     > pkt_netmap_t pkt_nm; /**< using netmap API for IO */
>     > #endif
>     > diff --git a/platform/linux-generic/include/odp_packet_socket.h
>     b/platform/linux-generic/include/odp_packet_socket.h
>     > index fe216bb..086de05 100644
>     > --- a/platform/linux-generic/include/odp_packet_socket.h
>     > +++ b/platform/linux-generic/include/odp_packet_socket.h
>     > @@ -20,37 +20,15 @@
>     >
>     > #include <linux/version.h>
>     >
>     > -
>     > /*
>     > * Packet socket config:
>     > */
>     > -#define ODP_PACKET_SOCKET_BASIC 0 /** use recv()/send() */
>     > -#define ODP_PACKET_SOCKET_MMSG 1 /** use recvmmsg()/sendmmsg() */
>     > -#define ODP_PACKET_SOCKET_MMAP 2 /** use PACKET_MMAP */
>     > -
>     > -
>     > -#if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 1, 0)
>     > -/* PACKET_FANOUT feature not supported */
>     > -#define ODP_PACKET_SOCKET_FANOUT 0
>     > -#define ODP_PACKET_SOCKET_MODE (ODP_PACKET_SOCKET_BASIC)
>     > -#else
>     > -/** PACKET_FANOUT mode spreads incoming packets over multiple
>     sockets*/
>     > -#define ODP_PACKET_SOCKET_FANOUT 1 /* 0=Off, 1=On */
>     > -/** Choose one from the alternatives above */
>     > -#define ODP_PACKET_SOCKET_MODE (ODP_PACKET_SOCKET_MMAP)
>     > -#endif
>     > -
>     >
>     > /** Max receive (Rx) burst size*/
>     > #define ODP_PACKET_SOCKET_MAX_BURST_RX 32
>     > /** Max transmit (Tx) burst size*/
>     > #define ODP_PACKET_SOCKET_MAX_BURST_TX 32
>     >
>     > -
>     > -
>     > -#if (ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_BASIC) || \
>     > - (ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMSG)
>     > -
>     > typedef struct {
>     > int sockfd; /**< socket descriptor */
>     > odp_buffer_pool_t pool; /**< buffer pool to alloc packets from */
>     > @@ -60,12 +38,6 @@ typedef struct {
>     > unsigned char if_mac[ETH_ALEN]; /**< IF eth mac addr */
>     > } pkt_sock_t;
>     >
>     > -#elif ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMAP
>     > -
>     > -#if ODP_PACKET_SOCKET_FANOUT == 0
>     > -#error "ODP_PACKET_SOCKET_MMAP requires ODP_PACKET_SOCKET_FANOUT=1"
>     > -#endif
>     > -
>     > /** packet mmap ring */
>     > struct ring {
>     > struct iovec *rd;
>     > @@ -99,31 +71,44 @@ typedef struct {
>     > unsigned mmap_len;
>     > unsigned char if_mac[ETH_ALEN];
>     > struct sockaddr_ll ll;
>     > -} pkt_sock_t;
>     > -
>     > -#else
>     > -#error "Unsupported ODP_PACKET_SOCKET_MODE!"
>     > -#endif
>     > +} pkt_sock_mmap_t;
>     >
>     > /**
>     > * Open & configure a raw packet socket
>     > */
>     > int setup_pkt_sock(pkt_sock_t * const pkt_sock, char *netdev,
>     > odp_buffer_pool_t pool);
>     > +
>     > +int setup_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock, char
>     *netdev,
>     > + odp_buffer_pool_t pool, int fanout);
>     > +
>     > /**
>     > * Close a packet socket
>     > */
>     > int close_pkt_sock(pkt_sock_t * const pkt_sock);
>     >
>     > +int close_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock);
>     > +
>     > /**
>     > * Receive packets from the packet socket
>     > */
>     > -int recv_pkt_sock(pkt_sock_t * const pkt_sock, odp_packet_t
>     pkt_table[],
>     > +int recv_pkt_sock_basic(pkt_sock_t * const pkt_sock,
>     odp_packet_t pkt_table[],
>     > unsigned len);
>     > +
>     > +int recv_pkt_sock_mmsg(pkt_sock_t * const pkt_sock,
>     odp_packet_t pkt_table[],
>     > + unsigned len);
>     > +
>     > +int recv_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
>     > + odp_packet_t pkt_table[], unsigned len);
>     > /**
>     > * Send packets through the packet socket
>     > */
>     > -int send_pkt_sock(pkt_sock_t * const pkt_sock, odp_packet_t
>     pkt_table[],
>     > +int send_pkt_sock_basic(pkt_sock_t * const pkt_sock,
>     odp_packet_t pkt_table[],
>     > + unsigned len);
>     > +
>     > +int send_pkt_sock_mmsg(pkt_sock_t * const pkt_sock,
>     odp_packet_t pkt_table[],
>     > unsigned len);
>     >
>     > +int send_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
>     > + odp_packet_t pkt_table[], unsigned len);
>     > #endif
>     > diff --git a/platform/linux-generic/source/odp_packet_io.c
>     b/platform/linux-generic/source/odp_packet_io.c
>     > index 92aed34..e33cf35 100644
>     > --- a/platform/linux-generic/source/odp_packet_io.c
>     > +++ b/platform/linux-generic/source/odp_packet_io.c
>     > @@ -117,8 +117,12 @@ static void init_pktio_entry(pktio_entry_t
>     *entry, odp_pktio_params_t *params)
>     > set_taken(entry);
>     > entry->s.inq_default = ODP_QUEUE_INVALID;
>     > switch (params->type) {
>     > - case ODP_PKTIO_TYPE_SOCKET:
>     > + case ODP_PKTIO_TYPE_SOCKET_BASIC:
>     > + case ODP_PKTIO_TYPE_SOCKET_MMSG:
>     > + case ODP_PKTIO_TYPE_SOCKET_MMAP:
>     > memset(&entry->s.pkt_sock, 0, sizeof(entry->s.pkt_sock));
>     > + memset(&entry->s.pkt_sock_mmap, 0,
>     > + sizeof(entry->s.pkt_sock_mmap));
>     > break;
>     > #ifdef ODP_HAVE_NETMAP
>     > case ODP_PKTIO_TYPE_NETMAP:
>     > @@ -177,7 +181,9 @@ odp_pktio_t odp_pktio_open(char *dev,
>     odp_buffer_pool_t pool,
>     > }
>     >
>     > switch (params->type) {
>     > - case ODP_PKTIO_TYPE_SOCKET:
>     > + case ODP_PKTIO_TYPE_SOCKET_BASIC:
>     > + case ODP_PKTIO_TYPE_SOCKET_MMSG:
>     > + case ODP_PKTIO_TYPE_SOCKET_MMAP:
>     > ODP_DBG("Allocating socket pktio\n");
>     > break;
>     > #ifdef ODP_HAVE_NETMAP
>     > @@ -200,7 +206,8 @@ odp_pktio_t odp_pktio_open(char *dev,
>     odp_buffer_pool_t pool,
>     > pktio_entry = get_entry(id);
>     >
>     > switch (params->type) {
>     > - case ODP_PKTIO_TYPE_SOCKET:
>     > + case ODP_PKTIO_TYPE_SOCKET_BASIC:
>     > + case ODP_PKTIO_TYPE_SOCKET_MMSG:
>     > res = setup_pkt_sock(&pktio_entry->s.pkt_sock, dev, pool);
>     > if (res == -1) {
>     > close_pkt_sock(&pktio_entry->s.pkt_sock);
>     > @@ -208,10 +215,19 @@ odp_pktio_t odp_pktio_open(char *dev,
>     odp_buffer_pool_t pool,
>     > id = ODP_PKTIO_INVALID;
>     > }
>     > break;
>     > + case ODP_PKTIO_TYPE_SOCKET_MMAP:
>     > + res = setup_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap, dev,
>     > + pool, params->sock_params.fanout);
>     > + if (res == -1) {
>     > + close_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap);
>     > + free_pktio_entry(id);
>     > + id = ODP_PKTIO_INVALID;
>     > + }
>     > + break;
>     > #ifdef ODP_HAVE_NETMAP
>     > case ODP_PKTIO_TYPE_NETMAP:
>     > res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
>     > - pool, &params->nm_params);
>     > + pool, &params->nm_params);
>     > if (res == -1) {
>     > close_pkt_netmap(&pktio_entry->s.pkt_nm);
>     > free_pktio_entry(id);
>     > @@ -237,9 +253,13 @@ int odp_pktio_close(odp_pktio_t id)
>     > lock_entry(entry);
>     > if (!is_free(entry)) {
>     > switch (entry->s.params.type) {
>     > - case ODP_PKTIO_TYPE_SOCKET:
>     > + case ODP_PKTIO_TYPE_SOCKET_BASIC:
>     > + case ODP_PKTIO_TYPE_SOCKET_MMSG:
>     > res = close_pkt_sock(&entry->s.pkt_sock);
>     > break;
>     > + case ODP_PKTIO_TYPE_SOCKET_MMAP:
>     > + res = close_pkt_sock_mmap(&entry->s.pkt_sock_mmap);
>     > + break;
>     > #ifdef ODP_HAVE_NETMAP
>     > case ODP_PKTIO_TYPE_NETMAP:
>     > res = close_pkt_netmap(&entry->s.pkt_nm);
>     > @@ -247,7 +267,7 @@ int odp_pktio_close(odp_pktio_t id)
>     > #endif
>     > default:
>     > break;
>     > - res |= free_pktio_entry(id);
>     > + res |= free_pktio_entry(id);
>     > }
>     > }
>     > unlock_entry(entry);
>     > @@ -279,8 +299,17 @@ int odp_pktio_recv(odp_pktio_t id,
>     odp_packet_t pkt_table[], unsigned len)
>     >
>     > lock_entry(pktio_entry);
>     > switch (pktio_entry->s.params.type) {
>     > - case ODP_PKTIO_TYPE_SOCKET:
>     > - pkts = recv_pkt_sock(&pktio_entry->s.pkt_sock, pkt_table, len);
>     > + case ODP_PKTIO_TYPE_SOCKET_BASIC:
>     > + pkts = recv_pkt_sock_basic(&pktio_entry->s.pkt_sock,
>     > + pkt_table, len);
>     > + break;
>     > + case ODP_PKTIO_TYPE_SOCKET_MMSG:
>     > + pkts = recv_pkt_sock_mmsg(&pktio_entry->s.pkt_sock,
>     > + pkt_table, len);
>     > + break;
>     > + case ODP_PKTIO_TYPE_SOCKET_MMAP:
>     > + pkts = recv_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
>     > + pkt_table, len);
>     > break;
>     > #ifdef ODP_HAVE_NETMAP
>     > case ODP_PKTIO_TYPE_NETMAP:
>     > @@ -312,12 +341,22 @@ int odp_pktio_send(odp_pktio_t id,
>     odp_packet_t pkt_table[], unsigned len)
>     >
>     > lock_entry(pktio_entry);
>     > switch (pktio_entry->s.params.type) {
>     > - case ODP_PKTIO_TYPE_SOCKET:
>     > - pkts = send_pkt_sock(&pktio_entry->s.pkt_sock, pkt_table, len);
>     > + case ODP_PKTIO_TYPE_SOCKET_BASIC:
>     > + pkts = send_pkt_sock_basic(&pktio_entry->s.pkt_sock,
>     > + pkt_table, len);
>     > + break;
>     > + case ODP_PKTIO_TYPE_SOCKET_MMSG:
>     > + pkts = send_pkt_sock_mmsg(&pktio_entry->s.pkt_sock,
>     > + pkt_table, len);
>     > + break;
>     > + case ODP_PKTIO_TYPE_SOCKET_MMAP:
>     > + pkts = send_pkt_sock_mmap(&pktio_entry->s.pkt_sock_mmap,
>     > + pkt_table, len);
>     > break;
>     > #ifdef ODP_HAVE_NETMAP
>     > case ODP_PKTIO_TYPE_NETMAP:
>     > - pkts = send_pkt_netmap(&pktio_entry->s.pkt_nm, pkt_table, len);
>     > + pkts = send_pkt_netmap(&pktio_entry->s.pkt_nm,
>     > + pkt_table, len);
>     > break;
>     > #endif
>     > default:
>     > diff --git a/platform/linux-generic/source/odp_packet_socket.c
>     b/platform/linux-generic/source/odp_packet_socket.c
>     > index aaf2605..4e5803f 100644
>     > --- a/platform/linux-generic/source/odp_packet_socket.c
>     > +++ b/platform/linux-generic/source/odp_packet_socket.c
>     > @@ -63,10 +63,9 @@ static inline int ethaddrs_equal(unsigned
>     char mac_a[], unsigned char mac_b[])
>     > return !memcmp(mac_a, mac_b, ETH_ALEN);
>     > }
>     >
>     > -static int set_pkt_sock_fanout(pkt_sock_t * const pkt_sock, int
>     sock_group_idx)
>     > +static int set_pkt_sock_fanout_mmap(pkt_sock_mmap_t * const
>     pkt_sock,
>     > + int sock_group_idx)
>     > {
>     > -#if ODP_PACKET_SOCKET_FANOUT == 1
>     > - /* Use FANOUT-mode for socket */
>     > int sockfd = pkt_sock->sockfd;
>     > int val;
>     > int err;
>     > @@ -80,16 +79,9 @@ static int set_pkt_sock_fanout(pkt_sock_t *
>     const pkt_sock, int sock_group_idx)
>     > perror("set_pkt_sock_fanout() - setsockopt(PACKET_FANOUT)");
>     > return -1;
>     > }
>     > -#else
>     > - (void)pkt_sock;
>     > - (void)sock_group_idx;
>     > -#endif
>     > -
>     > return 0;
>     > }
>     >
>     > -#if (ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_BASIC) || \
>     > - (ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMSG)
>     > /*
>     > * ODP_PACKET_SOCKET_BASIC:
>     > * ODP_PACKET_SOCKET_MMSG:
>     > @@ -163,11 +155,6 @@ int setup_pkt_sock(pkt_sock_t * const
>     pkt_sock, char *netdev,
>     > return -1;
>     > }
>     >
>     > - /* configure PACKET_FANOUT mode for socket (if mode enabled) */
>     > - err = set_pkt_sock_fanout(pkt_sock, if_idx);
>     > - if (err != 0)
>     > - return -1;
>     > -
>     > return sockfd;
>     > }
>     >
>     > @@ -184,13 +171,11 @@ int close_pkt_sock(pkt_sock_t * const
>     pkt_sock)
>     >
>     > return 0;
>     > }
>     > -#endif
>     >
>     > -#if ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_BASIC
>     > /*
>     > * ODP_PACKET_SOCKET_BASIC:
>     > */
>     > -int recv_pkt_sock(pkt_sock_t *const pkt_sock,
>     > +int recv_pkt_sock_basic(pkt_sock_t *const pkt_sock,
>     > odp_packet_t pkt_table[], unsigned len)
>     > {
>     > ssize_t recv_bytes;
>     > @@ -240,7 +225,7 @@ int recv_pkt_sock(pkt_sock_t *const pkt_sock,
>     > /*
>     > * ODP_PACKET_SOCKET_BASIC:
>     > */
>     > -int send_pkt_sock(pkt_sock_t * const pkt_sock,
>     > +int send_pkt_sock_basic(pkt_sock_t * const pkt_sock,
>     > odp_packet_t pkt_table[], unsigned len)
>     > {
>     > odp_packet_t pkt;
>     > @@ -281,11 +266,10 @@ int send_pkt_sock(pkt_sock_t * const pkt_sock,
>     > return nb_tx;
>     > }
>     >
>     > -#elif ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMSG
>     > /*
>     > * ODP_PACKET_SOCKET_MMSG:
>     > */
>     > -int recv_pkt_sock(pkt_sock_t * const pkt_sock,
>     > +int recv_pkt_sock_mmsg(pkt_sock_t * const pkt_sock,
>     > odp_packet_t pkt_table[], unsigned len)
>     > {
>     > const int sockfd = pkt_sock->sockfd;
>     > @@ -348,7 +332,7 @@ int recv_pkt_sock(pkt_sock_t * const pkt_sock,
>     > /*
>     > * ODP_PACKET_SOCKET_MMSG:
>     > */
>     > -int send_pkt_sock(pkt_sock_t * const pkt_sock,
>     > +int send_pkt_sock_mmsg(pkt_sock_t * const pkt_sock,
>     > odp_packet_t pkt_table[], unsigned len)
>     > {
>     > struct mmsghdr msgvec[ODP_PACKET_SOCKET_MAX_BURST_TX];
>     > @@ -387,7 +371,6 @@ int send_pkt_sock(pkt_sock_t * const pkt_sock,
>     > return len;
>     > }
>     >
>     > -#elif ODP_PACKET_SOCKET_MODE == ODP_PACKET_SOCKET_MMAP
>     > /*
>     > * ODP_PACKET_SOCKET_MMAP:
>     > */
>     > @@ -402,7 +385,7 @@ union frame_map {
>     > void *raw;
>     > };
>     >
>     > -static int pkt_socket(void)
>     > +static int mmap_pkt_socket(void)
>     > {
>     > int ver = TPACKET_V2;
>     >
>     > @@ -421,23 +404,23 @@ static int pkt_socket(void)
>     > return sock;
>     > }
>     >
>     > -static inline int rx_kernel_ready(struct tpacket2_hdr *hdr)
>     > +static inline int mmap_rx_kernel_ready(struct tpacket2_hdr *hdr)
>     > {
>     > return ((hdr->tp_status & TP_STATUS_USER) == TP_STATUS_USER);
>     > }
>     >
>     > -static inline void rx_user_ready(struct tpacket2_hdr *hdr)
>     > +static inline void mmap_rx_user_ready(struct tpacket2_hdr *hdr)
>     > {
>     > hdr->tp_status = TP_STATUS_KERNEL;
>     > __sync_synchronize();
>     > }
>     >
>     > -static inline int tx_kernel_ready(struct tpacket2_hdr *hdr)
>     > +static inline int mmap_tx_kernel_ready(struct tpacket2_hdr *hdr)
>     > {
>     > return !(hdr->tp_status & (TP_STATUS_SEND_REQUEST |
>     TP_STATUS_SENDING));
>     > }
>     >
>     > -static inline void tx_user_ready(struct tpacket2_hdr *hdr)
>     > +static inline void mmap_tx_user_ready(struct tpacket2_hdr *hdr)
>     > {
>     > hdr->tp_status = TP_STATUS_SEND_REQUEST;
>     > __sync_synchronize();
>     > @@ -462,7 +445,7 @@ static inline unsigned pkt_mmap_v2_rx(int
>     sock, struct ring *ring,
>     > frame_num = ring->frame_num;
>     >
>     > while (i < len) {
>     > - if (rx_kernel_ready(ring->rd[frame_num].iov_base)) {
>     > + if (mmap_rx_kernel_ready(ring->rd[frame_num].iov_base)) {
>     > ppd.raw = ring->rd[frame_num].iov_base;
>     >
>     > next_frame_num = (frame_num + 1) % ring->rd_num;
>     > @@ -474,7 +457,7 @@ static inline unsigned pkt_mmap_v2_rx(int
>     sock, struct ring *ring,
>     > eth_hdr = (struct ethhdr *)pkt_buf;
>     > if (odp_unlikely(ethaddrs_equal(if_mac,
>     > eth_hdr->h_source))) {
>     > - rx_user_ready(ppd.raw); /* drop */
>     > + mmap_rx_user_ready(ppd.raw); /* drop */
>     > continue;
>     > }
>     >
>     > @@ -486,7 +469,7 @@ static inline unsigned pkt_mmap_v2_rx(int
>     sock, struct ring *ring,
>     > + frame_offset;
>     > memcpy(l2_hdr, pkt_buf, pkt_len);
>     >
>     > - rx_user_ready(ppd.raw);
>     > + mmap_rx_user_ready(ppd.raw);
>     >
>     > /* Parse and set packet header data */
>     > odp_packet_parse(pkt_table[i], pkt_len, frame_offset);
>     > @@ -516,7 +499,7 @@ static inline unsigned pkt_mmap_v2_tx(int
>     sock, struct ring *ring,
>     > frame_num = ring->frame_num;
>     >
>     > while (i < len) {
>     > - if (tx_kernel_ready(ring->rd[frame_num].iov_base)) {
>     > + if (mmap_tx_kernel_ready(ring->rd[frame_num].iov_base)) {
>     > ppd.raw = ring->rd[frame_num].iov_base;
>     >
>     > next_frame_num = (frame_num + 1) % ring->rd_num;
>     > @@ -530,7 +513,7 @@ static inline unsigned pkt_mmap_v2_tx(int
>     sock, struct ring *ring,
>     > memcpy((uint8_t *)ppd.raw + TPACKET2_HDRLEN -
>     > sizeof(struct sockaddr_ll), pkt_buf, pkt_len);
>     >
>     > - tx_user_ready(ppd.raw);
>     > + mmap_tx_user_ready(ppd.raw);
>     >
>     > odp_packet_free(pkt_table[i]);
>     > frame_num = next_frame_num;
>     > @@ -553,7 +536,7 @@ static inline unsigned pkt_mmap_v2_tx(int
>     sock, struct ring *ring,
>     > return i;
>     > }
>     >
>     > -static void fill_ring(struct ring *ring, unsigned blocks)
>     > +static void mmap_fill_ring(struct ring *ring, unsigned blocks)
>     > {
>     > ring->req.tp_block_size = getpagesize() << 2;
>     > ring->req.tp_frame_size = TPACKET_ALIGNMENT << 7;
>     > @@ -567,7 +550,7 @@ static void fill_ring(struct ring *ring,
>     unsigned blocks)
>     > ring->flen = ring->req.tp_frame_size;
>     > }
>     >
>     > -static int set_packet_loss_discard(int sock)
>     > +static int mmap_set_packet_loss_discard(int sock)
>     > {
>     > int ret, discard = 1;
>     >
>     > @@ -581,7 +564,7 @@ static int set_packet_loss_discard(int sock)
>     > return 0;
>     > }
>     >
>     > -static int setup_ring(int sock, struct ring *ring, int type)
>     > +static int mmap_setup_ring(int sock, struct ring *ring, int type)
>     > {
>     > int ret = 0;
>     > unsigned blocks = 256;
>     > @@ -591,12 +574,12 @@ static int setup_ring(int sock, struct
>     ring *ring, int type)
>     > ring->version = TPACKET_V2;
>     >
>     > if (type == PACKET_TX_RING) {
>     > - ret = set_packet_loss_discard(sock);
>     > + ret = mmap_set_packet_loss_discard(sock);
>     > if (ret != 0)
>     > return -1;
>     > }
>     >
>     > - fill_ring(ring, blocks);
>     > + mmap_fill_ring(ring, blocks);
>     >
>     > ret = setsockopt(sock, SOL_PACKET, type, &ring->req,
>     sizeof(ring->req));
>     > if (ret == -1) {
>     > @@ -614,7 +597,7 @@ static int setup_ring(int sock, struct ring
>     *ring, int type)
>     > return 0;
>     > }
>     >
>     > -static int mmap_sock(pkt_sock_t *pkt_sock)
>     > +static int mmap_sock(pkt_sock_mmap_t *pkt_sock)
>     > {
>     > int i;
>     > int sock = pkt_sock->sockfd;
>     > @@ -655,14 +638,14 @@ static int mmap_sock(pkt_sock_t *pkt_sock)
>     > return 0;
>     > }
>     >
>     > -static void unmap_sock(pkt_sock_t *pkt_sock)
>     > +static void mmap_unmap_sock(pkt_sock_mmap_t *pkt_sock)
>     > {
>     > munmap(pkt_sock->mmap_base, pkt_sock->mmap_len);
>     > free(pkt_sock->rx_ring.rd);
>     > free(pkt_sock->tx_ring.rd);
>     > }
>     >
>     > -static int bind_sock(pkt_sock_t *pkt_sock, char *netdev)
>     > +static int mmap_bind_sock(pkt_sock_mmap_t *pkt_sock, char *netdev)
>     > {
>     > int ret;
>     >
>     > @@ -684,7 +667,7 @@ static int bind_sock(pkt_sock_t *pkt_sock,
>     char *netdev)
>     > return 0;
>     > }
>     >
>     > -static int store_hw_addr(pkt_sock_t * const pkt_sock, char *netdev)
>     > +static int mmap_store_hw_addr(pkt_sock_mmap_t * const pkt_sock,
>     char *netdev)
>     > {
>     > struct ifreq ethreq;
>     > int ret;
>     > @@ -707,8 +690,8 @@ static int store_hw_addr(pkt_sock_t * const
>     pkt_sock, char *netdev)
>     > /*
>     > * ODP_PACKET_SOCKET_MMAP:
>     > */
>     > -int setup_pkt_sock(pkt_sock_t * const pkt_sock, char *netdev,
>     > - odp_buffer_pool_t pool)
>     > +int setup_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock, char
>     *netdev,
>     > + odp_buffer_pool_t pool, int fanout)
>     > {
>     > odp_packet_t pkt;
>     > uint8_t *pkt_buf;
>     > @@ -733,17 +716,19 @@ int setup_pkt_sock(pkt_sock_t * const
>     pkt_sock, char *netdev,
>     > odp_packet_free(pkt);
>     >
>     > pkt_sock->pool = pool;
>     > - pkt_sock->sockfd = pkt_socket();
>     > + pkt_sock->sockfd = mmap_pkt_socket();
>     >
>     > - ret = bind_sock(pkt_sock, netdev);
>     > + ret = mmap_bind_sock(pkt_sock, netdev);
>     > if (ret != 0)
>     > return -1;
>     >
>     > - ret = setup_ring(pkt_sock->sockfd, &pkt_sock->tx_ring,
>     PACKET_TX_RING);
>     > + ret = mmap_setup_ring(pkt_sock->sockfd, &pkt_sock->tx_ring,
>     > + PACKET_TX_RING);
>     > if (ret != 0)
>     > return -1;
>     >
>     > - ret = setup_ring(pkt_sock->sockfd, &pkt_sock->rx_ring,
>     PACKET_RX_RING);
>     > + ret = mmap_setup_ring(pkt_sock->sockfd, &pkt_sock->rx_ring,
>     > + PACKET_RX_RING);
>     > if (ret != 0)
>     > return -1;
>     >
>     > @@ -751,7 +736,7 @@ int setup_pkt_sock(pkt_sock_t * const
>     pkt_sock, char *netdev,
>     > if (ret != 0)
>     > return -1;
>     >
>     > - ret = store_hw_addr(pkt_sock, netdev);
>     > + ret = mmap_store_hw_addr(pkt_sock, netdev);
>     > if (ret != 0)
>     > return -1;
>     >
>     > @@ -761,9 +746,11 @@ int setup_pkt_sock(pkt_sock_t * const
>     pkt_sock, char *netdev,
>     > return -1;
>     > }
>     >
>     > - ret = set_pkt_sock_fanout(pkt_sock, if_idx);
>     > - if (ret != 0)
>     > - return -1;
>     > + if (fanout) {
>     > + ret = set_pkt_sock_fanout_mmap(pkt_sock, if_idx);
>     > + if (ret != 0)
>     > + return -1;
>     > + }
>     >
>     > return pkt_sock->sockfd;
>     > }
>     > @@ -771,9 +758,9 @@ int setup_pkt_sock(pkt_sock_t * const
>     pkt_sock, char *netdev,
>     > /*
>     > * ODP_PACKET_SOCKET_MMAP:
>     > */
>     > -int close_pkt_sock(pkt_sock_t * const pkt_sock)
>     > +int close_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock)
>     > {
>     > - unmap_sock(pkt_sock);
>     > + mmap_unmap_sock(pkt_sock);
>     > if (close(pkt_sock->sockfd) != 0) {
>     > perror("close_pkt_sock() - close(sockfd)");
>     > return -1;
>     > @@ -785,7 +772,7 @@ int close_pkt_sock(pkt_sock_t * const pkt_sock)
>     > /*
>     > * ODP_PACKET_SOCKET_MMAP:
>     > */
>     > -int recv_pkt_sock(pkt_sock_t * const pkt_sock,
>     > +int recv_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
>     > odp_packet_t pkt_table[], unsigned len)
>     > {
>     > return pkt_mmap_v2_rx(pkt_sock->rx_ring.sock, &pkt_sock->rx_ring,
>     > @@ -796,13 +783,9 @@ int recv_pkt_sock(pkt_sock_t * const pkt_sock,
>     > /*
>     > * ODP_PACKET_SOCKET_MMAP:
>     > */
>     > -int send_pkt_sock(pkt_sock_t * const pkt_sock,
>     > +int send_pkt_sock_mmap(pkt_sock_mmap_t * const pkt_sock,
>     > odp_packet_t pkt_table[], unsigned len)
>     > {
>     > return pkt_mmap_v2_tx(pkt_sock->tx_ring.sock, &pkt_sock->tx_ring,
>     > pkt_table, len);
>     > }
>     > -
>     > -#else
>     > -#error "Unsupported ODP_PACKET_SOCKET_MODE!"
>     > -#endif
>     > diff --git a/test/packet/odp_example_pktio.c
>     b/test/packet/odp_example_pktio.c
>     > index 85bbdd7..2b1ce3d 100644
>     > --- a/test/packet/odp_example_pktio.c
>     > +++ b/test/packet/odp_example_pktio.c
>     > @@ -42,6 +42,8 @@ typedef struct {
>     > int if_count; /**< Number of interfaces to be used */
>     > char **if_names; /**< Array of pointers to interface names */
>     > int mode; /**< Packet IO mode */
>     > + int type; /**< Packet IO type */
>     > + int fanout; /**< Packet IO fanout */
>     > odp_buffer_pool_t pool; /**< Buffer pool for packet IO */
>     > } appl_args_t;
>     >
>     > @@ -52,6 +54,8 @@ typedef struct {
>     > char *pktio_dev; /**< Interface name to use */
>     > odp_buffer_pool_t pool; /**< Buffer pool for packet IO */
>     > int mode; /**< Thread mode */
>     > + int type; /**< Thread i/o type */
>     > + int fanout; /**< Thread i/o fanout */
>     > } thread_args_t;
>     >
>     > /**
>     > @@ -111,7 +115,8 @@ static void *pktio_queue_thread(void *arg)
>     > }
>     >
>     > /* Open a packet IO instance for this thread */
>     > - sock_params->type = ODP_PKTIO_TYPE_SOCKET;
>     > + sock_params->type = thr_args->type;
>     > + sock_params->fanout = thr_args->fanout;
>     > pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool,
>     &params);
>     > if (pktio == ODP_PKTIO_INVALID) {
>     > ODP_ERR(" [%02i] Error: pktio create failed\n", thr);
>     > @@ -223,7 +228,8 @@ static void *pktio_ifburst_thread(void *arg)
>     > }
>     >
>     > /* Open a packet IO instance for this thread */
>     > - sock_params->type = ODP_PKTIO_TYPE_SOCKET;
>     > + sock_params->type = thr_args->type;
>     > + sock_params->fanout = thr_args->fanout;
>     > pktio = odp_pktio_open(thr_args->pktio_dev, thr_args->pool,
>     &params);
>     > if (pktio == ODP_PKTIO_INVALID) {
>     > ODP_ERR(" [%02i] Error: pktio create failed.\n", thr);
>     > @@ -357,6 +363,8 @@ int main(int argc, char *argv[])
>     > args->thread[i].pktio_dev = args->appl.if_names[if_idx];
>     > args->thread[i].pool = pool;
>     > args->thread[i].mode = args->appl.mode;
>     > + args->thread[i].type = args->appl.type;
>     > + args->thread[i].fanout = args->appl.fanout;
>     >
>     > if (args->appl.mode == APPL_MODE_PKT_BURST)
>     > thr_run_func = pktio_ifburst_thread;
>     > @@ -470,9 +478,11 @@ static void parse_args(int argc, char
>     *argv[], appl_args_t *appl_args)
>     > };
>     >
>     > appl_args->mode = -1; /* Invalid, must be changed by parsing */
>     > + appl_args->type = 3; /* 3: ODP_PKTIO_TYPE_SOCKET_MMAP */
>     > + appl_args->fanout = 1; /* turn of fanout by default for mmap */
>     >
>     > while (1) {
>     > - opt = getopt_long(argc, argv, "+c:i:m:h",
>     > + opt = getopt_long(argc, argv, "+c:i:m:t:f:h",
>     > longopts, &long_index);
>     >
>     > if (opt == -1)
>     > @@ -533,6 +543,14 @@ static void parse_args(int argc, char
>     *argv[], appl_args_t *appl_args)
>     > appl_args->mode = APPL_MODE_PKT_QUEUE;
>     > break;
>     >
>     > + case 't':
>     > + appl_args->type = atoi(optarg);
>     > + break;
>     > +
>     > + case 'f':
>     > + appl_args->type = atoi(optarg);
>     > + break;
>     > +
>     > case 'h':
>     > usage(argv[0]);
>     > exit(EXIT_SUCCESS);
>     > @@ -602,6 +620,12 @@ static void usage(char *progname)
>     > " -i, --interface Eth interfaces (comma-separated, no spaces)\n"
>     > " -m, --mode 0: Burst send&receive packets (no queues)\n"
>     > " 1: Send&receive packets through ODP queues.\n"
>     > + " -t, --type 1: ODP_PKTIO_TYPE_SOCKET_BASIC\n"
>     > + " 2: ODP_PKTIO_TYPE_SOCKET_MMSG\n"
>     > + " 3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
>     > + " 4: ODP_PKTIO_TYPE_NETMAP\n"
>     > + " Default: 3: ODP_PKTIO_TYPE_SOCKET_MMAP\n"
>     > + " -f, --fanout 0: off 1: on (Default 1: on)\n"
>     > "\n"
>     > "Optional OPTIONS\n"
>     > " -c, --count <number> Core count.\n"
>     > --
>     > 1.8.5.1.163.gd7aced9
>
>     Dosn't build!
>
>     $ make
>     make -C /home/anders/src/odp/platform/linux-generic libs
>     make[1]: Entering directory
>     `/home/anders/src/odp/platform/linux-generic'
>     Compiling source/odp_packet_io.c
>     cc -c -MD -I../../include -I./include -I./include/api -fPIC
>     -DODP_DEBUG=1 -O3 -pthread -W -Wall -Werror -Wstrict-prototypes
>     -Wmissing-prototypes -Wmissing-declarations -Wold-style-definition
>     -Wpointer-arith -Wcast-align -Wnested-externs -Wcast-qual
>     -Wformat-nonliteral -Wformat-security -Wundef -Wwrite-strings -o
>     obj/odp_packet_io.o source/odp_packet_io.c
>     source/odp_packet_io.c: In function 'init_pktio_entry':
>     source/odp_packet_io.c:119:2: error: enumeration value
>     'ODP_PKTIO_TYPE_NETMAP' not handled in switch [-Werror=switch]
>     switch (params->type) {
>     ^
>     source/odp_packet_io.c: In function 'odp_pktio_open':
>     source/odp_packet_io.c:208:2: error: enumeration value
>     'ODP_PKTIO_TYPE_NETMAP' not handled in switch [-Werror=switch]
>     switch (params->type) {
>     ^
>     cc1: all warnings being treated as errors
>     make[1]: *** [obj/odp_packet_io.o] Error 1
>     make[1]: Leaving directory
>     `/home/anders/src/odp/platform/linux-generic'
>     make: *** [lib] Error 2
>
>
>     need to do something like this:
>     $ git df
>     diff --git a/platform/linux-generic/source/odp_packet_io.c
>     b/platform/linux-generic/
>     index e33cf35..71da4d2 100644
>     --- a/platform/linux-generic/source/odp_packet_io.c
>     +++ b/platform/linux-generic/source/odp_packet_io.c
>     @@ -124,11 +124,11 @@ static void init_pktio_entry(pktio_entry_t
>     *entry, odp_pktio_p
>     memset(&entry->s.pkt_sock_mmap, 0,
>     sizeof(entry->s.pkt_sock_mmap));
>     break;
>     -#ifdef ODP_HAVE_NETMAP
>     case ODP_PKTIO_TYPE_NETMAP:
>     +#ifdef ODP_HAVE_NETMAP
>     memset(&entry->s.pkt_nm, 0, sizeof(entry->s.pkt_nm));
>     - break;
>     #endif
>     + break;
>     }
>     /* Save pktio parameters, type is the most useful */
>     memcpy(&entry->s.params, params, sizeof(*params));
>     @@ -224,8 +224,8 @@ odp_pktio_t odp_pktio_open(char *dev,
>     odp_buffer_pool_t pool,
>     id = ODP_PKTIO_INVALID;
>     }
>     break;
>     -#ifdef ODP_HAVE_NETMAP
>     case ODP_PKTIO_TYPE_NETMAP:
>     +#ifdef ODP_HAVE_NETMAP
>     res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
>     pool, &params->nm_params);
>     if (res == -1) {
>     @@ -233,8 +233,8 @@ odp_pktio_t odp_pktio_open(char *dev,
>     odp_buffer_pool_t pool,
>     free_pktio_entry(id);
>     id = ODP_PKTIO_INVALID;
>     }
>     - break;
>     #endif
>     + break;
>     }
>
>     unlock_entry(pktio_entry);
>
>
>     Cheers,
>     Anders
>
>     --
>     You received this message because you are subscribed to the Google
>     Groups "LNG ODP Sub-team - lng-odp@linaro.org
>     <mailto:lng-odp@linaro.org>" group.
>     To unsubscribe from this group and stop receiving emails from it,
>     send an email to lng-odp+unsubscribe@linaro.org
>     <mailto:lng-odp%2Bunsubscribe@linaro.org>.
>     To post to this group, send email to lng-odp@linaro.org
>     <mailto:lng-odp@linaro.org>.
>     Visit this group at
>     http://groups.google.com/a/linaro.org/group/lng-odp/.
>     To view this discussion on the web visit
>     https://groups.google.com/a/linaro.org/d/msgid/lng-odp/20140328153845.GA26897%408470w.
>     For more options, visit
>     https://groups.google.com/a/linaro.org/d/optout.
>
>
diff mbox

Patch

diff --git a/platform/linux-generic/source/odp_packet_io.c b/platform/linux-generic/
index e33cf35..71da4d2 100644
--- a/platform/linux-generic/source/odp_packet_io.c
+++ b/platform/linux-generic/source/odp_packet_io.c
@@ -124,11 +124,11 @@  static void init_pktio_entry(pktio_entry_t *entry, odp_pktio_p
                memset(&entry->s.pkt_sock_mmap, 0,
                      sizeof(entry->s.pkt_sock_mmap));
                break;
-#ifdef ODP_HAVE_NETMAP
        case ODP_PKTIO_TYPE_NETMAP:
+#ifdef ODP_HAVE_NETMAP
                memset(&entry->s.pkt_nm, 0, sizeof(entry->s.pkt_nm));
-               break;
 #endif
+               break;
        }
        /* Save pktio parameters, type is the most useful */
        memcpy(&entry->s.params, params, sizeof(*params));
@@ -224,8 +224,8 @@  odp_pktio_t odp_pktio_open(char *dev, odp_buffer_pool_t pool,
                        id = ODP_PKTIO_INVALID;
                }
                break;
-#ifdef ODP_HAVE_NETMAP
        case ODP_PKTIO_TYPE_NETMAP:
+#ifdef ODP_HAVE_NETMAP
                res = setup_pkt_netmap(&pktio_entry->s.pkt_nm, dev,
                                pool, &params->nm_params);
                if (res == -1) {
@@ -233,8 +233,8 @@  odp_pktio_t odp_pktio_open(char *dev, odp_buffer_pool_t pool,
                        free_pktio_entry(id);
                        id = ODP_PKTIO_INVALID;
                }
-               break;
 #endif
+               break;
        }
 
        unlock_entry(pktio_entry);