X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=extras%2Flibmemif%2Fsrc%2Fmemif_private.h;h=88237dca265d43a6139515a66e9c917e8db6c6e4;hb=b163bbb7482a0a4b4685016eda4d2b2d3a9fcbb4;hp=51f3be662fbcbab98785b22494cf03ee6716e61a;hpb=7c5c40db2a8d71a857ae63b6238cfac6e257da6d;p=vpp.git diff --git a/extras/libmemif/src/memif_private.h b/extras/libmemif/src/memif_private.h index 51f3be662fb..88237dca265 100644 --- a/extras/libmemif/src/memif_private.h +++ b/extras/libmemif/src/memif_private.h @@ -26,16 +26,23 @@ #include #include #include +#include +#include #include -#define MEMIF_DEFAULT_SOCKET_DIR "/run/vpp" -#define MEMIF_DEFAULT_SOCKET_FILENAME "memif.sock" +#define MEMIF_NAME_LEN 32 +_Static_assert (strlen (MEMIF_DEFAULT_APP_NAME) <= MEMIF_NAME_LEN, + "MEMIF_DEFAULT_APP_NAME max length is 32"); + +#define MEMIF_DEFAULT_SOCKET_PATH "/run/vpp/memif.sock" #define MEMIF_DEFAULT_RING_SIZE 1024 #define MEMIF_DEFAULT_LOG2_RING_SIZE 10 #define MEMIF_DEFAULT_RX_QUEUES 1 #define MEMIF_DEFAULT_TX_QUEUES 1 #define MEMIF_DEFAULT_BUFFER_SIZE 2048 +#define MEMIF_DEFAULT_RECONNECT_PERIOD_SEC 2 +#define MEMIF_DEFAULT_RECONNECT_PERIOD_NSEC 0 #define MEMIF_MAX_M2S_RING 255 #define MEMIF_MAX_S2M_RING 255 @@ -44,6 +51,10 @@ #define MEMIF_MAX_FDS 512 +#define memif_min(a,b) (((a) < (b)) ? (a) : (b)) + +#define EXPECT_TRUE(x) __builtin_expect((x),1) +#define EXPECT_FALSE(x) __builtin_expect((x),0) #ifdef MEMIF_DBG #define DBG(...) do { \ @@ -51,38 +62,24 @@ printf(__VA_ARGS__); \ printf("\n"); \ } while (0) - -#define DBG_UNIX(...) do { \ - printf("MEMIF_DEBUG_UNIX:%s:%s:%d: ", __FILE__, __func__, __LINE__); \ - printf(__VA_ARGS__); \ - printf("\n"); \ - } while (0) - -#define error_return_unix(...) do { \ - DBG_UNIX(__VA_ARGS__); \ - return -1; \ - } while (0) -#define error_return(...) do { \ - DBG(__VA_ARGS__); \ - return -1; \ - } while (0) #else #define DBG(...) -#define DBG_UNIX(...) -#define error_return_unix(...) do { \ - return -1; \ - } while (0) -#define error_return(...) do { \ - return -1; \ - } while (0) - #endif /* MEMIF_DBG */ +typedef enum +{ + MEMIF_SOCKET_TYPE_NONE = 0, /* unassigned, not used by any interface */ + MEMIF_SOCKET_TYPE_LISTENER, /* listener socket, master interface assigned */ + MEMIF_SOCKET_TYPE_CLIENT /* client socket, slave interface assigned */ +} memif_socket_type_t; + typedef struct { - void *shm; + void *addr; uint32_t region_size; + uint32_t buffer_offset; int fd; + uint8_t is_external; } memif_region_t; typedef struct @@ -123,6 +120,8 @@ typedef struct memif_log2_ring_size_t log2_ring_size; } memif_conn_run_args_t; +struct libmemif_main; + typedef struct memif_connection { uint16_t index; @@ -130,7 +129,6 @@ typedef struct memif_connection memif_conn_run_args_t run_args; int fd; - int listener_fd; memif_fn *write_fn, *read_fn, *error_fn; @@ -141,12 +139,15 @@ typedef struct memif_connection /* connection message queue */ memif_msg_queue_elt_t *msg_queue; - uint8_t remote_if_name[32]; - uint8_t remote_name[32]; + uint8_t remote_if_name[MEMIF_NAME_LEN]; + uint8_t remote_name[MEMIF_NAME_LEN]; uint8_t remote_disconnect_string[96]; + uint8_t regions_num; memif_region_t *regions; + uint8_t rx_queues_num; + uint8_t tx_queues_num; memif_queue_t *rx_queues; memif_queue_t *tx_queues; @@ -154,54 +155,59 @@ typedef struct memif_connection #define MEMIF_CONNECTION_FLAG_WRITE (1 << 0) } memif_connection_t; -/* - * WIP - */ typedef struct { - int key; /* fd or id */ + int key; void *data_struct; } memif_list_elt_t; -/* - * WIP - */ typedef struct { int fd; uint16_t use_count; + memif_socket_type_t type; uint8_t *filename; + /* unique database */ + struct libmemif_main *lm; uint16_t interface_list_len; + void *private_ctx; memif_list_elt_t *interface_list; /* memif master interfaces listening on this socket */ } memif_socket_t; -/* - * WIP - */ -/* probably function like memif_cleanup () will need to be called to close timerfd */ -typedef struct +typedef struct libmemif_main { memif_control_fd_update_t *control_fd_update; int timerfd; + int epfd; + int poll_cancel_fd; struct itimerspec arm, disarm; uint16_t disconn_slaves; - uint8_t *app_name; + uint8_t app_name[MEMIF_NAME_LEN]; + + void *private_ctx; + + memif_socket_handle_t default_socket; + + memif_add_external_region_t *add_external_region; + memif_get_external_region_addr_t *get_external_region_addr; + memif_del_external_region_t *del_external_region; + memif_get_external_buffer_offset_t *get_external_buffer_offset; - /* master implementation... */ - memif_socket_t ms; + memif_alloc_t *alloc; + memif_realloc_t *realloc; + memif_free_t *free; uint16_t control_list_len; uint16_t interrupt_list_len; - uint16_t listener_list_len; + uint16_t socket_list_len; uint16_t pending_list_len; memif_list_elt_t *control_list; memif_list_elt_t *interrupt_list; - memif_list_elt_t *listener_list; + memif_list_elt_t *socket_list; memif_list_elt_t *pending_list; } libmemif_main_t; extern libmemif_main_t libmemif_main; -extern int memif_epfd; /* main.c */ @@ -216,7 +222,7 @@ int memif_disconnect_internal (memif_connection_t * c); /* map errno to memif error code */ int memif_syscall_error_handler (int err_code); -int add_list_elt (memif_list_elt_t * e, memif_list_elt_t ** list, +int add_list_elt (libmemif_main_t *lm, memif_list_elt_t * e, memif_list_elt_t ** list, uint16_t * len); int get_list_elt (memif_list_elt_t ** e, memif_list_elt_t * list, @@ -224,6 +230,8 @@ int get_list_elt (memif_list_elt_t ** e, memif_list_elt_t * list, int free_list_elt (memif_list_elt_t * list, uint16_t len, int key); +libmemif_main_t *get_libmemif_main (memif_socket_t * ms); + #ifndef __NR_memfd_create #if defined __x86_64__ #define __NR_memfd_create 319 @@ -236,24 +244,31 @@ int free_list_elt (memif_list_elt_t * list, uint16_t len, int key); #endif #endif +#ifndef HAVE_MEMFD_CREATE static inline int memfd_create (const char *name, unsigned int flags) { return syscall (__NR_memfd_create, name, flags); } +#endif static inline void * memif_get_buffer (memif_connection_t * conn, memif_ring_t * ring, uint16_t index) { - return (conn->regions[ring->desc[index].region].shm + + return (conn->regions[ring->desc[index].region].addr + ring->desc[index].offset); } #ifndef F_LINUX_SPECIFIC_BASE #define F_LINUX_SPECIFIC_BASE 1024 #endif + +#ifndef MFD_ALLOW_SEALING #define MFD_ALLOW_SEALING 0x0002U +#endif + +#ifndef F_ADD_SEALS #define F_ADD_SEALS (F_LINUX_SPECIFIC_BASE + 9) #define F_GET_SEALS (F_LINUX_SPECIFIC_BASE + 10) @@ -261,5 +276,6 @@ memif_get_buffer (memif_connection_t * conn, memif_ring_t * ring, #define F_SEAL_SHRINK 0x0002 /* prevent file from shrinking */ #define F_SEAL_GROW 0x0004 /* prevent file from growing */ #define F_SEAL_WRITE 0x0008 /* prevent writes */ +#endif #endif /* _MEMIF_PRIVATE_H_ */