*/
#include <vppinfra/lock.h>
+#include <vlib/log.h>
#define MEMIF_DEFAULT_SOCKET_FILENAME "memif.sock"
#define MEMIF_DEFAULT_RING_SIZE 1024
#define MEMIF_DEFAULT_TX_QUEUES 1
#define MEMIF_DEFAULT_BUFFER_SIZE 2048
-#define MEMIF_MAX_M2S_RING (vec_len (vlib_mains) - 1)
-#define MEMIF_MAX_S2M_RING (vec_len (vlib_mains) - 1)
-#define MEMIF_MAX_REGION 255
+#define MEMIF_MAX_M2S_RING (vec_len (vlib_mains))
+#define MEMIF_MAX_S2M_RING 256
+#define MEMIF_MAX_REGION 256
#define MEMIF_MAX_LOG2_RING_SIZE 14
-#define MEMIF_DEBUG 0
-#if MEMIF_DEBUG == 1
-#define DBG(...) clib_warning(__VA_ARGS__)
-#define DBG_UNIX_LOG(...) clib_unix_warning(__VA_ARGS__)
-#else
-#define DBG(...)
-#define DBG_UNIX_LOG(...)
-#endif
+#define memif_log_debug(dev, f, ...) do { \
+ memif_if_t *_dev = (memif_if_t *) dev; \
+ if (_dev) \
+ vlib_log(VLIB_LOG_LEVEL_DEBUG, memif_main.log_class, "%U: " f, \
+ format_vnet_hw_if_index_name, vnet_get_main(), \
+ _dev->hw_if_index, ##__VA_ARGS__); \
+ else \
+ vlib_log(VLIB_LOG_LEVEL_DEBUG, memif_main.log_class, f, \
+ ##__VA_ARGS__); \
+} while (0)
+
+#define memif_log_warn(dev, f, ...) do { \
+ memif_if_t *_dev = (memif_if_t *) dev; \
+ if (_dev) \
+ vlib_log(VLIB_LOG_LEVEL_WARNING, memif_main.log_class, "%U: " f, \
+ format_vnet_hw_if_index_name, vnet_get_main(), \
+ _dev->hw_if_index, ##__VA_ARGS__); \
+ else \
+ vlib_log(VLIB_LOG_LEVEL_WARNING, memif_main.log_class, f, \
+ ##__VA_ARGS__); \
+} while (0)
+
+#define memif_log_err(dev, f, ...) do { \
+ memif_if_t *_dev = (memif_if_t *) dev; \
+ if (_dev) \
+ vlib_log(VLIB_LOG_LEVEL_ERR, memif_main.log_class, "%U: " f, \
+ format_vnet_hw_if_index_name, vnet_get_main(), \
+ _dev->hw_if_index, ##__VA_ARGS__); \
+ else \
+ vlib_log(VLIB_LOG_LEVEL_ERR, memif_main.log_class, f, \
+ ##__VA_ARGS__); \
+} while (0)
-#if MEMIF_DEBUG == 1
#define memif_file_add(a, b) do { \
*a = clib_file_add (&file_main, b); \
- clib_warning ("clib_file_add fd %d private_data %u idx %u", \
+ memif_log_warn (0, "clib_file_add fd %d private_data %u idx %u", \
(b)->file_descriptor, (b)->private_data, *a); \
} while (0)
#define memif_file_del(a) do { \
- clib_warning ("clib_file_del idx %u",a - file_main.file_pool); \
+ memif_log_warn (0, "clib_file_del idx %u", a - file_main.file_pool); \
clib_file_del (&file_main, a); \
} while (0)
#define memif_file_del_by_index(a) do { \
- clib_warning ("clib_file_del idx %u", a); \
+ memif_log_warn (0, "clib_file_del idx %u", a); \
clib_file_del_by_index (&file_main, a); \
} while (0)
-#else
-#define memif_file_add(a, b) do { \
- *a = clib_file_add (&file_main, b); \
-} while (0)
-#define memif_file_del(a) clib_file_del(&file_main, a)
-#define memif_file_del_by_index(a) clib_file_del_by_index(&file_main, a)
-#endif
typedef struct
{
typedef struct
{
+ /* Required for vec_validate_aligned */
+ CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
void *shm;
memif_region_size_t region_size;
int fd;
typedef struct
{
+ CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
/* ring data */
memif_ring_t *ring;
memif_log2_ring_size_t log2_ring_size;
u16 last_head;
u16 last_tail;
u32 *buffers;
+ u8 buffer_pool_index;
/* interrupts */
int int_fd;
typedef struct
{
+ CLIB_ALIGN_MARK (pad, 16); /* align up to 16 bytes for 32bit builds */
void *data;
u32 data_len;
i16 buffer_offset;
/* per thread data */
memif_per_thread_data_t *per_thread_data;
+ vlib_log_class_t log_class;
+
} memif_main_t;
extern memif_main_t memif_main;
extern vnet_device_class_t memif_device_class;
extern vlib_node_registration_t memif_input_node;
-enum
+typedef enum
{
MEMIF_PROCESS_EVENT_START = 1,
MEMIF_PROCESS_EVENT_STOP = 2,
clib_error_t * err);
u8 *format_memif_device_name (u8 * s, va_list * args);
+
/*
* fd.io coding-style-patch-verification: ON
*