Modularizando o src
Dependencies: EALib EthernetInterface_vz mbed-rtos mbed
Fork of header_main_colinas_V0-20-09-14 by
sip.cpp
- Committer:
- klauss
- Date:
- 2015-11-24
- Revision:
- 137:32dd35a6dbc9
- Parent:
- 135:2f4290590e51
File content as of revision 137:32dd35a6dbc9:
#include "sip.h" //*[ begin ] ------------------------------------ Funcoes de uso interno ---------------------------------------------- *// void Sip::__init_sock__ ( void ) { sip_server.set_address ( this->server_ip , this -> server_port ); sock.bind ( this -> my_port ); sock.set_blocking ( false, 0 ); } void Sip::__end_sock__ ( void ) { sock.close (); } void Sip::__reconnect__ ( void ) { __end_sock__ (); __init_sock__ (); } //*[ end ] -------------------------------------- Funcoes de uso interno ---------------------------------------------- *// Sip::Sip ( const int new_ext, const uint16_t my_port ) { if ( debug_sip ) vz_debug ("[%d, %d] Building SIP", new_ext, my_port ); this->my_ext = new_ext; this->my_port = my_port; cm -> get_server_ip ( this->server_ip ); this->server_port = cm -> get_server_port (); cm -> get_header_ip ( this->my_ip ); if ( debug_sip ) vz_debug ("[%d] port %d", this->my_ext, this->my_port ); snprintf ( this -> my_display, sizeof ( this -> my_display ), "%i", this -> my_ext ); this->my_rtp_port = 0; if ( debug_rtp ) vz_debug ("[%d] rtp port %d ", this->my_ext, this->my_rtp_port ); this->peer_ext = cm -> get_server_ext (); strcpy( this->last_invite_tag, "" ); strcpy( this->last_invite_callid, ""); strcpy( this->last_branch, "" ); strcpy( this->SVNREV, "COLA" ); status = sip_idle; __init_sock__ (); call = NULL; waiting = false; listen_SIP_server_return = 0; last_cseq = 0; sip_new_counter++; } Sip::~Sip ( void ) { __end_sock__ (); sip_delete_counter++; } int Sip::registry ( void ) { build_registry_package (); int send = sock.sendTo ( sip_server, buffer, strlen ( buffer ) ); // > 400 if ( send not_eq strlen ( buffer ) ) { if ( debug_reconnect ) vz_debug ("[%d] Reconnect SIP -- Registry -- Sent %i of %i bytes", this->my_ext, send, strlen ( buffer ) ); __reconnect__ (); miss_sip_registry_send_pkg ++; } if ( debug_sip ) vz_debug ("[%d %d] Registry -- Sent %i of %i bytes", this -> my_ext, this -> my_port, send, strlen ( buffer ) ); return ( send ); } VZ_call * Sip::invite ( void ) { if ( status == sip_on_call ) return call; else if ( status == sip_idle ) { int cseq = 0; call = NULL; build_invite_package( &cseq ); if ( debug_invite ) vz_debug ("cseq::%d", cseq ); if ( drop_invite_to_ast_pkg ) { vz_debug ("[%d] Droped invite pkg to ast", this->my_ext ); } else { int send = sock.sendTo ( sip_server, buffer, strlen ( buffer ) ); if ( send not_eq strlen ( buffer ) ) { if ( debug_reconnect ) vz_debug ("[%d] Reconnect SIP -- Invite", this->my_ext ); __reconnect__ (); miss_sip_invite_send_pkg++; } if ( debug_invite || debug_reconnect ) vz_debug ("[%d] Return value for invite pkg %d", this->my_ext, send ); } invite_timer.stop (); invite_timer.reset (); invite_timer.start (); sip_set_status ( sip_waiting_trying ); waiting = false; } if ( invite_timer.read () > INVITE_MAX_WAITING_TIME ) { if ( debug_invite ) vz_debug ("[%d] Invite call timeout :(", this -> my_ext ); invite_timer.stop (); invite_timer.reset (); sip_set_status ( sip_denied ); send_bye (); call = NULL; return ( NULL ); } if ( waiting == true ) { return call; } else return ( NULL ); } char * Sip::build_registry_package ( void ) { char branch [ SIP_MAXMSGSIZE ]; char tag [ SIP_MAXMSGSIZE ]; char callid [ SIP_MAXMSGSIZE ]; fill_random16h ( branch ); fill_random ( tag, 18 ); fill_random16h ( callid ); snprintf( buffer, sizeof( buffer ) - 1, "REGISTER sip:%s:%d SIP/2.0\r\nVia: SIP/2.0/UDP %s:%d;branch=%s\r\n" "From: %d <sip:%d@%s:%d>;tag=%s\r\n" "To: %d <sip:%d@%s:%d>\r\n" "Call-ID: %s\r\n" "CSeq: %d REGISTER\r\n" "Max-Forwards: 70\r\n" "Contact: %d <sip:%d@%s:%d>;expires=270\r\n" "User-Agent: VZtech/pabxdriver-%s\r\n" "Content-Length: 0\r\n" "%s\r\n\r\n", server_ip, server_port, my_ip, my_port, branch, my_ext, my_ext, server_ip, server_port, tag, my_ext, my_ext, server_ip, server_port, callid, get_cseq(), my_ext, my_ext, my_ip, my_port, SVNREV, SIP_ALLOW ); return ( buffer ); } char * Sip::build_invite_package ( int * cseq, const bool retry ) { char header [ SIP_MAXMSGSIZE ]; char body [ SIP_MAXMSGSIZE ]; char branch [ SIP_MAXMSGSIZE ]; char tag [ SIP_MAXMSGSIZE ]; char callid [ SIP_MAXMSGSIZE ]; char callbox_string[ CALLBOX_STRING_SIZE ]; int snprintf_ret = snprintf ( callbox_string, CALLBOX_STRING_SIZE - 1, "%i", this->my_ext ); if ( snprintf_ret == CALLBOX_STRING_SIZE ) callbox_string [ CALLBOX_STRING_SIZE - 1 ] = '\0'; if ( !retry ) { *cseq = get_cseq (); last_cseq = *cseq; fill_random16h ( branch ); strcpy ( last_branch, branch ); fill_random ( tag, 18 ); strcpy ( last_invite_tag, tag ); fill_random16h ( callid ); strcpy ( last_invite_callid, callid ); this->my_rtp_port = fill_random_rtp_port (); } else { *cseq = last_cseq; strcpy ( branch, last_branch ); strcpy ( tag, last_invite_tag ); strcpy ( callid, last_invite_callid ); } if ( debug_invite ) vz_debug ("[%d] branch :: %s -- tag :: %s -- callid :: %s", this->my_ext, branch, tag, callid ); if ( debug_rtp || debug_invite ) vz_debug ( "[%d] Invite PKG rtp port ( %d )", this->my_ext, this->my_rtp_port ); snprintf( header, sizeof ( header ) -1, "INVITE sip:%i@%s:%i SIP/2.0\r\n" "Via: SIP/2.0/UDP %s:%i;branch=%s\r\n" "From: %s <sip:%i@%s:%i>;tag=%s\r\n" "To: <sip:%i@%s:%i>\r\n" "Call-ID: %s@%s\r\n" "CSeq: %i INVITE\r\n" "Contact: %i <sip:%i@%s:%i>\r\n" "Max-Forwards: 20\r\n" "User-Agent: VZtech/pabxdriver-%s\r\n" "Expires: 71\r\n" "%s\r\n" "Content-Type: application/sdp\r\n", this->peer_ext, this->server_ip, this->server_port, this->my_ip, this->my_port, branch, callbox_string, this->my_ext, this->server_ip, this->server_port, tag, this->peer_ext, this->server_ip, this->server_port, callid, this->my_ip, *cseq, this->my_ext, this->my_ext, this->my_ip, this->my_port, SVNREV, SIP_ALLOW ); snprintf( body, sizeof ( body ) - 1, "v=0\r\no=- 7377 18176 IN IP4 %s\r\n" "s=-\r\n" "c=IN IP4 %s\r\n" "t=0 0\r\n" "i=UDP %i\r\n" "m=audio %i RTP/AVP 8 101\r\n" "a=rtpmap:8 PCMA/8000/1\r\n" "a=rtpmap:101 telephone-event/8000\r\n" "a=fmtp: 101 0-11", this->my_ip, this->my_ip, this->my_rtp_port, this->my_rtp_port ); strcpy( this->buffer, header ); char content_Length_msg [ CONTENT_LENGTH_MSG_SIZE ]; snprintf_ret = snprintf ( content_Length_msg, CONTENT_LENGTH_MSG_SIZE, "Content-Length: %d\r\n\r\n", strlen ( body ) ); if ( snprintf_ret == CONTENT_LENGTH_MSG_SIZE ) content_Length_msg [ CONTENT_LENGTH_MSG_SIZE - 1 ] = '\0'; strcat( this->buffer, content_Length_msg ); strcat( this->buffer, body ); if ( debug_invite ) vz_debug ("[%d] strlen( header [%d] ) | strlen( body [%d] ) | ( h + b [%d])", this->my_ext, strlen( header ),strlen( body ), strlen( header ) + strlen( body ) ); return( this->buffer ); } char * Sip::build_bye_package ( void ) { char branch [ SIP_MAXMSGSIZE ]; char tag [ SIP_MAXMSGSIZE ]; fill_random16h ( branch ); fill_random (tag,18 ); snprintf( this -> buffer, sizeof ( this -> buffer ) - 1, "BYE sip:%i@%s:%i SIP/2.0\r\n" "Via: SIP/2.0/UDP %s:%i;branch=%s\r\n" "From: %i <sip:%i@%s:%i>;tag=%s\r\n" "To: <sip:%i@%s:%i>;tag=%s\r\n" "Call-ID: %s@%s\r\n" "CSeq: %i BYE\r\n" "Max-Forwards: 70\r\n" "User-Agent: VZtech/pabxdriver-%s\r\n" "Content-Length: 0\r\n\r\n", this->peer_ext, this->server_ip, this->server_port, this->my_ip, this->my_port, branch, this->my_ext, this->my_ext, this->server_ip, this->server_port, last_invite_tag, this->peer_ext, this->server_ip, this->server_port, tag, last_invite_callid, this->my_ip, get_cseq(), SVNREV ); return( buffer ); } char * Sip::build_ack_package ( void ) { if ( this -> buffer not_eq NULL ) { char to [ SIP_MAXMSGSIZE ]; char from [ SIP_MAXMSGSIZE ]; char callid [ SIP_MAXMSGSIZE ]; char branch [ SIP_MAXMSGSIZE ]; char cseq [ SIP_MAXMSGSIZE ]; if( decode_gettag( ( const unsigned char * ) this -> buffer, "to: ", to ) == 0) { buffer[ 0 ] = 0; return NULL; } if( decode_gettag( ( const unsigned char * ) this -> buffer, "from: ", from ) == 0) { buffer[ 0 ] = 0; return NULL; } if( decode_gettag( ( const unsigned char * ) this -> buffer, "call-id: ", callid ) == 0) { buffer[ 0 ] = 0; return NULL; } decode_branch ( ( const unsigned char * ) this -> buffer, branch ); decode_cseq ( ( const unsigned char * ) this -> buffer, cseq ); snprintf ( buffer, sizeof ( buffer ) - 1, "ACK sip:%i@%s:%i SIP/2.0\r\n" "Via: SIP/2.0/UDP %s:%i;branch=%s\r\n" "From: %s\r\n" "To: %s\r\n" "Call-ID: %s\r\n" "CSeq: %s ACK\r\n" "Max-Forwards: 70\r\n" "Contact: %i <sip:%i@%s:%i>\r\n" "User-Agent: VZtech/pabxdriver-%s\r\n" "Content-Length: 0\r\n\r\n", this -> peer_ext, this -> server_ip, this -> server_port, this -> my_ip, this -> my_port, branch, from, to, callid, cseq, this -> my_ext, this -> my_ext, this -> my_ip, this -> my_port, SVNREV ); return( buffer ); } else { return ( NULL ); } } char * Sip::build_reply_package ( void ) { char to [ SIP_MAXMSGSIZE ]; char from [ SIP_MAXMSGSIZE ]; char callid [ SIP_MAXMSGSIZE ]; char cseq [ SIP_MAXMSGSIZE ]; char via [ SIP_MAXMSGSIZE ]; char tag [ SIP_MAXMSGSIZE ]; if( decode_gettag( ( const unsigned char * ) buffer, "to: ", to ) == 0) { buffer[ 0 ] = 0; return NULL; } if( decode_gettag( ( const unsigned char * ) buffer, "from: ", from ) == 0) { buffer[ 0 ] = 0; return NULL; } if( decode_gettag( ( const unsigned char * ) buffer, "call-id: ", callid ) == 0 ) { buffer[ 0 ] = 0; return NULL; } if( decode_gettag( ( const unsigned char * ) buffer, "cseq: ", cseq) == 0 ) { buffer[ 0 ] = 0; return NULL; } if( decode_gettag( ( const unsigned char * ) buffer, "via: ", via) == 0 ) { buffer[ 0 ] = 0; return NULL; } if (strlen(via) > 6) { if (strcasecmp(";rport",via+strlen(via)-6)==0) { via[strlen(via)-6] = 0; } } fill_random ( tag, 18 ); snprintf( buffer, sizeof ( buffer ) - 1, "SIP/2.0 200 OK\r\n" "To: %s;tag=%s\r\n" "From: %s\r\n" "Call-ID: %s\r\n" "CSeq: %s\r\n" "Via: %s\r\n" "Server: VZtech/pabxdriver-%s\r\n" "Content-Length: 0\r\n" "%s\r\n\r\n", to, tag, from, callid, cseq, via, SVNREV, SIP_ALLOW ); return( buffer ); } char * Sip::fill_random16h ( char * buffer ) { fill_random( buffer, 16 ); buffer[ 7 ] = '-'; return( buffer ); } char * Sip::fill_random ( char * buffer, const int size ) { static uint16_t seed = time( NULL ); seed += 1; srand( seed ); for( int i = 0; i < size - 1; i++ ) { buffer[ i ] = fill_random_aux[ rand() & 0x3f ]; } buffer[ size - 1 ] = 0; return( buffer ); } int Sip::get_cseq ( void ) { static unsigned int cseq = 0; if( cseq == 0 ) { /* initial value, random number */ cseq = rand (); cseq &= 0x7fff; } cseq++; cseq &= 0x7fff; if ( cseq == 0 ) cseq++; return cseq; } char * Sip::decode_cseq ( const unsigned char * package, char * cseq ) { char pkg [ SIP_MAXMSGSIZE ]; if( decode_gettag ( package, "cseq: ", pkg ) != 0) { char cs [ SIP_MAXMSGSIZE ]; int i = 0; strcpy ( cs, pkg ); while ( ( cs [ i ] != 0 ) && ( cs [ i ] != ' ' ) ) i++; cs [ i ] = 0; strcpy ( cseq, cs ); } else { cseq [ 0 ] = 0; } return ( cseq ); } char * Sip::decode_branch ( const unsigned char * package, char * branch ) { char pkg [ SIP_MAXMSGSIZE ]; if ( decode_gettag ( package, "branch=", pkg ) != 0 ) { int i = 0; strcpy ( branch, pkg ); while ( ( branch [ i ] != 0 ) && ( branch [ i ] != ';' ) ) i++; branch [ i ] = 0; } else { branch [ 0 ] = 0; } return ( branch ); } int Sip::decode_gettag ( const unsigned char * package, const char * tag, char * out ) { int cmpsize = strlen ( tag ); int size = strlen ( ( char * ) package ) - cmpsize; for ( int i = 0; i < size; i++ ) { if ( strncasecmp( tag, ( char * ) package + i, cmpsize ) == 0 ) { char * s; s = ( char * ) package + i + cmpsize; register int j = 0; while ( ( s [ j ] != '\r' ) && ( s [ j ] != '\n' ) ) j++; strncpy ( out, s, j ); // copy string to output out [ j ] = 0; // terminate string return 1; // found } } return 0; // not found } int Sip::fill_random_rtp_port ( void ) { static uint16_t port = 0; port += 2; port &= 0x7fe; // 0 to 2046, always even return port + 16384; } void Sip::set_server_port ( const int new_server_port ) { this->server_port = new_server_port; } void Sip::set_server_ext ( const int new_server_ext ) { this->peer_ext = new_server_ext; } void Sip::set_server_ip ( const char * new_server_ip ) { strncpy( this->server_ip, new_server_ip, 20 ); this->server_ip[19] = 0; } /* Retorna = 0 :: ok < 0 :: tive problemas > 0 :: devo remover essa call do vetor de calls */ int Sip::listen_SIP_server ( void ) { int ret = listen_SIP_server_return; listen_SIP_server_return = 0; return ret; } void Sip::set_port ( const int port ) { my_port = port; } void Sip::send_bye ( void ) { build_bye_package (); int send = sock.sendTo ( sip_server, this -> buffer, strlen( this -> buffer ) ); // antigo if ( debug_sip ) vz_debug ( "[%d] sizeof( bye pkg ) :: %d", this -> my_ext, strlen ( this -> buffer ) ); if ( debug_invite ) vz_debug ( "[%d] sizeof( bye pkg ) :: %d", this -> my_ext, strlen ( this -> buffer ) ); if ( send not_eq strlen ( this->buffer ) ) { if ( debug_reconnect ) vz_debug ("[%d] Reconnect SIP -- BYE, %d, %d", this -> my_ext, send, strlen ( this -> buffer ) ); __reconnect__ (); miss_sip_bye_send_pkg ++; } } int Sip::get_status ( void ) { return this->status; } void Sip::sip_set_status ( const uint8_t status ) { this->status = status; } int Sip::get_socket_fd ( void ) { return sock.get_fd (); } int Sip::udp_incomming_pkg ( void ) { Endpoint from; int length = sock.receiveFrom ( from, buffer, sizeof( buffer ) ); if ( memcmp( ( ( u8_t * )( &(from._remoteHost) ) ) + 2, ( ( u8_t * )( &(sip_server._remoteHost) ) ) + 2, 6 ) != 0 ) return 0; if ( length == -1 ) { if ( debug_reconnect ) vz_debug ("[%d] Reconnect SIP -- UDP Incomming", get_ext () ); __reconnect__ (); miss_sip_inc_pkg ++; } if ( length > 0 ) { if ( sizeof( buffer ) > length ) buffer[ length ] = 0; int sip_response = -1; // faster than atoi() (: if ( buffer[ 7 ] == ' ' || buffer[ 11 ] == ' ' ){ sip_response = ( buffer[ 8 ] - '0' ) * 100 + ( buffer[ 9 ] - '0' ) * 10 + ( buffer[ 10 ] - '0' ); } if ( ( status == sip_trying ) || ( status == sip_ringing ) || ( status == sip_waiting_trying ) || ( status == sip_on_call ) ) { if ( sip_response == 200 ){ // Ok char *ref = strstr( buffer, "audio" ); if ( debug_invite ) vz_debug ("[%d] udp_incomming_pkg -- ok", this->my_ext ); if ( ref != NULL ) { if ( drop_this_amount_of_ack_to_ast ) drop_this_amount_of_ack_to_ast--; if ( drop_this_amount_of_ack_to_ast ) { vz_debug ("[%d] Droped ok pkg received from ast (%d)", this->my_ext, drop_this_amount_of_ack_to_ast ); return -71; } ref += 6; // audio ref = strtok( ref, " "); if ( call == NULL ){ call = new VZ_call ( this->my_ext, this->my_rtp_port, this->peer_ext, atoi( ref ) ); if ( debug_alloc_vz_call ) vz_debug ( "VZ_Call :: %p", call ); if ( debug_rtp ) vz_debug ("[%d] Ok new call ( %d, %d, %d, %d ( %s ) ) ", this->my_ext, this->my_ext, this->my_rtp_port, this->peer_ext, atoi( ref ), ref ); if ( call == NULL ) memory_is_over = true; } build_ack_package (); int send = 0; if ( drop_ack_pkg ) { vz_debug ("[%d] Droped ack pkt to ast", this->my_ext ); } else { send = sock.sendTo ( sip_server, this -> buffer, strlen ( this -> buffer ) ); if ( send not_eq strlen( this -> buffer ) ) { if ( debug_reconnect ) vz_debug ("[%d] Reconnect SIP -- Ok -- Call mode on", this->my_ext ); __reconnect__ (); miss_sip_ok_send_pkg ++; } } if ( debug_invite ) vz_debug ("[%d] Call alocada -- sizeof( ack ) :: %d - strlen( this -> buffer ):: %d", this->my_ext, send, strlen( this -> buffer ) ); sip_set_status ( sip_on_call ); } } } if ( ( status == sip_trying ) || ( status == sip_ringing ) ) { if ( sip_response >= 400 && sip_response < 700 ) { if ( debug_invite ) { buffer [ 11 ] = 0; if ( debug_invite ) vz_debug ("[%d] Busy Here :: %s", this -> my_ext, buffer + 8 ); } send_bye (); sip_set_status ( sip_busy ); return ( NULL ); } else if ( sip_response == 183 ) // Session in Progress { char *ref = strstr ( buffer, "audio" ); if ( ref != NULL ) { ref += 6; // strlen( "audio" ) == 6 ref = strtok( ref, " "); if ( call == NULL ) { this->call = new VZ_call ( this->my_ext, this->my_rtp_port, this->peer_ext, atoi( ref ) ); if ( debug_alloc_vz_call ) vz_debug ( "VZ_Call :: %p", this->call ); if ( debug_rtp ) vz_debug ("[%d] Session in Progress ( %d, %d, %d, %d ( %s ) ) ",this->my_ext, this->my_ext, this->my_rtp_port, this->peer_ext, atoi( ref ), ref ); if ( call == NULL ) memory_is_over = true; } waiting = true; } } } if ( status == sip_trying ){ if ( sip_response == 180 ){ if ( debug_invite ) vz_debug ("[%d] ringing", this->my_ext ); sip_set_status ( sip_ringing ); } } if ( status == sip_waiting_trying ){ if ( sip_response == 100 ){ if ( debug_invite ) vz_debug ("[%d] trying", this->my_ext ) sip_set_status ( sip_trying ); } } if ( status == sip_on_call ) { if ( !( strncasecmp( buffer, "bye ", 4 ) ) ) { build_reply_package (); int send = sock.sendTo ( sip_server, this -> buffer, strlen ( this -> buffer ) ); if ( send not_eq strlen ( this -> buffer ) ) { if ( debug_reconnect ) vz_debug ("" "[%d] Reconnect SIP -- RCV BYE from * -- ( expected, realized ) ( %d, %d )", this -> my_ext, strlen ( this -> buffer ), send ); __reconnect__ (); miss_sip_rcv_bye_send_pkg ++; } if ( debug_invite ) vz_debug ("" "[%d] Bye request received from * - sizeof ( bye reply pkg ) :: %d", this -> my_ext, strlen ( this -> buffer ) ); set_sip_rtp_port ( 0 ); listen_SIP_server_return = my_ext; } } } return length; } void Sip::reset_call ( void ) { if( call != NULL ) call = NULL; } int Sip::get_ext ( void ) { return my_ext; } int Sip::get_port ( void ) { return my_port; } int Sip::get_sip_rtp_port ( void ) { return my_rtp_port; } void Sip::set_sip_rtp_port ( const int new_my_rtp_port ) { this->my_rtp_port = new_my_rtp_port; if ( debug_rtp ) vz_debug ( "[%d] this->my_rtp_port ( %d ) = new_my_rtp_port( %d )", this->my_ext, this->my_rtp_port, new_my_rtp_port ); } int Sip::print_yourself ( void ) { vz_printf ("\r\n"); vz_printf ("Values ::\r\n"); vz_printf ("server_ip :: %s", server_ip ); vz_printf ("server_port :: %d", server_port ); vz_printf ("my_ip :: %s", my_ip ); vz_printf ("my_port :: %d", my_port ); vz_printf ("my_ext :: %d", my_ext ); vz_printf ("my_rtp_port :: %d", my_rtp_port ); vz_printf ("my_display :: %s", my_display ); vz_printf ("peer_ext :: %d", peer_ext ); vz_printf ("fill_random_aux :: %s", fill_random_aux ); vz_printf ("last_invite_tag :: %s", last_invite_tag ); vz_printf ("last_invite_callid :: %s", last_invite_callid ); vz_printf ("SVNREV :: %s", SVNREV ); vz_printf ("char buffer[ 1024 ] :: %p", ( void * ) buffer ); //FIXME esse tipo de tag existe como metalinguagem ??? //TOTHINK o que fazer pra entender melhor o estado dos sockets vz_printf ("UDPSocket sock :: %p", ( void * ) &sock ); vz_printf ("Endpoint sip_server :: %p", ( void * ) &sip_server ); vz_printf ("call :: %p", ( void * ) call ); vz_printf ("invite_timer :: %d", ( int ) invite_timer.read () ); vz_printf ("waiting :: %s", ( waiting ) ? "true" : "false" ); vz_printf ("listen_SIP_server_return :: %d", listen_SIP_server_return ); vz_printf ("\r\n"); return ( sizeof( Sip ) ); } int Sip::retry_send_last_invite_pkg_to_ast ( void ) { char callbox_string [ 32 ]; snprintf ( callbox_string, sizeof ( callbox_string ) -1, "%i", my_ext ); int cseq = 0; call = NULL; build_invite_package ( &cseq, true ); if ( debug_invite ) vz_debug ("cseq::%d", cseq ); int send = 0; if ( drop_invite_to_ast_pkg ) { vz_debug ("[%d] Droped invite pkg to ast", this->my_ext ); } else { send = sock.sendTo ( sip_server, buffer, strlen ( buffer ) ); if ( send not_eq strlen ( buffer ) ) { if ( debug_reconnect ) vz_debug ("[%d] Reconnect SIP -- Invite", this->my_ext ); __reconnect__ (); miss_sip_invite_send_pkg ++; } if ( debug_invite || debug_reconnect ) vz_debug ("[%d] Return value for invite pkg %d", this->my_ext, send ); } return ( send ); } void Sip::update ( void ) { cm -> get_server_ip ( this -> server_ip ); this -> server_port = cm -> get_server_port (); cm -> get_header_ip ( this -> my_ip ); this -> peer_ext = cm -> get_server_ext (); sip_server.set_address ( this -> server_ip , this -> server_port ); __reconnect__ (); }