Modularizando o src

Dependencies:   EALib EthernetInterface_vz mbed-rtos mbed

Fork of header_main_colinas_V0-20-09-14 by VZTECH

Committer:
klauss
Date:
Tue Sep 23 18:28:37 2014 +0000
Revision:
28:94aec56c6329
Parent:
27:98f824719d1c
Child:
29:7246460b73f8
- peet ext and my ext setable from prompt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
klauss 0:4d17cd9c8f9d 1 #include "sip.h"
klauss 0:4d17cd9c8f9d 2 #include "utils.h"
klauss 28:94aec56c6329 3 #include "prompt.h"
klauss 0:4d17cd9c8f9d 4
klauss 0:4d17cd9c8f9d 5 void Sip::__init_sock__( void ){
klauss 0:4d17cd9c8f9d 6 sip_server.set_address( this->server_ip , this->server_port );
klauss 0:4d17cd9c8f9d 7 sock.set_blocking( false, 1 ); // verificar isso com mais cuidado depois
klauss 0:4d17cd9c8f9d 8 sock.bind( this->my_port );
klauss 0:4d17cd9c8f9d 9 sock.init();
klauss 0:4d17cd9c8f9d 10 }
klauss 0:4d17cd9c8f9d 11
klauss 0:4d17cd9c8f9d 12 void Sip::__end_sock__(){
klauss 0:4d17cd9c8f9d 13 sock.close();
klauss 0:4d17cd9c8f9d 14 }
klauss 0:4d17cd9c8f9d 15
klauss 0:4d17cd9c8f9d 16 Sip::Sip( char * server_ip, int server_port, char * my_ip, int my_port, int my_ext, int peer_ext, int id ){
klauss 0:4d17cd9c8f9d 17 this->id = id;
klauss 0:4d17cd9c8f9d 18 strncpy( this->server_ip, server_ip, 20 );
klauss 0:4d17cd9c8f9d 19 this->server_ip[19] = 0;
klauss 0:4d17cd9c8f9d 20 this->server_port = server_port;
klauss 28:94aec56c6329 21 strncpy( this->my_ip, my_ip, 20 );
klauss 0:4d17cd9c8f9d 22 this->my_ip[19] = 0;
klauss 0:4d17cd9c8f9d 23 this->my_port = my_port;
klauss 0:4d17cd9c8f9d 24 this->my_rtp_port = fill_random_rtp_port();
klauss 0:4d17cd9c8f9d 25 this->my_ext = my_ext;
klauss 0:4d17cd9c8f9d 26 itoa( this->my_ext, this->my_display, 10 );
klauss 0:4d17cd9c8f9d 27 this->peer_ext = peer_ext;
klauss 0:4d17cd9c8f9d 28
klauss 0:4d17cd9c8f9d 29 strcpy( this->fill_random_aux, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789pP" );
klauss 0:4d17cd9c8f9d 30 strcpy( this->last_invite_tag, "" );
klauss 0:4d17cd9c8f9d 31 strcpy( this->last_invite_callid, "");
klauss 0:4d17cd9c8f9d 32 strcpy( this->SVNREV, "COLA" );
klauss 0:4d17cd9c8f9d 33 status = sip_idle;
klauss 0:4d17cd9c8f9d 34
klauss 0:4d17cd9c8f9d 35 __init_sock__();
klauss 0:4d17cd9c8f9d 36 }
klauss 0:4d17cd9c8f9d 37
klauss 0:4d17cd9c8f9d 38 Sip::Sip(){
klauss 28:94aec56c6329 39 FILE *fp = NULL;
klauss 28:94aec56c6329 40
klauss 28:94aec56c6329 41 fp = fopen( "/qspi/myext.txt", "r");
klauss 28:94aec56c6329 42 if( fp == NULL ){
klauss 28:94aec56c6329 43 debug_msg("Failed to open /qspi/myext.txt" );
klauss 28:94aec56c6329 44 this->id = __MY_EXT__;
klauss 28:94aec56c6329 45 }else{
klauss 28:94aec56c6329 46 if( fread( &id, 1, 512, fp ) > 0 ){
klauss 28:94aec56c6329 47 this->id = __MY_EXT__;
klauss 28:94aec56c6329 48 debug_msg("Objeto SIP fixado na ext %i", this->id );
klauss 28:94aec56c6329 49 }else{
klauss 28:94aec56c6329 50 debug_msg("Failed to read /qspi/myext.txt" );
klauss 28:94aec56c6329 51 this->id = __MY_EXT__;
klauss 28:94aec56c6329 52 }
klauss 28:94aec56c6329 53 }
klauss 28:94aec56c6329 54 fclose( fp );
klauss 27:98f824719d1c 55
klauss 28:94aec56c6329 56 fp = fopen( "/qspi/serverip.txt", "r");
klauss 28:94aec56c6329 57 if( fp == NULL){
klauss 28:94aec56c6329 58 debug_msg("Failed to open /qspi/serverip.txt" );
klauss 28:94aec56c6329 59 strncpy( this->server_ip, __SERVER_IP__, 20 );
klauss 28:94aec56c6329 60 }else{
klauss 28:94aec56c6329 61 if( fread( this->buffer, 1, 512, fp ) > 0 ){
klauss 28:94aec56c6329 62 strncpy( this->server_ip, this->buffer, 20 );
klauss 28:94aec56c6329 63 debug_msg("Objeto SIP fixado com ip %s", this->server_ip );
klauss 28:94aec56c6329 64 }else{
klauss 28:94aec56c6329 65 debug_msg("Failed to read /qspi/serverip.txt" );
klauss 28:94aec56c6329 66 strncpy( this->server_ip, __SERVER_IP__, 20 );
klauss 28:94aec56c6329 67 }
klauss 28:94aec56c6329 68 }
klauss 28:94aec56c6329 69 fclose( fp );
klauss 28:94aec56c6329 70 this->server_ip[19] = 0;
klauss 28:94aec56c6329 71
klauss 28:94aec56c6329 72 fp = fopen( "/qspi/serverport.txt", "r");
klauss 28:94aec56c6329 73 if( fp == NULL ){
klauss 28:94aec56c6329 74 debug_msg("Failed to open /qspi/serverport.txt" );
klauss 28:94aec56c6329 75 this->server_port = __SERVER_PORT__;
klauss 28:94aec56c6329 76 }else{
klauss 28:94aec56c6329 77 if( fread( &server_port, 1, 512, fp ) > 0 ){
klauss 28:94aec56c6329 78 this->server_port = __SERVER_PORT__;
klauss 28:94aec56c6329 79 debug_msg("Objeto SIP fixado na server port %i", this->server_port );
klauss 28:94aec56c6329 80 }else{
klauss 28:94aec56c6329 81 debug_msg("Failed to read /qspi/serverport.txt" );
klauss 28:94aec56c6329 82 this->server_port = __SERVER_PORT__;
klauss 28:94aec56c6329 83 }
klauss 28:94aec56c6329 84 }
klauss 28:94aec56c6329 85 fclose( fp );
klauss 28:94aec56c6329 86
klauss 28:94aec56c6329 87 fp = fopen( "/qspi/myip.txt", "r");
klauss 28:94aec56c6329 88 if( fp == NULL ){
klauss 28:94aec56c6329 89 debug_msg("Failed to open /qspi/myip.txt" );
klauss 27:98f824719d1c 90 strncpy( this->my_ip, __MY_IP__, 20 );
klauss 27:98f824719d1c 91 }else{
klauss 27:98f824719d1c 92 if( fread( this->buffer, 1, 512, fp ) > 0 ){
klauss 27:98f824719d1c 93 strncpy( this->my_ip, this->buffer, 20 );
klauss 27:98f824719d1c 94 debug_msg("Objeto SIP fixado no ip %s", this->my_ip );
klauss 27:98f824719d1c 95 }else{
klauss 28:94aec56c6329 96 debug_msg("Failed to read /qspi/myip.txt" );
klauss 27:98f824719d1c 97 strncpy( this->my_ip, __MY_IP__, 20 );
klauss 27:98f824719d1c 98 }
klauss 27:98f824719d1c 99 }
klauss 27:98f824719d1c 100 fclose( fp );
klauss 0:4d17cd9c8f9d 101 this->my_ip[19] = 0;
klauss 27:98f824719d1c 102
klauss 27:98f824719d1c 103 fp = fopen( "/qspi/mysipport.txt", "r");
klauss 28:94aec56c6329 104 if( fp == NULL ){
klauss 28:94aec56c6329 105 debug_msg("Failed to open /qspi/mysipport.txt" );
klauss 27:98f824719d1c 106 this->my_port = __MY_PORT__;
klauss 27:98f824719d1c 107 }else{
klauss 27:98f824719d1c 108 if( fread( &my_port, 1, 32, fp ) > 0 ){
klauss 27:98f824719d1c 109 debug_msg("Objeto SIP fixado na porta sip %i", this->my_port );
klauss 27:98f824719d1c 110 }else{
klauss 28:94aec56c6329 111 debug_msg("Failed to read /qspi/mysipport.txt" );
klauss 27:98f824719d1c 112 this->my_port = __MY_PORT__;
klauss 27:98f824719d1c 113 }
klauss 27:98f824719d1c 114 }
klauss 27:98f824719d1c 115 fclose( fp );
klauss 27:98f824719d1c 116
klauss 0:4d17cd9c8f9d 117 this->my_rtp_port = fill_random_rtp_port();
klauss 28:94aec56c6329 118
klauss 28:94aec56c6329 119 fp = fopen( "/qspi/myext.txt", "r");
klauss 28:94aec56c6329 120 if( fp == NULL ){
klauss 28:94aec56c6329 121 debug_msg("Failed to open /qspi/myext.txt" );
klauss 28:94aec56c6329 122 this->my_ext = __MY_EXT__;
klauss 28:94aec56c6329 123 }else{
klauss 28:94aec56c6329 124 if( fread( &my_ext, 1, 32, fp ) > 0 ){
klauss 28:94aec56c6329 125 debug_msg("Objeto SIP fixado ext %i", this->my_ext );
klauss 28:94aec56c6329 126 }else{
klauss 28:94aec56c6329 127 debug_msg("Failed to read /qspi/myext.txt" );
klauss 28:94aec56c6329 128 this->my_ext = __MY_EXT__;
klauss 28:94aec56c6329 129 }
klauss 28:94aec56c6329 130 }
klauss 28:94aec56c6329 131 fclose( fp );
klauss 28:94aec56c6329 132
klauss 0:4d17cd9c8f9d 133 itoa( this->my_ext, this->my_display, 10 );
klauss 28:94aec56c6329 134
klauss 28:94aec56c6329 135 fp = fopen( "/qspi/peerext.txt", "r");
klauss 28:94aec56c6329 136 if( fp == NULL ){
klauss 28:94aec56c6329 137 debug_msg("Failed to open /qspi/peerext.txt" );
klauss 28:94aec56c6329 138 this->peer_ext = __PEER_EXT__;
klauss 28:94aec56c6329 139 }else{
klauss 28:94aec56c6329 140 if( fread( &peer_ext, 1, 32, fp ) > 0 ){
klauss 28:94aec56c6329 141 debug_msg("Objeto SIP fixado no server ext %i", this->peer_ext );
klauss 28:94aec56c6329 142 }else{
klauss 28:94aec56c6329 143 debug_msg("Failed to read /qspi/peerext.txt" );
klauss 28:94aec56c6329 144 this->peer_ext = __PEER_EXT__;
klauss 28:94aec56c6329 145 }
klauss 28:94aec56c6329 146 }
klauss 28:94aec56c6329 147 fclose( fp );
klauss 28:94aec56c6329 148
klauss 0:4d17cd9c8f9d 149 strcpy( this->fill_random_aux, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789pP" );
klauss 0:4d17cd9c8f9d 150 strcpy( this->last_invite_tag, "" );
klauss 0:4d17cd9c8f9d 151 strcpy( this->last_invite_callid, "");
klauss 0:4d17cd9c8f9d 152 strcpy( this->SVNREV, "COLA" );
klauss 0:4d17cd9c8f9d 153 status = sip_idle;
klauss 0:4d17cd9c8f9d 154
klauss 0:4d17cd9c8f9d 155 __init_sock__();
klauss 0:4d17cd9c8f9d 156 }
klauss 0:4d17cd9c8f9d 157
klauss 0:4d17cd9c8f9d 158 Sip::Sip( int id, uint16_t my_port ){
klauss 28:94aec56c6329 159 FILE * fp = NULL;
klauss 0:4d17cd9c8f9d 160 this->id = id;
klauss 28:94aec56c6329 161 fp = fopen( "/qspi/serverip.txt", "r");
klauss 28:94aec56c6329 162 if( fp == NULL){
klauss 28:94aec56c6329 163 debug_msg("Failed to open /qspi/serverip.txt" );
klauss 28:94aec56c6329 164 strncpy( this->server_ip, __SERVER_IP__, 20 );
klauss 28:94aec56c6329 165 }else{
klauss 28:94aec56c6329 166 if( fread( this->buffer, 1, 512, fp ) > 0 ){
klauss 28:94aec56c6329 167 strncpy( this->server_ip, this->buffer, 20 );
klauss 28:94aec56c6329 168 debug_msg("Objeto SIP fixado com ip %s", this->server_ip );
klauss 28:94aec56c6329 169 }else{
klauss 28:94aec56c6329 170 debug_msg("Failed to read /qspi/serverip.txt" );
klauss 28:94aec56c6329 171 strncpy( this->server_ip, __SERVER_IP__, 20 );
klauss 28:94aec56c6329 172 }
klauss 28:94aec56c6329 173 }
klauss 28:94aec56c6329 174 fclose( fp );
klauss 0:4d17cd9c8f9d 175 this->server_ip[19] = 0;
klauss 27:98f824719d1c 176
klauss 28:94aec56c6329 177 fp = fopen( "/qspi/serverport.txt", "r");
klauss 28:94aec56c6329 178 if( fp == NULL ){
klauss 28:94aec56c6329 179 debug_msg("Failed to open /qspi/serverport.txt" );
klauss 28:94aec56c6329 180 this->server_port = __SERVER_PORT__;
klauss 28:94aec56c6329 181 }else{
klauss 28:94aec56c6329 182 if( fread( &server_port, 1, 512, fp ) > 0 ){
klauss 28:94aec56c6329 183 this->server_port = __SERVER_PORT__;
klauss 28:94aec56c6329 184 debug_msg("Objeto SIP fixado na server port %i", this->server_port );
klauss 28:94aec56c6329 185 }else{
klauss 28:94aec56c6329 186 debug_msg("Failed to read /qspi/serverport.txt" );
klauss 28:94aec56c6329 187 this->server_port = __SERVER_PORT__;
klauss 28:94aec56c6329 188 }
klauss 28:94aec56c6329 189 }
klauss 28:94aec56c6329 190 fclose( fp );
klauss 28:94aec56c6329 191
klauss 28:94aec56c6329 192 fp = fopen( "/qspi/myip.txt", "r");
klauss 27:98f824719d1c 193 if (fp == NULL){
klauss 28:94aec56c6329 194 debug_msg("Failed to open /qspi/myip.txt" );
klauss 27:98f824719d1c 195 strncpy( this->my_ip, __MY_IP__, 20 );
klauss 27:98f824719d1c 196 }else{
klauss 27:98f824719d1c 197 if( fread( this->buffer, 1, 512, fp ) > 0 ){
klauss 27:98f824719d1c 198 strncpy( this->my_ip, this->buffer, 20 );
klauss 27:98f824719d1c 199 debug_msg("Objeto SIP fixado no ip %s", this->my_ip );
klauss 27:98f824719d1c 200 }else{
klauss 28:94aec56c6329 201 debug_msg("Failed to read /qspi/myip.txt" );
klauss 27:98f824719d1c 202 strncpy( this->my_ip, __MY_IP__, 20 );
klauss 27:98f824719d1c 203 }
klauss 27:98f824719d1c 204 }
klauss 27:98f824719d1c 205 fclose( fp );
klauss 28:94aec56c6329 206 this->my_ip[19] = 0;
klauss 28:94aec56c6329 207
klauss 28:94aec56c6329 208 this->my_port = my_port;
klauss 28:94aec56c6329 209 this->my_rtp_port = fill_random_rtp_port();
klauss 28:94aec56c6329 210 this->my_ext = id;
klauss 28:94aec56c6329 211 itoa( this->my_ext, this->my_display, 10 );
klauss 28:94aec56c6329 212 fp = fopen( "/qspi/peerext.txt", "r");
klauss 28:94aec56c6329 213 if( fp == NULL ){
klauss 28:94aec56c6329 214 debug_msg("Failed to open /qspi/peerext.txt" );
klauss 28:94aec56c6329 215 this->peer_ext = __PEER_EXT__;
klauss 28:94aec56c6329 216 }else{
klauss 28:94aec56c6329 217 if( fread( &peer_ext, 1, 32, fp ) > 0 ){
klauss 28:94aec56c6329 218 debug_msg("Objeto SIP fixado no server ext %i", this->peer_ext );
klauss 28:94aec56c6329 219 }else{
klauss 28:94aec56c6329 220 debug_msg("Failed to read /qspi/peerext.txt" );
klauss 28:94aec56c6329 221 this->peer_ext = __PEER_EXT__;
klauss 28:94aec56c6329 222 }
klauss 28:94aec56c6329 223 }
klauss 28:94aec56c6329 224 fclose( fp );
klauss 27:98f824719d1c 225
klauss 0:4d17cd9c8f9d 226 strcpy( this->fill_random_aux, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789pP" );
klauss 0:4d17cd9c8f9d 227 strcpy( this->last_invite_tag, "" );
klauss 0:4d17cd9c8f9d 228 strcpy( this->last_invite_callid, "");
klauss 0:4d17cd9c8f9d 229 strcpy( this->SVNREV, "COLA" );
klauss 0:4d17cd9c8f9d 230 status = sip_idle;
klauss 0:4d17cd9c8f9d 231
klauss 0:4d17cd9c8f9d 232 __init_sock__();
klauss 0:4d17cd9c8f9d 233 }
klauss 0:4d17cd9c8f9d 234
klauss 0:4d17cd9c8f9d 235 Sip::Sip( int id, uint16_t my_port, int dest_ext ){
klauss 28:94aec56c6329 236 FILE * fp = NULL;
klauss 0:4d17cd9c8f9d 237 this->id = id;
klauss 28:94aec56c6329 238
klauss 28:94aec56c6329 239 fp = fopen( "/qspi/serverip.txt", "r");
klauss 28:94aec56c6329 240 if( fp == NULL){
klauss 28:94aec56c6329 241 debug_msg("Failed to open /qspi/serverip.txt" );
klauss 28:94aec56c6329 242 strncpy( this->server_ip, __SERVER_IP__, 20 );
klauss 28:94aec56c6329 243 }else{
klauss 28:94aec56c6329 244 if( fread( this->buffer, 1, 512, fp ) > 0 ){
klauss 28:94aec56c6329 245 strncpy( this->server_ip, this->buffer, 20 );
klauss 28:94aec56c6329 246 debug_msg("Objeto SIP fixado com ip %s", this->server_ip );
klauss 28:94aec56c6329 247 }else{
klauss 28:94aec56c6329 248 debug_msg("Failed to read /qspi/serverip.txt" );
klauss 28:94aec56c6329 249 strncpy( this->server_ip, __SERVER_IP__, 20 );
klauss 28:94aec56c6329 250 }
klauss 28:94aec56c6329 251 }
klauss 28:94aec56c6329 252 fclose( fp );
klauss 0:4d17cd9c8f9d 253 this->server_ip[19] = 0;
klauss 28:94aec56c6329 254
klauss 28:94aec56c6329 255 fp = fopen( "/qspi/serverport.txt", "r");
klauss 28:94aec56c6329 256 if( fp == NULL ){
klauss 28:94aec56c6329 257 debug_msg("Failed to open /qspi/serverport.txt" );
klauss 28:94aec56c6329 258 this->server_port = __SERVER_PORT__;
klauss 28:94aec56c6329 259 }else{
klauss 28:94aec56c6329 260 if( fread( &server_port, 1, 512, fp ) > 0 ){
klauss 28:94aec56c6329 261 this->server_port = __SERVER_PORT__;
klauss 28:94aec56c6329 262 debug_msg("Objeto SIP fixado na server port %i", this->server_port );
klauss 28:94aec56c6329 263 }else{
klauss 28:94aec56c6329 264 debug_msg("Failed to read /qspi/serverport.txt" );
klauss 28:94aec56c6329 265 this->server_port = __SERVER_PORT__;
klauss 28:94aec56c6329 266 }
klauss 28:94aec56c6329 267 }
klauss 28:94aec56c6329 268 fclose( fp );
klauss 28:94aec56c6329 269
klauss 28:94aec56c6329 270 fp = fopen( "/qspi/myip.txt", "r");
klauss 28:94aec56c6329 271 if (fp == NULL){
klauss 28:94aec56c6329 272 debug_msg("Failed to open /qspi/myip.txt" );
klauss 28:94aec56c6329 273 strncpy( this->my_ip, __MY_IP__, 20 );
klauss 28:94aec56c6329 274 }else{
klauss 28:94aec56c6329 275 if( fread( this->buffer, 1, 512, fp ) > 0 ){
klauss 28:94aec56c6329 276 strncpy( this->my_ip, this->buffer, 20 );
klauss 28:94aec56c6329 277 debug_msg("Objeto SIP fixado no ip %s", this->my_ip );
klauss 28:94aec56c6329 278 }else{
klauss 28:94aec56c6329 279 debug_msg("Failed to read /qspi/myip.txt" );
klauss 28:94aec56c6329 280 strncpy( this->my_ip, __MY_IP__, 20 );
klauss 28:94aec56c6329 281 }
klauss 28:94aec56c6329 282 }
klauss 28:94aec56c6329 283 fclose( fp );
klauss 0:4d17cd9c8f9d 284 this->my_ip[19] = 0;
klauss 28:94aec56c6329 285
klauss 0:4d17cd9c8f9d 286 this->my_port = my_port;
klauss 0:4d17cd9c8f9d 287 this->my_rtp_port = fill_random_rtp_port();
klauss 0:4d17cd9c8f9d 288 this->my_ext = id;
klauss 0:4d17cd9c8f9d 289 itoa( this->my_ext, this->my_display, 10 );
klauss 0:4d17cd9c8f9d 290 this->peer_ext = dest_ext;
klauss 0:4d17cd9c8f9d 291
klauss 0:4d17cd9c8f9d 292 strcpy( this->fill_random_aux, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789pP" );
klauss 0:4d17cd9c8f9d 293 strcpy( this->last_invite_tag, "" );
klauss 0:4d17cd9c8f9d 294 strcpy( this->last_invite_callid, "");
klauss 0:4d17cd9c8f9d 295 strcpy( this->SVNREV, "COLA" );
klauss 0:4d17cd9c8f9d 296 status = sip_idle;
klauss 0:4d17cd9c8f9d 297
klauss 0:4d17cd9c8f9d 298 __init_sock__();
klauss 0:4d17cd9c8f9d 299 }
klauss 0:4d17cd9c8f9d 300
klauss 0:4d17cd9c8f9d 301 Sip::~Sip(){
klauss 0:4d17cd9c8f9d 302 __end_sock__();
klauss 0:4d17cd9c8f9d 303 }
klauss 0:4d17cd9c8f9d 304
klauss 0:4d17cd9c8f9d 305 void Sip::registry(){
klauss 13:ae278302dffe 306 char out[ 1000 ];
klauss 28:94aec56c6329 307 if( debug_sip ) debug_msg("Registry %d", this->my_ext );
klauss 0:4d17cd9c8f9d 308 build_registry_package( buffer );
klauss 13:ae278302dffe 309 int sent = sock.sendTo( sip_server, buffer, sizeof( buffer ) );
klauss 0:4d17cd9c8f9d 310 sock.receiveFrom( sip_server, buffer, sizeof( buffer ) );
klauss 28:94aec56c6329 311 if( debug_sip ) debug_msg("Received %i bytes to ext %d", sent, my_ext );
klauss 0:4d17cd9c8f9d 312 if( decode_gettag( (unsigned char *)buffer, "cseq: ", out ) ){
klauss 0:4d17cd9c8f9d 313 if(strlen( out ) > 7){
klauss 0:4d17cd9c8f9d 314 if(strcasecmp("options",out+strlen(out)-7) == 0){
klauss 13:ae278302dffe 315 char ans[ 2000 ];
klauss 0:4d17cd9c8f9d 316 build_reply_package( ans, (unsigned char*)buffer );
klauss 0:4d17cd9c8f9d 317 sock.sendTo( sip_server, ans, sizeof( ans ) );
klauss 0:4d17cd9c8f9d 318 }
klauss 0:4d17cd9c8f9d 319 }
klauss 0:4d17cd9c8f9d 320 }
klauss 14:22a35f575502 321 debug_msg("");
klauss 0:4d17cd9c8f9d 322 }
klauss 0:4d17cd9c8f9d 323
klauss 0:4d17cd9c8f9d 324 VZ_call * Sip::invite(){
klauss 0:4d17cd9c8f9d 325 Timer t;
klauss 0:4d17cd9c8f9d 326 char callbox_string[ 32 ];
klauss 0:4d17cd9c8f9d 327 itoa( get_id(), callbox_string, 10 );
klauss 0:4d17cd9c8f9d 328
klauss 14:22a35f575502 329 if( status != sip_on_call ){
klauss 14:22a35f575502 330 set_status(status, sip_waiting_trying );
klauss 14:22a35f575502 331 }
klauss 0:4d17cd9c8f9d 332
klauss 0:4d17cd9c8f9d 333 else return( NULL );
klauss 0:4d17cd9c8f9d 334
klauss 0:4d17cd9c8f9d 335 int cseq = 0;
klauss 0:4d17cd9c8f9d 336
klauss 0:4d17cd9c8f9d 337 build_invite_package( buffer, callbox_string, &cseq );
klauss 0:4d17cd9c8f9d 338 sock.sendTo( sip_server, buffer, sizeof( buffer ) );
klauss 0:4d17cd9c8f9d 339
klauss 0:4d17cd9c8f9d 340 debug_msg( "Inicio do invite" );
klauss 0:4d17cd9c8f9d 341 debug_msg( "Sip::status::%d", status );
klauss 0:4d17cd9c8f9d 342 t.start();
klauss 0:4d17cd9c8f9d 343
klauss 0:4d17cd9c8f9d 344 sock.set_blocking( false, 5 );
klauss 0:4d17cd9c8f9d 345
klauss 0:4d17cd9c8f9d 346 int loop_times = 0;
klauss 0:4d17cd9c8f9d 347 int received_loop_times = 0;
klauss 0:4d17cd9c8f9d 348 Timer reconnect;
klauss 0:4d17cd9c8f9d 349 reconnect.start();
klauss 0:4d17cd9c8f9d 350 static int id_ = 0;
klauss 0:4d17cd9c8f9d 351 int length = 0;
klauss 3:cd9148672e25 352 bool waiting = false;
klauss 3:cd9148672e25 353
klauss 3:cd9148672e25 354 VZ_call * call = NULL;
klauss 0:4d17cd9c8f9d 355 while( t.read() < __INVITE_MAX_WAITING_TIME__ ){
klauss 0:4d17cd9c8f9d 356 loop_times++;
klauss 4:de46f0d9b14d 357 length = sock.receiveFrom( sip_server, buffer, sizeof( buffer ) );
klauss 0:4d17cd9c8f9d 358 if( length > 0 ){
klauss 0:4d17cd9c8f9d 359 reconnect.reset();
klauss 0:4d17cd9c8f9d 360 debug_msg("Pacotes recebidos :: %d", id_ );
klauss 4:de46f0d9b14d 361 buffer[ length ] = 0;
klauss 0:4d17cd9c8f9d 362 received_loop_times++;
klauss 0:4d17cd9c8f9d 363 if( ( status == sip_trying ) || ( status == sip_ringing ) ){
klauss 4:de46f0d9b14d 364 if( !( strncasecmp( buffer + 12, "ok", strlen("ok") ) ) ){
klauss 0:4d17cd9c8f9d 365 // tratar depois o esquema do Cseq ::
klauss 0:4d17cd9c8f9d 366 debug_msg( "Cseq == %d", cseq );
klauss 0:4d17cd9c8f9d 367 set_status(status, sip_on_call);
klauss 4:de46f0d9b14d 368 char *ref = strstr( buffer, "audio" );
klauss 0:4d17cd9c8f9d 369 debug_msg("ok");
klauss 0:4d17cd9c8f9d 370 if( ref != NULL ){
klauss 0:4d17cd9c8f9d 371 ref += 6; // audio
klauss 0:4d17cd9c8f9d 372 ref = strtok( ref, " ");
klauss 3:cd9148672e25 373 if( call == NULL ) call = new VZ_call( this->my_ext, this->my_rtp_port, this->peer_ext, atoi( ref ) );
klauss 13:ae278302dffe 374 char ans[ 1024 ];
klauss 4:de46f0d9b14d 375 build_ack_package( ans, ( unsigned char *)buffer );
klauss 0:4d17cd9c8f9d 376 sock.sendTo( sip_server, ans, sizeof( ans ) );
klauss 1:a1758104fa1d 377 debug_msg("Call alocada -- Sip::status::%d -- loop_times :: %d :: received_loop_times :: %d", status, loop_times, received_loop_times );
klauss 0:4d17cd9c8f9d 378 set_status( status, sip_on_call );
klauss 0:4d17cd9c8f9d 379 return( call );
klauss 0:4d17cd9c8f9d 380 }
klauss 0:4d17cd9c8f9d 381 }
klauss 0:4d17cd9c8f9d 382 }
klauss 3:cd9148672e25 383 if( ( status == sip_trying ) || ( status == sip_ringing ) ){
klauss 25:2cf5e8dd4035 384 if( !( strncasecmp( buffer + 12, "Busy Here", strlen("Busy Here") ) ) ){
klauss 25:2cf5e8dd4035 385 debug_msg("Busy Here");
klauss 25:2cf5e8dd4035 386 send_bye();
klauss 25:2cf5e8dd4035 387 delete( call );
klauss 25:2cf5e8dd4035 388 set_status( status, sip_busy );
klauss 25:2cf5e8dd4035 389 return( NULL );
klauss 25:2cf5e8dd4035 390 }
klauss 25:2cf5e8dd4035 391 }
klauss 25:2cf5e8dd4035 392 if( ( status == sip_trying ) || ( status == sip_ringing ) ){
klauss 4:de46f0d9b14d 393 if( !( strncasecmp( buffer + 12, "Session Progress", strlen("Session Progress") ) ) ){
klauss 3:cd9148672e25 394 debug_msg( "Trocando dados de audio -- musica de espera com o CBx" );
klauss 4:de46f0d9b14d 395 char *ref = strstr( buffer, "audio" );
klauss 3:cd9148672e25 396 if( ref != NULL ){
klauss 3:cd9148672e25 397 ref += 6; // audio
klauss 3:cd9148672e25 398 ref = strtok( ref, " ");
klauss 3:cd9148672e25 399 if( call == NULL ) call = new VZ_call( this->my_ext, this->my_rtp_port, this->peer_ext, atoi( ref ) );
klauss 3:cd9148672e25 400 waiting = true;
klauss 3:cd9148672e25 401 }
klauss 3:cd9148672e25 402 }
klauss 3:cd9148672e25 403 }
klauss 0:4d17cd9c8f9d 404 if( status == sip_trying ){
klauss 4:de46f0d9b14d 405 if( !( strncasecmp( buffer + 12, "ringing", strlen("ringing") ) ) ){
klauss 0:4d17cd9c8f9d 406 debug_msg("ringing");
klauss 0:4d17cd9c8f9d 407 t.reset();
klauss 0:4d17cd9c8f9d 408 set_status( status, sip_ringing );
klauss 0:4d17cd9c8f9d 409 }
klauss 0:4d17cd9c8f9d 410 }
klauss 0:4d17cd9c8f9d 411 if( status == sip_waiting_trying ){
klauss 4:de46f0d9b14d 412 if( !( strncasecmp( buffer + 12, "trying", strlen("trying") ) ) ){
klauss 0:4d17cd9c8f9d 413 debug_msg("trying")
klauss 0:4d17cd9c8f9d 414 t.reset();
klauss 0:4d17cd9c8f9d 415 set_status( status, sip_trying );
klauss 0:4d17cd9c8f9d 416 }
klauss 0:4d17cd9c8f9d 417 }
klauss 0:4d17cd9c8f9d 418 }else if( reconnect.read() > 4 ){
klauss 0:4d17cd9c8f9d 419 sock.close();
klauss 0:4d17cd9c8f9d 420 sock.bind( this->my_port );
klauss 0:4d17cd9c8f9d 421 sock.init();
klauss 0:4d17cd9c8f9d 422 sock.set_blocking( false, 1 );
klauss 0:4d17cd9c8f9d 423 debug_msg("Reconnect");
klauss 0:4d17cd9c8f9d 424 reconnect.reset();
klauss 0:4d17cd9c8f9d 425 //sock.sendTo( sip_server, buffer, sizeof( buffer ) );
klauss 0:4d17cd9c8f9d 426 led4 = !led4;
klauss 0:4d17cd9c8f9d 427 }
klauss 3:cd9148672e25 428 if( waiting == true ){
klauss 3:cd9148672e25 429 char * tmp = call->get_eth_message( &length );
klauss 3:cd9148672e25 430 if( tmp != NULL ){
klauss 3:cd9148672e25 431 uint8_t * pkg2cb = __build_cb_package__( this->my_ext, this->my_port, __AUDIO__,
klauss 3:cd9148672e25 432 tmp, __AUDIO__, length, (uint8_t *)buffer );
klauss 3:cd9148672e25 433 __send_to_cb__( pkg2cb );
klauss 3:cd9148672e25 434 }
klauss 3:cd9148672e25 435 }
klauss 0:4d17cd9c8f9d 436 }
klauss 0:4d17cd9c8f9d 437
klauss 0:4d17cd9c8f9d 438 debug_msg("Call nao alocada -- Sip::status::%d -- loop_times :: %d :: received_loop_times :: %d", status, loop_times, received_loop_times );
klauss 0:4d17cd9c8f9d 439 if( t.read() > __INVITE_MAX_WAITING_TIME__ ){
klauss 0:4d17cd9c8f9d 440 set_status(status, sip_denied);
klauss 14:22a35f575502 441 send_bye();
klauss 0:4d17cd9c8f9d 442 }
klauss 3:cd9148672e25 443 delete( call );
klauss 0:4d17cd9c8f9d 444 return( NULL );
klauss 0:4d17cd9c8f9d 445 }
klauss 0:4d17cd9c8f9d 446
klauss 0:4d17cd9c8f9d 447 char * Sip::build_registry_package( char * buffer ){
klauss 0:4d17cd9c8f9d 448 char branch[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 449 char tag[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 450 char callid[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 451 fill_random16h( branch );
klauss 0:4d17cd9c8f9d 452 fill_random( tag, 18 );
klauss 0:4d17cd9c8f9d 453 fill_random16h( callid );
klauss 0:4d17cd9c8f9d 454 char itoa_buffer[ 65 ];
klauss 0:4d17cd9c8f9d 455 strcpy( buffer, "REGISTER sip:" );
klauss 0:4d17cd9c8f9d 456 strcat( buffer, server_ip );
klauss 0:4d17cd9c8f9d 457 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 458 itoa( server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 459 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 460 strcat( buffer, " SIP/2.0\r\nVia: SIP/2.0/UDP " );
klauss 0:4d17cd9c8f9d 461 strcat( buffer, my_ip );
klauss 0:4d17cd9c8f9d 462 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 463 itoa( my_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 464 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 465 strcat( buffer, ";branch=" );
klauss 0:4d17cd9c8f9d 466 strcat( buffer, branch );
klauss 0:4d17cd9c8f9d 467 strcat( buffer, "\r\nFrom: " );
klauss 4:de46f0d9b14d 468 // mudar isso aqui pra algo mais compreensivel pra cc
klauss 0:4d17cd9c8f9d 469 itoa( my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 470 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 471 strcat( buffer, " <sip:" );
klauss 0:4d17cd9c8f9d 472 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 473 strcat( buffer, "@" );
klauss 0:4d17cd9c8f9d 474 strcat( buffer, server_ip );
klauss 0:4d17cd9c8f9d 475 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 476 itoa( server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 477 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 478 strcat( buffer, ">;tag=" );
klauss 0:4d17cd9c8f9d 479 strcat( buffer, tag );
klauss 0:4d17cd9c8f9d 480 strcat( buffer, "\r\nTo: " );
klauss 0:4d17cd9c8f9d 481 itoa( my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 482 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 483 strcat( buffer, " <sip:" );
klauss 0:4d17cd9c8f9d 484 itoa( my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 485 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 486 strcat( buffer, "@" );
klauss 0:4d17cd9c8f9d 487 strcat( buffer, server_ip );
klauss 0:4d17cd9c8f9d 488 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 489 itoa( server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 490 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 491 strcat( buffer, ">\r\nCall-ID: " );
klauss 0:4d17cd9c8f9d 492 strcat( buffer, callid );
klauss 0:4d17cd9c8f9d 493 strcat( buffer, "\r\nCSeq: " );
klauss 0:4d17cd9c8f9d 494 itoa( get_cseq(), itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 495 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 496 strcat( buffer, " REGISTER\r\n" );
klauss 0:4d17cd9c8f9d 497 strcat( buffer, "Max-Forwards: " );
klauss 0:4d17cd9c8f9d 498 itoa( 70, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 499 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 500 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 501
klauss 0:4d17cd9c8f9d 502 strcat( buffer, "Contact: " );
klauss 0:4d17cd9c8f9d 503 itoa( my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 504 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 505 strcat( buffer, " <sip:" );
klauss 0:4d17cd9c8f9d 506 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 507 strcat( buffer, "@" );
klauss 0:4d17cd9c8f9d 508 strcat( buffer, my_ip );
klauss 0:4d17cd9c8f9d 509 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 510 itoa( server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 511 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 512 strcat( buffer, ">;expires=120" );
klauss 0:4d17cd9c8f9d 513 //itoa( 1200, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 514 //strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 515 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 516
klauss 0:4d17cd9c8f9d 517 strcat( buffer, "User-Agent: VZtech/pabxdriver-" );
klauss 0:4d17cd9c8f9d 518 strcat( buffer, SVNREV );
klauss 0:4d17cd9c8f9d 519 strcat( buffer, "\r\nContent-Length: 0\r\n" );
klauss 0:4d17cd9c8f9d 520 strcat( buffer, SIP_ALLOW );
klauss 0:4d17cd9c8f9d 521 strcat( buffer, "\r\n\r\n" );
klauss 0:4d17cd9c8f9d 522 buffer[ SIP_MAXMSGSIZE - 1 ] = 0;
klauss 0:4d17cd9c8f9d 523 return buffer;
klauss 0:4d17cd9c8f9d 524 }
klauss 0:4d17cd9c8f9d 525
klauss 0:4d17cd9c8f9d 526 char * Sip::build_invite_package( char * pkg, char * callbox_string, int * cseq ){
klauss 0:4d17cd9c8f9d 527 char header[ SIP_MAXMSGSIZE ], body[ SIP_MAXMSGSIZE ];
klauss 0:4d17cd9c8f9d 528 char branch[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 529 char tag[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 530 char callid[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 531 char itoa_buffer[ 65 ];
klauss 0:4d17cd9c8f9d 532 *cseq = get_cseq();
klauss 0:4d17cd9c8f9d 533 fill_random16h( branch );
klauss 0:4d17cd9c8f9d 534 fill_random( tag,18 );
klauss 0:4d17cd9c8f9d 535 fill_random16h( callid );
klauss 0:4d17cd9c8f9d 536
klauss 0:4d17cd9c8f9d 537 strcpy( last_invite_tag,tag );
klauss 0:4d17cd9c8f9d 538 strcpy( last_invite_callid, callid );
klauss 0:4d17cd9c8f9d 539
klauss 0:4d17cd9c8f9d 540 strcpy( header, "INVITE sip:" );
klauss 0:4d17cd9c8f9d 541 itoa( this->peer_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 542 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 543 strcat( header, "@" );
klauss 0:4d17cd9c8f9d 544 strcat( header, this->server_ip );
klauss 0:4d17cd9c8f9d 545 strcat( header, ":" );
klauss 0:4d17cd9c8f9d 546 itoa( this->server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 547 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 548 strcat( header, " SIP/" );
klauss 0:4d17cd9c8f9d 549 itoa( 2, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 550 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 551 strcat( header, "." );
klauss 0:4d17cd9c8f9d 552 itoa( 0, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 553 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 554 strcat( header, "\r\n" );
klauss 0:4d17cd9c8f9d 555 strcat( header, "Via: SIP/" );
klauss 0:4d17cd9c8f9d 556 itoa( 2, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 557 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 558 strcat( header, "." );
klauss 0:4d17cd9c8f9d 559 itoa( 0, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 560 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 561 strcat( header, "/UDP" );
klauss 0:4d17cd9c8f9d 562 strcat( header, this->my_ip );
klauss 0:4d17cd9c8f9d 563 strcat( header, ":" );
klauss 0:4d17cd9c8f9d 564 itoa( this->my_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 565 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 566 strcat( header, ";branch=" );
klauss 0:4d17cd9c8f9d 567 strcat( header, branch );
klauss 0:4d17cd9c8f9d 568 strcat( header, "\r\n" );
klauss 0:4d17cd9c8f9d 569 strcat( header, "From: " );
klauss 0:4d17cd9c8f9d 570 strcat( header, callbox_string );
klauss 0:4d17cd9c8f9d 571 strcat( header, " <sip:" );
klauss 0:4d17cd9c8f9d 572 itoa( this->my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 573 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 574 strcat( header, "@" );
klauss 0:4d17cd9c8f9d 575 strcat( header, this->server_ip );
klauss 0:4d17cd9c8f9d 576 strcat( header, ":" );
klauss 0:4d17cd9c8f9d 577 itoa( this->server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 578 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 579 strcat( header, ">;tag=" );
klauss 0:4d17cd9c8f9d 580 strcat( header, tag );
klauss 0:4d17cd9c8f9d 581 strcat( header, "\r\n" );
klauss 0:4d17cd9c8f9d 582 strcat( header, "To: <sip:" );
klauss 0:4d17cd9c8f9d 583 itoa( this->peer_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 584 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 585 strcat( header, "@" );
klauss 0:4d17cd9c8f9d 586 strcat( header, this->server_ip );
klauss 0:4d17cd9c8f9d 587 strcat( header, ":" );
klauss 0:4d17cd9c8f9d 588 itoa( this->server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 589 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 590 strcat( header, ">\r\n" );
klauss 0:4d17cd9c8f9d 591 strcat( header, "Call-ID: " );
klauss 0:4d17cd9c8f9d 592 strcat( header, callid );
klauss 0:4d17cd9c8f9d 593 strcat( header, "@" );
klauss 0:4d17cd9c8f9d 594 strcat( header, this->my_ip );
klauss 0:4d17cd9c8f9d 595 strcat( header, "\r\n" );
klauss 0:4d17cd9c8f9d 596 strcat( header, "CSeq: " );
klauss 0:4d17cd9c8f9d 597 itoa( *cseq, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 598 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 599 strcat( header, " INVITE\r\n" );
klauss 0:4d17cd9c8f9d 600 strcat( header, "Contact: " );
klauss 0:4d17cd9c8f9d 601 itoa( this->my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 602 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 603 strcat( header, " <sip:" );
klauss 0:4d17cd9c8f9d 604 itoa( this->my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 605 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 606 strcat( header, "@" );
klauss 0:4d17cd9c8f9d 607 strcat( header, this->my_ip );
klauss 0:4d17cd9c8f9d 608 strcat( header, ":" );
klauss 0:4d17cd9c8f9d 609 itoa( this->my_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 610 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 611 strcat( header, ">\r\n" );
klauss 0:4d17cd9c8f9d 612 strcat( header, "Max-Forwards: " );
klauss 0:4d17cd9c8f9d 613 itoa( 20, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 614 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 615 strcat( header, "\r\n" );
klauss 0:4d17cd9c8f9d 616 strcat( header, "User-Agent: VZtech/pabxdriver-" );
klauss 0:4d17cd9c8f9d 617 strcat( header, SVNREV );
klauss 0:4d17cd9c8f9d 618 strcat( header, "\r\n" );
klauss 0:4d17cd9c8f9d 619 strcat( header, "Expires: " );
klauss 0:4d17cd9c8f9d 620 itoa( 70, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 621 strcat( header, itoa_buffer );
klauss 0:4d17cd9c8f9d 622 strcat( header, "\r\n" );
klauss 0:4d17cd9c8f9d 623 strcat( header, SIP_ALLOW );
klauss 0:4d17cd9c8f9d 624 strcat( header, "\r\n" );
klauss 0:4d17cd9c8f9d 625 strcat( header, "Content-Type: application/sdp\r\n" );
klauss 0:4d17cd9c8f9d 626 header[ SIP_MAXMSGSIZE - 1 ] = 0;
klauss 0:4d17cd9c8f9d 627
klauss 0:4d17cd9c8f9d 628 strcpy( body, "v=0\r\n" );
klauss 0:4d17cd9c8f9d 629 strcat( body, "o=- " );
klauss 0:4d17cd9c8f9d 630 itoa( 7377, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 631 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 632 strcat( body, " " );
klauss 0:4d17cd9c8f9d 633 itoa( 18176, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 634 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 635 strcat( body, " IN IP" );
klauss 0:4d17cd9c8f9d 636 itoa( 4, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 637 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 638 strcat( body, " " );
klauss 0:4d17cd9c8f9d 639 strcat( body, this->my_ip );
klauss 0:4d17cd9c8f9d 640 strcat( body, "\r\n" );
klauss 0:4d17cd9c8f9d 641 strcat( body, "s=-\r\n" );
klauss 0:4d17cd9c8f9d 642 strcat( body, "c=IN IP" );
klauss 0:4d17cd9c8f9d 643 itoa( 4, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 644 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 645 strcat( body, " " );
klauss 0:4d17cd9c8f9d 646 strcat( body, this->my_ip );
klauss 0:4d17cd9c8f9d 647 strcat( body, "\r\n" );
klauss 0:4d17cd9c8f9d 648 strcat( body, "t=" );
klauss 0:4d17cd9c8f9d 649 itoa( 0, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 650 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 651 strcat( body, " " );
klauss 0:4d17cd9c8f9d 652 itoa( 0, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 653 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 654 strcat( body, "\r\n" );
klauss 0:4d17cd9c8f9d 655 strcat( body, "m=audio " );
klauss 0:4d17cd9c8f9d 656 itoa( this->my_rtp_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 657 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 658 strcat( body, " RTP/AVP " );
klauss 0:4d17cd9c8f9d 659 itoa( 8, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 660 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 661 strcat( body, " " );
klauss 0:4d17cd9c8f9d 662 itoa( 101, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 663 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 664 strcat( body, "\r\n" );
klauss 0:4d17cd9c8f9d 665 strcat( body, "a=rtpmap:" );
klauss 0:4d17cd9c8f9d 666 itoa( 8, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 667 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 668 strcat( body, " PCMA/" );
klauss 0:4d17cd9c8f9d 669 itoa( 8000, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 670 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 671 strcat( body, "/" );
klauss 0:4d17cd9c8f9d 672 itoa( 1, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 673 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 674 strcat( body, "\r\n" );
klauss 0:4d17cd9c8f9d 675 strcat( body, "a=rtpmap:" );
klauss 0:4d17cd9c8f9d 676 itoa( 101, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 677 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 678 strcat( body, " telephone-event/" );
klauss 0:4d17cd9c8f9d 679 itoa( 8000, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 680 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 681 strcat( body, "\r\n" );
klauss 0:4d17cd9c8f9d 682 strcat( body, "a=fmtp: " );
klauss 0:4d17cd9c8f9d 683 itoa( 101, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 684 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 685 strcat( body, " " );
klauss 0:4d17cd9c8f9d 686 itoa( 0, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 687 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 688 strcat( body, "-" );
klauss 0:4d17cd9c8f9d 689 itoa( 11, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 690 strcat( body, itoa_buffer );
klauss 0:4d17cd9c8f9d 691 body[ SIP_MAXMSGSIZE - 1 ] = 0;
klauss 0:4d17cd9c8f9d 692
klauss 0:4d17cd9c8f9d 693 make_content_length( header, body, pkg );
klauss 0:4d17cd9c8f9d 694 return( pkg );
klauss 0:4d17cd9c8f9d 695 }
klauss 0:4d17cd9c8f9d 696
klauss 0:4d17cd9c8f9d 697 char * Sip::make_content_length( char * header, char * body, char * pkg ){
klauss 0:4d17cd9c8f9d 698 int size;
klauss 0:4d17cd9c8f9d 699 char itoa_buffer[ 65 ];
klauss 0:4d17cd9c8f9d 700 size = strlen( body );
klauss 0:4d17cd9c8f9d 701 strcpy( pkg, header );
klauss 0:4d17cd9c8f9d 702 strcat( pkg, "Content-Length: " );
klauss 0:4d17cd9c8f9d 703 itoa( size, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 704 strcat( pkg, itoa_buffer );
klauss 0:4d17cd9c8f9d 705 strcat( pkg, "\r\n\r\n" );
klauss 0:4d17cd9c8f9d 706 strcat( pkg, body );
klauss 0:4d17cd9c8f9d 707 pkg[ SIP_MAXMSGSIZE - 1 ] = 0;
klauss 0:4d17cd9c8f9d 708 return pkg;
klauss 0:4d17cd9c8f9d 709 }
klauss 0:4d17cd9c8f9d 710
klauss 0:4d17cd9c8f9d 711 char * Sip::build_bye_package( char * buffer ){
klauss 0:4d17cd9c8f9d 712 char branch[SIP_MAXFIELDSIZE];
klauss 0:4d17cd9c8f9d 713 char tag[SIP_MAXFIELDSIZE];
klauss 0:4d17cd9c8f9d 714 char itoa_buffer[ 65 ];
klauss 0:4d17cd9c8f9d 715 fill_random16h(branch);
klauss 0:4d17cd9c8f9d 716 fill_random(tag,18);
klauss 0:4d17cd9c8f9d 717
klauss 0:4d17cd9c8f9d 718 strcpy( buffer, "BYE sip:" );
klauss 0:4d17cd9c8f9d 719 itoa( this->peer_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 720 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 721 strcat( buffer, "@" );
klauss 0:4d17cd9c8f9d 722 strcat( buffer, this->server_ip );
klauss 0:4d17cd9c8f9d 723 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 724 itoa( this->server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 725 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 726 strcat( buffer, " SIP/2.0\r\n" );
klauss 0:4d17cd9c8f9d 727 strcat( buffer, "Via: SIP/2.0/UDP " );
klauss 0:4d17cd9c8f9d 728 strcat( buffer, this->my_ip );
klauss 0:4d17cd9c8f9d 729 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 730 itoa( this->my_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 731 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 732 strcat( buffer, ";branch=" );
klauss 0:4d17cd9c8f9d 733 strcat( buffer, branch );
klauss 0:4d17cd9c8f9d 734 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 735 strcat( buffer, "From: " );
klauss 0:4d17cd9c8f9d 736 itoa( this->my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 737 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 738 strcat( buffer, " <sip:" );
klauss 0:4d17cd9c8f9d 739 itoa( this->my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 740 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 741 strcat( buffer, "@" );
klauss 0:4d17cd9c8f9d 742 strcat( buffer, this->server_ip );
klauss 0:4d17cd9c8f9d 743 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 744 itoa( this->server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 745 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 746 strcat( buffer, ">;tag=" );
klauss 0:4d17cd9c8f9d 747 strcat( buffer, last_invite_tag );
klauss 0:4d17cd9c8f9d 748 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 749 strcat( buffer, "To: <sip:" );
klauss 0:4d17cd9c8f9d 750 itoa( this->peer_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 751 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 752 strcat( buffer, "@" );
klauss 0:4d17cd9c8f9d 753 strcat( buffer, this->server_ip );
klauss 0:4d17cd9c8f9d 754 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 755 itoa( this->server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 756 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 757 strcat( buffer, ">;tag=" );
klauss 0:4d17cd9c8f9d 758 strcat( buffer, tag );
klauss 0:4d17cd9c8f9d 759 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 760 strcat( buffer, "Call-ID: " );
klauss 0:4d17cd9c8f9d 761 strcat( buffer, last_invite_callid );
klauss 0:4d17cd9c8f9d 762 strcat( buffer, "@" );
klauss 0:4d17cd9c8f9d 763 strcat( buffer, this->my_ip );
klauss 0:4d17cd9c8f9d 764 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 765 strcat( buffer, "CSeq: " );
klauss 0:4d17cd9c8f9d 766 itoa( get_cseq(), itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 767 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 768 strcat( buffer, " BYE\r\n" );
klauss 0:4d17cd9c8f9d 769 strcat( buffer, "Max-Forwards: 70\r\n" );
klauss 0:4d17cd9c8f9d 770 strcat( buffer, "User-Agent: VZtech/pabxdriver-" );
klauss 0:4d17cd9c8f9d 771 strcat( buffer, SVNREV );
klauss 0:4d17cd9c8f9d 772 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 773 strcat( buffer, "Content-Length: 0\r\n\r\n" );
klauss 0:4d17cd9c8f9d 774 return( buffer );
klauss 0:4d17cd9c8f9d 775 }
klauss 0:4d17cd9c8f9d 776 char * Sip::build_ack_package( char * buffer, unsigned char * orig ){
klauss 0:4d17cd9c8f9d 777 char to[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 778 char from[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 779 char callid[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 780 char via[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 781 char branch[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 782 char cseq[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 783 char itoa_buffer[ 65 ];
klauss 0:4d17cd9c8f9d 784 // FIXME confirmar se nao preciso converter todos os ints com itoa
klauss 0:4d17cd9c8f9d 785 if( decode_gettag( orig, "to: ", to ) == 0) {
klauss 0:4d17cd9c8f9d 786 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 787 return NULL;
klauss 0:4d17cd9c8f9d 788 }
klauss 0:4d17cd9c8f9d 789 if( decode_gettag( orig, "from: ", from ) == 0) {
klauss 0:4d17cd9c8f9d 790 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 791 return NULL;
klauss 0:4d17cd9c8f9d 792 }
klauss 0:4d17cd9c8f9d 793 if( decode_gettag( orig, "call-id: ", callid ) == 0) {
klauss 0:4d17cd9c8f9d 794 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 795 return NULL;
klauss 0:4d17cd9c8f9d 796 }
klauss 0:4d17cd9c8f9d 797 decode_branch( orig, branch );
klauss 0:4d17cd9c8f9d 798 decode_cseq( orig, cseq );
klauss 0:4d17cd9c8f9d 799
klauss 0:4d17cd9c8f9d 800 if( strlen( via ) > 6 ) {
klauss 0:4d17cd9c8f9d 801 if( strcasecmp( ";rport", via+strlen( via )-6) == 0) {
klauss 0:4d17cd9c8f9d 802 via[strlen(via)-6] = 0;
klauss 0:4d17cd9c8f9d 803 }
klauss 0:4d17cd9c8f9d 804 }
klauss 0:4d17cd9c8f9d 805 strcpy( buffer, "ACK sip:" );
klauss 0:4d17cd9c8f9d 806 itoa( this->peer_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 807 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 808 strcat( buffer, "@" );
klauss 0:4d17cd9c8f9d 809 strcat( buffer, this->server_ip );
klauss 0:4d17cd9c8f9d 810 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 811 itoa( this->server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 812 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 813 strcat( buffer, " SIP/2.0\r\n" );
klauss 0:4d17cd9c8f9d 814 strcat( buffer, "Via: SIP/2.0/UDP " );
klauss 0:4d17cd9c8f9d 815 strcat( buffer, this->my_ip );
klauss 0:4d17cd9c8f9d 816 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 817 itoa( this->my_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 818 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 819 strcat( buffer, ";branch=" );
klauss 0:4d17cd9c8f9d 820 strcat( buffer, branch );
klauss 0:4d17cd9c8f9d 821 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 822 strcat( buffer, "From: " );
klauss 0:4d17cd9c8f9d 823 strcat( buffer, from );
klauss 0:4d17cd9c8f9d 824 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 825 strcat( buffer, "To: " );
klauss 0:4d17cd9c8f9d 826 strcat( buffer, to );
klauss 0:4d17cd9c8f9d 827 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 828 strcat( buffer, "Call-ID: " );
klauss 0:4d17cd9c8f9d 829 strcat( buffer, callid );
klauss 0:4d17cd9c8f9d 830 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 831 strcat( buffer, "CSeq: " );
klauss 0:4d17cd9c8f9d 832 strcat( buffer, cseq );
klauss 0:4d17cd9c8f9d 833 strcat( buffer, " ACK\r\n" );
klauss 0:4d17cd9c8f9d 834 strcat( buffer, "Max-Forwards: 70\r\n" );
klauss 0:4d17cd9c8f9d 835 strcat( buffer, "Contact: " );
klauss 0:4d17cd9c8f9d 836 itoa( this->my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 837 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 838 strcat( buffer, " <sip:" );
klauss 0:4d17cd9c8f9d 839 itoa( this->my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 840 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 841 strcat( buffer, "@" );
klauss 0:4d17cd9c8f9d 842 strcat( buffer, this->my_ip );
klauss 0:4d17cd9c8f9d 843 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 844 itoa( this->my_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 845 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 846 strcat( buffer, ">\r\n" );
klauss 0:4d17cd9c8f9d 847 strcat( buffer, "User-Agent: VZtech/pabxdriver-" );
klauss 0:4d17cd9c8f9d 848 strcat( buffer, SVNREV );
klauss 0:4d17cd9c8f9d 849 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 850 strcat( buffer, "Content-Length: 0\r\n\r\n" );
klauss 0:4d17cd9c8f9d 851 buffer[SIP_MAXMSGSIZE-1] = 0;
klauss 0:4d17cd9c8f9d 852 return( buffer );
klauss 0:4d17cd9c8f9d 853 }
klauss 0:4d17cd9c8f9d 854
klauss 0:4d17cd9c8f9d 855 int Sip::get_return_code( char * buffer ){
klauss 0:4d17cd9c8f9d 856 char a[32];
klauss 0:4d17cd9c8f9d 857 int i = 0, j;
klauss 0:4d17cd9c8f9d 858 if( strncmp( "SIP/", buffer, 4 ) != 0 ) return 0;
klauss 0:4d17cd9c8f9d 859 if( strlen( buffer ) < 32) return 0;
klauss 0:4d17cd9c8f9d 860 strncpy( a, buffer, 31 );
klauss 0:4d17cd9c8f9d 861 a[ 31 ] = 0;
klauss 0:4d17cd9c8f9d 862 while ( a[ i ] > ' ') i++;
klauss 0:4d17cd9c8f9d 863 j = i+i;
klauss 0:4d17cd9c8f9d 864 while( (a[ j ] >= '0') && ( a[ j ] <= '9') ) j++;
klauss 0:4d17cd9c8f9d 865 a[ j ] = 0;
klauss 0:4d17cd9c8f9d 866 return atoi( a + i + 1 );
klauss 0:4d17cd9c8f9d 867 }
klauss 0:4d17cd9c8f9d 868
klauss 0:4d17cd9c8f9d 869 char * Sip::build_generic_reply_package(char * buffer, unsigned char * orig, char * tag){
klauss 0:4d17cd9c8f9d 870 char to[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 871 char from[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 872 char callid[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 873 char cseq[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 874 char via[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 875
klauss 0:4d17cd9c8f9d 876 if( decode_gettag( orig, "to: ", to ) == 0) {
klauss 0:4d17cd9c8f9d 877 buffer[0] = 0;
klauss 0:4d17cd9c8f9d 878 return NULL;
klauss 0:4d17cd9c8f9d 879 }
klauss 0:4d17cd9c8f9d 880 if( decode_gettag( orig, "from: ", from ) == 0) {
klauss 0:4d17cd9c8f9d 881 buffer[0] = 0;
klauss 0:4d17cd9c8f9d 882 return NULL;
klauss 0:4d17cd9c8f9d 883 }
klauss 0:4d17cd9c8f9d 884 if( decode_gettag( orig, "call-id: ", callid ) == 0) {
klauss 0:4d17cd9c8f9d 885 buffer[0] = 0;
klauss 0:4d17cd9c8f9d 886 return NULL;
klauss 0:4d17cd9c8f9d 887 }
klauss 0:4d17cd9c8f9d 888 if( decode_gettag( orig, "cseq: ", cseq ) == 0) {
klauss 0:4d17cd9c8f9d 889 buffer[0] = 0;
klauss 0:4d17cd9c8f9d 890 return NULL;
klauss 0:4d17cd9c8f9d 891 }
klauss 0:4d17cd9c8f9d 892 if( decode_gettag( orig, "via: ", via ) == 0) {
klauss 0:4d17cd9c8f9d 893 buffer[0] = 0;
klauss 0:4d17cd9c8f9d 894 return NULL;
klauss 0:4d17cd9c8f9d 895 }
klauss 0:4d17cd9c8f9d 896
klauss 0:4d17cd9c8f9d 897 if (strlen(via) > 6) {
klauss 0:4d17cd9c8f9d 898 if (strcasecmp(";rport",via+strlen(via)-6)==0) {
klauss 0:4d17cd9c8f9d 899 via[strlen(via)-6] = 0;
klauss 0:4d17cd9c8f9d 900 }
klauss 0:4d17cd9c8f9d 901 }
klauss 0:4d17cd9c8f9d 902
klauss 0:4d17cd9c8f9d 903 strcpy( buffer, "SIP/2.0 " );
klauss 0:4d17cd9c8f9d 904 strcat( buffer, tag );
klauss 0:4d17cd9c8f9d 905 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 906 strcat( buffer, "To: " );
klauss 0:4d17cd9c8f9d 907 strcat( buffer, to );
klauss 0:4d17cd9c8f9d 908 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 909 strcat( buffer, "From: " );
klauss 0:4d17cd9c8f9d 910 strcat( buffer, from );
klauss 0:4d17cd9c8f9d 911 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 912 strcat( buffer, "Call-ID: " );
klauss 0:4d17cd9c8f9d 913 strcat( buffer, callid );
klauss 0:4d17cd9c8f9d 914 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 915 strcat( buffer, "CSeq: " );
klauss 0:4d17cd9c8f9d 916 strcat( buffer, cseq );
klauss 0:4d17cd9c8f9d 917 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 918 strcat( buffer, "Via: " );
klauss 0:4d17cd9c8f9d 919 strcat( buffer, via );
klauss 0:4d17cd9c8f9d 920 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 921 strcat( buffer, "Server: VZtech/pabxdriver-" );
klauss 0:4d17cd9c8f9d 922 strcat( buffer, SVNREV );
klauss 0:4d17cd9c8f9d 923 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 924 strcat( buffer, "Content-Length: 0\r\n\r\n" );
klauss 0:4d17cd9c8f9d 925 buffer[ SIP_MAXMSGSIZE - 1 ] = 0;
klauss 0:4d17cd9c8f9d 926 return( buffer );
klauss 0:4d17cd9c8f9d 927 }
klauss 0:4d17cd9c8f9d 928 char * Sip::build_trying_package( char * buffer, unsigned char * orig ){
klauss 0:4d17cd9c8f9d 929 // FIXME trocar 100 para itoa( 100 ... )
klauss 0:4d17cd9c8f9d 930 build_generic_reply_package( buffer, orig, "100 Trying" );
klauss 0:4d17cd9c8f9d 931 return( buffer );
klauss 0:4d17cd9c8f9d 932 }
klauss 0:4d17cd9c8f9d 933
klauss 0:4d17cd9c8f9d 934 char * Sip::build_busy_package( char * buffer, unsigned char * orig ){
klauss 0:4d17cd9c8f9d 935 // FIXME trocar 100 para itoa( 100 ... )
klauss 0:4d17cd9c8f9d 936 build_generic_reply_package( buffer, orig, "486 Busy Here");
klauss 0:4d17cd9c8f9d 937 return( buffer );
klauss 0:4d17cd9c8f9d 938 }
klauss 0:4d17cd9c8f9d 939 char * Sip::build_reply_package( char * buffer, unsigned char * orig ){
klauss 0:4d17cd9c8f9d 940 char to[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 941 char from[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 942 char callid[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 943 char cseq[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 944 char via[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 945 char tag[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 946
klauss 0:4d17cd9c8f9d 947 if( decode_gettag( orig, "to: ", to ) == 0) {
klauss 0:4d17cd9c8f9d 948 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 949 return NULL;
klauss 0:4d17cd9c8f9d 950 }
klauss 0:4d17cd9c8f9d 951 if( decode_gettag( orig, "from: ", from ) == 0) {
klauss 0:4d17cd9c8f9d 952 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 953 return NULL;
klauss 0:4d17cd9c8f9d 954 }
klauss 0:4d17cd9c8f9d 955 if( decode_gettag( orig, "call-id: ", callid ) == 0 ) {
klauss 0:4d17cd9c8f9d 956 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 957 return NULL;
klauss 0:4d17cd9c8f9d 958 }
klauss 0:4d17cd9c8f9d 959 if( decode_gettag( orig, "cseq: ", cseq) == 0 ) {
klauss 0:4d17cd9c8f9d 960 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 961 return NULL;
klauss 0:4d17cd9c8f9d 962 }
klauss 0:4d17cd9c8f9d 963 if( decode_gettag( orig, "via: ", via) == 0 ) {
klauss 0:4d17cd9c8f9d 964 buffer[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 965 return NULL;
klauss 0:4d17cd9c8f9d 966 }
klauss 0:4d17cd9c8f9d 967
klauss 0:4d17cd9c8f9d 968 if (strlen(via) > 6) {
klauss 0:4d17cd9c8f9d 969 if (strcasecmp(";rport",via+strlen(via)-6)==0) {
klauss 0:4d17cd9c8f9d 970 via[strlen(via)-6] = 0;
klauss 0:4d17cd9c8f9d 971 }
klauss 0:4d17cd9c8f9d 972 }
klauss 0:4d17cd9c8f9d 973 fill_random(tag,18);
klauss 0:4d17cd9c8f9d 974
klauss 0:4d17cd9c8f9d 975 strcpy( buffer, "SIP/2.0 200 OK\r\n" );
klauss 0:4d17cd9c8f9d 976 strcat( buffer, "To: " );
klauss 0:4d17cd9c8f9d 977 strcat( buffer, to );
klauss 0:4d17cd9c8f9d 978 strcat( buffer, ";tag=" );
klauss 0:4d17cd9c8f9d 979 strcat( buffer, tag );
klauss 0:4d17cd9c8f9d 980 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 981
klauss 0:4d17cd9c8f9d 982 strcat( buffer, "From: " );
klauss 0:4d17cd9c8f9d 983 strcat( buffer, from );
klauss 0:4d17cd9c8f9d 984 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 985
klauss 0:4d17cd9c8f9d 986 strcat( buffer, "Call-ID: " );
klauss 0:4d17cd9c8f9d 987 strcat( buffer, callid );
klauss 0:4d17cd9c8f9d 988 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 989
klauss 0:4d17cd9c8f9d 990 strcat( buffer, "CSeq: " );
klauss 0:4d17cd9c8f9d 991 strcat( buffer, cseq );
klauss 0:4d17cd9c8f9d 992 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 993
klauss 0:4d17cd9c8f9d 994 strcat( buffer, "Via: " );
klauss 0:4d17cd9c8f9d 995 strcat( buffer, via );
klauss 0:4d17cd9c8f9d 996 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 997
klauss 0:4d17cd9c8f9d 998 strcat( buffer, "Server: VZtech/pabxdriver-" );
klauss 0:4d17cd9c8f9d 999 strcat( buffer, SVNREV );
klauss 0:4d17cd9c8f9d 1000 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 1001 strcat( buffer, "Content-Length: 0\r\n" );
klauss 0:4d17cd9c8f9d 1002 strcat( buffer, SIP_ALLOW );
klauss 0:4d17cd9c8f9d 1003 strcat( buffer, "\r\n\r\n" );
klauss 0:4d17cd9c8f9d 1004
klauss 0:4d17cd9c8f9d 1005 buffer[ SIP_MAXMSGSIZE - 1 ] = 0;
klauss 0:4d17cd9c8f9d 1006 return( buffer );
klauss 0:4d17cd9c8f9d 1007 }
klauss 0:4d17cd9c8f9d 1008 char * Sip::fill_random16h(char * buffer ){
klauss 0:4d17cd9c8f9d 1009 fill_random( buffer, 16 );
klauss 0:4d17cd9c8f9d 1010 buffer[ 7 ] = '-';
klauss 0:4d17cd9c8f9d 1011 return( buffer );
klauss 0:4d17cd9c8f9d 1012 }
klauss 0:4d17cd9c8f9d 1013
klauss 0:4d17cd9c8f9d 1014 char * Sip::fill_random( char * buffer, int size ){
klauss 0:4d17cd9c8f9d 1015 static uint16_t seed = time( NULL );
klauss 0:4d17cd9c8f9d 1016 seed += 1;
klauss 0:4d17cd9c8f9d 1017 srand( seed );
klauss 0:4d17cd9c8f9d 1018
klauss 0:4d17cd9c8f9d 1019 int i;
klauss 0:4d17cd9c8f9d 1020 for (i=0; i<size; i++) {
klauss 0:4d17cd9c8f9d 1021 buffer[ i ] = fill_random_aux[ rand() & 0x3f ];
klauss 0:4d17cd9c8f9d 1022 }
klauss 0:4d17cd9c8f9d 1023 buffer[ size ] = 0;
klauss 0:4d17cd9c8f9d 1024 return( buffer );
klauss 0:4d17cd9c8f9d 1025 }
klauss 0:4d17cd9c8f9d 1026
klauss 0:4d17cd9c8f9d 1027 int Sip::get_cseq( void ){
klauss 0:4d17cd9c8f9d 1028 static unsigned int cseq = 0;
klauss 0:4d17cd9c8f9d 1029 if( cseq == 0 ) {
klauss 0:4d17cd9c8f9d 1030 /* initial value, random number */
klauss 0:4d17cd9c8f9d 1031 cseq = rand();
klauss 0:4d17cd9c8f9d 1032 cseq &= 0x7fff;
klauss 0:4d17cd9c8f9d 1033 }
klauss 0:4d17cd9c8f9d 1034 cseq++;
klauss 0:4d17cd9c8f9d 1035 cseq &= 0x7fff;
klauss 0:4d17cd9c8f9d 1036 if( cseq == 0 ) cseq++;
klauss 0:4d17cd9c8f9d 1037 return cseq;
klauss 0:4d17cd9c8f9d 1038 }
klauss 0:4d17cd9c8f9d 1039
klauss 0:4d17cd9c8f9d 1040 char * Sip::decode_cseq( unsigned char * package, char * cseq ){
klauss 0:4d17cd9c8f9d 1041 char pkg[ 2048 ], cs[ 2048 ];
klauss 0:4d17cd9c8f9d 1042 if( decode_gettag( package, "cseq: ", pkg ) != 0) {
klauss 0:4d17cd9c8f9d 1043 int i = 0;
klauss 0:4d17cd9c8f9d 1044 strcpy( cs, pkg );
klauss 0:4d17cd9c8f9d 1045 while( ( cs[ i ] != 0 ) && ( cs[ i ] != ' ' ) ) i++;
klauss 0:4d17cd9c8f9d 1046 cs[ i ] = 0;
klauss 0:4d17cd9c8f9d 1047 strcpy( cseq, cs );
klauss 0:4d17cd9c8f9d 1048 } else {
klauss 0:4d17cd9c8f9d 1049 cseq[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 1050 }
klauss 0:4d17cd9c8f9d 1051 return( cseq );
klauss 0:4d17cd9c8f9d 1052 }
klauss 0:4d17cd9c8f9d 1053
klauss 0:4d17cd9c8f9d 1054 char * Sip::decode_branch( unsigned char * package, char * branch ){
klauss 0:4d17cd9c8f9d 1055 char pkg[ 2048 ];
klauss 0:4d17cd9c8f9d 1056 if( decode_gettag( package, "branch=", pkg ) != 0 ) {
klauss 0:4d17cd9c8f9d 1057 int i = 0;
klauss 0:4d17cd9c8f9d 1058 strcpy( branch, pkg );
klauss 0:4d17cd9c8f9d 1059 while( ( branch[ i ] != 0 ) && ( branch[ i ] != ';' ) ) i++;
klauss 0:4d17cd9c8f9d 1060 branch[ i ] = 0;
klauss 0:4d17cd9c8f9d 1061 } else {
klauss 0:4d17cd9c8f9d 1062 branch[ 0 ] = 0;
klauss 0:4d17cd9c8f9d 1063 }
klauss 0:4d17cd9c8f9d 1064 return( branch );
klauss 0:4d17cd9c8f9d 1065 }
klauss 0:4d17cd9c8f9d 1066 int Sip::decode_gettag( unsigned char * package, char * tag, char * out ){
klauss 0:4d17cd9c8f9d 1067 int size, i, cmpsize;
klauss 0:4d17cd9c8f9d 1068 cmpsize = strlen( tag );
klauss 0:4d17cd9c8f9d 1069 size = strlen( ( char * )package )-cmpsize;
klauss 0:4d17cd9c8f9d 1070 for ( i=0; i<size; i++) {
klauss 0:4d17cd9c8f9d 1071 if( strncasecmp( tag, (char*)package+i, cmpsize ) == 0) {
klauss 0:4d17cd9c8f9d 1072 char * s;
klauss 0:4d17cd9c8f9d 1073 s = (char*)package+i+cmpsize;
klauss 0:4d17cd9c8f9d 1074 register int j = 0;
klauss 0:4d17cd9c8f9d 1075 while ((s[ j ] != '\r') && (s[ j ] != '\n')) j++;
klauss 0:4d17cd9c8f9d 1076 strncpy( out, s, j ); // copy string to output
klauss 0:4d17cd9c8f9d 1077 out[ j ] = 0; // terminate string
klauss 0:4d17cd9c8f9d 1078 return 1; // found
klauss 0:4d17cd9c8f9d 1079 }
klauss 0:4d17cd9c8f9d 1080 }
klauss 0:4d17cd9c8f9d 1081 return 0; // not found
klauss 0:4d17cd9c8f9d 1082 }
klauss 0:4d17cd9c8f9d 1083
klauss 0:4d17cd9c8f9d 1084 int Sip::get_id( void ){
klauss 0:4d17cd9c8f9d 1085 return this->id;
klauss 0:4d17cd9c8f9d 1086 }
klauss 0:4d17cd9c8f9d 1087 int Sip::get_my_rtp_port( void ){
klauss 0:4d17cd9c8f9d 1088 return this->my_rtp_port;
klauss 0:4d17cd9c8f9d 1089 }
klauss 0:4d17cd9c8f9d 1090 inline int Sip::fill_random_rtp_port(){
klauss 0:4d17cd9c8f9d 1091 // o range [ 16384 - 32767 ] eh configuravel no server
klauss 4:de46f0d9b14d 1092 return ( ( this->my_ext + 16384 ) );
klauss 0:4d17cd9c8f9d 1093 }
klauss 0:4d17cd9c8f9d 1094
klauss 0:4d17cd9c8f9d 1095 void Sip::change_sip_server(){
klauss 0:4d17cd9c8f9d 1096 // just in case sip server don't answer, invite another server
klauss 0:4d17cd9c8f9d 1097 // mudar para os sets
klauss 0:4d17cd9c8f9d 1098 set_server_ip( get_next_server_ip( this->buffer) );
klauss 0:4d17cd9c8f9d 1099 set_server_ext( get_next_server_ext() );
klauss 0:4d17cd9c8f9d 1100 set_server_port( get_next_server_port() );
klauss 0:4d17cd9c8f9d 1101 registry();
klauss 0:4d17cd9c8f9d 1102 }
klauss 0:4d17cd9c8f9d 1103
klauss 0:4d17cd9c8f9d 1104 char * Sip::get_next_server_ip( char * server_ip ){
klauss 0:4d17cd9c8f9d 1105 strcpy( server_ip, this->server_ip );
klauss 0:4d17cd9c8f9d 1106 return server_ip;
klauss 0:4d17cd9c8f9d 1107 }
klauss 0:4d17cd9c8f9d 1108 int Sip::get_next_server_port(){
klauss 0:4d17cd9c8f9d 1109 return this->server_port;
klauss 0:4d17cd9c8f9d 1110 }
klauss 0:4d17cd9c8f9d 1111 int Sip::get_next_server_ext(){
klauss 0:4d17cd9c8f9d 1112 return this->peer_ext;
klauss 0:4d17cd9c8f9d 1113 }
klauss 0:4d17cd9c8f9d 1114 void Sip::set_server_port( int new_server_port ){
klauss 0:4d17cd9c8f9d 1115 this->server_port = new_server_port;
klauss 0:4d17cd9c8f9d 1116 }
klauss 0:4d17cd9c8f9d 1117 void Sip::set_server_ext( int new_server_ext ){
klauss 0:4d17cd9c8f9d 1118 this->peer_ext = new_server_ext;
klauss 0:4d17cd9c8f9d 1119 }
klauss 0:4d17cd9c8f9d 1120 void Sip::set_server_ip( char * new_server_ip ){
klauss 0:4d17cd9c8f9d 1121 strcpy( this->server_ip, new_server_ip );
klauss 0:4d17cd9c8f9d 1122 this->server_ip[19] = 0;
klauss 0:4d17cd9c8f9d 1123 }
klauss 0:4d17cd9c8f9d 1124
klauss 0:4d17cd9c8f9d 1125 /* Retorna
klauss 0:4d17cd9c8f9d 1126 = 0 :: ok
klauss 0:4d17cd9c8f9d 1127 < 0 :: tive problemas
klauss 0:4d17cd9c8f9d 1128 > 0 :: devo remover essa call do vetor de calls
klauss 0:4d17cd9c8f9d 1129 */
klauss 0:4d17cd9c8f9d 1130 int Sip::listen_SIP_server( void ){
klauss 14:22a35f575502 1131 sock.set_blocking( false, 1 );
klauss 15:9c7456c1b6f4 1132 //debug_msg("");
klauss 0:4d17cd9c8f9d 1133 uint8_t read = sock.receiveFrom( sip_server, this->buffer, sizeof( this->buffer ) );
klauss 9:ffa64f38ef9c 1134 if( read > 0 ){
klauss 13:ae278302dffe 1135 //debug_msg( "-- SIP recebeu algo --" );
klauss 0:4d17cd9c8f9d 1136 if( !( strncasecmp( buffer, "bye", strlen("bye") ) ) ){
klauss 13:ae278302dffe 1137 char ans[ 2000 ];
klauss 0:4d17cd9c8f9d 1138 build_reply_package( ans, (unsigned char*)buffer );
klauss 13:ae278302dffe 1139 sock.sendTo( sip_server, ans, sizeof( ans ) );
klauss 13:ae278302dffe 1140 debug_msg(" Server request BYE to %d ext", my_ext );
klauss 0:4d17cd9c8f9d 1141 return( this->my_ext );
klauss 0:4d17cd9c8f9d 1142 }else if( !( strncasecmp( buffer, "options", strlen("options") ) ) ){
klauss 13:ae278302dffe 1143 char ans[ 2000 ];
klauss 13:ae278302dffe 1144 debug_msg(" Options received ");
klauss 0:4d17cd9c8f9d 1145 build_reply_package( ans, (unsigned char*)buffer );
klauss 13:ae278302dffe 1146 sock.sendTo( sip_server, ans, sizeof( ans ) );
klauss 15:9c7456c1b6f4 1147 //debug_msg("");
klauss 0:4d17cd9c8f9d 1148 }
klauss 0:4d17cd9c8f9d 1149 }
klauss 0:4d17cd9c8f9d 1150 return( 0 );
klauss 0:4d17cd9c8f9d 1151 }
klauss 0:4d17cd9c8f9d 1152
klauss 0:4d17cd9c8f9d 1153 void Sip::set_ext( int ext ){
klauss 0:4d17cd9c8f9d 1154 my_ext = ext;
klauss 0:4d17cd9c8f9d 1155 }
klauss 0:4d17cd9c8f9d 1156
klauss 0:4d17cd9c8f9d 1157 void Sip::set_port( int port ){
klauss 0:4d17cd9c8f9d 1158 my_port = port;
klauss 0:4d17cd9c8f9d 1159 }
klauss 0:4d17cd9c8f9d 1160
klauss 0:4d17cd9c8f9d 1161 void Sip::send_bye( void ){
klauss 0:4d17cd9c8f9d 1162 build_bye_package( this->buffer );
klauss 0:4d17cd9c8f9d 1163 sock.sendTo( sip_server, build_bye_package( this->buffer ), sizeof( this->buffer ) );
klauss 0:4d17cd9c8f9d 1164 }
klauss 0:4d17cd9c8f9d 1165
klauss 0:4d17cd9c8f9d 1166 void Sip::send_unregistry_pkg(){
klauss 0:4d17cd9c8f9d 1167 build_unregistry_package( this->buffer );
klauss 0:4d17cd9c8f9d 1168 for( register int i = 0; i < 7; i++ )
klauss 0:4d17cd9c8f9d 1169 sock.sendTo( sip_server, build_bye_package( this->buffer ), sizeof( this->buffer ) );
klauss 0:4d17cd9c8f9d 1170 }
klauss 0:4d17cd9c8f9d 1171
klauss 0:4d17cd9c8f9d 1172 char * Sip::build_unregistry_package( char * buffer ){
klauss 0:4d17cd9c8f9d 1173 char branch[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 1174 char tag[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 1175 char callid[ SIP_MAXFIELDSIZE ];
klauss 0:4d17cd9c8f9d 1176 fill_random16h( branch );
klauss 0:4d17cd9c8f9d 1177 fill_random( tag, 18 );
klauss 0:4d17cd9c8f9d 1178 fill_random16h( callid );
klauss 0:4d17cd9c8f9d 1179 char itoa_buffer[ 65 ];
klauss 0:4d17cd9c8f9d 1180 strcpy( buffer, "REGISTER sip:" );
klauss 0:4d17cd9c8f9d 1181 strcat( buffer, server_ip );
klauss 0:4d17cd9c8f9d 1182 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 1183 itoa( server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 1184 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1185 strcat( buffer, " SIP/2.0\r\nVia: SIP/2.0/UDP " );
klauss 0:4d17cd9c8f9d 1186 strcat( buffer, my_ip );
klauss 0:4d17cd9c8f9d 1187 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 1188 itoa( my_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 1189 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1190 strcat( buffer, ";branch=" );
klauss 0:4d17cd9c8f9d 1191 strcat( buffer, branch );
klauss 0:4d17cd9c8f9d 1192 strcat( buffer, "\r\nFrom: " );
klauss 0:4d17cd9c8f9d 1193 itoa( my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 1194 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1195 strcat( buffer, " <sip:" );
klauss 0:4d17cd9c8f9d 1196 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1197 strcat( buffer, "@" );
klauss 0:4d17cd9c8f9d 1198 strcat( buffer, server_ip );
klauss 0:4d17cd9c8f9d 1199 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 1200 itoa( server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 1201 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1202 strcat( buffer, ">;tag=" );
klauss 0:4d17cd9c8f9d 1203 strcat( buffer, tag );
klauss 0:4d17cd9c8f9d 1204 strcat( buffer, "\r\nTo: " );
klauss 0:4d17cd9c8f9d 1205 itoa( my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 1206 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1207 strcat( buffer, " <sip:" );
klauss 0:4d17cd9c8f9d 1208 itoa( my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 1209 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1210 strcat( buffer, "@" );
klauss 0:4d17cd9c8f9d 1211 strcat( buffer, server_ip );
klauss 0:4d17cd9c8f9d 1212 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 1213 itoa( server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 1214 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1215 strcat( buffer, ">\r\nCall-ID: " );
klauss 0:4d17cd9c8f9d 1216 strcat( buffer, callid );
klauss 0:4d17cd9c8f9d 1217 strcat( buffer, "\r\nCSeq: " );
klauss 0:4d17cd9c8f9d 1218 itoa( get_cseq(), itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 1219 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1220 strcat( buffer, " REGISTER\r\n" );
klauss 0:4d17cd9c8f9d 1221 strcat( buffer, "Max-Forwards: " );
klauss 0:4d17cd9c8f9d 1222 itoa( 70, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 1223 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1224 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 1225
klauss 0:4d17cd9c8f9d 1226 strcat( buffer, "Contact: " );
klauss 0:4d17cd9c8f9d 1227 itoa( my_ext, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 1228 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1229 strcat( buffer, " <sip:" );
klauss 0:4d17cd9c8f9d 1230 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1231 strcat( buffer, "@" );
klauss 0:4d17cd9c8f9d 1232 strcat( buffer, my_ip );
klauss 0:4d17cd9c8f9d 1233 strcat( buffer, ":" );
klauss 0:4d17cd9c8f9d 1234 itoa( server_port, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 1235 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1236 strcat( buffer, ">;expires=0\r\n" );
klauss 0:4d17cd9c8f9d 1237 /*
klauss 0:4d17cd9c8f9d 1238 strcat( buffer, ">;expires=" );
klauss 0:4d17cd9c8f9d 1239 itoa( 0, itoa_buffer, 10 );
klauss 0:4d17cd9c8f9d 1240 strcat( buffer, itoa_buffer );
klauss 0:4d17cd9c8f9d 1241 strcat( buffer, "\r\n" );
klauss 0:4d17cd9c8f9d 1242 */
klauss 0:4d17cd9c8f9d 1243
klauss 0:4d17cd9c8f9d 1244 strcat( buffer, "User-Agent: VZtech/pabxdriver-" );
klauss 0:4d17cd9c8f9d 1245 strcat( buffer, SVNREV );
klauss 0:4d17cd9c8f9d 1246 strcat( buffer, "\r\nContent-Length: 0\r\n" );
klauss 0:4d17cd9c8f9d 1247 strcat( buffer, SIP_ALLOW );
klauss 0:4d17cd9c8f9d 1248 strcat( buffer, "\r\n\r\n" );
klauss 0:4d17cd9c8f9d 1249 buffer[ SIP_MAXMSGSIZE - 1 ] = 0;
klauss 0:4d17cd9c8f9d 1250 return buffer;
klauss 0:4d17cd9c8f9d 1251 }