Skip to content

Commit

Permalink
save caller ID with NAME field from SIP INVITE and store it to cdr.ca…
Browse files Browse the repository at this point in the history
…llername MySQL column (thanks Carlos Talbot)
  • Loading branch information
Martin Vit committed Jun 10, 2010
1 parent 52ecb24 commit 92bfc0a
Show file tree
Hide file tree
Showing 8 changed files with 50 additions and 2 deletions.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
/calltable.cpp -text
/calltable.h -text
/cdrtable.sql -text
/cdrtable.sql.1.2.1-1.3 -text
gzstream/COPYING.LIB -text
gzstream/Makefile -text
gzstream/README -text
Expand Down
13 changes: 13 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
version 1.3
-----------
- hash search function for classifying RTP packets to its Call structure. This will speedup voipmonitor for high call volumes.
- fix 100% CPU whan -k was given
- log big timestamp jump only if verbose is > 4
- log MySQL query error to syslog
- handle MySQL error "2006 - MySQL server has gone away" as reconnecting to database
- fix crashes when dereferencing NULL packet. Sometimes it happens that pcap_next returns NULL pointer. Thanks Carlos Talbot!
- save caller ID with NAME field from SIP INVITE and store it to cdr.callername MySQL column (thanks Carlos Talbot)

UPGRADE: cat cdrtable.sql.1.2.1-1.3 | mysql voipmonitor


version 1.2.1
-------------
- fix random crashing (dereferencing NULL pointer) in jitterbuffer simulator.
Expand Down
6 changes: 6 additions & 0 deletions README
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,9 @@ ldconfig
cd ../voipmonitor
make
make install

MySQL
-----
cat cdrtable.sql |mysql databaseName


5 changes: 3 additions & 2 deletions calltable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ Call::Call(char *call_id, unsigned long call_id_len, time_t time, void *ct) {
seenbye = false;
seenbyeandok = false;
caller[0] = '\0';
callername[0] = '\0';
called[0] = '\0';
byecseq[0] = '\0';
invitecseq[0] = '\0';
Expand Down Expand Up @@ -210,8 +211,8 @@ Call::saveToMysql() {
* 1 - call was answered but there was no bye
* 0 - call was not answered
*/

query << "INSERT INTO `" << mysql_table << "` SET caller = " << quote << caller << ", called = " << quote << called <<
query << "INSERT INTO `" << mysql_table << "` SET caller = " << quote << caller << ", callername = " << quote << callername <<
", called = " << quote << called <<
", duration = " << duration() << ", calldate = FROM_UNIXTIME(" << calltime() << ")" <<
", fbasename = " << quote << fbasename <<
", sighup = " << quote << (sighup ? 1 : 0) <<
Expand Down
1 change: 1 addition & 0 deletions calltable.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class Call {
unsigned long call_id_len; //!< length of call-id
char call_id[MAX_CALL_ID]; //!< call-id from SIP session
char fbasename[MAX_FNAME]; //!< basename of file
char callername[256]; //!< callerid name from SIP header
char caller[256]; //!< From: xxx
char called[256]; //!< To: xxx
char byecseq[32]; //!< To: xxx
Expand Down
1 change: 1 addition & 0 deletions cdrtable.sql
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ CREATE TABLE `cdr` (
`calldate` datetime NOT NULL,
`duration` int(32) unsigned NOT NULL,
`caller` varchar(255) NOT NULL,
`callername` varchar(255) NOT NULL,
`called` varchar(255) NOT NULL,
`fbasename` varchar(255) NOT NULL,
`bye` tinyint(2) NOT NULL default 2,
Expand Down
2 changes: 2 additions & 0 deletions cdrtable.sql.1.2.1-1.3
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE cdr ADD callername varchar(255) NOT NULL;
ALTER TABLE cdr ADD INDEX(callername);
23 changes: 23 additions & 0 deletions sniff.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,28 @@ char * gettag(const void *ptr, unsigned long len, const char *tag, unsigned long
return rc;
}

int get_sip_peercnam(char *data, int data_len, char *tag, char *peername, int peername_len){
unsigned long r, r2, peername_tag_len;
char *peername_tag = gettag(data, data_len, tag, &peername_tag_len);
if ((r = (unsigned long)memmem(peername_tag, peername_tag_len, "\"", 1)) == 0){
goto fail_exit;
}
r += 1;
if ((r2 = (unsigned long)memmem(peername_tag, peername_tag_len, "\" <", 3)) == 0){
goto fail_exit;
}
if (r2 <= r){
goto fail_exit;
}
memcpy(peername, (void*)r, r2 - r);
memset(peername + (r2 - r), 0, 1);
return 0;
fail_exit:
strcpy(peername, "empty");
return 1;
}


int get_sip_peername(char *data, int data_len, char *tag, char *peername, int peername_len){
unsigned long r, r2, peername_tag_len;
char *peername_tag = gettag(data, data_len, tag, &peername_tag_len);
Expand Down Expand Up @@ -370,6 +392,7 @@ void readdump(pcap_t *handle) {

/* this logic updates call on last INVITES */
if (sip_method == INVITE) {
get_sip_peercnam(data,datalen,"From:", call->callername, sizeof(call->callername));
get_sip_peername(data,datalen,"From:", call->caller, sizeof(call->caller));
get_sip_peername(data,datalen,"To:", call->called, sizeof(call->called));
call->seeninvite = true;
Expand Down

0 comments on commit 92bfc0a

Please sign in to comment.