numam-dpdk/drivers/net/memif/memif.h
Thomas Monjalon ddf06e8a08 net/memif: use common macros for cache line marker
The macros RTE_MARKER and __rte_cache_aligned can be used
for consistency for describing MEMIF_CACHELINE_ALIGN_MARK.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
2020-04-16 18:07:29 +02:00

180 lines
5.0 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright 2018-2019 Cisco Systems, Inc. All rights reserved.
*/
#ifndef _MEMIF_H_
#define _MEMIF_H_
#define MEMIF_COOKIE 0x3E31F20
#define MEMIF_VERSION_MAJOR 2
#define MEMIF_VERSION_MINOR 0
#define MEMIF_VERSION ((MEMIF_VERSION_MAJOR << 8) | MEMIF_VERSION_MINOR)
#define MEMIF_NAME_SZ 32
/*
* S2M: direction slave -> master
* M2S: direction master -> slave
*/
/*
* Type definitions
*/
typedef enum memif_msg_type {
MEMIF_MSG_TYPE_NONE,
MEMIF_MSG_TYPE_ACK,
MEMIF_MSG_TYPE_HELLO,
MEMIF_MSG_TYPE_INIT,
MEMIF_MSG_TYPE_ADD_REGION,
MEMIF_MSG_TYPE_ADD_RING,
MEMIF_MSG_TYPE_CONNECT,
MEMIF_MSG_TYPE_CONNECTED,
MEMIF_MSG_TYPE_DISCONNECT,
} memif_msg_type_t;
typedef enum {
MEMIF_RING_S2M, /**< buffer ring in direction slave -> master */
MEMIF_RING_M2S, /**< buffer ring in direction master -> slave */
} memif_ring_type_t;
typedef enum {
MEMIF_INTERFACE_MODE_ETHERNET,
MEMIF_INTERFACE_MODE_IP,
MEMIF_INTERFACE_MODE_PUNT_INJECT,
} memif_interface_mode_t;
typedef uint16_t memif_region_index_t;
typedef uint32_t memif_region_offset_t;
typedef uint64_t memif_region_size_t;
typedef uint16_t memif_ring_index_t;
typedef uint32_t memif_interface_id_t;
typedef uint16_t memif_version_t;
typedef uint8_t memif_log2_ring_size_t;
/*
* Socket messages
*/
/**
* M2S
* Contains master interfaces configuration.
*/
typedef struct __rte_packed {
uint8_t name[MEMIF_NAME_SZ]; /**< Client app name. In this case DPDK version */
memif_version_t min_version; /**< lowest supported memif version */
memif_version_t max_version; /**< highest supported memif version */
memif_region_index_t max_region; /**< maximum num of regions */
memif_ring_index_t max_m2s_ring; /**< maximum num of M2S ring */
memif_ring_index_t max_s2m_ring; /**< maximum num of S2M rings */
memif_log2_ring_size_t max_log2_ring_size; /**< maximum ring size (as log2) */
} memif_msg_hello_t;
/**
* S2M
* Contains information required to identify interface
* to which the slave wants to connect.
*/
typedef struct __rte_packed {
memif_version_t version; /**< memif version */
memif_interface_id_t id; /**< interface id */
memif_interface_mode_t mode:8; /**< interface mode */
uint8_t secret[24]; /**< optional security parameter */
uint8_t name[MEMIF_NAME_SZ]; /**< Client app name. In this case DPDK version */
} memif_msg_init_t;
/**
* S2M
* Request master to add new shared memory region to master interface.
* Shared files file descriptor is passed in cmsghdr.
*/
typedef struct __rte_packed {
memif_region_index_t index; /**< shm regions index */
memif_region_size_t size; /**< shm region size */
} memif_msg_add_region_t;
/**
* S2M
* Request master to add new ring to master interface.
*/
typedef struct __rte_packed {
uint16_t flags; /**< flags */
#define MEMIF_MSG_ADD_RING_FLAG_S2M 1 /**< ring is in S2M direction */
memif_ring_index_t index; /**< ring index */
memif_region_index_t region; /**< region index on which this ring is located */
memif_region_offset_t offset; /**< buffer start offset */
memif_log2_ring_size_t log2_ring_size; /**< ring size (log2) */
uint16_t private_hdr_size; /**< used for private metadata */
} memif_msg_add_ring_t;
/**
* S2M
* Finalize connection establishment.
*/
typedef struct __rte_packed {
uint8_t if_name[MEMIF_NAME_SZ]; /**< slave interface name */
} memif_msg_connect_t;
/**
* M2S
* Finalize connection establishment.
*/
typedef struct __rte_packed {
uint8_t if_name[MEMIF_NAME_SZ]; /**< master interface name */
} memif_msg_connected_t;
/**
* S2M & M2S
* Disconnect interfaces.
*/
typedef struct __rte_packed {
uint32_t code; /**< error code */
uint8_t string[96]; /**< disconnect reason */
} memif_msg_disconnect_t;
typedef struct __rte_packed __rte_aligned(128)
{
memif_msg_type_t type:16;
union {
memif_msg_hello_t hello;
memif_msg_init_t init;
memif_msg_add_region_t add_region;
memif_msg_add_ring_t add_ring;
memif_msg_connect_t connect;
memif_msg_connected_t connected;
memif_msg_disconnect_t disconnect;
};
} memif_msg_t;
/*
* Ring and Descriptor Layout
*/
/**
* Buffer descriptor.
*/
typedef struct __rte_packed {
uint16_t flags; /**< flags */
#define MEMIF_DESC_FLAG_NEXT 1 /**< is chained buffer */
memif_region_index_t region; /**< region index on which the buffer is located */
uint32_t length; /**< buffer length */
memif_region_offset_t offset; /**< buffer offset */
uint32_t metadata;
} memif_desc_t;
#define MEMIF_CACHELINE_ALIGN_MARK(mark) \
RTE_MARKER mark __rte_cache_aligned;
typedef struct {
MEMIF_CACHELINE_ALIGN_MARK(cacheline0);
uint32_t cookie; /**< MEMIF_COOKIE */
uint16_t flags; /**< flags */
#define MEMIF_RING_FLAG_MASK_INT 1 /**< disable interrupt mode */
uint16_t head; /**< pointer to ring buffer head */
MEMIF_CACHELINE_ALIGN_MARK(cacheline1);
uint16_t tail; /**< pointer to ring buffer tail */
MEMIF_CACHELINE_ALIGN_MARK(cacheline2);
memif_desc_t desc[0]; /**< buffer descriptors */
} memif_ring_t;
#endif /* _MEMIF_H_ */