From: <jpg...@us...> - 2007-08-13 22:41:32
|
Revision: 1080 http://iaxclient.svn.sourceforge.net/iaxclient/?rev=1080&view=rev Author: jpgrayson Date: 2007-08-13 15:41:29 -0700 (Mon, 13 Aug 2007) Log Message: ----------- Throttle vnaks on a per-call basis. This helps prevent vnak storms in certain cases. Modified Paths: -------------- trunk/lib/libiax2/src/iax.c Modified: trunk/lib/libiax2/src/iax.c =================================================================== --- trunk/lib/libiax2/src/iax.c 2007-07-31 00:48:36 UTC (rev 1079) +++ trunk/lib/libiax2/src/iax.c 2007-08-13 22:41:29 UTC (rev 1080) @@ -192,6 +192,8 @@ unsigned char iseqno; /* Last acknowledged sequence number */ unsigned char aseqno; + /* Last sequence number we VNAKd */ + unsigned char lastvnak; /* Time value that we base our transmission on */ struct timeval offset; /* Time value we base our delivery on */ @@ -473,6 +475,7 @@ if (callnums > 32767) callnums = 1; s->peercallno = 0; + s->lastvnak = -1; s->transferpeer = 0; /* for attended transfer */ s->next = sessions; s->sendto = iax_sendto; @@ -1617,6 +1620,13 @@ static int iax2_vnak(struct iax_session *session) { + /* send vnak just once for a given sequence number */ + if ( (unsigned char)(session->lastvnak - session->iseqno) < 128 ) + { + return 0; + } + + session->lastvnak = session->iseqno; return send_command_immediate(session, AST_FRAME_IAX, IAX_COMMAND_VNAK, 0, NULL, 0, session->iseqno); } @@ -2184,6 +2194,14 @@ if (cur->peercallno == 0) { cur->peercallno = callno; } + else if ( cur->peercallno != callno ) + { + // print a warning when the callno's don't match + fprintf( stderr, "WARNING: peercallno does not match callno" + ", peercallno => %d, callno => %d, dcallno => %d", + cur->peercallno, callno, dcallno ) ; + return 0 ; + } return 1; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |