#include "cdr.h" extern void cdrdb_init(); extern void cdrdb_timer(); extern void cdr_clock_init(int tc_sec); char globalstr[8192]; char sqlstr[8192]; char nrtrdesqlstr[8192]; char mtsmssqlstr[8192]; cdr_src cdr_src_set[MAX_SRC_NUM]; int cdr_src_num=0; cdr_sys cdr_sys_set[MAX_SYS_NUM]; int cdr_sys_num=0; msg snmp_msg_set[MAX_SNMP_MSG_NUM]; int snmp_msg_num=0; sql_comm_buf sql_comm_buffer; static int sys_index; static cdr_sys *psys=NULL; static unsigned long prev_time=0; static unsigned long curr_time=0; static unsigned long time_slot=0; static int cdr_sync_data_id=-1; //dual mode int omcSysNo=-1; int getOmcSysNo(int* sysNo); int getOmcStatus(int sysNo); //heartbeat DWORD PROC_HEARTBEAT_OID[12]={1,3,6,1,4,1,1373,2,4,10,6}; int PROC_HEARTBEAT_OIDLEN=11; unsigned long heartbeat_timeout=0; int sendHeartbeat(); //smlog content parse int smlog_decode_flag=0; void getConfFromDB(); //for NRTRDE int nrtrde_flag=0; char local_mcc[8]; char local_mnc[8]; char mcc[8]; char mnc[8]; int isRoamCDR=0; int initNRConf(void); //for wsms int wsms_enable_flag; void getVlrCdr(cdr_sys* psys,int serial,BYTE * pmsg,WORD msglen,int tagcode); int wsms_check_sub(char* imsi,char* msisdn); int initWSMSConf(void); int formatSingleQuotation(char *inbuf,int inlen,char* outbuf); //for mt sms charge int mt_sms_charge_flag=0; #define MT_SMS_CHARGE_TABLE "mt_sms_cdr" void cdr_log(const char *fmt, ...); void cdr_logmsg(BYTE* msgbuf,int len); void load_cdr_info(); void load_sys_info(); void get_info(cdr_sys *psys); void cdr_receive(); int get_msg(cdr_sys *psys); void check_pointer(cdr_sys *psys,snmp_pdu *pdu); int parse_info(snmp_pdu *pdu,DWORD *head,DWORD *tail); void get_cdr(cdr_sys *psys); void set_cdr_tail(cdr_sys *psys); void reset_cdr_pointer(cdr_sys *psys); void cdr_process(cdr_sys *psys,snmp_pdu *pdu); void load_cdr_def(cdr_src *psrc); void create_record_table(cdr_src *psrc,MYSQL *pCdrConn); void send_sql_comm(char *sqlcomm); void cdr_parse(cdr_sys *psys,int tagcode,ASN_BUF *asnbuf,int fieldIndex,char* fieldstr); BYTE str2oid(char *str, DWORD * array, BYTE max); char *bcd2str(BYTE* buf,int len); int smsDecodeAll(int code_type,char* strIn,char* strOut,int length); char* digits2str(BYTE* buf,int len); char* askm2str(BYTE* buf,int len); void test() { cdr_sys sys; snmp_pdu pdu; int i,pos; pdu.error_status=0; pdu.var_num=1; pdu.var[0].vartype=4; pdu.var[0].msglen=0; pos=0; pdu.var[0].msg[pos++]=0x02; pdu.var[0].msg[pos++]=0x04; pdu.var[0].msg[pos++]=0x00; pdu.var[0].msg[pos++]=0x00; pdu.var[0].msg[pos++]=0x00; pdu.var[0].msg[pos++]=0x01; pdu.var[0].msg[pos++]=0xA0; pdu.var[0].msg[pos++]=0x60; pdu.var[0].msg[pos++]=0x80; pdu.var[0].msg[pos++]=0x01; pdu.var[0].msg[pos++]=0x12; pdu.var[0].msg[pos++]=0x81; pdu.var[0].msg[pos++]=0x06; pdu.var[0].msg[pos++]=0x91; pdu.var[0].msg[pos++]=0x76; pdu.var[0].msg[pos++]=0x76; pdu.var[0].msg[pos++]=0x47; pdu.var[0].msg[pos++]=0x64; pdu.var[0].msg[pos++]=0x54; pdu.var[0].msg[pos++]=0x82; pdu.var[0].msg[pos++]=0x06; pdu.var[0].msg[pos++]=0x91; pdu.var[0].msg[pos++]=0x76; pdu.var[0].msg[pos++]=0x76; pdu.var[0].msg[pos++]=0x77; pdu.var[0].msg[pos++]=0x33; pdu.var[0].msg[pos++]=0x86; pdu.var[0].msg[pos++]=0x83; pdu.var[0].msg[pos++]=0x09; pdu.var[0].msg[pos++]=0x12; pdu.var[0].msg[pos++]=0x04; pdu.var[0].msg[pos++]=0x26; pdu.var[0].msg[pos++]=0x16; pdu.var[0].msg[pos++]=0x39; pdu.var[0].msg[pos++]=0x43; pdu.var[0].msg[pos++]=0x2D; pdu.var[0].msg[pos++]=0x13; pdu.var[0].msg[pos++]=0x00; pdu.var[0].msg[pos++]=0x84; pdu.var[0].msg[pos++]=0x01; pdu.var[0].msg[pos++]=0x00; pdu.var[0].msg[pos++]=0x85; pdu.var[0].msg[pos++]=0x22; pdu.var[0].msg[pos++]=0x4F; pdu.var[0].msg[pos++]=0x34; pdu.var[0].msg[pos++]=0x28; pdu.var[0].msg[pos++]=0xFD; pdu.var[0].msg[pos++]=0x66; pdu.var[0].msg[pos++]=0xD1; pdu.var[0].msg[pos++]=0xDF; pdu.var[0].msg[pos++]=0xEB; pdu.var[0].msg[pos++]=0x37; pdu.var[0].msg[pos++]=0x3B; pdu.var[0].msg[pos++]=0x8C; pdu.var[0].msg[pos++]=0x4E; pdu.var[0].msg[pos++]=0x83; pdu.var[0].msg[pos++]=0xCC; pdu.var[0].msg[pos++]=0xEF; pdu.var[0].msg[pos++]=0x75; pdu.var[0].msg[pos++]=0x1A; pdu.var[0].msg[pos++]=0xB4; pdu.var[0].msg[pos++]=0x0E; pdu.var[0].msg[pos++]=0xD7; pdu.var[0].msg[pos++]=0x41; pdu.var[0].msg[pos++]=0xE6; pdu.var[0].msg[pos++]=0xFB; pdu.var[0].msg[pos++]=0x18; pdu.var[0].msg[pos++]=0x64; pdu.var[0].msg[pos++]=0x7E; pdu.var[0].msg[pos++]=0xAF; pdu.var[0].msg[pos++]=0xD3; pdu.var[0].msg[pos++]=0xA0; pdu.var[0].msg[pos++]=0x74; pdu.var[0].msg[pos++]=0x18; pdu.var[0].msg[pos++]=0x54; pdu.var[0].msg[pos++]=0x76; pdu.var[0].msg[pos++]=0x01; pdu.var[0].msg[pos++]=0x86; pdu.var[0].msg[pos++]=0x02; pdu.var[0].msg[pos++]=0x38; pdu.var[0].msg[pos++]=0x40; pdu.var[0].msg[pos++]=0x87; pdu.var[0].msg[pos++]=0x01; pdu.var[0].msg[pos++]=0x01; pdu.var[0].msg[pos++]=0x88; pdu.var[0].msg[pos++]=0x04; pdu.var[0].msg[pos++]=0x00; pdu.var[0].msg[pos++]=0x9D; pdu.var[0].msg[pos++]=0x82; pdu.var[0].msg[pos++]=0x21; pdu.var[0].msg[pos++]=0x89; pdu.var[0].msg[pos++]=0x09; pdu.var[0].msg[pos++]=0x12; pdu.var[0].msg[pos++]=0x04; pdu.var[0].msg[pos++]=0x26; pdu.var[0].msg[pos++]=0x16; pdu.var[0].msg[pos++]=0x39; pdu.var[0].msg[pos++]=0x37; pdu.var[0].msg[pos++]=0x2D; pdu.var[0].msg[pos++]=0x13; pdu.var[0].msg[pos++]=0x00; pdu.var[0].msg[pos++]=0x8A; pdu.var[0].msg[pos++]=0x01; pdu.var[0].msg[pos++]=0x00; pdu.var[0].msglen=pos; sys.cdrSrcNo=7; sys.sysTypeNo=351; sys.sysNo=0; sys.subSysNo=0; for(i=0;i1) { cdr_log("[ERR][cdr_init]:Fail to get the omcSysNo\n"); exit(-1); } cdrdb_init(); cdr_sync_data_id=sync_data_register("CDR_SYNC"); //test(); } void cdr_timer() { int index; int omcStatus; static unsigned long update_sys_timeout=0; curr_time=time(NULL); if(curr_time < prev_time) { cdr_log("[ERR][cdr_timer]: The system time may be changed! curr_time=%d, prev_time=%d", curr_time, prev_time); prev_time=curr_time; cdr_clock_init(0); return; } time_slot=curr_time-prev_time; if(time_slot > 30) { /* Fixed for Norfolk EMS CDR lost issue by simon * Store second number when time to be changed * --begin */ cdr_log("[ERR][cdr_timer]: The previous timer consume too much time or the system time my be changed! prev_time=%d, time_slot=%d", prev_time, time_slot); /* --end * */ cdr_clock_init(time_slot); } if(time(NULL) - heartbeat_timeout > 5) { heartbeat_timeout=time(NULL); sendHeartbeat(); } cdrdb_timer(); send_sql_comm(NULL); omcStatus=getOmcStatus(omcSysNo); if(omcStatus == OMC_MASTER || omcStatus == OMC_SINGLE) { update_sys_timeout+=time_slot; if(update_sys_timeout > 60) { update_sys_timeout=0; load_sys_info(); } for(index=0;indextimeout > 0) psys->timeout-=time_slot; if(psys->timeout > 0) continue; switch(psys->state) { case STATE_IDLE: psys->state=STATE_INFO_GET; break; case STATE_INFO_GET: psys->state=STATE_INFO_RESPONSE; psys->retry=0; get_info(psys); break; case STATE_INFO_RESPONSE: if((index=get_msg(psys)) != -1) { snmp_msg_set[index].use=0; snmp_msg_num--; check_pointer(psys,&snmp_msg_set[index].pdu); } else { if(psys->retry++ > MAX_RETRY) { cdr_log("[ERR][cdr_receive]:GET_INFO_RESPONSE timeout, request id=%ld, %d-%d-%d",psys->requestId,psys->sysTypeNo,psys->sysNo,psys->subSysNo); psys->state=STATE_IDLE; psys->timeout=MAX_IDLE_TIMEOUT; } } break; case STATE_CDR_GET: psys->state=STATE_CDR_RESPONSE; psys->retry=0; get_cdr(psys); break; case STATE_CDR_RESPONSE: if((index=get_msg(psys)) != -1) { //get a cdr response cdr_process(psys,&snmp_msg_set[index].pdu); snmp_msg_set[index].use=0; snmp_msg_num--; if(psys->error >= 256) { psys->error=0; psys->state=STATE_RESET_SET; psys->retry=0; break; } if(psys->isVarTooBig) { psys->isVarTooBig=0; psys->tail=psys->tmptail; psys->prepareSetTail=0; } if(psys->prepareSetTail) { psys->prepareSetTail=0; psys->state=STATE_TAIL_SET; psys->retry=0; } else { psys->state=STATE_CDR_GET; } } else { if(psys->retry++ > MAX_RETRY) { cdr_log("[ERR][cdr_receive]:GET_CDR_RESPONSE timeout, request id=%ld, %d-%d-%d",psys->requestId,psys->sysTypeNo,psys->sysNo,psys->subSysNo); psys->state=STATE_IDLE; psys->timeout=MAX_IDLE_TIMEOUT; } } break; case STATE_TAIL_SET: psys->state=STATE_TAIL_RESPONSE; psys->retry=0; set_cdr_tail(psys); //set tail break; case STATE_TAIL_RESPONSE: if((index=get_msg(psys)) != -1) { snmp_msg_set[index].use=0; snmp_msg_num--; psys->state=STATE_IDLE; psys->timeout=INSTANT_TIMEOUT; } else { if(psys->retry++ > MAX_RETRY) { cdr_log("[ERR][cdr_receive]:STATE_TAIL_RESPONSE timeout, request id=%ld, %d-%d-%d",psys->requestId,psys->sysTypeNo,psys->sysNo,psys->subSysNo); psys->state=STATE_IDLE; psys->timeout=MAX_IDLE_TIMEOUT; } } break; case STATE_RESET_SET: psys->state=STATE_RESET_RESPONSE; psys->retry=0; reset_cdr_pointer(psys); break; case STATE_RESET_RESPONSE: if((index=get_msg(psys)) != -1) { snmp_msg_set[index].use=0; snmp_msg_num--; psys->state=STATE_IDLE; psys->timeout=INSTANT_TIMEOUT; } else { if(psys->retry++ > MAX_RETRY) { cdr_log("[ERR][cdr_receive]:STATE_RESET_RESPONSE timeout, request id=%ld, %d-%d-%d",psys->requestId,psys->sysTypeNo,psys->sysNo,psys->subSysNo); psys->state=STATE_IDLE; psys->timeout=MAX_IDLE_TIMEOUT; } } break; } } } prev_time=curr_time; } void set_cdr_tail(cdr_sys *psys) { snmp_pdu request_msg; cdr_src *psrc; psrc=&cdr_src_set[psys->cdrSrcNo]; request_msg.pdu_type=PDU_SET; memcpy(request_msg.var[0].oid,psrc->tailOid,4*psrc->tailOidLen); request_msg.var[0].oidlen=psrc->tailOidLen; sprintf(request_msg.community,"public"); request_msg.var_num=1; request_msg.request_id=0; request_msg.var[0].vartype=2; //Integer request_msg.var[0].msglen=4; request_msg.var[0].msg[0]=psys->tail >> 24; request_msg.var[0].msg[1]=(psys->tail >> 16) & 0xFF; request_msg.var[0].msg[2]=(psys->tail >> 8) & 0xFF; request_msg.var[0].msg[3]=psys->tail & 0xFF; psys->requestId=snmp_send(&request_msg,&psys->addr); //printf("send msg1 %ld\n",psys->requestId); #if CDR_DEBUG cdr_log("Set tail requst, request id=%ld, %d-%d-%d",psys->requestId,psys->sysTypeNo,psys->sysNo,psys->subSysNo); #endif if(psys->requestId == 0) { cdr_log("[ERR][set_cdr_tail]:Send snmp request to set cdr tail pointer fail, %d-%d-%d",psys->sysTypeNo,psys->sysNo,psys->subSysNo); } } void reset_cdr_pointer(cdr_sys *psys) { snmp_pdu request_msg; cdr_src *psrc; psrc=&cdr_src_set[psys->cdrSrcNo]; request_msg.pdu_type=PDU_SET; memcpy(request_msg.var[0].oid,psrc->headOid,4*psrc->headOidLen); request_msg.var[0].oidlen=psrc->headOidLen; memcpy(request_msg.var[1].oid,psrc->tailOid,4*psrc->tailOidLen); request_msg.var[1].oidlen=psrc->tailOidLen; sprintf(request_msg.community,"public"); request_msg.var_num=2; request_msg.request_id=0; request_msg.var[0].vartype=2; //Integer request_msg.var[0].msglen=4; request_msg.var[0].msg[0]=0; request_msg.var[0].msg[1]=0; request_msg.var[0].msg[2]=0; request_msg.var[0].msg[3]=0; request_msg.var[1].vartype=2; //Integer request_msg.var[1].msglen=4; request_msg.var[1].msg[0]=0; request_msg.var[1].msg[1]=0; request_msg.var[1].msg[2]=0; request_msg.var[1].msg[3]=0; psys->requestId=snmp_send(&request_msg,&psys->addr); //printf("send msg2 %ld\n",psys->requestId); #if CDR_DEBUG cdr_log("Reset pointer requst, request id=%ld, %d-%d-%d",psys->requestId,psys->sysTypeNo,psys->sysNo,psys->subSysNo); #endif if(psys->requestId == 0) { cdr_log("[ERR][reset_cdr_pointer]:Send snmp request to reset cdr pointer fail, %d-%d-%d",psys->sysTypeNo,psys->sysNo,psys->subSysNo); } } void get_info(cdr_sys *psys) { snmp_pdu request_msg; cdr_src *psrc; psrc=&cdr_src_set[psys->cdrSrcNo]; request_msg.pdu_type=PDU_GET; //fill the get head var memcpy(request_msg.var[0].oid,psrc->headOid,4*psrc->headOidLen); request_msg.var[0].oidlen=psrc->headOidLen; //fill the get tail var memcpy(request_msg.var[1].oid,psrc->tailOid,4*psrc->tailOidLen); request_msg.var[1].oidlen=psrc->tailOidLen; sprintf(request_msg.community,"public"); request_msg.var_num=2; request_msg.request_id=0; psys->requestId=snmp_send(&request_msg,&psys->addr); //printf("send msg3 %ld\n",psys->requestId); if(psys->requestId == 0) { cdr_log("[ERR][get_info]:Send snmp request to get info fail, %d-%d-%d",psys->sysTypeNo,psys->sysNo,psys->subSysNo); } #if CDR_DEBUG cdr_log("send info requst, request id=%ld",psys->requestId); #endif } void get_cdr(cdr_sys *psys) { snmp_pdu request_msg; cdr_src *psrc; DWORD chasePtr; int var_num=0; psrc=&cdr_src_set[psys->cdrSrcNo]; request_msg.pdu_type=PDU_GET; request_msg.request_id=0; sprintf(request_msg.community,"public"); if(psys->head < psys->tail) chasePtr=MAX_CDR_PTR; else chasePtr=psys->head; psys->tmptail=psys->tail; do { if(var_num >= psys->maxVarNum) break; memcpy(request_msg.var[var_num].oid,psrc->dataOid,4*psrc->dataOidLen); request_msg.var[var_num].oid[psrc->dataOidLen]=psys->tail; request_msg.var[var_num].oidlen=psrc->dataOidLen+1; #if CDR_DEBUG cdr_log("Encode var to get cdr %ld[%08X], %d-%d-%d",psys->tail,psys->tail,psys->sysTypeNo,psys->sysNo,psys->subSysNo); #endif psys->tail++; if(psys->tail > MAX_CDR_PTR) psys->tail=0; var_num++; }while(psys->tail < chasePtr); request_msg.var_num=var_num; psys->requestId=snmp_send(&request_msg,&psys->addr); //printf("send msg4 %ld\n",psys->requestId); #if CDR_DEBUG cdr_log("send data request, request id=%ld",psys->requestId); #endif if(psys->requestId == 0) { cdr_log("[ERR][get_cdr]:Send snmp request to get cdr fail, %d-%d-%d",psys->sysTypeNo,psys->sysNo,psys->subSysNo); } if(psys->tail == chasePtr) { psys->prepareSetTail=1; //cdr_log("[INFO][get_cdr]:Finish to get cdr, start to set tail, %d-%d-%d",psys->sysTypeNo,psys->sysNo,psys->subSysNo); return; } } void load_cdr_def(cdr_src *psrc) { MYSQL_RES *res_set; MYSQL_ROW row; MYSQL *pCdrConn; int tagvalue; cdr_def *pdef; char tagstr[256]; char tmpstr[128]; int i,pos; pCdrConn=mysql_conn(HOST_NAME,CDRDB_NAME); if(pCdrConn == NULL) { cdr_log("[ERR][load_cdr_def]:mysql_conn CDR_DB\n"); exit(-1); } sprintf(sqlstr,"SHOW FIELDS FROM %s.%s LIKE 'tag%%'",CDRDB_NAME,psrc->defineTable); res_set=mysql_getres(pCdrConn,sqlstr); if(res_set == NULL) { cdr_log("[ERR %d][load_cdr_def]:%s\n",mysql_errno(pCdrConn),sqlstr); exit(-1); } pdef=&psrc->define; while((row = mysql_fetch_row(res_set))) { tagvalue=atoi((char*)(row[0]+strlen("tag"))); if(tagvalue >= MAX_TAG_VALUE) { cdr_log("[ERR][load_cdr_def]:The tag value define in %s is out of range[%d >= %d]",psrc->defineTable,tagvalue,MAX_TAG_VALUE); exit(-1); } pdef->tags[tagvalue]=1; } mysql_free_result(res_set); // memset(tagstr,0,strlen(tagstr)); memset(tagstr,0,256); for(i=0;itags[i]) { sprintf(tmpstr,",tag%d",i); strcat(tagstr,tmpstr); } } sprintf(sqlstr,"SELECT fieldName,type,optional,width%s FROM %s.%s",tagstr,CDRDB_NAME,psrc->defineTable); res_set=mysql_getres(pCdrConn,sqlstr); if(res_set == NULL) { cdr_log("[ERR %d][load_cdr_def]:%s\n",mysql_errno(pCdrConn),sqlstr); exit(-1); } pdef->fieldCount=0; memset(pdef->allFieldList,0,strlen(pdef->allFieldList)); strcat(pdef->allFieldList,"key_sys_id,instance,srcCode"); while((row = mysql_fetch_row(res_set))) { sprintf(pdef->fields[pdef->fieldCount].fieldName,"%s",row[0]); sprintf(tmpstr,",%s",row[0]); strcat(pdef->allFieldList,tmpstr); pdef->fields[pdef->fieldCount].type=atoi(row[1]); pdef->fields[pdef->fieldCount].optional=atoi(row[2]); pdef->fields[pdef->fieldCount].width=atoi(row[3]); pos=4; for(i=0;itags[i]) { if(strlen(row[pos]) > 0) { pdef->fields[pdef->fieldCount].tagFlag[i]=1; sprintf(pdef->fields[pdef->fieldCount].tags[i],"%s",row[pos]); } else { pdef->fields[pdef->fieldCount].tagFlag[i]=0; } //cdr_log("%s,tags[%d]=%s,flag=%d",row[0],i,row[pos],pdef->fields[pdef->fieldCount].tagFlag[i]); pos++; } } pdef->fieldCount++; if(pdef->fieldCount >= MAX_FLD_NUM) { cdr_log("[ERR][load_cdr_def]:The field count define in %s is out of range [%d >= %d]",psrc->defineTable,pdef->fieldCount,MAX_FLD_NUM); exit(-1); } } mysql_free_result(res_set); sprintf(sqlstr,"SELECT fieldName FROM %s.%s WHERE fileOrder>0 ORDER BY fileOrder",CDRDB_NAME,psrc->defineTable); res_set=mysql_getres(pCdrConn,sqlstr); if(res_set == NULL) { cdr_log("[ERR %d][load_cdr_def]:%s\n",mysql_errno(pCdrConn),sqlstr); exit(-1); } memset(pdef->outFieldList,0,strlen(pdef->outFieldList)); while((row = mysql_fetch_row(res_set))) { sprintf(tmpstr,",%s",row[0]); strcat(pdef->outFieldList,tmpstr); } mysql_free_result(res_set); create_record_table(psrc,pCdrConn); mysql_close(pCdrConn); } void create_record_table(cdr_src *psrc,MYSQL *pCdrConn) { char createsql[8192]; char createfieldlist[8192]; char tmpstr[256]; cdr_def *pdef; int hour; int index; pdef=&psrc->define; //memset(createfieldlist,0,strlen(createfieldlist)); memset(createfieldlist,0,8192); memset(tmpstr,0,256); sprintf(tmpstr,"key_sys_id tinyint(2) DEFAULT '0' NOT NULL,instance int(4) DEFAULT '0' NOT NULL,"); strcat(createfieldlist,tmpstr); for(index=0;indexfieldCount;index++) { sprintf(tmpstr,"%s ",pdef->fields[index].fieldName); strcat(createfieldlist,tmpstr); switch(pdef->fields[index].type) { //string case 0: case 2: case 4: case 24: case 26: case 40: case 41: case 7: if((pdef->fields[index].width) < 255) sprintf(tmpstr,"VARCHAR(%d)",pdef->fields[index].width); else sprintf(tmpstr,"TEXT"); strcat(createfieldlist,tmpstr); break; case 42: // 假设这是一个字符串类型的字段 strcat(createfieldlist, "VARCHAR(30)"); // 或者根据需要调整长度 break; //integer case 1: //unsigned integer case 25: case 6: case 8: sprintf(tmpstr,"int(%d)",pdef->fields[index].width); strcat(createfieldlist,tmpstr); break; case 5: strcat(createfieldlist,"VARCHAR(20)"); break; //timestamp case 3: strcat(createfieldlist,"DATETIME DEFAULT '0000-00-00 00:00:00'"); break; case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: case 19: case 20: case 22: case 23: strcat(createfieldlist,"TEXT"); break; case 21: strcat(createfieldlist,"VARCHAR(3)"); break; } if(!pdef->fields[index].optional) strcat(createfieldlist, " NOT NULL"); strcat(createfieldlist,","); } strcat(createfieldlist,"srcCode TEXT,PRIMARY KEY (key_sys_id, instance, releaseTime));"); for(hour=0;hour<24;hour++) { //memset(createsql,0,strlen(createsql)); memset(createsql,0,8192); sprintf(tmpstr,"CREATE TABLE IF NOT EXISTS %s.%s_%02d (",CDRDB_NAME,psrc->recordTable,hour); strcat(createsql,tmpstr); strcat(createsql,createfieldlist); if(mysql_getnores(pCdrConn,createsql) != 0) { cdr_log("[ERR][create_record_table]:Fail to create table '%s.%s_%02d'\n%s",CDRDB_NAME,psrc->recordTable,hour,createsql); exit(-1); } } } void load_cdr_info() { MYSQL_RES *res_set; MYSQL_ROW row; MYSQL *pCdrConn; cdr_src *psrc=NULL; pCdrConn=mysql_conn(HOST_NAME,CDRDB_NAME); if(pCdrConn == NULL) { cdr_log("[ERR][load_cdr_info]:mysql_conn CDR_DB\n"); exit(-1); } sprintf(sqlstr,"SELECT oid,bufSize,headOid,tailOid,port,recordTable,defineTable,csvPath,backupMax,version,sysTypeNo FROM %s.cdrSource where isEnable > 0 group by defineTable",CDRDB_NAME); res_set=mysql_getres(pCdrConn,sqlstr); if(res_set == NULL) { cdr_log("[ERR %d][load_cdr_info]:%s\n",mysql_errno(pCdrConn),sqlstr); exit(-1); } cdr_src_num=0; cdr_sys_num=0; memset(cdr_src_set,0,sizeof(cdr_src_set)); memset(cdr_sys_set,0,sizeof(cdr_sys_set)); memset(snmp_msg_set,0,sizeof(snmp_msg_set)); memset(&sql_comm_buffer,0,sizeof(sql_comm_buffer)); while((row = mysql_fetch_row(res_set))) { psrc=&cdr_src_set[cdr_src_num]; sprintf(psrc->dataPotOid,"%s",row[0]); psrc->bufferSize=atoi(row[1]); sprintf(psrc->headPotOid,"%s",row[2]); sprintf(psrc->tailPotOid,"%s",row[3]); sprintf(psrc->recordTable,"%s",row[5]); psrc->headOidLen=str2oid(row[2],psrc->headOid,20); psrc->tailOidLen=str2oid(row[3],psrc->tailOid,20); psrc->dataOidLen=str2oid(row[0],psrc->dataOid,20); sprintf(psrc->defineTable,"%s",row[6]); sprintf(psrc->csvPath,"%s",row[7]); psrc->version=atoi(row[9]); psrc->port=atoi(row[4]); psrc->sysTypeNo=atoi(row[10]); load_cdr_def(psrc); cdr_log("[INFO][load_cdr_info]:CDR SOURCE[%d], sysTypeNo=%d, dataOid[%d]=%s, headOid[%d]=%s, tailOid[%d]=%s, recordTable=%s, defineTable=%s, csvPath=%s, version=%d", cdr_src_num,psrc->sysTypeNo,psrc->dataOidLen,psrc->dataPotOid,psrc->headOidLen,psrc->headPotOid,psrc->tailOidLen,psrc->tailPotOid,psrc->recordTable,psrc->defineTable,psrc->csvPath,psrc->version); cdr_src_num++; if(cdr_src_num >= MAX_SRC_NUM) { cdr_log("[ERR][load_cdr_info]:There are too mang CDR SOURCE"); break; } } mysql_free_result(res_set); mysql_close(pCdrConn); } void load_sys_info() { MYSQL_RES *res_set; MYSQL_ROW row; MYSQL *pCdrConn; int sysTypeNo,sysNo,subSysNo; int i; pCdrConn=mysql_conn(HOST_NAME,CDRDB_NAME); if(pCdrConn == NULL) { cdr_log("[ERR][load_sys_info]:mysql_conn CDR_DB\n"); exit(-1); } sprintf(sqlstr,"SELECT sysTypeNo,sysNo,subSysNo,ip FROM OMC_PUB.sysInfo"); res_set=mysql_getres(pCdrConn,sqlstr); if(res_set == NULL) { cdr_log("[ERR %d][load_sys_info]:%s\n",mysql_errno(pCdrConn),sqlstr); exit(-1); } while((row = mysql_fetch_row(res_set))) { sysTypeNo=atoi(row[0]); sysNo=atoi(row[1]); subSysNo=atoi(row[2]); for(i=0;i= MAX_SYS_NUM) { cdr_log("[ERR][load_sys_info]: There are too many system"); break; } for(i=0;i= MAX_SNMP_MSG_NUM) return; memset(&cdrmsg,0,sizeof(snmp_pdu)); if(snmp_receive(&cdrmsg,&addr) == 0) return; if(cdrmsg.pdu_type != PDU_RSP) continue; while(index < MAX_SNMP_MSG_NUM) { if(snmp_msg_set[index].use == 0) break; index++; } if(index == MAX_SNMP_MSG_NUM) { cdr_log("[WARN][cdr_receive]:The receive buffer is full"); return; } memset(&snmp_msg_set[index].pdu,0,sizeof(snmp_pdu)); memcpy(&snmp_msg_set[index].pdu,&cdrmsg,sizeof(snmp_pdu)); //printf("receive msg request id=%ld\n",snmp_msg_set[index].pdu.request_id); snmp_msg_set[index].use=1; snmp_msg_set[index].timeout=MAX_MSG_TIMEOUT; snmp_msg_num++; int i; char stroid[64]; char strtmp[24]; sprintf(stroid," "); for(i=0;isysTypeNo,psys->sysNo,psys->subSysNo); psys->state=STATE_IDLE; psys->timeout=MAX_IDLE_TIMEOUT; return; } psrc=&cdr_src_set[psys->cdrSrcNo]; //check the head and tail pointer //cdr_log("[INFO][check_pointer]:Get head=%ld[%08X], tail=%ld[%08X], current, head=%ld[%08X], tail=%ld[%08X], %d-%d-%d",getHead,getHead,getTail,getTail,psys->head,psys->head,psys->tail,psys->tail,psys->sysTypeNo,psys->sysNo,psys->subSysNo); if(getHead == getTail) { psys->head=getHead; psys->tail=getTail; psys->state=STATE_IDLE; psys->timeout=MAX_IDLE_TIMEOUT; return; } else if(getHead > getTail) { psys->head=getHead; if(getHead - getTail > psrc->bufferSize) psys->tail=getHead - psrc->bufferSize; else psys->tail=getTail; psys->state=STATE_CDR_GET; psys->retry=0; psys->timeout=INSTANT_TIMEOUT; //cdr_log("[INFO][check_pointer]:Get the info first, start to chase to get CDR, head=%ld[%08X], tail=%ld[%08X], %d-%d-%d",psys->head,psys->head,psys->tail,psys->tail,psys->sysTypeNo,psys->sysNo,psys->subSysNo); return; } else { if(getHead >= psrc->bufferSize) { psys->tail=getHead - psrc->bufferSize; psys->head=getHead; //cdr_log("[INFO][check_pointer]:Get the info first, the head pointer get the max value already, head=%ld[%08X], tail=%ld[%08X], %d-%d-%d",psys->head,psys->head,psys->tail,psys->tail,psys->sysTypeNo,psys->sysNo,psys->subSysNo); } else { //psys->tail=MAX_CDR_PTR -(psrc->bufferSize - getHead); //psys->head=getHead; psys->head=getHead; psys->tail=0; if(psys->head == psys->tail) { psys->prepareSetTail=0; psys->state=STATE_TAIL_SET; psys->retry=0; cdr_log("[INFO][check_pointer]:No more cdr, set the tail, head=%ld[%08X], tail=%ld[%08X], %d-%d-%d",psys->head,psys->head,psys->tail,psys->tail,psys->sysTypeNo,psys->sysNo,psys->subSysNo); return; } cdr_log("[INFO][check_pointer]:Get the info first, the head pointer get the max value already and some cdr may miss, head=%ld[%08X], tail=%ld[%08X], %d-%d-%d",psys->head,psys->head,psys->tail,psys->tail,psys->sysTypeNo,psys->sysNo,psys->subSysNo); } psys->state=STATE_CDR_GET; psys->retry=0; psys->timeout=INSTANT_TIMEOUT; return; } psys->state=STATE_IDLE; psys->timeout=MAX_IDLE_TIMEOUT; } int parse_info(snmp_pdu *pdu,DWORD *head,DWORD *tail) { if(pdu->var_num != 2) return 0; //parse head *head=decode_integer(pdu->var[0].msg,pdu->var[0].msglen); *tail=decode_integer(pdu->var[1].msg,pdu->var[1].msglen); return 1; } int get_msg(cdr_sys *psys) { int index; int i; int use_count=0; char tmpstr[64]; for(index=0;index= snmp_msg_num) { if(psys->retry >= MAX_RETRY) { cdr_log("[Err][get_msg]:Get msg fail,request_id=%ld,retry=%d\n",psys->requestId,psys->retry); cdr_log("Current msg set\n"); globalstr[0]=0; for(i=0;irequestId) { #if CDR_DEBUG cdr_log("Get msg,%d,request_id=%ld,curr num=%d",index,psys->requestId,snmp_msg_num-1); #endif // cdr_log("Get msg[%d],request_id=%ld,curr num=%d,timeout=%d",index,psys->requestId,snmp_msg_num-1,snmp_msg_set[index].timeout); return index; } use_count++; } } if(psys->retry >= MAX_RETRY) { cdr_log("[Err][get_msg]:Get msg fail,request_id=%ld,retry=%d\n",psys->requestId,psys->retry); cdr_log("Current msg set\n"); globalstr[0]=0; for(i=0;ierror_status != 0) { if(pdu->error_status == 1) { cdr_log("[WARN][cdr_process]:The var num is too big, curr num=%d, change var num=%d, %d-%d-%d",psys->maxVarNum,psys->maxVarNum-1,psys->sysTypeNo,psys->sysNo,psys->subSysNo); psys->isVarTooBig=1; psys->maxVarNum--; return; } else { cdr_log("[ERR][cdr_process]:Receive error snmp response, error_status=%d, %d-%d-%d",pdu->error_status,psys->sysTypeNo,psys->sysNo,psys->subSysNo); return; } } psrc=&cdr_src_set[psys->cdrSrcNo]; pdef=&psrc->define; ltime=time(NULL); t=localtime(<ime); #if CDR_DEBUG cdr_log("pdu var num=%d ", pdu->var_num); #endif for(index=0;indexvar_num;index++) { isRoamCDR=0; memset(mcc,0,sizeof(mcc)); memset(mnc,0,sizeof(mnc)); if(pdu->var[index].vartype != NosuchInstance && pdu->var[index].msglen != 0) { if(AsnDecode(pdu->var[index].msg,pdu->var[index].msglen,1,&errpos,&asnbuf) < 0 && errpos < 6) { cdr_log("[ERR][cdr_process]:Fail to process snmp msg1, %d-%d-%d",psys->sysTypeNo,psys->sysNo,psys->subSysNo); cdr_logmsg(pdu->var[index].msg,pdu->var[index].msglen); return; } #if CDR_DEBUG cdr_log("pdu[%d] var length=%d\n", index, pdu->var[index].msglen); #endif //get serial pos=get_int_v2("2",(int*)&serial,&asnbuf)+2; serial=serial & MAX_CDR_PTR; #if CDR_DEBUG cdr_log("serial=%ld\n", serial); #endif //get tag if(gettagcode(pdu->var[index].msg+pos,(unsigned int*)&tagcode,&temp) < 1) { cdr_log("[ERR][cdr_process]:Get tagcode fail, %d-%d-%d",psys->sysTypeNo,psys->sysNo,psys->subSysNo); return; } memset(&asnbuf,0,sizeof(ASN_BUF)); if(AsnDecode(pdu->var[index].msg+pos,pdu->var[index].msglen-pos,1,&errpos,&asnbuf) < 0 && errpos < 6) { cdr_log("[ERR][cdr_process]:Fail to process snmp msg2, %d-%d-%d",psys->sysTypeNo,psys->sysNo,psys->subSysNo); cdr_logmsg(pdu->var[index].msg+pos,pdu->var[index].msglen-pos); return; } if(tagcode >= MAX_TAG_VALUE || pdef->tags[tagcode] == 0) { cdr_log("[ERR][cdr_process]:Invalid tagcode=%d, %d-%d-%d",tagcode,psys->sysTypeNo,psys->sysNo,psys->subSysNo); cdr_logmsg(pdu->var[index].msg+pos,pdu->var[index].msglen-pos); return; } //If this cdr is VLR cdr if(psys->sysTypeNo == 325 && wsms_enable_flag) getVlrCdr(psys,serial,pdu->var[index].msg+pos,pdu->var[index].msglen-pos,tagcode); sqlstr[0]=0; //sprintf(tmpstr,"REPLACE INTO %s.%s_%02d(%s) VALUES(",CDRDB_NAME,psrc->recordTable,t->tm_hour,pdef->allFieldList); sprintf(tmpstr,"VALUES("); strcat(sqlstr,tmpstr); sprintf(tmpstr,"'%d','%ld','%s'",psys->sysNo,serial,bcd2str(pdu->var[index].msg+pos,pdu->var[index].msglen-pos)); strcat(sqlstr,tmpstr); #if CDR_DEBUG cdr_log("sqlstr1=%s ", sqlstr); #endif if(psys->sysTypeNo == 320) { if(nrtrde_flag) { memset(nrtrdesqlstr,0,sizeof(nrtrdesqlstr)); sprintf(tmpstr,"REPLACE INTO %s.cdrFromMSCSend(%s,mcc,mnc) VALUES(",CDRDB_NAME,pdef->allFieldList); strcat(nrtrdesqlstr,tmpstr); sprintf(tmpstr,"'%d','%ld','%s'",psys->sysNo,serial,bcd2str(pdu->var[index].msg+pos,pdu->var[index].msglen-pos)); strcat(nrtrdesqlstr,tmpstr); } if(mt_sms_charge_flag) { memset(mtsmssqlstr,0,sizeof(mtsmssqlstr)); sprintf(tmpstr,"REPLACE INTO OMC_PUB.%s(%s) VALUES(",MT_SMS_CHARGE_TABLE,pdef->allFieldList); strcat(mtsmssqlstr,tmpstr); sprintf(tmpstr,"'%d','%ld','%s'",psys->sysNo,serial,bcd2str(pdu->var[index].msg+pos,pdu->var[index].msglen-pos)); strcat(mtsmssqlstr,tmpstr); } } for(i=0;ifieldCount;i++) { // cdr_log("tagcode=%d\n", tagcode); if(pdef->fields[i].tagFlag[tagcode]) { // cdr_log("tag=%s ", pdef->fields[i].tagFlag[tagcode]); memset(tempbyte,0,sizeof(tempbyte)); len=get_tlv(pdef->fields[i].tags[tagcode],tempbyte,&asnbuf); // cdr_log("len=%d\n", len); if(len == -1) { sprintf(tmpstr,",NULL"); } else { cdr_parse(psys,tagcode,&asnbuf,i,fieldstr); sprintf(tmpstr,"%s",fieldstr); #if CDR_DEBUG cdr_log("fieldstr=%s ", fieldstr); #endif if(!strcmp(pdef->fields[i].fieldName,"releaseTime")) sprintf(tmptime,"%s",fieldstr); #if CDR_DEBUG cdr_log("fieldname=%s,tag=%s,len=%d,%d-%d-%d",pdef->fields[i].fieldName,pdef->fields[i].tags[tagcode],len,psys->sysTypeNo,psys->sysNo,psys->subSysNo); cdr_logmsg(tempbyte,len); #endif } } else { sprintf(tmpstr,",NULL"); } strcat(sqlstr,tmpstr); if(psys->sysTypeNo==320 && mt_sms_charge_flag) { strcat(mtsmssqlstr,tmpstr); } if(psys->sysTypeNo==320 && nrtrde_flag) { strcat(nrtrdesqlstr,tmpstr); } } strcat(sqlstr,");"); #if CDR_DEBUG cdr_log("sqlstr2=%s ", sqlstr); cdr_log("[tmptime]%s",tmptime); #endif if (strlen(tmptime) != 0) { pstr=strstr(tmptime," "); cdr_log("[pstr]%s",pstr); tmp=&pstr[1]; pstr=strtok(tmp,":"); cdr_log("[time]%s",pstr); } if (pstr == NULL) //if(strlen(pstr)==0) sprintf(tmpstr,"REPLACE INTO %s.%s_%02d(%s) ",CDRDB_NAME,psrc->recordTable,t->tm_hour,pdef->allFieldList); else sprintf(tmpstr,"REPLACE INTO %s.%s_%s(%s) ",CDRDB_NAME,psrc->recordTable,pstr,pdef->allFieldList); strcat(tmpstr,sqlstr); sprintf(sqlstr,"%s",tmpstr); #if CDR_DEBUG cdr_log("[SQL]%s",sqlstr); #endif if(psys->sysTypeNo==320 && nrtrde_flag && isRoamCDR) { sprintf(tmpstr,",'%s','%s');",mcc,mnc); strcat(nrtrdesqlstr,tmpstr); send_sql_comm(nrtrdesqlstr); } if(psys->sysTypeNo==320 && mt_sms_charge_flag) { strcat(mtsmssqlstr,");"); send_sql_comm(mtsmssqlstr); } // removed by simon, at 2023-11-14 //printf("%s\n",sqlstr); send_sql_comm(sqlstr); psys->processNum++; if(psys->processNum >= MAX_PROCESS_CDR_NUM) { cdr_log("[INFO][cdr_process]:Set the tail to %ld to save, %d-%d-%d",psys->tail,psys->sysTypeNo,psys->sysNo,psys->subSysNo); psys->processNum=0; psys->prepareSetTail=1; } #if CDR_DEBUG cdr_log("Get cdr, serial=%d[%08X], %d-%d-%d",serial,serial,psys->sysTypeNo,psys->sysNo,psys->subSysNo); cdr_logmsg(pdu->var[index].msg,pdu->var[index].msglen); cdr_log("Insert cdr,%s",sqlstr); #endif } else { psys->error++; cdr_log("[WARN][cdr_process]:No such instance or zero var, %ld -> %ld, %d-%d-%d",psys->tail,psys->head,psys->sysTypeNo,psys->sysNo,psys->subSysNo); } } #if CDR_DEBUG cdr_log("[INFO][cdr_process]:process cdr, var num=%d",pdu->var_num); #endif } void cdr_parse(cdr_sys *psys,int tagcode,ASN_BUF *asnbuf,int fieldIndex,char* fieldstr) { cdr_def *pdef; cdr_src *psrc; int len; char tmpstr[1024]; BYTE tempbyte[1024]; int tempint,tmpint1,tmpint2; int index; char tag_seq[24]; char tag_seq1[24]; //for smlog int smlog_smdcs_decode_type=0; //1-7bit, 2-8bit, 3-unicode int smlog_smdcs_value; psrc=&cdr_src_set[psys->cdrSrcNo]; pdef=&cdr_src_set[psys->cdrSrcNo].define; memset(fieldstr,0,256); memset(tempbyte,0,256); #if CDR_DEBUG cdr_log("field %d type = %d\n", fieldIndex,pdef->fields[fieldIndex].type); #endif switch(pdef->fields[fieldIndex].type) { //string case 0: if((len = get_tlv(pdef->fields[fieldIndex].tags[tagcode],(u_char*)tmpstr,asnbuf)) > 0) { tmpstr[len]='\0'; sprintf(fieldstr,",'%s'",tmpstr); } else sprintf(fieldstr,",NULL"); break; //integer case 1: if((get_int_v2(pdef->fields[fieldIndex].tags[tagcode],&tempint,asnbuf)) >= 0) sprintf(fieldstr,",%d",tempint); else sprintf(fieldstr,",NULL"); break; //BCD case 2: if((len = get_tlv(pdef->fields[fieldIndex].tags[tagcode],tempbyte,asnbuf)) > 0) sprintf(fieldstr,",'%s'",bcd2str(tempbyte,len)); else sprintf(fieldstr, ",NULL"); break; //timestamp case 3: if((len = get_tlv(pdef->fields[fieldIndex].tags[tagcode],tempbyte,asnbuf)) > 0) sprintf(fieldstr,",'%02x-%02x-%02x %02x:%02x:%02x'",tempbyte[0],tempbyte[1],tempbyte[2],tempbyte[3],tempbyte[4],tempbyte[5]); else sprintf(fieldstr,",NULL"); break; //MSISDN case 4: if((len = get_tlv(pdef->fields[fieldIndex].tags[tagcode],tempbyte,asnbuf)) > 0) { //opps need cc if(psrc->sysTypeNo == 375) sprintf(fieldstr,",'%s'",digits2str(tempbyte,len * 2)); else if (psrc->sysTypeNo == 320 && !strcmp(pdef->fields[fieldIndex].tags[tagcode], "7.12")) { if (tempbyte[0] == 0x91 ||tempbyte[0] == 0x81) { sprintf(fieldstr, ",'%s'", digits2str(tempbyte + 1, (len - 1) * 2)); } else { // 阿斯克码值 sprintf(fieldstr, ",'%s'", askm2str(tempbyte, len * 2)); } } else sprintf(fieldstr,",'%s'",digits2str(tempbyte + 1,(len - 1) * 2)); } else sprintf(fieldstr,",NULL"); break; //trunkgroup case 5: sprintf(tag_seq,"%s.0",pdef->fields[fieldIndex].tags[tagcode]); //integer if((tempint = get_int(tag_seq,asnbuf)) >= 0) sprintf(fieldstr,",%d",tempint); else { sprintf(tag_seq,"%s.1",pdef->fields[fieldIndex].tags[tagcode]); if((len = get_tlv(tag_seq,(u_char*)tmpstr,asnbuf)) > 0) { tmpstr[len] = '\0'; sprintf(fieldstr,",'%s'",tmpstr); } else sprintf(fieldstr,",NULL"); } break; //BasicServiceCode case 6: sprintf(tag_seq,"%s.2",pdef->fields[fieldIndex].tags[tagcode]); //integer if((len = get_tlv(tag_seq,tempbyte,asnbuf)) < 0) { sprintf(tag_seq,"%s.3",pdef->fields[fieldIndex].tags[tagcode]); len = get_tlv(tag_seq,tempbyte,asnbuf); } if(len > 0) sprintf(fieldstr,",%d",tempbyte[0]); else sprintf(fieldstr,",NULL"); break; //recordingEntity case 7: if((len = get_tlv(pdef->fields[fieldIndex].tags[tagcode],tempbyte,asnbuf)) > 0) sprintf(fieldstr,",'%s'",bcd2str(tempbyte + 1, len - 1)); else sprintf(fieldstr,",NULL"); break; //Diagnostics case 8: for(index=0;index<5;index++) { sprintf(tag_seq,"%s.%d",pdef->fields[fieldIndex].tags[tagcode],index); //integer if((tempint = get_int(tag_seq,asnbuf)) >= 0) { sprintf(fieldstr,",%d",tempint); break; } if(index == 4) sprintf(fieldstr,",NULL"); } break; //LocationAreaAndCell case 9: sprintf(tag_seq,"%s.0",pdef->fields[fieldIndex].tags[tagcode]); sprintf(tag_seq1,"%s.1",pdef->fields[fieldIndex].tags[tagcode]); if(get_int_v2(tag_seq,&tmpint1,asnbuf) >= 0 && get_int_v2(tag_seq1,&tmpint2,asnbuf) >= 0) sprintf(fieldstr,",'%05d %05d'",tmpint1,tmpint2); else sprintf(fieldstr, ",NULL"); break; //SEQUENCE OF LocationChange case 10: //SEQUENCE OF ChangeOfService case 11: //SEQUENCE OF SuppServiceUsed case 12: //AOCParameters case 13: //SEQUENCE OF AOCParmChange case 14: break; //ChangeOfClassmark case 15: if((len = get_tlv(pdef->fields[fieldIndex].tags[tagcode],tempbyte,asnbuf)) > 0) sprintf(fieldstr,",'[%02x][%02x][%02x]'",tempbyte[0],tempbyte[1],tempbyte[2]); else sprintf(fieldstr,",NULL"); break; //ChangeOfRadioChannel case 16: //AdditionalChgInfo case 17: //ManagementExtensions case 18: //SEQUENCE OF HSCSDParmsChange case 19: //SEQUENCE OF ChannelCoding case 20: //LevelOfCAMELService(bit string) case 21: //SEQUENCE OF CAMELInformation case 22: break; //SmRslf case 23: for(index=0;index<5;index++) { sprintf(tag_seq,"%s.%d",pdef->fields[fieldIndex].tags[tagcode],index); if((get_int_v2(tag_seq,&tempint,asnbuf)) >= 0) { sprintf(fieldstr,",'%02d %02d'",index+7,tempint); break; } if(index == 4) sprintf(fieldstr,",NULL"); } break; //imei case 24: if((len = get_tlv(pdef->fields[fieldIndex].tags[tagcode],tempbyte,asnbuf)) > 0) sprintf(fieldstr,",'%s'",digits2str(tempbyte,len * 2)); else sprintf(fieldstr,",NULL"); break; //unsigned integer case 25: len=get_int_v2(pdef->fields[fieldIndex].tags[tagcode],&tempint,asnbuf); if(len > 0) { switch(len) { case 1: sprintf(fieldstr,",%u",0x000000ff & tempint); break; case 2: sprintf(fieldstr,",%u",0x0000ffff & tempint); break; case 3: sprintf(fieldstr,",%u",0x00ffffff & tempint); break; case 4: sprintf(fieldstr,",%u",tempint); break; } } else if(len == 0) sprintf(fieldstr,",0"); else sprintf(fieldstr,",NULL"); break; //decode smcontent case 26: if(smlog_decode_flag) { char formatstring[256]; char mes[256]; //Get the smdcs tlv memset(formatstring,0,256); memset(mes,0,256); if((len = get_tlv("0.4",tempbyte,asnbuf)) != 1) { cdr_log("[ERR]:smdcs != 1 byte"); if((len = get_tlv(pdef->fields[fieldIndex].tags[tagcode],tempbyte,asnbuf)) > 0) sprintf(fieldstr,",'%s'",bcd2str(tempbyte,len)); else sprintf(fieldstr, ",NULL"); break; } smlog_smdcs_value=tempbyte[0]; if((len = get_tlv(pdef->fields[fieldIndex].tags[tagcode],tempbyte,asnbuf)) > 0) { //Get the decode type,1-7bit, 2-8bit, 3-unicode smlog_smdcs_decode_type=((smlog_smdcs_value & 0x0C)>>2)+1; //printf("decode type=%d\n",smlog_smdcs_decode_type); if(smlog_smdcs_decode_type==1 || smlog_smdcs_decode_type==2) { //printf("BCD ---> 7bit or 8bit\n"); memset(tmpstr,0,256); if(smsDecodeAll(smlog_smdcs_decode_type,(char*)tempbyte,tmpstr,len)>0) { int mpos=0,pos=0; memset(mes,0,256); for(pos=0;pos<256;pos++) { if(isprint(tmpstr[pos])) { mes[mpos]=tmpstr[pos]; mpos++; } } formatSingleQuotation(mes,strlen(mes),formatstring); sprintf(fieldstr,",'%s'",formatstring); } else sprintf(fieldstr,",'decode error'"); } else if(smlog_smdcs_decode_type == 3) { //printf("unicode to unicode\n"); sprintf(mes,"%s",bcd2str(tempbyte,len)); formatSingleQuotation(mes,strlen(mes),formatstring); sprintf(fieldstr,",'%s'",formatstring); } else { if((len = get_tlv(pdef->fields[fieldIndex].tags[tagcode],tempbyte,asnbuf)) > 0) sprintf(fieldstr,",'%s'",bcd2str(tempbyte,len)); else sprintf(fieldstr, ",NULL"); } } else sprintf(fieldstr,",NULL"); } else { if((len = get_tlv(pdef->fields[fieldIndex].tags[tagcode],tempbyte,asnbuf)) > 0) sprintf(fieldstr,",'%s'",bcd2str(tempbyte,len)); else sprintf(fieldstr, ",NULL"); } break; //IMSI case 40: if((len = get_tlv(pdef->fields[fieldIndex].tags[tagcode],tempbyte,asnbuf)) > 0) { sprintf(fieldstr,",'%s'",digits2str(tempbyte,len * 2)); if(psys->sysTypeNo == 320 && nrtrde_flag) { sprintf(tmpstr,"%s",digits2str(tempbyte,len * 2)); //compare the local_mcc and local_mnc with mcc mnc for(index=0;index<3;index++) { mcc[index]=tmpstr[index]; } mcc[3]='\0'; for(index=3;index<5;index++) { mnc[index-3]=tmpstr[index]; } mnc[2]='\0'; if(strcmp(mcc,local_mcc) != 0 || strcmp(mnc,local_mnc) != 0) { isRoamCDR=1; } } } else { sprintf(fieldstr,",NULL"); } break; //RoutingNumber case 41: sprintf(tag_seq,"%s.1",pdef->fields[fieldIndex].tags[tagcode]); //RoamingNumber if((len = get_tlv(tag_seq,tempbyte,asnbuf)) > 0) sprintf(fieldstr,",'RM:%s'",digits2str(tempbyte + 1, (len - 1) * 2)); else { sprintf(tag_seq,"%s.2",pdef->fields[fieldIndex].tags[tagcode]); //ForwardToNumber if((len = get_tlv(tag_seq,tempbyte,asnbuf)) > 0) sprintf(fieldstr,",'FW:%s'",digits2str(tempbyte + 1, (len - 1) * 2)); else sprintf(fieldstr,",NULL"); } break; case 42: if((len = get_tlv(pdef->fields[fieldIndex].tags[tagcode], tempbyte, asnbuf)) > 0) { sprintf(fieldstr, ",'%d.%d.%d.%d'", tempbyte[0], tempbyte[1], tempbyte[2], tempbyte[3]); } else { sprintf(fieldstr, ",NULL"); } break; } } void send_sql_comm(char *sqlcomm) { MYSQL *pCdrConn; static unsigned long do_time=0; int index; int doit=0; static struct timeval tv1, tv2; struct timezone tz; long elapse; int pre_num; do_time+=time_slot; if(sqlcomm == NULL) { if(do_time > 5 && sql_comm_buffer.commNum > 0) { do_time=0; doit=1; } } else { sprintf(sql_comm_buffer.sqlstr[sql_comm_buffer.commNum],"%s",sqlcomm); sql_comm_buffer.commNum++; if(sql_comm_buffer.commNum == MAX_SQL_COMM_NUM) { doit=1; } } if(doit) { do_time=0; gettimeofday(&tv1,&tz); pre_num=sql_comm_buffer.commNum; pCdrConn=mysql_conn(HOST_NAME,CDRDB_NAME); if(pCdrConn == NULL) { cdr_log("[ERR][send_sql_comm]:mysql_conn CDR_DB\n"); return; } for(index=0;indextm_year+1900,t->tm_mon+1,t->tm_mday); fp=fopen(logFile,"a"); if(fp!=NULL) { for (i = 0; i < len; i++) sprintf(buf + 3 * i, "%02X ", msgbuf[i]); strcat(buf, "\n"); fputs(buf,fp); fflush(fp); fclose(fp); } } void cdr_log(const char *fmt, ...) { char logFile[64]; FILE *fp; time_t l_time; va_list ap; char buf[8192]; struct tm *t; char timestr[64]; l_time=time(NULL); t=localtime(&l_time); sprintf(logFile,"/usr/local/omc/log/cdrlog_%04d%02d%02d.log",t->tm_year+1900,t->tm_mon+1,t->tm_mday); fp=fopen(logFile,"a"); if(fp!=NULL) { va_start(ap,fmt); vsprintf(buf,fmt,ap); sprintf(timestr,"%02d:%02d:%02d: ",t->tm_hour,t->tm_min,t->tm_sec); fputs(timestr,fp); fputs(buf,fp); fputs("\n",fp); fflush(fp); va_end(ap); fclose(fp); } } BYTE str2oid(char *str, DWORD * array, BYTE max) { BYTE sub = 0; short len, i; char *pvar; len = strlen(str); pvar = str; for (i = 0; i < len && sub < max; i++) { if (str[i] == '.') { str[i] = '\0'; if (strlen(pvar) == 0) continue; array[sub++] = atoi(pvar); pvar = str + i + 1; } } if (strlen(pvar) == 0) return sub; array[sub++] = atoi(pvar); return sub; } char *bcd2str(BYTE* buf,int len) { int i; static char str[1024] = "\0"; for (i = 0; i < len; i++) sprintf(str + 2 * i, "%02X", buf[i]); return str; } /* Decode the content of the SMLOG CDR */ int smsDecodeAll(int code_type,char* strIn,char* strOut,int length) { int i,n,j; int len; unsigned char mid1,mid2,cur; unsigned char strHex[512]; if(code_type>1 && code_type<4) { memcpy(strOut,strIn,length); return length; } else if(code_type>=4) { return 0; } n=0;j=0; len=length; if(len>140) len=140; memcpy(strHex,strIn,len); for(i=0;i<=len;i++) { if(i>0) { mid1=strHex[i]; mid2=strHex[i-1]; cur=((mid1<>(8-n)); } else { mid1=strHex[i]&0x7f; cur=mid1; } strOut[j++]=cur; n=(n+1)%8; if(n==0) i--; } for(i=0;j> 4); strcat(dig, temp); } if ((pchr = strchr(dig, 'F')) != NULL) pchr[0] = '\0'; if ((pchr = strchr(dig, 'E')) != NULL) pchr[0] = '\0'; return dig; } char* askm2str(BYTE* buf, int len) { static char str[512]; int i; for (i = 0; i < 512; i++) { str[i] = '\0'; } for (i = 0; i < len; i++) { str[i] = buf[i]; } str[len] = '\0'; return str; } // Extra function int sendHeartbeat() { snmp_pdu pdu; snmp_addr addr; char proc_name[16]; memset(proc_name,0,16); sprintf(proc_name,"cdrCollector"); //pdu memset(&pdu,0,sizeof(snmp_pdu)); pdu.pdu_type=7; pdu.request_id=0; sprintf(pdu.community,"public"); pdu.var_num=1; pdu.error_status=0; pdu.error_index=0; //Addr addr.local_port = 4957; //addr.remote_ip = inet_addr("127.0.0.1"); addr.remote_ip = GetLocalIP(); addr.broadcast = 0; addr.remote_port = 4957; //Varlist memcpy(pdu.var[0].oid,PROC_HEARTBEAT_OID,PROC_HEARTBEAT_OIDLEN*sizeof(DWORD)); pdu.var[0].oidlen=PROC_HEARTBEAT_OIDLEN; pdu.var[0].vartype=0x04; pdu.var[0].msglen=16; memcpy(pdu.var[0].msg,proc_name,16); if(snmp_send(&pdu, &addr) <= 0) { cdr_log("[ERR][sendHeart]:Send heartbeat fail"); return 0; } return 1; } int getOmcStatus(int sysNo) { MYSQL_RES *res; MYSQL_ROW row; char sqlstr[256]; int status; char binCode[256]; MYSQL *pubConn; pubConn=mysql_conn(HOST_NAME,"OMC_PUB"); if(pubConn == NULL) { cdr_log("[ERR][load_cdr_info]:mysql_conn OMC_PUB\n"); exit(-1); } sprintf(sqlstr,"SELECT detailStat FROM OMC_PUB.sysStat WHERE sysTypeNo=0 and sysNo=%d ",sysNo); res=mysql_getres(pubConn,sqlstr); if(res == NULL) { mysql_close(pubConn); cdr_log("[ERR %d][getOmcStatus]:%s\n",mysql_errno(pubConn),sqlstr); return -1; } if((row = mysql_fetch_row(res)) != NULL) { sprintf(binCode,"%s",row[0]); //printf("52-%c,53-%c\n",binCode[52],binCode[53]); status=(binCode[52]-0x30)*16+(binCode[53]-0x30); } else { mysql_free_result(res); mysql_close(pubConn); cdr_log("[ERR %d][getOmcStatus]:Find no row, %s\n",mysql_errno(pubConn),sqlstr); return -1; } mysql_free_result(res); mysql_close(pubConn); return status; } int getOmcSysNo(int* sysNo) { char fileName[512]; unsigned char buf[4096]; unsigned char param[32][512]; char paramName[128]; char paramValue[384]; char* temp; FILE* fp; int fi; int i; //int j; int paramCount; int byteCount; paramCount=0; byteCount=0; memset(buf,0,4096); memset(param,0,32*512); sprintf(fileName,"./conf/omcd.conf"); fp=fopen(fileName,"r"); if(fp) { fi=fileno(fp); if(read(fi,buf,4096)) { for(i=0;i<4096;i++) { if(buf[i] == 0x0A) { //printf("\n"); if(byteCount<512 && param[paramCount][0] != 0x00 && param[paramCount][0] != 0x23) paramCount++; else memset(param[paramCount],0,512); byteCount=0; } else { param[paramCount][byteCount]=buf[i]; byteCount++; } //printf("%02x ",buf[i]); } for(i=0;icdrSrcNo]; pdef=&cdr_src_set[psys->cdrSrcNo].define; if(AsnDecode(pmsg,msglen,1,&errpos,&asn_buf) < 0 && errpos < msglen) { cdr_log("[ERR][getVlrCdr]:Wrong encoding of CDR Message.ip=%lX(%s-%d)\n",psys->addr.remote_ip,psrc->recordTable,psys->sysNo); return; } for(i=0;ifieldCount;i++) { if(strlen(pdef->fields[i].tags[tagcode]) == 0) continue; switch(pdef->fields[i].type) { case 2: //recordExtensions if(strcmp(pdef->fields[i].fieldName,"recordExtensions") == 0) { if((len = get_tlv(pdef->fields[i].tags[tagcode],tempbyte,&asn_buf)) > 0) recordExtensions=atoi(bcd2str(tempbyte,len)); else recordExtensions=-1; } //servedMSISDN case 4: if(strcmp(pdef->fields[i].fieldName,"servedMSISDN") == 0) { if((len = get_tlv(pdef->fields[i].tags[tagcode],tempbyte,&asn_buf)) > 0) sprintf(msisdn,"%s",digits2str(tempbyte + 1, (len - 1) * 2)); else return; } break; //diagnostics case 8: if(strcmp(pdef->fields[i].fieldName,"diagnostics") == 0) { for(j=0;j<5;j++) { sprintf(tag_seq,"%s.%d",pdef->fields[i].tags[tagcode],j); //integer if((tempint = get_int(tag_seq,&asn_buf)) >= 0) { diagnostics=tempint; break; } if(j == 4) ; } } break; //servedIMSI case 40: if((len = get_tlv(pdef->fields[i].tags[tagcode],tempbyte,&asn_buf)) > 0) sprintf(imsi,"%s", digits2str(tempbyte, len * 2)); else return; break; } } if(recordExtensions !=-1 && strcmp(msisdn,"\0") != 0 && strcmp(imsi,"\0") != 0) { if(recordExtensions == 1) wsms_check_sub(imsi,msisdn); } } int wsms_check_sub(char* imsi,char* msisdn) { MYSQL_RES *res; MYSQL_ROW row; char sqlstr[128]; int count=0; MYSQL *pubConn; //Init the OMC_PUB DB connection pubConn=mysql_conn("localhost","OMC_PUB"); if(pubConn == NULL) { cdr_log("[ERR][wsms_check_sub]:mysql_conn OMC_PUB\n"); exit(-1); } sprintf(sqlstr,"SELECT imsi,logTime FROM OMC_PUB.wsmsRoamer WHERE imsi='%s'",imsi); res=mysql_getres(pubConn,sqlstr); if(res == NULL) { cdr_log("[ERR %d][wsms_check_sub]:%s\n",mysql_errno(pubConn),sqlstr); mysql_close(pubConn); return 1; } count=0; while((row = mysql_fetch_row(res)) != NULL) { count++; } mysql_free_result(res); //if the sub not exist,insert record into table ,return 0 if(count==0) { sprintf(sqlstr,"REPLACE INTO OMC_PUB.wsmsRoamer (imsi,msisdn,flag,logTime)VALUES(%s,%s,0,FROM_UNIXTIME(%ld))", imsi,msisdn,time(NULL)); if (mysql_getnores(pubConn, sqlstr) != 0) { cdr_log("[ERR %d][wsms_check_sub]:%s\n",mysql_errno(pubConn),sqlstr); mysql_close(pubConn); return 1; } mysql_close(pubConn); return 0; } //if the sub exist return 1 else if(count>=1) { mysql_close(pubConn); return 1; } mysql_close(pubConn); return 1; } void getConfFromDB() { MYSQL_RES *res; MYSQL_ROW row; MYSQL *pubConn; //Init the OMC_PUB DB connection pubConn=mysql_conn("localhost","OMC_PUB"); if(pubConn == NULL) { cdr_log("[ERR][getConfFromDB]:mysql_conn OMC_PUB\n"); exit(-1); } //Get the parameter SMLOG_CONTENT_DECODE_FLAG in the OMC.omcPubVarConf sprintf(sqlstr,"SELECT pubVarValue FROM OMC_PUB.omcPubVarConf WHERE pubVarName='SMLOG_CONTENT_DECODE_FLAG'"); res=mysql_getres(pubConn,sqlstr); if(res == NULL) { cdr_log("[ERR %d][getConfFromDB]:%s\n",mysql_errno(pubConn),sqlstr); return; } if((row = mysql_fetch_row(res)) != NULL) { if(strlen(row[0]) == 0) smlog_decode_flag=0; else if(strcmp(row[0],"Yes") == 0) smlog_decode_flag=1; else smlog_decode_flag=0; } mysql_free_result(res); //Get the parameter mt_sms_charge_flag in the OMC.omcPubVarConf sprintf(sqlstr,"SELECT pubVarValue FROM OMC_PUB.omcPubVarConf WHERE pubVarName='MTSMSCharge'"); res=mysql_getres(pubConn,sqlstr); if(res == NULL) { cdr_log("[ERR %d][cdr_init]:%s\n",mysql_errno(pubConn),sqlstr); return; } if((row = mysql_fetch_row(res)) != NULL) { if(strlen(row[0]) == 0) mt_sms_charge_flag=0; else if(atol(row[0]) > 0) mt_sms_charge_flag=1; else mt_sms_charge_flag=0; } mysql_free_result(res); mysql_close(pubConn); } int formatSingleQuotation(char *inbuf,int inlen,char* outbuf) { int i; int pos=0; for(i=0;i