/** Notify app that session or transport are about to be removed */
void (*session_cleanup_callback) (session_t * s, session_cleanup_ntf_t ntf);
+ /** Notify app that half open state was cleaned up (optional) */
+ void (*half_open_cleanup_callback) (session_t *s);
+
/** Notify app that session was reset */
void (*session_reset_callback) (session_t * s);
/*
* Results
*/
- char *segment_name;
- u32 segment_name_length;
- u64 server_event_queue_address;
u64 handle;
} vnet_listen_args_t;
u32 wrk_map_index;
u32 api_context;
- session_handle_t session_handle;
+ /* Resulting session, or half-open session, if connect successful */
+ session_handle_t sh;
} vnet_connect_args_t;
+typedef struct _vnet_shutdown_args_t
+{
+ session_handle_t handle;
+ u32 app_index;
+} vnet_shutdown_args_t;
+
typedef struct _vnet_disconnect_args_t
{
session_handle_t handle;
{
u8 *cert;
u8 *key;
+ u32 cert_len;
+ u32 key_len;
u32 index;
} vnet_app_add_cert_key_pair_args_t;
int vnet_listen (vnet_listen_args_t * a);
int vnet_connect (vnet_connect_args_t * a);
int vnet_unlisten (vnet_unlisten_args_t * a);
+int vnet_shutdown_session (vnet_shutdown_args_t *a);
int vnet_disconnect_session (vnet_disconnect_args_t * a);
-clib_error_t *vnet_app_add_tls_cert (vnet_app_add_tls_cert_args_t * a);
-clib_error_t *vnet_app_add_tls_key (vnet_app_add_tls_key_args_t * a);
int vnet_app_add_cert_key_pair (vnet_app_add_cert_key_pair_args_t * a);
int vnet_app_del_cert_key_pair (u32 index);
/** Ask for app cb on pair deletion */
u8 proto;
u8 is_ip4;
ip46_address_t ip;
- u32 ckpair_index;
- u8 crypto_engine;
u8 flags;
+ uword ext_config;
} __clib_packed session_listen_msg_t;
STATIC_ASSERT (sizeof (session_listen_msg_t) <= SESSION_CTRL_MSG_MAX_SIZE,
uword rx_fifo;
uword tx_fifo;
uword vpp_evt_q;
- u32 segment_size;
- u8 segment_name_length;
- u8 segment_name[128];
+ u64 segment_handle;
} __clib_packed session_bound_msg_t;
typedef struct session_unlisten_msg_
uword server_tx_fifo;
u64 segment_handle;
uword vpp_event_queue_address;
+ u32 mq_index;
+ transport_endpoint_t lcl;
transport_endpoint_t rmt;
u8 flags;
} __clib_packed session_accepted_msg_t;
u8 is_ip4;
ip46_address_t ip;
ip46_address_t lcl_ip;
- u8 hostname_len;
- u8 hostname[16];
u64 parent_handle;
u32 ckpair_index;
u8 crypto_engine;
u8 flags;
+ uword ext_config;
} __clib_packed session_connect_msg_t;
STATIC_ASSERT (sizeof (session_connect_msg_t) <= SESSION_CTRL_MSG_MAX_SIZE,
transport_endpoint_t lcl;
} __clib_packed session_connected_msg_t;
+typedef struct session_shutdown_msg_
+{
+ u32 client_index;
+ u32 context;
+ session_handle_t handle;
+} __clib_packed session_shutdown_msg_t;
+
typedef struct session_disconnect_msg_
{
u32 client_index;
uword vpp_evt_q;
session_handle_t handle;
session_handle_t new_handle;
+ u64 segment_handle;
u32 vpp_thread_index;
} __clib_packed session_migrated_msg_t;
u8 data[64]; /**< rpc data */
} __clib_packed session_app_wrk_rpc_msg_t;
+typedef struct session_transport_attr_msg_
+{
+ u32 client_index;
+ session_handle_t handle;
+ transport_endpt_attr_t attr;
+ u8 is_get;
+} __clib_packed session_transport_attr_msg_t;
+
+typedef struct session_transport_attr_reply_msg_
+{
+ i32 retval;
+ session_handle_t handle;
+ transport_endpt_attr_t attr;
+ u8 is_get;
+} __clib_packed session_transport_attr_reply_msg_t;
+
typedef struct app_session_event_
{
svm_msg_q_msg_t msg;
svm_msg_q_lock (mq);
while (svm_msg_q_ring_is_full (mq, SESSION_MQ_IO_EVT_RING)
|| svm_msg_q_is_full (mq))
- svm_msg_q_wait (mq);
+ svm_msg_q_wait_prod (mq);
msg = svm_msg_q_alloc_msg_w_ring (mq, SESSION_MQ_IO_EVT_RING);
evt = (session_event_t *) svm_msg_q_msg_data (mq, &msg);
evt->session_index = session_index;
svm_msg_q_t * vpp_evt_q, u8 * data, u32 len, u8 evt_type,
u8 do_evt, u8 noblock)
{
- u32 max_enqueue, actual_write;
session_dgram_hdr_t hdr;
int rv;
- max_enqueue = svm_fifo_max_enqueue_prod (f);
- if (max_enqueue < (sizeof (session_dgram_hdr_t) + len))
+ if (svm_fifo_max_enqueue_prod (f) < (sizeof (session_dgram_hdr_t) + len))
return 0;
- max_enqueue -= sizeof (session_dgram_hdr_t);
- actual_write = clib_min (len, max_enqueue);
- hdr.data_length = actual_write;
+ hdr.data_length = len;
hdr.data_offset = 0;
clib_memcpy_fast (&hdr.rmt_ip, &at->rmt_ip, sizeof (ip46_address_t));
hdr.is_ip4 = at->is_ip4;
hdr.rmt_port = at->rmt_port;
clib_memcpy_fast (&hdr.lcl_ip, &at->lcl_ip, sizeof (ip46_address_t));
hdr.lcl_port = at->lcl_port;
- rv = svm_fifo_enqueue (f, sizeof (hdr), (u8 *) & hdr);
- ASSERT (rv == sizeof (hdr));
- rv = svm_fifo_enqueue (f, actual_write, data);
+ /* *INDENT-OFF* */
+ svm_fifo_seg_t segs[2] = {{ (u8 *) &hdr, sizeof (hdr) }, { data, len }};
+ /* *INDENT-ON* */
+
+ rv = svm_fifo_enqueue_segments (f, segs, 2, 0 /* allow partial */ );
+ if (PREDICT_FALSE (rv < 0))
+ return 0;
+
if (do_evt)
{
- if (rv > 0 && svm_fifo_set_event (f))
- app_send_io_evt_to_vpp (vpp_evt_q, f->master_session_index, evt_type,
- noblock);
+ if (svm_fifo_set_event (f))
+ app_send_io_evt_to_vpp (vpp_evt_q, f->shr->master_session_index,
+ evt_type, noblock);
}
- ASSERT (rv);
- return rv;
+ return len;
}
always_inline int
if (do_evt)
{
if (rv > 0 && svm_fifo_set_event (f))
- app_send_io_evt_to_vpp (vpp_evt_q, f->master_session_index, evt_type,
- noblock);
+ app_send_io_evt_to_vpp (vpp_evt_q, f->shr->master_session_index,
+ evt_type, noblock);
}
return rv;
}
u32 wrk_index;
u64 app_event_queue_address;
u64 segment_handle;
+ u32 api_client_handle;
u8 n_fds;
u8 fd_flags;
u8 is_add;
};
} __clib_packed app_sapi_msg_t;
+static inline void
+session_endpoint_alloc_ext_cfg (session_endpoint_cfg_t *sep_ext,
+ transport_endpt_ext_cfg_type_t type)
+{
+ transport_endpt_ext_cfg_t *cfg;
+ u32 cfg_size;
+
+ cfg_size = sizeof (transport_endpt_ext_cfg_t);
+ cfg = clib_mem_alloc (cfg_size);
+ clib_memset (cfg, 0, cfg_size);
+ cfg->type = type;
+ sep_ext->ext_cfg = cfg;
+}
+
#endif /* __included_uri_h__ */
/*