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*44600Ssklower static char sccsid[] = "@(#)tisink.c 7.3 (Berkeley) 06/29/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*44600Ssklower long records, intercept = 0; 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--; 79*44600Ssklower } else if (strcmp(*av, "intercept")==0) { 80*44600Ssklower intercept++; 8144323Ssklower } 8244323Ssklower } 8344323Ssklower if (Servername) { 8444323Ssklower int tlen = laddr.siso_tlen = strlen(Servername); 8544323Ssklower int len = TSEL(siso) + tlen - (caddr_t) &siso; 8644323Ssklower if (len > sizeof(*siso)) { 8744323Ssklower siso = (struct sockaddr_iso *)malloc(len); 8844323Ssklower *siso = laddr; 8944323Ssklower siso->siso_len = len; 9044323Ssklower } 9144323Ssklower bcopy(Servername, TSEL(siso), tlen); 9244323Ssklower } else { 9344323Ssklower port = htons(port); 9444323Ssklower laddr.siso_tlen = sizeof(port); 9544323Ssklower bcopy((char *)&port, TSEL(siso), sizeof(port)); 9644323Ssklower } 9744323Ssklower tisink(); 9844323Ssklower } 9944323Ssklower #define BIG 2048 10044323Ssklower #define MIDLIN 512 10144323Ssklower char readbuf[BIG]; 10244323Ssklower struct iovec iov[1] = { 10344323Ssklower readbuf, 10444323Ssklower sizeof readbuf, 10544323Ssklower }; 10644323Ssklower char name[MIDLIN]; 10744323Ssklower union { 10844323Ssklower struct { 10944323Ssklower struct cmsghdr cmhdr; 11044323Ssklower char cmdata[128 - sizeof(struct cmsghdr)]; 11144323Ssklower } cm; 11244323Ssklower char data[128]; 11344323Ssklower } cbuf; 11444323Ssklower #define control cbuf.data 11544323Ssklower struct msghdr msghdr = { 11644323Ssklower name, sizeof(name), 11744323Ssklower iov, sizeof(iov)/sizeof(iov[1]), 11844323Ssklower control, sizeof control, 11944323Ssklower 0 /* flags */ 12044323Ssklower }; 12144323Ssklower 12244323Ssklower tisink() 12344323Ssklower { 12444323Ssklower int x, s, pid, on = 1, loop = 0, n; 12544323Ssklower extern int errno; 12644323Ssklower 12744323Ssklower try(socket, (AF_ISO, SOCK_SEQPACKET, 0),""); 12844323Ssklower 12944323Ssklower s = x; 13044323Ssklower 13144323Ssklower try(bind, (s, (struct sockaddr *) siso, siso->siso_len), ""); 13244323Ssklower 13344323Ssklower /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */ 13444323Ssklower 13544323Ssklower try(listen, (s, 5), ""); 13644424Ssklower if (intercept) { 13744424Ssklower try(setsockopt, 13844424Ssklower (s, SOL_TRANSPORT, TPOPT_INTERCEPT, &on, sizeof(on)), ""); 13944424Ssklower } 14044323Ssklower for(;;) { 14144323Ssklower int child, ns; 14244323Ssklower int addrlen = sizeof(faddr); 14344323Ssklower char childname[50]; 14444323Ssklower 14544323Ssklower try (accept, (s, &faddr, &addrlen), ""); 14644323Ssklower ns = x; 14744323Ssklower dumpit("connection from:", &faddr, sizeof faddr); 148*44600Ssklower if (mynamep || intercept) { 14944323Ssklower addrlen = sizeof(faddr); 15044323Ssklower try (getsockname, (ns, &faddr, &addrlen), ""); 15144323Ssklower dumpit("connected as:", &faddr, addrlen); 15244323Ssklower } 15344323Ssklower loop++; 15444323Ssklower if (loop > 3) myexit(0); 15544323Ssklower if (forkp) { 15644323Ssklower try(fork, (), ""); 15744323Ssklower } else 15844323Ssklower x = 0; 15944323Ssklower if (x == 0) { 16044323Ssklower long n, count = 0, cn, flags; 16144323Ssklower records = 0; 16244323Ssklower if (confp) { 16344323Ssklower msghdr.msg_iovlen = 0; 16444323Ssklower msghdr.msg_namelen = 0; 16544323Ssklower msghdr.msg_controllen = 16644323Ssklower cbuf.cm.cmhdr.cmsg_len = sizeof (cbuf.cm.cmhdr); 16744323Ssklower cbuf.cm.cmhdr.cmsg_level = SOL_TRANSPORT; 16844323Ssklower cbuf.cm.cmhdr.cmsg_type = TPOPT_CFRM_DATA; 16944323Ssklower n = sendmsg(ns, &msghdr, 0); 17044323Ssklower if (n <= 0) { 17144323Ssklower printf("confirm: errno is %d\n", errno); 17244323Ssklower fflush(stdout); 17344323Ssklower perror("Confirm error"); 17444323Ssklower } else { 17544323Ssklower dbprintf("confim ok\n"); 17644323Ssklower } 17744323Ssklower sleep(10); 17844323Ssklower } 17944323Ssklower for (;;) { 18044323Ssklower msghdr.msg_iovlen = 1; 18144323Ssklower msghdr.msg_controllen = sizeof(control); 18244323Ssklower iov->iov_len = sizeof(readbuf); 18344323Ssklower n = recvmsg(ns, &msghdr, 0); 18444323Ssklower flags = msghdr.msg_flags; 18544323Ssklower count++; 18644323Ssklower dbprintf("recvmsg from child %d got %d ctl %d flags %x\n", 18744323Ssklower getpid(), n, (cn = msghdr.msg_controllen), 18844323Ssklower flags); 18944323Ssklower fflush(stdout); 19044323Ssklower if (cn && verbose) 19144323Ssklower dumpit("control data:\n", control, cn); 19244323Ssklower if (n < 0) { 19344323Ssklower fprintf(stderr, "errno is %d\n", errno); 19444323Ssklower perror("recvmsg"); 19544323Ssklower /*sleep (10);*/ 19644323Ssklower break; 19744323Ssklower } else { 19844323Ssklower if (verbose) 19944323Ssklower dumpit("data:\n", readbuf, n); 20044323Ssklower } 20144323Ssklower if (echop) { 20244323Ssklower n = answerback(flags, n, ns); 20344323Ssklower } 20444323Ssklower if (flags & MSG_EOR) 20544323Ssklower records++; 20644323Ssklower if (playtag && n == sizeof(your_it) && (flags & MSG_EOR) 20744323Ssklower && bcmp(readbuf, your_it, n) == 0) { 20844323Ssklower printf("Answering back!!!!\n"); 20944323Ssklower answerback(flags, n, ns); 21044323Ssklower answerback(flags, n, ns); 21144323Ssklower } 21244323Ssklower errno = 0; 21344323Ssklower } 21444323Ssklower } 21544323Ssklower myexit(0); 21644323Ssklower } 21744323Ssklower } 21844323Ssklower answerback(flags, n, ns) 21944323Ssklower { 22044323Ssklower msghdr.msg_controllen = 0; 22144323Ssklower msghdr.msg_iovlen = 1; 22244323Ssklower iov->iov_len = n; 22344323Ssklower n = sendmsg(ns, &msghdr, flags); 22444323Ssklower dbprintf("echoed %d\n", n); 22544323Ssklower return n; 22644323Ssklower } 22744323Ssklower 22844323Ssklower dumpit(what, where, n) 22944323Ssklower char *what; unsigned short *where; int n; 23044323Ssklower { 23144323Ssklower unsigned short *s = where; 23244323Ssklower unsigned short *z = where + (n+1)/2; 23344323Ssklower int count = 0; 23444323Ssklower printf(what); 23544323Ssklower while(s < z) { 23644323Ssklower count++; 23744323Ssklower printf("%x ",*s++); 23844323Ssklower if ((count & 15) == 0) 23944323Ssklower putchar('\n'); 24044323Ssklower } 24144323Ssklower if (count & 15) 24244323Ssklower putchar('\n'); 24344323Ssklower fflush(stdout); 24444323Ssklower } 24544323Ssklower myexit(n) 24644323Ssklower { 24744323Ssklower fflush(stderr); 24844323Ssklower printf("got %d records\n", records); 24944323Ssklower fflush(stdout); 25044323Ssklower exit(n); 25144323Ssklower } 252