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*44424Ssklower static char sccsid[] = "@(#)tisink.c 7.2 (Berkeley) 06/28/90"; 944323Ssklower #endif /* not lint */ 1044323Ssklower 1144323Ssklower /* 1244323Ssklower * This is a test program to be a sink for TP4 connections. 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; 4044323Ssklower 4144323Ssklower long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0; 42*44424Ssklower long records, intercept; 4344323Ssklower 4444323Ssklower char buf[2048]; 4544323Ssklower char your_it[] = "You're it!"; 4644323Ssklower 4744323Ssklower char *Servername; 4844323Ssklower 4944323Ssklower main(argc, argv) 5044323Ssklower int argc; 5144323Ssklower char *argv[]; 5244323Ssklower { 5344323Ssklower register char **av = argv; 5444323Ssklower register char *cp; 5544323Ssklower struct iso_addr iso_addr(); 5644323Ssklower 5744323Ssklower while(--argc > 0) { 5844323Ssklower av++; 5944323Ssklower if(strcmp(*av,"Servername")==0) { 6044323Ssklower av++; 6144323Ssklower Servername = *av; 6244323Ssklower argc--; 6344323Ssklower } else if (strcmp(*av,"host")==0) { 6444323Ssklower av++; 6544323Ssklower laddr.siso_addr = iso_addr(*av); 6644323Ssklower argc--; 6744323Ssklower } else if (strcmp(*av,"count")==0) { 6844323Ssklower av++; 6944323Ssklower sscanf(*av,"%ld",&count); 7044323Ssklower argc--; 7144323Ssklower } else if (strcmp(*av,"port")==0) { 7244323Ssklower av++; 7344323Ssklower sscanf(*av,"%hd",&port); 7444323Ssklower argc--; 7544323Ssklower } else if (strcmp(*av,"size")==0) { 7644323Ssklower av++; 7744323Ssklower sscanf(*av,"%ld",&size); 7844323Ssklower argc--; 7944323Ssklower } 8044323Ssklower } 8144323Ssklower if (Servername) { 8244323Ssklower int tlen = laddr.siso_tlen = strlen(Servername); 8344323Ssklower int len = TSEL(siso) + tlen - (caddr_t) &siso; 8444323Ssklower if (len > sizeof(*siso)) { 8544323Ssklower siso = (struct sockaddr_iso *)malloc(len); 8644323Ssklower *siso = laddr; 8744323Ssklower siso->siso_len = len; 8844323Ssklower } 8944323Ssklower bcopy(Servername, TSEL(siso), tlen); 9044323Ssklower } else { 9144323Ssklower port = htons(port); 9244323Ssklower laddr.siso_tlen = sizeof(port); 9344323Ssklower bcopy((char *)&port, TSEL(siso), sizeof(port)); 9444323Ssklower } 9544323Ssklower tisink(); 9644323Ssklower } 9744323Ssklower #define BIG 2048 9844323Ssklower #define MIDLIN 512 9944323Ssklower char readbuf[BIG]; 10044323Ssklower struct iovec iov[1] = { 10144323Ssklower readbuf, 10244323Ssklower sizeof readbuf, 10344323Ssklower }; 10444323Ssklower char name[MIDLIN]; 10544323Ssklower union { 10644323Ssklower struct { 10744323Ssklower struct cmsghdr cmhdr; 10844323Ssklower char cmdata[128 - sizeof(struct cmsghdr)]; 10944323Ssklower } cm; 11044323Ssklower char data[128]; 11144323Ssklower } cbuf; 11244323Ssklower #define control cbuf.data 11344323Ssklower struct msghdr msghdr = { 11444323Ssklower name, sizeof(name), 11544323Ssklower iov, sizeof(iov)/sizeof(iov[1]), 11644323Ssklower control, sizeof control, 11744323Ssklower 0 /* flags */ 11844323Ssklower }; 11944323Ssklower 12044323Ssklower tisink() 12144323Ssklower { 12244323Ssklower int x, s, pid, on = 1, loop = 0, n; 12344323Ssklower extern int errno; 12444323Ssklower 12544323Ssklower try(socket, (AF_ISO, SOCK_SEQPACKET, 0),""); 12644323Ssklower 12744323Ssklower s = x; 12844323Ssklower 12944323Ssklower try(bind, (s, (struct sockaddr *) siso, siso->siso_len), ""); 13044323Ssklower 13144323Ssklower /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */ 13244323Ssklower 13344323Ssklower try(listen, (s, 5), ""); 134*44424Ssklower if (intercept) { 135*44424Ssklower try(setsockopt, 136*44424Ssklower (s, SOL_TRANSPORT, TPOPT_INTERCEPT, &on, sizeof(on)), ""); 137*44424Ssklower } 13844323Ssklower for(;;) { 13944323Ssklower int child, ns; 14044323Ssklower int addrlen = sizeof(faddr); 14144323Ssklower char childname[50]; 14244323Ssklower 14344323Ssklower try (accept, (s, &faddr, &addrlen), ""); 14444323Ssklower ns = x; 14544323Ssklower dumpit("connection from:", &faddr, sizeof faddr); 14644323Ssklower if (mynamep) { 14744323Ssklower addrlen = sizeof(faddr); 14844323Ssklower try (getsockname, (ns, &faddr, &addrlen), ""); 14944323Ssklower dumpit("connected as:", &faddr, addrlen); 15044323Ssklower } 15144323Ssklower loop++; 15244323Ssklower if (loop > 3) myexit(0); 15344323Ssklower if (forkp) { 15444323Ssklower try(fork, (), ""); 15544323Ssklower } else 15644323Ssklower x = 0; 15744323Ssklower if (x == 0) { 15844323Ssklower long n, count = 0, cn, flags; 15944323Ssklower records = 0; 16044323Ssklower if (confp) { 16144323Ssklower msghdr.msg_iovlen = 0; 16244323Ssklower msghdr.msg_namelen = 0; 16344323Ssklower msghdr.msg_controllen = 16444323Ssklower cbuf.cm.cmhdr.cmsg_len = sizeof (cbuf.cm.cmhdr); 16544323Ssklower cbuf.cm.cmhdr.cmsg_level = SOL_TRANSPORT; 16644323Ssklower cbuf.cm.cmhdr.cmsg_type = TPOPT_CFRM_DATA; 16744323Ssklower n = sendmsg(ns, &msghdr, 0); 16844323Ssklower if (n <= 0) { 16944323Ssklower printf("confirm: errno is %d\n", errno); 17044323Ssklower fflush(stdout); 17144323Ssklower perror("Confirm error"); 17244323Ssklower } else { 17344323Ssklower dbprintf("confim ok\n"); 17444323Ssklower } 17544323Ssklower sleep(10); 17644323Ssklower } 17744323Ssklower for (;;) { 17844323Ssklower msghdr.msg_iovlen = 1; 17944323Ssklower msghdr.msg_controllen = sizeof(control); 18044323Ssklower iov->iov_len = sizeof(readbuf); 18144323Ssklower n = recvmsg(ns, &msghdr, 0); 18244323Ssklower flags = msghdr.msg_flags; 18344323Ssklower count++; 18444323Ssklower dbprintf("recvmsg from child %d got %d ctl %d flags %x\n", 18544323Ssklower getpid(), n, (cn = msghdr.msg_controllen), 18644323Ssklower flags); 18744323Ssklower fflush(stdout); 18844323Ssklower if (cn && verbose) 18944323Ssklower dumpit("control data:\n", control, cn); 19044323Ssklower if (n < 0) { 19144323Ssklower fprintf(stderr, "errno is %d\n", errno); 19244323Ssklower perror("recvmsg"); 19344323Ssklower /*sleep (10);*/ 19444323Ssklower break; 19544323Ssklower } else { 19644323Ssklower if (verbose) 19744323Ssklower dumpit("data:\n", readbuf, n); 19844323Ssklower } 19944323Ssklower if (echop) { 20044323Ssklower n = answerback(flags, n, ns); 20144323Ssklower } 20244323Ssklower if (flags & MSG_EOR) 20344323Ssklower records++; 20444323Ssklower if (playtag && n == sizeof(your_it) && (flags & MSG_EOR) 20544323Ssklower && bcmp(readbuf, your_it, n) == 0) { 20644323Ssklower printf("Answering back!!!!\n"); 20744323Ssklower answerback(flags, n, ns); 20844323Ssklower answerback(flags, n, ns); 20944323Ssklower } 21044323Ssklower errno = 0; 21144323Ssklower } 21244323Ssklower } 21344323Ssklower myexit(0); 21444323Ssklower } 21544323Ssklower } 21644323Ssklower answerback(flags, n, ns) 21744323Ssklower { 21844323Ssklower msghdr.msg_controllen = 0; 21944323Ssklower msghdr.msg_iovlen = 1; 22044323Ssklower iov->iov_len = n; 22144323Ssklower n = sendmsg(ns, &msghdr, flags); 22244323Ssklower dbprintf("echoed %d\n", n); 22344323Ssklower return n; 22444323Ssklower } 22544323Ssklower 22644323Ssklower dumpit(what, where, n) 22744323Ssklower char *what; unsigned short *where; int n; 22844323Ssklower { 22944323Ssklower unsigned short *s = where; 23044323Ssklower unsigned short *z = where + (n+1)/2; 23144323Ssklower int count = 0; 23244323Ssklower printf(what); 23344323Ssklower while(s < z) { 23444323Ssklower count++; 23544323Ssklower printf("%x ",*s++); 23644323Ssklower if ((count & 15) == 0) 23744323Ssklower putchar('\n'); 23844323Ssklower } 23944323Ssklower if (count & 15) 24044323Ssklower putchar('\n'); 24144323Ssklower fflush(stdout); 24244323Ssklower } 24344323Ssklower myexit(n) 24444323Ssklower { 24544323Ssklower fflush(stderr); 24644323Ssklower printf("got %d records\n", records); 24744323Ssklower fflush(stdout); 24844323Ssklower exit(n); 24944323Ssklower } 250