📄 anet_drv.c
字号:
#include <poll.h>#include <stdio.h>#include <stdlib.h>#include "simdrv.h"#include "simu112.h"#include "simufunc.h"#define MAX_FAIL_TIMES 4#define WAIT_TIME 120000#define RESULT_OTHER -4#define RESULT_NULL -5#define RESULT_BUSY -6#define RESULT_TIMEOUT -7FILE *lp;int anet_proc(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg);int f_anet_result_receive(int sock, char *szBuffer, int times, int wait_time);int f_anet_test_process(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg);int f_anet_analysis(char *receive_str, TESTMSG * testmsg);void f_anet_get_res(char *result, char *val_str);void f_anet_get_cap(char *result, char *val_str);void f_anet_get_vol(char *result, char *val_str);int f_anet_get_result(char *str, char *result);int f_anet_get_code(char *str);static char receive_str[2048];/*********************************************************Function:int anet_proc(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg)Narrative: Called in simdrv.c. It is the main flow of anet_drv driver.Param: int port_fd - socket id char command_type - type of test command char *phone_number - a pionter to accessed telephone number char *v5en - a pointer to V5 equipment number char *offhook - a pointer to type of offhook char *num - a pointer to times of offhook char *loop - a pointer to type of ISDN loop char *channel - a pointer to ISDN channel char usegrade - flag of using grade char *grade - a pointer to flag of forced test char *TSN - a pointer to test serial TESTMSG * testmsg - struct of test messageReturn: 0 OK or Null TelephoneNumber or Line Busy. AM_NO_RESPONSE AM_PORT_DOWN AM_UNREADY_ERROR AM_TIME_OUT*********************************************************/int anet_proc(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg){ int ret; int test_stat = 1; int fail_count; struct tm *ctime; time_t lt;#ifdef DEBUG lt = time(NULL); ctime = localtime(<); lp = backup_log("./anet_drv.log"); /* lp=fopen("./anet_drv.log","a+"); */ fprintf(lp, "\n>>> Start Access Net Test at %4d.%02d.%02d %02d:%02d:%02d <<<\n", ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday, ctime->tm_hour, ctime->tm_min, ctime->tm_sec); fflush(lp);#endif poll(0, 0, 500); ret = f_anet_test_process(port_fd, command_type, phone_number, v5en, offhook, num, loop, channel, usegrade, grade, TSN, testmsg);#ifdef DEBUG lt = time(NULL); ctime = localtime(<); fprintf(lp, "\n>>> Stop Access Net Test at %4d.%02d.%02d %02d:%02d:%02d <<<\n", ctime->tm_year + 1900, ctime->tm_mon + 1, ctime->tm_mday, ctime->tm_hour, ctime->tm_min, ctime->tm_sec); fflush(lp); fclose(lp);#endif switch (ret) { case -1: ret = AM_UNREADY_ERROR; break; case -2: ret = AM_NO_RESPONSE; break; case -3: ret = AM_PORT_DOWN; break; case RESULT_OTHER: ret = AM_UNREADY_ERROR; break; case RESULT_NULL: ret = 0; strcpy(testmsg->TestResult.TestConclusion, "V08"); break; case RESULT_BUSY: ret = 0; strcpy(testmsg->TestResult.TestConclusion, "V6"); break; case RESULT_TIMEOUT: ret = AM_TIME_OUT; break; } return (ret);}/* end of anet_proc *//*********************************************************Function:int anet_conn_switch(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg)Narrative: Detect if interface to switch runs well by sending a wakeup signal or a command.Param: int port_fd - socket id char command_type - type of test command char *phone_number - a pionter to accessed telephone number char *v5en - a pointer to char *offhook - char *num - char *loop - char *channel - char usegrade - char *grade - char *TSN - TESTMSG * testmsg - struct of test message Return: 0 OK. -1 No fd ready when timeout. -2 an error occur.*********************************************************/int anet_conn_switch(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg){ int ret; receive_str[0] = 0; ret = anet_proc(port_fd, command_type, phone_number, v5en, offhook, num, loop, channel, usegrade, grade, TSN, testmsg); if (ret == 0) return 0; else if (strlen(receive_str) == 0) return -1; else return -2;}/*********************************************************Function:int f_anet_test_process(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg)Narrative: Send test command to switch and get test value.Param: int port_fd - socket id char command_type - type of test command char *phone_number - a pionter to accessed telephone number char *v5en - a pointer to char *offhook - char *num - char *loop - char *channel - char usegrade - char *grade - char *TSN - TESTMSG * testmsg - struct of test messageReturn: 0 OK. -1 An error of hangup occur when reading. -2 No fd ready when timeout. -3 An error occur when performing poll or read. RESULT_OTHER No expected string. RESULT_BUSY Line busy. RESULT_NULL Ivalid telephone number.********************************************************/int f_anet_test_process(int port_fd, char command_type, char *phone_number, char *v5en, char *offhook, char *num, char *loop, char *channel, char usegrade, char *grade, char *TSN, TESTMSG * testmsg){ char test_str[120]; int ret; int i; int error_code; char *p, *q; char new_number[40]; char grade_str[10]; f_trim_space(phone_number); if (v5en[0] != '\0') sprintf(new_number, "%s V5EN=%s", phone_number, v5en); else strcpy(new_number, phone_number); /* f_trim_space(grade); */#ifdef DEBUG fprintf(lp, "Grade=%s\n", grade); fflush(lp);#endif if (usegrade == '1') { if (grade[0] == '1') sprintf(grade_str, "GRADE=1 "); else sprintf(grade_str, "GRADE=0 "); } else grade_str[0] = '\0'; switch (command_type) { case TST_FULL: sprintf(test_str, "INVOKEID=%s FULLTEST %sTYPE=1:DN=%s;", TSN, grade_str, new_number); break; case TST_LOOP: case TST_QUERY: sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=0 TYPE=1:DN=%s;", TSN, grade_str, new_number); break; case CONN_TSTSIG_SOUNDER: sprintf(test_str, "INVOKEID=%s HOWLER LONG=10:DN=%s;", TSN, new_number); break; case MEAS_TN: sprintf(test_str, "INVOKEID=%s DIALTONE %sOFFHOOK=%s NUM=%s:DN=%s;", TSN, grade_str, offhook, num, new_number); break; case MEAS_FEEDVOL: sprintf(test_str, "INVOKEID=%s FEEDVOL %sTYPE=1:DN=%s;", TSN, grade_str, new_number); break; case MEAS_LOOPRING: sprintf(test_str, "INVOKEID=%s LOOPRING %sTYPE=1:DN=%s;", TSN, grade_str, new_number); break; case MEAS_OUTPLSE: sprintf(test_str, "INVOKEID=%s DIGTEST NUM=%s TYPE=1:DN=%s;", TSN, num, new_number); break; case MEAS_VG_DC: sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=2 TYPE=1:DN=%s;", TSN, grade_str, new_number); break; case MEAS_VG_AC: sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=1 TYPE=1:DN=%s;", TSN, grade_str, new_number); break; case MEAS_LOOP_CUREST: sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=3 TYPE=1:DN=%s;", TSN, grade_str, new_number); break; case MEAS_LOOP_RES: sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=4 TYPE=1:DN=%s;", TSN, grade_str, new_number); break; case MEAS_RES: sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=5 TYPE=1:DN=%s;", TSN, grade_str, new_number); break; case MEAS_CAPNC: sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=6 TYPE=1:DN=%s;", TSN, grade_str, new_number); break; case MEAS_IMPED: sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=7 TYPE=1:DN=%s;", TSN, grade_str, new_number); break; case MEAS_NSE: sprintf(test_str, "INVOKEID=%s TESTOUTSIDE %sFLAG=8 TYPE=1:DN=%s;", TSN, grade_str, new_number); break; case MEAS_ISDN: sprintf(test_str, "INVOKEID=%s ISDNTEST %sLOOP=%s CHANNEL=%s :DN=%s;", TSN, grade_str, loop, channel, new_number); break; case TST_RINGSGNL: sprintf(test_str, "INVOKEID=%s RING LONG=30:DN=%s;", TSN, new_number); break; case CONN_MONEST: sprintf(test_str, "INVOKEID=%s TALKSTART:DN=%s;", TSN, new_number); break; case DISC_MON: sprintf(test_str, "INVOKEID=%s TALKSTOP:DN=%s;", TSN, new_number); break; case CONN_MONBRDGD: sprintf(test_str, "INVOKEID=%s CONNECTUSER TYPE=0:DN=%s;", TSN, new_number); break; case CONN_FMONBRDGD: sprintf(test_str, "INVOKEID=%s CONNECTUSER TYPE=1:DN=%s;", TSN, new_number); break; }#ifdef DEBUG fprintf(lp, "send:%s\ncommand:%d\n", test_str, command_type); fflush(lp);#endif writeport(port_fd, test_str); if (command_type == MEAS_OUTPLSE) ret = f_anet_result_receive(port_fd, receive_str, atoi(num), 60000); else ret = f_anet_result_receive(port_fd, receive_str, 1, WAIT_TIME); p = (char *) strstr(receive_str, "STATE=");#ifdef DEBUG if (p != NULL) { fprintf(lp, "p=:%s,p+6:%c\n", p, *(p + 6)); fflush(lp); }#endif if ((p == NULL) || ((p != NULL) && *(p + 6) == '0')) { switch (command_type) { case TST_FULL: case TST_LOOP: case TST_QUERY: case MEAS_VG_DC: case MEAS_VG_AC: case MEAS_LOOP_CUREST: case MEAS_LOOP_RES: case MEAS_RES: case MEAS_CAPNC: case MEAS_IMPED: case MEAS_NSE: if (!ret) ret = f_anet_analysis(receive_str, testmsg); break; case CONN_TSTSIG_SOUNDER: case MEAS_TN: case MEAS_FEEDVOL: case MEAS_LOOPRING: case MEAS_OUTPLSE: case MEAS_ISDN: case TST_RINGSGNL: case CONN_MONEST: case DISC_MON: case CONN_MONBRDGD: case CONN_FMONBRDGD: if (command_type == MEAS_OUTPLSE) { if (f_anet_get_DIGIT(receive_str, testmsg->TestResult.TestConclusion) != 0) ret = RESULT_OTHER; } else { if (command_type == CONN_MONEST || command_type == CONN_MONBRDGD || command_type == CONN_FMONBRDGD) { q = (char *) strstr(receive_str, "RESULT="); p = (char *) strstr(receive_str, "TALKDN="); if (p > q) p = q; } else p = (char *) strstr(receive_str, "RESULT="); if (!p) ret = RESULT_OTHER; else { i = 0; while (*p != '\0' && *p != ';' && i < 100) { testmsg->TestResult.TestConclusion[i] = *p; ++p; ++i; } testmsg->TestResult.TestConclusion[i] = '\0'; } } break; } } else { p = (char *) strstr(receive_str, "ERROR="); if (p == NULL) ret = RESULT_OTHER; else { ret = f_anet_get_code(p + 6) + AM_ANET_ERR1 - 1; if (command_type == TST_FULL || command_type == TST_LOOP || command_type == TST_QUERY) { if (ret == AM_ANET_ERR4 || ret == AM_ANET_ERR5) ret = RESULT_BUSY; else if (ret == AM_ANET_ERR3) ret = RESULT_NULL; } } } return (ret); /* This is a Demo for test results *//* receive_str[0]='\0'; ret=0; switch (command_type) { case TST_FULL: strcpy(receive_str,"INVOKEID=10 FULLTEST DN=6114995:STATE=0 OUTRESULT=0 DIALTONERESULT=1 FEEDVOLRESULT=0 LOOPRINGRESULT=0 VBATVALUE=-51 ILOOPVALUE=-28 ABACVOL=0 AGACVOL=0 BGACVOL=0 ABDCVOL=0 AGDCVOL=0 BGDCVOL=0 ABINS=1830 AGINS=10000 BGINS=5020 ABCAPAC=1090;"); break; case TST_LOOP: strcpy(receive_str,"INVOKEID=7 TESTOUTSIDE DN=5896997 STARTTIME=19981130173928 STOPTIME=19981130173957:STATE=0 RESULT=0 AGDCVOL=0 BGDCVOL=0 ABDCVOL=0 AGINS=10000 BGINS=10000 ABINS=10000 AGCAPAC=11 BGCAPAC=11 ABCAPAC=713 AGACVOL=0 BGACVOL=0 ABACVOL=0;"); break; case MEAS_VG_DC: strcpy(receive_str,"INVOKEID=9 TESTOUTSIDE DN=5898338 STARTTIME=19981130174143 STOPTIME=19981130174153:STATE=0 RESULT=0 AGDCVOL=0 BGDCVOL=0 ABDCVOL=0;"); break; case MEAS_VG_AC: strcpy(receive_str,"INVOKEID=8 TESTOUTSIDE DN=5896995 STARTTIME=19981130174025 STOPTIME=19981130174026:STATE=0 RESULT=0 AGACVOL=0 BGACVOL=0 ABACVOL=0;"); break; case MEAS_LOOP_CUREST: strcpy(receive_str,"INVOKEID=12 TESTOUTSIDE DN=5891108 STARTTIME=19981130174309 STOPTIME=19981130174320:STATE=0 RESULT=0 AGINS=10000 BGINS=10000 ABINS=10000;"); break; case MEAS_LOOP_RES: strcpy(receive_str,"INVOKEID=11 TESTOUTSIDE DN=5890322:STATE=1 RESULT=2;"); break; case MEAS_RES: strcpy(receive_str,"INVOKEID=12 TESTOUTSIDE DN=5891108 STARTTIME=19981130174309 STOPTIME=19981130174320:STATE=0 RESULT=16 AGINS=10000 BGINS=10000 ABINS=10000;"); break; case MEAS_CAPNC: strcpy(receive_str,"INVOKEID=13 TESTOUTSIDE DN=5893523 STARTTIME=19981130174338 STOPTIME=19981130174354:STATE=0 RESULT=22 AGCAPAC=77 BGCAPAC=77 ABCAPAC=83;"); break; case MEAS_IMPED: strcpy(receive_str,"INVOKEID=14 TESTOUTSIDE DN=5895188 STARTTIME=19981130174413 STOPTIME=19981130174413:STATE=0 RESULT=0;"); break; case CONN_TSTSIG_SOUNDER: strcpy(receive_str,"INVOKEID=24 HOWLER DN=5899744 STARTTIME=19981130175310 STOPTIME=19981130175340:STATE=0 RESULT=1;"); break; case MEAS_TN: strcpy(receive_str,"INVOKEID=2 DIALTONE DN=5896215 STARTTIME=19981130173541 STOPTIME=19981130173543:STATE=0 RESULT=0;"); break; case MEAS_FEEDVOL: strcpy(receive_str,"INVOKEID=4 FEEDVOL DN=5893840 STARTTIME=19981130173652 STOPTIME=19981130173653:STATE=0 RESULT=1 VALUE=-0;"); break; case MEAS_LOOPRING: strcpy(receive_str,"INVOKEID=6 LOOPRING DN=5892352 STARTTIME=19981130173759 STOPTIME=19981130173804:STATE=1 RESULT=0 VALUE=20 ERROR=10;"); break; case MEAS_OUTPLSE: strcpy(receive_str,"INVOKEID=22 DIGTEST DN=2862551 STARTTIME=19981130175159 STOPTIME=19981130175229:STATE=0 RESULT=0 DIGTYPE=0 DIGIT=1256*# LOWLEVEL=12.5 HIGHLEVEL=2683.6 LOWFREQ=1234 HIGHFREQ=5678;"); break; case TST_RINGSGNL: strcpy(receive_str,"INVOKEID=20 RING DN=5890415 STARTTIME=19981130174809 STOPTIME=19981130174809:STATE=0 RESULT=0;"); break; case CONN_MONEST: strcpy(receive_str,"INVOKEID=20 TALKSTART DN=5890415 STARTTIME=19981130174809 STOPTIME=19981130174809:STATE=0 RESULT=0 TALKDN=4110993;"); break; case DISC_MON: strcpy(receive_str,"INVOKEID=20 TALKSTOP DN=5890415 STARTTIME=19981130174809 STOPTIME=19981130174809:STATE=0 RESULT=0;"); break; case CONN_MONBRDGD: strcpy(receive_str,"INVOKEID=20 CONNECTUSER DN=5890415 STARTTIME=19981130174809 STOPTIME=19981130174809:STATE=0 RESULT=0;"); break; case CONN_FMONBRDGD: sprintf(receive_str,"INVOKEID=20 CONNECTUSER DN=5890415 STARTTIME=19981130174809 STOPTIME=19981130174809:STATE=0 RESULT=0;"); break; default: receive_str[0]='\0'; break; } sleep(5); p=(char *)strstr(receive_str,"STATE="); if (p==NULL) return AM_UNREADY_ERROR; #ifdef DEBUG if (p!=NULL) { fprintf(lp,"p=:%s,p+6:%c\n",p,*(p+6)); fflush(lp); } #endif if (*(p+6)=='0') { switch (command_type) { case TST_FULL: case TST_LOOP: case MEAS_VG_DC: case MEAS_VG_AC: case MEAS_LOOP_CUREST: case MEAS_LOOP_RES: case MEAS_RES: case MEAS_CAPNC: case MEAS_IMPED: case MEAS_NSE: if (!ret) ret=f_anet_analysis(receive_str,testmsg); break; case CONN_TSTSIG_SOUNDER: case MEAS_TN: case MEAS_FEEDVOL: case MEAS_LOOPRING: case MEAS_OUTPLSE: case MEAS_ISDN: case TST_RINGSGNL: case CONN_MONEST: case DISC_MON: case CONN_MONBRDGD: case CONN_FMONBRDGD: p = (char*)strstr(receive_str,"RESULT="); if (!p) ret=RESULT_OTHER; else { i=0; while (*p!='\0' && *p!=';' && i<100) { testmsg->TestResult.TestConclusion[i]=*p; ++p; ++i; } testmsg->TestResult.TestConclusion[i]='\0'; } break; } } else { p=(char *)strstr(receive_str,"ERROR="); if (p==NULL) ret=RESULT_OTHER; else { ret=f_anet_get_code(p+6)+AM_ANET_ERR1-1; if (command_type==TST_FULL || command_type==TST_LOOP) { if (ret==AM_ANET_ERR4 || ret==AM_ANET_ERR5) ret=RESULT_BUSY; else if (ret==AM_ANET_ERR3) ret=RESULT_NULL; } } #ifdef DEBUG fprintf(lp,"Error=%d\n",ret);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -