Changes in uspace/srv/net/udp/sock.c [02a09ed:ccb5165] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/udp/sock.c
r02a09ed rccb5165 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 161 169 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_bind()"); 162 170 log_msg(LOG_DEFAULT, LVL_DEBUG, " - async_data_write_accept"); 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);171 172 addr = NULL; 173 174 rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_size); 167 175 if (rc != EOK) { 168 176 async_answer_0(callid, rc); 169 return; 170 } 171 172 if ((addr_len != sizeof(struct sockaddr_in)) && 173 (addr_len != sizeof(struct sockaddr_in6))) { 177 goto out; 178 } 179 180 if (addr_size != sizeof(struct sockaddr_in)) { 174 181 async_answer_0(callid, EINVAL); 175 182 goto out; 176 183 } 177 184 178 struct sockaddr_in *addr = (struct sockaddr_in *) addr6;179 180 185 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_bind"); 181 182 186 rc = socket_bind(&client->sockets, &gsock, SOCKET_GET_SOCKET_ID(call), 183 addr 6, addr_len, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END,187 addr, addr_size, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END, 184 188 last_used_port); 185 189 if (rc != EOK) { … … 189 193 190 194 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_cores_find"); 191 192 socket_core_t *sock_core = socket_cores_find(&client->sockets, 193 SOCKET_GET_SOCKET_ID(call)); 195 sock_core = socket_cores_find(&client->sockets, SOCKET_GET_SOCKET_ID(call)); 194 196 if (sock_core == NULL) { 195 197 async_answer_0(callid, ENOENT); 196 198 goto out; 197 199 } 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 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 220 207 switch (urc) { 221 208 case UDP_EOK: … … 234 221 assert(false); 235 222 } 236 223 237 224 log_msg(LOG_DEFAULT, LVL_DEBUG, " - success"); 238 225 async_answer_0(callid, rc); 239 240 226 out: 241 if (addr 6!= NULL)242 free(addr 6);227 if (addr != NULL) 228 free(addr); 243 229 } 244 230 … … 265 251 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_send()"); 266 252 267 struct sockaddr_in6 *addr6 = NULL; 268 struct sockaddr_in *addr; 269 udp_sock_t fsocket; 270 udp_sock_t *fsocket_ptr; 253 struct sockaddr_in *addr = NULL; 254 udp_sock_t fsock; 255 udp_sock_t *fsock_ptr; 271 256 272 257 if (IPC_GET_IMETHOD(call) == NET_SOCKET_SENDTO) { 273 size_t addr_ len;274 int rc = async_data_write_accept((void **) &addr 6, false,275 0, 0, 0, &addr_ len);258 size_t addr_size; 259 int rc = async_data_write_accept((void **) &addr, false, 260 0, 0, 0, &addr_size); 276 261 if (rc != EOK) { 277 262 async_answer_0(callid, rc); 278 return; 279 } 280 281 if ((addr_len != sizeof(struct sockaddr_in)) && 282 (addr_len != sizeof(struct sockaddr_in6))) { 263 goto out; 264 } 265 266 if (addr_size != sizeof(struct sockaddr_in)) { 283 267 async_answer_0(callid, EINVAL); 284 268 goto out; 285 269 } 286 270 287 addr = (struct sockaddr_in *) addr6; 288 289 switch (addr->sin_family) { 290 case AF_INET: 291 inet_sockaddr_in_addr(addr, &fsocket.addr); 292 break; 293 case AF_INET6: 294 inet_sockaddr_in6_addr(addr6, &fsocket.addr); 295 break; 296 default: 297 async_answer_0(callid, EINVAL); 298 goto out; 299 } 300 301 fsocket.port = uint16_t_be2host(addr->sin_port); 302 fsocket_ptr = &fsocket; 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; 303 274 } else 304 fsock et_ptr = NULL;275 fsock_ptr = NULL; 305 276 306 277 int socket_id = SOCKET_GET_SOCKET_ID(call); … … 343 314 fibril_mutex_lock(&socket->lock); 344 315 345 if ( inet_addr_is_any(&socket->assoc->ident.local.addr)) {316 if (socket->assoc->ident.local.addr.ipv4 == UDP_IPV4_ANY) { 346 317 /* Determine local IP address */ 347 inet_addr_t loc_addr; 348 inet_addr_t rem_addr; 349 350 rem_addr = fsocket_ptr ? fsocket.addr : 351 socket->assoc->ident.foreign.addr; 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; 352 322 353 323 int rc = inet_get_srcaddr(&rem_addr, 0, &loc_addr); … … 360 330 } 361 331 362 socket->assoc->ident.local.addr = loc_addr; 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); 363 335 } 364 336 … … 388 360 389 361 udp_error_t urc = 390 udp_uc_send(socket->assoc, fsock et_ptr, buffer, length, 0);362 udp_uc_send(socket->assoc, fsock_ptr, buffer, length, 0); 391 363 392 364 switch (urc) { … … 423 395 424 396 out: 425 if (addr 6!= NULL)426 free(addr 6);397 if (addr != NULL) 398 free(addr); 427 399 } 428 400 429 401 static void udp_sock_recvfrom(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 430 402 { 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 431 416 log_msg(LOG_DEFAULT, LVL_DEBUG, "%p: udp_sock_recv[from]()", client); 432 433 intsocket_id = SOCKET_GET_SOCKET_ID(call);434 435 socket_core_t *sock_core = 436 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); 437 422 if (sock_core == NULL) { 438 423 async_answer_0(callid, ENOTSOCK); 439 424 return; 440 425 } 441 442 udp_sockdata_t *socket = 443 (udp_sockdata_t *) sock_core->specific_data; 444 426 427 socket = (udp_sockdata_t *)sock_core->specific_data; 445 428 fibril_mutex_lock(&socket->lock); 446 429 447 430 if (socket->assoc == NULL) { 448 431 fibril_mutex_unlock(&socket->lock); … … 450 433 return; 451 434 } 452 435 436 (void)flags; 437 453 438 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recvfrom(): lock recv_buffer lock"); 454 455 439 fibril_mutex_lock(&socket->recv_buffer_lock); 456 457 while ((socket->recv_buffer_used == 0) && 458 (socket->recv_error == UDP_EOK)) { 440 while (socket->recv_buffer_used == 0 && socket->recv_error == UDP_EOK) { 459 441 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recvfrom(): wait for cv"); 460 442 fibril_condvar_wait(&socket->recv_buffer_cv, 461 443 &socket->recv_buffer_lock); 462 444 } 463 445 464 446 log_msg(LOG_DEFAULT, LVL_DEBUG, "Got data in sock recv_buffer"); 465 466 size_t data_len = socket->recv_buffer_used; 467 udp_error_t urc = socket->recv_error; 468 447 448 rsock = socket->recv_fsock; 449 data_len = socket->recv_buffer_used; 450 urc = socket->recv_error; 451 469 452 log_msg(LOG_DEFAULT, LVL_DEBUG, "**** recv data_len=%zu", data_len); 470 471 int rc; 472 453 473 454 switch (urc) { 474 455 case UDP_EOK: … … 485 466 assert(false); 486 467 } 487 468 488 469 log_msg(LOG_DEFAULT, LVL_DEBUG, "**** udp_uc_receive -> %d", rc); 489 490 470 if (rc != EOK) { 491 471 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 494 474 return; 495 475 } 496 497 ipc_callid_t rcallid; 498 size_t addr_size = 0; 499 476 500 477 if (IPC_GET_IMETHOD(call) == NET_SOCKET_RECVFROM) { 501 /* Fill address */ 502 udp_sock_t *rsock = &socket->recv_fsock; 503 struct sockaddr_in addr; 504 struct sockaddr_in6 addr6; 505 size_t addr_length; 506 507 uint16_t addr_af = inet_addr_sockaddr_in(&rsock->addr, &addr, 508 &addr6); 509 510 switch (addr_af) { 511 case AF_INET: 512 addr.sin_port = host2uint16_t_be(rsock->port); 513 514 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read receive"); 515 if (!async_data_read_receive(&rcallid, &addr_length)) { 516 fibril_mutex_unlock(&socket->recv_buffer_lock); 517 fibril_mutex_unlock(&socket->lock); 518 async_answer_0(callid, EINVAL); 519 return; 520 } 521 522 if (addr_length > sizeof(addr)) 523 addr_length = sizeof(addr); 524 525 addr_size = sizeof(addr); 526 527 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read finalize"); 528 rc = async_data_read_finalize(rcallid, &addr, addr_length); 529 if (rc != EOK) { 530 fibril_mutex_unlock(&socket->recv_buffer_lock); 531 fibril_mutex_unlock(&socket->lock); 532 async_answer_0(callid, EINVAL); 533 return; 534 } 535 536 break; 537 case AF_INET6: 538 addr6.sin6_port = host2uint16_t_be(rsock->port); 539 540 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read receive"); 541 if (!async_data_read_receive(&rcallid, &addr_length)) { 542 fibril_mutex_unlock(&socket->recv_buffer_lock); 543 fibril_mutex_unlock(&socket->lock); 544 async_answer_0(callid, EINVAL); 545 return; 546 } 547 548 if (addr_length > sizeof(addr6)) 549 addr_length = sizeof(addr6); 550 551 addr_size = sizeof(addr6); 552 553 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read finalize"); 554 rc = async_data_read_finalize(rcallid, &addr6, addr_length); 555 if (rc != EOK) { 556 fibril_mutex_unlock(&socket->recv_buffer_lock); 557 fibril_mutex_unlock(&socket->lock); 558 async_answer_0(callid, EINVAL); 559 return; 560 } 561 562 break; 563 default: 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)) { 564 485 fibril_mutex_unlock(&socket->recv_buffer_lock); 565 486 fibril_mutex_unlock(&socket->lock); … … 567 488 return; 568 489 } 569 } 570 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 571 504 log_msg(LOG_DEFAULT, LVL_DEBUG, "data read receive"); 572 573 size_t length;574 505 if (!async_data_read_receive(&rcallid, &length)) { 575 506 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 578 509 return; 579 510 } 580 511 581 512 if (length > data_len) 582 513 length = data_len; 583 514 584 515 log_msg(LOG_DEFAULT, LVL_DEBUG, "data read finalize"); 585 586 516 rc = async_data_read_finalize(rcallid, socket->recv_buffer, length); 587 588 if ( (length < data_len) && (rc == EOK))517 518 if (length < data_len && rc == EOK) 589 519 rc = EOVERFLOW; 590 520 591 521 log_msg(LOG_DEFAULT, LVL_DEBUG, "read_data_length <- %zu", length); 592 593 ipc_call_t answer;594 595 522 IPC_SET_ARG2(answer, 0); 596 523 SOCKET_SET_READ_DATA_LENGTH(answer, length); 597 SOCKET_SET_ADDRESS_LENGTH(answer, addr_size);524 SOCKET_SET_ADDRESS_LENGTH(answer, sizeof(addr)); 598 525 async_answer_3(callid, EOK, IPC_GET_ARG1(answer), 599 526 IPC_GET_ARG2(answer), IPC_GET_ARG3(answer)); 600 527 601 528 socket->recv_buffer_used = 0; 602 529 603 530 fibril_condvar_broadcast(&socket->recv_buffer_cv); 604 531 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 675 602 while (true) { 676 603 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] wait for rcv buffer empty()"); 677 while ( (sock->recv_buffer_used != 0) && (sock->sock_core != NULL)) {604 while (sock->recv_buffer_used != 0 && sock->sock_core != NULL) { 678 605 fibril_condvar_wait(&sock->recv_buffer_cv, 679 606 &sock->recv_buffer_lock); … … 696 623 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] urc != UDP_EOK, break"); 697 624 fibril_condvar_broadcast(&sock->recv_buffer_cv); 698 fibril_mutex_unlock(&sock->recv_buffer_lock);699 625 break; 700 626 }
Note:
See TracChangeset
for help on using the changeset viewer.