1*44323Ssklower /* 2*44323Ssklower * Copyright (c) 1988, 1990 Regents of the University of California. 3*44323Ssklower * All rights reserved. 4*44323Ssklower * 5*44323Ssklower * %sccs.include.redist.c% 6*44323Ssklower */ 7*44323Ssklower #ifndef lint 8*44323Ssklower static char sccsid[] = "@(#)tisink.c 7.1 (Berkeley) 06/27/90"; 9*44323Ssklower #endif /* not lint */ 10*44323Ssklower 11*44323Ssklower /* 12*44323Ssklower * This is a test program to be a sink for TP4 connections. 13*44323Ssklower */ 14*44323Ssklower #include <sys/param.h> 15*44323Ssklower #include <sys/uio.h> 16*44323Ssklower #include <sys/socket.h> 17*44323Ssklower #include <sys/ioctl.h> 18*44323Ssklower #include <net/route.h> 19*44323Ssklower #include <net/if.h> 20*44323Ssklower #define TCPT_NTIMERS 4 21*44323Ssklower #include <netiso/iso.h> 22*44323Ssklower #include <netiso/tp_param.h> 23*44323Ssklower #include <netiso/tp_user.h> 24*44323Ssklower 25*44323Ssklower #include <stdio.h> 26*44323Ssklower #include <errno.h> 27*44323Ssklower #include <ctype.h> 28*44323Ssklower #include <netdb.h> 29*44323Ssklower 30*44323Ssklower 31*44323Ssklower #define dbprintf if(verbose)printf 32*44323Ssklower #define try(a,b,c) {x = (a b); dbprintf("%s%s returns %d\n",c,"a",x);\ 33*44323Ssklower if(x<0) {perror("a"); myexit(0);}} 34*44323Ssklower 35*44323Ssklower 36*44323Ssklower struct ifreq ifr; 37*44323Ssklower short port = 3000; 38*44323Ssklower struct sockaddr_iso faddr, laddr = { sizeof(laddr), AF_ISO }; 39*44323Ssklower struct sockaddr_iso *siso = &laddr; 40*44323Ssklower 41*44323Ssklower long size, count = 10, forkp, confp, echop, mynamep, verbose = 1, playtag = 0; 42*44323Ssklower long records; 43*44323Ssklower 44*44323Ssklower char buf[2048]; 45*44323Ssklower char your_it[] = "You're it!"; 46*44323Ssklower 47*44323Ssklower char *Servername; 48*44323Ssklower 49*44323Ssklower main(argc, argv) 50*44323Ssklower int argc; 51*44323Ssklower char *argv[]; 52*44323Ssklower { 53*44323Ssklower register char **av = argv; 54*44323Ssklower register char *cp; 55*44323Ssklower struct iso_addr iso_addr(); 56*44323Ssklower 57*44323Ssklower while(--argc > 0) { 58*44323Ssklower av++; 59*44323Ssklower if(strcmp(*av,"Servername")==0) { 60*44323Ssklower av++; 61*44323Ssklower Servername = *av; 62*44323Ssklower argc--; 63*44323Ssklower } else if (strcmp(*av,"host")==0) { 64*44323Ssklower av++; 65*44323Ssklower laddr.siso_addr = iso_addr(*av); 66*44323Ssklower argc--; 67*44323Ssklower } else if (strcmp(*av,"count")==0) { 68*44323Ssklower av++; 69*44323Ssklower sscanf(*av,"%ld",&count); 70*44323Ssklower argc--; 71*44323Ssklower } else if (strcmp(*av,"port")==0) { 72*44323Ssklower av++; 73*44323Ssklower sscanf(*av,"%hd",&port); 74*44323Ssklower argc--; 75*44323Ssklower } else if (strcmp(*av,"size")==0) { 76*44323Ssklower av++; 77*44323Ssklower sscanf(*av,"%ld",&size); 78*44323Ssklower argc--; 79*44323Ssklower } 80*44323Ssklower } 81*44323Ssklower if (Servername) { 82*44323Ssklower int tlen = laddr.siso_tlen = strlen(Servername); 83*44323Ssklower int len = TSEL(siso) + tlen - (caddr_t) &siso; 84*44323Ssklower if (len > sizeof(*siso)) { 85*44323Ssklower siso = (struct sockaddr_iso *)malloc(len); 86*44323Ssklower *siso = laddr; 87*44323Ssklower siso->siso_len = len; 88*44323Ssklower } 89*44323Ssklower bcopy(Servername, TSEL(siso), tlen); 90*44323Ssklower } else { 91*44323Ssklower port = htons(port); 92*44323Ssklower laddr.siso_tlen = sizeof(port); 93*44323Ssklower bcopy((char *)&port, TSEL(siso), sizeof(port)); 94*44323Ssklower } 95*44323Ssklower tisink(); 96*44323Ssklower } 97*44323Ssklower #define BIG 2048 98*44323Ssklower #define MIDLIN 512 99*44323Ssklower char readbuf[BIG]; 100*44323Ssklower struct iovec iov[1] = { 101*44323Ssklower readbuf, 102*44323Ssklower sizeof readbuf, 103*44323Ssklower }; 104*44323Ssklower char name[MIDLIN]; 105*44323Ssklower union { 106*44323Ssklower struct { 107*44323Ssklower struct cmsghdr cmhdr; 108*44323Ssklower char cmdata[128 - sizeof(struct cmsghdr)]; 109*44323Ssklower } cm; 110*44323Ssklower char data[128]; 111*44323Ssklower } cbuf; 112*44323Ssklower #define control cbuf.data 113*44323Ssklower struct msghdr msghdr = { 114*44323Ssklower name, sizeof(name), 115*44323Ssklower iov, sizeof(iov)/sizeof(iov[1]), 116*44323Ssklower control, sizeof control, 117*44323Ssklower 0 /* flags */ 118*44323Ssklower }; 119*44323Ssklower 120*44323Ssklower tisink() 121*44323Ssklower { 122*44323Ssklower int x, s, pid, on = 1, loop = 0, n; 123*44323Ssklower extern int errno; 124*44323Ssklower 125*44323Ssklower try(socket, (AF_ISO, SOCK_SEQPACKET, 0),""); 126*44323Ssklower 127*44323Ssklower s = x; 128*44323Ssklower 129*44323Ssklower try(bind, (s, (struct sockaddr *) siso, siso->siso_len), ""); 130*44323Ssklower 131*44323Ssklower /*try(setsockopt, (s, SOL_SOCKET, SO_DEBUG, &on, sizeof (on)), ""); */ 132*44323Ssklower 133*44323Ssklower try(listen, (s, 5), ""); 134*44323Ssklower for(;;) { 135*44323Ssklower int child, ns; 136*44323Ssklower int addrlen = sizeof(faddr); 137*44323Ssklower char childname[50]; 138*44323Ssklower 139*44323Ssklower try (accept, (s, &faddr, &addrlen), ""); 140*44323Ssklower ns = x; 141*44323Ssklower dumpit("connection from:", &faddr, sizeof faddr); 142*44323Ssklower if (mynamep) { 143*44323Ssklower addrlen = sizeof(faddr); 144*44323Ssklower try (getsockname, (ns, &faddr, &addrlen), ""); 145*44323Ssklower dumpit("connected as:", &faddr, addrlen); 146*44323Ssklower } 147*44323Ssklower loop++; 148*44323Ssklower if (loop > 3) myexit(0); 149*44323Ssklower if (forkp) { 150*44323Ssklower try(fork, (), ""); 151*44323Ssklower } else 152*44323Ssklower x = 0; 153*44323Ssklower if (x == 0) { 154*44323Ssklower long n, count = 0, cn, flags; 155*44323Ssklower records = 0; 156*44323Ssklower if (confp) { 157*44323Ssklower msghdr.msg_iovlen = 0; 158*44323Ssklower msghdr.msg_namelen = 0; 159*44323Ssklower msghdr.msg_controllen = 160*44323Ssklower cbuf.cm.cmhdr.cmsg_len = sizeof (cbuf.cm.cmhdr); 161*44323Ssklower cbuf.cm.cmhdr.cmsg_level = SOL_TRANSPORT; 162*44323Ssklower cbuf.cm.cmhdr.cmsg_type = TPOPT_CFRM_DATA; 163*44323Ssklower n = sendmsg(ns, &msghdr, 0); 164*44323Ssklower if (n <= 0) { 165*44323Ssklower printf("confirm: errno is %d\n", errno); 166*44323Ssklower fflush(stdout); 167*44323Ssklower perror("Confirm error"); 168*44323Ssklower } else { 169*44323Ssklower dbprintf("confim ok\n"); 170*44323Ssklower } 171*44323Ssklower sleep(10); 172*44323Ssklower } 173*44323Ssklower for (;;) { 174*44323Ssklower msghdr.msg_iovlen = 1; 175*44323Ssklower msghdr.msg_controllen = sizeof(control); 176*44323Ssklower iov->iov_len = sizeof(readbuf); 177*44323Ssklower n = recvmsg(ns, &msghdr, 0); 178*44323Ssklower flags = msghdr.msg_flags; 179*44323Ssklower count++; 180*44323Ssklower dbprintf("recvmsg from child %d got %d ctl %d flags %x\n", 181*44323Ssklower getpid(), n, (cn = msghdr.msg_controllen), 182*44323Ssklower flags); 183*44323Ssklower fflush(stdout); 184*44323Ssklower if (cn && verbose) 185*44323Ssklower dumpit("control data:\n", control, cn); 186*44323Ssklower if (n < 0) { 187*44323Ssklower fprintf(stderr, "errno is %d\n", errno); 188*44323Ssklower perror("recvmsg"); 189*44323Ssklower /*sleep (10);*/ 190*44323Ssklower break; 191*44323Ssklower } else { 192*44323Ssklower if (verbose) 193*44323Ssklower dumpit("data:\n", readbuf, n); 194*44323Ssklower } 195*44323Ssklower if (echop) { 196*44323Ssklower n = answerback(flags, n, ns); 197*44323Ssklower } 198*44323Ssklower if (flags & MSG_EOR) 199*44323Ssklower records++; 200*44323Ssklower if (playtag && n == sizeof(your_it) && (flags & MSG_EOR) 201*44323Ssklower && bcmp(readbuf, your_it, n) == 0) { 202*44323Ssklower printf("Answering back!!!!\n"); 203*44323Ssklower answerback(flags, n, ns); 204*44323Ssklower answerback(flags, n, ns); 205*44323Ssklower } 206*44323Ssklower errno = 0; 207*44323Ssklower } 208*44323Ssklower } 209*44323Ssklower myexit(0); 210*44323Ssklower } 211*44323Ssklower } 212*44323Ssklower answerback(flags, n, ns) 213*44323Ssklower { 214*44323Ssklower msghdr.msg_controllen = 0; 215*44323Ssklower msghdr.msg_iovlen = 1; 216*44323Ssklower iov->iov_len = n; 217*44323Ssklower n = sendmsg(ns, &msghdr, flags); 218*44323Ssklower dbprintf("echoed %d\n", n); 219*44323Ssklower return n; 220*44323Ssklower } 221*44323Ssklower 222*44323Ssklower dumpit(what, where, n) 223*44323Ssklower char *what; unsigned short *where; int n; 224*44323Ssklower { 225*44323Ssklower unsigned short *s = where; 226*44323Ssklower unsigned short *z = where + (n+1)/2; 227*44323Ssklower int count = 0; 228*44323Ssklower printf(what); 229*44323Ssklower while(s < z) { 230*44323Ssklower count++; 231*44323Ssklower printf("%x ",*s++); 232*44323Ssklower if ((count & 15) == 0) 233*44323Ssklower putchar('\n'); 234*44323Ssklower } 235*44323Ssklower if (count & 15) 236*44323Ssklower putchar('\n'); 237*44323Ssklower fflush(stdout); 238*44323Ssklower } 239*44323Ssklower myexit(n) 240*44323Ssklower { 241*44323Ssklower fflush(stderr); 242*44323Ssklower printf("got %d records\n", records); 243*44323Ssklower fflush(stdout); 244*44323Ssklower exit(n); 245*44323Ssklower } 246