Modularizando o src
Dependencies: EALib EthernetInterface_vz mbed-rtos mbed
Fork of header_main_colinas_V0-20-09-14 by
sip.cpp@121:ee02790d00b7, 2015-05-08 (annotated)
- 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?
User | Revision | Line number | New 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 | } |