10a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev/*
20a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev * Copyright (C) 2015 The Android Open Source Project
30a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev *
40a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev * Licensed under the Apache License, Version 2.0 (the "License");
50a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev * you may not use this file except in compliance with the License.
60a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev * You may obtain a copy of the License at
70a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev *
80a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev *      http://www.apache.org/licenses/LICENSE-2.0
90a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev *
100a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev * Unless required by applicable law or agreed to in writing, software
110a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev * distributed under the License is distributed on an "AS IS" BASIS,
120a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev * See the License for the specific language governing permissions and
140a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev * limitations under the License.
150a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev */
160a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
170a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev#include <stdio.h>
180a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev#include <errno.h>
190a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev#include <stdbool.h>
200a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev#include <string.h>
210a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev#include <stdlib.h>
220a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev#include <unistd.h>
230a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev#include <getopt.h>
2433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev#include <sys/uio.h>
250a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
260a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev#include <trusty/tipc.h>
270a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
280a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev#define TIPC_DEFAULT_DEVNAME "/dev/trusty-ipc-dev0"
290a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
300a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *dev_name = NULL;
310a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *test_name = NULL;
320a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
330a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *uuid_name = "com.android.ipc-unittest.srv.uuid";
340a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *echo_name = "com.android.ipc-unittest.srv.echo";
350a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *ta_only_name = "com.android.ipc-unittest.srv.ta_only";
360a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *ns_only_name = "com.android.ipc-unittest.srv.ns_only";
370a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *datasink_name = "com.android.ipc-unittest.srv.datasink";
380a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *closer1_name = "com.android.ipc-unittest.srv.closer1";
390a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *closer2_name = "com.android.ipc-unittest.srv.closer2";
400a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *closer3_name = "com.android.ipc-unittest.srv.closer3";
410a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *main_ctrl_name = "com.android.ipc-unittest.ctrl";
420a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
430a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *_sopts = "hsvD:t:r:m:b:";
440a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const struct option _lopts[] =  {
450a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	{"help",    no_argument,       0, 'h'},
460a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	{"silent",  no_argument,       0, 's'},
470a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	{"variable",no_argument,       0, 'v'},
480a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	{"dev",     required_argument, 0, 'D'},
490a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	{"repeat",  required_argument, 0, 'r'},
500a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	{"burst",   required_argument, 0, 'b'},
510a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	{"msgsize", required_argument, 0, 'm'},
520a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	{0, 0, 0, 0}
530a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev};
540a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
550a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *usage =
560a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"Usage: %s [options]\n"
570a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"\n"
580a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"options:\n"
590a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"  -h, --help            prints this message and exit\n"
600a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"  -D, --dev name        device name\n"
610a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"  -t, --test name       test to run\n"
620a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"  -r, --repeat cnt      repeat count\n"
630a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"  -m, --msgsize size    max message size\n"
640a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"  -v, --variable        variable message size\n"
650a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"  -s, --silent          silent\n"
660a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"\n"
670a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev;
680a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
690a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic const char *usage_long =
700a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"\n"
710a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"The following tests are available:\n"
720a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"   connect      - connect to datasink service\n"
730a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"   connect_foo  - connect to non existing service\n"
740a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"   burst_write  - send messages to datasink service\n"
750a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"   echo         - send/receive messages to echo service\n"
760a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"   select       - test select call\n"
770a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"   blocked_read - test blocked read\n"
780a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"   closer1      - connection closed by remote (test1)\n"
790a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"   closer2      - connection closed by remote (test2)\n"
800a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"   closer3      - connection closed by remote (test3)\n"
810a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"   ta2ta-ipc    - execute TA to TA unittest\n"
820a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"   dev-uuid     - print device uuid\n"
830a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"   ta-access    - test ta-access flags\n"
8433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev"   writev       - writev test\n"
8533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev"   readv        - readv test\n"
860a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev"\n"
870a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev;
880a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
890a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic uint opt_repeat  = 1;
900a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic uint opt_msgsize = 32;
910a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic uint opt_msgburst = 32;
920a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic bool opt_variable = false;
930a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic bool opt_silent = false;
940a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
950a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic void print_usage_and_exit(const char *prog, int code, bool verbose)
960a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
970a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	fprintf (stderr, usage, prog);
980a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (verbose)
99bccd5deee0cdf03316eb4a888a74a98c4e8c038dMichael Ryleev		fprintf (stderr, "%s", usage_long);
1000a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	exit(code);
1010a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
1020a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1030a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic void parse_options(int argc, char **argv)
1040a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
1050a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int c;
1060a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int oidx = 0;
1070a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1080a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	while (1)
1090a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	{
1100a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		c = getopt_long (argc, argv, _sopts, _lopts, &oidx);
1110a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (c == -1)
1120a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			break; /* done */
1130a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1140a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		switch (c) {
1150a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1160a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		case 'D':
1170a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			dev_name = strdup(optarg);
1180a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		break;
1190a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1200a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		case 't':
1210a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			test_name = strdup(optarg);
1220a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		break;
1230a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1240a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		case 'v':
1250a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			opt_variable = true;
1260a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		break;
1270a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1280a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		case 'r':
1290a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			opt_repeat = atoi(optarg);
1300a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		break;
1310a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1320a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		case 'm':
1330a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			opt_msgsize = atoi(optarg);
1340a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		break;
1350a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1360a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		case 'b':
1370a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			opt_msgburst = atoi(optarg);
1380a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		break;
1390a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1400a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		case 's':
1410a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			opt_silent = true;
1420a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		break;
1430a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1440a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		case 'h':
1450a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		      print_usage_and_exit(argv[0], EXIT_SUCCESS, true);
1460a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		break;
1470a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1480a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		default:
1490a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		      print_usage_and_exit(argv[0], EXIT_FAILURE, false);
1500a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
1510a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
1520a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
1530a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1540a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic int connect_test(uint repeat)
1550a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
1560a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint i;
1570a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int  echo_fd;
1580a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int  dsink_fd;
1590a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1600a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
1610a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: repeat = %u\n", __func__, repeat);
1620a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
1630a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1640a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	for (i = 0; i < repeat; i++) {
1650a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		echo_fd = tipc_connect(dev_name, echo_name);
1660a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (echo_fd < 0) {
1670a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			fprintf(stderr, "Failed to connect to '%s' service\n",
1680a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				"echo");
1690a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
1700a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		dsink_fd = tipc_connect(dev_name, datasink_name);
1710a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (dsink_fd < 0) {
1720a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			fprintf(stderr, "Failed to connect to '%s' service\n",
1730a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				"datasink");
1740a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
1750a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1760a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (echo_fd >= 0) {
1770a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			tipc_close(echo_fd);
1780a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
1790a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (dsink_fd >= 0) {
1800a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			tipc_close(dsink_fd);
1810a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
1820a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
1830a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1840a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
1850a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: done\n", __func__);
1860a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
1870a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1880a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return 0;
1890a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
1900a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1910a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic int connect_foo(uint repeat)
1920a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
1930a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint i;
1940a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int  fd;
1950a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
1960a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
1970a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: repeat = %u\n", __func__, repeat);
1980a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
1990a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2000a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	for (i = 0; i < repeat; i++) {
2010a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fd = tipc_connect(dev_name, "foo");
2020a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (fd >= 0) {
2030a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			fprintf(stderr, "succeeded to connect to '%s' service\n",
2040a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				"foo");
2050a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			tipc_close(fd);
2060a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
2070a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
2080a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2090a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
2100a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: done\n", __func__);
2110a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
2120a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2130a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return 0;
2140a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
2150a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2160a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2170a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic int closer1_test(uint repeat)
2180a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
2190a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint i;
2200a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int  fd;
2210a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2220a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
2230a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: repeat = %u\n", __func__, repeat);
2240a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
2250a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2260a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	for (i = 0; i < repeat; i++) {
2270a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fd = tipc_connect(dev_name, closer1_name);
2280a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (fd < 0) {
2290a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			fprintf(stderr, "Failed to connect to '%s' service\n",
2300a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				"closer1");
2310a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			continue;
2320a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
2330a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (!opt_silent) {
2340a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			printf("%s: connected\n", __func__);
2350a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
2360a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		tipc_close(fd);
2370a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
2380a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2390a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
2400a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: done\n", __func__);
2410a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
2420a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2430a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return 0;
2440a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
2450a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2460a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic int closer2_test(uint repeat)
2470a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
2480a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint i;
2490a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int  fd;
2500a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2510a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
2520a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: repeat = %u\n", __func__, repeat);
2530a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
2540a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2550a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	for (i = 0; i < repeat; i++) {
2560a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fd = tipc_connect(dev_name, closer2_name);
2570a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (fd < 0) {
2580a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			if (!opt_silent) {
2590a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				printf("failed to connect to '%s' service\n", "closer2");
2600a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			}
2610a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		} else {
2620a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			/* this should always fail */
2630a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			fprintf(stderr, "connected to '%s' service\n", "closer2");
2640a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			tipc_close(fd);
2650a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
2660a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
2670a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2680a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
2690a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: done\n", __func__);
2700a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
2710a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2720a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return 0;
2730a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
2740a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2750a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic int closer3_test(uint repeat)
2760a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
2770a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint i, j;
2780a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	ssize_t rc;
2790a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int  fd[4];
2800a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	char buf[64];
2810a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2820a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
2830a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: repeat = %u\n", __func__, repeat);
2840a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
2850a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2860a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	for (i = 0; i < repeat; i++) {
2870a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
2880a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		/* open 4 connections to closer3 service */
2890a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		for (j = 0; j < 4; j++) {
2900a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			fd[j] = tipc_connect(dev_name, closer3_name);
2910a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			if (fd[j] < 0) {
2920a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				fprintf(stderr, "fd[%d]: failed to connect to '%s' service\n", j, "closer3");
2930a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			} else {
2940a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				if (!opt_silent) {
2950a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev					printf("%s: fd[%d]=%d: connected\n", __func__, j, fd[j]);
2960a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				}
2970a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				memset(buf, i + j, sizeof(buf));
2980a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				rc = write(fd[j], buf, sizeof(buf));
2990a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				if (rc != sizeof(buf)) {
3000a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev					if (!opt_silent) {
3010a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev						printf("%s: fd[%d]=%d: write returned  = %zd\n",
3020a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev							__func__, j, fd[j], rc);
3030a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev					}
3040a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev					perror("closer3_test: write");
3050a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				}
3060a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			}
3070a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
3080a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3090a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		/* sleep a bit */
3100a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		sleep(1);
3110a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3120a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		/* It is expected that they will be closed by remote */
3130a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		for (j = 0; j < 4; j++) {
3140a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			if (fd[j] < 0)
3150a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				continue;
3160a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			rc = write(fd[j], buf, sizeof(buf));
3170a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			if (rc != sizeof(buf)) {
3180a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				if (!opt_silent) {
3190a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev					printf("%s: fd[%d]=%d: write returned = %zd\n",
3200a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev						__func__, j, fd[j], rc);
3210a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				}
3220a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				perror("closer3_test: write");
3230a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			}
3240a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
3250a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3260a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		/* then they have to be closed by remote */
3270a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		for (j = 0; j < 4; j++) {
3280a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			if (fd[j] >= 0) {
3290a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				tipc_close(fd[j]);
3300a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			}
3310a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
3320a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
3330a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3340a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
3350a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: done\n", __func__);
3360a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
3370a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3380a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return 0;
3390a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
3400a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3410a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3420a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic int echo_test(uint repeat, uint msgsz, bool var)
3430a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
3440a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint i;
3450a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	ssize_t rc;
3460a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	size_t  msg_len;
3470a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int  echo_fd =-1;
3480a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	char tx_buf[msgsz];
3490a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	char rx_buf[msgsz];
3500a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3510a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
3520a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: repeat %u: msgsz %u: variable %s\n",
3530a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			__func__, repeat, msgsz, var ? "true" : "false");
3540a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
3550a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3560a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	echo_fd = tipc_connect(dev_name, echo_name);
3570a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (echo_fd < 0) {
3580a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fprintf(stderr, "Failed to connect to service\n");
3590a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		return echo_fd;
3600a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
3610a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3620a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	for (i = 0; i < repeat; i++) {
3630a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3640a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		msg_len = msgsz;
3650a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (opt_variable && msgsz) {
3660a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			msg_len = rand() % msgsz;
3670a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
3680a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3690a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		memset(tx_buf, i + 1, msg_len);
3700a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3710a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = write(echo_fd, tx_buf, msg_len);
3720a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if ((size_t)rc != msg_len) {
3730a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			perror("echo_test: write");
3740a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			break;
3750a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
3760a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3770a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = read(echo_fd, rx_buf, msg_len);
3780a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (rc < 0) {
3790a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			perror("echo_test: read");
3800a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			break;
3810a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
3820a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3830a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if ((size_t)rc != msg_len) {
3840a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			fprintf(stderr, "data truncated (%zu vs. %zu)\n",
3850a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			                 rc, msg_len);
3860a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			continue;
3870a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
3880a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3890a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (memcmp(tx_buf, rx_buf, (size_t) rc)) {
3900a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			fprintf(stderr, "data mismatch\n");
3910a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			continue;
3920a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
3930a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
3940a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3950a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	tipc_close(echo_fd);
3960a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
3970a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
3980a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: done\n",__func__);
3990a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
4000a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4010a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return 0;
4020a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
4030a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4040a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic int burst_write_test(uint repeat, uint msgburst, uint msgsz, bool var)
4050a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
4060a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int fd;
4070a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint i, j;
4080a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	ssize_t rc;
4090a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	size_t  msg_len;
4100a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	char tx_buf[msgsz];
4110a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4120a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
4130a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: repeat %u: burst %u: msgsz %u: variable %s\n",
4140a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			__func__, repeat, msgburst, msgsz,
4150a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			var ? "true" : "false");
4160a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
4170a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4180a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	for (i = 0; i < repeat; i++) {
4190a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4200a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fd = tipc_connect(dev_name, datasink_name);
4210a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (fd < 0) {
4220a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			fprintf(stderr, "Failed to connect to '%s' service\n",
4230a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				"datasink");
4240a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			break;
4250a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
4260a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4270a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		for (j = 0; j < msgburst; j++) {
4280a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			msg_len = msgsz;
4290a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			if (var && msgsz) {
4300a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				msg_len = rand() % msgsz;
4310a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			}
4320a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4330a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			memset(tx_buf, i + 1, msg_len);
4340a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			rc = write(fd, tx_buf, msg_len);
4350a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			if ((size_t)rc != msg_len) {
4360a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				perror("burst_test: write");
4370a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				break;
4380a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			}
4390a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
4400a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4410a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		tipc_close(fd);
4420a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
4430a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4440a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
4450a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: done\n",__func__);
4460a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
4470a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4480a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return 0;
4490a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
4500a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4510a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4520a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic int _wait_for_msg(int fd, uint msgsz, int timeout)
4530a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
4540a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int rc;
4550a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	fd_set rfds;
4560a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint msgcnt = 0;
4570a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	char rx_buf[msgsz];
4580a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	struct timeval tv;
4590a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4600a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
4610a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("waiting (%d) for msg\n", timeout);
4620a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
4630a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4640a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	FD_ZERO(&rfds);
4650a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	FD_SET(fd, &rfds);
4660a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4670a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	tv.tv_sec = timeout;
4680a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	tv.tv_usec = 0;
4690a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4700a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	for(;;) {
4710a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = select(fd+1, &rfds, NULL, NULL, &tv);
4720a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4730a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (rc == 0) {
4740a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			if (!opt_silent) {
4750a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				printf("select timedout\n");
4760a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			}
4770a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			break;
4780a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
4790a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4800a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (rc == -1) {
4810a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			perror("select_test: select");
4820a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			return rc;
4830a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
4840a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4850a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = read(fd, rx_buf, sizeof(rx_buf));
4860a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (rc < 0) {
4870a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			perror("select_test: read");
4880a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			return rc;
4890a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		} else {
4900a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			if (rc > 0) {
4910a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				msgcnt++;
4920a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			}
4930a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
4940a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
4950a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
4960a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
4970a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("got %u messages\n", msgcnt);
4980a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
4990a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5000a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return 0;
5010a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
5020a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5030a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5040a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic int select_test(uint repeat, uint msgburst, uint msgsz)
5050a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
5060a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int fd;
5070a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint i, j;
5080a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	ssize_t rc;
5090a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	char tx_buf[msgsz];
5100a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5110a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
5120a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: repeat %u\n", __func__, repeat);
5130a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
5140a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5150a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	fd = tipc_connect(dev_name, echo_name);
5160a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (fd < 0) {
5170a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fprintf(stderr, "Failed to connect to '%s' service\n",
5180a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			"echo");
5190a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		return fd;
5200a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
5210a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5220a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	for (i = 0; i < repeat; i++) {
5230a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5240a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		_wait_for_msg(fd, msgsz, 1);
5250a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5260a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (!opt_silent) {
5270a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			printf("sending burst: %u msg\n", msgburst);
5280a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
5290a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5300a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		for (j = 0; j < msgburst; j++) {
5310a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			memset(tx_buf, i + j, msgsz);
5320a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			rc = write(fd, tx_buf, msgsz);
5330a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			if ((size_t)rc != msgsz) {
5340a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				perror("burst_test: write");
5350a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				break;
5360a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			}
5370a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
5380a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
5390a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5400a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	tipc_close(fd);
5410a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5420a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
5430a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: done\n",__func__);
5440a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
5450a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5460a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return 0;
5470a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
5480a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5490a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic int blocked_read_test(uint repeat)
5500a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
5510a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int fd;
5520a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint i;
5530a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	ssize_t rc;
5540a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	char rx_buf[512];
5550a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5560a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
5570a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: repeat %u\n", __func__, repeat);
5580a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
5590a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5600a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	fd = tipc_connect(dev_name, echo_name);
5610a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (fd < 0) {
5620a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fprintf(stderr, "Failed to connect to '%s' service\n",
5630a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			"echo");
5640a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		return fd;
5650a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
5660a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5670a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	for (i = 0; i < repeat; i++) {
5680a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = read(fd, rx_buf, sizeof(rx_buf));
5690a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		if (rc < 0) {
5700a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			perror("select_test: read");
5710a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			break;
5720a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		} else {
5730a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			if (!opt_silent) {
5740a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev				printf("got %zd bytes\n", rc);
5750a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			}
5760a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		}
5770a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
5780a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5790a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	tipc_close(fd);
5800a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5810a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
5820a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: done\n",__func__);
5830a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
5840a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5850a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return 0;
5860a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
5870a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5880a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic int ta2ta_ipc_test(void)
5890a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
5900a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int fd;
5910a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	char rx_buf[64];
5920a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5930a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
5940a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s:\n", __func__);
5950a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
5960a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
5970a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	fd = tipc_connect(dev_name, main_ctrl_name);
5980a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (fd < 0) {
5990a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fprintf(stderr, "Failed to connect to '%s' service\n",
6000a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			"main_ctrl");
6010a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		return fd;
6020a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
6030a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6040a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	/* wait for test to complete */
6050a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	(void) read(fd, rx_buf, sizeof(rx_buf));
6060a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6070a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	tipc_close(fd);
6080a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6090a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return 0;
6100a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
6110a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6120a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevtypedef struct uuid
6130a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
6140a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint32_t time_low;
6150a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint16_t time_mid;
6160a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint16_t time_hi_and_version;
6170a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uint8_t clock_seq_and_node[8];
6180a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev} uuid_t;
6190a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6200a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic void print_uuid(const char *dev, uuid_t *uuid)
6210a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
6220a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	printf("%s:", dev);
6230a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	printf("uuid: %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n",
6240a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	       uuid->time_low,
6250a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	       uuid->time_mid,
6260a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	       uuid->time_hi_and_version,
6270a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	       uuid->clock_seq_and_node[0],
6280a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	       uuid->clock_seq_and_node[1],
6290a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	       uuid->clock_seq_and_node[2],
6300a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	       uuid->clock_seq_and_node[3],
6310a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	       uuid->clock_seq_and_node[4],
6320a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	       uuid->clock_seq_and_node[5],
6330a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	       uuid->clock_seq_and_node[6],
6340a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	       uuid->clock_seq_and_node[7]
6350a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	       );
6360a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
6370a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6380a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic int dev_uuid_test(void)
6390a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
6400a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int fd;
6410a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	ssize_t rc;
6420a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	uuid_t uuid;
6430a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6440a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	fd = tipc_connect(dev_name, uuid_name);
6450a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (fd < 0) {
6460a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fprintf(stderr, "Failed to connect to '%s' service\n",
6470a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			"uuid");
6480a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		return fd;
6490a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
6500a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6510a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	/* wait for test to complete */
6520a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	rc = read(fd, &uuid, sizeof(uuid));
6530a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (rc < 0) {
6540a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		perror("dev_uuid_test: read");
6550a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else if (rc != sizeof(uuid)) {
6560a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fprintf(stderr, "unexpected uuid size (%d vs. %d)\n",
6570a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			(int)rc, (int)sizeof(uuid));
6580a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else {
6590a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		print_uuid(dev_name, &uuid);
6600a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
6610a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6620a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	tipc_close(fd);
6630a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6640a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return 0;
6650a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
6660a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6670a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevstatic int ta_access_test(void)
6680a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
6690a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int fd;
6700a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6710a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
6720a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s:\n", __func__);
6730a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
6740a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6750a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	fd = tipc_connect(dev_name, ta_only_name);
6760a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (fd >= 0) {
6770a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fprintf(stderr, "Succeed to connect to '%s' service\n",
6780a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			"ta_only");
6790a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		tipc_close(fd);
6800a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
6810a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6820a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	fd = tipc_connect(dev_name, ns_only_name);
6830a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (fd < 0) {
6840a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fprintf(stderr, "Failed to connect to '%s' service\n",
6850a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev			"ns_only");
6860a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		return fd;
6870a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
6880a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	tipc_close(fd);
6890a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6900a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!opt_silent) {
6910a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		printf("%s: done\n",__func__);
6920a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
6930a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6940a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return 0;
6950a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
6960a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
6970a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
69833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleevstatic int writev_test(uint repeat, uint msgsz, bool var)
69933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev{
70033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	uint i;
70133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	ssize_t rc;
70233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	size_t  msg_len;
70333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	int  echo_fd = -1;
70433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	char tx0_buf[msgsz];
70533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	char tx1_buf[msgsz];
70633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	char rx_buf [msgsz];
70733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	struct iovec iovs[2]= {{tx0_buf, 0}, {tx1_buf, 0}};
70833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
70933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	if (!opt_silent) {
71033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		printf("%s: repeat %u: msgsz %u: variable %s\n",
71133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			__func__, repeat, msgsz, var ? "true" : "false");
71233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	}
71333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
71433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	echo_fd = tipc_connect(dev_name, echo_name);
71533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	if (echo_fd < 0) {
71633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		fprintf(stderr, "Failed to connect to service\n");
71733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		return echo_fd;
71833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	}
71933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
72033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	for (i = 0; i < repeat; i++) {
72133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
72233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		msg_len = msgsz;
72333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if (opt_variable && msgsz) {
72433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			msg_len = rand() % msgsz;
72533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
72633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
72733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		iovs[0].iov_len = msg_len / 3;
72833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		iovs[1].iov_len = msg_len - iovs[0].iov_len;
72933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
73033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		memset(tx0_buf, i + 1, iovs[0].iov_len);
73133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		memset(tx1_buf, i + 2, iovs[1].iov_len);
73233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		memset(rx_buf,  i + 3, sizeof(rx_buf));
73333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
73433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		rc = writev(echo_fd, iovs, 2);
73533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if (rc < 0) {
73633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			perror("writev_test: writev");
73733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			break;
73833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
73933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
74033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if ((size_t)rc != msg_len) {
74133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			fprintf(stderr,
74233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev				"%s: %s: data size mismatch (%zd vs. %zd)\n",
74333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev				__func__, "writev", (size_t)rc, msg_len);
74433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			break;
74533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
74633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
74733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		rc = read(echo_fd, rx_buf, sizeof(rx_buf));
74833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if (rc < 0) {
74933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			perror("writev_test: read");
75033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			break;
75133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
75233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
75333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if ((size_t)rc != msg_len) {
75433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			fprintf(stderr,
75533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev				"%s: %s: data size mismatch (%zd vs. %zd)\n",
75633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev				__func__, "read", (size_t)rc, msg_len);
75733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			break;
75833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
75933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
76033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if (memcmp(tx0_buf, rx_buf, iovs[0].iov_len)) {
76133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			fprintf(stderr, "%s: data mismatch: buf 0\n", __func__);
76233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			break;
76333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
76433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
76533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if (memcmp(tx1_buf, rx_buf + iovs[0].iov_len, iovs[1].iov_len)) {
76633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			fprintf(stderr, "%s: data mismatch, buf 1\n", __func__);
76733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			break;
76833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
76933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	}
77033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
77133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	tipc_close(echo_fd);
77233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
77333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	if (!opt_silent) {
77433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		printf("%s: done\n",__func__);
77533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	}
77633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
77733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	return 0;
77833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev}
77933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
78033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleevstatic int readv_test(uint repeat, uint msgsz, bool var)
78133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev{
78233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	uint i;
78333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	ssize_t rc;
78433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	size_t  msg_len;
78533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	int  echo_fd = -1;
78633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	char tx_buf [msgsz];
78733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	char rx0_buf[msgsz];
78833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	char rx1_buf[msgsz];
78933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	struct iovec iovs[2]= {{rx0_buf, 0}, {rx1_buf, 0}};
79033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
79133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	if (!opt_silent) {
79233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		printf("%s: repeat %u: msgsz %u: variable %s\n",
79333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			__func__, repeat, msgsz, var ? "true" : "false");
79433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	}
79533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
79633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	echo_fd = tipc_connect(dev_name, echo_name);
79733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	if (echo_fd < 0) {
79833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		fprintf(stderr, "Failed to connect to service\n");
79933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		return echo_fd;
80033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	}
80133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
80233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	for (i = 0; i < repeat; i++) {
80333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
80433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		msg_len = msgsz;
80533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if (opt_variable && msgsz) {
80633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			msg_len = rand() % msgsz;
80733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
80833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
80933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		iovs[0].iov_len = msg_len / 3;
81033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		iovs[1].iov_len = msg_len - iovs[0].iov_len;
81133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
81233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		memset(tx_buf,  i + 1, sizeof(tx_buf));
81333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		memset(rx0_buf, i + 2, iovs[0].iov_len);
81433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		memset(rx1_buf, i + 3, iovs[1].iov_len);
81533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
81633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		rc = write(echo_fd, tx_buf, msg_len);
81733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if (rc < 0) {
81833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			perror("readv_test: write");
81933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			break;
82033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
82133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
82233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if ((size_t)rc != msg_len) {
82333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			fprintf(stderr,
82433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev				"%s: %s: data size mismatch (%zd vs. %zd)\n",
82533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev				__func__, "write", (size_t)rc, msg_len);
82633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			break;
82733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
82833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
82933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		rc = readv(echo_fd, iovs, 2);
83033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if (rc < 0) {
83133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			perror("readv_test: readv");
83233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			break;
83333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
83433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
83533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if ((size_t)rc != msg_len) {
83633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			fprintf(stderr,
83733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev				"%s: %s: data size mismatch (%zd vs. %zd)\n",
83833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev				__func__, "write", (size_t)rc, msg_len);
83933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			break;
84033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
84133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
84233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if (memcmp(rx0_buf, tx_buf, iovs[0].iov_len)) {
84333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			fprintf(stderr, "%s: data mismatch: buf 0\n", __func__);
84433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			break;
84533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
84633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
84733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		if (memcmp(rx1_buf, tx_buf + iovs[0].iov_len, iovs[1].iov_len)) {
84833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			fprintf(stderr, "%s: data mismatch, buf 1\n", __func__);
84933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev			break;
85033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		}
85133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	}
85233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
85333275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	tipc_close(echo_fd);
85433275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
85533275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	if (!opt_silent) {
85633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		printf("%s: done\n",__func__);
85733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	}
85833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
85933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	return 0;
86033275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev}
86133275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
86233275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev
8630a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleevint main(int argc, char **argv)
8640a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev{
8650a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	int rc = 0;
8660a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
8670a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (argc <= 1) {
8680a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		print_usage_and_exit(argv[0], EXIT_FAILURE, false);
8690a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
8700a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
8710a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	parse_options(argc, argv);
8720a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
8730a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!dev_name) {
8740a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		dev_name = TIPC_DEFAULT_DEVNAME;
8750a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
8760a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
8770a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (!test_name) {
8780a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fprintf(stderr, "need a Test to run\n");
8790a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		print_usage_and_exit(argv[0], EXIT_FAILURE, true);
8800a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
8810a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
8820a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	if (strcmp(test_name, "connect") == 0) {
8830a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = connect_test(opt_repeat);
8840a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else if (strcmp(test_name, "connect_foo") == 0) {
8850a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = connect_foo(opt_repeat);
8860a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else if (strcmp(test_name, "burst_write") == 0) {
8870a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = burst_write_test(opt_repeat, opt_msgburst, opt_msgsize, opt_variable);
8880a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else if (strcmp(test_name, "select") == 0) {
8890a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = select_test(opt_repeat, opt_msgburst,  opt_msgsize);
8900a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else if (strcmp(test_name, "blocked_read") == 0) {
8910a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = blocked_read_test(opt_repeat);
8920a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else if (strcmp(test_name, "closer1") == 0) {
8930a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = closer1_test(opt_repeat);
8940a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else if (strcmp(test_name, "closer2") == 0) {
8950a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = closer2_test(opt_repeat);
8960a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else if (strcmp(test_name, "closer3") == 0) {
8970a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = closer3_test(opt_repeat);
8980a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else if (strcmp(test_name, "echo") == 0) {
8990a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = echo_test(opt_repeat, opt_msgsize, opt_variable);
9000a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else if(strcmp(test_name, "ta2ta-ipc") == 0) {
9010a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = ta2ta_ipc_test();
9020a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else if (strcmp(test_name, "dev-uuid") == 0) {
9030a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = dev_uuid_test();
9040a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else if (strcmp(test_name, "ta-access") == 0) {
9050a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		rc = ta_access_test();
90633275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	} else if (strcmp(test_name, "writev") == 0) {
90733275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		rc = writev_test(opt_repeat, opt_msgsize, opt_variable);
90833275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev	} else if (strcmp(test_name, "readv") == 0) {
90933275cdd95d18575d6d906898ade7442d38c4c8cMichael Ryleev		rc = readv_test(opt_repeat, opt_msgsize, opt_variable);
9100a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	} else {
9110a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		fprintf(stderr, "Unrecognized test name '%s'\n", test_name);
9120a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev		print_usage_and_exit(argv[0], EXIT_FAILURE, true);
9130a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	}
9140a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev
9150a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev	return rc == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
9160a72ad9a1d33c4247cd7d8a3a4d2e93d101cbf6fMichael Ryleev}
917