#undef vl_printfun
#define TIMEOUT 10.0
+#define LOGGING_BATCH (100)
+#define LOG_EVERY_N_IDLE_CYCLES (1e8)
+#define ECHO_MQ_SEG_HANDLE ((u64) ~0 - 1)
#define foreach_echo_fail_code \
_(ECHO_FAIL_NONE, "ECHO_FAIL_NONE") \
_(ECHO_FAIL_1ST_PTHREAD_CREATE, "ECHO_FAIL_1ST_PTHREAD_CREATE") \
_(ECHO_FAIL_PTHREAD_CREATE, "ECHO_FAIL_PTHREAD_CREATE") \
_(ECHO_FAIL_DETACH, "ECHO_FAIL_DETACH") \
+ _(ECHO_FAIL_DEL_CERT_KEY, "ECHO_FAIL_DEL_CERT_KEY") \
_(ECHO_FAIL_MQ_PTHREAD, "ECHO_FAIL_MQ_PTHREAD") \
_(ECHO_FAIL_VL_API_APP_ATTACH, "ECHO_FAIL_VL_API_APP_ATTACH") \
_(ECHO_FAIL_VL_API_MISSING_SEGMENT_NAME, \
_(ECHO_FAIL_VL_API_UNBIND_REPLY, "ECHO_FAIL_VL_API_UNBIND_REPLY") \
_(ECHO_FAIL_SESSION_DISCONNECT, "ECHO_FAIL_SESSION_DISCONNECT") \
_(ECHO_FAIL_SESSION_RESET, "ECHO_FAIL_SESSION_RESET") \
- _(ECHO_FAIL_VL_API_TLS_CERT_ADD_REPLY, \
- "ECHO_FAIL_VL_API_TLS_CERT_ADD_REPLY") \
- _(ECHO_FAIL_VL_API_TLS_KEY_ADD_REPLY, \
- "ECHO_FAIL_VL_API_TLS_KEY_ADD_REPLY") \
+ _(ECHO_FAIL_VL_API_CERT_KEY_ADD_REPLY, \
+ "ECHO_FAIL_VL_API_CERT_KEY_ADD_REPLY") \
+ _(ECHO_FAIL_VL_API_CERT_KEY_DEL_REPLY, \
+ "ECHO_FAIL_VL_API_CERT_KEY_DEL_REPLY") \
_(ECHO_FAIL_GET_SESSION_FROM_HANDLE, \
"ECHO_FAIL_GET_SESSION_FROM_HANDLE") \
_(ECHO_FAIL_QUIC_WRONG_CONNECT, "ECHO_FAIL_QUIC_WRONG_CONNECT") \
_(ECHO_FAIL_MISSING_START_EVENT, "ECHO_FAIL_MISSING_START_EVENT") \
_(ECHO_FAIL_MISSING_END_EVENT, "ECHO_FAIL_MISSING_END_EVENT") \
_(ECHO_FAIL_TEST_ASSERT_RX_TOTAL, "ECHO_FAIL_TEST_ASSERT_RX_TOTAL") \
+ _(ECHO_FAIL_UNIDIRECTIONAL, "ECHO_FAIL_UNIDIRECTIONAL") \
_(ECHO_FAIL_TEST_ASSERT_TX_TOTAL, "ECHO_FAIL_TEST_ASSERT_TX_TOTAL") \
_(ECHO_FAIL_TEST_ASSERT_ALL_SESSIONS_CLOSED, \
- "ECHO_FAIL_TEST_ASSERT_ALL_SESSIONS_CLOSED")
+ "ECHO_FAIL_TEST_ASSERT_ALL_SESSIONS_CLOSED") \
+ _(ECHO_FAIL_RPC_SIZE, "ECHO_FAIL_RPC_SIZE")
typedef enum
{
#define CHECK_SAME(fail, expected, result, _fmt, _args...) \
do { \
if ((expected) != (result)) \
- ECHO_FAIL ((fail), "expected same (%d, got %d) : "_fmt, \
- (expected), (result), ##_args); \
+ ECHO_FAIL ((fail), "expected same (%lld, got %lld) : "_fmt, \
+ (u64)(expected), (u64)(result), ##_args); \
} while (0)
#define CHECK_DIFF(fail, expected, result, _fmt, _args...) \
do { \
if ((expected) == (result)) \
- ECHO_FAIL ((fail), "expected different (both %d) : "_fmt, \
- (expected), ##_args); \
+ ECHO_FAIL ((fail), "expected different (both %lld) : "_fmt, \
+ (u64)(expected), ##_args); \
} while (0)
#define ECHO_FAIL(fail, _fmt, _args...) \
echo_main_t *em = &echo_main; \
em->has_failed = (fail); \
if (vec_len(em->fail_descr)) \
- em->fail_descr = format(em->fail_descr, " | %s (%d): "_fmt, \
+ em->fail_descr = format(em->fail_descr, " | %s (%u): "_fmt, \
echo_fail_code_str[fail], fail, ##_args); \
else \
- em->fail_descr = format(0, "%s (%d): "_fmt, \
+ em->fail_descr = format(0, "%s (%u): "_fmt, \
echo_fail_code_str[fail], fail, ##_args); \
em->time_to_stop = 1; \
if (em->log_lvl > 0) \
clib_warning (_fmt, ##_args); \
}
-#define ECHO_REGISTER_PROTO(proto, vft) \
- static void __clib_constructor \
- vpp_echo_init_##proto () \
- { \
- echo_main_t *em = &echo_main; \
- em->available_proto_cb_vft[proto] = &vft; \
+#define ECHO_REGISTER_PROTO(proto, vft) \
+ static void __clib_constructor \
+ vpp_echo_init_##proto () \
+ { \
+ echo_main_t *em = &echo_main; \
+ vec_validate (em->available_proto_cb_vft, proto); \
+ em->available_proto_cb_vft[proto] = &vft; \
}
typedef struct
{
STATE_START,
STATE_ATTACHED_NO_CERT,
- STATE_ATTACHED_ONE_CERT,
STATE_ATTACHED,
STATE_LISTEN,
STATE_READY,
STATE_DATA_DONE,
STATE_DISCONNECTED,
+ STATE_CLEANED_CERT_KEY,
STATE_DETACHED
} connection_state_t;
typedef union session_connected_bundled_msg_
{
session_connected_msg_t *mp;
- vl_api_connect_uri_reply_t *bmp;
} session_connected_bundled_msg_t;
typedef struct echo_proto_cb_vft_
u32 s; /* stream sessions */
} teardown_stat_t;
+typedef struct echo_stats_
+{
+ u64 tx_total;
+ u64 rx_total;
+ u64 tx_expected;
+ u64 rx_expected;
+ teardown_stat_t reset_count; /* received reset from vpp */
+ teardown_stat_t close_count; /* received close from vpp */
+ teardown_stat_t active_count; /* sent close to vpp */
+ teardown_stat_t clean_count; /* cleaned up stale session */
+ teardown_stat_t connected_count; /* connected sessions count */
+ teardown_stat_t accepted_count; /* connected sessions count */
+} echo_stats_t;
+
typedef struct
{
svm_queue_t *vl_input_queue; /* vpe input queue */
u32 my_client_index; /* API client handle */
u8 *uri; /* The URI we're playing with */
+ u32 n_uris; /* Cycle through adjacent ips */
+ ip46_address_t lcl_ip; /* Local ip for client */
+ u8 lcl_ip_set;
echo_session_t *sessions; /* Session pool */
svm_msg_q_t *app_mq; /* Our receiveing event queue */
svm_msg_q_t *ctrl_mq; /* Our control queue (towards vpp) */
clib_time_t clib_time; /* For deadman timers */
u8 *socket_name;
int i_am_master;
- u32 listen_session_index; /* Index of vpp listener session */
+ u32 *listen_session_indexes; /* vec of vpp listener sessions */
+ volatile u32 listen_session_cnt;
uword *session_index_by_vpp_handles; /* Hash table : quic_echo s_id -> vpp s_handle */
clib_spinlock_t sid_vpp_handles_lock; /* Hash table lock */
uword *shared_segment_handles; /* Hash table : segment_names -> 1 */
clib_spinlock_t segment_handles_lock; /* Hash table lock */
echo_proto_cb_vft_t *proto_cb_vft;
- svm_msg_q_t *rpc_msq_queue; /* MQ between quic_echo threads */
+ svm_msg_q_t rpc_msq_queue; /* MQ between quic_echo threads */
fifo_segment_main_t segment_main;
/* State of the connection, shared between msg RX thread and main thread */
u64 bytes_to_receive; /* target per stream */
u32 fifo_size;
u32 prealloc_fifo_pairs;
- u32 rx_buf_size;
- u32 tx_buf_size;
- data_source_t data_source; /* Use no/dummy/mirrored data */
+ u64 rx_buf_size;
+ u64 tx_buf_size;
+ data_source_t data_source; /* Use no/placeholder/mirrored data */
u8 send_stream_disconnects; /* actively send disconnect */
u8 output_json; /* Output stats as JSON */
+ volatile u8 wait_for_gdb; /* Wait for gdb to attach */
u8 log_lvl; /* Verbosity of the logging */
int max_test_msg; /* Limit the number of incorrect data messages */
u32 evt_q_size; /* Size of the vpp MQ (app<->vpp events) */
- u32 crypto_ctx_engine; /* crypto engine used */
+ u32 ckpair_index; /* Cert key pair used */
+ u8 crypto_engine; /* crypto engine used */
+ u8 connect_flag; /* flags to pass to mq connect */
+ u32 periodic_stats_delta; /* seconds between periodic stats */
u8 *appns_id;
u64 appns_flags;
volatile u32 n_clients_connected; /* Number of STREAM sessions connected */
volatile u32 nxt_available_sidx; /* next unused prealloced session_index */
+ volatile int max_sim_connects;
+
/* VNET_API_ERROR_FOO -> "Foo" hash table */
uword *error_string_by_error_number;
- echo_proto_cb_vft_t *available_proto_cb_vft[TRANSPORT_N_PROTO];
+ echo_proto_cb_vft_t **available_proto_cb_vft;
- struct
- {
- u64 tx_total;
- u64 rx_total;
- teardown_stat_t reset_count; /* received reset from vpp */
- teardown_stat_t close_count; /* received close from vpp */
- teardown_stat_t active_count; /* sent close to vpp */
- teardown_stat_t clean_count; /* cleaned up stale session */
- } stats;
+ echo_stats_t stats;
+ echo_stats_t last_stat_sampling; /* copy of stats at last sampling */
+ f64 last_stat_sampling_ts;
struct /* Event based timing : start & end depend on CLI specified events */
{
extern echo_main_t echo_main;
-typedef void (*echo_rpc_t) (void *arg, u32 opaque);
+
+typedef struct echo_connect_args_
+{
+ u32 context;
+ u64 parent_session_handle;
+ ip46_address_t ip;
+ ip46_address_t lcl_ip;
+} echo_connect_args_t;
+
+typedef struct echo_disconnect_args_
+{
+ u64 session_handle;
+} echo_disconnect_args_t;
+
+typedef union
+{
+ echo_connect_args_t connect;
+ echo_disconnect_args_t disconnect;
+} echo_rpc_args_t;
+
+typedef void (*echo_rpc_t) (echo_main_t * em, echo_rpc_args_t * arg);
typedef struct
{
void *fp;
- void *arg;
- u32 opaque;
+ echo_rpc_args_t args;
} echo_rpc_msg_t;
+
u8 *format_ip4_address (u8 * s, va_list * args);
u8 *format_ip6_address (u8 * s, va_list * args);
u8 *format_ip46_address (u8 * s, va_list * args);
-uword unformat_data (unformat_input_t * input, va_list * args);
u8 *format_api_error (u8 * s, va_list * args);
void init_error_string_table ();
u8 *echo_format_session (u8 * s, va_list * args);
void echo_session_handle_add_del (echo_main_t * em, u64 handle, u32 sid);
echo_session_t *echo_session_new (echo_main_t * em);
-int echo_send_rpc (echo_main_t * em, void *fp, void *arg, u32 opaque);
+int echo_send_rpc (echo_main_t * em, void *fp, echo_rpc_args_t * args);
echo_session_t *echo_get_session_from_handle (echo_main_t * em, u64 handle);
-int wait_for_segment_allocation (u64 segment_handle);
int wait_for_state_change (echo_main_t * em, connection_state_t state,
f64 timeout);
void echo_notify_event (echo_main_t * em, echo_test_evt_t e);
void echo_session_print_stats (echo_main_t * em, echo_session_t * session);
u8 *echo_format_crypto_engine (u8 * s, va_list * args);
uword echo_unformat_crypto_engine (unformat_input_t * input, va_list * args);
+u8 *echo_format_bytes_per_sec (u8 * s, va_list * args);
+int echo_segment_attach (u64 segment_handle, char *name,
+ ssvm_segment_type_t type, int fd);
+u32 echo_segment_lookup (u64 segment_handle);
+void echo_segment_detach (u64 segment_handle);
+int echo_attach_session (uword segment_handle, uword rxf_offset,
+ uword mq_offset, uword txf_offset, echo_session_t *s);
+int echo_segment_attach_mq (uword segment_handle, uword mq_offset,
+ u32 mq_index, svm_msg_q_t **mq);
/* Binary API */
void echo_send_attach (echo_main_t * em);
void echo_send_detach (echo_main_t * em);
-void echo_send_listen (echo_main_t * em);
+void echo_send_listen (echo_main_t * em, ip46_address_t * ip);
void echo_send_unbind (echo_main_t * em, echo_session_t * s);
-void echo_send_connect (u64 vpp_session_handle, u32 opaque);
-void echo_send_disconnect_session (u64 handle, u32 opaque);
+void echo_send_connect (echo_main_t * em, void *args);
+void echo_send_disconnect_session (echo_main_t * em, void *args);
void echo_api_hookup (echo_main_t * em);
-void echo_send_add_crypto_ctx (echo_main_t * em);
+void echo_send_add_cert_key (echo_main_t * em);
+void echo_send_del_cert_key (echo_main_t * em);
#endif /* __included_vpp_echo_common_h__ */