Changes in uspace/srv/net/udp/sock.c [695b6ff:db81577] in mainline
- File:
-
- 1 edited
-
uspace/srv/net/udp/sock.c (modified) (26 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/udp/sock.c
r695b6ff rdb81577 1 1 /* 2 2 * Copyright (c) 2008 Lukas Mejdrech 3 * Copyright (c) 201 3Jiri Svoboda3 * Copyright (c) 2012 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 OG_DEFAULT, LVL_DEBUG, "udp_sock_notify_data(%d)", sock_core->socket_id);90 log_msg(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 OG_DEFAULT, LVL_DEBUG, "udp_sock_socket()");105 log_msg(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 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); 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); 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))) {174 async_answer_0(callid, EINVAL);175 177 goto out; 176 178 } 177 178 struct sockaddr_in *addr = (struct sockaddr_in *) addr6; 179 180 log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_bind"); 181 179 180 log_msg(LVL_DEBUG, " - call socket_bind"); 182 181 rc = socket_bind(&client->sockets, &gsock, SOCKET_GET_SOCKET_ID(call), 183 addr 6, addr_len, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END,182 addr, addr_size, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END, 184 183 last_used_port); 185 184 if (rc != EOK) { … … 187 186 goto out; 188 187 } 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)); 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)); 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 237 log_msg(L OG_DEFAULT, LVL_DEBUG, " - success");223 224 log_msg(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 245 231 static void udp_sock_listen(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 246 232 { 247 log_msg(L OG_DEFAULT, LVL_DEBUG, "udp_sock_listen()");233 log_msg(LVL_DEBUG, "udp_sock_listen()"); 248 234 async_answer_0(callid, ENOTSUP); 249 235 } … … 251 237 static void udp_sock_connect(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 252 238 { 253 log_msg(L OG_DEFAULT, LVL_DEBUG, "udp_sock_connect()");239 log_msg(LVL_DEBUG, "udp_sock_connect()"); 254 240 async_answer_0(callid, ENOTSUP); 255 241 } … … 257 243 static void udp_sock_accept(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 258 244 { 259 log_msg(L OG_DEFAULT, LVL_DEBUG, "udp_sock_accept()");245 log_msg(LVL_DEBUG, "udp_sock_accept()"); 260 246 async_answer_0(callid, ENOTSUP); 261 247 } … … 263 249 static void udp_sock_sendto(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 264 250 { 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; 251 int socket_id; 252 int fragments; 253 int index; 274 254 struct sockaddr_in *addr; 275 udp_sock_t fsocket; 276 udp_sock_t *fsocket_ptr; 277 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 278 270 if (IPC_GET_IMETHOD(call) == NET_SOCKET_SENDTO) { 279 size_t addr_len; 280 int rc = async_data_write_accept((void **) &addr6, false, 281 0, 0, 0, &addr_len); 271 rc = async_data_write_accept((void **) &addr, false, 272 0, 0, 0, &addr_size); 282 273 if (rc != EOK) { 283 274 async_answer_0(callid, rc); 284 275 goto out; 285 276 } 286 287 if ((addr_len != sizeof(struct sockaddr_in)) && 288 (addr_len != sizeof(struct sockaddr_in6))) { 277 278 if (addr_size != sizeof(struct sockaddr_in)) { 289 279 async_answer_0(callid, EINVAL); 290 280 goto out; 291 281 } 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 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); 314 292 SOCKET_GET_FLAGS(call); 315 316 socket_core_t *sock_core = 317 socket_cores_find(&client->sockets, socket_id); 293 294 sock_core = socket_cores_find(&client->sockets, socket_id); 318 295 if (sock_core == NULL) { 319 296 async_answer_0(callid, ENOTSOCK); 320 297 goto out; 321 298 } 322 323 udp_sockdata_t *socket = 324 (udp_sockdata_t *) sock_core->specific_data; 325 326 if (sock_core->port <= 0) { 299 300 if (sock_core->port == 0) { 327 301 /* Implicitly bind socket to port */ 328 int rc = socket_bind_free_port(&gsock, sock_core, 329 UDP_FREE_PORTS_START, UDP_FREE_PORTS_END, last_used_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); 330 305 if (rc != EOK) { 331 306 async_answer_0(callid, rc); 332 307 goto out; 333 308 } 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 309 } 310 311 socket = (udp_sockdata_t *)sock_core->specific_data; 349 312 fibril_mutex_lock(&socket->lock); 350 351 if (inet_addr_is_any(&socket->assoc->ident.local.addr) && 352 socket->assoc->ident.iplink == 0) { 313 314 if (socket->assoc->ident.local.addr.ipv4 == UDP_IPV4_ANY) { 353 315 /* Determine local IP address */ 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); 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); 361 322 if (rc != EOK) { 362 323 fibril_mutex_unlock(&socket->lock); 363 324 async_answer_0(callid, rc); 364 log_msg(L OG_DEFAULT, LVL_DEBUG, "udp_sock_sendto: Failed to "325 log_msg(LVL_DEBUG, "udp_sock_sendto: Failed to " 365 326 "determine local address."); 366 goto out; 367 } 368 369 socket->assoc->ident.local.addr = loc_addr; 370 } 371 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 372 336 assert(socket->assoc != NULL); 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 337 338 for (index = 0; index < fragments; index++) { 379 339 if (!async_data_write_receive(&wcallid, &length)) { 380 340 fibril_mutex_unlock(&socket->lock); … … 382 342 goto out; 383 343 } 384 344 385 345 if (length > UDP_FRAGMENT_SIZE) 386 346 length = UDP_FRAGMENT_SIZE; 387 388 intrc = async_data_write_finalize(wcallid, buffer, length);347 348 rc = async_data_write_finalize(wcallid, buffer, length); 389 349 if (rc != EOK) { 390 350 fibril_mutex_unlock(&socket->lock); … … 392 352 goto out; 393 353 } 394 395 udp_error_t urc = 396 udp_uc_send(socket->assoc, fsocket_ptr, buffer, length, 0); 397 354 355 urc = udp_uc_send(socket->assoc, fsockp, buffer, length, 0); 356 398 357 switch (urc) { 399 358 case UDP_EOK: 400 359 rc = EOK; 401 360 break; 402 case UDP_ENORES:403 rc = ENO MEM;404 break; 405 case UDP_EUNSPEC:406 rc = E INVAL;407 break; 408 case UDP_ENOROUTE:409 rc = E IO;410 break; 361 /* case TCP_ENOTEXIST: 362 rc = ENOTCONN; 363 break; 364 case TCP_ECLOSING: 365 rc = ENOTCONN; 366 break; 367 case TCP_ERESET: 368 rc = ECONNABORTED; 369 break;*/ 411 370 default: 412 371 assert(false); 413 372 } 414 373 415 374 if (rc != EOK) { 416 375 fibril_mutex_unlock(&socket->lock); … … 419 378 } 420 379 } 421 422 ipc_call_t answer;423 380 424 381 IPC_SET_ARG1(answer, 0); … … 429 386 430 387 out: 431 if (addr6 != NULL) 432 free(addr6); 433 434 free(buffer); 388 if (addr != NULL) 389 free(addr); 435 390 } 436 391 437 392 static void udp_sock_recvfrom(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 438 393 { 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); 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); 445 413 if (sock_core == NULL) { 446 414 async_answer_0(callid, ENOTSOCK); 447 415 return; 448 416 } 449 450 udp_sockdata_t *socket = 451 (udp_sockdata_t *) sock_core->specific_data; 452 417 418 socket = (udp_sockdata_t *)sock_core->specific_data; 453 419 fibril_mutex_lock(&socket->lock); 454 420 455 421 if (socket->assoc == NULL) { 456 422 fibril_mutex_unlock(&socket->lock); … … 458 424 return; 459 425 } 460 461 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recvfrom(): lock recv_buffer lock"); 462 426 427 (void)flags; 428 429 log_msg(LVL_DEBUG, "udp_sock_recvfrom(): lock recv_buffer lock"); 463 430 fibril_mutex_lock(&socket->recv_buffer_lock); 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"); 431 while (socket->recv_buffer_used == 0 && socket->recv_error == UDP_EOK) { 432 log_msg(LVL_DEBUG, "udp_sock_recvfrom(): wait for cv"); 468 433 fibril_condvar_wait(&socket->recv_buffer_cv, 469 434 &socket->recv_buffer_lock); 470 435 } 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 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 481 445 switch (urc) { 482 446 case UDP_EOK: … … 493 457 assert(false); 494 458 } 495 496 log_msg(LOG_DEFAULT, LVL_DEBUG, "**** udp_uc_receive -> %d", rc); 497 459 460 log_msg(LVL_DEBUG, "**** udp_uc_receive -> %d", rc); 498 461 if (rc != EOK) { 499 462 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 502 465 return; 503 466 } 504 505 ipc_callid_t rcallid; 506 size_t addr_size = 0; 507 467 508 468 if (IPC_GET_IMETHOD(call) == NET_SOCKET_RECVFROM) { 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: 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)) { 572 476 fibril_mutex_unlock(&socket->recv_buffer_lock); 573 477 fibril_mutex_unlock(&socket->lock); … … 575 479 return; 576 480 } 577 } 578 579 log_msg(LOG_DEFAULT, LVL_DEBUG, "data read receive"); 580 581 size_t length; 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"); 582 496 if (!async_data_read_receive(&rcallid, &length)) { 583 497 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 586 500 return; 587 501 } 588 502 589 503 if (length > data_len) 590 504 length = data_len; 591 592 log_msg(LOG_DEFAULT, LVL_DEBUG, "data read finalize"); 593 505 506 log_msg(LVL_DEBUG, "data read finalize"); 594 507 rc = async_data_read_finalize(rcallid, socket->recv_buffer, length); 595 596 if ( (length < data_len) && (rc == EOK))508 509 if (length < data_len && rc == EOK) 597 510 rc = EOVERFLOW; 598 599 log_msg(LOG_DEFAULT, LVL_DEBUG, "read_data_length <- %zu", length); 600 601 ipc_call_t answer; 602 511 512 log_msg(LVL_DEBUG, "read_data_length <- %zu", length); 603 513 IPC_SET_ARG2(answer, 0); 604 514 SOCKET_SET_READ_DATA_LENGTH(answer, length); 605 SOCKET_SET_ADDRESS_LENGTH(answer, addr_size);515 SOCKET_SET_ADDRESS_LENGTH(answer, sizeof(addr)); 606 516 async_answer_3(callid, EOK, IPC_GET_ARG1(answer), 607 517 IPC_GET_ARG2(answer), IPC_GET_ARG3(answer)); 608 518 609 519 socket->recv_buffer_used = 0; 610 520 611 521 fibril_condvar_broadcast(&socket->recv_buffer_cv); 612 522 fibril_mutex_unlock(&socket->recv_buffer_lock); … … 616 526 static void udp_sock_close(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 617 527 { 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); 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); 624 537 if (sock_core == NULL) { 625 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_close() - core not found");626 538 async_answer_0(callid, ENOTSOCK); 627 539 return; 628 540 } 629 541 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"); 542 socket = (udp_sockdata_t *)sock_core->specific_data; 634 543 fibril_mutex_lock(&socket->lock); 635 544 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, 545 rc = socket_destroy(NULL, socket_id, &client->sockets, &gsock, 645 546 udp_free_sock_data); 646 547 if (rc != EOK) { 647 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - socket_destroy failed");648 548 fibril_mutex_unlock(&socket->lock); 649 549 async_answer_0(callid, rc); … … 651 551 } 652 552 653 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_close - broadcast recv_buffer_cv");654 fibril_condvar_broadcast(&socket->recv_buffer_cv);655 656 553 fibril_mutex_unlock(&socket->lock); 657 554 async_answer_0(callid, EOK); … … 660 557 static void udp_sock_getsockopt(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 661 558 { 662 log_msg(L OG_DEFAULT, LVL_DEBUG, "udp_sock_getsockopt()");559 log_msg(LVL_DEBUG, "udp_sock_getsockopt()"); 663 560 async_answer_0(callid, ENOTSUP); 664 561 } … … 666 563 static void udp_sock_setsockopt(udp_client_t *client, ipc_callid_t callid, ipc_call_t call) 667 564 { 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 565 log_msg(LVL_DEBUG, "udp_sock_setsockopt()"); 566 async_answer_0(callid, ENOTSUP); 567 } 713 568 714 569 static int udp_sock_recv_fibril(void *arg) … … 719 574 size_t rcvd; 720 575 721 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril()"); 722 723 fibril_mutex_lock(&sock->recv_buffer_lock); 576 log_msg(LVL_DEBUG, "udp_sock_recv_fibril()"); 724 577 725 578 while (true) { 726 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] wait for rcv buffer empty()"); 727 while ((sock->recv_buffer_used != 0) && (sock->sock_core != NULL)) { 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) { 728 582 fibril_condvar_wait(&sock->recv_buffer_cv, 729 583 &sock->recv_buffer_lock); 730 584 } 731 585 732 fibril_mutex_unlock(&sock->recv_buffer_lock); 733 734 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] call udp_uc_receive()"); 586 log_msg(LVL_DEBUG, "[] call udp_uc_receive()"); 735 587 urc = udp_uc_receive(sock->assoc, sock->recv_buffer, 736 588 UDP_FRAGMENT_SIZE, &rcvd, &xflags, &sock->recv_fsock); 737 fibril_mutex_lock(&sock->recv_buffer_lock);738 589 sock->recv_error = urc; 739 590 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); 591 udp_sock_notify_data(sock->sock_core); 744 592 745 593 if (urc != UDP_EOK) { 746 log_msg(LOG_DEFAULT, LVL_DEBUG, "[] urc != UDP_EOK, break");747 594 fibril_condvar_broadcast(&sock->recv_buffer_cv); 748 595 fibril_mutex_unlock(&sock->recv_buffer_lock); … … 750 597 } 751 598 752 log_msg(L OG_DEFAULT, LVL_DEBUG, "[] got data - broadcast recv_buffer_cv");599 log_msg(LVL_DEBUG, "[] got data - broadcast recv_buffer_cv"); 753 600 754 601 sock->recv_buffer_used = rcvd; 602 fibril_mutex_unlock(&sock->recv_buffer_lock); 755 603 fibril_condvar_broadcast(&sock->recv_buffer_cv); 756 604 } 757 605 758 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril() exited loop");759 606 udp_uc_destroy(sock->assoc); 760 761 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recv_fibril() terminated");762 607 763 608 return 0; … … 773 618 async_answer_0(iid, EOK); 774 619 775 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_connection: begin");776 777 620 client.sess = async_callback_receive(EXCHANGE_SERIALIZE); 778 621 socket_cores_initialize(&client.sockets); 779 622 780 623 while (true) { 781 log_msg(L OG_DEFAULT, LVL_DEBUG, "udp_sock_connection: wait");624 log_msg(LVL_DEBUG, "udp_sock_connection: wait"); 782 625 callid = async_get_call(&call); 783 626 if (!IPC_GET_IMETHOD(call)) 784 627 break; 785 628 786 log_msg(L OG_DEFAULT, LVL_DEBUG, "udp_sock_connection: METHOD=%d",629 log_msg(LVL_DEBUG, "udp_sock_connection: METHOD=%d", 787 630 (int)IPC_GET_IMETHOD(call)); 788 631 … … 827 670 828 671 /* Clean up */ 829 log_msg(L OG_DEFAULT, LVL_DEBUG, "udp_sock_connection: Clean up");672 log_msg(LVL_DEBUG, "udp_sock_connection: Clean up"); 830 673 async_hangup(client.sess); 831 674 socket_cores_release(NULL, &client.sockets, &gsock, udp_free_sock_data);
Note:
See TracChangeset
for help on using the changeset viewer.
