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