Changes in uspace/srv/net/udp/sock.c [ccb5165:f4a27304] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/udp/sock.c
rccb5165 rf4a27304 159 159 static void udp_sock_bind(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 160 160 { 161 int rc;162 struct sockaddr_in *addr;163 size_t addr_size;164 socket_core_t *sock_core;165 udp_sockdata_t *socket;166 udp_sock_t fsock;167 udp_error_t urc;168 169 161 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_bind()"); 170 162 log_msg(LOG_DEFAULT, LVL_DEBUG, " - async_data_write_accept"); 171 172 addr= NULL;173 174 rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_size);163 164 struct sockaddr_in6 *addr6 = NULL; 165 size_t addr_len; 166 int rc = async_data_write_accept((void **) &addr6, false, 0, 0, 0, &addr_len); 175 167 if (rc != EOK) { 176 168 async_answer_0(callid, rc); 177 goto out; 178 } 179 180 if (addr_size != sizeof(struct sockaddr_in)) { 169 return; 170 } 171 172 if ((addr_len != sizeof(struct sockaddr_in)) && 173 (addr_len != sizeof(struct sockaddr_in6))) { 181 174 async_answer_0(callid, EINVAL); 182 175 goto out; 183 176 } 184 177 178 struct sockaddr_in *addr = (struct sockaddr_in *) addr6; 179 185 180 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_bind"); 181 186 182 rc = socket_bind(&client->sockets, &gsock, SOCKET_GET_SOCKET_ID(call), 187 addr , addr_size, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END,183 addr6, addr_len, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END, 188 184 last_used_port); 189 185 if (rc != EOK) { … … 193 189 194 190 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_cores_find"); 195 sock_core = socket_cores_find(&client->sockets, SOCKET_GET_SOCKET_ID(call)); 191 192 socket_core_t *sock_core = socket_cores_find(&client->sockets, 193 SOCKET_GET_SOCKET_ID(call)); 196 194 if (sock_core == NULL) { 197 195 async_answer_0(callid, ENOENT); 198 196 goto out; 199 197 } 200 201 socket = (udp_sockdata_t *)sock_core->specific_data; 202 203 fsock.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr); 204 fsock.port = sock_core->port; 205 urc = udp_uc_set_local(socket->assoc, &fsock); 206 198 199 udp_sockdata_t *socket = 200 (udp_sockdata_t *) sock_core->specific_data; 201 202 udp_sock_t fsocket; 203 204 fsocket.port = sock_core->port; 205 206 switch (addr->sin_family) { 207 case AF_INET: 208 inet_sockaddr_in_addr(addr, &fsocket.addr); 209 break; 210 case AF_INET6: 211 inet_sockaddr_in6_addr(addr6, &fsocket.addr); 212 break; 213 default: 214 async_answer_0(callid, EINVAL); 215 goto out; 216 } 217 218 udp_error_t urc = udp_uc_set_local(socket->assoc, &fsocket); 219 207 220 switch (urc) { 208 221 case UDP_EOK: … … 221 234 assert(false); 222 235 } 223 236 224 237 log_msg(LOG_DEFAULT, LVL_DEBUG, " - success"); 225 238 async_answer_0(callid, rc); 239 226 240 out: 227 if (addr != NULL)228 free(addr );241 if (addr6 != NULL) 242 free(addr6); 229 243 } 230 244 … … 251 265 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_send()"); 252 266 253 struct sockaddr_in *addr = NULL; 254 udp_sock_t fsock; 255 udp_sock_t *fsock_ptr; 267 uint8_t *buffer = calloc(UDP_FRAGMENT_SIZE, 1); 268 if (buffer == NULL) { 269 async_answer_0(callid, ENOMEM); 270 return; 271 } 272 273 struct sockaddr_in6 *addr6 = NULL; 274 struct sockaddr_in *addr; 275 udp_sock_t fsocket; 276 udp_sock_t *fsocket_ptr; 256 277 257 278 if (IPC_GET_IMETHOD(call) == NET_SOCKET_SENDTO) { 258 size_t addr_ size;259 int rc = async_data_write_accept((void **) &addr , false,260 0, 0, 0, &addr_ size);279 size_t addr_len; 280 int rc = async_data_write_accept((void **) &addr6, false, 281 0, 0, 0, &addr_len); 261 282 if (rc != EOK) { 262 283 async_answer_0(callid, rc); … … 264 285 } 265 286 266 if (addr_size != sizeof(struct sockaddr_in)) { 287 if ((addr_len != sizeof(struct sockaddr_in)) && 288 (addr_len != sizeof(struct sockaddr_in6))) { 267 289 async_answer_0(callid, EINVAL); 268 290 goto out; 269 291 } 270 292 271 fsock.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr); 272 fsock.port = uint16_t_be2host(addr->sin_port); 273 fsock_ptr = &fsock; 293 addr = (struct sockaddr_in *) addr6; 294 295 switch (addr->sin_family) { 296 case AF_INET: 297 inet_sockaddr_in_addr(addr, &fsocket.addr); 298 break; 299 case AF_INET6: 300 inet_sockaddr_in6_addr(addr6, &fsocket.addr); 301 break; 302 default: 303 async_answer_0(callid, EINVAL); 304 goto out; 305 } 306 307 fsocket.port = uint16_t_be2host(addr->sin_port); 308 fsocket_ptr = &fsocket; 274 309 } else 275 fsock _ptr = NULL;310 fsocket_ptr = NULL; 276 311 277 312 int socket_id = SOCKET_GET_SOCKET_ID(call); … … 314 349 fibril_mutex_lock(&socket->lock); 315 350 316 if ( socket->assoc->ident.local.addr.ipv4 == UDP_IPV4_ANY) {351 if (inet_addr_is_any(&socket->assoc->ident.local.addr)) { 317 352 /* 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; 353 inet_addr_t loc_addr; 354 inet_addr_t rem_addr; 355 356 rem_addr = fsocket_ptr ? fsocket.addr : 357 socket->assoc->ident.foreign.addr; 322 358 323 359 int rc = inet_get_srcaddr(&rem_addr, 0, &loc_addr); … … 327 363 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_sendto: Failed to " 328 364 "determine local address."); 329 return; 330 } 331 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); 365 goto out; 366 } 367 368 socket->assoc->ident.local.addr = loc_addr; 335 369 } 336 370 … … 351 385 length = UDP_FRAGMENT_SIZE; 352 386 353 uint8_t buffer[UDP_FRAGMENT_SIZE];354 387 int rc = async_data_write_finalize(wcallid, buffer, length); 355 388 if (rc != EOK) { … … 360 393 361 394 udp_error_t urc = 362 udp_uc_send(socket->assoc, fsock _ptr, buffer, length, 0);395 udp_uc_send(socket->assoc, fsocket_ptr, buffer, length, 0); 363 396 364 397 switch (urc) { … … 395 428 396 429 out: 397 if (addr != NULL) 398 free(addr); 430 if (addr6 != NULL) 431 free(addr6); 432 433 free(buffer); 399 434 } 400 435 401 436 static void udp_sock_recvfrom(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 402 437 { 403 int socket_id;404 int flags;405 size_t addr_length, length;406 socket_core_t *sock_core;407 udp_sockdata_t *socket;408 ipc_call_t answer;409 ipc_callid_t rcallid;410 size_t data_len;411 udp_error_t urc;412 udp_sock_t rsock;413 struct sockaddr_in addr;414 int rc;415 416 438 log_msg(LOG_DEFAULT, LVL_DEBUG, "%p: udp_sock_recv[from]()", client); 417 418 socket_id = SOCKET_GET_SOCKET_ID(call);419 flags = SOCKET_GET_FLAGS(call);420 421 sock_core =socket_cores_find(&client->sockets, socket_id);439 440 int socket_id = SOCKET_GET_SOCKET_ID(call); 441 442 socket_core_t *sock_core = 443 socket_cores_find(&client->sockets, socket_id); 422 444 if (sock_core == NULL) { 423 445 async_answer_0(callid, ENOTSOCK); 424 446 return; 425 447 } 426 427 socket = (udp_sockdata_t *)sock_core->specific_data; 448 449 udp_sockdata_t *socket = 450 (udp_sockdata_t *) sock_core->specific_data; 451 428 452 fibril_mutex_lock(&socket->lock); 429 453 430 454 if (socket->assoc == NULL) { 431 455 fibril_mutex_unlock(&socket->lock); … … 433 457 return; 434 458 } 435 436 (void)flags; 437 459 438 460 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recvfrom(): lock recv_buffer lock"); 461 439 462 fibril_mutex_lock(&socket->recv_buffer_lock); 440 while (socket->recv_buffer_used == 0 && socket->recv_error == UDP_EOK) { 463 464 while ((socket->recv_buffer_used == 0) && 465 (socket->recv_error == UDP_EOK)) { 441 466 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recvfrom(): wait for cv"); 442 467 fibril_condvar_wait(&socket->recv_buffer_cv, 443 468 &socket->recv_buffer_lock); 444 469 } 445 470 446 471 log_msg(LOG_DEFAULT, LVL_DEBUG, "Got data in sock recv_buffer"); 447 448 rsock = socket->recv_fsock; 449 data_len = socket->recv_buffer_used; 450 urc = socket->recv_error; 451 472 473 size_t data_len = socket->recv_buffer_used; 474 udp_error_t urc = socket->recv_error; 475 452 476 log_msg(LOG_DEFAULT, LVL_DEBUG, "**** recv data_len=%zu", data_len); 453 477 478 int rc; 479 454 480 switch (urc) { 455 481 case UDP_EOK: … … 466 492 assert(false); 467 493 } 468 494 469 495 log_msg(LOG_DEFAULT, LVL_DEBUG, "**** udp_uc_receive -> %d", rc); 496 470 497 if (rc != EOK) { 471 498 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 474 501 return; 475 502 } 476 503 504 ipc_callid_t rcallid; 505 size_t addr_size = 0; 506 477 507 if (IPC_GET_IMETHOD(call) == NET_SOCKET_RECVFROM) { 478 /* Fill addr */ 479 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); 482 483 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read receive"); 484 if (!async_data_read_receive(&rcallid, &addr_length)) { 508 /* Fill address */ 509 udp_sock_t *rsock = &socket->recv_fsock; 510 struct sockaddr_in addr; 511 struct sockaddr_in6 addr6; 512 size_t addr_length; 513 514 uint16_t addr_af = inet_addr_sockaddr_in(&rsock->addr, &addr, 515 &addr6); 516 517 switch (addr_af) { 518 case AF_INET: 519 addr.sin_port = host2uint16_t_be(rsock->port); 520 521 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read receive"); 522 if (!async_data_read_receive(&rcallid, &addr_length)) { 523 fibril_mutex_unlock(&socket->recv_buffer_lock); 524 fibril_mutex_unlock(&socket->lock); 525 async_answer_0(callid, EINVAL); 526 return; 527 } 528 529 if (addr_length > sizeof(addr)) 530 addr_length = sizeof(addr); 531 532 addr_size = sizeof(addr); 533 534 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read finalize"); 535 rc = async_data_read_finalize(rcallid, &addr, addr_length); 536 if (rc != EOK) { 537 fibril_mutex_unlock(&socket->recv_buffer_lock); 538 fibril_mutex_unlock(&socket->lock); 539 async_answer_0(callid, EINVAL); 540 return; 541 } 542 543 break; 544 case AF_INET6: 545 addr6.sin6_port = host2uint16_t_be(rsock->port); 546 547 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read receive"); 548 if (!async_data_read_receive(&rcallid, &addr_length)) { 549 fibril_mutex_unlock(&socket->recv_buffer_lock); 550 fibril_mutex_unlock(&socket->lock); 551 async_answer_0(callid, EINVAL); 552 return; 553 } 554 555 if (addr_length > sizeof(addr6)) 556 addr_length = sizeof(addr6); 557 558 addr_size = sizeof(addr6); 559 560 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read finalize"); 561 rc = async_data_read_finalize(rcallid, &addr6, addr_length); 562 if (rc != EOK) { 563 fibril_mutex_unlock(&socket->recv_buffer_lock); 564 fibril_mutex_unlock(&socket->lock); 565 async_answer_0(callid, EINVAL); 566 return; 567 } 568 569 break; 570 default: 485 571 fibril_mutex_unlock(&socket->recv_buffer_lock); 486 572 fibril_mutex_unlock(&socket->lock); … … 488 574 return; 489 575 } 490 491 if (addr_length > sizeof(addr)) 492 addr_length = sizeof(addr); 493 494 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read finalize"); 495 rc = async_data_read_finalize(rcallid, &addr, addr_length); 496 if (rc != EOK) { 497 fibril_mutex_unlock(&socket->recv_buffer_lock); 498 fibril_mutex_unlock(&socket->lock); 499 async_answer_0(callid, EINVAL); 500 return; 501 } 502 } 503 576 } 577 504 578 log_msg(LOG_DEFAULT, LVL_DEBUG, "data read receive"); 579 580 size_t length; 505 581 if (!async_data_read_receive(&rcallid, &length)) { 506 582 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 509 585 return; 510 586 } 511 587 512 588 if (length > data_len) 513 589 length = data_len; 514 590 515 591 log_msg(LOG_DEFAULT, LVL_DEBUG, "data read finalize"); 592 516 593 rc = async_data_read_finalize(rcallid, socket->recv_buffer, length); 517 518 if ( length < data_len && rc == EOK)594 595 if ((length < data_len) && (rc == EOK)) 519 596 rc = EOVERFLOW; 520 597 521 598 log_msg(LOG_DEFAULT, LVL_DEBUG, "read_data_length <- %zu", length); 599 600 ipc_call_t answer; 601 522 602 IPC_SET_ARG2(answer, 0); 523 603 SOCKET_SET_READ_DATA_LENGTH(answer, length); 524 SOCKET_SET_ADDRESS_LENGTH(answer, sizeof(addr));604 SOCKET_SET_ADDRESS_LENGTH(answer, addr_size); 525 605 async_answer_3(callid, EOK, IPC_GET_ARG1(answer), 526 606 IPC_GET_ARG2(answer), IPC_GET_ARG3(answer)); 527 607 528 608 socket->recv_buffer_used = 0; 529 609 530 610 fibril_condvar_broadcast(&socket->recv_buffer_cv); 531 611 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 602 682 while (true) { 603 683 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] wait for rcv buffer empty()"); 604 while ( sock->recv_buffer_used != 0 && sock->sock_core != NULL) {684 while ((sock->recv_buffer_used != 0) && (sock->sock_core != NULL)) { 605 685 fibril_condvar_wait(&sock->recv_buffer_cv, 606 686 &sock->recv_buffer_lock); … … 623 703 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] urc != UDP_EOK, break"); 624 704 fibril_condvar_broadcast(&sock->recv_buffer_cv); 705 fibril_mutex_unlock(&sock->recv_buffer_lock); 625 706 break; 626 707 }
Note:
See TracChangeset
for help on using the changeset viewer.