144323Ssklower /* 244323Ssklower * Copyright (c) 1988, 1990 Regents of the University of California. 344323Ssklower * All rights reserved. 444323Ssklower * 544323Ssklower * %sccs.include.redist.c% 644323Ssklower */ 744323Ssklower #ifndef lint 8*48712Ssklower static char sccsid[] = "@(#)tisink.c 7.5 (Berkeley) 04/25/91"; 944323Ssklower #endif /* not lint */ 1044323Ssklower 1144323Ssklower /* 12*48712Ssklower * This is a test program to be a sink for ISO packets. 1344323Ssklower */ 1444323Ssklower #include <sys/param.h> 1544323Ssklower #include <sys/uio.h> 1644323Ssklower #include <sys/socket.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_param.h> 2344323Ssklower #include <netiso/tp_user.h> 2444323Ssklower 2544323Ssklower #include <stdio.h> 2644323Ssklower #include <errno.h> 2744323Ssklower #include <ctype.h> 2844323Ssklower #include <netdb.h> 2944323Ssklower 3044323Ssklower 3144323Ssklower #define dbprintf if(verbose)printf 3244323Ssklower #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\ 3344323Ssklower if(x<0) {perror("a"); myexit(0);}} 3444323Ssklower 3544323Ssklower 3644323Ssklower struct ifreq ifr; 3744323Ssklower short port = 3000; 3844323Ssklower struct sockaddr_iso faddr, laddr = { sizeof(laddr), AF_ISO }; 3944323Ssklower struct sockaddr_iso *siso = &laddr; 4048711Ssklower char **xenvp; 4144323Ssklower 4244323Ssklower long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0; 43*48712Ssklower long records, intercept = 0, isode_mode = 0, dgramp = 0; 4444323Ssklower 4544323Ssklower char buf[2048]; 4644323Ssklower char your_it[] = "You're it!"; 4744323Ssklower 4844323Ssklower char *Servername; 4944323Ssklower 5048711Ssklower main(argc, argv, envp) 5144323Ssklower int argc; 5244323Ssklower char *argv[]; 5348711Ssklower char *envp[]; 5444323Ssklower { 5544323Ssklower register char **av = argv; 5644323Ssklower register char *cp; 57*48712Ssklower struct iso_addr *iso_addr(); 5844323Ssklower 5948711Ssklower xenvp = envp; 6044323Ssklower while(--argc > 0) { 6144323Ssklower av++; 6244323Ssklower if(strcmp(*av,"Servername")==0) { 6344323Ssklower av++; 6444323Ssklower Servername = *av; 6544323Ssklower argc--; 6644323Ssklower } else if (strcmp(*av,"host")==0) { 6744323Ssklower av++; 68*48712Ssklower laddr.siso_addr = *iso_addr(*av); 6944323Ssklower argc--; 7044323Ssklower } else if (strcmp(*av,"count")==0) { 7144323Ssklower av++; 7244323Ssklower sscanf(*av,"%ld",&count); 7344323Ssklower argc--; 7444323Ssklower } else if (strcmp(*av,"port")==0) { 7544323Ssklower av++; 7644323Ssklower sscanf(*av,"%hd",&port); 7744323Ssklower argc--; 7844323Ssklower } else if (strcmp(*av,"size")==0) { 7944323Ssklower av++; 8044323Ssklower sscanf(*av,"%ld",&size); 8144323Ssklower argc--; 8244600Ssklower } else if (strcmp(*av, "intercept")==0) { 8344600Ssklower intercept++; 8444323Ssklower } 8544323Ssklower } 8644323Ssklower if (Servername) { 8744323Ssklower int tlen = laddr.siso_tlen = strlen(Servername); 8844323Ssklower int len = TSEL(siso) + tlen - (caddr_t) &siso; 8944323Ssklower if (len > sizeof(*siso)) { 9044323Ssklower siso = (struct sockaddr_iso *)malloc(len); 9144323Ssklower *siso = laddr; 9244323Ssklower siso->siso_len = len; 9344323Ssklower } 9444323Ssklower bcopy(Servername, TSEL(siso), tlen); 9544323Ssklower } else { 9644323Ssklower port = htons(port); 9744323Ssklower laddr.siso_tlen = sizeof(port); 9844323Ssklower bcopy((char *)&port, TSEL(siso), sizeof(port)); 9944323Ssklower } 10044323Ssklower tisink(); 10144323Ssklower } 10244323Ssklower #define BIG 2048 10344323Ssklower #define MIDLIN 512 10444323Ssklower char readbuf[BIG]; 10544323Ssklower struct iovec iov[1] = { 10644323Ssklower readbuf, 10744323Ssklower sizeof readbuf, 10844323Ssklower }; 10944323Ssklower char name[MIDLIN]; 11044323Ssklower union { 11144323Ssklower struct { 11244323Ssklower struct cmsghdr cmhdr; 11344323Ssklower char cmdata[128 - sizeof(struct cmsghdr)]; 11444323Ssklower } cm; 11544323Ssklower char data[128]; 11644323Ssklower } cbuf; 11744323Ssklower #define control cbuf.data 11844323Ssklower struct msghdr msghdr = { 11944323Ssklower name, sizeof(name), 12044323Ssklower iov, sizeof(iov)/sizeof(iov[1]), 12144323Ssklower control, sizeof control, 12244323Ssklower 0 /* flags */ 12344323Ssklower }; 12444323Ssklower 12544323Ssklower tisink() 12644323Ssklower { 127*48712Ssklower int x, s, pid, on = 1, loop = 0, n, ns; 12844323Ssklower extern int errno; 129*48712Ssklower int socktype = (dgramp ? SOCK_DGRAM : SOCK_SEQPACKET); 130*48712Ssklower int addrlen = sizeof(faddr); 13144323Ssklower 132*48712Ssklower try(socket, (AF_ISO, socktype, 0),""); 13344323Ssklower 13444323Ssklower s = x; 13544323Ssklower 13644323Ssklower try(bind, (s, (struct sockaddr *) siso, siso->siso_len), ""); 13744323Ssklower 13844323Ssklower /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */ 139*48712Ssklower if (dgramp) { 140*48712Ssklower ns = s; 141*48712Ssklower goto dgram1; 142*48712Ssklower } 14344323Ssklower 14444323Ssklower try(listen, (s, 5), ""); 14544424Ssklower if (intercept) { 14644424Ssklower try(setsockopt, 14744424Ssklower (s, SOL_TRANSPORT, TPOPT_INTERCEPT, &on, sizeof(on)), ""); 14844424Ssklower } 14944323Ssklower for(;;) { 150*48712Ssklower int child; 15144323Ssklower char childname[50]; 15244323Ssklower 15344323Ssklower try (accept, (s, &faddr, &addrlen), ""); 15444323Ssklower ns = x; 15544323Ssklower dumpit("connection from:", &faddr, sizeof faddr); 15644600Ssklower if (mynamep || intercept) { 15744323Ssklower addrlen = sizeof(faddr); 15844323Ssklower try (getsockname, (ns, &faddr, &addrlen), ""); 15944323Ssklower dumpit("connected as:", &faddr, addrlen); 16044323Ssklower } 16144323Ssklower loop++; 162*48712Ssklower if(loop > 3) myexit(0); 16344323Ssklower if (forkp) { 16444323Ssklower try(fork, (), ""); 16544323Ssklower } else 16644323Ssklower x = 0; 16744323Ssklower if (x == 0) { 16844323Ssklower long n, count = 0, cn, flags; 16944323Ssklower records = 0; 17044323Ssklower if (confp) { 17144323Ssklower msghdr.msg_iovlen = 0; 17244323Ssklower msghdr.msg_namelen = 0; 17344323Ssklower msghdr.msg_controllen = 17444323Ssklower cbuf.cm.cmhdr.cmsg_len = sizeof (cbuf.cm.cmhdr); 17544323Ssklower cbuf.cm.cmhdr.cmsg_level = SOL_TRANSPORT; 17644323Ssklower cbuf.cm.cmhdr.cmsg_type = TPOPT_CFRM_DATA; 17744323Ssklower n = sendmsg(ns, &msghdr, 0); 178*48712Ssklower if (n < 0) { 17944323Ssklower printf("confirm: errno is %d\n", errno); 18044323Ssklower fflush(stdout); 18144323Ssklower perror("Confirm error"); 18244323Ssklower } else { 18344323Ssklower dbprintf("confim ok\n"); 18444323Ssklower } 18544323Ssklower sleep(10); 18644323Ssklower } 18748711Ssklower #ifdef ISODE_MODE 18848711Ssklower if (isode_mode) { 18948711Ssklower static char fdbuf[10]; 19048711Ssklower static char *nargv[4] = 19148711Ssklower {"/usr/sbin/isod.tsap", fdbuf, "", 0}; 19248711Ssklower sprintf(fdbuf, "Z%d", ns); 19348711Ssklower old_isod_main(3, nargv, xenvp); 19448711Ssklower } else 19548711Ssklower #endif 19644323Ssklower for (;;) { 197*48712Ssklower dgram1: 19844323Ssklower msghdr.msg_iovlen = 1; 19944323Ssklower msghdr.msg_controllen = sizeof(control); 200*48712Ssklower msghdr.msg_namelen = (dgramp ? (sizeof name) : 0); 20144323Ssklower iov->iov_len = sizeof(readbuf); 20244323Ssklower n = recvmsg(ns, &msghdr, 0); 20344323Ssklower flags = msghdr.msg_flags; 20444323Ssklower count++; 20544323Ssklower dbprintf("recvmsg from child %d got %d ctl %d flags %x\n", 206*48712Ssklower getpid(), n, (cn = msghdr.msg_controllen), flags); 20744323Ssklower fflush(stdout); 208*48712Ssklower if (dgramp && msghdr.msg_namelen && verbose) 209*48712Ssklower dumpit("from:\n", name, msghdr.msg_namelen); 21044323Ssklower if (cn && verbose) 21144323Ssklower dumpit("control data:\n", control, cn); 21244323Ssklower if (n < 0) { 21344323Ssklower fprintf(stderr, "errno is %d\n", errno); 21444323Ssklower perror("recvmsg"); 21544323Ssklower /*sleep (10);*/ 21644323Ssklower break; 21744323Ssklower } else { 21844323Ssklower if (verbose) 21944323Ssklower dumpit("data:\n", readbuf, n); 22044323Ssklower } 22144323Ssklower if (echop) { 22244323Ssklower n = answerback(flags, n, ns); 22344323Ssklower } 22444323Ssklower if (flags & MSG_EOR) 22544323Ssklower records++; 22644323Ssklower if (playtag && n == sizeof(your_it) && (flags & MSG_EOR) 22744323Ssklower && bcmp(readbuf, your_it, n) == 0) { 22844323Ssklower printf("Answering back!!!!\n"); 22944323Ssklower answerback(flags, n, ns); 23044323Ssklower answerback(flags, n, ns); 23144323Ssklower } 23244323Ssklower errno = 0; 23344323Ssklower } 23444323Ssklower } 23544323Ssklower myexit(0); 23644323Ssklower } 23744323Ssklower } 23844323Ssklower answerback(flags, n, ns) 23944323Ssklower { 24044323Ssklower msghdr.msg_controllen = 0; 24144323Ssklower msghdr.msg_iovlen = 1; 24244323Ssklower iov->iov_len = n; 24344323Ssklower n = sendmsg(ns, &msghdr, flags); 24444323Ssklower dbprintf("echoed %d\n", n); 24544323Ssklower return n; 24644323Ssklower } 24744323Ssklower 24844323Ssklower dumpit(what, where, n) 24944323Ssklower char *what; unsigned short *where; int n; 25044323Ssklower { 25144323Ssklower unsigned short *s = where; 25244323Ssklower unsigned short *z = where + (n+1)/2; 25344323Ssklower int count = 0; 25444323Ssklower printf(what); 25544323Ssklower while(s < z) { 25644323Ssklower count++; 25744323Ssklower printf("%x ",*s++); 25844323Ssklower if ((count & 15) == 0) 25944323Ssklower putchar('\n'); 26044323Ssklower } 26144323Ssklower if (count & 15) 26244323Ssklower putchar('\n'); 26344323Ssklower fflush(stdout); 26444323Ssklower } 26544323Ssklower myexit(n) 26644323Ssklower { 26744323Ssklower fflush(stderr); 26844323Ssklower printf("got %d records\n", records); 26944323Ssklower fflush(stdout); 27044323Ssklower exit(n); 27144323Ssklower } 272