Changes in uspace/srv/net/udp/sock.c [db81577:695b6ff] in mainline
- File:
-
- 1 edited
-
uspace/srv/net/udp/sock.c (modified) (26 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/udp/sock.c
rdb81577 r695b6ff 1 1 /* 2 2 * Copyright (c) 2008 Lukas Mejdrech 3 * Copyright (c) 201 2Jiri Svoboda3 * Copyright (c) 2013 Jiri Svoboda 4 4 * All rights reserved. 5 5 * … … 88 88 static void udp_sock_notify_data(socket_core_t *sock_core) 89 89 { 90 log_msg(L VL_DEBUG, "udp_sock_notify_data(%d)", sock_core->socket_id);90 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_notify_data(%d)", sock_core->socket_id); 91 91 async_exch_t *exch = async_exchange_begin(sock_core->sess); 92 async_msg_5(exch, NET_SOCKET_RECEIVED, (sysarg_t) sock_core->socket_id,92 async_msg_5(exch, NET_SOCKET_RECEIVED, (sysarg_t) sock_core->socket_id, 93 93 UDP_FRAGMENT_SIZE, 0, 0, 1); 94 94 async_exchange_end(exch); … … 103 103 ipc_call_t answer; 104 104 105 log_msg(L VL_DEBUG, "udp_sock_socket()");105 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_socket()"); 106 106 sock = calloc(1, sizeof(udp_sockdata_t)); 107 107 if (sock == NULL) { … … 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 log_msg(LVL_DEBUG, "udp_sock_bind()"); 170 log_msg(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); 161 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_bind()"); 162 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); 175 167 if (rc != EOK) { 176 168 async_answer_0(callid, rc); 169 return; 170 } 171 172 if ((addr_len != sizeof(struct sockaddr_in)) && 173 (addr_len != sizeof(struct sockaddr_in6))) { 174 async_answer_0(callid, EINVAL); 177 175 goto out; 178 176 } 179 180 log_msg(LVL_DEBUG, " - call socket_bind"); 177 178 struct sockaddr_in *addr = (struct sockaddr_in *) addr6; 179 180 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_bind"); 181 181 182 rc = socket_bind(&client->sockets, &gsock, SOCKET_GET_SOCKET_ID(call), 182 addr , addr_size, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END,183 addr6, addr_len, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END, 183 184 last_used_port); 184 185 if (rc != EOK) { … … 186 187 goto out; 187 188 } 188 189 if (addr_size != sizeof(struct sockaddr_in)) { 190 async_answer_0(callid, EINVAL); 191 goto out; 192 } 193 194 log_msg(LVL_DEBUG, " - call socket_cores_find"); 195 sock_core = socket_cores_find(&client->sockets, SOCKET_GET_SOCKET_ID(call)); 189 190 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)); 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 224 log_msg(L VL_DEBUG, " - success");236 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 231 245 static void udp_sock_listen(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 232 246 { 233 log_msg(L VL_DEBUG, "udp_sock_listen()");247 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_listen()"); 234 248 async_answer_0(callid, ENOTSUP); 235 249 } … … 237 251 static void udp_sock_connect(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 238 252 { 239 log_msg(L VL_DEBUG, "udp_sock_connect()");253 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_connect()"); 240 254 async_answer_0(callid, ENOTSUP); 241 255 } … … 243 257 static void udp_sock_accept(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 244 258 { 245 log_msg(L VL_DEBUG, "udp_sock_accept()");259 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_accept()"); 246 260 async_answer_0(callid, ENOTSUP); 247 261 } … … 249 263 static void udp_sock_sendto(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 250 264 { 251 int socket_id; 252 int fragments; 253 int index; 265 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_send()"); 266 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; 254 274 struct sockaddr_in *addr; 255 size_t addr_size; 256 socket_core_t *sock_core; 257 udp_sockdata_t *socket; 258 udp_sock_t fsock, *fsockp; 259 ipc_call_t answer; 260 ipc_callid_t wcallid; 261 size_t length; 262 uint8_t buffer[UDP_FRAGMENT_SIZE]; 263 udp_error_t urc; 264 int rc; 265 266 log_msg(LVL_DEBUG, "udp_sock_send()"); 267 268 addr = NULL; 269 275 udp_sock_t fsocket; 276 udp_sock_t *fsocket_ptr; 277 270 278 if (IPC_GET_IMETHOD(call) == NET_SOCKET_SENDTO) { 271 rc = async_data_write_accept((void **) &addr, false, 272 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); 273 282 if (rc != EOK) { 274 283 async_answer_0(callid, rc); 275 284 goto out; 276 285 } 277 278 if (addr_size != sizeof(struct sockaddr_in)) { 286 287 if ((addr_len != sizeof(struct sockaddr_in)) && 288 (addr_len != sizeof(struct sockaddr_in6))) { 279 289 async_answer_0(callid, EINVAL); 280 290 goto out; 281 291 } 282 283 fsock.addr.ipv4 = uint32_t_be2host(addr->sin_addr.s_addr); 284 fsock.port = uint16_t_be2host(addr->sin_port); 285 fsockp = &fsock; 286 } else { 287 fsockp = NULL; 288 } 289 290 socket_id = SOCKET_GET_SOCKET_ID(call); 291 fragments = SOCKET_GET_DATA_FRAGMENTS(call); 292 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; 309 } else 310 fsocket_ptr = NULL; 311 312 int socket_id = SOCKET_GET_SOCKET_ID(call); 313 292 314 SOCKET_GET_FLAGS(call); 293 294 sock_core = socket_cores_find(&client->sockets, socket_id); 315 316 socket_core_t *sock_core = 317 socket_cores_find(&client->sockets, socket_id); 295 318 if (sock_core == NULL) { 296 319 async_answer_0(callid, ENOTSOCK); 297 320 goto out; 298 321 } 299 300 if (sock_core->port == 0) { 322 323 udp_sockdata_t *socket = 324 (udp_sockdata_t *) sock_core->specific_data; 325 326 if (sock_core->port <= 0) { 301 327 /* Implicitly bind socket to port */ 302 rc = socket_bind(&client->sockets, &gsock, SOCKET_GET_SOCKET_ID(call), 303 addr, addr_size, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END, 304 last_used_port); 328 int rc = socket_bind_free_port(&gsock, sock_core, 329 UDP_FREE_PORTS_START, UDP_FREE_PORTS_END, last_used_port); 305 330 if (rc != EOK) { 306 331 async_answer_0(callid, rc); 307 332 goto out; 308 333 } 309 } 310 311 socket = (udp_sockdata_t *)sock_core->specific_data; 334 335 assert(sock_core->port > 0); 336 337 udp_error_t urc = udp_uc_set_local_port(socket->assoc, 338 sock_core->port); 339 340 if (urc != UDP_EOK) { 341 // TODO: better error handling 342 async_answer_0(callid, EINTR); 343 goto out; 344 } 345 346 last_used_port = sock_core->port; 347 } 348 312 349 fibril_mutex_lock(&socket->lock); 313 314 if (socket->assoc->ident.local.addr.ipv4 == UDP_IPV4_ANY) { 350 351 if (inet_addr_is_any(&socket->assoc->ident.local.addr) && 352 socket->assoc->ident.iplink == 0) { 315 353 /* Determine local IP address */ 316 inet_addr_t loc_addr, rem_addr; 317 318 rem_addr.ipv4 = fsockp ? fsock.addr.ipv4 : 319 socket->assoc->ident.foreign.addr.ipv4; 320 321 rc = inet_get_srcaddr(&rem_addr, 0, &loc_addr); 354 inet_addr_t loc_addr; 355 inet_addr_t rem_addr; 356 357 rem_addr = fsocket_ptr ? fsocket.addr : 358 socket->assoc->ident.foreign.addr; 359 360 int rc = inet_get_srcaddr(&rem_addr, 0, &loc_addr); 322 361 if (rc != EOK) { 323 362 fibril_mutex_unlock(&socket->lock); 324 363 async_answer_0(callid, rc); 325 log_msg(L VL_DEBUG, "udp_sock_sendto: Failed to "364 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_sendto: Failed to " 326 365 "determine local address."); 327 return; 328 } 329 330 socket->assoc->ident.local.addr.ipv4 = loc_addr.ipv4; 331 log_msg(LVL_DEBUG, "Local IP address is %x", 332 socket->assoc->ident.local.addr.ipv4); 333 } 334 335 366 goto out; 367 } 368 369 socket->assoc->ident.local.addr = loc_addr; 370 } 371 336 372 assert(socket->assoc != NULL); 337 338 for (index = 0; index < fragments; index++) { 373 374 int fragments = SOCKET_GET_DATA_FRAGMENTS(call); 375 for (int index = 0; index < fragments; index++) { 376 ipc_callid_t wcallid; 377 size_t length; 378 339 379 if (!async_data_write_receive(&wcallid, &length)) { 340 380 fibril_mutex_unlock(&socket->lock); … … 342 382 goto out; 343 383 } 344 384 345 385 if (length > UDP_FRAGMENT_SIZE) 346 386 length = UDP_FRAGMENT_SIZE; 347 348 rc = async_data_write_finalize(wcallid, buffer, length);387 388 int rc = async_data_write_finalize(wcallid, buffer, length); 349 389 if (rc != EOK) { 350 390 fibril_mutex_unlock(&socket->lock); … … 352 392 goto out; 353 393 } 354 355 urc = udp_uc_send(socket->assoc, fsockp, buffer, length, 0); 356 394 395 udp_error_t urc = 396 udp_uc_send(socket->assoc, fsocket_ptr, buffer, length, 0); 397 357 398 switch (urc) { 358 399 case UDP_EOK: 359 400 rc = EOK; 360 401 break; 361 /* case TCP_ENOTEXIST:362 rc = ENO TCONN;363 break; 364 case TCP_ECLOSING:365 rc = E NOTCONN;366 break; 367 case TCP_ERESET:368 rc = E CONNABORTED;369 break; */402 case UDP_ENORES: 403 rc = ENOMEM; 404 break; 405 case UDP_EUNSPEC: 406 rc = EINVAL; 407 break; 408 case UDP_ENOROUTE: 409 rc = EIO; 410 break; 370 411 default: 371 412 assert(false); 372 413 } 373 414 374 415 if (rc != EOK) { 375 416 fibril_mutex_unlock(&socket->lock); … … 378 419 } 379 420 } 421 422 ipc_call_t answer; 380 423 381 424 IPC_SET_ARG1(answer, 0); … … 386 429 387 430 out: 388 if (addr != NULL) 389 free(addr); 431 if (addr6 != NULL) 432 free(addr6); 433 434 free(buffer); 390 435 } 391 436 392 437 static void udp_sock_recvfrom(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 393 438 { 394 int socket_id; 395 int flags; 396 size_t addr_length, length; 397 socket_core_t *sock_core; 398 udp_sockdata_t *socket; 399 ipc_call_t answer; 400 ipc_callid_t rcallid; 401 size_t data_len; 402 udp_error_t urc; 403 udp_sock_t rsock; 404 struct sockaddr_in addr; 405 int rc; 406 407 log_msg(LVL_DEBUG, "%p: udp_sock_recv[from]()", client); 408 409 socket_id = SOCKET_GET_SOCKET_ID(call); 410 flags = SOCKET_GET_FLAGS(call); 411 412 sock_core = socket_cores_find(&client->sockets, socket_id); 439 log_msg(LOG_DEFAULT, LVL_DEBUG, "%p: udp_sock_recv[from]()", client); 440 441 int socket_id = SOCKET_GET_SOCKET_ID(call); 442 443 socket_core_t *sock_core = 444 socket_cores_find(&client->sockets, socket_id); 413 445 if (sock_core == NULL) { 414 446 async_answer_0(callid, ENOTSOCK); 415 447 return; 416 448 } 417 418 socket = (udp_sockdata_t *)sock_core->specific_data; 449 450 udp_sockdata_t *socket = 451 (udp_sockdata_t *) sock_core->specific_data; 452 419 453 fibril_mutex_lock(&socket->lock); 420 454 421 455 if (socket->assoc == NULL) { 422 456 fibril_mutex_unlock(&socket->lock); … … 424 458 return; 425 459 } 426 427 (void)flags; 428 429 log_msg(LVL_DEBUG, "udp_sock_recvfrom(): lock recv_buffer lock"); 460 461 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recvfrom(): lock recv_buffer lock"); 462 430 463 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"); 464 465 while ((socket->recv_buffer_used == 0) && 466 (socket->recv_error == UDP_EOK)) { 467 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recvfrom(): wait for cv"); 433 468 fibril_condvar_wait(&socket->recv_buffer_cv, 434 469 &socket->recv_buffer_lock); 435 470 } 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); 444 471 472 log_msg(LOG_DEFAULT, LVL_DEBUG, "Got data in sock recv_buffer"); 473 474 size_t data_len = socket->recv_buffer_used; 475 udp_error_t urc = socket->recv_error; 476 477 log_msg(LOG_DEFAULT, LVL_DEBUG, "**** recv data_len=%zu", data_len); 478 479 int rc; 480 445 481 switch (urc) { 446 482 case UDP_EOK: … … 457 493 assert(false); 458 494 } 459 460 log_msg(LVL_DEBUG, "**** udp_uc_receive -> %d", rc); 495 496 log_msg(LOG_DEFAULT, LVL_DEBUG, "**** udp_uc_receive -> %d", rc); 497 461 498 if (rc != EOK) { 462 499 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 465 502 return; 466 503 } 467 504 505 ipc_callid_t rcallid; 506 size_t addr_size = 0; 507 468 508 if (IPC_GET_IMETHOD(call) == NET_SOCKET_RECVFROM) { 469 /* Fill addr */ 470 addr.sin_family = AF_INET; 471 addr.sin_addr.s_addr = host2uint32_t_be(rsock.addr.ipv4); 472 addr.sin_port = host2uint16_t_be(rsock.port); 473 474 log_msg(LVL_DEBUG, "addr read receive"); 475 if (!async_data_read_receive(&rcallid, &addr_length)) { 509 /* Fill address */ 510 udp_sock_t *rsock = &socket->recv_fsock; 511 struct sockaddr_in addr; 512 struct sockaddr_in6 addr6; 513 size_t addr_length; 514 515 uint16_t addr_af = inet_addr_sockaddr_in(&rsock->addr, &addr, 516 &addr6); 517 518 switch (addr_af) { 519 case AF_INET: 520 addr.sin_port = host2uint16_t_be(rsock->port); 521 522 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read receive"); 523 if (!async_data_read_receive(&rcallid, &addr_length)) { 524 fibril_mutex_unlock(&socket->recv_buffer_lock); 525 fibril_mutex_unlock(&socket->lock); 526 async_answer_0(callid, EINVAL); 527 return; 528 } 529 530 if (addr_length > sizeof(addr)) 531 addr_length = sizeof(addr); 532 533 addr_size = sizeof(addr); 534 535 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read finalize"); 536 rc = async_data_read_finalize(rcallid, &addr, addr_length); 537 if (rc != EOK) { 538 fibril_mutex_unlock(&socket->recv_buffer_lock); 539 fibril_mutex_unlock(&socket->lock); 540 async_answer_0(callid, EINVAL); 541 return; 542 } 543 544 break; 545 case AF_INET6: 546 addr6.sin6_port = host2uint16_t_be(rsock->port); 547 548 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read receive"); 549 if (!async_data_read_receive(&rcallid, &addr_length)) { 550 fibril_mutex_unlock(&socket->recv_buffer_lock); 551 fibril_mutex_unlock(&socket->lock); 552 async_answer_0(callid, EINVAL); 553 return; 554 } 555 556 if (addr_length > sizeof(addr6)) 557 addr_length = sizeof(addr6); 558 559 addr_size = sizeof(addr6); 560 561 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read finalize"); 562 rc = async_data_read_finalize(rcallid, &addr6, addr_length); 563 if (rc != EOK) { 564 fibril_mutex_unlock(&socket->recv_buffer_lock); 565 fibril_mutex_unlock(&socket->lock); 566 async_answer_0(callid, EINVAL); 567 return; 568 } 569 570 break; 571 default: 476 572 fibril_mutex_unlock(&socket->recv_buffer_lock); 477 573 fibril_mutex_unlock(&socket->lock); … … 479 575 return; 480 576 } 481 482 if (addr_length > sizeof(addr)) 483 addr_length = sizeof(addr); 484 485 log_msg(LVL_DEBUG, "addr read finalize"); 486 rc = async_data_read_finalize(rcallid, &addr, addr_length); 487 if (rc != EOK) { 488 fibril_mutex_unlock(&socket->recv_buffer_lock); 489 fibril_mutex_unlock(&socket->lock); 490 async_answer_0(callid, EINVAL); 491 return; 492 } 493 } 494 495 log_msg(LVL_DEBUG, "data read receive"); 577 } 578 579 log_msg(LOG_DEFAULT, LVL_DEBUG, "data read receive"); 580 581 size_t length; 496 582 if (!async_data_read_receive(&rcallid, &length)) { 497 583 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 500 586 return; 501 587 } 502 588 503 589 if (length > data_len) 504 590 length = data_len; 505 506 log_msg(LVL_DEBUG, "data read finalize"); 591 592 log_msg(LOG_DEFAULT, LVL_DEBUG, "data read finalize"); 593 507 594 rc = async_data_read_finalize(rcallid, socket->recv_buffer, length); 508 509 if ( length < data_len && rc == EOK)595 596 if ((length < data_len) && (rc == EOK)) 510 597 rc = EOVERFLOW; 511 512 log_msg(LVL_DEBUG, "read_data_length <- %zu", length); 598 599 log_msg(LOG_DEFAULT, LVL_DEBUG, "read_data_length <- %zu", length); 600 601 ipc_call_t answer; 602 513 603 IPC_SET_ARG2(answer, 0); 514 604 SOCKET_SET_READ_DATA_LENGTH(answer, length); 515 SOCKET_SET_ADDRESS_LENGTH(answer, sizeof(addr));605 SOCKET_SET_ADDRESS_LENGTH(answer, addr_size); 516 606 async_answer_3(callid, EOK, IPC_GET_ARG1(answer), 517 607 IPC_GET_ARG2(answer), IPC_GET_ARG3(answer)); 518 608 519 609 socket->recv_buffer_used = 0; 520 610 521 611 fibril_condvar_broadcast(&socket->recv_buffer_cv); 522 612 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 526 616 static void udp_sock_close(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 527 617 { 528 int socket_id; 529 socket_core_t *sock_core; 530 udp_sockdata_t *socket; 531 int rc; 532 533 log_msg(LVL_DEBUG, "tcp_sock_close()"); 534 socket_id = SOCKET_GET_SOCKET_ID(call); 535 536 sock_core = socket_cores_find(&client->sockets, socket_id); 618 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close()"); 619 int socket_id = SOCKET_GET_SOCKET_ID(call); 620 621 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - find core"); 622 socket_core_t *sock_core = 623 socket_cores_find(&client->sockets, socket_id); 537 624 if (sock_core == NULL) { 625 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - core not found"); 538 626 async_answer_0(callid, ENOTSOCK); 539 627 return; 540 628 } 541 629 542 socket = (udp_sockdata_t *)sock_core->specific_data; 630 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - spec data"); 631 udp_sockdata_t *socket = 632 (udp_sockdata_t *) sock_core->specific_data; 633 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - lock socket"); 543 634 fibril_mutex_lock(&socket->lock); 544 635 545 rc = socket_destroy(NULL, socket_id, &client->sockets, &gsock, 636 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - lock socket buffer"); 637 fibril_mutex_lock(&socket->recv_buffer_lock); 638 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - set socket->sock_core = NULL"); 639 socket->sock_core = NULL; 640 fibril_mutex_unlock(&socket->recv_buffer_lock); 641 642 udp_uc_reset(socket->assoc); 643 644 int rc = socket_destroy(NULL, socket_id, &client->sockets, &gsock, 546 645 udp_free_sock_data); 547 646 if (rc != EOK) { 647 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - socket_destroy failed"); 548 648 fibril_mutex_unlock(&socket->lock); 549 649 async_answer_0(callid, rc); … … 551 651 } 552 652 653 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - broadcast recv_buffer_cv"); 654 fibril_condvar_broadcast(&socket->recv_buffer_cv); 655 553 656 fibril_mutex_unlock(&socket->lock); 554 657 async_answer_0(callid, EOK); … … 557 660 static void udp_sock_getsockopt(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 558 661 { 559 log_msg(L VL_DEBUG, "udp_sock_getsockopt()");662 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_getsockopt()"); 560 663 async_answer_0(callid, ENOTSUP); 561 664 } … … 563 666 static void udp_sock_setsockopt(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 564 667 { 565 log_msg(LVL_DEBUG, "udp_sock_setsockopt()"); 566 async_answer_0(callid, ENOTSUP); 567 } 668 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_setsockopt)"); 669 log_msg(LOG_DEFAULT, LVL_DEBUG, " - async_data_write_accept"); 670 671 void *data = NULL; 672 size_t data_len; 673 int rc = async_data_write_accept(&data, false, 0, 0, 0, &data_len); 674 if (rc != EOK) { 675 log_msg(LOG_DEFAULT, LVL_DEBUG, " - failed accepting data"); 676 async_answer_0(callid, rc); 677 return; 678 } 679 680 sysarg_t opt_level = SOL_SOCKET; 681 sysarg_t opt_name = SOCKET_GET_OPT_NAME(call); 682 683 if (opt_level != SOL_SOCKET || opt_name != SO_IPLINK || 684 data_len != sizeof(service_id_t)) { 685 log_msg(LOG_DEFAULT, LVL_DEBUG, " - failed opt_level/name/len"); 686 log_msg(LOG_DEFAULT, LVL_DEBUG, " - failed opt_level=%d, " 687 "opt_name=%d, data_len=%zu", (int)opt_level, (int)opt_name, 688 data_len); 689 async_answer_0(callid, EINVAL); 690 return; 691 } 692 693 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_cores_find"); 694 695 socket_core_t *sock_core = socket_cores_find(&client->sockets, 696 SOCKET_GET_SOCKET_ID(call)); 697 if (sock_core == NULL) { 698 log_msg(LOG_DEFAULT, LVL_DEBUG, " - failed getting sock_core"); 699 async_answer_0(callid, ENOENT); 700 return; 701 } 702 703 udp_sockdata_t *socket = 704 (udp_sockdata_t *) sock_core->specific_data; 705 706 service_id_t iplink = *(service_id_t *)data; 707 udp_uc_set_iplink(socket->assoc, iplink); 708 709 log_msg(LOG_DEFAULT, LVL_DEBUG, " - success"); 710 async_answer_0(callid, EOK); 711 } 712 568 713 569 714 static int udp_sock_recv_fibril(void *arg) … … 574 719 size_t rcvd; 575 720 576 log_msg(LVL_DEBUG, "udp_sock_recv_fibril()"); 721 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril()"); 722 723 fibril_mutex_lock(&sock->recv_buffer_lock); 577 724 578 725 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) { 726 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] wait for rcv buffer empty()"); 727 while ((sock->recv_buffer_used != 0) && (sock->sock_core != NULL)) { 582 728 fibril_condvar_wait(&sock->recv_buffer_cv, 583 729 &sock->recv_buffer_lock); 584 730 } 585 731 586 log_msg(LVL_DEBUG, "[] call udp_uc_receive()"); 732 fibril_mutex_unlock(&sock->recv_buffer_lock); 733 734 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] call udp_uc_receive()"); 587 735 urc = udp_uc_receive(sock->assoc, sock->recv_buffer, 588 736 UDP_FRAGMENT_SIZE, &rcvd, &xflags, &sock->recv_fsock); 737 fibril_mutex_lock(&sock->recv_buffer_lock); 589 738 sock->recv_error = urc; 590 739 591 udp_sock_notify_data(sock->sock_core); 740 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] udp_uc_receive -> %d", urc); 741 742 if (sock->sock_core != NULL) 743 udp_sock_notify_data(sock->sock_core); 592 744 593 745 if (urc != UDP_EOK) { 746 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] urc != UDP_EOK, break"); 594 747 fibril_condvar_broadcast(&sock->recv_buffer_cv); 595 748 fibril_mutex_unlock(&sock->recv_buffer_lock); … … 597 750 } 598 751 599 log_msg(L VL_DEBUG, "[] got data - broadcast recv_buffer_cv");752 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] got data - broadcast recv_buffer_cv"); 600 753 601 754 sock->recv_buffer_used = rcvd; 602 fibril_mutex_unlock(&sock->recv_buffer_lock);603 755 fibril_condvar_broadcast(&sock->recv_buffer_cv); 604 756 } 605 757 758 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril() exited loop"); 606 759 udp_uc_destroy(sock->assoc); 760 761 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril() terminated"); 607 762 608 763 return 0; … … 618 773 async_answer_0(iid, EOK); 619 774 775 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_connection: begin"); 776 620 777 client.sess = async_callback_receive(EXCHANGE_SERIALIZE); 621 778 socket_cores_initialize(&client.sockets); 622 779 623 780 while (true) { 624 log_msg(L VL_DEBUG, "udp_sock_connection: wait");781 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_connection: wait"); 625 782 callid = async_get_call(&call); 626 783 if (!IPC_GET_IMETHOD(call)) 627 784 break; 628 785 629 log_msg(L VL_DEBUG, "udp_sock_connection: METHOD=%d",786 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_connection: METHOD=%d", 630 787 (int)IPC_GET_IMETHOD(call)); 631 788 … … 670 827 671 828 /* Clean up */ 672 log_msg(L VL_DEBUG, "udp_sock_connection: Clean up");829 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_connection: Clean up"); 673 830 async_hangup(client.sess); 674 831 socket_cores_release(NULL, &client.sockets, &gsock, udp_free_sock_data);
Note:
See TracChangeset
for help on using the changeset viewer.
