Changes in uspace/srv/net/tl/udp/udp.c [afe1d1e:6b82009] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/tl/udp/udp.c
rafe1d1e r6b82009 99 99 static int udp_release_and_return(packet_t *packet, int result) 100 100 { 101 pq_release_remote(udp_globals.net_ phone, packet_get_id(packet));101 pq_release_remote(udp_globals.net_sess, packet_get_id(packet)); 102 102 return result; 103 103 } … … 192 192 ntohs(header->destination_port), (uint8_t *) SOCKET_MAP_KEY_LISTENING, 0); 193 193 if (!socket) { 194 if (tl_prepare_icmp_packet(udp_globals.net_ phone,195 udp_globals.icmp_ phone, packet, error) == EOK) {196 icmp_destination_unreachable_msg(udp_globals.icmp_ phone,194 if (tl_prepare_icmp_packet(udp_globals.net_sess, 195 udp_globals.icmp_sess, packet, error) == EOK) { 196 icmp_destination_unreachable_msg(udp_globals.icmp_sess, 197 197 ICMP_PORT_UNREACH, 0, packet); 198 198 } … … 251 251 while (tmp_packet) { 252 252 next_packet = pq_detach(tmp_packet); 253 pq_release_remote(udp_globals.net_ phone,253 pq_release_remote(udp_globals.net_sess, 254 254 packet_get_id(tmp_packet)); 255 255 tmp_packet = next_packet; … … 274 274 if (flip_checksum(compact_checksum(checksum)) != 275 275 IP_CHECKSUM_ZERO) { 276 if (tl_prepare_icmp_packet(udp_globals.net_ phone,277 udp_globals.icmp_ phone, packet, error) == EOK) {276 if (tl_prepare_icmp_packet(udp_globals.net_sess, 277 udp_globals.icmp_sess, packet, error) == EOK) { 278 278 /* Checksum error ICMP */ 279 279 icmp_parameter_problem_msg( 280 udp_globals.icmp_ phone, ICMP_PARAM_POINTER,280 udp_globals.icmp_sess, ICMP_PARAM_POINTER, 281 281 ((size_t) ((void *) &header->checksum)) - 282 282 ((size_t) ((void *) header)), packet); … … 292 292 return udp_release_and_return(packet, rc); 293 293 294 rc = tl_get_ip_packet_dimension(udp_globals.ip_ phone,294 rc = tl_get_ip_packet_dimension(udp_globals.ip_sess, 295 295 &udp_globals.dimensions, device_id, &packet_dimension); 296 296 if (rc != EOK) … … 299 299 /* Notify the destination socket */ 300 300 fibril_rwlock_write_unlock(&udp_globals.lock); 301 async_msg_5(socket->phone, NET_SOCKET_RECEIVED, 302 (sysarg_t) socket->socket_id, packet_dimension->content, 0, 0, 303 (sysarg_t) fragments); 301 302 async_exch_t *exch = async_exchange_begin(socket->sess); 303 async_msg_5(exch, NET_SOCKET_RECEIVED, (sysarg_t) socket->socket_id, 304 packet_dimension->content, 0, 0, (sysarg_t) fragments); 305 async_exchange_end(exch); 304 306 305 307 return EOK; … … 337 339 * @param[in] iid Message identifier. 338 340 * @param[in,out] icall Message parameters. 339 * 340 */ 341 static void udp_receiver(ipc_callid_t iid, ipc_call_t *icall) 341 * @param[in] arg Local argument. 342 * 343 */ 344 static void udp_receiver(ipc_callid_t iid, ipc_call_t *icall, void *arg) 342 345 { 343 346 packet_t *packet; … … 347 350 switch (IPC_GET_IMETHOD(*icall)) { 348 351 case NET_TL_RECEIVED: 349 rc = packet_translate_remote(udp_globals.net_ phone, &packet,352 rc = packet_translate_remote(udp_globals.net_sess, &packet, 350 353 IPC_GET_PACKET(*icall)); 351 354 if (rc == EOK) … … 365 368 /** Initialize the UDP module. 366 369 * 367 * @param[in] net_phone Network module phone.370 * @param[in] sess Network module session. 368 371 * 369 372 * @return EOK on success. … … 371 374 * 372 375 */ 373 int tl_initialize( int net_phone)376 int tl_initialize(async_sess_t *sess) 374 377 { 375 378 measured_string_t names[] = { … … 390 393 fibril_rwlock_write_lock(&udp_globals.lock); 391 394 392 udp_globals.net_phone = net_phone; 393 394 udp_globals.icmp_phone = icmp_connect_module(ICMP_CONNECT_TIMEOUT); 395 396 udp_globals.ip_phone = ip_bind_service(SERVICE_IP, IPPROTO_UDP, 397 SERVICE_UDP, udp_receiver); 398 if (udp_globals.ip_phone < 0) { 399 fibril_rwlock_write_unlock(&udp_globals.lock); 400 return udp_globals.ip_phone; 395 udp_globals.net_sess = sess; 396 udp_globals.icmp_sess = icmp_connect_module(); 397 398 udp_globals.ip_sess = ip_bind_service(SERVICE_IP, IPPROTO_UDP, 399 SERVICE_UDP, udp_receiver); 400 if (udp_globals.ip_sess == NULL) { 401 fibril_rwlock_write_unlock(&udp_globals.lock); 402 return ENOENT; 401 403 } 402 404 403 405 /* Read default packet dimensions */ 404 int rc = ip_packet_size_req(udp_globals.ip_ phone, -1,406 int rc = ip_packet_size_req(udp_globals.ip_sess, -1, 405 407 &udp_globals.packet_dimension); 406 408 if (rc != EOK) { … … 417 419 rc = packet_dimensions_initialize(&udp_globals.dimensions); 418 420 if (rc != EOK) { 419 socket_ports_destroy(&udp_globals.sockets );421 socket_ports_destroy(&udp_globals.sockets, free); 420 422 fibril_rwlock_write_unlock(&udp_globals.lock); 421 423 return rc; … … 431 433 /* Get configuration */ 432 434 configuration = &names[0]; 433 rc = net_get_conf_req(udp_globals.net_ phone, &configuration, count,435 rc = net_get_conf_req(udp_globals.net_sess, &configuration, count, 434 436 &data); 435 437 if (rc != EOK) { 436 socket_ports_destroy(&udp_globals.sockets );438 socket_ports_destroy(&udp_globals.sockets, free); 437 439 fibril_rwlock_write_unlock(&udp_globals.lock); 438 440 return rc; … … 499 501 device_id_t device_id; 500 502 packet_dimension_t *packet_dimension; 503 size_t size; 501 504 int rc; 505 506 /* In case of error, do not update the data fragment size. */ 507 *data_fragment_size = 0; 502 508 503 509 rc = tl_get_address_port(addr, addrlen, &dest_port); … … 521 527 522 528 if (udp_globals.checksum_computing) { 523 rc = ip_get_route_req(udp_globals.ip_ phone, IPPROTO_UDP, addr,529 rc = ip_get_route_req(udp_globals.ip_sess, IPPROTO_UDP, addr, 524 530 addrlen, &device_id, &ip_header, &headerlen); 525 531 if (rc != EOK) 526 532 return rc; 527 533 /* Get the device packet dimension */ 528 // rc = tl_get_ip_packet_dimension(udp_globals.ip_ phone,534 // rc = tl_get_ip_packet_dimension(udp_globals.ip_sess, 529 535 // &udp_globals.dimensions, device_id, &packet_dimension); 530 536 // if (rc != EOK) … … 533 539 // } else { 534 540 /* Do not ask all the time */ 535 rc = ip_packet_size_req(udp_globals.ip_ phone, -1,541 rc = ip_packet_size_req(udp_globals.ip_sess, -1, 536 542 &udp_globals.packet_dimension); 537 543 if (rc != EOK) … … 540 546 // } 541 547 548 /* 549 * Update the data fragment size based on what the lower layers can 550 * handle without fragmentation, but not more than the maximum allowed 551 * for UDP. 552 */ 553 size = MAX_UDP_FRAGMENT_SIZE; 554 if (packet_dimension->content < size) 555 size = packet_dimension->content; 556 *data_fragment_size = size; 557 542 558 /* Read the first packet fragment */ 543 result = tl_socket_read_packet_data(udp_globals.net_ phone, &packet,559 result = tl_socket_read_packet_data(udp_globals.net_sess, &packet, 544 560 UDP_HEADER_SIZE, packet_dimension, addr, addrlen); 545 561 if (result < 0) … … 562 578 /* Read the rest of the packet fragments */ 563 579 for (index = 1; index < fragments; index++) { 564 result = tl_socket_read_packet_data(udp_globals.net_ phone,580 result = tl_socket_read_packet_data(udp_globals.net_sess, 565 581 &next_packet, 0, packet_dimension, addr, addrlen); 566 582 if (result < 0) … … 614 630 615 631 /* Send the packet */ 616 ip_send_msg(udp_globals.ip_ phone, device_id, packet, SERVICE_UDP, 0);632 ip_send_msg(udp_globals.ip_sess, device_id, packet, SERVICE_UDP, 0); 617 633 618 634 return EOK; … … 661 677 return NO_DATA; 662 678 663 rc = packet_translate_remote(udp_globals.net_ phone, &packet, packet_id);679 rc = packet_translate_remote(udp_globals.net_sess, &packet, packet_id); 664 680 if (rc != EOK) { 665 681 (void) dyn_fifo_pop(&socket->received); … … 721 737 } 722 738 723 /** Processes the socket client messages. 724 * 725 * Runs until the client module disconnects. 726 * 727 * @param[in] callid The message identifier. 728 * @param[in] call The message parameters. 729 * @return EOK on success. 730 * 731 * @see socket.h 732 */ 733 static int udp_process_client_messages(ipc_callid_t callid, ipc_call_t call) 739 /** Process the socket client messages. 740 * 741 * Run until the client module disconnects. 742 * 743 * @see socket.h 744 * 745 * @param[in] sess Callback session. 746 * @param[in] callid Message identifier. 747 * @param[in] call Message parameters. 748 * 749 * @return EOK on success. 750 * 751 */ 752 static int udp_process_client_messages(async_sess_t *sess, ipc_callid_t callid, 753 ipc_call_t call) 734 754 { 735 755 int res; 736 bool keep_on_going = true;737 756 socket_cores_t local_sockets; 738 int app_phone = IPC_GET_PHONE(call);739 757 struct sockaddr *addr; 740 758 int socket_id; 741 759 size_t addrlen; 742 size_t size = 0;760 size_t size; 743 761 ipc_call_t answer; 744 762 size_t answer_count; … … 759 777 socket_cores_initialize(&local_sockets); 760 778 761 while ( keep_on_going) {779 while (true) { 762 780 763 781 /* Answer the call */ … … 771 789 772 790 /* Process the call */ 773 switch (IPC_GET_IMETHOD(call)) { 774 case IPC_M_PHONE_HUNGUP: 775 keep_on_going = false; 791 if (!IPC_GET_IMETHOD(call)) { 776 792 res = EHANGUP; 777 793 break; 778 794 } 795 796 switch (IPC_GET_IMETHOD(call)) { 779 797 case NET_SOCKET: 780 798 socket_id = SOCKET_GET_SOCKET_ID(call); 781 res = socket_create(&local_sockets, app_phone, NULL,799 res = socket_create(&local_sockets, sess, NULL, 782 800 &socket_id); 783 801 SOCKET_SET_SOCKET_ID(answer, socket_id); … … 786 804 break; 787 805 788 if (tl_get_ip_packet_dimension(udp_globals.ip_phone, 806 size = MAX_UDP_FRAGMENT_SIZE; 807 if (tl_get_ip_packet_dimension(udp_globals.ip_sess, 789 808 &udp_globals.dimensions, DEVICE_INVALID_ID, 790 809 &packet_dimension) == EOK) { 791 SOCKET_SET_DATA_FRAGMENT_SIZE(answer,792 packet_dimension->content);810 if (packet_dimension->content < size) 811 size = packet_dimension->content; 793 812 } 794 795 // SOCKET_SET_DATA_FRAGMENT_SIZE(answer, 796 // MAX_UDP_FRAGMENT_SIZE); 813 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, size); 797 814 SOCKET_SET_HEADER_SIZE(answer, UDP_HEADER_SIZE); 798 815 answer_count = 3; … … 852 869 case NET_SOCKET_CLOSE: 853 870 fibril_rwlock_write_lock(&udp_globals.lock); 854 res = socket_destroy(udp_globals.net_ phone,871 res = socket_destroy(udp_globals.net_sess, 855 872 SOCKET_GET_SOCKET_ID(call), &local_sockets, 856 873 &udp_globals.sockets, NULL); … … 866 883 } 867 884 868 /* Release the application phone*/869 async_hangup( app_phone);885 /* Release the application session */ 886 async_hangup(sess); 870 887 871 888 /* Release all local sockets */ 872 socket_cores_release(udp_globals.net_ phone, &local_sockets,889 socket_cores_release(udp_globals.net_sess, &local_sockets, 873 890 &udp_globals.sockets, NULL); 874 891 … … 900 917 { 901 918 *answer_count = 0; 902 903 switch (IPC_GET_IMETHOD(*call)) {904 case IPC_M_CONNECT_TO_ME:905 return udp_process_client_messages(callid, *call);906 }907 919 920 async_sess_t *callback = 921 async_callback_receive_start(EXCHANGE_SERIALIZE, call); 922 if (callback) 923 return udp_process_client_messages(callback, callid, *call); 924 908 925 return ENOTSUP; 909 926 }
Note:
See TracChangeset
for help on using the changeset viewer.