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