summaryrefslogtreecommitdiffstats
path: root/usr.sbin/i4b/isdntest/main.c
diff options
context:
space:
mode:
authorbz <bz@FreeBSD.org>2008-05-26 10:40:09 +0000
committerbz <bz@FreeBSD.org>2008-05-26 10:40:09 +0000
commit6bba9b42448c966b4d7425ab0ca6f86f26564fb5 (patch)
treece6d26c22aa5ab44c23fab794efd22c6b5bc9c39 /usr.sbin/i4b/isdntest/main.c
parentcf7fbdd9301f7a93d32de3e79370507fa46278c6 (diff)
downloadFreeBSD-src-6bba9b42448c966b4d7425ab0ca6f86f26564fb5.zip
FreeBSD-src-6bba9b42448c966b4d7425ab0ca6f86f26564fb5.tar.gz
Remove ISDN4BSD (I4B) from HEAD as it is not MPSAFE and
parts relied on the now removed NET_NEEDS_GIANT. Most of I4B has been disconnected from the build since July 2007 in HEAD/RELENG_7. This is what was removed: - configuration in /etc/isdn - examples - man pages - kernel configuration - sys/i4b (drivers, layers, include files) - user space tools - i4b support from ppp - further documentation Discussed with: rwatson, re
Diffstat (limited to 'usr.sbin/i4b/isdntest/main.c')
-rw-r--r--usr.sbin/i4b/isdntest/main.c745
1 files changed, 0 insertions, 745 deletions
diff --git a/usr.sbin/i4b/isdntest/main.c b/usr.sbin/i4b/isdntest/main.c
deleted file mode 100644
index 08c7b89..0000000
--- a/usr.sbin/i4b/isdntest/main.c
+++ /dev/null
@@ -1,745 +0,0 @@
-/*
- * Copyright (c) 1997, 1999 Hellmuth Michaelis. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- *---------------------------------------------------------------------------
- *
- * main.c - i4b selftest utility
- * -----------------------------
- *
- * $Id: main.c,v 1.16 2000/03/13 16:18:38 hm Exp $
- *
- * $FreeBSD$
- *
- * last edit-date: [Sat May 13 16:50:38 2006]
- *
- *---------------------------------------------------------------------------*/
-
-#include <stdio.h>
-#include <signal.h>
-#include <errno.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <ctype.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/time.h>
-
-#include <i4b/i4b_ioctl.h>
-#include <i4b/i4b_cause.h>
-
-static void kbdrdhdl ( void );
-static void isdnrdhdl (int isdnfd );
-
-void handle_connect_ind(unsigned char *ptr);
-void handle_disconnect(unsigned char *ptr);
-void handle_connect_active_ind(unsigned char *ptr);
-
-int connect_response(int isdnfd, unsigned int cdid, int response);
-int disconnect_request(int isdnfd, unsigned int cdid);
-unsigned int get_cdid(int isdnfd);
-int connect_request(int isdnfd, unsigned int cdid);
-int do_test(void);
-static void cleanup(void);
-static void usage(void);
-void setup_wrfix(int len, unsigned char *buf);
-int check_rd(int len, unsigned char *wbuf, unsigned char *rdbuf);
-
-static int isdnfd;
-char outgoingnumber[32];
-char incomingnumber[32];
-int debug_level = 0;
-
-#define I4BDEVICE "/dev/i4b"
-#define DATADEV0 "/dev/i4brbch0"
-#define DATAUNIT0 0
-#define DATADEV1 "/dev/i4brbch1"
-#define DATAUNIT1 1
-
-unsigned int out_cdid = CDID_UNUSED;
-unsigned int in_cdid = CDID_UNUSED;
-
-int waitchar = 0;
-int usehdlc = 0;
-int controller = 0;
-int dotest = 0;
-
-/*---------------------------------------------------------------------------*
- * usage display and exit
- *---------------------------------------------------------------------------*/
-static void
-usage(void)
-{
- fprintf(stderr, "\n");
- fprintf(stderr, "isdntest - i4b selftest, version %d.%d.%d\n",VERSION, REL, STEP);
- fprintf(stderr, "usage: isdntest [-c ctrl] [-d level] [-h] [-i telno] [-o telno] [-t num] [-w]\n");
- fprintf(stderr, " -c <ctrl> specify controller to use\n");
- fprintf(stderr, " -d <level> set debug level\n");
- fprintf(stderr, " -h use HDLC as Bchannel protocol\n");
- fprintf(stderr, " -i <telno> incoming telephone number\n");
- fprintf(stderr, " -o <telno> outgoing telephone number\n");
- fprintf(stderr, " -t <num> send test pattern num times\n");
- fprintf(stderr, " -w wait for keyboard entry to disconnect\n");
- fprintf(stderr, "\n");
- exit(1);
-}
-
-/*---------------------------------------------------------------------------*
- * program entry
- *---------------------------------------------------------------------------*/
-int
-main(int argc, char **argv)
-{
- int i;
- int c;
- fd_set set;
- int ret;
- char *ptr;
-
- incomingnumber[0] = '\0';
- outgoingnumber[0] = '\0';
-
- while ((c = getopt(argc, argv, "c:d:hi:o:t:w")) != -1)
- {
- switch(c)
- {
- case 'c':
- if(isdigit(*optarg))
- {
- controller = strtoul(optarg, NULL, 10);
- }
- else
- {
- fprintf(stderr, "Error: option -c requires a numeric argument!\n");
- usage();
- }
- break;
-
- case 'd':
- if(isdigit(*optarg))
- {
- debug_level = strtoul(optarg, NULL, 10);
- }
- else
- {
- fprintf(stderr, "Error: option -d requires a numeric argument!\n");
- usage();
- }
- break;
-
- case 'o':
- i = 0;
- ptr = optarg;
-
- while(*ptr)
- {
- if(isdigit(*ptr))
- {
- outgoingnumber[i++] = *ptr++;
- }
- else
- {
- fprintf(stderr, "Error: option -o requires a numeric argument!\n");
- usage();
- }
- }
- outgoingnumber[i] = '\0';
- break;
-
- case 'i':
- i = 0;
- ptr = optarg;
-
- while(*ptr)
- {
- if(isdigit(*ptr))
- {
- incomingnumber[i++] = *ptr++;
- }
- else
- {
- fprintf(stderr, "Error: option -i requires a numeric argument!\n");
- usage();
- }
- }
- incomingnumber[i] = '\0';
- break;
-
- case 'w':
- waitchar = 1;
- break;
-
- case 'h':
- usehdlc = 1;
- break;
-
- case 't':
- if(isdigit(*optarg))
- {
- dotest = strtoul(optarg, NULL, 10);
- }
- else
- {
- fprintf(stderr, "Error: option -t requires a numeric argument!\n");
- usage();
- }
- break;
-
- case '?':
- default:
- usage();
- break;
- }
- }
-
- if((strlen(incomingnumber) == 0) || (strlen(outgoingnumber) == 0))
- usage();
-
- fprintf(stderr, "isdntest: accepting calls from telephone number [%s] \n", incomingnumber);
- fprintf(stderr, "isdntest: calling out telephone number [%s] \n", outgoingnumber);
-
- if((atexit(cleanup)) != 0)
- {
- fprintf(stderr, "isdntest: atexit error: %s\n", strerror(errno));
- exit(1);
- }
-
- /* open isdn device */
-
- if((isdnfd = open(I4BDEVICE, O_RDWR)) < 0)
- {
- fprintf(stderr, "\nisdntest: cannot open %s: %s\n", I4BDEVICE, strerror(errno));
- fprintf(stderr, " isdnd is probably running, to use isdntest,\n");
- fprintf(stderr, " terminate isdnd and then run isdntest again!\n");
- exit(1);
- }
-
- if((out_cdid = get_cdid(isdnfd)) == 0)
- {
- fprintf(stderr, "isdntest: error getting cdid: %s\n", strerror(errno));
- exit(1);
- }
-
- if((connect_request(isdnfd, out_cdid)) == -1)
- {
- fprintf(stderr, "isdntest: error, outgoing call failed!\n");
- exit(1);
- }
-
- for(;;)
- {
- FD_ZERO(&set);
-
- FD_SET(0, &set);
-
- FD_SET(isdnfd, &set);
-
- ret = select(isdnfd + 1, &set, NULL, NULL, NULL);
-
- if(ret > 0)
- {
- if(FD_ISSET(isdnfd, &set))
- isdnrdhdl(isdnfd);
-
- if(FD_ISSET(0, &set))
- kbdrdhdl();
- }
- else
- {
- fprintf(stderr, "isdntest: select error: %s\n", strerror(errno));
- }
- }
-}
-
-/*---------------------------------------------------------------------------*
- * data from keyboard available
- *---------------------------------------------------------------------------*/
-static void
-kbdrdhdl(void)
-{
- cleanup();
- exit(2);
-}
-
-/*---------------------------------------------------------------------------*
- * data from /dev/isdn available, read and process them
- *---------------------------------------------------------------------------*/
-static void
-isdnrdhdl(int isdnfd)
-{
- static unsigned char buf[1024];
- int len;
-
- if((len = read(isdnfd, buf, 1024 - 1)) > 0)
- {
- switch (buf[0])
- {
- case MSG_CONNECT_IND:
- handle_connect_ind(&buf[0]);
- break;
-
- case MSG_CONNECT_ACTIVE_IND:
- handle_connect_active_ind(&buf[0]);
- break;
-
- case MSG_DISCONNECT_IND:
- handle_disconnect(&buf[0]);
- break;
-
- default:
- if(debug_level)
- fprintf(stderr, "isdntest: unknown message 0x%x = %c\n", buf[0], buf[0]);
- break;
- }
- }
- else
- {
- fprintf(stderr, "isdntest: read error, errno = %d, length = %d", errno, len);
- }
-}
-
-/*---------------------------------------------------------------------------*
- * initiate an outgoing connection
- *---------------------------------------------------------------------------*/
-int
-connect_request(int isdnfd, unsigned int cdid)
-{
- msg_connect_req_t mcr;
- int ret;
-
- bzero(&mcr, sizeof(msg_connect_req_t));
-
- mcr.controller = controller;
- mcr.channel = CHAN_ANY; /* any channel */
- mcr.cdid = cdid; /* cdid from get_cdid() */
-
- if(usehdlc)
- mcr.bprot = BPROT_RHDLC;/* b channel protocol */
- else
- mcr.bprot = BPROT_NONE; /* b channel protocol */
-
- mcr.driver = BDRV_RBCH; /* raw b channel driver */
- mcr.driver_unit = DATAUNIT0; /* raw b channel driver unit */
-
- strcpy(mcr.dst_telno, outgoingnumber);
- strcpy(mcr.src_telno, incomingnumber);
-
- if((ret = ioctl(isdnfd, I4B_CONNECT_REQ, &mcr)) < 0)
- {
- fprintf(stderr, "ioctl I4B_CONNECT_REQ failed: %s", strerror(errno));
- return(-1);
- }
- fprintf(stderr, "isdntest: calling out to telephone number [%s] \n", outgoingnumber);
- return(0);
-}
-
-/*---------------------------------------------------------------------------*
- * handle setup indicator
- *---------------------------------------------------------------------------*/
-void
-handle_connect_ind(unsigned char *ptr)
-{
- msg_connect_ind_t *msi = (msg_connect_ind_t *)ptr;
-
- fprintf(stderr, "isdntest: incoming SETUP: from %s to %s\n",
- msi->src_telno,
- msi->dst_telno);
-
- fprintf(stderr, " channel %d, controller %d, bprot %d, cdid %d\n",
- msi->channel,
- msi->controller,
- msi->bprot,
- msi->header.cdid);
-
- in_cdid = msi->header.cdid;
-
- if(strcmp(msi->dst_telno, outgoingnumber))
- {
- msg_connect_resp_t msr;
- int ret;
-
- fprintf(stderr, "isdntest: ignoring incoming SETUP: my number [%s] != outgoing [%s]\n",
- msi->dst_telno, outgoingnumber);
-
- msr.cdid = in_cdid;
- msr.response = SETUP_RESP_DNTCRE;
-
- if((ret = ioctl(isdnfd, I4B_CONNECT_RESP, &msr)) < 0)
- {
- fprintf(stderr, "ioctl I4B_CONNECT_RESP ignore failed: %s", strerror(errno));
- exit(1);
- }
-
- }
- else
- {
- msg_connect_resp_t msr;
- int ret;
-
- fprintf(stderr, "isdntest: accepting call, sending CONNECT_RESPONSE .....\n");
-
- msr.cdid = in_cdid;
- msr.response = SETUP_RESP_ACCEPT;
-
- if(usehdlc)
- msr.bprot = BPROT_RHDLC;
- else
- msr.bprot = BPROT_NONE;
-
- msr.driver = BDRV_RBCH;
- msr.driver_unit = DATAUNIT1;
-
- if((ret = ioctl(isdnfd, I4B_CONNECT_RESP, &msr)) < 0)
- {
- fprintf(stderr, "ioctl I4B_CONNECT_RESP accept failed: %s", strerror(errno));
- exit(1);
- }
- }
-}
-
-#define SLEEPTIME 5
-
-/*---------------------------------------------------------------------------*
- * handle connection active
- *---------------------------------------------------------------------------*/
-void
-handle_connect_active_ind(unsigned char *ptr)
-{
- msg_connect_active_ind_t *msi = (msg_connect_active_ind_t *)ptr;
- int i;
-
- fprintf(stderr, "isdntest: connection active, cdid %d\n", msi->header.cdid);
-
- if(out_cdid == msi->header.cdid)
- {
- if(waitchar)
- {
- fprintf(stderr, "isdntest: press any key to disconnect ...%c%c%c\n", 0x07, 0x07, 0x07);
- getchar();
- }
- else
- {
- if(dotest)
- {
- do_test();
- }
- else
- {
- fprintf(stderr, "isdntest: %d secs delay until disconnect:", SLEEPTIME);
-
- for(i=0; i < SLEEPTIME;i++)
- {
- fprintf(stderr, " .");
- sleep(1);
- }
- fprintf(stderr, "\n");
- }
- cleanup();
- exit(0);
- }
- }
-}
-
-/*---------------------------------------------------------------------------*
- * handle disconnect indication
- *---------------------------------------------------------------------------*/
-void
-handle_disconnect(unsigned char *ptr)
-{
- msg_disconnect_ind_t *mdi = (msg_disconnect_ind_t *)ptr;
-
- if(mdi->header.cdid == out_cdid)
- {
- fprintf(stderr, "isdntest: incoming disconnect indication, cdid %d (out_cdid), cause %d\n",
- mdi->header.cdid, mdi->cause);
-
- out_cdid = CDID_UNUSED;
- }
- else if(mdi->header.cdid == in_cdid)
- {
- fprintf(stderr, "isdntest: incoming disconnect indication, cdid %d (in_cdid), cause %d\n",
- mdi->header.cdid, mdi->cause);
- in_cdid = CDID_UNUSED;
- }
- else
- {
- fprintf(stderr, "isdntest: incoming disconnect indication, cdid %d (\?\?\?), cause %d\n",
- mdi->header.cdid, mdi->cause);
- }
-}
-
-/*---------------------------------------------------------------------------*
- * hang up
- *---------------------------------------------------------------------------*/
-int
-disconnect_request(int isdnfd, unsigned int cdid)
-{
- msg_discon_req_t mdr;
- int ret;
-
- mdr.cdid = cdid;
- mdr.cause = (CAUSET_I4B << 8) | CAUSE_I4B_NORMAL;
-
- if((ret = ioctl(isdnfd, I4B_DISCONNECT_REQ, &mdr)) < 0)
- {
- fprintf(stderr, "ioctl I4B_DISCONNECT_REQ failed: %s", strerror(errno));
- return(-1);
- }
- fprintf(stderr, "isdntest: sending disconnect request\n");
- return(0);
-}
-
-/*---------------------------------------------------------------------------*
- * get cdid from kernel
- *---------------------------------------------------------------------------*/
-unsigned int
-get_cdid(int isdnfd)
-{
- msg_cdid_req_t mcr;
- int ret;
-
- mcr.cdid = 0;
-
- if((ret = ioctl(isdnfd, I4B_CDID_REQ, &mcr)) < 0)
- {
- fprintf(stderr, "ioctl I4B_CDID_REQ failed: %s", strerror(errno));
- return(0);
- }
- fprintf(stderr, "isdntest: got cdid %d from kernel\n", mcr.cdid);
- return(mcr.cdid);
-}
-
-/*---------------------------------------------------------------------------*
- * make shure all cdid's are inactive before leaving
- *---------------------------------------------------------------------------*/
-void cleanup(void)
-{
- int len;
- char buf[1024];
-
- if(out_cdid != CDID_UNUSED)
- {
- fprintf(stderr, "isdntest: cleanup, send disconnect req for out_cdid %d, in_cdid %d\n", out_cdid, in_cdid);
- disconnect_request(isdnfd, out_cdid);
- }
-
- while((out_cdid != CDID_UNUSED) || (in_cdid != CDID_UNUSED))
- {
- if(debug_level)
- fprintf(stderr, "isdntest: cleanup, out_cdid %d, in_cdid %d\n", out_cdid, in_cdid);
-
- if((len = read(isdnfd, buf, 1024 - 1)) > 0)
- {
- switch (buf[0])
- {
- case MSG_CONNECT_IND:
- handle_connect_ind(&buf[0]);
- break;
-
- case MSG_CONNECT_ACTIVE_IND:
- handle_connect_active_ind(&buf[0]);
- break;
-
- case MSG_DISCONNECT_IND:
- handle_disconnect(&buf[0]);
- break;
-
- default:
- if(debug_level)
- fprintf(stderr, "isdntest: unknown message 0x%x = %c\n", buf[0], buf[0]);
- break;
- }
- }
- else
- {
- fprintf(stderr, "isdntest: read error, errno = %d, length = %d", errno, len);
- }
- }
- if(debug_level)
- fprintf(stderr, "isdntest: exit cleanup, out_cdid %d, in_cdid %d\n", out_cdid, in_cdid);
-}
-
-/*---------------------------------------------------------------------------*
- * test the b-channels
- *---------------------------------------------------------------------------*/
-int do_test(void)
-{
-
-#define FPH 0x3c
-#define FPL 0x66
-
- int fd0, fd1;
- unsigned char wrbuf[2048];
- unsigned char rdbuf[2048];
- int sz;
- fd_set set;
- struct timeval timeout;
- int ret;
- int frame;
- int errcnt;
- int frm_len;
- int bytecnt = 0;
- time_t start_time;
- time_t cur_time;
- time_t run_time;
-
- if((fd0 = open(DATADEV0, O_RDWR)) == -1)
- {
- fprintf(stderr, "open of %s failed: %s", DATADEV0, strerror(errno));
- return(-1);
- }
-
- if((fd1 = open(DATADEV1, O_RDWR)) == -1)
- {
- fprintf(stderr, "open of %s failed: %s", DATADEV1, strerror(errno));
- return(-1);
- }
-
- printf("\n");
- frame = 0;
- errcnt = 0;
-
- frm_len = 2;
-
- start_time = time(NULL);
-
- printf(" frame size errors totalbytes bps elapsedtime\n");
-
- for(;dotest > 0; dotest--)
- {
- setup_wrfix(frm_len, &wrbuf[0]);
-
- frame++;
-
- bytecnt += frm_len;
-
- printf("%6d %4d", frame, frm_len);
- fflush(stdout);
-
- if((sz = write(fd0, wrbuf, frm_len)) != frm_len)
- {
- fprintf(stderr, "write (%d of %d bytes) to %s failed: %s\n", sz, frm_len, DATADEV0, strerror(errno));
- }
-
- timeout.tv_sec = 2;
- timeout.tv_usec = 0;
-
- FD_ZERO(&set);
-
- FD_SET(0, &set);
- FD_SET(fd1, &set);
-
- ret = select(fd1+1, &set, NULL, NULL, &timeout);
-
- if(ret > 0)
- {
- if(FD_ISSET(fd1, &set))
- {
- if((sz = read(fd1, rdbuf, 2048)) != frm_len)
- {
- fprintf(stderr, "read (%d bytes) from %s failed: %s\n", sz, DATADEV1, strerror(errno));
- }
-
- cur_time = time(NULL);
- run_time = difftime(cur_time, start_time);
-
- if(run_time == 0)
- run_time = 1;
-
- printf(" %6d %10d %4d %2.2d:%2.2d:%2.2d \r",
- errcnt, bytecnt,
- (int)((int)bytecnt/(int)run_time),
- (int)run_time/3600, (int)run_time/60, (int)run_time%60);
- fflush(stdout);
-
- errcnt += check_rd(frm_len, &wrbuf[0], &rdbuf[0]);
-
-#ifdef NOTDEF
- for(i=0; i<sz; i++)
- {
- printf("0x%02x ", (unsigned char)rdbuf[i]);
- }
- printf("\n");
-#endif
- }
-
- if(FD_ISSET(0, &set))
- {
- return(0);
- printf("\n\n");
- }
- }
- else
- {
- fprintf(stderr, "isdntest, do_test: select error: %s\n", strerror(errno));
- }
-
- frm_len = frm_len*2;
- if(frm_len > 2048)
- frm_len = 2;
-
- }
- printf("\n\n");
- return(0);
-}
-
-void
-setup_wrfix(int len, unsigned char *buf)
-{
- register int i;
-
- for(i=0; i<len;)
- {
- *buf = FPH;
- buf++;
- *buf = FPL;
- buf++;
- i+=2;
- }
-}
-
-int
-check_rd(int len, unsigned char *wbuf, unsigned char *rbuf)
-{
- register int i;
- int ret = 0;
-
- for(i=0; i<len; i++)
- {
- if(*wbuf != *rbuf)
- {
- fprintf(stderr, "\nERROR, byte %d, written 0x%02x, read 0x%02x\n", i, *wbuf, *rbuf);
- ret++;
- }
- wbuf++;
- rbuf++;
- }
- return(ret);
-}
-
-
-/* EOF */
OpenPOWER on IntegriCloud