27 #include <sys/socket.h> 28 #ifdef HAVE_NETINET_IN_H 29 # include <netinet/in.h> 31 #include <arpa/inet.h> 75 .px_3part_addr =
false,
90 struct in_addr ipaddr;
93 if (inet_aton(hostname, &ipaddr) == 0) {
99 rc = gethostbyname_r(hostname, &he, he_buf,
sizeof he_buf,
102 fprintf(stderr,
"Can't get address for %s\n",
106 for (
i = 0; hp->h_addr_list[
i] !=
NULL; ++
i)
108 if (hp->h_addrtype == AF_INET &&
109 hp->h_length ==
sizeof(ipaddr))
111 if (hp->h_addr_list[
i] ==
NULL) {
112 fprintf(stderr,
"No IPv4 address for %s\n",
114 return -EPFNOSUPPORT;
116 if (inet_ntop(hp->h_addrtype, hp->h_addr,
buf, bufsiz) ==
118 fprintf(stderr,
"Cannot parse network address for %s\n",
123 if (strlen(hostname) >= bufsiz) {
124 fprintf(stderr,
"Buffer size too small for %s\n",
128 strcpy(
buf, hostname);
138 if (strcmp(xprt_name,
xprts[
i].px_xprt->nx_name) == 0) {
149 fprintf(
s,
"Supported transports:\n");
151 fprintf(
s,
" %s%s\n",
xprts[
i].px_xprt->nx_name,
152 (&
xprts[
i] == def) ?
" [default]" :
"");
174 "%5s %6lu %6lu %6lu %6lu %13s %14lu %13lu\n";
176 "Queue #Add #Del #Succ #Fail Time in Queue Total Bytes Max Buffer Sz\n" 177 "----- ------ ------ ------ ------ ------------- --------------- -------------\n";
184 ctx->pc_ops->pf(
"%s statistics:\n",
ctx->pc_ident);
185 ctx->pc_ops->pf(
"%s", hfmt);
194 sprintf(tbuf,
"%02lu:%02lu:%02lu.%03lu",
196 ctx->pc_ops->pf(lfmt,
241 .pc_xprt =
params->xprt->px_xprt,
242 .pc_hostname =
params->local_host,
243 .pc_rhostname =
params->remote_host,
245 .pc_nr_bufs =
params->nr_bufs,
248 .pc_passive_size =
params->passive_size,
253 .pc_passive_bulk_timeout =
params->passive_bulk_timeout,
256 if (
params->xprt->px_3part_addr) {
259 sprintf(ident,
"Client %d:%d",
cctx.pc_port,
cctx.pc_id);
265 sprintf(ident,
"Client %d",
cctx.pc_port);
277 if (
params->passive_size != 0) {
280 for (
i = 0;
i <
params->passive_size - 1; ++
i)
281 bp[
i] =
"abcdefghi"[
i % 9];
285 cctx.pc_ops->pf(
"%s: Loop %d\n", ident,
i);
304 int main(
int argc,
char *argv[])
310 const char *local_name =
"localhost";
311 const char *remote_name =
"localhost";
317 int passive_size = 0;
318 int passive_bulk_timeout = 0;
324 char local_hostbuf[16];
325 char remote_hostbuf[16];
334 LAMBDA(
void, (
const char *str) {
335 local_name = str; })),
337 LAMBDA(
void, (
const char *str) {
338 remote_name = str; })),
339 M0_FORMATARG(
'p',
"base client port",
"%i", &base_port),
347 "list supported transports.",
348 LAMBDA(
void, (
const char *str) {
349 xprt_name = str; })),
356 if (strcmp(xprt_name,
"list") == 0) {
362 fprintf(stderr,
"Unknown transport-name.\n");
368 "Transport %s does not support client or server only\n",
373 fprintf(stderr,
"Max of %d client threads supported\n",
378 fprintf(stderr,
"Minimum of %d buffers required\n",
DEF_BUFS);
381 if (passive_size < 0 || passive_size >
384 fprintf(stderr,
"Max supported passive data size: %d\n",
390 if (base_port == 0) {
392 base_port =
xprt->px_client_port;
396 if (
canon_host(local_name, local_hostbuf,
sizeof local_hostbuf) != 0)
398 if (
canon_host(remote_name, remote_hostbuf,
sizeof remote_hostbuf) != 0)
414 if (
xprt->px_3part_addr)
430 char readbuf[BUFSIZ];
432 printf(
"Type \"quit\" or ^D to cause server to terminate\n");
433 while (fgets(readbuf, BUFSIZ, stdin)) {
434 if (strcmp(readbuf,
"quit\n") == 0)
436 if (strcmp(readbuf,
"\n") == 0)
438 if (strcmp(readbuf,
"reset_stats\n") == 0)
457 params[
i].local_host = local_hostbuf;
458 params[
i].remote_host = remote_hostbuf;
472 if (
xprt->px_3part_addr)
473 printf(
"Client %d:%d: joined\n",
476 printf(
"Client %d: joined\n",
#define M0_GETOPTS(progname, argc, argv,...)
void ping_server(struct ping_ctx *ctx)
int(* pf)(const char *format,...) __attribute__((format(printf
uint64_t nqs_num_f_events
#define M0_ALLOC_ARR(arr, nr)
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
m0_time_t nqs_time_in_queue
static struct m0_thread server_thread
uint64_t nqs_num_s_events
#define M0_FLAGARG(ch, desc, ptr)
struct ping_ops quiet_ops
const struct ping_ops * pc_ops
int m0_thread_join(struct m0_thread *q)
M0_INTERNAL int m0_net_tm_stats_get(struct m0_net_transfer_mc *tm, enum m0_net_queue_type qtype, struct m0_net_qstats *qs, bool reset)
uint64_t m0_time_nanoseconds(const m0_time_t time)
enum m0_net_tm_state ntm_state
static struct m0_rpc_client_ctx cctx
#define M0_THREAD_INIT(thread, TYPE, init, func, arg, namefmt,...)
int ping_client_fini(struct ping_ctx *ctx, struct m0_net_end_point *server_ep)
int m0_init(struct m0 *instance)
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
M0_INTERNAL void m0_cond_init(struct m0_cond *cond, struct m0_mutex *mutex)
int ping_client_init(struct ping_ctx *ctx, struct m0_net_end_point **server_ep)
static int active_bulk_delay
int ping_client_passive_recv(struct ping_ctx *ctx, struct m0_net_end_point *server_ep)
#define M0_STRINGARG(ch, desc, func)
static struct nlx_ping_client_params * params
int quiet_printf(const char *fmt,...)
#define M0_FORMATARG(ch, desc, fmt, ptr)
void client(struct client_params *params)
M0_INTERNAL void m0_cond_fini(struct m0_cond *cond)
const struct m0_net_xprt * px_xprt
void print_qstats(struct ping_ctx *ctx, bool reset)
struct m0_net_transfer_mc pc_tm
char * fmt(const char *format,...) __attribute__((format(printf
void * m0_alloc(size_t size)
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
struct ping_xprt xprts[1]
struct m0_mutex qstats_mutex
uint64_t m0_time_seconds(const m0_time_t time)
int canon_host(const char *hostname, char *buf, size_t bufsiz)
int ping_client_passive_send(struct ping_ctx *ctx, struct m0_net_end_point *server_ep, const char *data)
void list_xprt_names(FILE *s, struct ping_xprt *def)
static uint8_t fail[DATA_UNIT_COUNT_MAX+PARITY_UNIT_COUNT_MAX]
static long long min(long long a, long long b)
int lookup_xprt(const char *xprt_name, struct ping_xprt **xprt)
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
static struct m0_thread * client_thread
void ping_server_should_stop(struct ping_ctx *ctx)
int main(int argc, char *argv[])
static struct bulkio_params * bp
const struct m0_net_xprt * pc_xprt
struct m0_net_xprt * xprt
int ping_client_msg_send_recv(struct ping_ctx *ctx, struct m0_net_end_point *server_ep, const char *data)
static struct m0_addb2_source * s
struct ping_ops verbose_ops
const struct m0_net_xprt m0_net_bulk_mem_xprt