1*49352Sbostic /*- 2*49352Sbostic * Copyright (c) 1988, 1990 The Regents of the University of California. 344323Ssklower * All rights reserved. 444323Ssklower * 544323Ssklower * %sccs.include.redist.c% 644323Ssklower */ 7*49352Sbostic 844323Ssklower #ifndef lint 9*49352Sbostic char copyright[] = 10*49352Sbostic "@(#) Copyright (c) 1988, 1990 The Regents of the University of California.\n\ 11*49352Sbostic All rights reserved.\n"; 1244323Ssklower #endif /* not lint */ 1344323Ssklower 14*49352Sbostic #ifndef lint 15*49352Sbostic static char sccsid[] = "@(#)tisink.c 7.6 (Berkeley) 05/07/91"; 16*49352Sbostic #endif /* not lint */ 17*49352Sbostic 1844323Ssklower /* 1948712Ssklower * This is a test program to be a sink for ISO packets. 2044323Ssklower */ 2144323Ssklower #include <sys/param.h> 2244323Ssklower #include <sys/uio.h> 2344323Ssklower #include <sys/socket.h> 2444323Ssklower #include <sys/ioctl.h> 2544323Ssklower #include <net/route.h> 2644323Ssklower #include <net/if.h> 2744323Ssklower #define TCPT_NTIMERS 4 2844323Ssklower #include <netiso/iso.h> 2944323Ssklower #include <netiso/tp_param.h> 3044323Ssklower #include <netiso/tp_user.h> 3144323Ssklower 3244323Ssklower #include <stdio.h> 3344323Ssklower #include <errno.h> 3444323Ssklower #include <ctype.h> 3544323Ssklower #include <netdb.h> 3644323Ssklower 3744323Ssklower 3844323Ssklower #define dbprintf if(verbose)printf 3944323Ssklower #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\ 4044323Ssklower if(x<0) {perror("a"); myexit(0);}} 4144323Ssklower 4244323Ssklower 4344323Ssklower struct ifreq ifr; 4444323Ssklower short port = 3000; 4544323Ssklower struct sockaddr_iso faddr, laddr = { sizeof(laddr), AF_ISO }; 4644323Ssklower struct sockaddr_iso *siso = &laddr; 4748711Ssklower char **xenvp; 4844323Ssklower 4944323Ssklower long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0; 5048712Ssklower long records, intercept = 0, isode_mode = 0, dgramp = 0; 5144323Ssklower 5244323Ssklower char buf[2048]; 5344323Ssklower char your_it[] = "You're it!"; 5444323Ssklower 5544323Ssklower char *Servername; 5644323Ssklower 5748711Ssklower main(argc, argv, envp) 5844323Ssklower int argc; 5944323Ssklower char *argv[]; 6048711Ssklower char *envp[]; 6144323Ssklower { 6244323Ssklower register char **av = argv; 6344323Ssklower register char *cp; 6448712Ssklower struct iso_addr *iso_addr(); 6544323Ssklower 6648711Ssklower xenvp = envp; 6744323Ssklower while(--argc > 0) { 6844323Ssklower av++; 6944323Ssklower if(strcmp(*av,"Servername")==0) { 7044323Ssklower av++; 7144323Ssklower Servername = *av; 7244323Ssklower argc--; 7344323Ssklower } else if (strcmp(*av,"host")==0) { 7444323Ssklower av++; 7548712Ssklower laddr.siso_addr = *iso_addr(*av); 7644323Ssklower argc--; 7744323Ssklower } else if (strcmp(*av,"count")==0) { 7844323Ssklower av++; 7944323Ssklower sscanf(*av,"%ld",&count); 8044323Ssklower argc--; 8144323Ssklower } else if (strcmp(*av,"port")==0) { 8244323Ssklower av++; 8344323Ssklower sscanf(*av,"%hd",&port); 8444323Ssklower argc--; 8544323Ssklower } else if (strcmp(*av,"size")==0) { 8644323Ssklower av++; 8744323Ssklower sscanf(*av,"%ld",&size); 8844323Ssklower argc--; 8944600Ssklower } else if (strcmp(*av, "intercept")==0) { 9044600Ssklower intercept++; 9144323Ssklower } 9244323Ssklower } 9344323Ssklower if (Servername) { 9444323Ssklower int tlen = laddr.siso_tlen = strlen(Servername); 9544323Ssklower int len = TSEL(siso) + tlen - (caddr_t) &siso; 9644323Ssklower if (len > sizeof(*siso)) { 9744323Ssklower siso = (struct sockaddr_iso *)malloc(len); 9844323Ssklower *siso = laddr; 9944323Ssklower siso->siso_len = len; 10044323Ssklower } 10144323Ssklower bcopy(Servername, TSEL(siso), tlen); 10244323Ssklower } else { 10344323Ssklower port = htons(port); 10444323Ssklower laddr.siso_tlen = sizeof(port); 10544323Ssklower bcopy((char *)&port, TSEL(siso), sizeof(port)); 10644323Ssklower } 10744323Ssklower tisink(); 10844323Ssklower } 10944323Ssklower #define BIG 2048 11044323Ssklower #define MIDLIN 512 11144323Ssklower char readbuf[BIG]; 11244323Ssklower struct iovec iov[1] = { 11344323Ssklower readbuf, 11444323Ssklower sizeof readbuf, 11544323Ssklower }; 11644323Ssklower char name[MIDLIN]; 11744323Ssklower union { 11844323Ssklower struct { 11944323Ssklower struct cmsghdr cmhdr; 12044323Ssklower char cmdata[128 - sizeof(struct cmsghdr)]; 12144323Ssklower } cm; 12244323Ssklower char data[128]; 12344323Ssklower } cbuf; 12444323Ssklower #define control cbuf.data 12544323Ssklower struct msghdr msghdr = { 12644323Ssklower name, sizeof(name), 12744323Ssklower iov, sizeof(iov)/sizeof(iov[1]), 12844323Ssklower control, sizeof control, 12944323Ssklower 0 /* flags */ 13044323Ssklower }; 13144323Ssklower 13244323Ssklower tisink() 13344323Ssklower { 13448712Ssklower int x, s, pid, on = 1, loop = 0, n, ns; 13544323Ssklower extern int errno; 13648712Ssklower int socktype = (dgramp ? SOCK_DGRAM : SOCK_SEQPACKET); 13748712Ssklower int addrlen = sizeof(faddr); 13844323Ssklower 13948712Ssklower try(socket, (AF_ISO, socktype, 0),""); 14044323Ssklower 14144323Ssklower s = x; 14244323Ssklower 14344323Ssklower try(bind, (s, (struct sockaddr *) siso, siso->siso_len), ""); 14444323Ssklower 14544323Ssklower /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */ 14648712Ssklower if (dgramp) { 14748712Ssklower ns = s; 14848712Ssklower goto dgram1; 14948712Ssklower } 15044323Ssklower 15144323Ssklower try(listen, (s, 5), ""); 15244424Ssklower if (intercept) { 15344424Ssklower try(setsockopt, 15444424Ssklower (s, SOL_TRANSPORT, TPOPT_INTERCEPT, &on, sizeof(on)), ""); 15544424Ssklower } 15644323Ssklower for(;;) { 15748712Ssklower int child; 15844323Ssklower char childname[50]; 15944323Ssklower 16044323Ssklower try (accept, (s, &faddr, &addrlen), ""); 16144323Ssklower ns = x; 16244323Ssklower dumpit("connection from:", &faddr, sizeof faddr); 16344600Ssklower if (mynamep || intercept) { 16444323Ssklower addrlen = sizeof(faddr); 16544323Ssklower try (getsockname, (ns, &faddr, &addrlen), ""); 16644323Ssklower dumpit("connected as:", &faddr, addrlen); 16744323Ssklower } 16844323Ssklower loop++; 16948712Ssklower if(loop > 3) myexit(0); 17044323Ssklower if (forkp) { 17144323Ssklower try(fork, (), ""); 17244323Ssklower } else 17344323Ssklower x = 0; 17444323Ssklower if (x == 0) { 17544323Ssklower long n, count = 0, cn, flags; 17644323Ssklower records = 0; 17744323Ssklower if (confp) { 17844323Ssklower msghdr.msg_iovlen = 0; 17944323Ssklower msghdr.msg_namelen = 0; 18044323Ssklower msghdr.msg_controllen = 18144323Ssklower cbuf.cm.cmhdr.cmsg_len = sizeof (cbuf.cm.cmhdr); 18244323Ssklower cbuf.cm.cmhdr.cmsg_level = SOL_TRANSPORT; 18344323Ssklower cbuf.cm.cmhdr.cmsg_type = TPOPT_CFRM_DATA; 18444323Ssklower n = sendmsg(ns, &msghdr, 0); 18548712Ssklower if (n < 0) { 18644323Ssklower printf("confirm: errno is %d\n", errno); 18744323Ssklower fflush(stdout); 18844323Ssklower perror("Confirm error"); 18944323Ssklower } else { 19044323Ssklower dbprintf("confim ok\n"); 19144323Ssklower } 19244323Ssklower sleep(10); 19344323Ssklower } 19448711Ssklower #ifdef ISODE_MODE 19548711Ssklower if (isode_mode) { 19648711Ssklower static char fdbuf[10]; 19748711Ssklower static char *nargv[4] = 19848711Ssklower {"/usr/sbin/isod.tsap", fdbuf, "", 0}; 19948711Ssklower sprintf(fdbuf, "Z%d", ns); 20048711Ssklower old_isod_main(3, nargv, xenvp); 20148711Ssklower } else 20248711Ssklower #endif 20344323Ssklower for (;;) { 20448712Ssklower dgram1: 20544323Ssklower msghdr.msg_iovlen = 1; 20644323Ssklower msghdr.msg_controllen = sizeof(control); 20748712Ssklower msghdr.msg_namelen = (dgramp ? (sizeof name) : 0); 20844323Ssklower iov->iov_len = sizeof(readbuf); 20944323Ssklower n = recvmsg(ns, &msghdr, 0); 21044323Ssklower flags = msghdr.msg_flags; 21144323Ssklower count++; 21244323Ssklower dbprintf("recvmsg from child %d got %d ctl %d flags %x\n", 21348712Ssklower getpid(), n, (cn = msghdr.msg_controllen), flags); 21444323Ssklower fflush(stdout); 21548712Ssklower if (dgramp && msghdr.msg_namelen && verbose) 21648712Ssklower dumpit("from:\n", name, msghdr.msg_namelen); 21744323Ssklower if (cn && verbose) 21844323Ssklower dumpit("control data:\n", control, cn); 21944323Ssklower if (n < 0) { 22044323Ssklower fprintf(stderr, "errno is %d\n", errno); 22144323Ssklower perror("recvmsg"); 22244323Ssklower /*sleep (10);*/ 22344323Ssklower break; 22444323Ssklower } else { 22544323Ssklower if (verbose) 22644323Ssklower dumpit("data:\n", readbuf, n); 22744323Ssklower } 22844323Ssklower if (echop) { 22944323Ssklower n = answerback(flags, n, ns); 23044323Ssklower } 23144323Ssklower if (flags & MSG_EOR) 23244323Ssklower records++; 23344323Ssklower if (playtag && n == sizeof(your_it) && (flags & MSG_EOR) 23444323Ssklower && bcmp(readbuf, your_it, n) == 0) { 23544323Ssklower printf("Answering back!!!!\n"); 23644323Ssklower answerback(flags, n, ns); 23744323Ssklower answerback(flags, n, ns); 23844323Ssklower } 23944323Ssklower errno = 0; 24044323Ssklower } 24144323Ssklower } 24244323Ssklower myexit(0); 24344323Ssklower } 24444323Ssklower } 24544323Ssklower answerback(flags, n, ns) 24644323Ssklower { 24744323Ssklower msghdr.msg_controllen = 0; 24844323Ssklower msghdr.msg_iovlen = 1; 24944323Ssklower iov->iov_len = n; 25044323Ssklower n = sendmsg(ns, &msghdr, flags); 25144323Ssklower dbprintf("echoed %d\n", n); 25244323Ssklower return n; 25344323Ssklower } 25444323Ssklower 25544323Ssklower dumpit(what, where, n) 25644323Ssklower char *what; unsigned short *where; int n; 25744323Ssklower { 25844323Ssklower unsigned short *s = where; 25944323Ssklower unsigned short *z = where + (n+1)/2; 26044323Ssklower int count = 0; 26144323Ssklower printf(what); 26244323Ssklower while(s < z) { 26344323Ssklower count++; 26444323Ssklower printf("%x ",*s++); 26544323Ssklower if ((count & 15) == 0) 26644323Ssklower putchar('\n'); 26744323Ssklower } 26844323Ssklower if (count & 15) 26944323Ssklower putchar('\n'); 27044323Ssklower fflush(stdout); 27144323Ssklower } 27244323Ssklower myexit(n) 27344323Ssklower { 27444323Ssklower fflush(stderr); 27544323Ssklower printf("got %d records\n", records); 27644323Ssklower fflush(stdout); 27744323Ssklower exit(n); 27844323Ssklower } 279