xref: /csrg-svn/sys/tests/netiso/tisrc.c (revision 48713)
144323Ssklower /*
2*48713Ssklower  * Copyright (c) 1989, 1990 Regents of the University of California.
344323Ssklower  * All rights reserved.
444323Ssklower  *
544323Ssklower  * %sccs.include.redist.c%
644323Ssklower  */
744323Ssklower #ifndef lint
8*48713Ssklower static char sccsid[] = "@(#)tisrc.c	7.2 (Berkeley) 04/25/91";
944323Ssklower #endif /* not lint */
1044323Ssklower 
1144323Ssklower /*
12*48713Ssklower  * This is a test program to be a source for ISO transport.
1344323Ssklower  */
1444323Ssklower #include <sys/types.h>
1544323Ssklower #include <sys/socket.h>
1644323Ssklower #include <sys/uio.h>
1744323Ssklower #include <sys/ioctl.h>
1844323Ssklower #include <net/route.h>
1944323Ssklower #include <net/if.h>
2044323Ssklower #define  TCPT_NTIMERS 4
2144323Ssklower #include <netiso/iso.h>
2244323Ssklower #include <netiso/tp_user.h>
2344323Ssklower 
2444323Ssklower #include <stdio.h>
2544323Ssklower #include <errno.h>
2644323Ssklower #include <ctype.h>
2744323Ssklower #include <netdb.h>
2844323Ssklower 
2944323Ssklower 
3044323Ssklower #define dbprintf if(verbose)printf
3144323Ssklower #define try(a,b,c) {x = (a b);dbprintf("%s%s returns %d\n",c,"a",x);\
3244323Ssklower 		    if (x < 0) {perror("a"); exit(1);}}
3344323Ssklower 
3444323Ssklower struct	iso_addr eon = {20, 0x47, 0, 6, 3, 0, 0, 0, 25 /*EGP for Berkeley*/};
3544323Ssklower struct  sockaddr_iso to_s = { sizeof(to_s), AF_ISO }, *to = &to_s;
36*48713Ssklower struct  sockaddr_iso old_s = { sizeof(to_s), AF_ISO }, *old = &old_s;
3744323Ssklower fd_set	readfds, writefds, exceptfds;
3844323Ssklower long size, count = 10;
3944323Ssklower int verbose = 1, selectp, type = SOCK_SEQPACKET, nobuffs, errno, playtag = 0;
40*48713Ssklower int verify = 0, dgramp = 0, debug = 0;
4144323Ssklower short portnumber = 3000;
4244323Ssklower char your_it[] = "You're it!";
43*48713Ssklower char *Servername, *conndata, data_msg[2048];
44*48713Ssklower char Serverbuf[128];
45*48713Ssklower char name[128];
4644323Ssklower struct iovec iov[1] = {data_msg};
4744323Ssklower union {
4844323Ssklower     struct {
4944323Ssklower 	    struct cmsghdr	cmhdr;
50*48713Ssklower 	    char		cmdata[128 - sizeof(struct cmsghdr)];
5144323Ssklower     } cm;
5244323Ssklower     char data[128];
5344323Ssklower } cm;
5444323Ssklower struct msghdr msg = { 0, 0, iov, 1, 0, 0, 0};
5544323Ssklower 
5644323Ssklower main(argc, argv)
5744323Ssklower int argc;
5844323Ssklower char *argv[];
5944323Ssklower {
6044323Ssklower 	register char **av = argv;
6144323Ssklower 	register char *cp;
6244323Ssklower 	u_long len;
6344323Ssklower 	int handy;
6444323Ssklower 
6544323Ssklower 	while(--argc > 0) {
6644323Ssklower 		av++;
6744323Ssklower 		if(strcmp(*av,"Servername")==0) {
6844323Ssklower 			av++;
69*48713Ssklower 			Servername = *av;
7044323Ssklower 			argc--;
7144323Ssklower 		} else if(strcmp(*av,"conndata")==0) {
7244323Ssklower 			av++;
7344323Ssklower 			conndata = *av;
7444323Ssklower 			argc--;
7544323Ssklower 		} else if(strcmp(*av,"host")==0) {
7644323Ssklower 			av++;
77*48713Ssklower 			to_s.siso_addr = *iso_addr(*av);
7844323Ssklower 			argc--;
7944323Ssklower 		} else if(strcmp(*av,"port")==0) {
8044323Ssklower 			av++;
8144323Ssklower 			sscanf(*av,"%hd",&portnumber);
8244323Ssklower 			argc--;
8344323Ssklower 		} else if(strcmp(*av,"count")==0) {
8444323Ssklower 			av++;
8544323Ssklower 			sscanf(*av,"%ld",&count);
8644323Ssklower 			argc--;
8744323Ssklower 		} else if(strcmp(*av,"size")==0) {
8844323Ssklower 			av++;
8944323Ssklower 			sscanf(*av,"%ld",&size);
9044323Ssklower 			iov->iov_len = size;
9144323Ssklower 		} else if(strcmp(*av,"stream")==0) {
9244323Ssklower 			type = SOCK_STREAM;
9344323Ssklower 		} else if (strcmp(*av,"eon") == 0) {
9444323Ssklower 			unsigned long l, inet_addr();
9544323Ssklower 
9644323Ssklower 			l = inet_addr(*++av); argc--;
9744323Ssklower 			to_s.siso_addr = eon;
9844323Ssklower 			bcopy((char *)&l, &to_s.siso_data[15], 4);
9944323Ssklower 		}
10044323Ssklower 	}
101*48713Ssklower 	maketoaddr();
102*48713Ssklower 	tisrc();
103*48713Ssklower }
104*48713Ssklower 
105*48713Ssklower maketoaddr()
106*48713Ssklower {
107*48713Ssklower 	if (Servername) {
108*48713Ssklower 		int tlen = strlen(Servername);
109*48713Ssklower 		int len =  tlen + TSEL(to) - (caddr_t) to;
110*48713Ssklower 		if (len < sizeof(*to)) len = sizeof(*to);
111*48713Ssklower 		if (len > to->siso_len) {
112*48713Ssklower 			if (old != &old_s) free(old);
113*48713Ssklower 			old = (struct sockaddr_iso *)malloc(len);
114*48713Ssklower 			*old = *to; /* We dont care if all old tsel is copied*/
115*48713Ssklower 			old->siso_len = len;
116*48713Ssklower 			if (to != &to_s) free(to);
11744323Ssklower 			to = (struct sockaddr_iso *)malloc(len);
11844323Ssklower 		}
119*48713Ssklower 		bcopy(Servername, TSEL(old), tlen);
12044323Ssklower 	} else {
121*48713Ssklower 		old->siso_tlen = sizeof(portnumber);
12244323Ssklower 		portnumber = htons(portnumber);
123*48713Ssklower 		bcopy((char *)&portnumber, TSEL(old), sizeof(portnumber));
12444323Ssklower 	}
125*48713Ssklower 	bcopy(old, to, old->siso_len);
12644323Ssklower }
12744323Ssklower 
128*48713Ssklower 
12944323Ssklower tisrc() {
13044323Ssklower 	int x, s, pid, on = 1, flags = 8, n;
13144323Ssklower 
132*48713Ssklower 	if (dgramp) type = SOCK_DGRAM;
13344323Ssklower 	try(socket, (AF_ISO, type, 0),"");
13444323Ssklower 	s = x;
13544323Ssklower 
136*48713Ssklower 	if (debug)
137*48713Ssklower 		try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof on), "");
138*48713Ssklower 	if (dgramp == 0) {
139*48713Ssklower 		if (conndata)
140*48713Ssklower 			doconndata(s);
141*48713Ssklower 		try(connect, (s, (struct sockaddr *) to, to->siso_len), "");
142*48713Ssklower 	}
14344323Ssklower 	if (selectp) {
14444323Ssklower 		FD_ZERO(&writefds); FD_SET(s, &writefds);
14544323Ssklower 		select(1, &writefds, 0, 0, 0);
14644323Ssklower 	}
14744323Ssklower 	while (count-- > 0) {
14844323Ssklower 		if (size <= 0 && get_record(&flags) == EOF)
14944323Ssklower 			exit(0);
15044323Ssklower 		n = put_record(s, flags);
15144323Ssklower 		if (n < iov->iov_len) {
15244323Ssklower 			if (n==-1 && errno == 55) {
15344323Ssklower 				nobuffs++;
15444323Ssklower 				count++;
15544323Ssklower 				continue;
15644323Ssklower 			}
15744323Ssklower 			fprintf(stderr, "wrote %d < %d, count %d,",
15844323Ssklower 						n, iov->iov_len, count);
15944323Ssklower 			perror("due to");
16044323Ssklower 		}
16144323Ssklower 	}
16244323Ssklower 	if (playtag) {
16344323Ssklower 		printf("Tag time!\n");
16444323Ssklower 		iov->iov_base = your_it;
16544323Ssklower 		iov->iov_len = sizeof your_it;
16644323Ssklower 		sendmsg(s, &msg, MSG_EOR);
16744323Ssklower 		sendmsg(s, &msg, MSG_EOR);
16844323Ssklower 		iov->iov_base = data_msg;
16944323Ssklower 		iov->iov_len = sizeof data_msg;
17044323Ssklower 		try(recvmsg, (s, &msg, flags), " playtag ");
17144323Ssklower 	}
17244323Ssklower 	if(nobuffs) {
17344323Ssklower 		printf("looped %d times waiting for bufs\n", nobuffs);
17444323Ssklower 	}
17544323Ssklower }
17644323Ssklower int localsize;
17744323Ssklower char dupbuf[4096];
17844323Ssklower 
17944323Ssklower put_record(s, flags)
18044323Ssklower int s, flags;
18144323Ssklower {
18244323Ssklower 	int fd, buflen;
18344323Ssklower 	char *buf;
18444323Ssklower 	int x, saved_x;
18544323Ssklower 
18644323Ssklower 	msg.msg_flags = flags;
18744323Ssklower 	if (verbose) {
18844323Ssklower 		if (msg.msg_controllen) {
18944323Ssklower 			printf("(CMessage Type is %x) ", cm.cm.cmhdr.cmsg_type);
190*48713Ssklower 			dumpit("CMsg data:\n", &msg.msg_control, msg.msg_controllen);
19144323Ssklower 		}
19244323Ssklower 		if (iov->iov_len) {
19344323Ssklower 			printf("sending: %s %s",
19444323Ssklower 			(flags & MSG_OOB ? "(OOB Data)" : ""),
19544323Ssklower 				(flags & MSG_EOR ? "(Record Mark)" : ""));
196*48713Ssklower 			dumpit("data: ", data_msg, localsize);
19744323Ssklower 		}
19844323Ssklower 	}
19944323Ssklower 	if (verify) {
20044323Ssklower 		buflen = iov->iov_len;
20144323Ssklower 		bcopy(iov->iov_base, dupbuf, buflen);
20244323Ssklower 	}
203*48713Ssklower 	if (dgramp) {
204*48713Ssklower 		msg.msg_name = (caddr_t)to;
205*48713Ssklower 		msg.msg_namelen = to->siso_len;
206*48713Ssklower 	}
20744323Ssklower 	try(sendmsg, (s, &msg, flags), " put_record ");
20844323Ssklower 	saved_x = x;
20944323Ssklower 	while (verify && buflen > 0) {
21044323Ssklower 		iov->iov_len = buflen;
21144323Ssklower 		iov->iov_base = dupbuf;
21244323Ssklower 		try(recvmsg, (s, &msg, flags), " put_record ");
213*48713Ssklower 		if (dgramp) {
214*48713Ssklower 			if (msg.msg_namelen)
215*48713Ssklower 				dumpit("from: ", to, msg.msg_namelen);
216*48713Ssklower 			msg.msg_namelen = old->siso_len;
217*48713Ssklower 		}
21844323Ssklower 		printf("verify got %d\n", x);
21944323Ssklower 		buflen -= x;
22044323Ssklower 	}
221*48713Ssklower 	bcopy(old, to, old->siso_len);
22244323Ssklower 	msg.msg_control = 0;
22344323Ssklower 	return (saved_x);
22444323Ssklower }
225*48713Ssklower dumpit(what, where, n)
226*48713Ssklower char *what; unsigned short *where; int n;
227*48713Ssklower {
228*48713Ssklower 	unsigned short *s = where;
229*48713Ssklower 	unsigned short *z = where + (n+1)/2;
230*48713Ssklower 	int count = 0;
231*48713Ssklower 	if (verbose == 0)
232*48713Ssklower 		return;
233*48713Ssklower 	printf(what);
234*48713Ssklower 	while(s < z) {
235*48713Ssklower 		count++;
236*48713Ssklower 		printf("%x ",*s++);
237*48713Ssklower 		if ((count & 15) == 0)
238*48713Ssklower 			putchar('\n');
239*48713Ssklower 	}
240*48713Ssklower 	if (count & 15)
241*48713Ssklower 		putchar('\n');
242*48713Ssklower 	fflush(stdout);
243*48713Ssklower }
24444323Ssklower int *datasize = &iov->iov_len;
24544323Ssklower char *cp, *cplim;
24644323Ssklower 
24744323Ssklower get_control_data(type)
24844323Ssklower {
24944323Ssklower 
25044323Ssklower 	datasize = (int *)&msg.msg_controllen;
25144323Ssklower 	cp = cm.cm.cmdata;
25244323Ssklower 	cplim = cp + sizeof(cm.cm.cmdata);
25344323Ssklower 	cm.cm.cmhdr.cmsg_level = SOL_TRANSPORT;
25444323Ssklower 	cm.cm.cmhdr.cmsg_type = type;
25544323Ssklower 	msg.msg_control = cm.data;
25644323Ssklower }
25744323Ssklower 
25844323Ssklower doconndata(s)
25944323Ssklower {
26044323Ssklower 	get_control_data(TPOPT_CONN_DATA);
26144323Ssklower 	*datasize = strlen(conndata) + sizeof(cm.cm.cmhdr);
26244323Ssklower 	cm.cm.cmhdr.cmsg_len = *datasize;
26344323Ssklower 	bcopy(conndata, cp, *datasize);
26444323Ssklower 	put_record(s, 0);
26544323Ssklower }
26644323Ssklower 
267*48713Ssklower get_altbuf(addrbuf)
268*48713Ssklower char *addrbuf;
269*48713Ssklower {
270*48713Ssklower 	if (dgramp == 0) {
271*48713Ssklower 		printf("illegal option for stream\n");
272*48713Ssklower 		return 1;
273*48713Ssklower 	}
274*48713Ssklower 	return (scanf("%s", addrbuf) == EOF ? 1 : 0);
275*48713Ssklower }
27644323Ssklower 
27744323Ssklower get_record(flags)
27844323Ssklower int *flags;
27944323Ssklower {
280*48713Ssklower 	int factor = 1, x = 0, newaddr = 0;
281*48713Ssklower 	static repeatcount, repeatsize;
28244323Ssklower 	char workbuf[10240];
283*48713Ssklower 	char addrbuf[128];
28444323Ssklower 
285*48713Ssklower 	if (repeatcount > 0) {
286*48713Ssklower 		repeatcount--;
287*48713Ssklower 		return;
288*48713Ssklower 	}
289*48713Ssklower 
29044323Ssklower 	*flags = 0;
29144323Ssklower 	*datasize = 0;
29244323Ssklower 	datasize = &iov->iov_len;
29344323Ssklower 	cp = data_msg;
29444323Ssklower 	cplim  = cp + sizeof(data_msg);
29544323Ssklower 
29644323Ssklower 	for(;;) {
29744323Ssklower 		x = scanf("%s", workbuf);
29844323Ssklower 		if (x == EOF)
29944323Ssklower 			break;
300*48713Ssklower 		if (strcmp(workbuf, "host") == 0) {
301*48713Ssklower 			if (get_altbuf(addrbuf))
302*48713Ssklower 				break;
303*48713Ssklower 			to->siso_addr = *iso_addr(addrbuf);
304*48713Ssklower 			newaddr = 1;
305*48713Ssklower 		} else if (strcmp(workbuf, "Servername") == 0) {
306*48713Ssklower 			if (get_altbuf(Serverbuf))
307*48713Ssklower 				break;
308*48713Ssklower 			Servername = Serverbuf;
309*48713Ssklower 			newaddr = 1;
310*48713Ssklower 		} else if (strcmp(workbuf, "port") == 0) {
311*48713Ssklower 			x = scanf("%hd", &portnumber);
312*48713Ssklower 			if (x == EOF)
313*48713Ssklower 				break;
314*48713Ssklower 			Servername = 0;
315*48713Ssklower 			newaddr = 1;
316*48713Ssklower 		} else if (strcmp(workbuf, "repeat") == 0) {
317*48713Ssklower 			x = scanf("%d", &repeatcount);
318*48713Ssklower 			if (repeatcount <= 0) repeatcount = 1;
319*48713Ssklower 			repeatcount--;
320*48713Ssklower 			if (x == EOF)
321*48713Ssklower 				break;
322*48713Ssklower 		} else if (strcmp(workbuf, "disc") == 0)
32344323Ssklower 			x = get_control_data(TPOPT_DISC_DATA);
32444323Ssklower 		else if (strcmp(workbuf, "cfrm") == 0)
32544323Ssklower 			x = get_control_data(TPOPT_CFRM_DATA);
32644323Ssklower 		else if (strcmp(workbuf, "oob") == 0)
32744323Ssklower 			*flags |= MSG_OOB;
32844323Ssklower 		else if (strcmp(workbuf, "eom") == 0)
32944323Ssklower 			*flags |= MSG_EOR;
33044323Ssklower 		else if (strcmp(workbuf, "factor") == 0) {
33144323Ssklower 			x = scanf("%d", &factor);
33244323Ssklower 			if (factor <= 0) factor = 1;
33344323Ssklower 			if (x == EOF)
33444323Ssklower 				break;
33544323Ssklower 		} else {
33644323Ssklower 			int len = strlen(workbuf);
33744323Ssklower 			localsize = 0;
33844323Ssklower 			while ((factor-- > 0) &&
33944323Ssklower 			       ((cp + len) < cplim)) {
34044323Ssklower 					strcpy(cp, workbuf);
34144323Ssklower 					cp += len;
34244323Ssklower 					localsize += len;
34344323Ssklower 			}
34444323Ssklower 			*datasize = localsize;
34544323Ssklower 			if (datasize != &iov->iov_len) {
34644323Ssklower 				*datasize += sizeof(cm.cm.cmhdr);
347*48713Ssklower 				repeatsize = cm.cm.cmhdr.cmsg_len = *datasize;
34844323Ssklower 			}
34944323Ssklower 			break;
35044323Ssklower 		}
35144323Ssklower 	}
35244323Ssklower 	errno = 0;
353*48713Ssklower 	if (newaddr)
354*48713Ssklower 		maketoaddr();
35544323Ssklower 	return (x);
35644323Ssklower }
357