37 memset (&a, 0,
sizeof (a));
77 active_open_session = s;
82 clib_warning (
"proxy session for %s handle %lld (%llx) AWOL",
83 is_active_open ?
"active open" :
"server",
102 clib_warning (
"proxy session for %s handle %lld (%llx) AWOL",
103 is_active_open ?
"active open" :
"server",
113 active_open_session = 0;
126 if (active_open_session)
189 int actual_transfer __attribute__ ((unused));
207 active_open_tx_fifo = s->
rx_fifo;
214 u32 ao_thread_index = active_open_tx_fifo->master_thread_index;
215 u32 ao_session_index = active_open_tx_fifo->master_session_index;
227 ASSERT (rx_fifo->master_thread_index == thread_index);
228 ASSERT (tx_fifo->master_thread_index == thread_index);
236 max_dequeue, pm->
rx_buf[thread_index]);
257 a->api_context = proxy_index;
359 u8 thread_index = proxy_tx_fifo->master_thread_index;
360 u32 session_index = proxy_tx_fifo->master_session_index;
401 u32 segment_size = 512 << 20;
452 | APP_OPTIONS_FLAGS_IS_PROXY;
491 for (i = 0; i < num_threads; i++)
510 for (i = 0; i < num_threads; i++)
527 char *default_server_uri =
"tcp://0.0.0.0/23";
528 char *default_client_uri =
"tcp://6.0.2.2/23";
547 else if (
unformat (input,
"private-segment-count %d",
550 else if (
unformat (input,
"private-segment-size %U",
553 if (tmp >= 0x100000000ULL)
555 (0,
"private segment size %lld (%llu) too large", tmp, tmp);
569 clib_warning (
"No server-uri provided, Using default: %s",
575 clib_warning (
"No client-uri provided, Using default: %s",
597 .path =
"test proxy server",
598 .short_help =
"test proxy server [server-uri <tcp://ip/port>]" 599 "[client-uri <tcp://ip/port>][fifo-size <nn>][rcv-buf-size <nn>]" 600 "[prealloc-fifos <nn>][private-segment-size <mem>]" 601 "[private-segment-count <nn>]",
#define vec_validate(V, I)
Make sure vector is long enough for given index (no header, unspecified alignment) ...
u64 vpp_active_open_handle
#define hash_set(h, key, value)
u32 private_segment_count
Number of private fifo segs.
u32 vl_api_memclnt_create_internal(char *name, svm_queue_t *q)
#define hash_unset(h, key)
u8 * format_session(u8 *s, va_list *args)
Format stream session as per the following format.
svm_queue_t * vl_input_queue
vpe input queue
struct _vnet_connect_args vnet_connect_args_t
u32 session_index
Index in thread pool where session was allocated.
static int proxy_accept_callback(session_t *s)
static svm_msg_q_t * session_main_get_vpp_event_queue(u32 thread_index)
static void proxy_reset_callback(session_t *s)
clib_memset(h->entries, 0, sizeof(h->entries[0]) *entries)
svm_fifo_t * rx_fifo
Pointers to rx/tx buffers.
static int active_open_rx_callback(session_t *s)
static_always_inline void clib_spinlock_unlock_if_init(clib_spinlock_t *p)
static clib_error_t * proxy_server_create_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
int svm_fifo_peek(svm_fifo_t *f, u32 offset, u32 len, u8 *dst)
Peek data from fifo.
static void create_api_loopbacks(vlib_main_t *vm)
uword * proxy_session_by_server_handle
#define pool_get(P, E)
Allocate an object E from a pool P (unspecified alignment).
struct _vnet_bind_args_t vnet_listen_args_t
static int active_open_create_callback(session_t *s)
svm_fifo_t * server_rx_fifo
static int active_open_connected_callback(u32 app_index, u32 opaque, session_t *s, u8 is_fail)
static session_handle_t session_handle(session_t *s)
struct _svm_fifo svm_fifo_t
#define clib_memcpy(d, s, n)
u8 prealloc_fifos
Request fifo preallocation.
#define VLIB_INIT_FUNCTION(x)
struct _vnet_disconnect_args_t vnet_disconnect_args_t
static u32 svm_fifo_max_dequeue_cons(svm_fifo_t *f)
Fifo max bytes to dequeue optimized for consumer.
static session_cb_vft_t proxy_session_cb_vft
#define clib_error_return(e, args...)
void vl_api_rpc_call_main_thread(void *fp, u8 *data, u32 data_length)
struct vl_shmem_hdr_ * shmem_hdr
Binary API shared-memory segment header pointer.
u32 server_app_index
server app index
int session_send_io_evt_to_thread(svm_fifo_t *f, session_evt_type_t evt_type)
struct _vnet_app_attach_args_t vnet_app_attach_args_t
clib_error_t * proxy_main_init(vlib_main_t *vm)
#define pool_elt_at_index(p, i)
Returns pointer to element at given index.
proxy_session_t * sessions
Session pool, shared.
static session_t * session_get_from_handle(session_handle_t handle)
static void active_open_disconnect_callback(session_t *s)
static void proxy_cb_fn(void *data, u32 data_len)
#define pool_put(P, E)
Free an object E in pool P.
static int proxy_server_create(vlib_main_t *vm)
clib_error_t * vnet_session_enable_disable(vlib_main_t *vm, u8 is_en)
API main structure, used by both vpp and binary API clients.
int vnet_application_attach(vnet_app_attach_args_t *a)
Attach application to vpp.
static u8 svm_fifo_set_event(svm_fifo_t *f)
Set fifo event flag.
svm_msg_q_t ** active_open_event_queue
u32 active_open_client_index
active open API client handle
static_always_inline uword vlib_get_thread_index(void)
#define clib_warning(format, args...)
struct _stream_session_cb_vft session_cb_vft_t
u32 server_client_index
server API client handle
static void proxy_call_main_thread(vnet_connect_args_t *a)
#define pool_is_free_index(P, I)
Use free bitmap to query whether given index is free.
static void active_open_reset_callback(session_t *s)
svm_queue_t * vl_input_queue
svm_msg_q_t ** server_event_queue
per-thread vectors
#define VLIB_CLI_COMMAND(x,...)
u32 active_open_app_index
active open index after attach
#define hash_create(elts, value_bytes)
static int proxy_server_attach()
static int proxy_connected_callback(u32 app_index, u32 api_context, session_t *s, u8 is_fail)
uword * proxy_session_by_active_open_handle
static int proxy_rx_callback(session_t *s)
u8 ** rx_buf
intermediate rx buffers
static void delete_proxy_session(session_t *s, int is_active_open)
clib_spinlock_t sessions_lock
u8 thread_index
Index of the thread that allocated the session.
u32 private_segment_size
size of private fifo segs
static int active_open_attach(void)
svm_fifo_t * server_tx_fifo
static void proxy_disconnect_callback(session_t *s)
#define vec_len(v)
Number of elements in vector (rvalue-only, NULL tolerant)
volatile u8 session_state
State in session layer state machine.
int vnet_bind_uri(vnet_listen_args_t *a)
int vnet_disconnect_session(vnet_disconnect_args_t *a)
int session_send_io_evt_to_thread_custom(void *data, u32 thread_index, session_evt_type_t evt_type)
static int proxy_add_segment_callback(u32 client_index, u64 segment_handle)
static struct option options[]
static int proxy_server_listen()
static vlib_thread_main_t * vlib_get_thread_main()
static session_cb_vft_t active_open_clients
int vnet_connect_uri(vnet_connect_args_t *a)
static_always_inline void clib_spinlock_lock_if_init(clib_spinlock_t *p)