xref: /csrg-svn/sys/tests/netiso/tisink.c (revision 44323)
1*44323Ssklower /*
2*44323Ssklower  * Copyright (c) 1988, 1990 Regents of the University of California.
3*44323Ssklower  * All rights reserved.
4*44323Ssklower  *
5*44323Ssklower  * %sccs.include.redist.c%
6*44323Ssklower  */
7*44323Ssklower #ifndef lint
8*44323Ssklower static char sccsid[] = "@(#)tisink.c	7.1 (Berkeley) 06/27/90";
9*44323Ssklower #endif /* not lint */
10*44323Ssklower 
11*44323Ssklower /*
12*44323Ssklower  * This is a test program to be a sink for TP4 connections.
13*44323Ssklower  */
14*44323Ssklower #include <sys/param.h>
15*44323Ssklower #include <sys/uio.h>
16*44323Ssklower #include <sys/socket.h>
17*44323Ssklower #include <sys/ioctl.h>
18*44323Ssklower #include <net/route.h>
19*44323Ssklower #include <net/if.h>
20*44323Ssklower #define  TCPT_NTIMERS 4
21*44323Ssklower #include <netiso/iso.h>
22*44323Ssklower #include <netiso/tp_param.h>
23*44323Ssklower #include <netiso/tp_user.h>
24*44323Ssklower 
25*44323Ssklower #include <stdio.h>
26*44323Ssklower #include <errno.h>
27*44323Ssklower #include <ctype.h>
28*44323Ssklower #include <netdb.h>
29*44323Ssklower 
30*44323Ssklower 
31*44323Ssklower #define dbprintf if(verbose)printf
32*44323Ssklower #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\
33*44323Ssklower 		if(x<0) {perror("a"); myexit(0);}}
34*44323Ssklower 
35*44323Ssklower 
36*44323Ssklower struct  ifreq ifr;
37*44323Ssklower short port = 3000;
38*44323Ssklower struct  sockaddr_iso faddr, laddr = { sizeof(laddr), AF_ISO };
39*44323Ssklower struct  sockaddr_iso *siso = &laddr;
40*44323Ssklower 
41*44323Ssklower long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0;
42*44323Ssklower long records;
43*44323Ssklower 
44*44323Ssklower char buf[2048];
45*44323Ssklower char your_it[] = "You're it!";
46*44323Ssklower 
47*44323Ssklower char *Servername;
48*44323Ssklower 
49*44323Ssklower main(argc, argv)
50*44323Ssklower int argc;
51*44323Ssklower char *argv[];
52*44323Ssklower {
53*44323Ssklower 	register char **av = argv;
54*44323Ssklower 	register char *cp;
55*44323Ssklower 	struct iso_addr iso_addr();
56*44323Ssklower 
57*44323Ssklower 	while(--argc > 0) {
58*44323Ssklower 		av++;
59*44323Ssklower 		if(strcmp(*av,"Servername")==0) {
60*44323Ssklower 			av++;
61*44323Ssklower 			Servername = *av;
62*44323Ssklower 			argc--;
63*44323Ssklower 		} else if (strcmp(*av,"host")==0) {
64*44323Ssklower 			av++;
65*44323Ssklower 			laddr.siso_addr = iso_addr(*av);
66*44323Ssklower 			argc--;
67*44323Ssklower 		} else if (strcmp(*av,"count")==0) {
68*44323Ssklower 			av++;
69*44323Ssklower 			sscanf(*av,"%ld",&count);
70*44323Ssklower 			argc--;
71*44323Ssklower 		} else if (strcmp(*av,"port")==0) {
72*44323Ssklower 			av++;
73*44323Ssklower 			sscanf(*av,"%hd",&port);
74*44323Ssklower 			argc--;
75*44323Ssklower 		} else if (strcmp(*av,"size")==0) {
76*44323Ssklower 			av++;
77*44323Ssklower 			sscanf(*av,"%ld",&size);
78*44323Ssklower 			argc--;
79*44323Ssklower 		}
80*44323Ssklower 	}
81*44323Ssklower 	if (Servername) {
82*44323Ssklower 		int tlen = laddr.siso_tlen = strlen(Servername);
83*44323Ssklower 		int len =  TSEL(siso) + tlen - (caddr_t) &siso;
84*44323Ssklower 		if (len > sizeof(*siso)) {
85*44323Ssklower 			siso = (struct sockaddr_iso *)malloc(len);
86*44323Ssklower 			*siso = laddr;
87*44323Ssklower 			siso->siso_len = len;
88*44323Ssklower 		}
89*44323Ssklower 		bcopy(Servername, TSEL(siso), tlen);
90*44323Ssklower 	} else {
91*44323Ssklower 		port = htons(port);
92*44323Ssklower 		laddr.siso_tlen = sizeof(port);
93*44323Ssklower 		bcopy((char *)&port, TSEL(siso), sizeof(port));
94*44323Ssklower 	}
95*44323Ssklower 	tisink();
96*44323Ssklower }
97*44323Ssklower #define BIG 2048
98*44323Ssklower #define MIDLIN 512
99*44323Ssklower char readbuf[BIG];
100*44323Ssklower struct iovec iov[1] = {
101*44323Ssklower 	readbuf,
102*44323Ssklower 	sizeof readbuf,
103*44323Ssklower };
104*44323Ssklower char name[MIDLIN];
105*44323Ssklower union {
106*44323Ssklower     struct {
107*44323Ssklower 	    struct cmsghdr	cmhdr;
108*44323Ssklower 	    char		cmdata[128 - sizeof(struct cmsghdr)];
109*44323Ssklower     } cm;
110*44323Ssklower     char data[128];
111*44323Ssklower } cbuf;
112*44323Ssklower #define control cbuf.data
113*44323Ssklower struct msghdr msghdr = {
114*44323Ssklower 	name, sizeof(name),
115*44323Ssklower 	iov, sizeof(iov)/sizeof(iov[1]),
116*44323Ssklower 	control, sizeof control,
117*44323Ssklower 	0 /* flags */
118*44323Ssklower };
119*44323Ssklower 
120*44323Ssklower tisink()
121*44323Ssklower {
122*44323Ssklower 	int x, s, pid, on = 1, loop = 0, n;
123*44323Ssklower 	extern int errno;
124*44323Ssklower 
125*44323Ssklower 	try(socket, (AF_ISO, SOCK_SEQPACKET, 0),"");
126*44323Ssklower 
127*44323Ssklower 	s = x;
128*44323Ssklower 
129*44323Ssklower 	try(bind, (s, (struct sockaddr *) siso, siso->siso_len), "");
130*44323Ssklower 
131*44323Ssklower 	/*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */
132*44323Ssklower 
133*44323Ssklower 	try(listen, (s, 5), "");
134*44323Ssklower 	for(;;) {
135*44323Ssklower 		int child, ns;
136*44323Ssklower 		int addrlen = sizeof(faddr);
137*44323Ssklower 		char childname[50];
138*44323Ssklower 
139*44323Ssklower 		try (accept, (s, &faddr, &addrlen), "");
140*44323Ssklower 		ns = x;
141*44323Ssklower 		dumpit("connection from:", &faddr, sizeof faddr);
142*44323Ssklower 		if (mynamep) {
143*44323Ssklower 			addrlen = sizeof(faddr);
144*44323Ssklower 			try (getsockname, (ns, &faddr, &addrlen), "");
145*44323Ssklower 			dumpit("connected as:", &faddr, addrlen);
146*44323Ssklower 		}
147*44323Ssklower 		loop++;
148*44323Ssklower 		if (loop > 3) myexit(0);
149*44323Ssklower 		if (forkp) {
150*44323Ssklower 			try(fork, (), "");
151*44323Ssklower 		} else
152*44323Ssklower 			x = 0;
153*44323Ssklower 		if (x == 0)  {
154*44323Ssklower 		    long n, count = 0, cn, flags;
155*44323Ssklower 		    records = 0;
156*44323Ssklower 		    if (confp) {
157*44323Ssklower 			msghdr.msg_iovlen = 0;
158*44323Ssklower 			msghdr.msg_namelen = 0;
159*44323Ssklower 			msghdr.msg_controllen =
160*44323Ssklower 			    cbuf.cm.cmhdr.cmsg_len = sizeof (cbuf.cm.cmhdr);
161*44323Ssklower 			cbuf.cm.cmhdr.cmsg_level = SOL_TRANSPORT;
162*44323Ssklower 			cbuf.cm.cmhdr.cmsg_type = TPOPT_CFRM_DATA;
163*44323Ssklower 			n = sendmsg(ns, &msghdr, 0);
164*44323Ssklower 			if (n <= 0) {
165*44323Ssklower 				printf("confirm: errno is %d\n", errno);
166*44323Ssklower 				fflush(stdout);
167*44323Ssklower 				perror("Confirm error");
168*44323Ssklower 			} else {
169*44323Ssklower 				dbprintf("confim ok\n");
170*44323Ssklower 			}
171*44323Ssklower 			sleep(10);
172*44323Ssklower 		    }
173*44323Ssklower 		    for (;;) {
174*44323Ssklower 			msghdr.msg_iovlen = 1;
175*44323Ssklower 			msghdr.msg_controllen = sizeof(control);
176*44323Ssklower 			iov->iov_len = sizeof(readbuf);
177*44323Ssklower 			n = recvmsg(ns, &msghdr, 0);
178*44323Ssklower 			flags = msghdr.msg_flags;
179*44323Ssklower 			count++;
180*44323Ssklower 			dbprintf("recvmsg from child %d got %d ctl %d flags %x\n",
181*44323Ssklower 				    getpid(), n, (cn = msghdr.msg_controllen),
182*44323Ssklower 					flags);
183*44323Ssklower 			fflush(stdout);
184*44323Ssklower 			if (cn && verbose)
185*44323Ssklower 				dumpit("control data:\n", control, cn);
186*44323Ssklower 			if (n < 0) {
187*44323Ssklower 				fprintf(stderr, "errno is %d\n", errno);
188*44323Ssklower 				perror("recvmsg");
189*44323Ssklower 				/*sleep (10);*/
190*44323Ssklower 				break;
191*44323Ssklower 			} else {
192*44323Ssklower 				if (verbose)
193*44323Ssklower 					dumpit("data:\n", readbuf, n);
194*44323Ssklower 			}
195*44323Ssklower 			if (echop) {
196*44323Ssklower 				n = answerback(flags, n, ns);
197*44323Ssklower 			}
198*44323Ssklower 			if (flags & MSG_EOR)
199*44323Ssklower 				records++;
200*44323Ssklower 			if (playtag && n == sizeof(your_it) && (flags & MSG_EOR)
201*44323Ssklower 			    && bcmp(readbuf, your_it, n) == 0) {
202*44323Ssklower 				printf("Answering back!!!!\n");
203*44323Ssklower 				answerback(flags, n, ns);
204*44323Ssklower 				answerback(flags, n, ns);
205*44323Ssklower 			}
206*44323Ssklower 			errno = 0;
207*44323Ssklower 		    }
208*44323Ssklower 		}
209*44323Ssklower 		myexit(0);
210*44323Ssklower 	}
211*44323Ssklower }
212*44323Ssklower answerback(flags, n, ns)
213*44323Ssklower {
214*44323Ssklower 	msghdr.msg_controllen = 0;
215*44323Ssklower 	msghdr.msg_iovlen = 1;
216*44323Ssklower 	iov->iov_len = n;
217*44323Ssklower 	n = sendmsg(ns, &msghdr, flags);
218*44323Ssklower 	dbprintf("echoed %d\n", n);
219*44323Ssklower 	return n;
220*44323Ssklower }
221*44323Ssklower 
222*44323Ssklower dumpit(what, where, n)
223*44323Ssklower char *what; unsigned short *where; int n;
224*44323Ssklower {
225*44323Ssklower 	unsigned short *s = where;
226*44323Ssklower 	unsigned short *z = where + (n+1)/2;
227*44323Ssklower 	int count = 0;
228*44323Ssklower 	printf(what);
229*44323Ssklower 	while(s < z) {
230*44323Ssklower 		count++;
231*44323Ssklower 		printf("%x ",*s++);
232*44323Ssklower 		if ((count & 15) == 0)
233*44323Ssklower 			putchar('\n');
234*44323Ssklower 	}
235*44323Ssklower 	if (count & 15)
236*44323Ssklower 		putchar('\n');
237*44323Ssklower 	fflush(stdout);
238*44323Ssklower }
239*44323Ssklower myexit(n)
240*44323Ssklower {
241*44323Ssklower 	fflush(stderr);
242*44323Ssklower 	printf("got %d records\n", records);
243*44323Ssklower 	fflush(stdout);
244*44323Ssklower 	exit(n);
245*44323Ssklower }
246