Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Committer:
klauss
Date:
Fri May 08 04:15:23 2015 +0000
Revision:
121:ee02790d00b7
Parent:
119:ee6a53069455
Child:
124:c1b6c893e1c3
compiling

Who changed what in which revision?

UserRevisionLine numberNew contents of line
klauss 0:4d17cd9c8f9d 1 #include "sip.h"
klauss 0:4d17cd9c8f9d 2
klauss 121:ee02790d00b7 3 //*[ begin ] ------------------------------------ Funcoes de uso interno ---------------------------------------------- *//
klauss 121:ee02790d00b7 4 void Sip::__init_sock__ ( void )
klauss 121:ee02790d00b7 5 {
klauss 121:ee02790d00b7 6 sip_server.set_address ( this->server_ip , this->server_port );
klauss 121:ee02790d00b7 7 sock.set_blocking ( false, 0 );
klauss 121:ee02790d00b7 8 sock.bind ( this->my_port );
klauss 0:4d17cd9c8f9d 9 }
klauss 0:4d17cd9c8f9d 10
klauss 121:ee02790d00b7 11 void Sip::__end_sock__ ( void )
klauss 121:ee02790d00b7 12 {
klauss 121:ee02790d00b7 13 sock.close ();
klauss 0:4d17cd9c8f9d 14 }
klauss 0:4d17cd9c8f9d 15
klauss 121:ee02790d00b7 16 void Sip::__reconnect__ ( void )
klauss 121:ee02790d00b7 17 {
klauss 119:ee6a53069455 18 __end_sock__();
klauss 114:472502b31a12 19 sock.init();
klauss 114:472502b31a12 20 sock.bind( this->my_port );
klauss 114:472502b31a12 21 }
klauss 121:ee02790d00b7 22 //*[ end ] -------------------------------------- Funcoes de uso interno ---------------------------------------------- *//
klauss 121:ee02790d00b7 23
klauss 29:7246460b73f8 24
klauss 121:ee02790d00b7 25 Sip::Sip ( const int new_ext, const uint16_t my_port )
klauss 121:ee02790d00b7 26 {
klauss 29:7246460b73f8 27 FILE * fp = NULL;
klauss 121:ee02790d00b7 28 char inner_tmp [ 20 ];
klauss 28:94aec56c6329 29
klauss 121:ee02790d00b7 30 if ( debug_sip ) debug_msg ("[%d, %d] Building SIP", new_ext, my_port );
klauss 27:98f824719d1c 31
klauss 119:ee6a53069455 32 this->my_ext = new_ext;
klauss 112:6ae726539ab9 33 this->my_port = my_port;
klauss 29:7246460b73f8 34
klauss 121:ee02790d00b7 35 fp = fopen ( "/qspi/serverip.txt", "r");
klauss 121:ee02790d00b7 36 if ( fp == NULL)
klauss 121:ee02790d00b7 37 {
klauss 121:ee02790d00b7 38 if ( debug_sip ) debug_msg("[%d] Failed to open /qspi/serverip.txt", this->my_ext );
klauss 121:ee02790d00b7 39 strncpy ( this->server_ip, SERVER_IP, 20 );
klauss 121:ee02790d00b7 40 } else {
klauss 121:ee02790d00b7 41 char tmp [ 16 ] = "\0";
klauss 121:ee02790d00b7 42 int read = fread ( tmp, 1, 15, fp );
klauss 121:ee02790d00b7 43 if ( read > 0 ){
klauss 121:ee02790d00b7 44 for ( int i = 0; i < read; i++ )
klauss 121:ee02790d00b7 45 if ( tmp [ i ] == '\n' || tmp[ i ] == '\r' ){
klauss 121:ee02790d00b7 46 tmp [ i ] = '\0';
klauss 121:ee02790d00b7 47 break;
klauss 121:ee02790d00b7 48 }
klauss 121:ee02790d00b7 49 strcpy ( this->server_ip, tmp );
klauss 121:ee02790d00b7 50 if ( debug_sip ) debug_msg ("[%d] ip server%s( read %d chars ), valid %d", this->my_ext, this->server_ip, read, strlen( this->server_ip ) );
klauss 121:ee02790d00b7 51 }else{
klauss 121:ee02790d00b7 52 if ( debug_sip ) debug_msg ("[%d] Failed to read /qspi/serverip.txt", this->my_ext );
klauss 121:ee02790d00b7 53 strncpy ( this->server_ip, SERVER_IP, 20 );
klauss 121:ee02790d00b7 54 }
klauss 121:ee02790d00b7 55 }
klauss 121:ee02790d00b7 56 fclose ( fp );
klauss 121:ee02790d00b7 57 this->server_ip [ 15 ] = '\0';
klauss 121:ee02790d00b7 58
klauss 121:ee02790d00b7 59 fp = fopen ( "/qspi/serverport.txt", "r");
klauss 121:ee02790d00b7 60 if ( fp == NULL )
klauss 121:ee02790d00b7 61 {
klauss 121:ee02790d00b7 62 if ( debug_sip ) debug_msg ("[%d] Failed to open /qspi/serverport.txt", this->my_ext );
klauss 121:ee02790d00b7 63 this->server_port = SERVER_PORT;
klauss 121:ee02790d00b7 64 } else {
klauss 121:ee02790d00b7 65 if ( fread ( (void *)inner_tmp, 1, 20, fp ) > 0 )
klauss 121:ee02790d00b7 66 {
klauss 121:ee02790d00b7 67 server_port = atoi ( inner_tmp );
klauss 121:ee02790d00b7 68 if ( debug_sip ) debug_msg ("[%d] server port %d", this->my_ext, this->server_port );
klauss 121:ee02790d00b7 69 } else {
klauss 121:ee02790d00b7 70 if ( debug_sip ) debug_msg ("F[%d] failed to read /qspi/serverport.txt", this->my_ext );
klauss 121:ee02790d00b7 71 this->server_port = SERVER_PORT;
klauss 121:ee02790d00b7 72 }
klauss 121:ee02790d00b7 73 }
klauss 121:ee02790d00b7 74 fclose ( fp );
klauss 121:ee02790d00b7 75
klauss 121:ee02790d00b7 76 fp = fopen ( "/qspi/myip.txt", "r");
klauss 121:ee02790d00b7 77 if ( fp == NULL )
klauss 121:ee02790d00b7 78 {
klauss 121:ee02790d00b7 79 if ( debug_sip ) debug_msg ("[%d] Failed to open /qspi/myip.txt", this->my_ext );
klauss 121:ee02790d00b7 80 strncpy ( this->my_ip, MY_IP, 20 );
klauss 121:ee02790d00b7 81 } else {
klauss 50:d9b6577a70f5 82 char tmp[ 16 ] = "\0";
klauss 46:a670f187a704 83 int read = fread( tmp, 1, 15, fp );
klauss 46:a670f187a704 84 if( read > 0 ){
klauss 46:a670f187a704 85 for( int i = 0; i < read; i++ )
klauss 46:a670f187a704 86 if( tmp[ i ] == '\n' || tmp[ i ] == '\r' ){
klauss 46:a670f187a704 87 tmp[ i ] = '\0';
klauss 46:a670f187a704 88 break;
klauss 46:a670f187a704 89 }
klauss 121:ee02790d00b7 90 strcpy ( this->my_ip, tmp );
klauss 121:ee02790d00b7 91 if ( debug_sip ) debug_msg ("[%d] ip %s( lidos %d chars ), valid %d", this->my_ext, this->my_ip, read, strlen( this->my_ip ) );
klauss 28:94aec56c6329 92 }else{
klauss 121:ee02790d00b7 93 if ( debug_sip ) debug_msg ("[%d] Failed to read /qspi/myip.txt", this->my_ext );
klauss 121:ee02790d00b7 94 strncpy ( this->my_ip, MY_IP, 20 );
klauss 28:94aec56c6329 95 }
klauss 28:94aec56c6329 96 }
klauss 121:ee02790d00b7 97 fclose ( fp );
klauss 46:a670f187a704 98
klauss 50:d9b6577a70f5 99 this->my_ip[ 15 ] = '\0';
klauss 28:94aec56c6329 100
klauss 121:ee02790d00b7 101 if ( debug_sip ) debug_msg ("[%d] port %d", this->my_ext, this->my_port );
klauss 97:8985817e8847 102
klauss 121:ee02790d00b7 103 snprintf ( this->my_display, sizeof ( this->my_display ), "%i", this->my_ext );
klauss 112:6ae726539ab9 104
klauss 112:6ae726539ab9 105 this->my_rtp_port = 0;
klauss 121:ee02790d00b7 106 if ( debug_rtp ) debug_msg ("[%d] rtp port %d ", this->my_ext, this->my_rtp_port );
klauss 46:a670f187a704 107
klauss 121:ee02790d00b7 108 fp = fopen ( "/qspi/peerext.txt", "r");
klauss 121:ee02790d00b7 109 if ( fp == NULL )
klauss 121:ee02790d00b7 110 {
klauss 121:ee02790d00b7 111 if( debug_sip ) debug_msg ("[%d] Failed to open /qspi/peerext.txt", this->my_ext );
klauss 119:ee6a53069455 112 this->peer_ext = PEER_EXT;
klauss 29:7246460b73f8 113 } else {
klauss 121:ee02790d00b7 114 if( fread ( (void *)inner_tmp, 1, 32, fp ) > 0 ) {
klauss 121:ee02790d00b7 115 this->peer_ext = atoi ( inner_tmp );
klauss 121:ee02790d00b7 116 if ( debug_sip ) debug_msg("[%d] server ext %d", this->my_ext, this->peer_ext );
klauss 29:7246460b73f8 117 } else {
klauss 121:ee02790d00b7 118 if ( debug_sip ) debug_msg ("Failed to read /qspi/peerext.txt" );
klauss 119:ee6a53069455 119 this->peer_ext = PEER_EXT;
klauss 28:94aec56c6329 120 }
klauss 28:94aec56c6329 121 }
klauss 121:ee02790d00b7 122 fclose ( fp );
klauss 119:ee6a53069455 123
klauss 0:4d17cd9c8f9d 124 strcpy( this->last_invite_tag, "" );
klauss 0:4d17cd9c8f9d 125 strcpy( this->last_invite_callid, "");
klauss 119:ee6a53069455 126 strcpy( this->last_branch, "" );
klauss 0:4d17cd9c8f9d 127 strcpy( this->SVNREV, "COLA" );
klauss 121:ee02790d00b7 128
klauss 0:4d17cd9c8f9d 129 status = sip_idle;
klauss 0:4d17cd9c8f9d 130
klauss 121:ee02790d00b7 131 __init_sock__ ();
klauss 85:b6f2dc1d0f4f 132
klauss 91:c2a86b1f8aaa 133 call = NULL;
klauss 91:c2a86b1f8aaa 134
klauss 91:c2a86b1f8aaa 135 waiting = false;
klauss 119:ee6a53069455 136
klauss 91:c2a86b1f8aaa 137 listen_SIP_server_return = 0;
klauss 91:c2a86b1f8aaa 138
klauss 119:ee6a53069455 139 last_cseq = 0;
klauss 119:ee6a53069455 140
klauss 85:b6f2dc1d0f4f 141 sip_new_counter++;
klauss 0:4d17cd9c8f9d 142 }
klauss 29:7246460b73f8 143
klauss 121:ee02790d00b7 144 Sip::~Sip ( void )
klauss 121:ee02790d00b7 145 {
klauss 121:ee02790d00b7 146 __end_sock__ ();
klauss 85:b6f2dc1d0f4f 147 sip_delete_counter++;
klauss 0:4d17cd9c8f9d 148 }
klauss 0:4d17cd9c8f9d 149
klauss 121:ee02790d00b7 150 int Sip::registry ( void )
klauss 119:ee6a53069455 151 {
klauss 121:ee02790d00b7 152 build_registry_package ();
klauss 81:3656f00ab3db 153
klauss 121:ee02790d00b7 154 int send = sock.sendTo ( sip_server, buffer, strlen ( buffer ) ); // > 400
klauss 121:ee02790d00b7 155 if ( send != strlen ( buffer ) )
klauss 119:ee6a53069455 156 {
klauss 121:ee02790d00b7 157 if ( debug_reconnect ) debug_msg ("[%d] Reconnect SIP -- Registry -- Sent %i of %i bytes", this->my_ext, send, strlen ( buffer ) );
klauss 121:ee02790d00b7 158 __reconnect__ ();
klauss 119:ee6a53069455 159 miss_sip_registry_send_pkg++;
klauss 119:ee6a53069455 160 }
klauss 114:472502b31a12 161
klauss 121:ee02790d00b7 162 if ( debug_sip ) debug_msg ("[%d %d] Registry -- Sent %i of %i bytes", this->my_ext, this->my_port, send, strlen ( buffer ) );
klauss 114:472502b31a12 163
klauss 121:ee02790d00b7 164 return ( send );
klauss 0:4d17cd9c8f9d 165 }
klauss 0:4d17cd9c8f9d 166
klauss 121:ee02790d00b7 167 VZ_call * Sip::invite ( void )
klauss 121:ee02790d00b7 168 {
klauss 121:ee02790d00b7 169 if ( status == sip_on_call ) return call;
klauss 91:c2a86b1f8aaa 170
klauss 121:ee02790d00b7 171 else if ( status == sip_idle )
klauss 121:ee02790d00b7 172 {
klauss 91:c2a86b1f8aaa 173 int cseq = 0;
klauss 91:c2a86b1f8aaa 174
klauss 91:c2a86b1f8aaa 175 call = NULL;
klauss 91:c2a86b1f8aaa 176
klauss 121:ee02790d00b7 177 build_invite_package( &cseq );
klauss 91:c2a86b1f8aaa 178
klauss 119:ee6a53069455 179 debug_msg ("cseq::%d", cseq );
klauss 91:c2a86b1f8aaa 180
klauss 114:472502b31a12 181 if ( drop_invite_to_ast_pkg )
klauss 114:472502b31a12 182 {
klauss 119:ee6a53069455 183 debug_msg("[%d] Droped invite pkg to ast", this->my_ext );
klauss 114:472502b31a12 184 }
klauss 114:472502b31a12 185 else
klauss 104:62646ef786a3 186 {
klauss 121:ee02790d00b7 187 int send = sock.sendTo ( sip_server, buffer, strlen ( buffer ) );
klauss 114:472502b31a12 188
klauss 121:ee02790d00b7 189 if ( send != strlen ( buffer ) )
klauss 119:ee6a53069455 190 {
klauss 121:ee02790d00b7 191 if ( debug_reconnect ) debug_msg ("[%d] Reconnect SIP -- Invite", this->my_ext );
klauss 121:ee02790d00b7 192 __reconnect__ ();
klauss 119:ee6a53069455 193 miss_sip_invite_send_pkg++;
klauss 119:ee6a53069455 194 }
klauss 119:ee6a53069455 195
klauss 121:ee02790d00b7 196 if ( debug_invite || debug_reconnect ) debug_msg ("[%d] Return value for invite pkg %d", this->my_ext, send );
klauss 104:62646ef786a3 197 }
klauss 104:62646ef786a3 198
klauss 121:ee02790d00b7 199 invite_timer.stop ();
klauss 121:ee02790d00b7 200 invite_timer.reset ();
klauss 121:ee02790d00b7 201 invite_timer.start ();
klauss 91:c2a86b1f8aaa 202
klauss 121:ee02790d00b7 203 sip_set_status ( sip_waiting_trying );
klauss 91:c2a86b1f8aaa 204
klauss 91:c2a86b1f8aaa 205 waiting = false;
klauss 78:1353744f01e1 206 }
klauss 0:4d17cd9c8f9d 207
klauss 121:ee02790d00b7 208 if ( invite_timer.read() > INVITE_MAX_WAITING_TIME )
klauss 121:ee02790d00b7 209 {
klauss 121:ee02790d00b7 210 if ( debug_invite ) debug_msg ("[%d] Invite call timeout :(", this->my_ext );
klauss 121:ee02790d00b7 211 invite_timer.stop ();
klauss 121:ee02790d00b7 212 invite_timer.reset ();
klauss 119:ee6a53069455 213 sip_set_status ( sip_denied );
klauss 121:ee02790d00b7 214 send_bye ();
klauss 91:c2a86b1f8aaa 215
klauss 91:c2a86b1f8aaa 216 call = NULL;
klauss 121:ee02790d00b7 217 return ( NULL );
klauss 78:1353744f01e1 218 }
klauss 77:e8c0253b57bc 219
klauss 121:ee02790d00b7 220 if ( waiting == true ) { return call; }
klauss 91:c2a86b1f8aaa 221
klauss 121:ee02790d00b7 222 else return ( NULL );
klauss 0:4d17cd9c8f9d 223 }
klauss 0:4d17cd9c8f9d 224
klauss 121:ee02790d00b7 225 char * Sip::build_registry_package ( void )
klauss 121:ee02790d00b7 226 {
klauss 0:4d17cd9c8f9d 227 char branch[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 228 char tag[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 229 char callid[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 230 fill_random16h( branch );
klauss 0:4d17cd9c8f9d 231 fill_random( tag, 18 );
klauss 0:4d17cd9c8f9d 232 fill_random16h( callid );
klauss 119:ee6a53069455 233
klauss 121:ee02790d00b7 234 snprintf( buffer, sizeof( buffer ) - 1,
klauss 121:ee02790d00b7 235 "REGISTER sip:%s:%d SIP/2.0\r\nVia: SIP/2.0/UDP %s:%d;branch=%s\r\n"
klauss 121:ee02790d00b7 236 "From: %d <sip:%d@%s:%d>;tag=%s\r\n"
klauss 121:ee02790d00b7 237 "To: %d <sip:%d@%s:%d>\r\n"
klauss 121:ee02790d00b7 238 "Call-ID: %s\r\n"
klauss 119:ee6a53069455 239 "CSeq: %d REGISTER\r\n"
klauss 119:ee6a53069455 240 "Max-Forwards: 70\r\n"
klauss 121:ee02790d00b7 241 "Contact: %d <sip:%d@%s:%d>;expires=270\r\n"
klauss 119:ee6a53069455 242 "User-Agent: VZtech/pabxdriver-%s\r\n"
klauss 119:ee6a53069455 243 "Content-Length: 0\r\n"
klauss 121:ee02790d00b7 244 "%s\r\n\r\n",
klauss 121:ee02790d00b7 245 server_ip, server_port, my_ip, my_port, branch,
klauss 121:ee02790d00b7 246 my_ext, my_ext, server_ip, server_port, tag,
klauss 121:ee02790d00b7 247 my_ext, my_ext, server_ip, server_port,
klauss 121:ee02790d00b7 248 callid,
klauss 121:ee02790d00b7 249 get_cseq(),
klauss 121:ee02790d00b7 250 my_ext, my_ext, my_ip, server_port,
klauss 121:ee02790d00b7 251 SVNREV,
klauss 121:ee02790d00b7 252 SIP_ALLOW
klauss 119:ee6a53069455 253 );
klauss 121:ee02790d00b7 254 return ( buffer );
klauss 121:ee02790d00b7 255 }
klauss 121:ee02790d00b7 256
klauss 121:ee02790d00b7 257 char * Sip::build_invite_package ( int * cseq, const bool retry )
klauss 121:ee02790d00b7 258 {
klauss 121:ee02790d00b7 259 char header [ SIP_MAXMSGSIZE ];
klauss 121:ee02790d00b7 260 char body [ SIP_MAXMSGSIZE ];
klauss 121:ee02790d00b7 261 char branch [ SIP_MAXFIELDSIZE ];
klauss 121:ee02790d00b7 262 char tag [ SIP_MAXFIELDSIZE ];
klauss 121:ee02790d00b7 263 char callid [ SIP_MAXFIELDSIZE ];
klauss 121:ee02790d00b7 264 char callbox_string[ CALLBOX_STRING_SIZE ];
klauss 119:ee6a53069455 265
klauss 121:ee02790d00b7 266 int snprintf_ret = snprintf ( callbox_string, CALLBOX_STRING_SIZE - 1, "%i", this->my_ext );
klauss 0:4d17cd9c8f9d 267
klauss 121:ee02790d00b7 268 if ( snprintf_ret == CALLBOX_STRING_SIZE ) callbox_string [ CALLBOX_STRING_SIZE - 1 ] = '\0';
klauss 114:472502b31a12 269
klauss 119:ee6a53069455 270 if ( !retry )
klauss 114:472502b31a12 271 {
klauss 119:ee6a53069455 272 *cseq = get_cseq();
klauss 119:ee6a53069455 273 last_cseq = *cseq;
klauss 119:ee6a53069455 274
klauss 121:ee02790d00b7 275 fill_random16h ( branch );
klauss 121:ee02790d00b7 276 strcpy ( last_branch, branch );
klauss 119:ee6a53069455 277
klauss 121:ee02790d00b7 278 fill_random ( tag, 18 );
klauss 121:ee02790d00b7 279 strcpy ( last_invite_tag, tag );
klauss 119:ee6a53069455 280
klauss 121:ee02790d00b7 281 fill_random16h ( callid );
klauss 121:ee02790d00b7 282 strcpy ( last_invite_callid, callid );
klauss 119:ee6a53069455 283
klauss 119:ee6a53069455 284 this->my_rtp_port = fill_random_rtp_port ();
klauss 114:472502b31a12 285 }
klauss 114:472502b31a12 286 else
klauss 114:472502b31a12 287 {
klauss 119:ee6a53069455 288 *cseq = last_cseq;
klauss 119:ee6a53069455 289
klauss 121:ee02790d00b7 290 strcpy ( branch, last_branch );
klauss 119:ee6a53069455 291
klauss 121:ee02790d00b7 292 strcpy ( tag, last_invite_tag );
klauss 119:ee6a53069455 293
klauss 121:ee02790d00b7 294 strcpy ( callid, last_invite_callid );
klauss 114:472502b31a12 295 }
klauss 119:ee6a53069455 296
klauss 121:ee02790d00b7 297 if ( debug_invite ) debug_msg ("[%d] \r\nbranch :: %s\r\ntag :: %s\r\ncallid :: %s", this->my_ext, branch, tag, callid );
klauss 119:ee6a53069455 298
klauss 121:ee02790d00b7 299 if ( debug_rtp || debug_invite ) debug_msg ("[%d] Invite PKG rtp port ( %d )", this->my_ext, this->my_rtp_port );
klauss 119:ee6a53069455 300
klauss 119:ee6a53069455 301 snprintf( header, SIP_MAXMSGSIZE,
klauss 119:ee6a53069455 302 "INVITE sip:%i@%s:%i SIP/2.0\r\n"
klauss 119:ee6a53069455 303 "Via: SIP/2.0/UDP %s:%i;branch=%s\r\n"
klauss 119:ee6a53069455 304 "From: %s <sip:%i@%s:%i>;tag=%s\r\n"
klauss 119:ee6a53069455 305 "To: <sip:%i@%s:%i>\r\n"
klauss 119:ee6a53069455 306 "Call-ID: %s@%s\r\n"
klauss 119:ee6a53069455 307 "CSeq: %i INVITE\r\n"
klauss 119:ee6a53069455 308 "Contact: %i <sip:%i@%s:%i>\r\n"
klauss 119:ee6a53069455 309 "Max-Forwards: 20\r\n"
klauss 119:ee6a53069455 310 "User-Agent: VZtech/pabxdriver-%s\r\n"
klauss 119:ee6a53069455 311 "Expires: 71\r\n"
klauss 119:ee6a53069455 312 "%s\r\n"
klauss 119:ee6a53069455 313 "Content-Type: application/sdp\r\n",
klauss 119:ee6a53069455 314 this->peer_ext, this->server_ip, this->server_port,
klauss 119:ee6a53069455 315 this->my_ip, this->my_port, branch,
klauss 119:ee6a53069455 316 callbox_string, this->my_ext, this->server_ip, this->server_port, tag,
klauss 119:ee6a53069455 317 this->peer_ext, this->server_ip, this->server_port,
klauss 119:ee6a53069455 318 callid, this->my_ip,
klauss 119:ee6a53069455 319 *cseq,
klauss 119:ee6a53069455 320 this->my_ext, this->my_ext, this->my_ip, this->my_port,
klauss 119:ee6a53069455 321 SVNREV,
klauss 119:ee6a53069455 322 SIP_ALLOW
klauss 119:ee6a53069455 323 );
klauss 119:ee6a53069455 324
klauss 119:ee6a53069455 325 snprintf( body, SIP_MAXMSGSIZE,
klauss 119:ee6a53069455 326 "v=0\r\no=- 7377 18176 IN IP4 %s\r\n"
klauss 119:ee6a53069455 327 "s=-\r\n"
klauss 119:ee6a53069455 328 "c=IN IP4 %s\r\n"
klauss 119:ee6a53069455 329 "t=0 0\r\n"
klauss 119:ee6a53069455 330 "i=UDP %i\r\n"
klauss 119:ee6a53069455 331 "m=audio %i RTP/AVP 8 101\r\n"
klauss 119:ee6a53069455 332 "a=rtpmap:8 PCMA/8000/1\r\n"
klauss 119:ee6a53069455 333 "a=rtpmap:101 telephone-event/8000\r\n"
klauss 119:ee6a53069455 334 "a=fmtp: 101 0-11",
klauss 119:ee6a53069455 335 this->my_ip,
klauss 119:ee6a53069455 336 this->my_ip,
klauss 119:ee6a53069455 337 this->my_rtp_port,
klauss 119:ee6a53069455 338 this->my_rtp_port
klauss 119:ee6a53069455 339 );
klauss 119:ee6a53069455 340
klauss 121:ee02790d00b7 341 strcpy( this->buffer, header );
klauss 121:ee02790d00b7 342
klauss 121:ee02790d00b7 343 char content_Length_msg [ CONTENT_LENGTH_MSG_SIZE ];
klauss 119:ee6a53069455 344
klauss 121:ee02790d00b7 345 snprintf_ret = snprintf ( content_Length_msg, CONTENT_LENGTH_MSG_SIZE, "Content-Length: %d\r\n\r\n", strlen ( body ) );
klauss 121:ee02790d00b7 346 if ( snprintf_ret == CONTENT_LENGTH_MSG_SIZE ) content_Length_msg [ CONTENT_LENGTH_MSG_SIZE - 1 ] = '\0';
klauss 121:ee02790d00b7 347 strcat( this->buffer, content_Length_msg );
klauss 121:ee02790d00b7 348
klauss 121:ee02790d00b7 349 strcat( this->buffer, body );
klauss 121:ee02790d00b7 350
klauss 121:ee02790d00b7 351 if ( debug_invite ) debug_msg ("[%d] strlen( header [%d] ) | strlen( body [%d] ) | ( h + b [%d])", this->my_ext, strlen( header ),strlen( body ), strlen( header ) + strlen( body ) );
klauss 121:ee02790d00b7 352
klauss 121:ee02790d00b7 353 return( this->buffer );
klauss 0:4d17cd9c8f9d 354 }
klauss 0:4d17cd9c8f9d 355
klauss 121:ee02790d00b7 356 char * Sip::build_bye_package ( void )
klauss 121:ee02790d00b7 357 {
klauss 0:4d17cd9c8f9d 358 char branch[SIP_MAXFIELDSIZE];
klauss 0:4d17cd9c8f9d 359 char tag[SIP_MAXFIELDSIZE];
klauss 0:4d17cd9c8f9d 360 fill_random16h(branch);
klauss 0:4d17cd9c8f9d 361 fill_random(tag,18);
klauss 0:4d17cd9c8f9d 362
klauss 121:ee02790d00b7 363 snprintf(
klauss 121:ee02790d00b7 364 this->buffer, sizeof ( this->buffer ) - 1,
klauss 121:ee02790d00b7 365 "BYE sip:%i@%s:%i SIP/2.0\r\n"
klauss 121:ee02790d00b7 366 "Via: SIP/2.0/UDP %s:%i;branch=%s\r\n"
klauss 121:ee02790d00b7 367 "From: %i <sip:%i@%s:%i>;tag=%s\r\n"
klauss 121:ee02790d00b7 368 "To: <sip:%i@%s:%i>;tag=%s\r\n"
klauss 121:ee02790d00b7 369 "Call-ID: %s@%s\r\n"
klauss 121:ee02790d00b7 370 "CSeq: %i BYE\r\n"
klauss 121:ee02790d00b7 371 "Max-Forwards: 70\r\n"
klauss 121:ee02790d00b7 372 "User-Agent: VZtech/pabxdriver-%s\r\n"
klauss 121:ee02790d00b7 373 "Content-Length: 0\r\n\r\n",
klauss 121:ee02790d00b7 374 this->peer_ext, this->server_ip, this->server_port,
klauss 121:ee02790d00b7 375 this->my_ip, this->my_port, branch,
klauss 121:ee02790d00b7 376 this->my_ext, this->my_ext, this->server_ip, this->server_port, last_invite_tag,
klauss 121:ee02790d00b7 377 this->peer_ext, this->server_ip, this->server_port, tag,
klauss 121:ee02790d00b7 378 last_invite_callid, this->my_ip,
klauss 121:ee02790d00b7 379 get_cseq(),
klauss 121:ee02790d00b7 380 SVNREV
klauss 121:ee02790d00b7 381 );
klauss 121:ee02790d00b7 382
klauss 0:4d17cd9c8f9d 383 return( buffer );
klauss 0:4d17cd9c8f9d 384 }
klauss 121:ee02790d00b7 385 char * Sip::build_ack_package ( char * buffer, const unsigned char * orig )
klauss 121:ee02790d00b7 386 {
klauss 0:4d17cd9c8f9d 387 char to[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 388 char from[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 389 char callid[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 390 char via[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 391 char branch[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 392 char cseq[ SIP_MAXFIELDSIZE ];
klauss 121:ee02790d00b7 393
klauss 0:4d17cd9c8f9d 394 if( decode_gettag( orig, "to: ", to ) == 0) {
klauss 0:4d17cd9c8f9d 395 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 396 return NULL;
klauss 0:4d17cd9c8f9d 397 }
klauss 0:4d17cd9c8f9d 398 if( decode_gettag( orig, "from: ", from ) == 0) {
klauss 0:4d17cd9c8f9d 399 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 400 return NULL;
klauss 0:4d17cd9c8f9d 401 }
klauss 0:4d17cd9c8f9d 402 if( decode_gettag( orig, "call-id: ", callid ) == 0) {
klauss 0:4d17cd9c8f9d 403 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 404 return NULL;
klauss 0:4d17cd9c8f9d 405 }
klauss 0:4d17cd9c8f9d 406 decode_branch( orig, branch );
klauss 0:4d17cd9c8f9d 407 decode_cseq( orig, cseq );
klauss 121:ee02790d00b7 408
klauss 0:4d17cd9c8f9d 409 if( strlen( via ) > 6 ) {
klauss 0:4d17cd9c8f9d 410 if( strcasecmp( ";rport", via+strlen( via )-6) == 0) {
klauss 0:4d17cd9c8f9d 411 via[strlen(via)-6] = 0;
klauss 0:4d17cd9c8f9d 412 }
klauss 0:4d17cd9c8f9d 413 }
klauss 121:ee02790d00b7 414
klauss 121:ee02790d00b7 415
klauss 121:ee02790d00b7 416 snprintf ( buffer, SIP_MAXMSGSIZE -1,
klauss 121:ee02790d00b7 417 "ACK sip:%i@%s:%i SIP/2.0\r\n"
klauss 121:ee02790d00b7 418 "Via: SIP/2.0/UDP %s:%i;branch=%s\r\n"
klauss 121:ee02790d00b7 419 "From: %s\r\n"
klauss 121:ee02790d00b7 420 "To: %s\r\n"
klauss 121:ee02790d00b7 421 "Call-ID: %s\r\n"
klauss 121:ee02790d00b7 422 "CSeq: %s ACK\r\n"
klauss 121:ee02790d00b7 423 "Max-Forwards: 70\r\n"
klauss 121:ee02790d00b7 424 "Contact: %i <sip:%i@%s:%i>\r\n"
klauss 121:ee02790d00b7 425 "User-Agent: VZtech/pabxdriver-%s\r\n"
klauss 121:ee02790d00b7 426 "Content-Length: 0\r\n\r\n",
klauss 121:ee02790d00b7 427 this->peer_ext, this->server_ip, this->server_port,
klauss 121:ee02790d00b7 428 this->my_ip, this->my_port, branch,
klauss 121:ee02790d00b7 429 from,
klauss 121:ee02790d00b7 430 to,
klauss 121:ee02790d00b7 431 callid,
klauss 121:ee02790d00b7 432 cseq,
klauss 121:ee02790d00b7 433 this->my_ext, this->my_ext, this->my_ip, this->my_port,
klauss 121:ee02790d00b7 434 SVNREV
klauss 121:ee02790d00b7 435 );
klauss 121:ee02790d00b7 436
klauss 0:4d17cd9c8f9d 437 return( buffer );
klauss 0:4d17cd9c8f9d 438 }
klauss 121:ee02790d00b7 439
klauss 121:ee02790d00b7 440 char * Sip::build_reply_package ( char * buffer, const unsigned char * orig )
klauss 121:ee02790d00b7 441 {
klauss 0:4d17cd9c8f9d 442 char to[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 443 char from[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 444 char callid[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 445 char cseq[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 446 char via[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 447 char tag[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 448
klauss 0:4d17cd9c8f9d 449 if( decode_gettag( orig, "to: ", to ) == 0) {
klauss 0:4d17cd9c8f9d 450 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 451 return NULL;
klauss 0:4d17cd9c8f9d 452 }
klauss 0:4d17cd9c8f9d 453 if( decode_gettag( orig, "from: ", from ) == 0) {
klauss 0:4d17cd9c8f9d 454 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 455 return NULL;
klauss 0:4d17cd9c8f9d 456 }
klauss 0:4d17cd9c8f9d 457 if( decode_gettag( orig, "call-id: ", callid ) == 0 ) {
klauss 0:4d17cd9c8f9d 458 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 459 return NULL;
klauss 0:4d17cd9c8f9d 460 }
klauss 0:4d17cd9c8f9d 461 if( decode_gettag( orig, "cseq: ", cseq) == 0 ) {
klauss 0:4d17cd9c8f9d 462 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 463 return NULL;
klauss 0:4d17cd9c8f9d 464 }
klauss 0:4d17cd9c8f9d 465 if( decode_gettag( orig, "via: ", via) == 0 ) {
klauss 0:4d17cd9c8f9d 466 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 467 return NULL;
klauss 0:4d17cd9c8f9d 468 }
klauss 0:4d17cd9c8f9d 469
klauss 0:4d17cd9c8f9d 470 if (strlen(via) > 6) {
klauss 0:4d17cd9c8f9d 471 if (strcasecmp(";rport",via+strlen(via)-6)==0) {
klauss 0:4d17cd9c8f9d 472 via[strlen(via)-6] = 0;
klauss 0:4d17cd9c8f9d 473 }
klauss 0:4d17cd9c8f9d 474 }
klauss 0:4d17cd9c8f9d 475
klauss 121:ee02790d00b7 476 fill_random ( tag, 18 );
klauss 0:4d17cd9c8f9d 477
klauss 121:ee02790d00b7 478 snprintf(
klauss 121:ee02790d00b7 479 buffer, SIP_MAXMSGSIZE -1,
klauss 121:ee02790d00b7 480 "SIP/2.0 200 OK\r\n"
klauss 121:ee02790d00b7 481 "To: %s;tag=%s\r\n"
klauss 121:ee02790d00b7 482 "From: %s\r\n"
klauss 121:ee02790d00b7 483 "Call-ID: %s\r\n"
klauss 121:ee02790d00b7 484 "CSeq: %s\r\n"
klauss 121:ee02790d00b7 485 "Via: %s\r\n"
klauss 121:ee02790d00b7 486 "Server: VZtech/pabxdriver-%s\r\n"
klauss 121:ee02790d00b7 487 "Content-Length: 0\r\n"
klauss 121:ee02790d00b7 488 "%s\r\n\r\n",
klauss 121:ee02790d00b7 489 to, tag,
klauss 121:ee02790d00b7 490 from,
klauss 121:ee02790d00b7 491 callid,
klauss 121:ee02790d00b7 492 cseq,
klauss 121:ee02790d00b7 493 via,
klauss 121:ee02790d00b7 494 SVNREV,
klauss 121:ee02790d00b7 495 SIP_ALLOW
klauss 121:ee02790d00b7 496 );
klauss 0:4d17cd9c8f9d 497
klauss 0:4d17cd9c8f9d 498 return( buffer );
klauss 0:4d17cd9c8f9d 499 }
klauss 121:ee02790d00b7 500
klauss 121:ee02790d00b7 501 char * Sip::fill_random16h ( char * buffer )
klauss 121:ee02790d00b7 502 {
klauss 0:4d17cd9c8f9d 503 fill_random( buffer, 16 );
klauss 0:4d17cd9c8f9d 504 buffer[ 7 ] = '-';
klauss 0:4d17cd9c8f9d 505 return( buffer );
klauss 0:4d17cd9c8f9d 506 }
klauss 0:4d17cd9c8f9d 507
klauss 121:ee02790d00b7 508 char * Sip::fill_random ( char * buffer, const int size )
klauss 121:ee02790d00b7 509 {
klauss 0:4d17cd9c8f9d 510 static uint16_t seed = time( NULL );
klauss 0:4d17cd9c8f9d 511 seed += 1;
klauss 0:4d17cd9c8f9d 512 srand( seed );
klauss 0:4d17cd9c8f9d 513
klauss 121:ee02790d00b7 514 for( int i = 0; i < size - 1; i++ )
klauss 121:ee02790d00b7 515 {
klauss 0:4d17cd9c8f9d 516 buffer[ i ] = fill_random_aux[ rand() & 0x3f ];
klauss 0:4d17cd9c8f9d 517 }
klauss 100:09a23fcd3bdf 518
klauss 100:09a23fcd3bdf 519 buffer[ size - 1 ] = 0;
klauss 0:4d17cd9c8f9d 520 return( buffer );
klauss 0:4d17cd9c8f9d 521 }
klauss 0:4d17cd9c8f9d 522
klauss 121:ee02790d00b7 523 int Sip::get_cseq ( void )
klauss 121:ee02790d00b7 524 {
klauss 0:4d17cd9c8f9d 525 static unsigned int cseq = 0;
klauss 121:ee02790d00b7 526 if( cseq == 0 )
klauss 121:ee02790d00b7 527 {
klauss 0:4d17cd9c8f9d 528 /* initial value, random number */
klauss 121:ee02790d00b7 529 cseq = rand ();
klauss 0:4d17cd9c8f9d 530 cseq &= 0x7fff;
klauss 0:4d17cd9c8f9d 531 }
klauss 0:4d17cd9c8f9d 532 cseq++;
klauss 0:4d17cd9c8f9d 533 cseq &= 0x7fff;
klauss 121:ee02790d00b7 534 if ( cseq == 0 ) cseq++;
klauss 0:4d17cd9c8f9d 535 return cseq;
klauss 0:4d17cd9c8f9d 536 }
klauss 0:4d17cd9c8f9d 537
klauss 121:ee02790d00b7 538 char * Sip::decode_cseq ( const unsigned char * package, char * cseq )
klauss 121:ee02790d00b7 539 {
klauss 121:ee02790d00b7 540 char pkg[ SIP_MAXMSGSIZE ], cs[ SIP_MAXMSGSIZE ];
klauss 121:ee02790d00b7 541
klauss 121:ee02790d00b7 542 if( decode_gettag ( package, "cseq: ", pkg ) != 0)
klauss 121:ee02790d00b7 543 {
klauss 0:4d17cd9c8f9d 544 int i = 0;
klauss 121:ee02790d00b7 545 strcpy ( cs, pkg );
klauss 121:ee02790d00b7 546 while ( ( cs [ i ] != 0 ) && ( cs [ i ] != ' ' ) ) i++;
klauss 121:ee02790d00b7 547 cs [ i ] = 0;
klauss 121:ee02790d00b7 548 strcpy ( cseq, cs );
klauss 0:4d17cd9c8f9d 549 } else {
klauss 121:ee02790d00b7 550 cseq [ 0 ] = 0;
klauss 0:4d17cd9c8f9d 551 }
klauss 121:ee02790d00b7 552 return ( cseq );
klauss 0:4d17cd9c8f9d 553 }
klauss 0:4d17cd9c8f9d 554
klauss 121:ee02790d00b7 555 char * Sip::decode_branch ( const unsigned char * package, char * branch )
klauss 121:ee02790d00b7 556 {
klauss 121:ee02790d00b7 557 char pkg[ SIP_MAXMSGSIZE ];
klauss 121:ee02790d00b7 558
klauss 121:ee02790d00b7 559 if ( decode_gettag ( package, "branch=", pkg ) != 0 )
klauss 121:ee02790d00b7 560 {
klauss 0:4d17cd9c8f9d 561 int i = 0;
klauss 121:ee02790d00b7 562 strcpy ( branch, pkg );
klauss 121:ee02790d00b7 563 while ( ( branch [ i ] != 0 ) && ( branch [ i ] != ';' ) ) i++;
klauss 121:ee02790d00b7 564 branch [ i ] = 0;
klauss 0:4d17cd9c8f9d 565 } else {
klauss 121:ee02790d00b7 566 branch [ 0 ] = 0;
klauss 0:4d17cd9c8f9d 567 }
klauss 121:ee02790d00b7 568
klauss 121:ee02790d00b7 569 return ( branch );
klauss 0:4d17cd9c8f9d 570 }
klauss 121:ee02790d00b7 571
klauss 121:ee02790d00b7 572 int Sip::decode_gettag ( const unsigned char * package, const char * tag, char * out )
klauss 121:ee02790d00b7 573 {
klauss 121:ee02790d00b7 574 int cmpsize = strlen ( tag );
klauss 121:ee02790d00b7 575 int size = strlen ( ( char * ) package ) - cmpsize;
klauss 121:ee02790d00b7 576
klauss 121:ee02790d00b7 577 for ( int i = 0; i < size; i++ )
klauss 121:ee02790d00b7 578 {
klauss 121:ee02790d00b7 579 if ( strncasecmp( tag, ( char * ) package + i, cmpsize ) == 0 )
klauss 121:ee02790d00b7 580 {
klauss 0:4d17cd9c8f9d 581 char * s;
klauss 121:ee02790d00b7 582 s = ( char * ) package + i + cmpsize;
klauss 0:4d17cd9c8f9d 583 register int j = 0;
klauss 121:ee02790d00b7 584 while ( ( s [ j ] != '\r' ) && ( s [ j ] != '\n' ) ) j++;
klauss 121:ee02790d00b7 585 strncpy ( out, s, j ); // copy string to output
klauss 121:ee02790d00b7 586 out [ j ] = 0; // terminate string
klauss 0:4d17cd9c8f9d 587 return 1; // found
klauss 0:4d17cd9c8f9d 588 }
klauss 0:4d17cd9c8f9d 589 }
klauss 121:ee02790d00b7 590
klauss 0:4d17cd9c8f9d 591 return 0; // not found
klauss 0:4d17cd9c8f9d 592 }
klauss 121:ee02790d00b7 593
klauss 121:ee02790d00b7 594 int Sip::get_my_rtp_port ( void ) { return this->my_rtp_port; }
klauss 121:ee02790d00b7 595
klauss 121:ee02790d00b7 596 int Sip::fill_random_rtp_port ( void )
klauss 114:472502b31a12 597 {
klauss 112:6ae726539ab9 598 static uint16_t port = 0;
klauss 112:6ae726539ab9 599 port += 2;
klauss 112:6ae726539ab9 600 port &= 0x7fe; // 0 to 2046, always even
klauss 112:6ae726539ab9 601 return port + 16384;
klauss 0:4d17cd9c8f9d 602 }
klauss 119:ee6a53069455 603
klauss 121:ee02790d00b7 604 void Sip::set_server_port ( const int new_server_port ) { this->server_port = new_server_port; }
klauss 121:ee02790d00b7 605
klauss 121:ee02790d00b7 606 void Sip::set_server_ext ( const int new_server_ext ) { this->peer_ext = new_server_ext; }
klauss 121:ee02790d00b7 607
klauss 121:ee02790d00b7 608 void Sip::set_server_ip ( const char * new_server_ip )
klauss 121:ee02790d00b7 609 {
klauss 121:ee02790d00b7 610 strncpy( this->server_ip, new_server_ip, 20 );
klauss 0:4d17cd9c8f9d 611 this->server_ip[19] = 0;
klauss 0:4d17cd9c8f9d 612 }
klauss 0:4d17cd9c8f9d 613
klauss 0:4d17cd9c8f9d 614 /* Retorna
klauss 0:4d17cd9c8f9d 615 = 0 :: ok
klauss 0:4d17cd9c8f9d 616 < 0 :: tive problemas
klauss 0:4d17cd9c8f9d 617 > 0 :: devo remover essa call do vetor de calls
klauss 0:4d17cd9c8f9d 618 */
klauss 121:ee02790d00b7 619 int Sip::listen_SIP_server ( void )
klauss 121:ee02790d00b7 620 {
klauss 91:c2a86b1f8aaa 621 int ret = listen_SIP_server_return;
klauss 91:c2a86b1f8aaa 622 listen_SIP_server_return = 0;
klauss 91:c2a86b1f8aaa 623 return ret;
klauss 0:4d17cd9c8f9d 624 }
klauss 0:4d17cd9c8f9d 625
klauss 121:ee02790d00b7 626 void Sip::set_ext ( const int ext ) { my_ext = ext; }
klauss 0:4d17cd9c8f9d 627
klauss 121:ee02790d00b7 628 void Sip::set_port ( const int port ) { my_port = port; }
klauss 0:4d17cd9c8f9d 629
klauss 119:ee6a53069455 630 void Sip::send_bye ( void )
klauss 119:ee6a53069455 631 {
klauss 121:ee02790d00b7 632 int send = sock.sendTo( sip_server, build_bye_package (), strlen( this->buffer ) );
klauss 114:472502b31a12 633
klauss 121:ee02790d00b7 634 if( debug_sip ) debug_msg( "[%d] sizeof( bye pkg ) :: %d", this->my_ext, strlen( this->buffer ) );
klauss 81:3656f00ab3db 635
klauss 119:ee6a53069455 636 if( send != strlen( this->buffer ) )
klauss 119:ee6a53069455 637 {
klauss 119:ee6a53069455 638 if( debug_reconnect ) debug_msg("[%d] Reconnect SIP -- BYE, %d, %d", this->my_ext, send, strlen( this->buffer ) );
klauss 119:ee6a53069455 639 __reconnect__();
klauss 119:ee6a53069455 640 miss_sip_bye_send_pkg++;
klauss 113:db67ae00550e 641 }
klauss 0:4d17cd9c8f9d 642 }
klauss 0:4d17cd9c8f9d 643
klauss 121:ee02790d00b7 644 int Sip::get_status ( void ) { return this->status; }
klauss 121:ee02790d00b7 645
klauss 121:ee02790d00b7 646 void Sip::sip_set_status ( const uint8_t status ) { this->status = status; }
klauss 78:1353744f01e1 647
klauss 121:ee02790d00b7 648 int Sip::get_socket_fd ( void ) { return sock.get_fd (); }
klauss 81:3656f00ab3db 649
klauss 121:ee02790d00b7 650 int Sip::udp_incomming_pkg ( void )
klauss 121:ee02790d00b7 651 {
klauss 91:c2a86b1f8aaa 652 Endpoint from;
klauss 91:c2a86b1f8aaa 653
klauss 121:ee02790d00b7 654 int length = sock.receiveFrom ( from, buffer, sizeof( buffer ) );
klauss 91:c2a86b1f8aaa 655
klauss 121:ee02790d00b7 656 if ( memcmp( ( ( u8_t * )( &(from._remoteHost) ) ) + 2, ( ( u8_t * )( &(sip_server._remoteHost) ) ) + 2, 6 ) != 0 ) return 0;
klauss 91:c2a86b1f8aaa 657
klauss 121:ee02790d00b7 658 if ( length == -1 )
klauss 119:ee6a53069455 659 {
klauss 121:ee02790d00b7 660 if ( debug_reconnect ) debug_msg ("[%d] Reconnect SIP -- UDP Incomming", get_ext () );
klauss 119:ee6a53069455 661 __reconnect__();
klauss 119:ee6a53069455 662 miss_sip_inc_pkg++;
klauss 119:ee6a53069455 663 }
klauss 91:c2a86b1f8aaa 664
klauss 121:ee02790d00b7 665 if ( length > 0 )
klauss 121:ee02790d00b7 666 {
klauss 121:ee02790d00b7 667 if ( sizeof( buffer ) > length ) buffer[ length ] = 0;
klauss 91:c2a86b1f8aaa 668
klauss 91:c2a86b1f8aaa 669 int sip_response = -1;
klauss 91:c2a86b1f8aaa 670
klauss 91:c2a86b1f8aaa 671 // faster than atoi() (:
klauss 121:ee02790d00b7 672 if ( buffer[ 7 ] == ' ' || buffer[ 11 ] == ' ' ){
klauss 91:c2a86b1f8aaa 673 sip_response = ( buffer[ 8 ] - '0' ) * 100 + ( buffer[ 9 ] - '0' ) * 10 + ( buffer[ 10 ] - '0' );
klauss 91:c2a86b1f8aaa 674 }
klauss 91:c2a86b1f8aaa 675
klauss 121:ee02790d00b7 676 if ( ( status == sip_trying ) || ( status == sip_ringing ) || ( status == sip_waiting_trying ) || ( status == sip_on_call ) )
klauss 119:ee6a53069455 677 {
klauss 121:ee02790d00b7 678 if ( sip_response == 200 ){ // Ok
klauss 91:c2a86b1f8aaa 679 char *ref = strstr( buffer, "audio" );
klauss 121:ee02790d00b7 680 if ( debug_invite ) debug_msg("[%d] udp_incomming_pkg -- ok", this->my_ext );
klauss 121:ee02790d00b7 681 if ( ref != NULL ){
klauss 121:ee02790d00b7 682 if ( drop_this_amount_of_ack_to_ast ) drop_this_amount_of_ack_to_ast--;
klauss 119:ee6a53069455 683
klauss 121:ee02790d00b7 684 if ( drop_this_amount_of_ack_to_ast )
klauss 114:472502b31a12 685 {
klauss 121:ee02790d00b7 686 debug_msg ("[%d] Droped ok pkg received from ast (%d)", this->my_ext, drop_this_amount_of_ack_to_ast );
klauss 114:472502b31a12 687 return -71;
klauss 114:472502b31a12 688 }
klauss 114:472502b31a12 689
klauss 91:c2a86b1f8aaa 690 ref += 6; // audio
klauss 91:c2a86b1f8aaa 691 ref = strtok( ref, " ");
klauss 121:ee02790d00b7 692 if ( call == NULL ){
klauss 121:ee02790d00b7 693 call = new VZ_call ( this->my_ext, this->my_rtp_port, this->peer_ext, atoi( ref ) );
klauss 121:ee02790d00b7 694 if ( debug_rtp ) debug_msg ("[%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 );
klauss 121:ee02790d00b7 695 if ( call == NULL ) memory_is_over = true;
klauss 91:c2a86b1f8aaa 696 }
klauss 121:ee02790d00b7 697 char ans[ SIP_MAXMSGSIZE ];
klauss 91:c2a86b1f8aaa 698 build_ack_package( ans, ( unsigned char *)buffer );
klauss 91:c2a86b1f8aaa 699
klauss 119:ee6a53069455 700 int send = 0;
klauss 104:62646ef786a3 701
klauss 114:472502b31a12 702 if ( drop_ack_pkg )
klauss 104:62646ef786a3 703 {
klauss 119:ee6a53069455 704 debug_msg("[%d] Droped ack pkt to ast", this->my_ext );
klauss 114:472502b31a12 705 }
klauss 114:472502b31a12 706 else
klauss 114:472502b31a12 707 {
klauss 119:ee6a53069455 708 send = sock.sendTo( sip_server, ans, strlen( ans ) );
klauss 119:ee6a53069455 709
klauss 121:ee02790d00b7 710 if ( send != strlen( ans ) )
klauss 119:ee6a53069455 711 {
klauss 121:ee02790d00b7 712 if ( debug_reconnect ) debug_msg ("[%d] Reconnect SIP -- Ok -- Call mode on", this->my_ext );
klauss 119:ee6a53069455 713 __reconnect__();
klauss 119:ee6a53069455 714 miss_sip_ok_send_pkg++;
klauss 119:ee6a53069455 715 }
klauss 104:62646ef786a3 716 }
klauss 91:c2a86b1f8aaa 717
klauss 121:ee02790d00b7 718 if ( debug_invite ) debug_msg ("[%d] Call alocada -- sizeof( ack ) :: %d - strlen( ans ):: %d", this->my_ext, send, strlen( ans ) );
klauss 119:ee6a53069455 719 sip_set_status ( sip_on_call );
klauss 91:c2a86b1f8aaa 720 }
klauss 91:c2a86b1f8aaa 721 }
klauss 91:c2a86b1f8aaa 722 }
klauss 121:ee02790d00b7 723 if ( ( status == sip_trying ) || ( status == sip_ringing ) )
klauss 121:ee02790d00b7 724 {
klauss 121:ee02790d00b7 725 if ( sip_response >= 400 && sip_response < 700 )
klauss 121:ee02790d00b7 726 {
klauss 121:ee02790d00b7 727 if ( debug_invite ) {
klauss 91:c2a86b1f8aaa 728 buffer[ 11 ] = 0;
klauss 121:ee02790d00b7 729 if ( debug_invite ) debug_msg ("[%d] Busy Here :: %s", this->my_ext, buffer + 8 );
klauss 91:c2a86b1f8aaa 730 }
klauss 91:c2a86b1f8aaa 731 send_bye();
klauss 119:ee6a53069455 732 sip_set_status ( sip_busy );
klauss 121:ee02790d00b7 733 return ( NULL );
klauss 121:ee02790d00b7 734 }
klauss 121:ee02790d00b7 735 else if ( sip_response == 183 ) // Session in Progress
klauss 121:ee02790d00b7 736 {
klauss 121:ee02790d00b7 737 char *ref = strstr ( buffer, "audio" );
klauss 121:ee02790d00b7 738 if ( ref != NULL )
klauss 121:ee02790d00b7 739 {
klauss 91:c2a86b1f8aaa 740 ref += 6; // strlen( "audio" ) == 6
klauss 91:c2a86b1f8aaa 741 ref = strtok( ref, " ");
klauss 121:ee02790d00b7 742 if ( call == NULL )
klauss 121:ee02790d00b7 743 {
klauss 121:ee02790d00b7 744 this->call = new VZ_call ( this->my_ext, this->my_rtp_port, this->peer_ext, atoi( ref ) );
klauss 121:ee02790d00b7 745 if ( debug_rtp ) debug_msg ("[%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 );
klauss 121:ee02790d00b7 746 if ( call == NULL ) memory_is_over = true;
klauss 91:c2a86b1f8aaa 747 }
klauss 91:c2a86b1f8aaa 748 waiting = true;
klauss 91:c2a86b1f8aaa 749 }
klauss 91:c2a86b1f8aaa 750 }
klauss 91:c2a86b1f8aaa 751 }
klauss 121:ee02790d00b7 752
klauss 121:ee02790d00b7 753 if ( status == sip_trying ){
klauss 121:ee02790d00b7 754 if ( sip_response == 180 ){
klauss 121:ee02790d00b7 755 if ( debug_invite ) debug_msg ("[%d] ringing", this->my_ext );
klauss 119:ee6a53069455 756 sip_set_status ( sip_ringing );
klauss 91:c2a86b1f8aaa 757 }
klauss 91:c2a86b1f8aaa 758 }
klauss 121:ee02790d00b7 759
klauss 121:ee02790d00b7 760 if ( status == sip_waiting_trying ){
klauss 121:ee02790d00b7 761 if ( sip_response == 100 ){
klauss 121:ee02790d00b7 762 if ( debug_invite ) debug_msg ("[%d] trying", this->my_ext )
klauss 119:ee6a53069455 763 sip_set_status ( sip_trying );
klauss 91:c2a86b1f8aaa 764 }
klauss 91:c2a86b1f8aaa 765 }
klauss 121:ee02790d00b7 766
klauss 121:ee02790d00b7 767 if ( status == sip_on_call )
klauss 121:ee02790d00b7 768 {
klauss 121:ee02790d00b7 769 if ( !( strncasecmp( buffer, "bye ", 4 ) ) )
klauss 121:ee02790d00b7 770 {
klauss 91:c2a86b1f8aaa 771 char ans[ 2000 ];
klauss 121:ee02790d00b7 772 build_reply_package ( ans, ( unsigned char * ) buffer );
klauss 91:c2a86b1f8aaa 773
klauss 121:ee02790d00b7 774 int send = sock.sendTo ( sip_server, ans, strlen ( ans ) );
klauss 121:ee02790d00b7 775 if ( send != strlen( ans ) )
klauss 119:ee6a53069455 776 {
klauss 121:ee02790d00b7 777 if ( debug_reconnect ) debug_msg ("[%d] Reconnect SIP -- RCV BYE from * -- ( expected, realized ) ( %d, %d )", this->my_ext, strlen ( ans ), send );
klauss 121:ee02790d00b7 778 __reconnect__ ();
klauss 119:ee6a53069455 779 miss_sip_rcv_bye_send_pkg++;
klauss 119:ee6a53069455 780 }
klauss 119:ee6a53069455 781
klauss 121:ee02790d00b7 782 if ( debug_invite ) debug_msg ("[%d] Bye request received from * - sizeof( bye reply pkg ) :: %d", this->my_ext, strlen ( ans ) );
klauss 119:ee6a53069455 783
klauss 119:ee6a53069455 784
klauss 121:ee02790d00b7 785 set_sip_rtp_port ( 0 );
klauss 108:18a3702650f3 786
klauss 91:c2a86b1f8aaa 787 listen_SIP_server_return = my_ext;
klauss 91:c2a86b1f8aaa 788 }
klauss 91:c2a86b1f8aaa 789 }
klauss 91:c2a86b1f8aaa 790 }
klauss 114:472502b31a12 791
klauss 91:c2a86b1f8aaa 792 return length;
klauss 91:c2a86b1f8aaa 793 }
klauss 91:c2a86b1f8aaa 794
klauss 121:ee02790d00b7 795 void Sip::reset_call ( void ) { if( call != NULL ) call = NULL; }
klauss 97:8985817e8847 796
klauss 121:ee02790d00b7 797 int Sip::get_ext ( void ) { return my_ext; }
klauss 97:8985817e8847 798
klauss 121:ee02790d00b7 799 int Sip::get_port ( void ) { return my_port; }
klauss 108:18a3702650f3 800
klauss 121:ee02790d00b7 801 int Sip::get_sip_rtp_port ( void ) { return my_rtp_port; }
klauss 108:18a3702650f3 802
klauss 121:ee02790d00b7 803 void Sip::set_sip_rtp_port ( const int new_my_rtp_port )
klauss 109:a5b8264ffbbc 804 {
klauss 109:a5b8264ffbbc 805 this->my_rtp_port = new_my_rtp_port;
klauss 121:ee02790d00b7 806 if ( debug_rtp ) debug_msg ( "[%d] this->my_rtp_port ( %d ) = new_my_rtp_port( %d )", this->my_ext, this->my_rtp_port, new_my_rtp_port );
klauss 109:a5b8264ffbbc 807 }
klauss 109:a5b8264ffbbc 808
klauss 109:a5b8264ffbbc 809 int Sip::print_yourself ( void )
klauss 108:18a3702650f3 810 {
klauss 109:a5b8264ffbbc 811 send_msg ("");
klauss 109:a5b8264ffbbc 812 send_msg ("Values ::\r\n");
klauss 121:ee02790d00b7 813 send_msg ("server_ip :: %s", server_ip );
klauss 121:ee02790d00b7 814 send_msg ("server_port :: %d", server_port );
klauss 121:ee02790d00b7 815 send_msg ("my_ip :: %s", my_ip );
klauss 121:ee02790d00b7 816 send_msg ("my_port :: %d", my_port );
klauss 121:ee02790d00b7 817 send_msg ("my_ext :: %d", my_ext );
klauss 121:ee02790d00b7 818 send_msg ("my_rtp_port :: %d", my_rtp_port );
klauss 121:ee02790d00b7 819 send_msg ("my_display :: %s", my_display );
klauss 121:ee02790d00b7 820 send_msg ("peer_ext :: %d", peer_ext );
klauss 121:ee02790d00b7 821 send_msg ("fill_random_aux :: %s", fill_random_aux );
klauss 121:ee02790d00b7 822 send_msg ("last_invite_tag :: %s", last_invite_tag );
klauss 121:ee02790d00b7 823 send_msg ("last_invite_callid :: %s", last_invite_callid );
klauss 121:ee02790d00b7 824 send_msg ("SVNREV :: %s", SVNREV );
klauss 121:ee02790d00b7 825 send_msg ("char buffer[ 1024 ] :: %p", ( void * ) buffer );
klauss 109:a5b8264ffbbc 826
klauss 109:a5b8264ffbbc 827 //FIXME esse tipo de tag existe como metalinguagem ???
klauss 109:a5b8264ffbbc 828 //TOTHINK o que fazer pra entender melhor o estado dos sockets
klauss 121:ee02790d00b7 829 send_msg ("UDPSocket sock :: %p", ( void * ) &sock );
klauss 121:ee02790d00b7 830 send_msg ("Endpoint sip_server :: %p", ( void * ) &sip_server );
klauss 109:a5b8264ffbbc 831
klauss 121:ee02790d00b7 832 send_msg ("call :: %p", ( void * ) call );
klauss 121:ee02790d00b7 833 send_msg ("invite_timer :: %d", ( int ) invite_timer.read () );
klauss 121:ee02790d00b7 834 send_msg ("waiting :: %s", ( waiting ) ? "true" : "false" );
klauss 121:ee02790d00b7 835 send_msg ("listen_SIP_server_return :: %d", listen_SIP_server_return );
klauss 109:a5b8264ffbbc 836 send_msg ("");
klauss 109:a5b8264ffbbc 837
klauss 121:ee02790d00b7 838 return ( sizeof( Sip ) );
klauss 119:ee6a53069455 839 }
klauss 119:ee6a53069455 840
klauss 119:ee6a53069455 841 int Sip::retry_send_last_invite_pkg_to_ast ( void )
klauss 119:ee6a53069455 842 {
klauss 121:ee02790d00b7 843 char callbox_string [ 32 ];
klauss 121:ee02790d00b7 844 snprintf ( callbox_string, sizeof ( callbox_string ) -1, "%i", my_ext );
klauss 119:ee6a53069455 845
klauss 119:ee6a53069455 846 int cseq = 0;
klauss 119:ee6a53069455 847
klauss 119:ee6a53069455 848 call = NULL;
klauss 119:ee6a53069455 849
klauss 121:ee02790d00b7 850 build_invite_package ( &cseq, true );
klauss 119:ee6a53069455 851
klauss 121:ee02790d00b7 852 if ( debug_invite ) debug_msg ("cseq::%d", cseq );
klauss 119:ee6a53069455 853
klauss 119:ee6a53069455 854 int send = 0;
klauss 119:ee6a53069455 855
klauss 119:ee6a53069455 856 if ( drop_invite_to_ast_pkg )
klauss 119:ee6a53069455 857 {
klauss 121:ee02790d00b7 858 debug_msg ("[%d] Droped invite pkg to ast", this->my_ext );
klauss 119:ee6a53069455 859 }
klauss 119:ee6a53069455 860 else
klauss 119:ee6a53069455 861 {
klauss 121:ee02790d00b7 862
klauss 121:ee02790d00b7 863 send = sock.sendTo ( sip_server, buffer, strlen ( buffer ) );
klauss 119:ee6a53069455 864
klauss 121:ee02790d00b7 865 if ( send != strlen( buffer ) )
klauss 119:ee6a53069455 866 {
klauss 121:ee02790d00b7 867 if ( debug_reconnect ) debug_msg ("[%d] Reconnect SIP -- Invite", this->my_ext );
klauss 121:ee02790d00b7 868 __reconnect__ ();
klauss 119:ee6a53069455 869 miss_sip_invite_send_pkg++;
klauss 119:ee6a53069455 870 }
klauss 119:ee6a53069455 871
klauss 121:ee02790d00b7 872 if ( debug_invite || debug_reconnect ) debug_msg ("[%d] Return value for invite pkg %d", this->my_ext, send );
klauss 119:ee6a53069455 873 }
klauss 119:ee6a53069455 874
klauss 119:ee6a53069455 875 return ( send );
klauss 108:18a3702650f3 876 }