diff --git a/calltable.cpp b/calltable.cpp index 9e3ef48..c230fc9 100644 --- a/calltable.cpp +++ b/calltable.cpp @@ -62,6 +62,7 @@ int calltable::add( table[idx].ip_n=0; table[idx].last_packet_time=time; global_last_packet_time=time; + callid_to_idx[std::string(call_id, call_id_len)] = idx; return idx; } @@ -70,14 +71,11 @@ int calltable::find_by_call_id( unsigned long call_id_len) { int i; - for (i=0;i<(int)table_size;i++){ - if ((table[i].is_used!=0)&& - (table[i].call_id_len==call_id_len)&& - (memcmp(table[i].call_id,call_id,MIN(call_id_len,32))==0)){ - return i; - } + callid_idx::iterator it = callid_to_idx.find(std::string(call_id, call_id_len)); + if (it == callid_to_idx.end()) { + return -1; } - return -1; + return it->second; } int calltable::add_ip_port( @@ -102,6 +100,7 @@ int calltable::add_ip_port( table[call_idx].ip[n]=addr; table[call_idx].port[n]=port; table[call_idx].ip_n++; + rtp_to_idx[rtp_key(addr, port)] = call_idx; } return 0; } @@ -112,13 +111,18 @@ int calltable::find_ip_port( unsigned short port) { int idx,i; - for(idx=0;idx<(int)table_size;idx++){ - for(i=0;isecond; + + for(i=0;isecond; + + for(i_rtp=0;i_rtp 300){ + for(int i_rtp=0; i_rtp +#include +#include #include #define calltable_max 10240 @@ -41,6 +43,30 @@ struct calltable_element { FILE *f; char fn_pcap[128]; }; +class rtp_key{ +private: + in_addr_t ip; + uint16_t port; +public: + rtp_key(in_addr_t rip, uint16_t rport) { + ip = rip; + port = rport; + } + + bool operator < (const rtp_key& rhs) const { + int cmp = *(unsigned int*)(&ip) - *(unsigned int*)(&(rhs.ip)); + if (cmp < 0) { + return true; + } else if (cmp > 0){ + return false; + } else { + return port < rhs.port; + } + } +}; + +typedef std::map rtp_idx; +typedef std::map callid_idx; class calltable { @@ -72,4 +98,6 @@ class calltable private: unsigned long table_size; time_t global_last_packet_time; + rtp_idx rtp_to_idx; + callid_idx callid_to_idx; };