Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- to compile: gcc -Wall -O2 atest.c -o atest -lpthread
- to run: ./atest #
- (./atest 2 will transmit on /dev/dahdi/2 and receive on /dev/dahdi/33)
- dahdi configuration (/etc/dahdi/system.conf):
- span=1,0,0,ccs,hdb3,crc4
- span=2,1,0,ccs,hdb3,crc4
- bchan=1-15,17-31,32-46,48-62
- dchan=16,47
- dahdi version: 2.0.0rc4
- */
- #include <stdio.h>
- #include <stdint.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #include <unistd.h>
- #include <time.h>
- #include <sys/time.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/select.h>
- #include <sys/socket.h>
- #include <sys/ioctl.h>
- #include <arpa/inet.h>
- #include <signal.h>
- #include <fcntl.h>
- #include <errno.h>
- #include <dahdi/user.h>
- #include <pthread.h>
- int chw, chr;
- void *writer(void *p) {
- int fd, bs=160;
- char devpath[32];
- uint8_t data[160];
- int i,j;
- struct dahdi_bufferinfo bi;
- sprintf(devpath,"/dev/dahdi/%d",chw);
- fd = open(devpath, O_RDWR);
- if (fd < 0) {
- fprintf(stderr,"writer: open error on %s\n",devpath);
- return NULL;
- }
- // bufferinfo
- bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
- bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
- bi.numbufs = 32;
- bi.bufsize = 512;
- if (ioctl(fd,DAHDI_SET_BUFINFO,&bi)!=0) {
- fprintf(stderr,"** reader: unable to set buffering policy\n");
- }
- if (ioctl(fd, DAHDI_SET_BLOCKSIZE, &bs)) {
- fprintf(stderr,"writer: set_blocksize failed\n");
- return NULL;
- }
- data[0]=1;
- for(i=1;i<160;i++) {
- data[i] = (uint8_t) i;
- }
- for(;;) {
- j = write(fd, data, 160);
- if (j < 0) {
- fprintf(stderr,"writer: write error errno=%d\n",errno);
- } else if (j < 160) {
- fprintf(stderr,"writer: short write (%d/%d)\n",j,160);
- }
- }
- return NULL;
- }
- void *reader(void *p) {
- uint8_t next[256], data[160];
- int i,j,rok=0,ec,etot=0, eper=0;
- double conf, eps, peps, pconf;
- char devpath[32];
- int fd, bs=160;
- int64_t btot, bok, bbad;
- int64_t xtot, xok, xbad;
- time_t start, now, pstart;
- struct dahdi_bufferinfo bi;
- int a,b;
- sleep(1);
- sprintf(devpath,"/dev/dahdi/%d",chr);
- fd = open(devpath, O_RDWR);
- if (fd < 0) {
- fprintf(stderr,"reader: open error on %s\n",devpath);
- return NULL;
- }
- bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
- bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
- bi.numbufs = 32;
- bi.bufsize = 512;
- if (ioctl(fd,DAHDI_SET_BUFINFO,&bi)!=0) {
- fprintf(stderr,"** reader: unable to set buffering policy\n");
- }
- if (ioctl(fd, DAHDI_SET_BLOCKSIZE, &bs)) {
- fprintf(stderr,"reader: set_blocksize failed\n");
- return NULL;
- }
- for(i=0;i<256;i++) {
- next[i] = (uint8_t) ((i+1) % 160);
- }
- start=pstart=time(NULL);
- for(;;) {
- j = read(fd, data, 160);
- if (j < 0) {
- fprintf(stderr,"reader: read error errno=%d\n",errno);
- continue;
- } else if (j < 160) {
- fprintf(stderr,"reader: short read (%d/%d)\n",j,160);
- continue;
- }
- ec=0;
- for(i=1;i<160;i++)
- if (data[i] != next[(int) (data[i-1]) ] && data[i]!=1)
- ec++;
- if (ec!=0) {
- if (rok > 0) {
- fprintf(stderr,"reader: %d frames ok\n",rok);
- }
- rok = 0;
- fprintf(stderr,"reader: frame with %d error(s):\n",ec);
- for(i=0;i<160;i++) {
- a = b = (int) data[i];
- if (i!=0) b = (int) next[(int) (data[i-1])];
- if (a!=b)
- fprintf(stderr,"%.2X(%.2X) ",a,b);
- else
- fprintf(stderr,"%.2x ",a);
- }
- fprintf(stderr,"\n");
- etot += ec;
- eper += ec;
- } else {
- rok++;
- }
- if (rok == 50) {
- now = time(NULL);
- // total
- eps = ((double)etot) / ((int)(now - start));
- btot = 8000 * (now - start);
- bbad = etot;
- bok = btot - bbad;
- conf = 100.0 * ((double) bok / (double) btot);
- // last minute
- peps = ((double)eper) / ((int)(now - pstart));
- xtot = 8000 * (now - pstart);
- xbad = eper;
- xok = xtot - xbad;
- pconf = 100.0 * ((double) xok / (double) xtot);
- fprintf(stderr,"reader: 50 frames ok (errors/sec=%.1f reliability=%.6f%% / E=%d t=%d)\n",eps,conf,etot,(int)(now-start));
- if (now - pstart >= 60) {
- fprintf(stderr,"reader: last minute stats: errors=%d errors/sec=%.1f reliability=%.6f%%\n",eper,peps,pconf);
- pstart = time(NULL);
- eper = 0;
- }
- rok = 0;
- }
- }
- return NULL;
- }
- int main(int argc, char **argv) {
- pthread_t tw,tr;
- if (argc!=2) {
- fprintf(stderr, "usage: atest ch#\n");
- return 2;
- }
- chw = atoi(argv[1]);
- chr = chw + 31;
- printf("atest ch%d => ch%d\n",chw,chr);
- pthread_create(&tw, NULL, writer, NULL);
- pthread_create(&tr, NULL, reader, NULL);
- pthread_join(tw, NULL);
- pthread_join(tr, NULL);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement