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