Changes in uspace/srv/net/tcp/sock.c [b243da3:db81577] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/tcp/sock.c
rb243da3 rdb81577 91 91 static void tcp_sock_notify_data(socket_core_t *sock_core) 92 92 { 93 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_notify_data(%d)", sock_core->socket_id);93 log_msg(LVL_DEBUG, "tcp_sock_notify_data(%d)", sock_core->socket_id); 94 94 async_exch_t *exch = async_exchange_begin(sock_core->sess); 95 95 async_msg_5(exch, NET_SOCKET_RECEIVED, (sysarg_t)sock_core->socket_id, … … 100 100 static void tcp_sock_notify_aconn(socket_core_t *lsock_core) 101 101 { 102 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_notify_aconn(%d)", lsock_core->socket_id);102 log_msg(LVL_DEBUG, "tcp_sock_notify_aconn(%d)", lsock_core->socket_id); 103 103 async_exch_t *exch = async_exchange_begin(lsock_core->sess); 104 104 async_msg_5(exch, NET_SOCKET_ACCEPTED, (sysarg_t)lsock_core->socket_id, … … 111 111 tcp_sockdata_t *sock; 112 112 113 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_create()");113 log_msg(LVL_DEBUG, "tcp_sock_create()"); 114 114 *rsock = NULL; 115 115 … … 133 133 static void tcp_sock_uncreate(tcp_sockdata_t *sock) 134 134 { 135 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_uncreate()");135 log_msg(LVL_DEBUG, "tcp_sock_uncreate()"); 136 136 free(sock); 137 137 } … … 142 142 int rc; 143 143 144 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_finish_setup()");144 log_msg(LVL_DEBUG, "tcp_sock_finish_setup()"); 145 145 146 146 sock->recv_fibril = fibril_create(tcp_sock_recv_fibril, sock); … … 171 171 ipc_call_t answer; 172 172 173 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_socket()");173 log_msg(LVL_DEBUG, "tcp_sock_socket()"); 174 174 175 175 rc = tcp_sock_create(client, &sock); … … 179 179 } 180 180 181 inet_addr_any(&sock->laddr);181 sock->laddr.ipv4 = TCP_IPV4_ANY; 182 182 sock->lconn = NULL; 183 183 sock->backlog = 0; … … 203 203 { 204 204 int rc; 205 struct sockaddr _in*addr;206 size_t addr_ size;205 struct sockaddr *addr; 206 size_t addr_len; 207 207 socket_core_t *sock_core; 208 208 tcp_sockdata_t *socket; 209 210 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_bind()"); 211 log_msg(LOG_DEFAULT, LVL_DEBUG, " - async_data_write_accept"); 212 213 addr = NULL; 214 215 rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_size); 209 210 log_msg(LVL_DEBUG, "tcp_sock_bind()"); 211 log_msg(LVL_DEBUG, " - async_data_write_accept"); 212 rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_len); 216 213 if (rc != EOK) { 217 214 async_answer_0(callid, rc); 218 goto out; 219 } 220 221 if (addr_size != sizeof(struct sockaddr_in)) { 222 async_answer_0(callid, EINVAL); 223 goto out; 224 } 225 226 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_bind"); 215 return; 216 } 217 218 log_msg(LVL_DEBUG, " - call socket_bind"); 227 219 rc = socket_bind(&client->sockets, &gsock, SOCKET_GET_SOCKET_ID(call), 228 addr, addr_ size, TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,220 addr, addr_len, TCP_FREE_PORTS_START, TCP_FREE_PORTS_END, 229 221 last_used_port); 230 222 if (rc != EOK) { 231 223 async_answer_0(callid, rc); 232 goto out;233 } 234 235 log_msg(L OG_DEFAULT, LVL_DEBUG, " - call socket_cores_find");224 return; 225 } 226 227 log_msg(LVL_DEBUG, " - call socket_cores_find"); 236 228 sock_core = socket_cores_find(&client->sockets, SOCKET_GET_SOCKET_ID(call)); 237 if (sock_core == NULL) { 238 async_answer_0(callid, ENOENT); 239 goto out; 240 } 241 242 socket = (tcp_sockdata_t *)sock_core->specific_data; 243 /* XXX Anything to do? */ 244 (void) socket; 245 246 log_msg(LOG_DEFAULT, LVL_DEBUG, " - success"); 229 if (sock_core != NULL) { 230 socket = (tcp_sockdata_t *)sock_core->specific_data; 231 /* XXX Anything to do? */ 232 (void) socket; 233 } 234 235 log_msg(LVL_DEBUG, " - success"); 247 236 async_answer_0(callid, EOK); 248 249 out:250 if (addr != NULL)251 free(addr);252 237 } 253 238 … … 264 249 tcp_sock_lconn_t *lconn; 265 250 int i; 266 int rc; 267 268 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_listen()"); 251 252 log_msg(LVL_DEBUG, "tcp_sock_listen()"); 269 253 270 254 socket_id = SOCKET_GET_SOCKET_ID(call); … … 284 268 return; 285 269 } 286 270 271 socket = (tcp_sockdata_t *)sock_core->specific_data; 272 273 /* 274 * Prepare @c backlog listening connections. 275 */ 276 fibril_mutex_lock(&socket->lock); 277 278 socket->backlog = backlog; 279 socket->lconn = calloc(backlog, sizeof(tcp_conn_t *)); 280 if (socket->lconn == NULL) { 281 fibril_mutex_unlock(&socket->lock); 282 async_answer_0(callid, ENOMEM); 283 return; 284 } 285 286 log_msg(LVL_DEBUG, " - open connections"); 287 288 lsocket.addr.ipv4 = TCP_IPV4_ANY; 289 lsocket.port = sock_core->port; 290 fsocket.addr.ipv4 = TCP_IPV4_ANY; 291 fsocket.port = TCP_PORT_ANY; 292 293 for (i = 0; i < backlog; i++) { 294 295 lconn = calloc(1, sizeof(tcp_sock_lconn_t)); 296 if (lconn == NULL) { 297 /* XXX Clean up */ 298 fibril_mutex_unlock(&socket->lock); 299 async_answer_0(callid, ENOMEM); 300 return; 301 } 302 303 trc = tcp_uc_open(&lsocket, &fsocket, ap_passive, 304 tcp_open_nonblock, &conn); 305 if (conn == NULL) { 306 /* XXX Clean up */ 307 fibril_mutex_unlock(&socket->lock); 308 async_answer_0(callid, ENOMEM); 309 return; 310 } 311 312 tcp_uc_set_cstate_cb(conn, tcp_sock_cstate_cb, lconn); 313 314 assert(trc == TCP_EOK); 315 conn->name = (char *)"S"; 316 317 lconn->conn = conn; 318 lconn->socket = socket; 319 link_initialize(&lconn->ready_list); 320 socket->lconn[i] = lconn; 321 } 322 323 fibril_mutex_unlock(&socket->lock); 324 async_answer_0(callid, EOK); 325 } 326 327 static void tcp_sock_connect(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call) 328 { 329 int rc; 330 struct sockaddr_in *addr; 331 int socket_id; 332 size_t addr_len; 333 socket_core_t *sock_core; 334 tcp_sockdata_t *socket; 335 tcp_error_t trc; 336 tcp_sock_t lsocket; 337 tcp_sock_t fsocket; 338 339 log_msg(LVL_DEBUG, "tcp_sock_connect()"); 340 341 rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_len); 342 if (rc != EOK || addr_len != sizeof(struct sockaddr_in)) { 343 async_answer_0(callid, rc); 344 return; 345 } 346 347 socket_id = SOCKET_GET_SOCKET_ID(call); 348 349 sock_core = socket_cores_find(&client->sockets, socket_id); 350 if (sock_core == NULL) { 351 async_answer_0(callid, ENOTSOCK); 352 return; 353 } 354 355 socket = (tcp_sockdata_t *)sock_core->specific_data; 287 356 if (sock_core->port <= 0) { 288 357 rc = socket_bind_free_port(&gsock, sock_core, … … 293 362 return; 294 363 } 295 364 296 365 last_used_port = sock_core->port; 297 366 } 298 299 socket = (tcp_sockdata_t *) sock_core->specific_data; 300 301 /* 302 * Prepare @c backlog listening connections. 303 */ 367 304 368 fibril_mutex_lock(&socket->lock); 305 306 socket->backlog = backlog; 307 socket->lconn = calloc(backlog, sizeof(tcp_conn_t *)); 308 if (socket->lconn == NULL) { 309 fibril_mutex_unlock(&socket->lock); 310 async_answer_0(callid, ENOMEM); 311 return; 312 } 313 314 log_msg(LOG_DEFAULT, LVL_DEBUG, " - open connections"); 315 316 inet_addr_any(&lsocket.addr); 317 lsocket.port = sock_core->port; 318 319 inet_addr_any(&fsocket.addr); 320 fsocket.port = TCP_PORT_ANY; 321 322 for (i = 0; i < backlog; i++) { 323 324 lconn = calloc(1, sizeof(tcp_sock_lconn_t)); 325 if (lconn == NULL) { 326 /* XXX Clean up */ 327 fibril_mutex_unlock(&socket->lock); 328 async_answer_0(callid, ENOMEM); 329 return; 330 } 331 332 trc = tcp_uc_open(&lsocket, &fsocket, ap_passive, 333 tcp_open_nonblock, &conn); 334 if (conn == NULL) { 335 /* XXX Clean up */ 336 fibril_mutex_unlock(&socket->lock); 337 async_answer_0(callid, ENOMEM); 338 return; 339 } 340 341 tcp_uc_set_cstate_cb(conn, tcp_sock_cstate_cb, lconn); 342 343 assert(trc == TCP_EOK); 344 conn->name = (char *)"S"; 345 346 lconn->conn = conn; 347 lconn->socket = socket; 348 link_initialize(&lconn->ready_list); 349 socket->lconn[i] = lconn; 350 } 351 352 fibril_mutex_unlock(&socket->lock); 353 async_answer_0(callid, EOK); 354 } 355 356 static void tcp_sock_connect(tcp_client_t *client, ipc_callid_t callid, 357 ipc_call_t call) 358 { 359 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_connect()"); 360 361 struct sockaddr_in6 *addr6 = NULL; 362 size_t addr_len; 363 int rc = async_data_write_accept((void **) &addr6, false, 0, 0, 0, &addr_len); 364 if (rc != EOK) { 365 async_answer_0(callid, rc); 366 return; 367 } 368 369 if ((addr_len != sizeof(struct sockaddr_in)) && 370 (addr_len != sizeof(struct sockaddr_in6))) { 371 async_answer_0(callid, EINVAL); 372 goto out; 373 } 374 375 struct sockaddr_in *addr = (struct sockaddr_in *) addr6; 376 377 int socket_id = SOCKET_GET_SOCKET_ID(call); 378 socket_core_t *sock_core = socket_cores_find(&client->sockets, 379 socket_id); 380 if (sock_core == NULL) { 381 async_answer_0(callid, ENOTSOCK); 382 goto out; 383 } 384 385 tcp_sockdata_t *socket = 386 (tcp_sockdata_t *) sock_core->specific_data; 387 388 if (sock_core->port <= 0) { 389 rc = socket_bind_free_port(&gsock, sock_core, 390 TCP_FREE_PORTS_START, TCP_FREE_PORTS_END, 391 last_used_port); 392 if (rc != EOK) { 393 async_answer_0(callid, rc); 394 goto out; 395 } 396 397 last_used_port = sock_core->port; 398 } 399 400 fibril_mutex_lock(&socket->lock); 401 402 if (inet_addr_is_any(&socket->laddr)) { 369 370 if (socket->laddr.ipv4 == TCP_IPV4_ANY) { 403 371 /* Determine local IP address */ 404 inet_addr_t loc_addr; 405 inet_addr_t rem_addr; 406 407 switch (addr->sin_family) { 408 case AF_INET: 409 inet_sockaddr_in_addr(addr, &rem_addr); 410 break; 411 case AF_INET6: 412 inet_sockaddr_in6_addr(addr6, &rem_addr); 413 break; 414 default: 415 fibril_mutex_unlock(&socket->lock); 416 async_answer_0(callid, EINVAL); 417 goto out; 418 } 419 372 inet_addr_t loc_addr, rem_addr; 373 374 rem_addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr); 420 375 rc = inet_get_srcaddr(&rem_addr, 0, &loc_addr); 421 376 if (rc != EOK) { 422 377 fibril_mutex_unlock(&socket->lock); 423 378 async_answer_0(callid, rc); 424 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_connect: Failed to "379 log_msg(LVL_DEBUG, "tcp_sock_connect: Failed to " 425 380 "determine local address."); 426 goto out; 427 } 428 429 socket->laddr = loc_addr; 430 } 431 432 tcp_sock_t lsocket; 433 tcp_sock_t fsocket; 434 435 lsocket.addr = socket->laddr; 381 return; 382 } 383 384 socket->laddr.ipv4 = loc_addr.ipv4; 385 log_msg(LVL_DEBUG, "Local IP address is %x", socket->laddr.ipv4); 386 } 387 388 lsocket.addr.ipv4 = socket->laddr.ipv4; 436 389 lsocket.port = sock_core->port; 437 438 switch (addr->sin_family) { 439 case AF_INET: 440 inet_sockaddr_in_addr(addr, &fsocket.addr); 441 break; 442 case AF_INET6: 443 inet_sockaddr_in6_addr(addr6, &fsocket.addr); 444 break; 445 default: 446 fibril_mutex_unlock(&socket->lock); 447 async_answer_0(callid, EINVAL); 448 goto out; 449 } 450 390 fsocket.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr); 451 391 fsocket.port = uint16_t_be2host(addr->sin_port); 452 453 tcp_error_t trc = tcp_uc_open(&lsocket, &fsocket, ap_active, 0, 454 &socket->conn); 455 392 393 trc = tcp_uc_open(&lsocket, &fsocket, ap_active, 0, &socket->conn); 394 456 395 if (socket->conn != NULL) 457 socket->conn->name = (char *) 458 396 socket->conn->name = (char *)"C"; 397 459 398 fibril_mutex_unlock(&socket->lock); 460 399 461 400 switch (trc) { 462 401 case TCP_EOK: … … 469 408 assert(false); 470 409 } 471 410 472 411 if (rc == EOK) 473 412 fibril_add_ready(socket->recv_fibril); 474 413 475 414 async_answer_0(callid, rc); 476 477 out:478 if (addr6 != NULL)479 free(addr6);480 415 } 481 416 … … 496 431 int rc; 497 432 498 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_accept()");433 log_msg(LVL_DEBUG, "tcp_sock_accept()"); 499 434 500 435 socket_id = SOCKET_GET_SOCKET_ID(call); … … 506 441 return; 507 442 } 508 509 if (sock_core->port <= 0) {510 rc = socket_bind_free_port(&gsock, sock_core,511 TCP_FREE_PORTS_START, TCP_FREE_PORTS_END,512 last_used_port);513 if (rc != EOK) {514 async_answer_0(callid, rc);515 return;516 }517 518 last_used_port = sock_core->port;519 }520 443 521 444 socket = (tcp_sockdata_t *)sock_core->specific_data; 522 445 fibril_mutex_lock(&socket->lock); 523 446 524 log_msg(L OG_DEFAULT, LVL_DEBUG, " - verify socket->conn");447 log_msg(LVL_DEBUG, " - verify socket->conn"); 525 448 if (socket->conn != NULL) { 526 449 fibril_mutex_unlock(&socket->lock); … … 544 467 /* Replenish listening connection */ 545 468 546 inet_addr_any(&lsocket.addr);469 lsocket.addr.ipv4 = TCP_IPV4_ANY; 547 470 lsocket.port = sock_core->port; 548 549 inet_addr_any(&fsocket.addr); 471 fsocket.addr.ipv4 = TCP_IPV4_ANY; 550 472 fsocket.port = TCP_PORT_ANY; 551 473 … … 576 498 577 499 asocket->conn = conn; 578 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_accept():create asocket\n");500 log_msg(LVL_DEBUG, "tcp_sock_accept():create asocket\n"); 579 501 580 502 rc = tcp_sock_finish_setup(asocket, &asock_id); … … 588 510 fibril_add_ready(asocket->recv_fibril); 589 511 590 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_accept(): find acore\n");512 log_msg(LVL_DEBUG, "tcp_sock_accept(): find acore\n"); 591 513 592 514 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, TCP_SOCK_FRAGMENT_SIZE); … … 599 521 600 522 /* Push one fragment notification to client's queue */ 601 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_accept(): notify data\n");523 log_msg(LVL_DEBUG, "tcp_sock_accept(): notify data\n"); 602 524 fibril_mutex_unlock(&socket->lock); 603 525 } … … 613 535 ipc_callid_t wcallid; 614 536 size_t length; 537 uint8_t buffer[TCP_SOCK_FRAGMENT_SIZE]; 615 538 tcp_error_t trc; 616 539 int rc; 617 618 uint8_t *buffer = calloc(TCP_SOCK_FRAGMENT_SIZE, 1); 619 if (buffer == NULL) { 620 async_answer_0(callid, ENOMEM); 621 return; 622 } 623 624 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_send()"); 540 541 log_msg(LVL_DEBUG, "tcp_sock_send()"); 625 542 socket_id = SOCKET_GET_SOCKET_ID(call); 626 543 fragments = SOCKET_GET_DATA_FRAGMENTS(call); … … 630 547 if (sock_core == NULL) { 631 548 async_answer_0(callid, ENOTSOCK); 632 goto out;549 return; 633 550 } 634 551 … … 646 563 fibril_mutex_unlock(&socket->lock); 647 564 async_answer_0(callid, EINVAL); 648 goto out;565 return; 649 566 } 650 567 … … 656 573 fibril_mutex_unlock(&socket->lock); 657 574 async_answer_0(callid, rc); 658 goto out;575 return; 659 576 } 660 577 … … 681 598 fibril_mutex_unlock(&socket->lock); 682 599 async_answer_0(callid, rc); 683 goto out;600 return; 684 601 } 685 602 } … … 690 607 IPC_GET_ARG2(answer)); 691 608 fibril_mutex_unlock(&socket->lock); 692 693 out:694 free(buffer);695 609 } 696 610 697 611 static void tcp_sock_sendto(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call) 698 612 { 699 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_sendto()");613 log_msg(LVL_DEBUG, "tcp_sock_sendto()"); 700 614 async_answer_0(callid, ENOTSUP); 701 615 } … … 703 617 static void tcp_sock_recvfrom(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call) 704 618 { 705 log_msg(LOG_DEFAULT, LVL_DEBUG, "%p: tcp_sock_recv[from]()", client); 706 707 int socket_id = SOCKET_GET_SOCKET_ID(call); 708 709 socket_core_t *sock_core = 710 socket_cores_find(&client->sockets, socket_id); 619 int socket_id; 620 int flags; 621 size_t addr_length, length; 622 socket_core_t *sock_core; 623 tcp_sockdata_t *socket; 624 ipc_call_t answer; 625 ipc_callid_t rcallid; 626 size_t data_len; 627 struct sockaddr_in addr; 628 tcp_sock_t *rsock; 629 int rc; 630 631 log_msg(LVL_DEBUG, "%p: tcp_sock_recv[from]()", client); 632 633 socket_id = SOCKET_GET_SOCKET_ID(call); 634 flags = SOCKET_GET_FLAGS(call); 635 636 sock_core = socket_cores_find(&client->sockets, socket_id); 711 637 if (sock_core == NULL) { 712 638 async_answer_0(callid, ENOTSOCK); 713 639 return; 714 640 } 715 716 tcp_sockdata_t *socket = 717 (tcp_sockdata_t *) sock_core->specific_data; 718 641 642 socket = (tcp_sockdata_t *)sock_core->specific_data; 719 643 fibril_mutex_lock(&socket->lock); 720 644 721 645 if (socket->conn == NULL) { 722 646 fibril_mutex_unlock(&socket->lock); … … 724 648 return; 725 649 } 726 727 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_recvfrom(): lock recv_buffer_lock"); 728 650 651 (void)flags; 652 653 log_msg(LVL_DEBUG, "tcp_sock_recvfrom(): lock recv_buffer_lock"); 729 654 fibril_mutex_lock(&socket->recv_buffer_lock); 730 while ((socket->recv_buffer_used == 0) && 731 (socket->recv_error == TCP_EOK)) { 732 log_msg(LOG_DEFAULT, LVL_DEBUG, "wait for recv_buffer_cv + recv_buffer_used != 0"); 655 while (socket->recv_buffer_used == 0 && socket->recv_error == TCP_EOK) { 656 log_msg(LVL_DEBUG, "wait for recv_buffer_cv + recv_buffer_used != 0"); 733 657 fibril_condvar_wait(&socket->recv_buffer_cv, 734 658 &socket->recv_buffer_lock); 735 659 } 736 737 log_msg(LOG_DEFAULT, LVL_DEBUG, "Got data in sock recv_buffer"); 738 739 size_t data_len = socket->recv_buffer_used; 740 tcp_error_t trc = socket->recv_error; 741 int rc; 742 743 switch (trc) { 660 661 log_msg(LVL_DEBUG, "Got data in sock recv_buffer"); 662 663 data_len = socket->recv_buffer_used; 664 rc = socket->recv_error; 665 666 switch (socket->recv_error) { 744 667 case TCP_EOK: 745 668 rc = EOK; … … 755 678 assert(false); 756 679 } 757 758 log_msg(LOG_DEFAULT, LVL_DEBUG, "**** recv result -> %d", rc); 759 680 681 log_msg(LVL_DEBUG, "**** recv result -> %d", rc); 760 682 if (rc != EOK) { 761 683 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 764 686 return; 765 687 } 766 767 ipc_callid_t rcallid; 768 688 769 689 if (IPC_GET_IMETHOD(call) == NET_SOCKET_RECVFROM) { 770 /* Fill address */ 771 tcp_sock_t *rsock = &socket->conn->ident.foreign; 772 struct sockaddr_in addr; 773 struct sockaddr_in6 addr6; 774 size_t addr_length; 775 776 uint16_t addr_af = inet_addr_sockaddr_in(&rsock->addr, &addr, 777 &addr6); 778 779 switch (addr_af) { 780 case AF_INET: 781 addr.sin_port = host2uint16_t_be(rsock->port); 782 783 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read receive"); 784 if (!async_data_read_receive(&rcallid, &addr_length)) { 785 fibril_mutex_unlock(&socket->recv_buffer_lock); 786 fibril_mutex_unlock(&socket->lock); 787 async_answer_0(callid, EINVAL); 788 return; 789 } 790 791 if (addr_length > sizeof(addr)) 792 addr_length = sizeof(addr); 793 794 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read finalize"); 795 rc = async_data_read_finalize(rcallid, &addr, addr_length); 796 if (rc != EOK) { 797 fibril_mutex_unlock(&socket->recv_buffer_lock); 798 fibril_mutex_unlock(&socket->lock); 799 async_answer_0(callid, EINVAL); 800 return; 801 } 802 803 break; 804 case AF_INET6: 805 addr6.sin6_port = host2uint16_t_be(rsock->port); 806 807 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read receive"); 808 if (!async_data_read_receive(&rcallid, &addr_length)) { 809 fibril_mutex_unlock(&socket->recv_buffer_lock); 810 fibril_mutex_unlock(&socket->lock); 811 async_answer_0(callid, EINVAL); 812 return; 813 } 814 815 if (addr_length > sizeof(addr6)) 816 addr_length = sizeof(addr6); 817 818 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read finalize"); 819 rc = async_data_read_finalize(rcallid, &addr6, addr_length); 820 if (rc != EOK) { 821 fibril_mutex_unlock(&socket->recv_buffer_lock); 822 fibril_mutex_unlock(&socket->lock); 823 async_answer_0(callid, EINVAL); 824 return; 825 } 826 827 break; 828 default: 690 /* Fill addr */ 691 rsock = &socket->conn->ident.foreign; 692 addr.sin_family = AF_INET; 693 addr.sin_addr.s_addr = host2uint32_t_be(rsock->addr.ipv4); 694 addr.sin_port = host2uint16_t_be(rsock->port); 695 696 log_msg(LVL_DEBUG, "addr read receive"); 697 if (!async_data_read_receive(&rcallid, &addr_length)) { 829 698 fibril_mutex_unlock(&socket->recv_buffer_lock); 830 699 fibril_mutex_unlock(&socket->lock); … … 832 701 return; 833 702 } 834 } 835 836 log_msg(LOG_DEFAULT, LVL_DEBUG, "data read receive"); 837 838 size_t length; 703 704 if (addr_length > sizeof(addr)) 705 addr_length = sizeof(addr); 706 707 log_msg(LVL_DEBUG, "addr read finalize"); 708 rc = async_data_read_finalize(rcallid, &addr, addr_length); 709 if (rc != EOK) { 710 fibril_mutex_unlock(&socket->recv_buffer_lock); 711 fibril_mutex_unlock(&socket->lock); 712 async_answer_0(callid, EINVAL); 713 return; 714 } 715 } 716 717 log_msg(LVL_DEBUG, "data read receive"); 839 718 if (!async_data_read_receive(&rcallid, &length)) { 840 719 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 843 722 return; 844 723 } 845 724 846 725 if (length > data_len) 847 726 length = data_len; 848 849 log_msg(LOG_DEFAULT, LVL_DEBUG, "data read finalize"); 850 727 728 log_msg(LVL_DEBUG, "data read finalize"); 851 729 rc = async_data_read_finalize(rcallid, socket->recv_buffer, length); 852 730 853 731 socket->recv_buffer_used -= length; 854 855 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_recvfrom: %zu left in buffer", 732 log_msg(LVL_DEBUG, "tcp_sock_recvfrom: %zu left in buffer", 856 733 socket->recv_buffer_used); 857 858 734 if (socket->recv_buffer_used > 0) { 859 735 memmove(socket->recv_buffer, socket->recv_buffer + length, … … 861 737 tcp_sock_notify_data(socket->sock_core); 862 738 } 863 739 864 740 fibril_condvar_broadcast(&socket->recv_buffer_cv); 865 866 if ( (length < data_len) && (rc == EOK))741 742 if (length < data_len && rc == EOK) 867 743 rc = EOVERFLOW; 868 869 ipc_call_t answer; 870 744 871 745 SOCKET_SET_READ_DATA_LENGTH(answer, length); 872 746 async_answer_1(callid, EOK, IPC_GET_ARG1(answer)); 873 747 874 748 fibril_mutex_unlock(&socket->recv_buffer_lock); 875 749 fibril_mutex_unlock(&socket->lock); … … 882 756 tcp_sockdata_t *socket; 883 757 tcp_error_t trc; 884 int i;885 758 int rc; 886 759 887 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_close()");760 log_msg(LVL_DEBUG, "tcp_sock_close()"); 888 761 socket_id = SOCKET_GET_SOCKET_ID(call); 889 762 … … 898 771 899 772 if (socket->conn != NULL) { 900 /* Close connection */901 773 trc = tcp_uc_close(socket->conn); 902 774 if (trc != TCP_EOK && trc != TCP_ENOTEXIST) { … … 907 779 } 908 780 909 if (socket->lconn != NULL) {910 /* Close listening connections */911 for (i = 0; i < socket->backlog; i++) {912 tcp_uc_set_cstate_cb(socket->lconn[i]->conn, NULL, NULL);913 trc = tcp_uc_close(socket->lconn[i]->conn);914 if (trc != TCP_EOK && trc != TCP_ENOTEXIST) {915 fibril_mutex_unlock(&socket->lock);916 async_answer_0(callid, EBADF);917 return;918 }919 920 free(socket->lconn[i]);921 socket->lconn[i] = NULL;922 }923 }924 925 781 /* Grab recv_buffer_lock because of CV wait in tcp_sock_recv_fibril() */ 926 782 fibril_mutex_lock(&socket->recv_buffer_lock); … … 942 798 static void tcp_sock_getsockopt(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call) 943 799 { 944 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_getsockopt()");800 log_msg(LVL_DEBUG, "tcp_sock_getsockopt()"); 945 801 async_answer_0(callid, ENOTSUP); 946 802 } … … 948 804 static void tcp_sock_setsockopt(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call) 949 805 { 950 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_setsockopt()");806 log_msg(LVL_DEBUG, "tcp_sock_setsockopt()"); 951 807 async_answer_0(callid, ENOTSUP); 952 808 } … … 959 815 tcp_sockdata_t *socket = lconn->socket; 960 816 961 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_cstate_cb()");817 log_msg(LVL_DEBUG, "tcp_sock_cstate_cb()"); 962 818 fibril_mutex_lock(&socket->lock); 963 819 assert(conn == lconn->conn); … … 972 828 list_append(&lconn->ready_list, &socket->ready); 973 829 974 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_cstate_cb(): notify accept");830 log_msg(LVL_DEBUG, "tcp_sock_cstate_cb(): notify accept"); 975 831 976 832 /* Push one accept notification to client's queue */ … … 986 842 tcp_error_t trc; 987 843 988 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_recv_fibril()");844 log_msg(LVL_DEBUG, "tcp_sock_recv_fibril()"); 989 845 990 846 fibril_mutex_lock(&sock->recv_buffer_lock); 991 847 992 848 while (true) { 993 log_msg(L OG_DEFAULT, LVL_DEBUG, "call tcp_uc_receive()");849 log_msg(LVL_DEBUG, "call tcp_uc_receive()"); 994 850 while (sock->recv_buffer_used != 0 && sock->sock_core != NULL) 995 851 fibril_condvar_wait(&sock->recv_buffer_cv, … … 1007 863 } 1008 864 1009 log_msg(L OG_DEFAULT, LVL_DEBUG, "got data - broadcast recv_buffer_cv");865 log_msg(LVL_DEBUG, "got data - broadcast recv_buffer_cv"); 1010 866 1011 867 sock->recv_buffer_used = data_len; … … 1039 895 break; 1040 896 1041 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_connection: METHOD=%d\n",897 log_msg(LVL_DEBUG, "tcp_sock_connection: METHOD=%d\n", 1042 898 (int)IPC_GET_IMETHOD(call)); 1043 899 … … 1084 940 1085 941 /* Clean up */ 1086 log_msg(L OG_DEFAULT, LVL_DEBUG, "tcp_sock_connection: Clean up");942 log_msg(LVL_DEBUG, "tcp_sock_connection: Clean up"); 1087 943 async_hangup(client.sess); 1088 944 socket_cores_release(NULL, &client.sockets, &gsock, tcp_free_sock_data);
Note:
See TracChangeset
for help on using the changeset viewer.