/************************************************* File name: paraComm.c Author: Cui Ticun Version: 9.00.00 Date: 2007-7-1 Description:Operate system's parameter History: No. Author Date Version Description *************************************************/ #include "paraComm.h" /******************************************************/ /****** Heartbeat Parameter ******/ /******************************************************/ DWORD PROC_HEARTBEAT_OID[12]={1,3,6,1,4,1,1373,2,4,10,1}; int PROC_HEARTBEAT_OIDLEN=11; int sendHeartbeat(); /*******define in omcLib/omcDbLib.c ***/ MYSQL *mysql_conn(); MYSQL_RES *mysql_getres(); int mysql_getnores(); /******Private Functions***/ int paraCommScan(); int paraCommProc(); int respProc(int *commNo, snmp_pdu * pdu); int updateCommTable(int commNo); int getSysAddr(int commNo); int getParamTable(int sysTypeNo, int sysNo, int paramType, char *tableName); int mkVarArr(int commNo, var_list * varArr); int mkAddr(int commNo, snmp_addr * msgAddr); int mkPdu(int commNo, var_list * varArr, snmp_pdu * pdu); int initUnitComm(int commNo); void freeParamSet(int commNo); void optErr(unitComm *ucomm); /*******Global Var*********/ FILE *paraCommLog; int oldDay = 0; //1-31 static unitComm commArr[MaxCommNum]; static MYSQL *dbConn; static int MaxErrorStatusNum = 19; static char errorStatusDescArr[19][30] = { "NoError", "TooBig", "NoSuchName", "BadValue", "ReadOnly", "GenErr", "NoAccess", "WrongType", "WrongLength", "WrongEncoding", "wrongValue", "noCreation", "inconsistentValue", "resourceUnavailabe", "commitFailed", "UndoFailed", "AuthorizationError", "NoWritable", "inconsistentName" }; int paraComm_timerCount = 0; //for paraCommTimer int checkMibSystem(int sysTypeNo) { switch(sysTypeNo) { case 320://MSC case 355://SMEG case 375://OPPS case 225://XAPP case 260://SMPP case 311://AAS case 325://VLR case 330://HLR case 340://AUC case 350://SMSC case 380://EIR case 385://MRFC case 360://PPS case 361://MME case 362://SPGW case 363://IMS case 364://ACS case 365://UDM case 366://AUSF case 390://VMS case 378://iPALIM case 379://iRLS case 386://MHC case 370://MNP case 387://iGRS case 389://IUUPGW case 391://TMG case 392://AMRMG case 393://GbC case 394://GbC case 395://RCM case 222://MTP3 case 223://SCCP case 480://DEA return 1; break; default: return 0; break; } return 0; } int checkPlatHasSubSysNo(int sysTypeNo,int sysNo) { // modified by simon at 2024/04/12 //if(sysNo != 9) if (sysNo != 9 && sysNo != 3 && sysNo != 5 && sysNo != 6 && sysNo != 11) // 9-MSS,3-HLR,5-OCS/PPS,6-SMSC 11-AAS { switch(sysTypeNo) { case 260://SMPP case 222://MTP3 case 223://SCCP return 1; break; default: return 0; break; } } return 0; } /************************************************* Function: // paraCommInit Description: // 1.Init OMC_PUB.parameterComm // 2.Init Commands Array // 3.Init Every module's paramConf Calls: // omcLogInit();initUnitComm();initDbFromMib(); Called By: // Table Accessed: // Table Updated: // OMC_PUB.parameterComm;OBJ_xxx.paramConf Input: // Output: // Return: // 1:OK,0:error Others: // *************************************************/ //extern int global_mod_index; int paraCommInit() { int commNo; long nowTime; struct tm *nowTm; char commQuery[128] = "\0"; //init log omcLogInit(paraComm_LogPath, paraComm_LogFile, ¶CommLog); nowTime = time(NULL); nowTm = localtime(&nowTime); oldDay = nowTm->tm_mday; //init db connect dbConn = mysql_conn(HOSTNAME, PUB_DB); if (dbConn == NULL) { omcLog(paraCommLog,"[ERR][paraCommInit]:mysql connect OMC_PUB"); return (0); } //init command table sprintf(commQuery, "DELETE FROM %s", CommTable); mysql_getnores(dbConn, commQuery); //init command arrary for (commNo = 0; commNo < MaxCommNum; commNo++) { initUnitComm(commNo); } //init every module's paramCOnf //for(global_mod_index=0;global_mod_index 5) { heartbeat_timeout=time(NULL); sendHeartbeat(); } paraCommScan(); if (paraComm_timerCount > 5000) {//100s long l_time; struct tm *t; l_time = time(NULL); t = localtime(&l_time); if (t->tm_mday != oldDay) { //init logfile,create a new log file to restore log omcLogInit(paraComm_LogPath, paraComm_LogFile, ¶CommLog); oldDay = t->tm_mday; } paraComm_timerCount = 0; } paraComm_timerCount++; returnResult=paraCommProc(); if (returnResult) { return (1); } else { return (0); } } /************************************************* Function: // paraCommScan Description: // 扫描命令表,插入命令到命令数组。 // 最多可同时处理32条命令 Calls: // Called By: // int paraCommTimer() Table Accessed: // OMC_PUB.parameterComm Table Updated: // Input: // Output: // Return: // 1->find command,0->no command,-1->failed Others: // *************************************************/ int paraCommScan() { int i = 0, commNo = 0; char commQuery[512] = "\0"; char cfgQuery[512] = "\0"; char paramConfQuery[512]= "\0"; char paramQuery[1024] = "\0"; char paramTableName[64] = "\0"; MYSQL_RES *commResult = NULL,*cfgResult = NULL,*paramConfResult = NULL,*paramResult = NULL;; MYSQL_ROW commRow,cfgRow, paramConfRow; /* char paramSelect[512] = "SELECT T1.level_1,T1.level_2,T1.level_3,T1.level_4,T1.level_5," "T1.level_6,T1.level_7,T1.level_8,T1.level_9,T1.level_10," "T1.instanceNo,T1.initValue,T1.readValue,T2.valueType"; */ //AdministrationState do not set char paramSelect[512] = "SELECT T1.level_1,T1.level_2,T1.level_3,T1.level_4,T1.level_5," "T1.level_6,T1.level_7,T1.level_8,T1.level_9,T1.level_10," "T1.instanceNo,T1.`initValue`,T1.`readValue`,T2.valueType,T2.name_2"; char queryOrderBy[256] = " T1.level_1,T1.level_2,T1.level_3,T1.level_4,T1.level_5,"\ "T1.level_6,T1.level_7,T1.level_8,T1.level_9,T1.level_10"; char levelStr[64] = "\0"; char queryWhere[512] = "\0"; char *oneOid; char *oneInstanceNo; char instanceNo[32]; sprintf(commQuery, "SELECT commId,commType,sysTypeNo,sysNo,subSysNo,paramType,objId,instanceNo" " FROM %s WHERE commState = '%d' ORDER BY sendTime", CommTable, nWaitProc); //printf("commQuery=%s\n",commQuery); commResult = (MYSQL_RES *) mysql_getres(dbConn, commQuery); if (commResult == NULL) { omcLog(paraCommLog, " Database may be stopped,when get commands"); return (-1); } else if (mysql_num_rows(commResult) == 0) { mysql_free_result(commResult); return (0); } while ((commRow = mysql_fetch_row(commResult))) { //Try to Find a available command array for (commNo = 0; commNo < MaxCommNum; commNo++) { if ((commArr[commNo].procState == nIdle) && (commArr[commNo].commState != nWaitProc) && (commArr[commNo].commState != nInProc)) { initUnitComm(commNo); break; } }//end of for(..) if (commNo == MaxCommNum) { omcLog(paraCommLog, "Commands array is full"); break; } commArr[commNo].commState = nInProc; commArr[commNo].commId = atoi(commRow[0]); commArr[commNo].commType = atoi(commRow[1]); commArr[commNo].sysTypeNo = atoi(commRow[2]); commArr[commNo].sysNo = atoi(commRow[3]); commArr[commNo].subSysNo = atoi(commRow[4]); commArr[commNo].paramType = (BYTE) atoi(commRow[5]); //Get Active IP From IpTable if (!getSysAddr(commNo)) { sprintf(commArr[commNo].desc, CONF_COMMAND_ERR_0101); commArr[commNo].commState = nProcFail; commArr[commNo].procState = nIdle; updateCommTable(commNo); initUnitComm(commNo); continue; } //Get General Info From ConfTable sprintf(cfgQuery, "SELECT maxMsgLen,snmpHead,snmpPort,needMuliObj,snmpCommunity " "FROM %s WHERE sysTypeNo='%d'", ConfTable, commArr[commNo].sysTypeNo); //printf("cfgQuery=%s\n",cfgQuery); cfgResult = (MYSQL_RES *) mysql_getres(dbConn, cfgQuery); if (cfgResult == NULL) { omcLog(paraCommLog, "Get system configuration informations error!!"); return (-1); } if ((cfgRow = mysql_fetch_row(cfgResult)) != NULL) { commArr[commNo].snmpInfo.maxMsgLen = atoi(cfgRow[0]); //<-- commArr[commNo].snmpInfo.dstPort = atoi(cfgRow[2]); //<-- commArr[commNo].snmpInfo.needMuliObj= atoi(cfgRow[3]); //<-- sprintf(commArr[commNo].snmpInfo.snmpCommunity, "%s", cfgRow[4]); //<-- i = 0; while ((oneOid = strsep(&(cfgRow[1]), "."))) { commArr[commNo].snmpInfo.oid[i] = atoi(oneOid); //<-- i++; } commArr[commNo].snmpInfo.preOidLen = i; //<-- commArr[commNo].snmpInfo.oidLen = i; //<-- if (i < 1) { omcLog(paraCommLog, "Get objId error!!"); mysql_free_result(cfgResult); return (-1); } } mysql_free_result(cfgResult); //Get Oid Info i = 0; queryWhere[0]=0; while ((oneOid = strsep(&(commRow[6]), ".")) != NULL) { commArr[commNo].snmpInfo.oid[i+commArr[commNo].snmpInfo.oidLen] = atoi(oneOid); i++; levelStr[0] = 0; if(i==1){ sprintf(levelStr, "T1.level_%d = '%s' ", i, oneOid); }else{ sprintf(levelStr, "AND T1.level_%d = '%s' ", i, oneOid); } strcat(queryWhere, levelStr); } commArr[commNo].snmpInfo.oidLen = commArr[commNo].snmpInfo.oidLen+i; if (commArr[commNo].snmpInfo.oidLen < 1) { omcLog(paraCommLog, "Get subObjId error!!"); return (-1); } sprintf(paramConfQuery, "SELECT T1.level_%d FROM OBJ_%d.paramConf AS T1 WHERE %s AND level_%d !=0 ORDER BY %s", i+1,commArr[commNo].sysTypeNo,queryWhere, i+1,queryOrderBy); //printf("paramConfQuery=%s\n",paramConfQuery); paramConfResult = (MYSQL_RES *) mysql_getres(dbConn, paramConfQuery); if (paramConfResult == NULL) { omcLog(paraCommLog, " Database may be stopped,when get paramConf"); return (-1); } commArr[commNo].snmpInfo.columnNum=mysql_num_rows(paramConfResult); i=0; while ((paramConfRow = mysql_fetch_row(paramConfResult))) { commArr[commNo].snmpInfo.column[i]=atoi(paramConfRow[0]); i++; } mysql_free_result(paramConfResult); //Get InstanceNo info if(strlen(commRow[7])>0){ //ISSUE-2 if(strstr(commRow[7],".")) sprintf(levelStr, "AND T1.instanceNo = '%s' ",commRow[7]); else sprintf(levelStr, "AND T1.instanceNo = '%s' ",commRow[7]); strcat(queryWhere, levelStr); strcpy(instanceNo,commRow[7]); i = 0; while ((oneInstanceNo = strsep(&(commRow[7]), ".")) != NULL) { commArr[commNo].snmpInfo.instanceNo[i] = atoi(oneInstanceNo); i++; } commArr[commNo].snmpInfo.instanceNoLevel = i; if (commArr[commNo].snmpInfo.instanceNoLevel < 1) { omcLog(paraCommLog, "Get instanceNo error!!"); return (-1); } } getParamTable(commArr[commNo].sysTypeNo, commArr[commNo].sysNo, commArr[commNo].paramType, paramTableName); sprintf(commArr[commNo].paramTable, "%s", paramTableName); //<-- for(i=1;i<=10;i++){ sprintf(levelStr, "AND T1.level_%d = T2.level_%d ", i,i); strcat(queryWhere, levelStr); } if(checkMibSystem(commArr[commNo].sysTypeNo)) { /* if(commArr[commNo].commType==nSetComm){ sprintf(paramQuery,"%s FROM %s AS T1,OBJ_%d.paramConf AS T2 " " WHERE %s AND (T2.maxAccess='%d' OR T2.maxAccess='%d') ORDER BY %s,instanceNo ", paramSelect,paramTableName,commArr[commNo].sysTypeNo, queryWhere,MIB_ACCESS_READWRITE,MIB_ACCESS_CREATE,queryOrderBy); */ if(commArr[commNo].commType==nSetComm){ sprintf(paramQuery,"%s FROM %s AS T1,OBJ_%d.paramConf AS T2 " " WHERE %s AND T2.maxAccess='%d' ORDER BY %s,instanceNo ", paramSelect,paramTableName,commArr[commNo].sysTypeNo, queryWhere,MIB_ACCESS_READWRITE,queryOrderBy); //ISSUE-3 if(checkPlatHasSubSysNo(commArr[commNo].sysTypeNo,commArr[commNo].sysNo)) { sprintf(paramQuery,"%s FROM %s AS T1,OBJ_%d.paramConf AS T2 " " WHERE %s AND T2.maxAccess='%d' AND T1.subSysNo='%d' ORDER BY %s,instanceNo ", paramSelect,paramTableName,commArr[commNo].sysTypeNo, queryWhere,MIB_ACCESS_READWRITE,commArr[commNo].subSysNo,queryOrderBy); } }else if(commArr[commNo].commType!=nGetBulkComm){ sprintf(paramQuery,"%s FROM %s AS T1,OBJ_%d.paramConf AS T2 " " WHERE %s AND T2.maxAccess!='%d' AND T2.maxAccess!='%d' ORDER BY %s,instanceNo ", paramSelect,paramTableName,commArr[commNo].sysTypeNo, queryWhere,MIB_ACCESS_NOACCESS,MIB_ACCESS_NOTIFY,queryOrderBy); //ISSUE-3 if(checkPlatHasSubSysNo(commArr[commNo].sysTypeNo,commArr[commNo].sysNo)) { sprintf(paramQuery,"%s FROM %s AS T1,OBJ_%d.paramConf AS T2 " " WHERE %s AND T2.maxAccess!='%d' AND T2.maxAccess!='%d' AND T1.subSysNo='%d' ORDER BY %s,instanceNo ", paramSelect,paramTableName,commArr[commNo].sysTypeNo, queryWhere,MIB_ACCESS_NOACCESS,MIB_ACCESS_NOTIFY,commArr[commNo].subSysNo,queryOrderBy); } } omcLog(paraCommLog,"\nSQL=%s",paramQuery); }else{ strcat(paramSelect,",T2.length"); if(commArr[commNo].paramType!=nSubSysParam){ if(commArr[commNo].commType==nSetComm){ sprintf(paramQuery,"%s FROM %s AS T1,OBJ_%d.paramConf AS T2 " " WHERE %s AND subSysNo='%d' AND (T2.operType='2' OR T2.operType='3' OR T2.operType='4') ORDER BY %s,instanceNo ", paramSelect,paramTableName,commArr[commNo].sysTypeNo,queryWhere,nPubFlag,queryOrderBy); }else{ sprintf(paramQuery,"%s FROM %s AS T1,OBJ_%d.paramConf AS T2 " "WHERE %s AND subSysNo='%d' AND (T2.operType='1' OR T2.operType='3' OR T2.operType='4') ORDER BY %s,instanceNo ", paramSelect,paramTableName,commArr[commNo].sysTypeNo,queryWhere,nPubFlag,queryOrderBy); } }else{ if(commArr[commNo].commType==nSetComm){ sprintf(paramQuery,"%s FROM %s AS T1,OBJ_%d.paramConf AS T2 " " WHERE %s AND subSysNo='%d' AND (T2.operType='2' OR T2.operType='3' OR T2.operType='4') ORDER BY %s,instanceNo ", paramSelect,paramTableName,commArr[commNo].sysTypeNo,queryWhere,commArr[commNo].subSysNo,queryOrderBy); }else{ sprintf(paramQuery,"%s FROM %s AS T1,OBJ_%d.paramConf AS T2 " " WHERE %s AND subSysNo='%d' AND (T2.operType='1' OR T2.operType='3' OR T2.operType='4') ORDER BY %s,instanceNo ", paramSelect,paramTableName,commArr[commNo].sysTypeNo,queryWhere,commArr[commNo].subSysNo,queryOrderBy); } } } if(strlen(paramQuery)>0){ //printf("paramQuery=%s\n",paramQuery); paramResult = (MYSQL_RES *) mysql_getres(dbConn, paramQuery); if (paramResult == NULL) { omcLog(paraCommLog, " Database may be stopped,when get paramSet"); return (-1); } commArr[commNo].totalNum = mysql_num_rows(paramResult); //<-- if (commArr[commNo].totalNum <= 0) { omcLog(paraCommLog, "TotalNum <= 0,Cannot get the object value record!\nSQL=%s", paramQuery); sprintf(commArr[commNo].desc,CONF_COMMAND_ERR_0201); commArr[commNo].commState = nProcFail; commArr[commNo].procState = nIdle; mysql_free_result(paramResult); commArr[commNo].paramSet = NULL; updateCommTable(commNo); initUnitComm(commNo); return (-1); } else { commArr[commNo].finishNum = 0; //<-- commArr[commNo].paramSet = paramResult; //<-- updateCommTable(commNo); } } #if paraComm_DEBUG //General Info omcLog(paraCommLog,"commArr[%d].commId =%d", commNo, commArr[commNo].commId); omcLog(paraCommLog,"commArr[%d].commType=%d", commNo, commArr[commNo].commType); omcLog(paraCommLog,"commArr[%d].sysTypeNo=%d", commNo, commArr[commNo].sysTypeNo); omcLog(paraCommLog,"commArr[%d].sysNo =%d", commNo, commArr[commNo].sysNo); omcLog(paraCommLog,"commArr[%d].subSysNo =%d", commNo, commArr[commNo].subSysNo); omcLog(paraCommLog,"commArr[%d].paramType =%d", commNo, commArr[commNo].paramType); omcLog(paraCommLog,"commArr[%d].snmpInfo.dstIP =%s", commNo, commArr[commNo].snmpInfo.dstIP); omcLog(paraCommLog,"commArr[%d].snmpInfo.needMuliObj=%d", commNo, commArr[commNo].snmpInfo.needMuliObj); omcLog(paraCommLog,"commArr[%d].snmpInfo.dstPort=%ld", commNo, commArr[commNo].snmpInfo.dstPort); omcLog(paraCommLog,"commArr[%d].snmpInfo.maxMsgLen =%ld", commNo, commArr[commNo].snmpInfo.maxMsgLen); omcLog(paraCommLog,"commArr[%d].snmpInfo.snmpCommunity =%s", commNo, commArr[commNo].snmpInfo.snmpCommunity); omcLog(paraCommLog,"commArr[%d].snmpInfo.preOidLen =%d", commNo, commArr[commNo].snmpInfo.preOidLen); omcLog(paraCommLog,"commArr[%d].snmpInfo.oidLen=%d", commNo, commArr[commNo].snmpInfo.oidLen); for(i=0;ifinish all,1->finish part,0->failed Others: // *************************************************/ int paraCommProc() { int i = 0; int j = 0; int errorIndex; char errorCause[128]; char tmpStr[32]; int idleCommCount = 0; snmp_pdu tmpPdu; snmp_addr tmpAddr; var_list tmpVarArr[MaxVarNum]; #if paraComm_DEBUG clrscr(); printf ("\n commId systemId systemIp comm/procState finish/total Desc"); #endif for (i = 0; i < MaxCommNum; i++) { #if paraComm_DEBUG printf("\n %d \t %d-%d-%d %s \t %d/%d \t %d/%d \t%s ", i, commArr[i].sysTypeNo, commArr[i].sysNo, commArr[i].subSysNo, commArr[i].snmpInfo.dstIP, commArr[i].commState, commArr[i].procState, commArr[i].finishNum, commArr[i].totalNum, commArr[i].desc); #endif if (commArr[i].commState == nInProc) { #if paraComm_DEBUG omcLog(paraCommLog, " commArr[%d]:", i); omcLog(paraCommLog, " commState = %d \t procState = %d", commArr[i].commState, commArr[i].procState); #endif switch (commArr[i].procState) { case nIdle: if(commArr[i].commType!=nGetBulkComm&&commArr[i].totalNum==commArr[i].finishNum){ commArr[i].commState = nOutProc; commArr[i].procState = nIdle; sprintf(commArr[i].desc, CONF_COMMAND_ERR_0000); updateCommTable(i); initUnitComm(i); freeParamSet(i); break; } mkVarArr(i, tmpVarArr); mkAddr(i, &tmpAddr); mkPdu(i, tmpVarArr, &tmpPdu); commArr[i].waitTimeCount = 0; commArr[i].timeoutCount = 0; if (snmp_send(&tmpPdu, &tmpAddr) > 0) { #if paraComm_DEBUG { int k,kk; omcLog(paraCommLog, " send snmp message ok!"); for(k=0;k 0) {//received msg int respProcReturn = 0; #if paraComm_DEBUG omcLog(paraCommLog, " Receive snmp message ok!"); #endif respProcReturn = respProc(&i, &tmpPdu); //here changed commState's value if (respProcReturn > 0) {//vaild message commArr[i].waitTimeCount = 0; commArr[i].timeoutCount = 0; } else if (respProcReturn == 0) {//invaild message commArr[i].waitTimeCount++; omcLog(paraCommLog, "Invailed response message,throw away"); sprintf(commArr[i].desc,CONF_COMMAND_ERR_0401); //Don't send msg again when find invaild message, //Because iptrans is a FIFO buffer if (commArr[i].waitTimeCount % 3) { continue; } } else {//error report message commArr[i].commState = nProcFail; /***********************/ errorIndex=tmpPdu.error_index-1; //errorIndex=tmpPdu.error_index; //printf("error_status=%d,error_index=%d,len=%d\n",tmpPdu.error_status,errorIndex,tmpPdu.var[errorIndex].msglen); //printf("pdu_type=%d,var_type=%d\n",tmpPdu.pdu_type,tmpPdu.var[errorIndex].vartype); for(j=0;j 0) { commArr[i].procState = nWaitResponse; updateCommTable(i); } else { commArr[i].commState = nProcFail; commArr[i].procState = nIdle; sprintf(commArr[i].desc,CONF_COMMAND_ERR_0301); omcLog(paraCommLog, "Send snmp message failed!"); updateCommTable(i); initUnitComm(i); } } break; case nOutProc: commArr[i].procState = nIdle; sprintf(commArr[i].desc, CONF_COMMAND_ERR_0000); updateCommTable(i); initUnitComm(i); break; default: //error commArr[i].commState = nProcFail; commArr[i].procState = nIdle; sprintf(commArr[i].desc, CONF_COMMAND_ERR_0402); //printf("desc:%s\n",commArr[i].desc); updateCommTable(i); initUnitComm(i); break; } } else { //not received msg #if paraComm_DEBUG omcLog(paraCommLog, " Receive snmp message failed!"); #endif commArr[i].waitTimeCount++; #if paraComm_DEBUG if(commArr[i].waitTimeCount>16) omcLog(paraCommLog, "commId=%ld \t waitTimeCount=%d \t timeoutCount=%d", commArr[i].commId, commArr[i].waitTimeCount, commArr[i].timeoutCount); #endif if (commArr[i].waitTimeCount >= 16) {//Time out commArr[i].waitTimeCount = 0; commArr[i].timeoutCount++; if (commArr[i].timeoutCount > 4) { commArr[i].timeoutCount=0; commArr[i].commState = nProcFail; sprintf(commArr[i].desc, CONF_COMMAND_ERR_0403); omcLog(paraCommLog, "Response timeout"); updateCommTable(i); initUnitComm(i); commArr[i].procState = nIdle; } else {//resend msg if(commArr[i].totalNum==commArr[i].finishNum&&commArr[i].commType!=nGetBulkComm){ commArr[i].commState = nOutProc; commArr[i].procState = nIdle; sprintf(commArr[i].desc, CONF_COMMAND_ERR_0000); updateCommTable(i); initUnitComm(i); break; } //ISSUE-1 if(commArr[i].sysTypeNo==223) { commArr[i].timeoutCount++; break; } mkAddr(i, &tmpAddr); mkVarArr(i, tmpVarArr); mkPdu(i, tmpVarArr, &tmpPdu); if (snmp_send(&tmpPdu, &tmpAddr) > 0) { commArr[i].procState = nWaitResponse; } else { commArr[i].commState = nProcFail; sprintf(commArr[i].desc,CONF_COMMAND_ERR_0301); omcLog(paraCommLog, "failed to send snmp message!"); updateCommTable(i); //commArr[i].procState = nIdle; } } } //end of time out handle } //end of not received msg break; default: commArr[i].procState = nIdle; commArr[i].commState = nProcFail; sprintf(commArr[i].desc,CONF_COMMAND_ERR_9999); omcLog(paraCommLog, "unknown procState,Please check!"); break; } //end of switch(..) } else { idleCommCount++; } } //end of for(..) if (idleCommCount == MaxCommNum) { snmp_receive(&tmpPdu, &tmpAddr); return (2); } else { return (1); } } /************************************************* Function: // respProc Description: // 处理命令编号为commNo的命令的回应消息。 // commNo为命令编号,由于需要比较回应消息与各个命令的request_id是否相等,并可能根据回应消息改变commNo Calls: // Called By: // Table Accessed: // Table Updated: // Input: // Output: // Return: // 1 -> ok;0 -> invalid msg;-1 -> error report msg Others: // *************************************************/ int respProc(int *oldCommNo, snmp_pdu * pdu) { int i, j, commNo; char updateField[16] = "readValue"; char updateSql[8192]; char tmpStr[4096]; int str_index; snmp_pdu tmpPdu; snmp_addr tmpAddr; //Check commNo if (*oldCommNo >= MaxCommNum) { omcLog(paraCommLog, " Error: oldCommNo is too big (%d)", *oldCommNo); return (0); } commNo = *oldCommNo; //Check PDU Type if (pdu->pdu_type != PDU_RSP) { omcLog(paraCommLog, " Error pdu type:%d(!=Resp%d)", pdu->pdu_type, PDU_RSP); return (0); } //Check Request ID if (pdu->request_id != commArr[commNo].commId) { int isRequestIdMatch = 0; for (i = 0; i < MaxCommNum; i++) { if (pdu->request_id == commArr[i].commId) { isRequestIdMatch = 1; *oldCommNo = i; commNo = i; break; } } if (isRequestIdMatch == 0) { omcLog(paraCommLog, "Unknown pdu->request_id(%ld) ", pdu->request_id); return (0); } } for (i = 0; i < pdu->var_num; i++) { int tmpLongInt = 0; char tmpValue[512] = "\0"; int levelNo = 1; char tmpInstanceNo[16]=""; char instanceNo[32]=""; char queryWhere[256] = "\0"; //Check Msg Length if (pdu->var[i].msglen > MaxLenOfParaValue) { omcLog(paraCommLog, " Msg is too long(pdu->var[%d].msglen =%d)", i, pdu->var[i].msglen); return (0); } //check PreObjId for (j = 0; j < commArr[commNo].snmpInfo.preOidLen; j++) { if (commArr[commNo].snmpInfo.oid[j] != pdu->var[i].oid[j]) { int k = 0; omcLog(paraCommLog, " Oid is not match!"); for (k = 0; k < commArr[commNo].snmpInfo.preOidLen; k++) { omcLog(paraCommLog, " %d: %ld [%ld]", k, commArr[commNo].snmpInfo.oid[k], pdu->var[i].oid[k]); } return (0); } } //check subObjId for (j = commArr[commNo].snmpInfo.preOidLen; j < commArr[commNo].snmpInfo.oidLen; j++) { if (commArr[commNo].snmpInfo.oid[j] != pdu->var[i].oid[j]) { if(commArr[commNo].commType==nGetBulkComm){//Finished GetBulk Table commArr[commNo].commState = nOutProc; break; }else return(0); } } if(checkMibSystem(commArr[commNo].sysTypeNo)) { if(commArr[commNo].snmpInfo.columnNum!=0){//Is a table sprintf(updateSql,"REPLACE INTO %s SET ",commArr[commNo].paramTable); levelNo=1; for (j = commArr[commNo].snmpInfo.preOidLen; j < commArr[commNo].snmpInfo.oidLen+1;j++) { sprintf(tmpStr, "level_%d = '%ld',", levelNo, pdu->var[i].oid[j]); strcat(updateSql,tmpStr); levelNo++; } //Check instanceNo for(j=commArr[commNo].snmpInfo.oidLen+1;jvar[i].oid[j]&& commArr[commNo].snmpInfo.instanceNo[j-commArr[commNo].snmpInfo.oidLen-1]!=0){ commArr[commNo].commState = nOutProc; break; } } //organize instanceNo for(j=commArr[commNo].snmpInfo.oidLen+1;jvar[i].oidlen;j++){ if(j==commArr[commNo].snmpInfo.oidLen+1) sprintf(tmpInstanceNo, "%04ld", pdu->var[i].oid[j]); else sprintf(tmpInstanceNo, ".%04ld", pdu->var[i].oid[j]); strcat(instanceNo, tmpInstanceNo); } sprintf(tmpStr, "instanceNo='%s',",instanceNo); strcat(updateSql,tmpStr); }else{ sprintf(updateSql,"REPLACE INTO %s SET ",commArr[commNo].paramTable); levelNo=1; for (j = commArr[commNo].snmpInfo.preOidLen; j < commArr[commNo].snmpInfo.oidLen;j++) { sprintf(tmpStr, "level_%d = '%ld',", levelNo, pdu->var[i].oid[j]); strcat(updateSql,tmpStr); levelNo++; } for(j=commArr[commNo].snmpInfo.oidLen;jvar[i].oidlen;j++){ if(j==commArr[commNo].snmpInfo.oidLen) sprintf(tmpInstanceNo, "%04ld", pdu->var[i].oid[j]); else sprintf(tmpInstanceNo, ".%04ld", pdu->var[i].oid[j]); strcat(instanceNo, tmpInstanceNo); } sprintf(tmpStr, "instanceNo='%s',",instanceNo); strcat(updateSql,tmpStr); } }else{ sprintf(updateSql,"UPDATE %s SET ",commArr[commNo].paramTable); for (j = commArr[commNo].snmpInfo.preOidLen; j < commArr[commNo].snmpInfo.preOidLen+commArr[commNo].levelWidth[i];j++) { if(j==commArr[commNo].snmpInfo.preOidLen) sprintf(tmpStr, " WHERE level_%d = '%ld'", levelNo, pdu->var[i].oid[j]); else sprintf(tmpStr, " AND level_%d = '%ld'", levelNo, pdu->var[i].oid[j]); strcat(queryWhere,tmpStr); levelNo++; } for(j=commArr[commNo].snmpInfo.preOidLen+commArr[commNo].levelWidth[i];jvar[i].oidlen;j++){ if(j==commArr[commNo].snmpInfo.preOidLen+commArr[commNo].levelWidth[i]) sprintf(tmpInstanceNo, "%ld", pdu->var[i].oid[j]); else sprintf(tmpInstanceNo, ".%ld", pdu->var[i].oid[j]); strcat(instanceNo, tmpInstanceNo); } sprintf(tmpStr, " AND instanceNo='%s'",instanceNo); strcat(queryWhere,tmpStr); } if ((pdu->error_status > 0) && (pdu->error_index == (i + 1))) { omcLog(paraCommLog, "Error message: pdu->error_status =%d pdu->error_index =%d", pdu->error_status, pdu->error_index); if (pdu->error_status < MaxErrorStatusNum) { sprintf(tmpStr,",`%s`='Error:%s'", updateField, errorStatusDescArr[pdu->error_status]); } else { sprintf(tmpStr,",`%s`='Error:Unknown Error'", updateField); } return (-1); } if(commArr[commNo].commState == nOutProc) break; switch (pdu->var[i].vartype) { case 0x02: //INTEGER tmpLongInt = decode_integer(pdu->var[i].msg, pdu->var[i].msglen); sprintf(tmpStr,"`%s`='%d'", updateField,tmpLongInt); commArr[commNo].finishNum++; break; case 0x04: //OCTET STRING if(checkMibSystem(commArr[commNo].sysTypeNo)) { str_index=0; for(j=0;jvar[i].msglen;j++) { tmpValue[str_index]=toascii(pdu->var[i].msg[j]); str_index++; if(tmpValue[str_index-1] == '\\') { tmpValue[str_index]='\\'; str_index++; } } tmpValue[str_index]=0; }else{ omc_RbcdToAscii(tmpValue, pdu->var[i].msg, pdu->var[i].msglen * 2); } sprintf(tmpStr,"`%s`='%s'", updateField,tmpValue); commArr[commNo].finishNum++; break; case 0x05: //NULL(unSpecified) sprintf(tmpStr,"`%s`=''", updateField); commArr[commNo].finishNum++; break; case 0x06: //OBJECT IDENTIFIER tmpLongInt =decode_integer(pdu->var[i].msg, pdu->var[i].msglen); tmpLongInt = decode_integer(pdu->var[i].msg, pdu->var[i].msglen); sprintf(tmpStr,"`%s`='%d'", updateField,tmpLongInt); commArr[commNo].finishNum++; break; case 0x40: //IP Address sprintf(tmpStr,"`%s`='%d.%d.%d.%d'", updateField, pdu->var[i].msg[0],pdu->var[i].msg[1], pdu->var[i].msg[2],pdu->var[i].msg[3]); commArr[commNo].finishNum++; break; case 0x44: //Opaque omc_RbcdToAscii(tmpValue, pdu->var[i].msg, pdu->var[i].msglen * 2); sprintf(tmpStr,"`%s`='%s'", updateField,tmpValue); commArr[commNo].finishNum++; break; case 0x80: //noSuchObject sprintf(tmpStr,"`%s`='Error:NoSuchObject'", updateField); commArr[commNo].finishNum++; break; case 0x81: //NoSuchInstance sprintf(tmpStr,"`%s`='Error:NoSuchInstance'", updateField); commArr[commNo].finishNum++; break; case 0x82: //endOfMibView commArr[commNo].commState = nOutProc; commArr[commNo].finishNum++; break; default: omcLog(paraCommLog, " Invailed vartype(pdu->var[%d].vartype=%d)--> unknown var type", i, pdu->var[i].vartype); return (-1); } if(commArr[commNo].commState == nOutProc) break; strcat(updateSql,tmpStr); // by simon, at 2023-11-15 strcat(updateSql,",`initValue`=`readValue`"); if(commArr[commNo].sysTypeNo!=320){ strcat(updateSql,queryWhere); } //omcLog(paraCommLog,"\nupdateSql=%s\n",updateSql); //ISSUE-3, SMPP(VSS,EMS) need subSysNo if(checkPlatHasSubSysNo(commArr[commNo].sysTypeNo,commArr[commNo].sysNo)) { sprintf(tmpStr,",subSysNo=%d",commArr[commNo].subSysNo); strcat(updateSql,tmpStr); } mysql_getnores(dbConn, updateSql); //if(commArr[commNo].commType!=nSetComm){ // sprintf(updateSql,"UPDATE %s SET initValue=readValue %s",commArr[commNo].paramTable,queryWhere); // mysql_getnores(dbConn, updateSql); //} } if(commArr[commNo].commType == nGetBulkComm){ if(commArr[commNo].commState != nOutProc){//Send command again mkAddr(commNo, &tmpAddr); mkPdu(commNo, pdu->var, &tmpPdu); commArr[commNo].waitTimeCount = 0; commArr[commNo].timeoutCount = 0; if (snmp_send(&tmpPdu, &tmpAddr) > 0) { commArr[commNo].procState = nWaitResponse; } else { omcLog(paraCommLog, "Send snmp message failed!(IP=%s)", commArr[commNo].snmpInfo.dstIP); commArr[commNo].commState = nProcFail; sprintf(commArr[commNo].desc,CONF_COMMAND_ERR_0301); updateCommTable(commNo); commArr[commNo].procState = nIdle; initUnitComm(commNo); } }else{ freeParamSet(commNo); } }else if (commArr[commNo].finishNum >= commArr[commNo].totalNum) { commArr[commNo].commState = nOutProc; freeParamSet(commNo); } return (1); } /************************************************* Function: // updateCommTable Description: // 将指定命令编号的信息,更新到命令表。 // commNo为命令编号, Calls: // Called By: // Table Accessed: // Table Updated: // Input: // Output: // Return: // 1->ok,0->failed Others: // *************************************************/ int updateCommTable(int commNo) { char tmpQuery[256] = "\0"; #if paraComm_DEBUG omcLog(paraCommLog, "commArr[%d].commState=%d", commNo, commArr[commNo].commState); #endif if (commArr[commNo].procState == nIdle) { sprintf(tmpQuery, "UPDATE %s SET `commState` = '%d',`finishNum`= '0', `totalNum`= '%d'," "bgnTime = CURRENT_TIMESTAMP, `remark`='%s' WHERE commId = '%d'", CommTable, commArr[commNo].commState, commArr[commNo].totalNum, commArr[commNo].desc, commArr[commNo].commId); } else { sprintf(tmpQuery, "UPDATE %s SET `commState`='%d',`finishNum`='%d', " "`endTime` = CURRENT_TIMESTAMP, `remark`='%s' WHERE `commId` = '%d'", CommTable, commArr[commNo].commState, commArr[commNo].finishNum, commArr[commNo].desc, commArr[commNo].commId); } mysql_getnores(dbConn, tmpQuery); return (1); } /************************************************* Function: // getSysAddr Description: // 根据系统id从OMC_PUB.sysInfo表,获取该系统的ip // commNo为命令编号, Calls: // Called By: // Table Accessed: // Table Updated: // Input: // Output: // Return: // 1->ok,0->failed Others: // *************************************************/ int getSysAddr(int commNo) { int nReturn = 0; MYSQL_RES *tmpResult; MYSQL_ROW tmpRow; char tmpQuery[512] = "\0"; sprintf(tmpQuery, "SELECT isRemote,netId,DPC,ip FROM %s WHERE sysTypeNo='%d' " "AND sysNo='%d' AND subsysNo='%d' ", IpTable, commArr[commNo].sysTypeNo, commArr[commNo].sysNo, commArr[commNo].subSysNo); tmpResult = (MYSQL_RES *) mysql_getres(dbConn, tmpQuery); if (tmpResult == NULL) { omcLog(paraCommLog, " Database may be stopped,when get IP address from IpTable"); return (0); } if ((tmpRow = mysql_fetch_row(tmpResult)) != NULL) { strcpy(commArr[commNo].snmpInfo.dstIP, tmpRow[3]); #if paraComm_DEBUG //omcLog(paraCommLog, " dstIP=%s", commArr[commNo].dstIP); #endif nReturn = 1; } else { nReturn = 0; } mysql_free_result(tmpResult); return (nReturn); } /************************************************* Function: // getParamTable Description: // 根据系统类型编号,系统编号,参数类型,得出表名 Calls: // Called By: // Table Accessed: // Table Updated: // Input: // Output: // Return: // 1->ok,0->failed Others: // *************************************************/ int getParamTable(int sysTypeNo, int sysNo, int paramType, char *tableName) { if (paramType == nGlobalSysParam) { sprintf(tableName, "OBJ_%d.param_%d", sysTypeNo, nPubFlag); } else { sprintf(tableName, "OBJ_%d.param_%d", sysTypeNo, sysNo); } return (1); } /************************************************* Function: // mkVarArr Description: // 将指定命令的数据变量添加到snmp的数据类型var_list中,为mkPdu做准备。\ Calls: // Called By: // Table Accessed: // Table Updated: // Input: //命令编号,pdu中的var_list的指针。 Output: // Return: // 1->ok,0->failed Others: // *************************************************/ int mkVarArr(int commNo, var_list * varArr) { int i,tmpColumnNo; MYSQL_ROW tmpRow; int nInstanceNo= 10; int nInitValue = 11; int nReadValue = 12; int nValueType = 13; int nLengthInTemplate=15; var_list *unitVar; int varCount = 0; int unitVarLen = 0; int unitVarMsgLen = 0; int msgLen = 0; long tmpInt = 0; char *oneInstanceNo; if(checkMibSystem(commArr[commNo].sysTypeNo)) { if(commArr[commNo].commType==nGetBulkComm){ for(tmpColumnNo=0;tmpColumnNooid[i] = commArr[commNo].snmpInfo.oid[i]; } unitVar->oidlen = commArr[commNo].snmpInfo.oidLen; //Column unitVar->oid[unitVar->oidlen] = commArr[commNo].snmpInfo.column[tmpColumnNo]; unitVar->oidlen++; //Instance for (i = 0; i < commArr[commNo].snmpInfo.instanceNoLevel; i++) { unitVar->oid[unitVar->oidlen+i] = commArr[commNo].snmpInfo.instanceNo[i]; } unitVar->oidlen = unitVar->oidlen+commArr[commNo].snmpInfo.instanceNoLevel; unitVar->msglen = 0; #if paraComm_DEBUG omcLog(paraCommLog,"unitVar->oidlen=%d", unitVar->oidlen); for(i=0;ioidlen;i++){ omcLog(paraCommLog,"unitVar->oid=%d", unitVar->oid[i]); } #endif varCount++; } }else{ //sql="SELECT level_1,...level_10,instanceNo,readValue,initValue,valueType FROM %s WHERE %s //field define if (commArr[commNo].paramSet == NULL) { omcLog(paraCommLog, "Error: commArr[%d].paramSet == NULL", commNo); return (0); } mysql_data_seek(commArr[commNo].paramSet, commArr[commNo].finishNum); while ((varCount < MaxVarNum) && (tmpRow = mysql_fetch_row(commArr[commNo].paramSet))) { //if(strcmp(tmpRow[nReadValue],tmpRow[nInitValue])==0&&commArr[commNo].commType == nSetComm){ // commArr[commNo].finishNum++; // continue; //} //AdministrationState do not set if(commArr[commNo].commType == nSetComm && commArr[commNo].snmpInfo.columnNum > 0) { if(strstr(tmpRow[14],"AdministrationState") || strstr(tmpRow[14],"CreateEntry")) { commArr[commNo].finishNum++; continue; } } //Command do not set if(commArr[commNo].commType == nSetComm && commArr[commNo].snmpInfo.columnNum > 0 && strstr(tmpRow[14],"Command")) { commArr[commNo].finishNum++; continue; } unitVarMsgLen = strlen(tmpRow[nInitValue]); unitVarLen = commArr[commNo].snmpInfo.oidLen + commArr[commNo].snmpInfo.instanceNoLevel + unitVarMsgLen; if (unitVarLen > (commArr[commNo].snmpInfo.maxMsgLen - msgLen)) { break; } unitVar = varArr + varCount; for (i = 0; i < commArr[commNo].snmpInfo.preOidLen; i++) { unitVar->oid[i] = commArr[commNo].snmpInfo.oid[i]; } unitVar->oidlen = commArr[commNo].snmpInfo.preOidLen; //level_1,....level_10 i=0; while ((atoi(tmpRow[i]) > 0) && ((i + unitVar->oidlen)< MaxOidLen)) { unitVar->oid[i+unitVar->oidlen] = atoi(tmpRow[i]); i++; } commArr[commNo].levelWidth[varCount]=(BYTE)i; unitVar->oidlen=unitVar->oidlen+i; if(commArr[commNo].snmpInfo.instanceNoLevel>0){ for (i = 0; i < commArr[commNo].snmpInfo.instanceNoLevel; i++) { unitVar->oid[i+unitVar->oidlen] = commArr[commNo].snmpInfo.instanceNo[i]; } unitVar->oidlen = unitVar->oidlen + commArr[commNo].snmpInfo.instanceNoLevel; }else{ i=0; while ((oneInstanceNo = strsep(&(tmpRow[nInstanceNo]), ".")) != NULL) { unitVar->oid[unitVar->oidlen] = atoi(oneInstanceNo); i++; } unitVar->oidlen = unitVar->oidlen + i; } // fj modify int key_val_type = atoi(tmpRow[nValueType]); if(strstr(tmpRow[14], "RowStatus") != NULL && key_val_type == 0) { key_val_type = TYPE_INTEGER; omcLog(paraCommLog, " change from 0 to %d", TYPE_INTEGER); } switch (key_val_type){ case TYPE_INTEGER: case TYPE_INTEGER32: case TYPE_UNSIGNED32: case TYPE_UINTEGER: case TYPE_BITSTRING: unitVar->vartype = 0x02; tmpInt = atol(tmpRow[nInitValue]); unitVar->msglen = encode_integer(unitVar->msg, tmpInt); break; case TYPE_OCTETSTR: case TYPE_NSAPADDRESS: unitVar->vartype = 0x04; memcpy(unitVar->msg, tmpRow[nInitValue], strlen(tmpRow[nInitValue])); unitVar->msglen = strlen(tmpRow[nInitValue]); break; case TYPE_NULL: break; case TYPE_NETADDR: case TYPE_IPADDR: unitVar->vartype = 0x40; tmpInt=inet_addr(tmpRow[nInitValue]); memcpy(unitVar->msg, &tmpInt,4); unitVar->msglen = 4; break; case TYPE_COUNTER: case TYPE_COUNTER64: break; case TYPE_GAUGE: break; case TYPE_TIMETICKS: break; case TYPE_OPAQUE: unitVar->vartype = 0x44; omc_AsciiToRbcd(unitVar->msg, tmpRow[nInitValue], strlen(tmpRow[nInitValue])); unitVar->msglen = strlen(tmpRow[nInitValue])/2; if(strlen(tmpRow[nInitValue])%2 == 1) unitVar->msglen++; break; default: omcLog(paraCommLog, " Invailed vartype=%d", nValueType); return (0); break; } sprintf(commArr[commNo].readValue[varCount],tmpRow[nReadValue]); msgLen += (unitVar->oidlen + unitVar->msglen + 2); #if paraComm_DEBUG omcLog(paraCommLog, " varArr[%d].oidlen=%d", varCount, varArr[varCount].oidlen); omcLog(paraCommLog, " varArr[%d].objId=", varCount); for (i = 0; i < varArr[varCount].oidlen; i++) { omcLog(paraCommLog, "%ld.", varArr[varCount].oid[i]); } omcLog(paraCommLog, " varArr[%d].vartype=%d", varCount, varArr[varCount].vartype); omcLog(paraCommLog, " varArr[%d].msglen=%d", varCount, varArr[varCount].msglen); for (i = 0; i < varArr[varCount].msglen; i++) { omcLog(paraCommLog, " varArr[%d].msg[%d]=%x", varCount, i, varArr[varCount].msg[i]); } omcLog(paraCommLog, " filled message len=%d", msgLen); #endif varCount++; if (commArr[commNo].snmpInfo.needMuliObj < 1) { break; } } //end of while(..) } }else{ //sql="SELECT level_1,...level_10,instanceNo,readValue,initValue,valueType FROM %s WHERE %s //field define if (commArr[commNo].paramSet == NULL) { omcLog(paraCommLog, "Error: commArr[%d].paramSet == NULL", commNo); return (0); } mysql_data_seek(commArr[commNo].paramSet, commArr[commNo].finishNum); while ((varCount < MaxVarNum) && (tmpRow = mysql_fetch_row(commArr[commNo].paramSet))) { //if(strcmp(tmpRow[nReadValue],tmpRow[nInitValue])==0&&commArr[commNo].commType == nSetComm){ // commArr[commNo].finishNum++; // continue; //} //unitVarMsgLen = strlen(tmpRow[nInitValue]); //unitVarMsgLen = strlen(tmpRow[nInitValueTemplate]); unitVarMsgLen=atoi(tmpRow[nLengthInTemplate]); unitVarLen = commArr[commNo].snmpInfo.oidLen + commArr[commNo].snmpInfo.instanceNoLevel + unitVarMsgLen; if (unitVarLen > (commArr[commNo].snmpInfo.maxMsgLen - msgLen)) { break; } unitVar = varArr + varCount; for (i = 0; i < commArr[commNo].snmpInfo.preOidLen; i++) { unitVar->oid[i] = commArr[commNo].snmpInfo.oid[i]; } unitVar->oidlen = commArr[commNo].snmpInfo.preOidLen; //level_1,....level_10 i=0; while ((atoi(tmpRow[i]) > 0) && ((i + unitVar->oidlen)< MaxOidLen)) { unitVar->oid[i+unitVar->oidlen] = atoi(tmpRow[i]); i++; } commArr[commNo].levelWidth[varCount]=(BYTE)i; unitVar->oidlen=unitVar->oidlen+i; if(commArr[commNo].snmpInfo.instanceNoLevel>0){ for (i = 0; i < commArr[commNo].snmpInfo.instanceNoLevel; i++) { unitVar->oid[i+unitVar->oidlen] = commArr[commNo].snmpInfo.instanceNo[i]; } unitVar->oidlen = unitVar->oidlen + commArr[commNo].snmpInfo.instanceNoLevel; }else{ i=0; while ((oneInstanceNo = strsep(&(tmpRow[nInstanceNo]), ".")) != NULL) { unitVar->oid[unitVar->oidlen] = atoi(oneInstanceNo); i++; } unitVar->oidlen = unitVar->oidlen + i; } unitVar->vartype = atoi(tmpRow[nValueType]); switch (atoi(tmpRow[nValueType])) { case 0x02: //INTEGER tmpInt = atol(tmpRow[nInitValue]); unitVar->msglen = encode_integer(unitVar->msg, tmpInt); //unitVar->msglen = strlen(tmpRow[nInitValue]); break; case 0x04: //OCTET STRING omc_AsciiToRbcd(unitVar->msg, tmpRow[nInitValue], strlen(tmpRow[nInitValue])); //unitVar->msglen = strlen(tmpRow[nInitValue])/2; //unitVar->msglen = strlen(tmpRow[nInitValueTemplate])/2; unitVar->msglen = atoi(tmpRow[nLengthInTemplate]); break; case 0x05: //NULL(unSpecified) case 0x06: //OBJECT IDENTIFIER case 0x80: //noSuchObject case 0x81: //NoSuchInstance case 0x82: //endOfMibView default: omcLog(paraCommLog, " Invailed vartype=%d", unitVar->vartype); return (0); } sprintf(commArr[commNo].readValue[varCount],tmpRow[nReadValue]); msgLen += (unitVar->oidlen + unitVar->msglen + 2); #if paraComm_DEBUG omcLog(paraCommLog, " varArr[%d].oidlen=%d", varCount, varArr[varCount].oidlen); omcLog(paraCommLog, " varArr[%d].objId=", varCount); for (i = 0; i < varArr[varCount].oidlen; i++) { omcLog(paraCommLog, "%ld.", varArr[varCount].oid[i]); } omcLog(paraCommLog, " varArr[%d].vartype=%d", varCount, varArr[varCount].vartype); omcLog(paraCommLog, " varArr[%d].msglen=%d", varCount, varArr[varCount].msglen); for (i = 0; i < varArr[varCount].msglen; i++) { omcLog(paraCommLog, " varArr[%d].msg[%d]=%x", varCount, i, varArr[varCount].msg[i]); } omcLog(paraCommLog, " filled message len=%d", msgLen); #endif varCount++; if (commArr[commNo].snmpInfo.needMuliObj < 1) { break; } } //end of while(..) } commArr[commNo].varNum = varCount; return (1); } /************************************************* Function: // mkAddr Description: // 合成指定命令的snmp地址,从该命令的数据结构中可取出ip和端口,为发送和接收snmp消息做准备。 Calls: // Called By: // Table Accessed: // Table Updated: // Input: //命令编号,snmp_addr的指针。 Output: // Return: // 1->ok,0->failed Others: // *************************************************/ int mkAddr(int commNo, snmp_addr * msgAddr) { #if paraComm_DEBUG omcLog(paraCommLog, "\n Initing message address----"); omcLog(paraCommLog, " addr->local_port:%d", DefPort); //omcLog(paraCommLog, " addr->remote_ip:%s", commArr[commNo].dstIP); //omcLog(paraCommLog, " addr->remote_port:%d", commArr[commNo].dstPort); #endif //make snmp address if (strlen(commArr[commNo].snmpInfo.dstIP) <= 0) { omcLog(paraCommLog, "Initing snmp_addr error: Cannot get ip"); sprintf(commArr[commNo].desc, CONF_COMMAND_ERR_0102); commArr[commNo].commState = nProcFail; updateCommTable(commNo); commArr[commNo].procState = nIdle; return (0); } //addr->local_ip = ; msgAddr->local_port = DefPort; msgAddr->remote_ip = inet_addr(commArr[commNo].snmpInfo.dstIP); msgAddr->remote_port = commArr[commNo].snmpInfo.dstPort; msgAddr->broadcast = 0; return (1); } /************************************************* Function: // mkPdu Description: // 合成指定命令的snmp数据包,为snmp_send做准备。 Calls: // Called By: // Table Accessed: // Table Updated: // Input: //命令编号,var_list的指针,snmp_pdu的指针。 Output: // Return: // 1->ok,0->failed Others: // *************************************************/ int mkPdu(int commNo, var_list * varArr, snmp_pdu * pdu) { BYTE pduType; #if paraComm_DEBUG omcLog(paraCommLog, " Making snmp_pdu"); #endif switch (commArr[commNo].commType) { case nGetComm: pduType = PDU_GET ; break; case nSetComm: case nNewEntryComm: pduType = PDU_SET; break; case nGetBulkComm: pduType = PDU_GETNEXT; break; default: return (0); } pdu->pdu_type = pduType; pdu->request_id = commArr[commNo].commId; pdu->var_num = commArr[commNo].varNum; sprintf(pdu->community, "%s", commArr[commNo].snmpInfo.snmpCommunity); memcpy(pdu->var, varArr, sizeof(var_list) * BIND_MAX); #if paraComm_DEBUG omcLog(paraCommLog, " memcpy finished!"); #endif pdu->error_status = 0x0; //0:no error 1:too big 2:nosuchname 3:badvalue 4:readonly 5:agenerr pdu->error_index = 0x0; return (1); } /************************************************* Function: // initUnitComm Description: // 初始化指定命令,将该命令数据初始化,并释放未释放的结果集。 Calls: // Called By: // Table Accessed: // Table Updated: // Input: //命令编号 Output: // Return: // 1->ok,0->failed Others: // *************************************************/ int initUnitComm(int commNo) { int i = 0; #if paraComm_DEBUG omcLog(paraCommLog, " Try to init commArr[%d] ", commNo); #endif if (commNo > MaxCommNum) { return (0); } commArr[commNo].commId = 0; commArr[commNo].commType = 0; commArr[commNo].paramType = 0; commArr[commNo].sysTypeNo = 0; commArr[commNo].sysNo = 0; commArr[commNo].subSysNo = 0; freeParamSet(commNo); #if paraComm_DEBUG omcLog(paraCommLog," commArr[%d].paramSet = %x",commNo,commArr[commNo].paramSet); #endif commArr[commNo].totalNum = 0; commArr[commNo].finishNum = 0; commArr[commNo].desc[0] = 0; commArr[commNo].paramTable[0] = 0; commArr[commNo].snmpInfo.needMuliObj = 0; commArr[commNo].snmpInfo.dstIP[0] = 0; commArr[commNo].snmpInfo.dstPort = DefPort; commArr[commNo].snmpInfo.oidLen = 0; for (i = 0; i < MaxOidLen; i++) { commArr[commNo].snmpInfo.oid[i] = 0; } commArr[commNo].snmpInfo.instanceNoLevel = 0; for (i = 0; i < MaxInstanceNoLevel; i++) { commArr[commNo].snmpInfo.instanceNo[i] = 0; } commArr[commNo].snmpInfo.snmpCommunity[0] = 0; commArr[commNo].commState = 0; commArr[commNo].procState = 0; commArr[commNo].waitTimeCount = 0; commArr[commNo].timeoutCount = 0; commArr[commNo].varNum = 0; #if paraComm_DEBUG omcLog(paraCommLog, " init commArr[%d] ok", commNo); #endif return (1); } /************************************************* Function: // freeParamSet Description: // check and free commArr[commNo].paramSet Calls: // Called By: // Table Accessed: // Table Updated: // Input: //命令编号 Output: // Return: // Others: // *************************************************/ void freeParamSet(int commNo) { int i; if (commArr[commNo].paramSet != NULL) { int isCanFree = 1; //because same sql's resultSet's address will be same,so it is must check other command's state for (i = 0; i < MaxCommNum; i++) { if ((i != commNo) && (commArr[i].paramSet == commArr[commNo].paramSet)) { if ((commArr[i].commState == nWaitProc) || (commArr[i].commState == nInProc)) { isCanFree = 0; } else { //omcLog(paraCommLog," Set commArr[%d].paramSet (%x) = NULL",i,commArr[i].paramSet); commArr[i].paramSet = NULL; } } } if (isCanFree > 0) { #if paraComm_DEBUG //omcLog(paraCommLog," Try to free commArr[%d].paramSet (%x)",commNo,commArr[commNo].paramSet); #endif mysql_free_result(commArr[commNo].paramSet); } commArr[commNo].paramSet = NULL; } } void optErr(unitComm *ucomm) { int ii; char where[128]; char updatesql[256]; char instanceList[32]; char tmp[16]; int ilen; int ioid; memset(instanceList,0,32); for(ii=0;iisnmpInfo.instanceNoLevel;ii++) { sprintf(tmp,"%04d.",ucomm->snmpInfo.instanceNo[ii]); strcat(instanceList,tmp); } ilen=strlen(instanceList); if(instanceList[ilen-1] == '.') instanceList[ilen-1]='\0'; //printf("\n"); //printf("instanceNo=%s\n",instanceList); memset(where,0,128); strcat(where,"where "); ioid=1; for(ii=ucomm->snmpInfo.preOidLen;iisnmpInfo.oidLen;ii++) { //printf("%d ",ucomm->snmpInfo.oid[ii]); sprintf(tmp,"level_%d=%d and ",ioid++,ucomm->snmpInfo.oid[ii]); strcat(where,tmp); } sprintf(tmp,"instanceNo='%s' ",instanceList); strcat(where,tmp); //printf("\nwhere=%s\n",where); //printf("paramTable=%s\n",ucomm->paramTable); sprintf(updatesql, "update %s set `initValue`=`readValue` %s",ucomm->paramTable,where); mysql_getnores(dbConn, updatesql); omcLog(paraCommLog, "opt error,sql=%s",updatesql); }