Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 36 additions & 22 deletions calltable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand All @@ -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(
Expand All @@ -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;
}
Expand All @@ -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;i<table[idx].ip_n;i++){
if(table[idx].port[i]==port && table[idx].ip[i]==addr){
return idx;
}
}
rtp_idx::iterator it = rtp_to_idx.find(rtp_key(addr, port));
if (it == rtp_to_idx.end()) {
return -1;
}
idx = it->second;

for(i=0;i<table[idx].ip_n;i++){
if(table[idx].port[i]==port && table[idx].ip[i]==addr){
return idx;
}
}

return -1;
}

Expand All @@ -131,15 +135,20 @@ int calltable::find_ip_port_ssrc(
int *idx_rtp)
{
int i_leg,i_rtp;
for(i_leg=0;i_leg<(int)table_size;i_leg++){
for(i_rtp=0;i_rtp<table[i_leg].ip_n;i_rtp++){
if(table[i_leg].port[i_rtp]==port && table[i_leg].ip[i_rtp]==addr){
if (!table[i_leg].had_bye || table[i_leg].ssrc[i_rtp]==ssrc){
table[i_leg].ssrc[i_rtp]=ssrc;
*idx_leg=i_leg;
*idx_rtp=i_rtp;
return 1;
}

rtp_idx::iterator it = rtp_to_idx.find(rtp_key(addr, port));
if (it == rtp_to_idx.end()) {
return 0;
}
i_leg = it->second;

for(i_rtp=0;i_rtp<table[i_leg].ip_n;i_rtp++){
if(table[i_leg].port[i_rtp]==port && table[i_leg].ip[i_rtp]==addr){
if (!table[i_leg].had_bye || table[i_leg].ssrc[i_rtp]==ssrc){
table[i_leg].ssrc[i_rtp]=ssrc;
*idx_leg=i_leg;
*idx_rtp=i_rtp;
return 1;
}
}
}
Expand All @@ -150,6 +159,11 @@ int calltable::do_cleanup( time_t currtime ){
int idx;
for(idx=0;idx<(int)table_size;idx++){
if(table[idx].is_used && currtime-table[idx].last_packet_time > 300){
for(int i_rtp=0; i_rtp<table[idx].ip_n; i_rtp++) {
rtp_to_idx.erase(rtp_key(table[idx].ip[i_rtp], table[idx].port[i_rtp]));
}

callid_to_idx.erase(std::string(table[idx].call_id, table[idx].call_id_len));
if (table[idx].f_pcap!=NULL){
pcap_dump_close(table[idx].f_pcap);
}
Expand Down
28 changes: 28 additions & 0 deletions calltable.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
*/

#include <pcap.h>
#include <map>
#include <string>
#include <arpa/inet.h>

#define calltable_max 10240
Expand All @@ -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_key, int> rtp_idx;
typedef std::map<std::string, int> callid_idx;

class calltable
{
Expand Down Expand Up @@ -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;
};