Changeset eb522e8 in mainline for uspace/lib/net/tl/socket_core.c
- Timestamp:
- 2011-06-01T08:43:42Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 8d6c1f1
- Parents:
- 9e2e715 (diff), e51a514 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/net/tl/socket_core.c
r9e2e715 reb522e8 68 68 INT_MAP_IMPLEMENT(socket_cores, socket_core_t); 69 69 70 GENERIC_CHAR_MAP_IMPLEMENT(socket_port_map, socket_core_ ref);70 GENERIC_CHAR_MAP_IMPLEMENT(socket_port_map, socket_core_t *); 71 71 72 72 INT_MAP_IMPLEMENT(socket_ports, socket_port_t); … … 85 85 */ 86 86 static void 87 socket_destroy_core(int packet_phone, socket_core_ refsocket,88 socket_cores_ ref local_sockets, socket_ports_refglobal_sockets,89 void (* socket_release)(socket_core_ refsocket))87 socket_destroy_core(int packet_phone, socket_core_t *socket, 88 socket_cores_t *local_sockets, socket_ports_t *global_sockets, 89 void (* socket_release)(socket_core_t *socket)) 90 90 { 91 91 int packet_id; 92 92 93 / / if bound93 /* If bound */ 94 94 if (socket->port) { 95 / / release the port95 /* Release the port */ 96 96 socket_port_release(global_sockets, socket); 97 97 } 98 98 99 / / release all received packets99 /* Release all received packets */ 100 100 while ((packet_id = dyn_fifo_pop(&socket->received)) >= 0) 101 101 pq_release_remote(packet_phone, packet_id); … … 107 107 socket_release(socket); 108 108 109 socket_cores_exclude(local_sockets, socket->socket_id );109 socket_cores_exclude(local_sockets, socket->socket_id, free); 110 110 } 111 111 … … 121 121 */ 122 122 void 123 socket_cores_release(int packet_phone, socket_cores_ reflocal_sockets,124 socket_ports_ refglobal_sockets,125 void (* socket_release)(socket_core_ refsocket))123 socket_cores_release(int packet_phone, socket_cores_t *local_sockets, 124 socket_ports_t *global_sockets, 125 void (* socket_release)(socket_core_t *socket)) 126 126 { 127 127 int index; … … 156 156 * @param[in] key The socket key identifier. 157 157 * @param[in] key_length The socket key length. 158 * @return sEOK on success.159 * @return sENOMEM if there is not enough memory left.158 * @return EOK on success. 159 * @return ENOMEM if there is not enough memory left. 160 160 */ 161 161 static int 162 socket_port_add_core(socket_port_ ref socket_port, socket_core_refsocket,163 const char*key, size_t key_length)164 { 165 socket_core_ ref*socket_ref;162 socket_port_add_core(socket_port_t *socket_port, socket_core_t *socket, 163 const uint8_t *key, size_t key_length) 164 { 165 socket_core_t **socket_ref; 166 166 int rc; 167 167 168 / / create a wrapper168 /* Create a wrapper */ 169 169 socket_ref = malloc(sizeof(*socket_ref)); 170 170 if (!socket_ref) … … 172 172 173 173 *socket_ref = socket; 174 / / add the wrapper174 /* Add the wrapper */ 175 175 rc = socket_port_map_add(&socket_port->map, key, key_length, 176 176 socket_ref); … … 194 194 * @param[in] socket The socket to be added. 195 195 * @param[in] port The port number to be bound to. 196 * @return sEOK on success.197 * @return sENOMEM if there is not enough memory left.198 * @return sOther error codes as defined for the196 * @return EOK on success. 197 * @return ENOMEM if there is not enough memory left. 198 * @return Other error codes as defined for the 199 199 * socket_ports_add() function. 200 200 */ 201 201 static int 202 socket_bind_insert(socket_ports_ ref global_sockets, socket_core_refsocket,202 socket_bind_insert(socket_ports_t *global_sockets, socket_core_t *socket, 203 203 int port) 204 204 { 205 socket_port_ refsocket_port;205 socket_port_t *socket_port; 206 206 int rc; 207 207 208 / / create a wrapper208 /* Create a wrapper */ 209 209 socket_port = malloc(sizeof(*socket_port)); 210 210 if (!socket_port) … … 216 216 goto fail; 217 217 218 rc = socket_port_add_core(socket_port, socket, SOCKET_MAP_KEY_LISTENING,219 0);218 rc = socket_port_add_core(socket_port, socket, 219 (const uint8_t *) SOCKET_MAP_KEY_LISTENING, 0); 220 220 if (rc != EOK) 221 221 goto fail; 222 222 223 / / register the incomming port223 /* Register the incoming port */ 224 224 rc = socket_ports_add(global_sockets, port, socket_port); 225 225 if (rc < 0) … … 230 230 231 231 fail: 232 socket_port_map_destroy(&socket_port->map );232 socket_port_map_destroy(&socket_port->map, free); 233 233 free(socket_port); 234 234 return rc; … … 248 248 * @param[in] free_ports_end The maximum free port. 249 249 * @param[in] last_used_port The last used free port. 250 * @return sEOK on success.251 * @return sENOTSOCK if the socket was not found.252 * @return sEAFNOSUPPORT if the address family is not supported.253 * @return sEADDRINUSE if the port is already in use.254 * @return sOther error codes as defined for the250 * @return EOK on success. 251 * @return ENOTSOCK if the socket was not found. 252 * @return EAFNOSUPPORT if the address family is not supported. 253 * @return EADDRINUSE if the port is already in use. 254 * @return Other error codes as defined for the 255 255 * socket_bind_free_port() function. 256 * @return sOther error codes as defined for the256 * @return Other error codes as defined for the 257 257 * socket_bind_insert() function. 258 258 */ 259 259 int 260 socket_bind(socket_cores_ ref local_sockets, socket_ports_refglobal_sockets,260 socket_bind(socket_cores_t *local_sockets, socket_ports_t *global_sockets, 261 261 int socket_id, void *addr, size_t addrlen, int free_ports_start, 262 262 int free_ports_end, int last_used_port) 263 263 { 264 socket_core_ refsocket;265 socket_port_ refsocket_port;264 socket_core_t *socket; 265 socket_port_t *socket_port; 266 266 struct sockaddr *address; 267 267 struct sockaddr_in *address_in; … … 277 277 278 278 address_in = (struct sockaddr_in *) addr; 279 / / find the socket279 /* Find the socket */ 280 280 socket = socket_cores_find(local_sockets, socket_id); 281 281 if (!socket) 282 282 return ENOTSOCK; 283 283 284 / / bind a free port?284 /* Bind a free port? */ 285 285 if (address_in->sin_port <= 0) 286 286 return socket_bind_free_port(global_sockets, socket, 287 287 free_ports_start, free_ports_end, last_used_port); 288 288 289 / / try to find the port289 /* Try to find the port */ 290 290 socket_port = socket_ports_find(global_sockets, 291 291 ntohs(address_in->sin_port)); 292 292 if (socket_port) { 293 / / already used293 /* Already used */ 294 294 return EADDRINUSE; 295 295 } 296 296 297 / / if bound297 /* If bound */ 298 298 if (socket->port) { 299 / / release the port299 /* Release the port */ 300 300 socket_port_release(global_sockets, socket); 301 301 } … … 322 322 * @param[in] free_ports_end The maximum free port. 323 323 * @param[in] last_used_port The last used free port. 324 * @return sEOK on success.325 * @return sENOTCONN if no free port was found.326 * @return sOther error codes as defined for the324 * @return EOK on success. 325 * @return ENOTCONN if no free port was found. 326 * @return Other error codes as defined for the 327 327 * socket_bind_insert() function. 328 328 */ 329 329 int 330 socket_bind_free_port(socket_ports_ ref global_sockets, socket_core_refsocket,330 socket_bind_free_port(socket_ports_t *global_sockets, socket_core_t *socket, 331 331 int free_ports_start, int free_ports_end, int last_used_port) 332 332 { 333 333 int index; 334 334 335 / / from the last used one335 /* From the last used one */ 336 336 index = last_used_port; 337 337 … … 339 339 ++index; 340 340 341 / / til the range end341 /* Till the range end */ 342 342 if (index >= free_ports_end) { 343 / / start from the range beginning343 /* Start from the range beginning */ 344 344 index = free_ports_start - 1; 345 345 do { 346 346 ++index; 347 / / til the last used one347 /* Till the last used one */ 348 348 if (index >= last_used_port) { 349 / / none found349 /* None found */ 350 350 return ENOTCONN; 351 351 } 352 352 } while (socket_ports_find(global_sockets, index)); 353 353 354 / / found, break immediately354 /* Found, break immediately */ 355 355 break; 356 356 } … … 367 367 * requested. A negative identifier is requested if set to 368 368 * false. 369 * @return sThe new socket identifier.370 * @return sELIMIT if there is no socket identifier available.371 */ 372 static int socket_generate_new_id(socket_cores_ reflocal_sockets, int positive)369 * @return The new socket identifier. 370 * @return ELIMIT if there is no socket identifier available. 371 */ 372 static int socket_generate_new_id(socket_cores_t *local_sockets, int positive) 373 373 { 374 374 int socket_id; … … 376 376 377 377 count = 0; 378 // socket_id = socket_globals.last_id; 378 #if 0 379 socket_id = socket_globals.last_id; 380 #endif 379 381 do { 380 382 if (count < SOCKET_ID_TRIES) { … … 384 386 socket_id = 1; 385 387 ++count; 386 / / only this branch for last_id388 /* Only this branch for last_id */ 387 389 } else { 388 390 if (socket_id < INT_MAX) { 389 391 ++ socket_id; 390 /* } else if(socket_globals.last_id) { 391 * socket_globals.last_id = 0; 392 * socket_id = 1; 393 */ } else { 392 #if 0 393 } else if(socket_globals.last_id) { 394 socket_globals.last_id = 0; 395 socket_id = 1; 396 #endif 397 } else { 394 398 return ELIMIT; 395 399 } … … 410 414 * chosen if set to zero or negative. A negative identifier 411 415 * is chosen if set to negative. 412 * @return sEOK on success.413 * @return sEINVAL if the socket_id parameter is NULL.414 * @return sENOMEM if there is not enough memory left.416 * @return EOK on success. 417 * @return EINVAL if the socket_id parameter is NULL. 418 * @return ENOMEM if there is not enough memory left. 415 419 */ 416 420 int 417 socket_create(socket_cores_ reflocal_sockets, int app_phone,421 socket_create(socket_cores_t *local_sockets, int app_phone, 418 422 void *specific_data, int *socket_id) 419 423 { 420 socket_core_ refsocket;424 socket_core_t *socket; 421 425 int positive; 422 426 int rc; … … 425 429 return EINVAL; 426 430 427 / / store the socket431 /* Store the socket */ 428 432 if (*socket_id <= 0) { 429 433 positive = (*socket_id == 0); … … 437 441 } 438 442 439 socket = (socket_core_ ref) malloc(sizeof(*socket));443 socket = (socket_core_t *) malloc(sizeof(*socket)); 440 444 if (!socket) 441 445 return ENOMEM; 442 446 443 / / initialize447 /* Initialize */ 444 448 socket->phone = app_phone; 445 449 socket->port = -1; … … 482 486 * @param[in,out] global_sockets The global sockets to be updated. 483 487 * @param[in] socket_release The client release callback function. 484 * @return sEOK on success.485 * @return sENOTSOCK if the socket is not found.488 * @return EOK on success. 489 * @return ENOTSOCK if the socket is not found. 486 490 */ 487 491 int 488 socket_destroy(int packet_phone, int socket_id, socket_cores_ reflocal_sockets,489 socket_ports_ refglobal_sockets,490 void (*socket_release)(socket_core_ refsocket))491 { 492 socket_core_ refsocket;492 socket_destroy(int packet_phone, int socket_id, socket_cores_t *local_sockets, 493 socket_ports_t *global_sockets, 494 void (*socket_release)(socket_core_t *socket)) 495 { 496 socket_core_t *socket; 493 497 int accepted_id; 494 498 495 / / find the socket499 /* Find the socket */ 496 500 socket = socket_cores_find(local_sockets, socket_id); 497 501 if (!socket) 498 502 return ENOTSOCK; 499 503 500 / / destroy all accepted sockets504 /* Destroy all accepted sockets */ 501 505 while ((accepted_id = dyn_fifo_pop(&socket->accepted)) >= 0) 502 506 socket_destroy(packet_phone, accepted_id, local_sockets, … … 516 520 * @param[in] packet The packet to be transfered. 517 521 * @param[out] length The total data length. 518 * @return sEOK on success.519 * @return sEBADMEM if the length parameter is NULL.520 * @return sENOMEM if there is not enough memory left.521 * @return sOther error codes as defined for the data_reply()522 * @return EOK on success. 523 * @return EBADMEM if the length parameter is NULL. 524 * @return ENOMEM if there is not enough memory left. 525 * @return Other error codes as defined for the data_reply() 522 526 * function. 523 527 */ 524 int socket_reply_packets(packet_t packet, size_t *length)525 { 526 packet_t next_packet;528 int socket_reply_packets(packet_t *packet, size_t *length) 529 { 530 packet_t *next_packet; 527 531 size_t fragments; 528 532 size_t *lengths; … … 535 539 next_packet = pq_next(packet); 536 540 if (!next_packet) { 537 / / write all if only one fragment541 /* Write all if only one fragment */ 538 542 rc = data_reply(packet_get_data(packet), 539 543 packet_get_data_length(packet)); 540 544 if (rc != EOK) 541 545 return rc; 542 / / store the total length546 /* Store the total length */ 543 547 *length = packet_get_data_length(packet); 544 548 } else { 545 / / count the packet fragments549 /* Count the packet fragments */ 546 550 fragments = 1; 547 551 next_packet = pq_next(packet); … … 549 553 ++fragments; 550 554 551 / / compute and store the fragment lengths555 /* Compute and store the fragment lengths */ 552 556 lengths = (size_t *) malloc(sizeof(size_t) * fragments + 553 557 sizeof(size_t)); … … 565 569 } 566 570 567 / / write the fragment lengths571 /* Write the fragment lengths */ 568 572 rc = data_reply(lengths, sizeof(int) * (fragments + 1)); 569 573 if (rc != EOK) { … … 573 577 next_packet = packet; 574 578 575 / / write the fragments579 /* Write the fragments */ 576 580 for (index = 0; index < fragments; ++index) { 577 581 rc = data_reply(packet_get_data(next_packet), … … 584 588 } 585 589 586 / / store the total length590 /* Store the total length */ 587 591 *length = lengths[fragments]; 588 592 free(lengths); … … 598 602 * @param[in] key The socket key identifier. 599 603 * @param[in] key_length The socket key length. 600 * @return sThe found socket.601 * @return sNULL if no socket was found.602 */ 603 socket_core_ ref604 socket_port_find(socket_ports_ ref global_sockets, int port, const char*key,604 * @return The found socket. 605 * @return NULL if no socket was found. 606 */ 607 socket_core_t * 608 socket_port_find(socket_ports_t *global_sockets, int port, const uint8_t *key, 605 609 size_t key_length) 606 610 { 607 socket_port_ refsocket_port;608 socket_core_ ref*socket_ref;611 socket_port_t *socket_port; 612 socket_core_t **socket_ref; 609 613 610 614 socket_port = socket_ports_find(global_sockets, port); … … 628 632 */ 629 633 void 630 socket_port_release(socket_ports_ ref global_sockets, socket_core_refsocket)631 { 632 socket_port_ refsocket_port;633 socket_core_ ref*socket_ref;634 socket_port_release(socket_ports_t *global_sockets, socket_core_t *socket) 635 { 636 socket_port_t *socket_port; 637 socket_core_t **socket_ref; 634 638 635 639 if (!socket->port) 636 640 return; 637 641 638 / / find ports642 /* Find ports */ 639 643 socket_port = socket_ports_find(global_sockets, socket->port); 640 644 if (socket_port) { 641 / / find the socket645 /* Find the socket */ 642 646 socket_ref = socket_port_map_find(&socket_port->map, 643 647 socket->key, socket->key_length); … … 646 650 --socket_port->count; 647 651 648 / / release if empty652 /* Release if empty */ 649 653 if (socket_port->count <= 0) { 650 / / destroy the map651 socket_port_map_destroy(&socket_port->map );652 / / release the port654 /* Destroy the map */ 655 socket_port_map_destroy(&socket_port->map, free); 656 /* Release the port */ 653 657 socket_ports_exclude(global_sockets, 654 socket->port );658 socket->port, free); 655 659 } else { 656 / / remove660 /* Remove */ 657 661 socket_port_map_exclude(&socket_port->map, 658 socket->key, socket->key_length );662 socket->key, socket->key_length, free); 659 663 } 660 664 } … … 673 677 * @param[in] key The socket key identifier. 674 678 * @param[in] key_length The socket key length. 675 * @return sEOK on success.676 * @return sENOENT if the port is not already used.677 * @return sOther error codes as defined for the679 * @return EOK on success. 680 * @return ENOENT if the port is not already used. 681 * @return Other error codes as defined for the 678 682 * socket_port_add_core() function. 679 683 */ 680 684 int 681 socket_port_add(socket_ports_ refglobal_sockets, int port,682 socket_core_ ref socket, const char*key, size_t key_length)683 { 684 socket_port_ refsocket_port;685 socket_port_add(socket_ports_t *global_sockets, int port, 686 socket_core_t *socket, const uint8_t *key, size_t key_length) 687 { 688 socket_port_t *socket_port; 685 689 int rc; 686 690 687 / / find ports691 /* Find ports */ 688 692 socket_port = socket_ports_find(global_sockets, port); 689 693 if (!socket_port) 690 694 return ENOENT; 691 695 692 / / add the socket696 /* Add the socket */ 693 697 rc = socket_port_add_core(socket_port, socket, key, key_length); 694 698 if (rc != EOK)
Note:
See TracChangeset
for help on using the changeset viewer.