Changeset 105 for pjproject/trunk/pjsip/src/pjsip/sip_transport_udp.c
- Timestamp:
- Dec 26, 2005 12:52:19 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip/sip_transport_udp.c
r65 r105 41 41 42 42 /* 43 * on_read_complete()43 * udp_on_read_complete() 44 44 * 45 45 * This is callback notification from ioqueue that a pending recvfrom() 46 46 * operation has completed. 47 47 */ 48 static void on_read_complete( pj_ioqueue_key_t *key,49 50 48 static void udp_on_read_complete( pj_ioqueue_key_t *key, 49 pj_ioqueue_op_key_t *op_key, 50 pj_ssize_t bytes_read) 51 51 { 52 52 enum { MAX_IMMEDIATE_PACKET = 10 }; … … 73 73 if (bytes_read > 0) { 74 74 pj_size_t size_eaten; 75 75 const pj_sockaddr_in *src_addr = 76 (pj_sockaddr_in*)&rdata->pkt_info.src_addr; 77 78 /* Init pkt_info part. */ 76 79 rdata->pkt_info.len = bytes_read; 77 80 rdata->pkt_info.zero = 0; 78 81 pj_gettimeofday(&rdata->pkt_info.timestamp); 82 pj_native_strcpy(rdata->pkt_info.src_name, 83 pj_inet_ntoa(src_addr->sin_addr)); 84 rdata->pkt_info.src_port = pj_ntohs(src_addr->sin_port); 79 85 80 86 size_eaten = … … 110 116 /* Read next packet. */ 111 117 bytes_read = sizeof(rdata->pkt_info.packet); 112 rdata->pkt_info. addr_len = sizeof(rdata->pkt_info.addr);118 rdata->pkt_info.src_addr_len = sizeof(rdata->pkt_info.src_addr); 113 119 status = pj_ioqueue_recvfrom(key, op_key, 114 120 rdata->pkt_info.packet, 115 121 &bytes_read, flags, 116 &rdata->pkt_info. addr,117 &rdata->pkt_info. addr_len);122 &rdata->pkt_info.src_addr, 123 &rdata->pkt_info.src_addr_len); 118 124 119 125 if (status == PJ_SUCCESS) { … … 150 156 151 157 /* 152 * on_write_complete()158 * udp_on_write_complete() 153 159 * 154 160 * This is callback notification from ioqueue that a pending sendto() 155 161 * operation has completed. 156 162 */ 157 static void on_write_complete( pj_ioqueue_key_t *key,158 159 163 static void udp_on_write_complete( pj_ioqueue_key_t *key, 164 pj_ioqueue_op_key_t *op_key, 165 pj_ssize_t bytes_sent) 160 166 { 161 167 struct udp_transport *tp = pj_ioqueue_get_user_data(key); … … 170 176 171 177 /* 172 * transport_send_msg()178 * udp_send_msg() 173 179 * 174 180 * This function is called by transport manager (by transport->send_msg()) 175 181 * to send outgoing message. 176 182 */ 177 static pj_status_t transport_send_msg( pjsip_transport *transport, 178 pjsip_tx_data *tdata, 179 const pj_sockaddr_in *rem_addr, 180 void *token, 181 void (*callback)(pjsip_transport*, 182 void *token, 183 pj_ssize_t)) 183 static pj_status_t udp_send_msg( pjsip_transport *transport, 184 pjsip_tx_data *tdata, 185 const pj_sockaddr_t *rem_addr, 186 int addr_len, 187 void *token, 188 void (*callback)(pjsip_transport*, 189 void *token, 190 pj_ssize_t)) 184 191 { 185 192 struct udp_transport *tp = (struct udp_transport*)transport; … … 198 205 return pj_ioqueue_sendto(tp->key, (pj_ioqueue_op_key_t*)&tdata->op_key, 199 206 tdata->buf.start, &size, 0, 200 rem_addr, (rem_addr ? sizeof(pj_sockaddr_in):0));201 } 202 203 /* 204 * transport_destroy()207 rem_addr, addr_len); 208 } 209 210 /* 211 * udp_destroy() 205 212 * 206 213 * This function is called by transport manager (by transport->destroy()). 207 214 */ 208 static pj_status_t transport_destroy( pjsip_transport *transport )215 static pj_status_t udp_destroy( pjsip_transport *transport ) 209 216 { 210 217 struct udp_transport *tp = (struct udp_transport*)transport; … … 250 257 PJ_DEF(pj_status_t) pjsip_udp_transport_attach( pjsip_endpoint *endpt, 251 258 pj_sock_t sock, 252 const pj _sockaddr_in *pub_addr,259 const pjsip_host_port *a_name, 253 260 unsigned async_cnt, 254 261 pjsip_transport **p_transport) … … 259 266 pj_ioqueue_callback ioqueue_cb; 260 267 unsigned i; 261 int addrlen;262 268 pj_status_t status; 263 269 264 270 /* Create pool. */ 265 271 pool = pjsip_endpt_create_pool(endpt, "udp%p", PJSIP_POOL_LEN_TRANSPORT, 266 272 PJSIP_POOL_INC_TRANSPORT); 267 273 if (!pool) 268 274 return PJ_ENOMEM; 269 275 276 /* Create the UDP transport object. */ 270 277 tp = pj_pool_zalloc(pool, sizeof(struct udp_transport)); 278 279 /* Save pool. */ 271 280 tp->base.pool = pool; 272 tp->base.endpt = endpt; 273 274 /* Init type, type_name, and flag */ 275 tp->base.type = PJSIP_TRANSPORT_UDP; 276 pj_native_strcpy(tp->base.type_name, "UDP"); 277 tp->base.flag = pjsip_transport_get_flag_from_type(PJSIP_TRANSPORT_UDP); 278 279 /* Init addresses. */ 280 addrlen = sizeof(tp->base.local_addr); 281 status = pj_sock_getsockname(sock, &tp->base.local_addr, &addrlen); 282 if (status != PJ_SUCCESS) { 283 pjsip_endpt_destroy_pool(endpt, pool); 284 return status; 285 } 286 pj_memcpy(&tp->base.public_addr, pub_addr, sizeof(pj_sockaddr_in)); 287 tp->base.rem_addr.sin_family = PJ_AF_INET; 281 282 /* Object name. */ 283 pj_sprintf(tp->base.obj_name, "udp%p", tp); 288 284 289 285 /* Init reference counter. */ … … 296 292 if (status != PJ_SUCCESS) 297 293 goto on_error; 294 295 /* Set type. */ 296 tp->base.key.type = PJSIP_TRANSPORT_UDP; 297 298 /* Remote address is left zero (except the family) */ 299 tp->base.key.rem_addr.sa_family = PJ_AF_INET; 300 301 /* Type name. */ 302 tp->base.type_name = "UDP"; 303 304 /* Transport flag */ 305 tp->base.flag = pjsip_transport_get_flag_from_type(PJSIP_TRANSPORT_UDP); 306 307 308 /* Length of addressess. */ 309 tp->base.addr_len = sizeof(pj_sockaddr_in); 310 311 /* Init local address. */ 312 status = pj_sock_getsockname(sock, &tp->base.local_addr, 313 &tp->base.addr_len); 314 if (status != PJ_SUCCESS) 315 goto on_error; 316 317 /* Init address name (published address) */ 318 pj_strdup_with_null(pool, &tp->base.local_name.host, &a_name->host); 319 tp->base.local_name.port = a_name->port; 320 321 /* Init remote name. */ 322 tp->base.remote_name.host = pj_str("0.0.0.0"); 323 tp->base.remote_name.port = 0; 324 325 /* Transport info. */ 326 tp->base.info = pj_pool_alloc(pool, 80); 327 pj_sprintf(tp->base.info, "udp %s:%d [published as %s:%d]", 328 pj_inet_ntoa(((pj_sockaddr_in*)&tp->base.local_addr)->sin_addr), 329 pj_ntohs(((pj_sockaddr_in*)&tp->base.local_addr)->sin_port), 330 tp->base.local_name.host, 331 tp->base.local_name.port); 332 333 /* Set endpoint. */ 334 tp->base.endpt = endpt; 335 336 /* Transport manager and timer will be initialized by tpmgr */ 298 337 299 338 /* Attach socket. */ … … 303 342 ioqueue = pjsip_endpt_get_ioqueue(endpt); 304 343 pj_memset(&ioqueue_cb, 0, sizeof(ioqueue_cb)); 305 ioqueue_cb.on_read_complete = & on_read_complete;306 ioqueue_cb.on_write_complete = & on_write_complete;344 ioqueue_cb.on_read_complete = &udp_on_read_complete; 345 ioqueue_cb.on_write_complete = &udp_on_write_complete; 307 346 status = pj_ioqueue_register_sock(pool, ioqueue, tp->sock, tp, 308 347 &ioqueue_cb, &tp->key); … … 311 350 312 351 /* Set functions. */ 313 tp->base.send_msg = & transport_send_msg;314 tp->base.destroy = & transport_destroy;352 tp->base.send_msg = &udp_send_msg; 353 tp->base.destroy = &udp_destroy; 315 354 316 355 /* This is a permanent transport, so we initialize the ref count … … 331 370 for (i=0; i<async_cnt; ++i) { 332 371 pj_pool_t *rdata_pool = pjsip_endpt_create_pool(endpt, "rtd%p", 333 PJSIP_POOL_ LEN_RDATA,334 PJSIP_POOL_ INC_RDATA);372 PJSIP_POOL_RDATA_LEN, 373 PJSIP_POOL_RDATA_INC); 335 374 if (!rdata_pool) { 336 375 pj_atomic_set(tp->base.ref_cnt, 0); … … 340 379 341 380 tp->rdata[i] = pj_pool_zalloc(rdata_pool, sizeof(pjsip_rx_data)); 381 382 /* Init tp_info part. */ 342 383 tp->rdata[i]->tp_info.pool = rdata_pool; 343 384 tp->rdata[i]->tp_info.transport = &tp->base; … … 353 394 354 395 size = sizeof(tp->rdata[i]->pkt_info.packet); 355 tp->rdata[i]->pkt_info. addr_len = sizeof(tp->rdata[i]->pkt_info.addr);396 tp->rdata[i]->pkt_info.src_addr_len = sizeof(tp->rdata[i]->pkt_info.src_addr); 356 397 status = pj_ioqueue_recvfrom(tp->key, 357 398 &tp->rdata[i]->tp_info.op_key.op_key, 358 399 tp->rdata[i]->pkt_info.packet, 359 400 &size, PJ_IOQUEUE_ALWAYS_ASYNC, 360 &tp->rdata[i]->pkt_info. addr,361 &tp->rdata[i]->pkt_info. addr_len);401 &tp->rdata[i]->pkt_info.src_addr, 402 &tp->rdata[i]->pkt_info.src_addr_len); 362 403 if (status == PJ_SUCCESS) { 363 404 pj_assert(!"Shouldn't happen because PJ_IOQUEUE_ALWAYS_ASYNC!"); 364 on_read_complete(tp->key, &tp->rdata[i]->tp_info.op_key.op_key,365 405 udp_on_read_complete(tp->key, &tp->rdata[i]->tp_info.op_key.op_key, 406 size); 366 407 } else if (status != PJ_EPENDING) { 367 408 /* Error! */ … … 376 417 377 418 on_error: 378 transport_destroy((pjsip_transport*)tp);419 udp_destroy((pjsip_transport*)tp); 379 420 return status; 380 421 } … … 383 424 * pjsip_udp_transport_start() 384 425 * 385 * Start an UDP transport/listener.426 * Create a UDP socket in the specified address and start a transport. 386 427 */ 387 428 PJ_DEF(pj_status_t) pjsip_udp_transport_start( pjsip_endpoint *endpt, 388 429 const pj_sockaddr_in *local, 389 const pj _sockaddr_in *pub_addr,430 const pjsip_host_port *a_name, 390 431 unsigned async_cnt, 391 432 pjsip_transport **p_transport) … … 393 434 pj_sock_t sock; 394 435 pj_status_t status; 436 char addr_buf[16]; 437 pjsip_host_port bound_name; 395 438 396 439 status = pj_sock_socket(PJ_AF_INET, PJ_SOCK_DGRAM, 0, &sock); … … 404 447 } 405 448 406 return pjsip_udp_transport_attach( endpt, sock, pub_addr, async_cnt, 449 if (a_name == NULL) { 450 a_name = &bound_name; 451 bound_name.host.ptr = addr_buf; 452 pj_strcpy2(&bound_name.host, pj_inet_ntoa(local->sin_addr)); 453 bound_name.port = pj_ntohs(local->sin_port); 454 } 455 456 return pjsip_udp_transport_attach( endpt, sock, a_name, async_cnt, 407 457 p_transport ); 408 458 }
Note: See TracChangeset
for help on using the changeset viewer.