/* asvcsend.c */ /* Test program for sending data over an native atm SVC */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include char buf[1024*16]; struct tms timeb; struct sockaddr_in name; char hnamebuf[80]; static struct timezone dummy = {0,0}; static int frames = 0; static struct timeval time1; static struct timeval time2; static double tu1; static double tu2; static int count = 0; static int fsize; static void sigintx( int xxxxx) { int fc; fc = frames; gettimeofday(&time2,&dummy); tu1 = 1000000 * time1.tv_sec; tu1 += time1.tv_usec; tu2 = 1000000 * time2.tv_sec; tu2 += time2.tv_usec; printf("Frames sent = %8d \n", fc); printf("MBits / sec = %8.3lf \n", 8.0 * fc * fsize / (tu2 - tu1)); printf("Frames/msec = %8.3lf \n", 1000 * fc / (tu2 - tu1)); exit(1); } char buf[16 * 1024]; void aip_send( int s, /* socket handle */ int blk, /* Block size */ int count) /* Total count. */ { int rc; int fc = 0; int sent = count; fsize = blk; signal(SIGINT, sigintx); rc = 0; memset(buf, 'a', sizeof(buf)); gettimeofday(&time1,&dummy); while ((sent > 0) || (count <= 0)) { long *loc; loc = (long *)buf; *loc = fc; rc = write(s, buf, blk); if (rc < 0) break; sent -= rc; fc += 1; frames += 1; } } int main(int argc,char **argv) { int s; int sel; int result; struct atm_qos qos; struct atm_sap sap; struct sockaddr_atmsvc addr,to_addr; int pcr,size; int amt; int fc; char dir[ATM_ESA_LEN+1]; int blk = 1000; int count = 10000; if (argc < 3) { printf("Usage: asvcsend dest-host-name pcr selector blk-size count \n"); exit(1); } if (argc > 4) sscanf(argv[4], "%d", &blk); if (argc > 5) sscanf(argv[5], "%d", &count); s=socket(PF_ATMSVC,SOCK_DGRAM,ATM_AAL5); if (s < 0) { printf("socket: \"%s\"",strerror(errno)); exit(-1); } memset(&qos,0,sizeof(qos)); qos.txtp.traffic_class=ATM_UBR; pcr=atoi(argv[2]); qos.txtp.min_pcr=0; qos.txtp.max_pcr=pcr; qos.txtp.max_sdu=8192; qos.txtp.max_cdv=0; qos.aal=ATM_AAL5; qos.rxtp.traffic_class=ATM_NONE; if (setsockopt (s,SOL_ATM,SO_ATMQOS,&qos,sizeof(qos))<0) { printf("setsockopt ATMQOS: \"%s\"",strerror(errno)); close(s); exit(-1); } memset(&sap,0,sizeof(sap)); sap.blli[0].l2_proto = ATM_L2_ISO8802; sap.blli[0].l3_proto = ATM_L3_NONE; if ((result = setsockopt(s,SOL_ATM, SO_ATMSAP, &sap,sizeof(sap))) < 0) { printf("setsockopt ATMSAP: \"%s\"",strerror(errno)); close(s); exit(-1); } memset(&to_addr,0,sizeof(to_addr)); result=text2atm(argv[1], (struct sockaddr *) &to_addr, sizeof(to_addr),T2A_SVC|T2A_NAME); if (result==-1) { printf("text2atm: \"%s\"",strerror(errno)); close(s); exit(-1); } if (argc > 3) { char c; c = atoi(argv[3]); to_addr.sas_addr.prv[19] = c; } else { to_addr.sas_addr.prv[19] = 5; } to_addr.sas_family = AF_ATMSVC; result = connect(s, (struct sockaddr *)&to_addr, sizeof(to_addr)); if (result<0) { printf("connect: \"%s\"",strerror(errno)); close(s); exit(-1); } #if 1 size=sizeof(addr); result= getpeername(s, (struct sockaddr *)&addr, &size); if (result < 0) { printf("getpeername: \"%s\"",strerror(errno)); close(s); exit(-1); } sel = addr.sas_addr.prv[19]; addr.sas_addr.prv[19] = 0; result = atm2text(dir, (ATM_ESA_LEN+1), (struct sockaddr *)&addr,A2T_NAME); if (result < 0) { printf("Couldn't get remote host name \n"); } else { printf("Connected ok to host %s at selector %d \n", dir, sel); } size=sizeof(qos); if ((result = getsockopt(s,SOL_ATM,SO_ATMQOS,&qos,&size)) < 0) { printf("getsockopt: \"%s\"",strerror(errno)); close(s); exit(-1); } printf("Traffic parameters:%d,%d,%d\n", qos.txtp.max_pcr,qos.txtp.min_pcr,qos.txtp.max_sdu); #endif aip_send(s, blk, count); times(&timeb); gettimeofday(&time2,&dummy); printf("time 1: %d %d\n",time1.tv_sec, time1.tv_usec); printf("time 2: %d %d\n",time2.tv_sec, time2.tv_usec); tu1 = 1000000 * time1.tv_sec; tu1 += time1.tv_usec; tu2 = 1000000 * time2.tv_sec; tu2 += time2.tv_usec; fc = frames; printf("Frames sent = %8d \n", fc); printf("MBits / sec = %8.3lf \n", 8.0 * fc * fsize / (tu2 - tu1)); printf("Frames/msec = %8.3lf \n", 1000 * fc / (tu2 - tu1)); printf("Block size is %d \n", blk); fprintf(stderr, "%6d \t %6d.%02d \t %6d.%02d \t %8.2lf \t %8.3lf \t %8d \t %8.3lf \n", blk, timeb.tms_utime / 100, timeb.tms_utime % 100, timeb.tms_stime / 100, timeb.tms_stime % 100, (tu2 - tu1)/ 1000000, (double)8.0 * count / (tu2 - tu1), fc, fc / (tu2 - tu1)); printf("Calling close \n"); close(s); printf("Socket closed \n"); fflush(stdout); }