Advertisement
Guest User

Pulga

a guest
Nov 12th, 2008
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.73 KB | None | 0 0
  1. /*
  2.  
  3.  to compile: gcc -Wall -O2 atest.c -o atest -lpthread
  4.  to run: ./atest #
  5.  
  6.  (./atest 2 will transmit on /dev/dahdi/2 and receive on /dev/dahdi/33)
  7.  
  8.  dahdi configuration (/etc/dahdi/system.conf):
  9.  
  10.  span=1,0,0,ccs,hdb3,crc4
  11.  span=2,1,0,ccs,hdb3,crc4
  12.  bchan=1-15,17-31,32-46,48-62
  13.  dchan=16,47
  14.  
  15.  dahdi version: 2.0.0rc4
  16.  
  17. */
  18.  
  19. #include <stdio.h>
  20. #include <stdint.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <ctype.h>
  24. #include <unistd.h>
  25. #include <time.h>
  26. #include <sys/time.h>
  27. #include <sys/types.h>
  28. #include <sys/stat.h>
  29. #include <sys/select.h>
  30. #include <sys/socket.h>
  31. #include <sys/ioctl.h>
  32. #include <arpa/inet.h>
  33. #include <signal.h>
  34. #include <fcntl.h>
  35. #include <errno.h>
  36. #include <dahdi/user.h>
  37. #include <pthread.h>
  38.  
  39. int chw, chr;
  40.  
  41. void *writer(void *p) {
  42.   int fd, bs=160;
  43.   char devpath[32];
  44.   uint8_t data[160];
  45.   int i,j;
  46.   struct dahdi_bufferinfo bi;
  47.  
  48.   sprintf(devpath,"/dev/dahdi/%d",chw);
  49.   fd = open(devpath, O_RDWR);
  50.   if (fd < 0) {
  51.     fprintf(stderr,"writer: open error on %s\n",devpath);
  52.     return NULL;
  53.   }
  54.  
  55.   // bufferinfo
  56.   bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
  57.   bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
  58.   bi.numbufs = 32;
  59.   bi.bufsize = 512;
  60.   if (ioctl(fd,DAHDI_SET_BUFINFO,&bi)!=0) {
  61.     fprintf(stderr,"** reader: unable to set buffering policy\n");
  62.   }
  63.  
  64.   if (ioctl(fd, DAHDI_SET_BLOCKSIZE, &bs)) {
  65.     fprintf(stderr,"writer: set_blocksize failed\n");
  66.     return NULL;
  67.   }
  68.  
  69.   data[0]=1;
  70.   for(i=1;i<160;i++) {
  71.     data[i] = (uint8_t) i;
  72.   }
  73.  
  74.   for(;;) {
  75.     j = write(fd, data, 160);
  76.     if (j < 0) {
  77.       fprintf(stderr,"writer: write error errno=%d\n",errno);
  78.     } else if (j < 160) {
  79.       fprintf(stderr,"writer: short write (%d/%d)\n",j,160);
  80.     }
  81.   }
  82.  
  83.   return NULL;
  84. }
  85.  
  86. void *reader(void *p) {
  87.   uint8_t next[256], data[160];
  88.   int i,j,rok=0,ec,etot=0, eper=0;
  89.   double conf, eps, peps, pconf;
  90.   char devpath[32];
  91.   int fd, bs=160;
  92.   int64_t btot, bok, bbad;
  93.   int64_t xtot, xok, xbad;
  94.   time_t start, now, pstart;
  95.   struct dahdi_bufferinfo bi;
  96.   int a,b;
  97.  
  98.   sleep(1);
  99.  
  100.   sprintf(devpath,"/dev/dahdi/%d",chr);
  101.   fd = open(devpath, O_RDWR);
  102.   if (fd < 0) {
  103.     fprintf(stderr,"reader: open error on %s\n",devpath);
  104.     return NULL;
  105.   }
  106.  
  107.   bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
  108.   bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
  109.   bi.numbufs = 32;
  110.   bi.bufsize = 512;
  111.   if (ioctl(fd,DAHDI_SET_BUFINFO,&bi)!=0) {
  112.     fprintf(stderr,"** reader: unable to set buffering policy\n");
  113.   }
  114.  
  115.   if (ioctl(fd, DAHDI_SET_BLOCKSIZE, &bs)) {
  116.     fprintf(stderr,"reader: set_blocksize failed\n");
  117.     return NULL;
  118.   }
  119.  
  120.   for(i=0;i<256;i++) {
  121.     next[i] = (uint8_t) ((i+1) % 160);
  122.   }
  123.  
  124.   start=pstart=time(NULL);
  125.   for(;;) {
  126.     j = read(fd, data, 160);
  127.     if (j < 0) {
  128.       fprintf(stderr,"reader: read error errno=%d\n",errno);
  129.       continue;
  130.     } else if (j < 160) {
  131.       fprintf(stderr,"reader: short read (%d/%d)\n",j,160);
  132.       continue;
  133.     }
  134.     ec=0;
  135.     for(i=1;i<160;i++)
  136.       if (data[i] != next[(int) (data[i-1]) ] && data[i]!=1)
  137.     ec++;
  138.     if (ec!=0) {
  139.       if (rok > 0) {
  140.     fprintf(stderr,"reader: %d frames ok\n",rok);
  141.       }
  142.       rok = 0;
  143.       fprintf(stderr,"reader: frame with %d error(s):\n",ec);
  144.       for(i=0;i<160;i++) {
  145.     a = b = (int) data[i];
  146.     if (i!=0) b = (int) next[(int) (data[i-1])];
  147.     if (a!=b)
  148.       fprintf(stderr,"%.2X(%.2X) ",a,b);
  149.     else
  150.       fprintf(stderr,"%.2x     ",a);
  151.       }
  152.       fprintf(stderr,"\n");
  153.       etot += ec;
  154.       eper += ec;
  155.     } else {
  156.       rok++;
  157.     }
  158.     if (rok == 50) {
  159.       now = time(NULL);
  160.  
  161.       // total
  162.       eps = ((double)etot) /  ((int)(now - start));
  163.       btot = 8000 * (now - start);
  164.       bbad = etot;
  165.       bok  = btot - bbad;
  166.       conf = 100.0 * ((double) bok / (double) btot);
  167.  
  168.       // last minute
  169.       peps  = ((double)eper) /  ((int)(now - pstart));
  170.       xtot  = 8000 * (now - pstart);
  171.       xbad  = eper;
  172.       xok   = xtot - xbad;
  173.       pconf = 100.0 * ((double) xok / (double) xtot);
  174.  
  175.       fprintf(stderr,"reader: 50 frames ok (errors/sec=%.1f reliability=%.6f%% / E=%d t=%d)\n",eps,conf,etot,(int)(now-start));
  176.  
  177.       if (now - pstart >= 60) {
  178.     fprintf(stderr,"reader: last minute stats: errors=%d errors/sec=%.1f reliability=%.6f%%\n",eper,peps,pconf);
  179.     pstart = time(NULL);
  180.     eper = 0;
  181.       }
  182.  
  183.       rok = 0;
  184.     }
  185.   }
  186.  
  187.   return NULL;
  188. }
  189.  
  190. int main(int argc, char **argv) {
  191.   pthread_t tw,tr;
  192.  
  193.   if (argc!=2) {
  194.     fprintf(stderr, "usage: atest ch#\n");
  195.     return 2;
  196.   }
  197.  
  198.   chw = atoi(argv[1]);
  199.   chr = chw + 31;
  200.  
  201.   printf("atest ch%d => ch%d\n",chw,chr);
  202.  
  203.   pthread_create(&tw, NULL, writer, NULL);
  204.   pthread_create(&tr, NULL, reader, NULL);
  205.  
  206.   pthread_join(tw, NULL);
  207.   pthread_join(tr, NULL);
  208.  
  209.   return 0;
  210. }
  211.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement