Changes in uspace/srv/net/udp/sock.c [32d19f7:b1bd89ea] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/udp/sock.c
r32d19f7 rb1bd89ea 51 51 #include "ucall.h" 52 52 53 #define FRAGMENT_SIZE 1024 54 53 55 /** Free ports pool start. */ 54 56 #define UDP_FREE_PORTS_START 1025 … … 61 63 62 64 static void udp_sock_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg); 63 static int udp_sock_recv_fibril(void *arg);64 65 65 66 int udp_sock_init(void) 66 67 { 68 int rc; 69 67 70 socket_ports_initialize(&gsock); 68 71 69 72 async_set_client_connection(udp_sock_connection); 70 71 intrc = service_register(SERVICE_UDP);73 74 rc = service_register(SERVICE_UDP); 72 75 if (rc != EOK) 73 76 return EEXIST; 74 77 75 78 return EOK; 76 79 } … … 81 84 82 85 socket = (udp_sockdata_t *)sock_core->specific_data; 83 (void)socket; 84 85 /* XXX We need to force the receive fibril to quit */ 86 assert(socket->assoc != NULL); 87 udp_uc_destroy(socket->assoc); 86 88 } 87 89 … … 91 93 async_exch_t *exch = async_exchange_begin(sock_core->sess); 92 94 async_msg_5(exch, NET_SOCKET_RECEIVED, (sysarg_t)sock_core->socket_id, 93 UDP_FRAGMENT_SIZE, 0, 0, 1);95 FRAGMENT_SIZE, 0, 0, 1); 94 96 async_exchange_end(exch); 95 97 } … … 113 115 sock->client = client; 114 116 115 sock->recv_buffer_used = 0;116 sock->recv_error = UDP_EOK;117 fibril_mutex_initialize(&sock->recv_buffer_lock);118 fibril_condvar_initialize(&sock->recv_buffer_cv);119 120 117 rc = udp_uc_create(&sock->assoc); 121 118 if (rc != EOK) { 119 udp_uc_destroy(sock->assoc); 122 120 free(sock); 123 121 async_answer_0(callid, rc); 124 return;125 }126 127 sock->recv_fibril = fibril_create(udp_sock_recv_fibril, sock);128 if (sock->recv_fibril == 0) {129 udp_uc_destroy(sock->assoc);130 free(sock);131 async_answer_0(callid, ENOMEM);132 122 return; 133 123 } … … 136 126 rc = socket_create(&client->sockets, client->sess, sock, &sock_id); 137 127 if (rc != EOK) { 138 fibril_destroy(sock->recv_fibril);139 udp_uc_destroy(sock->assoc);140 free(sock);141 128 async_answer_0(callid, rc); 142 129 return; 143 130 } 144 145 fibril_add_ready(sock->recv_fibril);146 131 147 132 sock_core = socket_cores_find(&client->sockets, sock_id); … … 151 136 SOCKET_SET_SOCKET_ID(answer, sock_id); 152 137 153 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, UDP_FRAGMENT_SIZE);138 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, FRAGMENT_SIZE); 154 139 SOCKET_SET_HEADER_SIZE(answer, sizeof(udp_header_t)); 155 140 async_answer_3(callid, EOK, IPC_GET_ARG1(answer), … … 222 207 } 223 208 209 udp_sock_notify_data(sock_core); 210 224 211 log_msg(LVL_DEBUG, " - success"); 225 212 async_answer_0(callid, rc); … … 260 247 ipc_callid_t wcallid; 261 248 size_t length; 262 uint8_t buffer[ UDP_FRAGMENT_SIZE];249 uint8_t buffer[FRAGMENT_SIZE]; 263 250 udp_error_t urc; 264 251 int rc; … … 307 294 goto out; 308 295 } 296 297 udp_sock_notify_data(sock_core); 309 298 } 310 299 … … 343 332 } 344 333 345 if (length > UDP_FRAGMENT_SIZE)346 length = UDP_FRAGMENT_SIZE;334 if (length > FRAGMENT_SIZE) 335 length = FRAGMENT_SIZE; 347 336 348 337 rc = async_data_write_finalize(wcallid, buffer, length); … … 380 369 381 370 IPC_SET_ARG1(answer, 0); 382 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, UDP_FRAGMENT_SIZE);371 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, FRAGMENT_SIZE); 383 372 async_answer_2(callid, EOK, IPC_GET_ARG1(answer), 384 373 IPC_GET_ARG2(answer)); … … 399 388 ipc_call_t answer; 400 389 ipc_callid_t rcallid; 390 uint8_t buffer[FRAGMENT_SIZE]; 401 391 size_t data_len; 392 xflags_t xflags; 402 393 udp_error_t urc; 394 struct sockaddr_in addr; 403 395 udp_sock_t rsock; 404 struct sockaddr_in addr;405 396 int rc; 406 397 … … 427 418 (void)flags; 428 419 429 log_msg(LVL_DEBUG, "udp_sock_recvfrom(): lock recv_buffer lock"); 430 fibril_mutex_lock(&socket->recv_buffer_lock); 431 while (socket->recv_buffer_used == 0 && socket->recv_error == UDP_EOK) { 432 log_msg(LVL_DEBUG, "udp_sock_recvfrom(): wait for cv"); 433 fibril_condvar_wait(&socket->recv_buffer_cv, 434 &socket->recv_buffer_lock); 435 } 436 437 log_msg(LVL_DEBUG, "Got data in sock recv_buffer"); 438 439 rsock = socket->recv_fsock; 440 data_len = socket->recv_buffer_used; 441 urc = socket->recv_error; 442 443 log_msg(LVL_DEBUG, "**** recv data_len=%zu", data_len); 420 urc = udp_uc_receive(socket->assoc, buffer, FRAGMENT_SIZE, &data_len, 421 &xflags, &rsock); 422 log_msg(LVL_DEBUG, "**** udp_uc_receive done, data_len=%zu", data_len); 444 423 445 424 switch (urc) { … … 460 439 log_msg(LVL_DEBUG, "**** udp_uc_receive -> %d", rc); 461 440 if (rc != EOK) { 462 fibril_mutex_unlock(&socket->recv_buffer_lock);463 441 fibril_mutex_unlock(&socket->lock); 464 442 async_answer_0(callid, rc); … … 474 452 log_msg(LVL_DEBUG, "addr read receive"); 475 453 if (!async_data_read_receive(&rcallid, &addr_length)) { 476 fibril_mutex_unlock(&socket->recv_buffer_lock);477 454 fibril_mutex_unlock(&socket->lock); 478 455 async_answer_0(callid, EINVAL); … … 486 463 rc = async_data_read_finalize(rcallid, &addr, addr_length); 487 464 if (rc != EOK) { 488 fibril_mutex_unlock(&socket->recv_buffer_lock);489 465 fibril_mutex_unlock(&socket->lock); 490 466 async_answer_0(callid, EINVAL); … … 495 471 log_msg(LVL_DEBUG, "data read receive"); 496 472 if (!async_data_read_receive(&rcallid, &length)) { 497 fibril_mutex_unlock(&socket->recv_buffer_lock);498 473 fibril_mutex_unlock(&socket->lock); 499 474 async_answer_0(callid, EINVAL); … … 505 480 506 481 log_msg(LVL_DEBUG, "data read finalize"); 507 rc = async_data_read_finalize(rcallid, socket->recv_buffer, length);482 rc = async_data_read_finalize(rcallid, buffer, length); 508 483 509 484 if (length < data_len && rc == EOK) … … 516 491 async_answer_3(callid, EOK, IPC_GET_ARG1(answer), 517 492 IPC_GET_ARG2(answer), IPC_GET_ARG3(answer)); 518 519 socket->recv_buffer_used = 0; 520 521 fibril_condvar_broadcast(&socket->recv_buffer_cv); 522 fibril_mutex_unlock(&socket->recv_buffer_lock); 493 494 /* Push one fragment notification to client's queue */ 495 udp_sock_notify_data(sock_core); 523 496 fibril_mutex_unlock(&socket->lock); 524 497 } … … 567 540 } 568 541 569 static int udp_sock_recv_fibril(void *arg)570 {571 udp_sockdata_t *sock = (udp_sockdata_t *)arg;572 udp_error_t urc;573 xflags_t xflags;574 size_t rcvd;575 576 log_msg(LVL_DEBUG, "udp_sock_recv_fibril()");577 578 while (true) {579 log_msg(LVL_DEBUG, "[] wait for rcv buffer empty()");580 fibril_mutex_lock(&sock->recv_buffer_lock);581 while (sock->recv_buffer_used != 0) {582 fibril_condvar_wait(&sock->recv_buffer_cv,583 &sock->recv_buffer_lock);584 }585 586 log_msg(LVL_DEBUG, "[] call udp_uc_receive()");587 urc = udp_uc_receive(sock->assoc, sock->recv_buffer,588 UDP_FRAGMENT_SIZE, &rcvd, &xflags, &sock->recv_fsock);589 sock->recv_error = urc;590 591 udp_sock_notify_data(sock->sock_core);592 593 if (urc != UDP_EOK) {594 fibril_condvar_broadcast(&sock->recv_buffer_cv);595 fibril_mutex_unlock(&sock->recv_buffer_lock);596 break;597 }598 599 log_msg(LVL_DEBUG, "[] got data - broadcast recv_buffer_cv");600 601 sock->recv_buffer_used = rcvd;602 fibril_mutex_unlock(&sock->recv_buffer_lock);603 fibril_condvar_broadcast(&sock->recv_buffer_cv);604 }605 606 udp_uc_destroy(sock->assoc);607 608 return 0;609 }610 611 542 static void udp_sock_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg) 612 543 {
Note:
See TracChangeset
for help on using the changeset viewer.