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