Changeset 89ac5513 in mainline for uspace/srv/net/udp
- Timestamp:
- 2013-06-23T19:54:53Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- ddb1922
- Parents:
- 3abf0760 (diff), 96cbd18 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- uspace/srv/net/udp
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/udp/assoc.c
r3abf0760 r89ac5513 82 82 if (lsock != NULL) 83 83 assoc->ident.local = *lsock; 84 84 85 if (fsock != NULL) 85 86 assoc->ident.foreign = *fsock; … … 251 252 sp.foreign = *fsock; 252 253 253 if (sp.foreign.addr.ipv4 == 0 || sp.foreign.port == 0) 254 if ((inet_addr_is_any(&sp.foreign.addr)) || 255 (sp.foreign.port == UDP_PORT_ANY)) 254 256 return EINVAL; 255 257 … … 279 281 280 282 fibril_mutex_lock(&assoc->lock); 281 while (list_empty(&assoc->rcv_queue) ) {283 while (list_empty(&assoc->rcv_queue) && !assoc->reset) { 282 284 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv() - waiting"); 283 285 fibril_condvar_wait(&assoc->rcv_queue_cv, &assoc->lock); 286 } 287 288 if (assoc->reset) { 289 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv() - association was reset"); 290 fibril_mutex_unlock(&assoc->lock); 291 return ECONNABORTED; 284 292 } 285 293 … … 323 331 } 324 332 333 /** Reset association. 334 * 335 * This causes any pendingreceive operations to return immediately with 336 * UDP_ERESET. 337 */ 338 void udp_assoc_reset(udp_assoc_t *assoc) 339 { 340 fibril_mutex_lock(&assoc->lock); 341 assoc->reset = true; 342 fibril_condvar_broadcast(&assoc->rcv_queue_cv); 343 fibril_mutex_unlock(&assoc->lock); 344 } 345 325 346 static int udp_assoc_queue_msg(udp_assoc_t *assoc, udp_sockpair_t *sp, 326 347 udp_msg_t *msg) … … 351 372 static bool udp_socket_match(udp_sock_t *sock, udp_sock_t *patt) 352 373 { 353 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_socket_match(sock=(%x,%u), pat=(%x,%u))", 354 sock->addr.ipv4, sock->port, patt->addr.ipv4, patt->port); 355 356 if (patt->addr.ipv4 != UDP_IPV4_ANY && 357 patt->addr.ipv4 != sock->addr.ipv4) 374 if ((!inet_addr_is_any(&patt->addr)) && 375 (!inet_addr_compare(&patt->addr, &sock->addr))) 358 376 return false; 359 360 if ( patt->port != UDP_PORT_ANY&&361 patt->port != sock->port)377 378 if ((patt->port != UDP_PORT_ANY) && 379 (patt->port != sock->port)) 362 380 return false; 363 381 364 382 log_msg(LOG_DEFAULT, LVL_DEBUG, " -> match"); 365 383 366 384 return true; 367 385 } … … 395 413 { 396 414 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_find_ref(%p)", sp); 397 415 398 416 fibril_mutex_lock(&assoc_list_lock); 399 417 400 418 list_foreach(assoc_list, link) { 401 419 udp_assoc_t *assoc = list_get_instance(link, udp_assoc_t, link); 402 420 udp_sockpair_t *asp = &assoc->ident; 403 log_msg(LOG_DEFAULT, LVL_DEBUG, "compare with assoc (f:(%x,%u), l:(%x,%u))", 404 asp->foreign.addr.ipv4, asp->foreign.port, 405 asp->local.addr.ipv4, asp->local.port); 406 421 407 422 /* Skip unbound associations */ 408 423 if (asp->local.port == UDP_PORT_ANY) 409 424 continue; 410 425 411 426 if (udp_sockpair_match(sp, asp)) { 412 427 log_msg(LOG_DEFAULT, LVL_DEBUG, "Returning assoc %p", assoc); … … 416 431 } 417 432 } 418 433 419 434 fibril_mutex_unlock(&assoc_list_lock); 420 435 return NULL; -
uspace/srv/net/udp/assoc.h
r3abf0760 r89ac5513 51 51 extern int udp_assoc_recv(udp_assoc_t *, udp_msg_t **, udp_sock_t *); 52 52 extern void udp_assoc_received(udp_sockpair_t *, udp_msg_t *); 53 53 extern void udp_assoc_reset(udp_assoc_t *); 54 54 55 55 #endif -
uspace/srv/net/udp/pdu.c
r3abf0760 r89ac5513 86 86 static void udp_phdr_setup(udp_pdu_t *pdu, udp_phdr_t *phdr) 87 87 { 88 phdr->src_addr = host2uint32_t_be(pdu->src.ipv4); 89 phdr->dest_addr = host2uint32_t_be(pdu->dest.ipv4); 88 // FIXME: Check for correctness 89 90 uint32_t src; 91 inet_addr_pack(&pdu->src, &src); 92 93 uint32_t dest; 94 inet_addr_pack(&pdu->dest, &dest); 95 96 phdr->src_addr = host2uint32_t_be(src); 97 phdr->dest_addr = host2uint32_t_be(dest); 90 98 phdr->zero = 0; 91 99 phdr->protocol = IP_PROTO_UDP; -
uspace/srv/net/udp/sock.c
r3abf0760 r89ac5513 199 199 } 200 200 201 socket = (udp_sockdata_t *)sock_core->specific_data; 202 203 fsock.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr); 201 socket = (udp_sockdata_t *) sock_core->specific_data; 202 203 inet_addr_unpack(uint32_t_be2host(addr->sin_addr.s_addr), 204 &fsock.addr); 204 205 fsock.port = sock_core->port; 205 206 urc = udp_uc_set_local(socket->assoc, &fsock); … … 269 270 } 270 271 271 fsock.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr); 272 inet_addr_unpack(uint32_t_be2host(addr->sin_addr.s_addr), 273 &fsock.addr); 272 274 fsock.port = uint16_t_be2host(addr->sin_port); 273 275 fsock_ptr = &fsock; … … 314 316 fibril_mutex_lock(&socket->lock); 315 317 316 if ( socket->assoc->ident.local.addr.ipv4 == UDP_IPV4_ANY) {318 if (inet_addr_is_any(&socket->assoc->ident.local.addr)) { 317 319 /* Determine local IP address */ 318 inet_addr_t loc_addr, rem_addr; 319 320 rem_addr.ipv4 = fsock_ptr ? fsock.addr.ipv4 : 321 socket->assoc->ident.foreign.addr.ipv4; 320 inet_addr_t loc_addr; 321 inet_addr_t rem_addr; 322 323 rem_addr = fsock_ptr ? fsock.addr : 324 socket->assoc->ident.foreign.addr; 322 325 323 326 int rc = inet_get_srcaddr(&rem_addr, 0, &loc_addr); … … 330 333 } 331 334 332 socket->assoc->ident.local.addr.ipv4 = loc_addr.ipv4; 333 log_msg(LOG_DEFAULT, LVL_DEBUG, "Local IP address is %x", 334 socket->assoc->ident.local.addr.ipv4); 335 socket->assoc->ident.local.addr = loc_addr; 335 336 } 336 337 … … 410 411 size_t data_len; 411 412 udp_error_t urc; 412 udp_sock_t rsock;413 udp_sock_t *rsock; 413 414 struct sockaddr_in addr; 414 415 int rc; … … 446 447 log_msg(LOG_DEFAULT, LVL_DEBUG, "Got data in sock recv_buffer"); 447 448 448 rsock = socket->recv_fsock;449 rsock = &socket->recv_fsock; 449 450 data_len = socket->recv_buffer_used; 450 451 urc = socket->recv_error; … … 476 477 477 478 if (IPC_GET_IMETHOD(call) == NET_SOCKET_RECVFROM) { 478 /* Fill addr */ 479 /* Fill address */ 480 uint32_t rsock_addr; 481 int rc = inet_addr_pack(&rsock->addr, &rsock_addr); 482 if (rc != EOK) { 483 fibril_mutex_unlock(&socket->recv_buffer_lock); 484 fibril_mutex_unlock(&socket->lock); 485 async_answer_0(callid, rc); 486 return; 487 } 488 479 489 addr.sin_family = AF_INET; 480 addr.sin_addr.s_addr = host2uint32_t_be(rsock .addr.ipv4);481 addr.sin_port = host2uint16_t_be(rsock .port);490 addr.sin_addr.s_addr = host2uint32_t_be(rsock_addr); 491 addr.sin_port = host2uint16_t_be(rsock->port); 482 492 483 493 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read receive"); … … 537 547 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close()"); 538 548 int socket_id = SOCKET_GET_SOCKET_ID(call); 539 549 550 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - find core"); 540 551 socket_core_t *sock_core = 541 552 socket_cores_find(&client->sockets, socket_id); 542 553 if (sock_core == NULL) { 554 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - core not found"); 543 555 async_answer_0(callid, ENOTSOCK); 544 556 return; 545 557 } 546 558 559 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - spec data"); 547 560 udp_sockdata_t *socket = 548 561 (udp_sockdata_t *) sock_core->specific_data; 562 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - lock socket"); 549 563 fibril_mutex_lock(&socket->lock); 550 564 565 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - lock socket buffer"); 566 fibril_mutex_lock(&socket->recv_buffer_lock); 567 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - set socket->sock_core = NULL"); 568 socket->sock_core = NULL; 569 fibril_mutex_unlock(&socket->recv_buffer_lock); 570 571 udp_uc_reset(socket->assoc); 572 551 573 int rc = socket_destroy(NULL, socket_id, &client->sockets, &gsock, 552 574 udp_free_sock_data); 553 575 if (rc != EOK) { 576 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - socket_destroy failed"); 554 577 fibril_mutex_unlock(&socket->lock); 555 578 async_answer_0(callid, rc); 556 579 return; 557 580 } 558 581 582 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - broadcast recv_buffer_cv"); 583 fibril_condvar_broadcast(&socket->recv_buffer_cv); 584 559 585 fibril_mutex_unlock(&socket->lock); 560 586 async_answer_0(callid, EOK); … … 582 608 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril()"); 583 609 610 fibril_mutex_lock(&sock->recv_buffer_lock); 611 584 612 while (true) { 585 613 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] wait for rcv buffer empty()"); 586 fibril_mutex_lock(&sock->recv_buffer_lock); 587 while (sock->recv_buffer_used != 0) { 614 while (sock->recv_buffer_used != 0 && sock->sock_core != NULL) { 588 615 fibril_condvar_wait(&sock->recv_buffer_cv, 589 616 &sock->recv_buffer_lock); 590 617 } 591 618 619 fibril_mutex_unlock(&sock->recv_buffer_lock); 620 592 621 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] call udp_uc_receive()"); 593 622 urc = udp_uc_receive(sock->assoc, sock->recv_buffer, 594 623 UDP_FRAGMENT_SIZE, &rcvd, &xflags, &sock->recv_fsock); 624 fibril_mutex_lock(&sock->recv_buffer_lock); 595 625 sock->recv_error = urc; 596 597 udp_sock_notify_data(sock->sock_core); 598 626 627 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] udp_uc_receive -> %d", urc); 628 629 if (sock->sock_core != NULL) 630 udp_sock_notify_data(sock->sock_core); 631 599 632 if (urc != UDP_EOK) { 633 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] urc != UDP_EOK, break"); 600 634 fibril_condvar_broadcast(&sock->recv_buffer_cv); 601 fibril_mutex_unlock(&sock->recv_buffer_lock); 602 break; 603 } 604 635 break; 636 } 637 605 638 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] got data - broadcast recv_buffer_cv"); 606 639 607 640 sock->recv_buffer_used = rcvd; 608 fibril_mutex_unlock(&sock->recv_buffer_lock);609 641 fibril_condvar_broadcast(&sock->recv_buffer_cv); 610 642 } 611 643 644 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril() exited loop"); 645 fibril_mutex_unlock(&sock->recv_buffer_lock); 612 646 udp_uc_destroy(sock->assoc); 647 648 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril() terminated"); 613 649 614 650 return 0; -
uspace/srv/net/udp/ucall.c
r3abf0760 r89ac5513 113 113 log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: udp_uc_receive()", assoc->name); 114 114 rc = udp_assoc_recv(assoc, &msg, fsock); 115 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv -> %d", rc); 115 116 switch (rc) { 117 case EOK: 118 break; 119 case ECONNABORTED: 120 return UDP_ERESET; 121 default: 122 assert(false); 116 123 } 117 124 … … 133 140 { 134 141 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_uc_destroy()"); 142 udp_assoc_reset(assoc); 135 143 udp_assoc_remove(assoc); 136 144 udp_assoc_delete(assoc); 145 } 146 147 void udp_uc_reset(udp_assoc_t *assoc) 148 { 149 udp_assoc_reset(assoc); 137 150 } 138 151 -
uspace/srv/net/udp/ucall.h
r3abf0760 r89ac5513 49 49 extern void udp_uc_status(udp_assoc_t *, udp_assoc_status_t *); 50 50 extern void udp_uc_destroy(udp_assoc_t *); 51 extern void udp_uc_reset(udp_assoc_t *); 51 52 52 53 #endif -
uspace/srv/net/udp/udp_inet.c
r3abf0760 r89ac5513 67 67 pdu->data_size = dgram->size; 68 68 69 pdu->src.ipv4 = dgram->src.ipv4; 70 pdu->dest.ipv4 = dgram->dest.ipv4; 71 log_msg(LOG_DEFAULT, LVL_DEBUG, "src: 0x%08x, dest: 0x%08x", 72 pdu->src.ipv4, pdu->dest.ipv4); 69 pdu->src = dgram->src; 70 pdu->dest = dgram->dest; 73 71 74 72 udp_received_pdu(pdu); … … 86 84 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_transmit_pdu()"); 87 85 88 dgram.src .ipv4 = pdu->src.ipv4;89 dgram.dest .ipv4 = pdu->dest.ipv4;86 dgram.src = pdu->src; 87 dgram.dest = pdu->dest; 90 88 dgram.tos = 0; 91 89 dgram.data = pdu->data; -
uspace/srv/net/udp/udp_type.h
r3abf0760 r89ac5513 40 40 #include <socket_core.h> 41 41 #include <sys/types.h> 42 #include <inet/addr.h> 42 43 43 44 #define UDP_FRAGMENT_SIZE 4096 … … 51 52 UDP_EUNSPEC, 52 53 /* No route to destination */ 53 UDP_ENOROUTE 54 UDP_ENOROUTE, 55 /** Association reset by user */ 56 UDP_ERESET 54 57 } udp_error_t; 55 58 56 59 typedef enum { 57 XF_DUMMY = 0x160 XF_DUMMY = 0x1 58 61 } xflags_t; 59 60 typedef struct {61 uint32_t ipv4;62 } netaddr_t;63 64 enum netaddr {65 UDP_IPV4_ANY = 066 };67 62 68 63 enum udp_port { … … 71 66 72 67 typedef struct { 73 netaddr_t addr;68 inet_addr_t addr; 74 69 uint16_t port; 75 70 } udp_sock_t; … … 91 86 typedef struct { 92 87 /** Source address */ 93 netaddr_t src;88 inet_addr_t src; 94 89 /** Destination address */ 95 netaddr_t dest;96 90 inet_addr_t dest; 91 97 92 /** Encoded PDU data including header */ 98 93 void *data; … … 118 113 /** Association identification (local and foreign socket) */ 119 114 udp_sockpair_t ident; 115 116 /** True if association was reset by user */ 117 bool reset; 120 118 121 119 /** True if association was deleted by user */
Note:
See TracChangeset
for help on using the changeset viewer.
