Changeset fb4d788 in mainline for uspace/srv
- Timestamp:
- 2015-07-28T11:28:14Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6accc5cf
- Parents:
- df2bce32 (diff), 47726b5e (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. - Location:
- uspace/srv
- Files:
-
- 2 added
- 4 deleted
- 44 edited
- 2 moved
-
bd/sata_bd/sata_bd.c (modified) (1 diff)
-
hid/remcons/remcons.c (modified) (7 diffs)
-
hid/remcons/remcons.h (modified) (1 diff)
-
hid/remcons/user.c (modified) (5 diffs)
-
hid/remcons/user.h (modified) (3 diffs)
-
hid/rfb/main.c (modified) (2 diffs)
-
hid/rfb/rfb.c (modified) (21 diffs)
-
hid/rfb/rfb.h (modified) (3 diffs)
-
klog/klog.c (modified) (2 diffs)
-
net/dhcp/dhcp.c (modified) (1 diff)
-
net/dhcp/transport.c (modified) (8 diffs)
-
net/dhcp/transport.h (modified) (2 diffs)
-
net/dnsrsrv/transport.c (modified) (8 diffs)
-
net/inetsrv/inet_link.c (modified) (4 diffs)
-
net/inetsrv/inetsrv.c (modified) (5 diffs)
-
net/inetsrv/inetsrv.h (modified) (1 diff)
-
net/inetsrv/pdu.c (modified) (6 diffs)
-
net/inetsrv/pdu.h (modified) (2 diffs)
-
net/inetsrv/reass.c (modified) (1 diff)
-
net/tcp/Makefile (modified) (2 diffs)
-
net/tcp/conn.c (modified) (22 diffs)
-
net/tcp/conn.h (modified) (4 diffs)
-
net/tcp/ncsim.c (modified) (6 diffs)
-
net/tcp/ncsim.h (modified) (2 diffs)
-
net/tcp/pdu.c (modified) (9 diffs)
-
net/tcp/pdu.h (modified) (3 diffs)
-
net/tcp/rqueue.c (modified) (7 diffs)
-
net/tcp/rqueue.h (modified) (2 diffs)
-
net/tcp/service.c (added)
-
net/tcp/service.h (moved) (moved from uspace/srv/net/tcp/sock.h ) (2 diffs)
-
net/tcp/sock.c (deleted)
-
net/tcp/tcp.c (modified) (5 diffs)
-
net/tcp/tcp_type.h (modified) (10 diffs)
-
net/tcp/test.c (modified) (4 diffs)
-
net/tcp/tqueue.c (modified) (4 diffs)
-
net/tcp/tqueue.h (modified) (3 diffs)
-
net/tcp/ucall.c (modified) (9 diffs)
-
net/tcp/ucall.h (modified) (4 diffs)
-
net/udp/Makefile (modified) (2 diffs)
-
net/udp/assoc.c (modified) (17 diffs)
-
net/udp/assoc.h (modified) (2 diffs)
-
net/udp/msg.c (modified) (1 diff)
-
net/udp/pdu.c (modified) (8 diffs)
-
net/udp/pdu.h (modified) (3 diffs)
-
net/udp/service.c (added)
-
net/udp/service.h (moved) (moved from uspace/srv/net/udp/sock.h ) (2 diffs)
-
net/udp/sock.c (deleted)
-
net/udp/ucall.c (deleted)
-
net/udp/ucall.h (deleted)
-
net/udp/udp.c (modified) (3 diffs)
-
net/udp/udp_inet.c (modified) (3 diffs)
-
net/udp/udp_type.h (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/sata_bd/sata_bd.c
rdf2bce32 rfb4d788 147 147 * 148 148 */ 149 static int get_sata_disks( )149 static int get_sata_disks(void) 150 150 { 151 151 devman_handle_t root_fun; -
uspace/srv/hid/remcons/remcons.c
rdf2bce32 rfb4d788 44 44 #include <fibril_synch.h> 45 45 #include <task.h> 46 #include < net/in.h>47 #include < net/inet.h>48 #include < net/socket.h>46 #include <inet/addr.h> 47 #include <inet/endpoint.h> 48 #include <inet/tcp.h> 49 49 #include <io/console.h> 50 50 #include <inttypes.h> … … 99 99 }; 100 100 101 static void remcons_new_conn(tcp_listener_t *lst, tcp_conn_t *conn); 102 103 static tcp_listen_cb_t listen_cb = { 104 .new_conn = remcons_new_conn 105 }; 106 107 static tcp_cb_t conn_cb = { 108 .connected = NULL 109 }; 110 101 111 static telnet_user_t *srv_to_user(con_srv_t *srv) 102 112 { … … 111 121 112 122 /* Force character mode. */ 113 send(user->socket, (void *)telnet_force_character_mode_command,114 telnet_force_character_mode_command_count , 0);123 (void) tcp_conn_send(user->conn, (void *)telnet_force_character_mode_command, 124 telnet_force_character_mode_command_count); 115 125 116 126 return EOK; … … 272 282 } 273 283 274 /** Fibril for each accepted socket. 275 * 276 * @param arg Corresponding @c telnet_user_t structure. 277 */ 278 static int network_user_fibril(void *arg) 279 { 280 telnet_user_t *user = arg; 284 /** Handle network connection. 285 * 286 * @param lst Listener 287 * @param conn Connection 288 */ 289 static void remcons_new_conn(tcp_listener_t *lst, tcp_conn_t *conn) 290 { 291 telnet_user_t *user = telnet_user_create(conn); 292 assert(user); 293 294 con_srvs_init(&user->srvs); 295 user->srvs.ops = &con_ops; 296 user->srvs.sarg = user; 297 user->srvs.abort_timeout = 1000; 298 299 telnet_user_add(user); 281 300 282 301 int rc = loc_service_register(user->service_name, &user->service_id); … … 284 303 telnet_user_error(user, "Unable to register %s with loc: %s.", 285 304 user->service_name, str_error(rc)); 286 return EOK;305 return; 287 306 } 288 307 289 308 telnet_user_log(user, "Service %s registerd with id %" PRIun ".", 290 309 user->service_name, user->service_id); 291 310 292 311 fid_t spawn_fibril = fibril_create(spawn_task_fibril, user); 293 312 assert(spawn_fibril); 294 313 fibril_add_ready(spawn_fibril); 295 314 296 315 /* Wait for all clients to exit. */ 297 316 fibril_mutex_lock(&user->guard); 298 317 while (!user_can_be_destroyed_no_lock(user)) { 299 318 if (user->task_finished) { 300 closesocket(user->socket);319 user->conn = NULL; 301 320 user->socket_closed = true; 302 321 user->srvs.aborted = true; … … 310 329 } 311 330 fibril_mutex_unlock(&user->guard); 312 331 313 332 rc = loc_service_unregister(user->service_id); 314 333 if (rc != EOK) { … … 320 339 telnet_user_log(user, "Destroying..."); 321 340 telnet_user_destroy(user); 322 323 return EOK;324 341 } 325 342 326 343 int main(int argc, char *argv[]) 327 344 { 328 int port = 2223; 329 345 int rc; 346 tcp_listener_t *lst; 347 tcp_t *tcp; 348 inet_ep_t ep; 349 330 350 async_set_client_connection(client_connection); 331 intrc = loc_server_register(NAME);351 rc = loc_server_register(NAME); 332 352 if (rc != EOK) { 333 353 fprintf(stderr, "%s: Unable to register server\n", NAME); 334 354 return rc; 335 355 } 336 337 struct sockaddr_in addr; 338 339 addr.sin_family = AF_INET; 340 addr.sin_port = htons(port); 341 342 rc = inet_pton(AF_INET, "127.0.0.1", (void *) 343 &addr.sin_addr.s_addr); 344 if (rc != EOK) { 345 fprintf(stderr, "Error parsing network address: %s.\n", 346 str_error(rc)); 347 return 2; 348 } 349 350 int listen_sd = socket(PF_INET, SOCK_STREAM, 0); 351 if (listen_sd < 0) { 352 fprintf(stderr, "Error creating listening socket: %s.\n", 353 str_error(listen_sd)); 354 return 3; 355 } 356 357 rc = bind(listen_sd, (struct sockaddr *) &addr, sizeof(addr)); 358 if (rc != EOK) { 359 fprintf(stderr, "Error binding socket: %s.\n", 360 str_error(rc)); 361 return 4; 362 } 363 364 rc = listen(listen_sd, BACKLOG_SIZE); 365 if (rc != EOK) { 366 fprintf(stderr, "listen() failed: %s.\n", str_error(rc)); 367 return 5; 356 357 rc = tcp_create(&tcp); 358 if (rc != EOK) { 359 fprintf(stderr, "%s: Error initializing TCP.\n", NAME); 360 return rc; 361 } 362 363 inet_ep_init(&ep); 364 ep.port = 2223; 365 366 rc = tcp_listener_create(tcp, &ep, &listen_cb, NULL, &conn_cb, NULL, 367 &lst); 368 if (rc != EOK) { 369 fprintf(stderr, "%s: Error creating listener.\n", NAME); 370 return rc; 368 371 } 369 372 370 373 printf("%s: HelenOS Remote console service\n", NAME); 371 374 task_retval(0); 372 373 while (true) { 374 struct sockaddr_in raddr; 375 socklen_t raddr_len = sizeof(raddr); 376 int conn_sd = accept(listen_sd, (struct sockaddr *) &raddr, 377 &raddr_len); 378 379 if (conn_sd < 0) { 380 fprintf(stderr, "accept() failed: %s.\n", 381 str_error(rc)); 382 continue; 383 } 384 385 telnet_user_t *user = telnet_user_create(conn_sd); 386 assert(user); 387 388 con_srvs_init(&user->srvs); 389 user->srvs.ops = &con_ops; 390 user->srvs.sarg = user; 391 user->srvs.abort_timeout = 1000; 392 393 telnet_user_add(user); 394 395 fid_t fid = fibril_create(network_user_fibril, user); 396 assert(fid); 397 fibril_add_ready(fid); 398 } 399 375 async_manager(); 376 377 /* Not reached */ 400 378 return 0; 401 379 } -
uspace/srv/hid/remcons/remcons.h
rdf2bce32 rfb4d788 38 38 #define NAME "remcons" 39 39 #define NAMESPACE "term" 40 #define BACKLOG_SIZE 541 40 42 41 #endif -
uspace/srv/hid/remcons/user.c
rdf2bce32 rfb4d788 44 44 #include <fibril_synch.h> 45 45 #include <task.h> 46 #include <net/in.h> 47 #include <net/inet.h> 48 #include <net/socket.h> 46 #include <inet/tcp.h> 49 47 #include <io/console.h> 50 48 #include <inttypes.h> … … 58 56 /** Create new telnet user. 59 57 * 60 * @param socket Socket the user communicates through.58 * @param conn Incoming connection. 61 59 * @return New telnet user or NULL when out of memory. 62 60 */ 63 telnet_user_t *telnet_user_create( int socket)61 telnet_user_t *telnet_user_create(tcp_conn_t *conn) 64 62 { 65 63 static int telnet_user_id_counter = 0; … … 78 76 } 79 77 80 user-> socket = socket;78 user->conn = conn; 81 79 user->service_id = (service_id_t) -1; 82 80 prodcons_initialize(&user->in_events); … … 193 191 /* No more buffered data? */ 194 192 if (user->socket_buffer_len <= user->socket_buffer_pos) { 195 int recv_length = recv(user->socket, user->socket_buffer, BUFFER_SIZE, 0); 196 if ((recv_length == 0) || (recv_length == ENOTCONN)) { 193 int rc; 194 size_t recv_length; 195 196 rc = tcp_conn_recv_wait(user->conn, user->socket_buffer, 197 BUFFER_SIZE, &recv_length); 198 if (rc != EOK) 199 return rc; 200 201 if (recv_length == 0) { 197 202 user->socket_closed = true; 198 203 user->srvs.aborted = true; 199 204 return ENOENT; 200 205 } 201 if (recv_length < 0) { 202 return recv_length; 203 } 206 204 207 user->socket_buffer_len = recv_length; 205 208 user->socket_buffer_pos = 0; … … 359 362 360 363 361 int rc = send(user->socket, converted, converted_size, 0);364 int rc = tcp_conn_send(user->conn, converted, converted_size); 362 365 free(converted); 363 366 -
uspace/srv/hid/remcons/user.h
rdf2bce32 rfb4d788 38 38 #include <adt/prodcons.h> 39 39 #include <fibril_synch.h> 40 #include <inet/tcp.h> 40 41 #include <inttypes.h> 41 42 #include <io/con_srv.h> … … 51 52 /** Internal id, used for creating locfs entries. */ 52 53 int id; 53 /** Associated socket. */54 int socket;54 /** Associated connection. */ 55 tcp_conn_t *conn; 55 56 /** Location service id assigned to the virtual terminal. */ 56 57 service_id_t service_id; … … 80 81 } telnet_user_t; 81 82 82 extern telnet_user_t *telnet_user_create( int);83 extern telnet_user_t *telnet_user_create(tcp_conn_t *); 83 84 extern void telnet_user_add(telnet_user_t *); 84 85 extern void telnet_user_destroy(telnet_user_t *); -
uspace/srv/hid/rfb/main.c
rdf2bce32 rfb4d788 150 150 } 151 151 152 static int socket_fibril(void *unused)153 {154 rfb_accept(&rfb);155 156 /* Not reached */157 return EOK;158 }159 160 152 int main(int argc, char **argv) 161 153 { … … 267 259 } 268 260 269 fid_t fib = fibril_create(socket_fibril, NULL);270 if (!fib) {271 fprintf(stderr, NAME ": Unable to create socket fibril.\n");272 return 2;273 }274 275 fibril_add_ready(fib);276 277 261 printf("%s: Accepting connections\n", NAME); 278 262 task_retval(0); -
uspace/srv/hid/rfb/rfb.c
rdf2bce32 rfb4d788 31 31 #include <stdlib.h> 32 32 #include <fibril_synch.h> 33 #include <inet/addr.h> 34 #include <inet/endpoint.h> 35 #include <inet/tcp.h> 33 36 #include <inttypes.h> 34 37 #include <str.h> … … 38 41 #include <io/log.h> 39 42 40 #include <net/in.h>41 #include <net/inet.h>42 #include <net/socket.h>43 44 43 #include "rfb.h" 44 45 static void rfb_new_conn(tcp_listener_t *, tcp_conn_t *); 46 47 static tcp_listen_cb_t listen_cb = { 48 .new_conn = rfb_new_conn 49 }; 50 51 static tcp_cb_t conn_cb = { 52 .connected = NULL 53 }; 45 54 46 55 /** Buffer for receiving the request. */ … … 53 62 54 63 /** Receive one character (with buffering) */ 55 static int recv_char(int fd, char *c) 56 { 64 static int recv_char(tcp_conn_t *conn, char *c) 65 { 66 size_t nrecv; 67 int rc; 68 57 69 if (rbuf_out == rbuf_in) { 58 70 rbuf_out = 0; 59 71 rbuf_in = 0; 60 72 61 ssize_t rc = recv(fd, rbuf, BUFFER_SIZE, 0);62 if (rc <= 0)73 rc = tcp_conn_recv_wait(conn, rbuf, BUFFER_SIZE, &nrecv); 74 if (rc != EOK) 63 75 return rc; 64 76 65 rbuf_in = rc;77 rbuf_in = nrecv; 66 78 } 67 79 … … 71 83 72 84 /** Receive count characters (with buffering) */ 73 static int recv_chars( int fd, char *c, size_t count)85 static int recv_chars(tcp_conn_t *conn, char *c, size_t count) 74 86 { 75 87 for (size_t i = 0; i < count; i++) { 76 int rc = recv_char( fd, c);88 int rc = recv_char(conn, c); 77 89 if (rc != EOK) 78 90 return rc; … … 82 94 } 83 95 84 static int recv_skip_chars( int fd, size_t count)96 static int recv_skip_chars(tcp_conn_t *conn, size_t count) 85 97 { 86 98 for (size_t i = 0; i < count; i++) { 87 99 char c; 88 int rc = recv_char( fd, &c);100 int rc = recv_char(conn, &c); 89 101 if (rc != EOK) 90 102 return rc; … … 204 216 } 205 217 206 static int recv_message( int conn_sd, char type, void *buf, size_t size)218 static int recv_message(tcp_conn_t *conn, char type, void *buf, size_t size) 207 219 { 208 220 memcpy(buf, &type, 1); 209 return recv_chars(conn _sd, ((char *) buf) + 1, size -1);221 return recv_chars(conn, ((char *) buf) + 1, size -1); 210 222 } 211 223 … … 477 489 } 478 490 479 static int rfb_send_framebuffer_update(rfb_t *rfb, int conn_sd, bool incremental) 491 static int rfb_send_framebuffer_update(rfb_t *rfb, tcp_conn_t *conn, 492 bool incremental) 480 493 { 481 494 fibril_mutex_lock(&rfb->lock); … … 540 553 541 554 if (!rfb->pixel_format.true_color) { 542 int rc = send(conn_sd, send_palette, send_palette_size, 0);555 int rc = tcp_conn_send(conn, send_palette, send_palette_size); 543 556 if (rc != EOK) { 544 557 free(buf); … … 547 560 } 548 561 549 int rc = send(conn_sd, buf, buf_size, 0);562 int rc = tcp_conn_send(conn, buf, buf_size); 550 563 free(buf); 551 564 … … 580 593 } 581 594 582 static void rfb_socket_connection(rfb_t *rfb, int conn_sd)595 static void rfb_socket_connection(rfb_t *rfb, tcp_conn_t *conn) 583 596 { 584 597 /* Version handshake */ 585 int rc = send(conn_sd, "RFB 003.008\n", 12, 0);598 int rc = tcp_conn_send(conn, "RFB 003.008\n", 12); 586 599 if (rc != EOK) { 587 600 log_msg(LOG_DEFAULT, LVL_WARN, "Failed sending server version %d", rc); … … 590 603 591 604 char client_version[12]; 592 rc = recv_chars(conn _sd, client_version, 12);605 rc = recv_chars(conn, client_version, 12); 593 606 if (rc != EOK) { 594 607 log_msg(LOG_DEFAULT, LVL_WARN, "Failed receiving client version: %d", rc); … … 607 620 sec_types[0] = 1; /* length */ 608 621 sec_types[1] = RFB_SECURITY_NONE; 609 rc = send(conn_sd, sec_types, 2, 0);622 rc = tcp_conn_send(conn, sec_types, 2); 610 623 if (rc != EOK) { 611 624 log_msg(LOG_DEFAULT, LVL_WARN, … … 615 628 616 629 char selected_sec_type = 0; 617 rc = recv_char(conn _sd, &selected_sec_type);630 rc = recv_char(conn, &selected_sec_type); 618 631 if (rc != EOK) { 619 632 log_msg(LOG_DEFAULT, LVL_WARN, "Failed receiving security type: %d", rc); … … 626 639 } 627 640 uint32_t security_result = RFB_SECURITY_HANDSHAKE_OK; 628 rc = send(conn_sd, &security_result, sizeof(uint32_t), 0);641 rc = tcp_conn_send(conn, &security_result, sizeof(uint32_t)); 629 642 if (rc != EOK) { 630 643 log_msg(LOG_DEFAULT, LVL_WARN, "Failed sending security result: %d", rc); … … 634 647 /* Client init */ 635 648 char shared_flag; 636 rc = recv_char(conn _sd, &shared_flag);649 rc = recv_char(conn, &shared_flag); 637 650 if (rc != EOK) { 638 651 log_msg(LOG_DEFAULT, LVL_WARN, "Failed receiving client init: %d", rc); … … 657 670 memcpy(server_init->name, rfb->name, name_length); 658 671 fibril_mutex_unlock(&rfb->lock); 659 rc = send(conn_sd, server_init, msg_length, 0);672 rc = tcp_conn_send(conn, server_init, msg_length); 660 673 if (rc != EOK) { 661 674 log_msg(LOG_DEFAULT, LVL_WARN, "Failed sending server init: %d", rc); … … 665 678 while (true) { 666 679 char message_type = 0; 667 rc = recv_char(conn _sd, &message_type);680 rc = recv_char(conn, &message_type); 668 681 if (rc != EOK) { 669 682 log_msg(LOG_DEFAULT, LVL_WARN, … … 680 693 switch (message_type) { 681 694 case RFB_CMSG_SET_PIXEL_FORMAT: 682 recv_message(conn _sd, message_type, &spf, sizeof(spf));695 recv_message(conn, message_type, &spf, sizeof(spf)); 683 696 rfb_pixel_format_to_host(&spf.pixel_format, &spf.pixel_format); 684 697 log_msg(LOG_DEFAULT, LVL_DEBUG2, "Received SetPixelFormat message"); … … 690 703 break; 691 704 case RFB_CMSG_SET_ENCODINGS: 692 recv_message(conn _sd, message_type, &se, sizeof(se));705 recv_message(conn, message_type, &se, sizeof(se)); 693 706 rfb_set_encodings_to_host(&se, &se); 694 707 log_msg(LOG_DEFAULT, LVL_DEBUG2, "Received SetEncodings message"); 695 708 for (uint16_t i = 0; i < se.count; i++) { 696 709 int32_t encoding = 0; 697 rc = recv_chars(conn _sd, (char *) &encoding, sizeof(int32_t));710 rc = recv_chars(conn, (char *) &encoding, sizeof(int32_t)); 698 711 if (rc != EOK) 699 712 return; … … 707 720 break; 708 721 case RFB_CMSG_FRAMEBUFFER_UPDATE_REQUEST: 709 recv_message(conn _sd, message_type, &fbur, sizeof(fbur));722 recv_message(conn, message_type, &fbur, sizeof(fbur)); 710 723 rfb_framebuffer_update_request_to_host(&fbur, &fbur); 711 724 log_msg(LOG_DEFAULT, LVL_DEBUG2, 712 725 "Received FramebufferUpdateRequest message"); 713 rfb_send_framebuffer_update(rfb, conn _sd, fbur.incremental);726 rfb_send_framebuffer_update(rfb, conn, fbur.incremental); 714 727 break; 715 728 case RFB_CMSG_KEY_EVENT: 716 recv_message(conn _sd, message_type, &ke, sizeof(ke));729 recv_message(conn, message_type, &ke, sizeof(ke)); 717 730 rfb_key_event_to_host(&ke, &ke); 718 731 log_msg(LOG_DEFAULT, LVL_DEBUG2, "Received KeyEvent message"); 719 732 break; 720 733 case RFB_CMSG_POINTER_EVENT: 721 recv_message(conn _sd, message_type, &pe, sizeof(pe));734 recv_message(conn, message_type, &pe, sizeof(pe)); 722 735 rfb_pointer_event_to_host(&pe, &pe); 723 736 log_msg(LOG_DEFAULT, LVL_DEBUG2, "Received PointerEvent message"); 724 737 break; 725 738 case RFB_CMSG_CLIENT_CUT_TEXT: 726 recv_message(conn _sd, message_type, &cct, sizeof(cct));739 recv_message(conn, message_type, &cct, sizeof(cct)); 727 740 rfb_client_cut_text_to_host(&cct, &cct); 728 741 log_msg(LOG_DEFAULT, LVL_DEBUG2, "Received ClientCutText message"); 729 recv_skip_chars(conn _sd, cct.length);742 recv_skip_chars(conn, cct.length); 730 743 break; 731 744 default: … … 737 750 } 738 751 739 int rfb_listen(rfb_t *rfb, uint16_t port) { 740 struct sockaddr_in addr; 741 742 addr.sin_family = AF_INET; 743 addr.sin_port = htons(port); 744 745 int rc = inet_pton(AF_INET, "127.0.0.1", (void *) 746 &addr.sin_addr.s_addr); 747 if (rc != EOK) { 748 log_msg(LOG_DEFAULT, LVL_ERROR, "Error parsing network address (%s)", 749 str_error(rc)); 750 return rc; 751 } 752 753 int listen_sd = socket(PF_INET, SOCK_STREAM, 0); 754 if (listen_sd < 0) { 755 log_msg(LOG_DEFAULT, LVL_ERROR, "Error creating listening socket (%s)", 756 str_error(listen_sd)); 757 return rc; 758 } 759 760 rc = bind(listen_sd, (struct sockaddr *) &addr, sizeof(addr)); 761 if (rc != EOK) { 762 log_msg(LOG_DEFAULT, LVL_ERROR, "Error binding socket (%s)", 763 str_error(rc)); 764 return rc; 765 } 766 767 rc = listen(listen_sd, 2); 768 if (rc != EOK) { 769 log_msg(LOG_DEFAULT, LVL_ERROR, "listen() failed (%s)", str_error(rc)); 770 return rc; 771 } 772 773 rfb->listen_sd = listen_sd; 752 int rfb_listen(rfb_t *rfb, uint16_t port) 753 { 754 tcp_t *tcp = NULL; 755 tcp_listener_t *lst = NULL; 756 inet_ep_t ep; 757 int rc; 758 759 rc = tcp_create(&tcp); 760 if (rc != EOK) { 761 log_msg(LOG_DEFAULT, LVL_ERROR, "Error initializing TCP."); 762 goto error; 763 } 764 765 inet_ep_init(&ep); 766 ep.port = port; 767 768 rc = tcp_listener_create(tcp, &ep, &listen_cb, rfb, &conn_cb, rfb, 769 &lst); 770 if (rc != EOK) { 771 log_msg(LOG_DEFAULT, LVL_ERROR, "Error creating listener."); 772 goto error; 773 } 774 775 rfb->tcp = tcp; 776 rfb->lst = lst; 774 777 775 778 return EOK; 776 } 777 778 void rfb_accept(rfb_t *rfb) 779 { 780 while (true) { 781 struct sockaddr_in raddr; 782 socklen_t raddr_len = sizeof(raddr); 783 int conn_sd = accept(rfb->listen_sd, (struct sockaddr *) &raddr, 784 &raddr_len); 785 786 if (conn_sd < 0) { 787 log_msg(LOG_DEFAULT, LVL_WARN, "accept() failed (%s)", 788 str_error(conn_sd)); 789 continue; 790 } 791 792 log_msg(LOG_DEFAULT, LVL_DEBUG, "Connection accepted"); 793 794 rbuf_out = 0; 795 rbuf_in = 0; 796 797 rfb_socket_connection(rfb, conn_sd); 798 closesocket(conn_sd); 799 } 800 } 779 error: 780 tcp_listener_destroy(lst); 781 tcp_destroy(tcp); 782 return rc; 783 } 784 785 static void rfb_new_conn(tcp_listener_t *lst, tcp_conn_t *conn) 786 { 787 rfb_t *rfb = (rfb_t *)tcp_listener_userptr(lst); 788 log_msg(LOG_DEFAULT, LVL_DEBUG, "Connection accepted"); 789 790 rbuf_out = 0; 791 rbuf_in = 0; 792 793 rfb_socket_connection(rfb, conn); 794 } -
uspace/srv/hid/rfb/rfb.h
rdf2bce32 rfb4d788 30 30 #define RFB_H__ 31 31 32 #include <inet/tcp.h> 32 33 #include <io/pixelmap.h> 33 34 #include <fibril_synch.h> … … 151 152 rfb_pixel_format_t pixel_format; 152 153 const char *name; 153 int listen_sd; 154 tcp_t *tcp; 155 tcp_listener_t *lst; 154 156 pixelmap_t framebuffer; 155 157 rfb_rectangle_t damage_rect; … … 165 167 extern int rfb_set_size(rfb_t *, uint16_t, uint16_t); 166 168 extern int rfb_listen(rfb_t *, uint16_t); 167 extern void rfb_accept(rfb_t *);168 169 169 170 #endif -
uspace/srv/klog/klog.c
rdf2bce32 rfb4d788 51 51 #include <io/logctl.h> 52 52 53 #define NAME "klog"53 #define NAME "klog" 54 54 55 55 typedef size_t __attribute__ ((aligned(1))) unaligned_size_t; … … 98 98 * 99 99 */ 100 static void producer( )100 static void producer(void) 101 101 { 102 102 int read = klog_read(buffer, BUFFER_SIZE); -
uspace/srv/net/dhcp/dhcp.c
rdf2bce32 rfb4d788 37 37 #include <adt/list.h> 38 38 #include <bitops.h> 39 #include <byteorder.h> 39 40 #include <errno.h> 40 41 #include <fibril_synch.h> -
uspace/srv/net/dhcp/transport.c
rdf2bce32 rfb4d788 36 36 37 37 #include <bitops.h> 38 #include <errno.h> 38 39 #include <inet/addr.h> 39 40 #include <inet/dnsr.h> … … 41 42 #include <io/log.h> 42 43 #include <loc.h> 43 #include <net/in.h>44 #include <net/inet.h>45 #include <net/socket.h>46 44 #include <stdio.h> 47 45 #include <stdlib.h> … … 67 65 } dhcp_offer_t; 68 66 69 static int dhcp_recv_fibril(void *); 67 static void dhcp_recv_msg(udp_assoc_t *, udp_rmsg_t *); 68 static void dhcp_recv_err(udp_assoc_t *, udp_rerr_t *); 69 static void dhcp_link_state(udp_assoc_t *, udp_link_state_t); 70 71 static udp_cb_t dhcp_transport_cb = { 72 .recv_msg = dhcp_recv_msg, 73 .recv_err = dhcp_recv_err, 74 .link_state = dhcp_link_state 75 }; 70 76 71 77 int dhcp_send(dhcp_transport_t *dt, void *msg, size_t size) 72 78 { 73 struct sockaddr_in addr;79 inet_ep_t ep; 74 80 int rc; 75 81 76 addr.sin_family = AF_INET;77 addr.sin_port = htons(dhcp_server_port);78 addr.sin_addr.s_addr = htonl(addr32_broadcast_all_hosts);82 inet_ep_init(&ep); 83 ep.port = dhcp_server_port; 84 inet_addr_set(addr32_broadcast_all_hosts, &ep.addr); 79 85 80 rc = sendto(dt->fd, msg, size, 0, 81 (struct sockaddr *)&addr, sizeof(addr)); 86 rc = udp_assoc_send_msg(dt->assoc, &ep, msg, size); 82 87 if (rc != EOK) { 83 log_msg(LOG_DEFAULT, LVL_ERROR, " Sending failed");88 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed sending message"); 84 89 return rc; 85 90 } … … 88 93 } 89 94 90 static int dhcp_recv_msg(dhcp_transport_t *dt, void **rmsg, size_t *rsize)95 static void dhcp_recv_msg(udp_assoc_t *assoc, udp_rmsg_t *rmsg) 91 96 { 92 struct sockaddr_in src_addr; 93 socklen_t src_addr_size; 94 size_t recv_size; 97 dhcp_transport_t *dt; 98 size_t s; 95 99 int rc; 96 100 97 src_addr_size = sizeof(src_addr); 98 rc = recvfrom(dt->fd, msgbuf, MAX_MSG_SIZE, 0, 99 (struct sockaddr *)&src_addr, &src_addr_size); 100 if (rc < 0) { 101 log_msg(LOG_DEFAULT, LVL_ERROR, "recvfrom failed (%d)", rc); 102 return rc; 101 log_msg(LOG_DEFAULT, LVL_NOTE, "dhcp_recv_msg()"); 102 103 dt = (dhcp_transport_t *)udp_assoc_userptr(assoc); 104 s = udp_rmsg_size(rmsg); 105 if (s > MAX_MSG_SIZE) 106 s = MAX_MSG_SIZE; /* XXX */ 107 108 rc = udp_rmsg_read(rmsg, 0, msgbuf, s); 109 if (rc != EOK) { 110 log_msg(LOG_DEFAULT, LVL_ERROR, "Error receiving message."); 111 return; 103 112 } 104 113 105 recv_size = (size_t)rc;106 *rmsg = msgbuf;107 *rsize = recv_size; 114 log_msg(LOG_DEFAULT, LVL_NOTE, "dhcp_recv_msg() - call recv_cb"); 115 dt->recv_cb(dt->cb_arg, msgbuf, s); 116 } 108 117 109 return EOK; 118 static void dhcp_recv_err(udp_assoc_t *assoc, udp_rerr_t *rerr) 119 { 120 log_msg(LOG_DEFAULT, LVL_WARN, "Ignoring ICMP error"); 121 } 122 123 static void dhcp_link_state(udp_assoc_t *assoc, udp_link_state_t ls) 124 { 125 log_msg(LOG_DEFAULT, LVL_NOTE, "Link state change"); 110 126 } 111 127 … … 113 129 dhcp_recv_cb_t recv_cb, void *arg) 114 130 { 115 int fd;116 struct sockaddr_in laddr;117 in t fid;131 udp_t *udp = NULL; 132 udp_assoc_t *assoc = NULL; 133 inet_ep2_t epp; 118 134 int rc; 119 135 120 log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcp transport_init()");136 log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcp_transport_init()"); 121 137 122 laddr.sin_family = AF_INET; 123 laddr.sin_port = htons(dhcp_client_port); 124 laddr.sin_addr.s_addr = INADDR_ANY; 138 inet_ep2_init(&epp); 139 epp.local.addr.version = ip_v4; 140 epp.local.port = dhcp_client_port; 141 epp.local_link = link_id; 125 142 126 fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 127 if (fd < 0) { 128 rc = EIO; 129 goto error; 130 } 131 132 log_msg(LOG_DEFAULT, LVL_DEBUG, "Bind socket."); 133 rc = bind(fd, (struct sockaddr *)&laddr, sizeof(laddr)); 143 rc = udp_create(&udp); 134 144 if (rc != EOK) { 135 145 rc = EIO; … … 137 147 } 138 148 139 log_msg(LOG_DEFAULT, LVL_DEBUG, "Set socket options"); 140 rc = setsockopt(fd, SOL_SOCKET, SO_IPLINK, &link_id, sizeof(link_id)); 149 rc = udp_assoc_create(udp, &epp, &dhcp_transport_cb, dt, &assoc); 141 150 if (rc != EOK) { 142 151 rc = EIO; … … 144 153 } 145 154 146 dt->fd = fd; 155 dt->udp = udp; 156 dt->assoc = assoc; 147 157 dt->recv_cb = recv_cb; 148 158 dt->cb_arg = arg; 149 159 150 fid = fibril_create(dhcp_recv_fibril, dt);151 if (fid == 0) {152 rc = ENOMEM;153 goto error;154 }155 156 dt->recv_fid = fid;157 fibril_add_ready(fid);158 159 160 return EOK; 160 161 error: 161 closesocket(fd); 162 udp_assoc_destroy(assoc); 163 udp_destroy(udp); 162 164 return rc; 163 165 } … … 165 167 void dhcp_transport_fini(dhcp_transport_t *dt) 166 168 { 167 closesocket(dt->fd); 168 } 169 170 static int dhcp_recv_fibril(void *arg) 171 { 172 dhcp_transport_t *dt = (dhcp_transport_t *)arg; 173 void *msg; 174 size_t size = (size_t) -1; 175 int rc; 176 177 while (true) { 178 rc = dhcp_recv_msg(dt, &msg, &size); 179 if (rc != EOK) 180 break; 181 182 assert(size != (size_t) -1); 183 184 dt->recv_cb(dt->cb_arg, msg, size); 185 } 186 187 return EOK; 169 udp_assoc_destroy(dt->assoc); 170 udp_destroy(dt->udp); 188 171 } 189 172 -
uspace/srv/net/dhcp/transport.h
rdf2bce32 rfb4d788 38 38 #define TRANSPORT_H 39 39 40 #include <inet/udp.h> 40 41 #include <ipc/loc.h> 41 42 #include <sys/types.h> … … 47 48 48 49 struct dhcp_transport { 49 /** Transport socket */ 50 int fd; 50 /** UDP */ 51 udp_t *udp; 52 /** UDP association */ 53 udp_assoc_t *assoc; 51 54 /** Receive callback */ 52 55 dhcp_recv_cb_t recv_cb; 53 56 /** Callback argument */ 54 57 void *cb_arg; 55 /** Receive fibril ID */56 int recv_fid;57 58 }; 58 59 -
uspace/srv/net/dnsrsrv/transport.c
rdf2bce32 rfb4d788 37 37 #include <errno.h> 38 38 #include <fibril_synch.h> 39 #include <inet/addr.h> 40 #include <inet/endpoint.h> 41 #include <inet/udp.h> 39 42 #include <io/log.h> 40 #include <net/in.h>41 #include <net/inet.h>42 #include <net/socket.h>43 43 #include <stdbool.h> 44 44 #include <stdlib.h> … … 72 72 73 73 static uint8_t recv_buf[RECV_BUF_SIZE]; 74 static fid_t recv_fid;75 static int transport_fd = -1;74 static udp_t *transport_udp; 75 static udp_assoc_t *transport_assoc; 76 76 77 77 /** Outstanding requests */ … … 79 79 static FIBRIL_MUTEX_INITIALIZE(treq_lock); 80 80 81 static int transport_recv_fibril(void *arg); 81 static void transport_recv_msg(udp_assoc_t *, udp_rmsg_t *); 82 static void transport_recv_err(udp_assoc_t *, udp_rerr_t *); 83 static void transport_link_state(udp_assoc_t *, udp_link_state_t); 84 85 static udp_cb_t transport_cb = { 86 .recv_msg = transport_recv_msg, 87 .recv_err = transport_recv_err, 88 .link_state = transport_link_state 89 }; 82 90 83 91 int transport_init(void) 84 92 { 85 struct sockaddr_in laddr; 86 int fd; 87 fid_t fid; 93 inet_ep2_t epp; 88 94 int rc; 89 95 90 laddr.sin_family = AF_INET; 91 laddr.sin_port = htons(12345); 92 laddr.sin_addr.s_addr = INADDR_ANY; 93 94 fd = -1; 95 96 fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 97 if (fd < 0) { 96 inet_ep2_init(&epp); 97 98 rc = udp_create(&transport_udp); 99 if (rc != EOK) { 98 100 rc = EIO; 99 101 goto error; 100 102 } 101 103 102 rc = bind(fd, (struct sockaddr *)&laddr, sizeof(laddr)); 103 if (rc != EOK) 104 goto error; 105 106 transport_fd = fd; 107 108 fid = fibril_create(transport_recv_fibril, NULL); 109 if (fid == 0) 110 goto error; 111 112 fibril_add_ready(fid); 113 recv_fid = fid; 104 rc = udp_assoc_create(transport_udp, &epp, &transport_cb, NULL, 105 &transport_assoc); 106 if (rc != EOK) { 107 rc = EIO; 108 goto error; 109 } 110 114 111 return EOK; 115 112 error: 116 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing network socket.");117 if (fd >= 0)118 closesocket(fd);113 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing network."); 114 udp_assoc_destroy(transport_assoc); 115 udp_destroy(transport_udp); 119 116 return rc; 120 117 } … … 122 119 void transport_fini(void) 123 120 { 124 if (transport_fd >= 0)125 closesocket(transport_fd);121 udp_assoc_destroy(transport_assoc); 122 udp_destroy(transport_udp); 126 123 } 127 124 … … 182 179 { 183 180 trans_req_t *treq = NULL; 184 struct sockaddr *saddr = NULL; 185 socklen_t saddrlen; 186 181 inet_ep_t ep; 182 187 183 void *req_data; 188 184 size_t req_size; … … 190 186 if (rc != EOK) 191 187 goto error; 192 193 rc = inet_addr_sockaddr(&dns_server_addr, DNS_SERVER_PORT, 194 &saddr, &saddrlen); 195 if (rc != EOK) { 196 assert(rc == ENOMEM); 197 goto error; 198 } 199 188 189 inet_ep_init(&ep); 190 ep.addr = dns_server_addr; 191 ep.port = DNS_SERVER_PORT; 192 200 193 size_t ntry = 0; 201 194 202 195 while (ntry < REQ_RETRY_MAX) { 203 rc = sendto(transport_fd, req_data, req_size, 0,204 saddr, saddrlen);196 rc = udp_assoc_send_msg(transport_assoc, &ep, req_data, 197 req_size); 205 198 if (rc != EOK) 206 199 goto error; 207 200 208 201 treq = treq_create(req); 209 202 if (treq == NULL) { … … 211 204 goto error; 212 205 } 213 206 214 207 fibril_mutex_lock(&treq->done_lock); 215 208 while (treq->done != true) { … … 221 214 } 222 215 } 223 216 224 217 fibril_mutex_unlock(&treq->done_lock); 225 218 226 219 if (rc != ETIMEOUT) 227 220 break; 228 221 } 229 222 230 223 if (ntry >= REQ_RETRY_MAX) { 231 224 rc = EIO; 232 225 goto error; 233 226 } 234 227 235 228 if (treq->status != EOK) { 236 229 rc = treq->status; 237 230 goto error; 238 231 } 239 232 240 233 *rresp = treq->resp; 241 234 treq_destroy(treq); 242 235 free(req_data); 243 free(saddr);244 236 return EOK; 245 237 246 238 error: 247 239 if (treq != NULL) 248 240 treq_destroy(treq); 249 241 250 242 free(req_data); 251 free(saddr);252 243 return rc; 253 244 } 254 245 255 static int transport_recv_msg(dns_message_t **rresp) 256 { 257 struct sockaddr_in src_addr; 258 socklen_t src_addr_size; 259 size_t recv_size; 260 dns_message_t *resp; 261 int rc; 262 263 src_addr_size = sizeof(src_addr); 264 rc = recvfrom(transport_fd, recv_buf, RECV_BUF_SIZE, 0, 265 (struct sockaddr *)&src_addr, &src_addr_size); 266 if (rc < 0) { 267 log_msg(LOG_DEFAULT, LVL_ERROR, "recvfrom returns error - %d", rc); 268 goto error; 269 } 270 271 recv_size = (size_t)rc; 272 273 rc = dns_message_decode(recv_buf, recv_size, &resp); 274 if (rc != EOK) { 275 rc = EIO; 276 goto error; 277 } 278 279 *rresp = resp; 280 return EOK; 281 282 error: 283 return rc; 284 } 285 286 static int transport_recv_fibril(void *arg) 246 static void transport_recv_msg(udp_assoc_t *assoc, udp_rmsg_t *rmsg) 287 247 { 288 248 dns_message_t *resp = NULL; 289 249 trans_req_t *treq; 250 size_t size; 251 inet_ep_t remote_ep; 290 252 int rc; 291 253 292 while (true) { 293 rc = transport_recv_msg(&resp); 294 if (rc != EOK) 295 continue; 296 297 assert(resp != NULL); 298 299 fibril_mutex_lock(&treq_lock); 300 treq = treq_match_resp(resp); 301 if (treq == NULL) { 302 fibril_mutex_unlock(&treq_lock); 303 continue; 304 } 305 306 list_remove(&treq->lreq); 254 size = udp_rmsg_size(rmsg); 255 if (size > RECV_BUF_SIZE) 256 size = RECV_BUF_SIZE; /* XXX */ 257 258 rc = udp_rmsg_read(rmsg, 0, recv_buf, size); 259 if (rc != EOK) { 260 log_msg(LOG_DEFAULT, LVL_ERROR, "Error reading message."); 261 return; 262 } 263 264 udp_rmsg_remote_ep(rmsg, &remote_ep); 265 /* XXX */ 266 267 rc = dns_message_decode(recv_buf, size, &resp); 268 if (rc != EOK) { 269 log_msg(LOG_DEFAULT, LVL_ERROR, "Error decoding message."); 270 return; 271 } 272 273 assert(resp != NULL); 274 275 fibril_mutex_lock(&treq_lock); 276 treq = treq_match_resp(resp); 277 if (treq == NULL) { 307 278 fibril_mutex_unlock(&treq_lock); 308 309 treq_complete(treq, resp); 310 } 311 312 return 0; 313 } 279 return; 280 } 281 282 list_remove(&treq->lreq); 283 fibril_mutex_unlock(&treq_lock); 284 285 treq_complete(treq, resp); 286 } 287 288 static void transport_recv_err(udp_assoc_t *assoc, udp_rerr_t *rerr) 289 { 290 log_msg(LOG_DEFAULT, LVL_WARN, "Ignoring ICMP error"); 291 } 292 293 static void transport_link_state(udp_assoc_t *assoc, udp_link_state_t ls) 294 { 295 log_msg(LOG_DEFAULT, LVL_NOTE, "Link state change"); 296 } 297 314 298 315 299 /** @} -
uspace/srv/net/inetsrv/inet_link.c
rdf2bce32 rfb4d788 73 73 { 74 74 memcpy(ip_addr, link_local_node_ip, 16); 75 75 76 76 ip_addr[8] = mac_addr[0] ^ 0x02; 77 77 ip_addr[9] = mac_addr[1]; … … 85 85 { 86 86 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_iplink_recv()"); 87 87 88 88 int rc; 89 89 inet_packet_t packet; 90 90 inet_link_t *ilink; 91 92 ilink = (inet_link_t *)iplink_get_userptr(iplink); 93 91 94 switch (ver) { 92 95 case ip_v4: 93 rc = inet_pdu_decode(sdu->data, sdu->size, &packet); 96 rc = inet_pdu_decode(sdu->data, sdu->size, ilink->svc_id, 97 &packet); 94 98 break; 95 99 case ip_v6: 96 rc = inet_pdu_decode6(sdu->data, sdu->size, &packet); 100 rc = inet_pdu_decode6(sdu->data, sdu->size, ilink->svc_id, 101 &packet); 97 102 break; 98 103 default: … … 100 105 return EINVAL; 101 106 } 102 107 103 108 if (rc != EOK) { 104 109 log_msg(LOG_DEFAULT, LVL_DEBUG, "failed decoding PDU"); 105 110 return rc; 106 111 } 107 112 113 log_msg(LOG_DEFAULT, LVL_NOTE, "inet_iplink_recv: link_id=%zu", packet.link_id); 108 114 log_msg(LOG_DEFAULT, LVL_DEBUG, "call inet_recv_packet()"); 109 115 rc = inet_recv_packet(&packet); 110 116 log_msg(LOG_DEFAULT, LVL_DEBUG, "call inet_recv_packet -> %d", rc); 111 117 free(packet.data); 112 118 113 119 return rc; 114 120 } … … 177 183 } 178 184 179 rc = iplink_open(ilink->sess, &inet_iplink_ev_ops, &ilink->iplink);185 rc = iplink_open(ilink->sess, &inet_iplink_ev_ops, ilink, &ilink->iplink); 180 186 if (rc != EOK) { 181 187 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed opening IP link '%s'", -
uspace/srv/net/inetsrv/inetsrv.c
rdf2bce32 rfb4d788 469 469 { 470 470 async_exch_t *exch = async_exchange_begin(client->sess); 471 471 472 472 ipc_call_t answer; 473 aid_t req = async_send_1(exch, INET_EV_RECV, dgram->tos, &answer); 474 473 474 log_msg(LOG_DEFAULT, LVL_NOTE, "inet_ev_recv: iplink=%zu", 475 dgram->iplink); 476 477 aid_t req = async_send_2(exch, INET_EV_RECV, dgram->tos, 478 dgram->iplink, &answer); 479 475 480 int rc = async_data_write_start(exch, &dgram->src, sizeof(inet_addr_t)); 476 481 if (rc != EOK) { … … 479 484 return rc; 480 485 } 481 486 482 487 rc = async_data_write_start(exch, &dgram->dest, sizeof(inet_addr_t)); 483 488 if (rc != EOK) { … … 486 491 return rc; 487 492 } 488 493 489 494 rc = async_data_write_start(exch, dgram->data, dgram->size); 490 495 491 496 async_exchange_end(exch); 492 497 493 498 if (rc != EOK) { 494 499 async_forget(req); 495 500 return rc; 496 501 } 497 502 498 503 sysarg_t retval; 499 504 async_wait_for(req, &retval); 500 505 501 506 return (int) retval; 502 507 } … … 511 516 if (proto == IP_PROTO_ICMP) 512 517 return icmp_recv(dgram); 513 518 514 519 if (proto == IP_PROTO_ICMPV6) 515 520 return icmpv6_recv(dgram); … … 540 545 if (packet->offs == 0 && !packet->mf) { 541 546 /* It is complete deliver it immediately */ 547 dgram.iplink = packet->link_id; 542 548 dgram.src = packet->src; 543 549 dgram.dest = packet->dest; -
uspace/srv/net/inetsrv/inetsrv.h
rdf2bce32 rfb4d788 75 75 76 76 typedef struct { 77 /** Local link ID */ 78 service_id_t link_id; 77 79 /** Source address */ 78 80 inet_addr_t src; -
uspace/srv/net/inetsrv/pdu.c
rdf2bce32 rfb4d788 298 298 /** Decode IPv4 datagram 299 299 * 300 * @param data Serialized IPv4 datagram 301 * @param size Length of serialized IPv4 datagram 302 * @param packet IP datagram structure to be filled 300 * @param data Serialized IPv4 datagram 301 * @param size Length of serialized IPv4 datagram 302 * @param link_id Link on which PDU was received 303 * @param packet IP datagram structure to be filled 303 304 * 304 305 * @return EOK on success … … 307 308 * 308 309 */ 309 int inet_pdu_decode(void *data, size_t size, inet_packet_t *packet) 310 int inet_pdu_decode(void *data, size_t size, service_id_t link_id, 311 inet_packet_t *packet) 310 312 { 311 313 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_pdu_decode()"); … … 366 368 367 369 memcpy(packet->data, (uint8_t *) data + data_offs, packet->size); 370 packet->link_id = link_id; 368 371 369 372 return EOK; … … 372 375 /** Decode IPv6 datagram 373 376 * 374 * @param data Serialized IPv6 datagram 375 * @param size Length of serialized IPv6 datagram 376 * @param packet IP datagram structure to be filled 377 * @param data Serialized IPv6 datagram 378 * @param size Length of serialized IPv6 datagram 379 * @param link_id Link on which PDU was received 380 * @param packet IP datagram structure to be filled 377 381 * 378 382 * @return EOK on success … … 381 385 * 382 386 */ 383 int inet_pdu_decode6(void *data, size_t size, inet_packet_t *packet) 387 int inet_pdu_decode6(void *data, size_t size, service_id_t link_id, 388 inet_packet_t *packet) 384 389 { 385 390 log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_pdu_decode6()"); … … 457 462 458 463 memcpy(packet->data, (uint8_t *) data + data_offs, packet->size); 459 464 packet->link_id = link_id; 460 465 return EOK; 461 466 } -
uspace/srv/net/inetsrv/pdu.h
rdf2bce32 rfb4d788 38 38 #define INET_PDU_H_ 39 39 40 #include <loc.h> 40 41 #include <sys/types.h> 41 42 #include "inetsrv.h" … … 50 51 extern int inet_pdu_encode6(inet_packet_t *, addr128_t, addr128_t, size_t, 51 52 size_t, void **, size_t *, size_t *); 52 extern int inet_pdu_decode(void *, size_t, inet_packet_t *);53 extern int inet_pdu_decode6(void *, size_t, inet_packet_t *);53 extern int inet_pdu_decode(void *, size_t, service_id_t, inet_packet_t *); 54 extern int inet_pdu_decode6(void *, size_t, service_id_t, inet_packet_t *); 54 55 55 56 extern int ndp_pdu_decode(inet_dgram_t *, ndp_packet_t *); -
uspace/srv/net/inetsrv/reass.c
rdf2bce32 rfb4d788 325 325 return ENOMEM; 326 326 327 /* XXX What if different fragments came from different link? */ 328 dgram.iplink = frag->packet.link_id; 327 329 dgram.size = dgram_size; 328 330 dgram.src = frag->packet.src; -
uspace/srv/net/tcp/Makefile
rdf2bce32 rfb4d788 28 28 29 29 USPACE_PREFIX = ../../.. 30 LIBS = $(LIBNET_PREFIX)/libnet.a 31 EXTRA_CFLAGS = -I$(LIBNET_PREFIX)/include 30 31 LIBS = \ 32 $(LIBNETTL_PREFIX)/libnettl.a 33 34 EXTRA_CFLAGS += \ 35 -I$(LIBNETTL_PREFIX)/include 36 32 37 BINARY = tcp 33 38 … … 39 44 rqueue.c \ 40 45 segment.c \ 46 service.c \ 41 47 seq_no.c \ 42 sock.c \43 48 tcp.c \ 44 49 test.c \ -
uspace/srv/net/tcp/conn.c
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 37 37 #include <adt/list.h> 38 #include <stdbool.h>39 38 #include <errno.h> 39 #include <inet/endpoint.h> 40 40 #include <io/log.h> 41 41 #include <macros.h> 42 #include <nettl/amap.h> 43 #include <stdbool.h> 42 44 #include <stdlib.h> 43 45 #include "conn.h" … … 55 57 #define TIME_WAIT_TIMEOUT (2*MAX_SEGMENT_LIFETIME) 56 58 57 LIST_INITIALIZE(conn_list); 58 FIBRIL_MUTEX_INITIALIZE(conn_list_lock); 59 static LIST_INITIALIZE(conn_list); 60 /** Taken after tcp_conn_t lock */ 61 static FIBRIL_MUTEX_INITIALIZE(conn_list_lock); 62 static amap_t *amap; 59 63 60 64 static void tcp_conn_seg_process(tcp_conn_t *conn, tcp_segment_t *seg); … … 62 66 static void tcp_conn_tw_timer_clear(tcp_conn_t *conn); 63 67 68 /** Initialize connections. */ 69 int tcp_conns_init(void) 70 { 71 int rc; 72 73 rc = amap_create(&amap); 74 if (rc != EOK) { 75 assert(rc == ENOMEM); 76 return ENOMEM; 77 } 78 79 return EOK; 80 } 81 64 82 /** Create new connection structure. 65 83 * 66 * @param lsock Local socket (will be deeply copied) 67 * @param fsock Foreign socket (will be deeply copied) 84 * @param epp Endpoint pair (will be deeply copied) 68 85 * @return New connection or NULL 69 86 */ 70 tcp_conn_t *tcp_conn_new( tcp_sock_t *lsock, tcp_sock_t *fsock)87 tcp_conn_t *tcp_conn_new(inet_ep2_t *epp) 71 88 { 72 89 tcp_conn_t *conn = NULL; … … 121 138 fibril_condvar_initialize(&conn->cstate_cv); 122 139 123 conn->c state_cb = NULL;140 conn->cb = NULL; 124 141 125 142 conn->cstate = st_listen; … … 128 145 conn->ap = ap_passive; 129 146 conn->fin_is_acked = false; 130 conn->ident.local = *lsock; 131 if (fsock != NULL) 132 conn->ident.foreign = *fsock; 147 if (epp != NULL) 148 conn->ident = *epp; 133 149 134 150 return conn; … … 184 200 void tcp_conn_addref(tcp_conn_t *conn) 185 201 { 186 log_msg(LOG_DEFAULT, LVL_DEBUG2, "%s: tcp_conn_addref(%p)", conn->name, conn); 202 log_msg(LOG_DEFAULT, LVL_DEBUG2, "%s: tcp_conn_addref(%p) before=%zu", 203 conn->name, conn, atomic_get(&conn->refcnt)); 187 204 atomic_inc(&conn->refcnt); 188 205 } … … 196 213 void tcp_conn_delref(tcp_conn_t *conn) 197 214 { 198 log_msg(LOG_DEFAULT, LVL_DEBUG2, "%s: tcp_conn_delref(%p)", conn->name, conn); 215 log_msg(LOG_DEFAULT, LVL_DEBUG2, "%s: tcp_conn_delref(%p) before=%zu", 216 conn->name, conn, atomic_get(&conn->refcnt)); 199 217 200 218 if (atomic_predec(&conn->refcnt) == 0) … … 237 255 238 256 assert(conn->deleted == false); 257 conn->deleted = true; 258 conn->cb = NULL; 259 conn->cb_arg = NULL; 239 260 tcp_conn_delref(conn); 240 261 } … … 244 265 * Add connection to the connection map. 245 266 */ 246 void tcp_conn_add(tcp_conn_t *conn) 247 { 267 int tcp_conn_add(tcp_conn_t *conn) 268 { 269 inet_ep2_t aepp; 270 int rc; 271 248 272 tcp_conn_addref(conn); 249 273 fibril_mutex_lock(&conn_list_lock); 274 275 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_conn_add: conn=%p", conn); 276 277 rc = amap_insert(amap, &conn->ident, conn, af_allow_system, &aepp); 278 if (rc != EOK) { 279 tcp_conn_delref(conn); 280 fibril_mutex_unlock(&conn_list_lock); 281 return rc; 282 } 283 284 conn->ident = aepp; 250 285 list_append(&conn->link, &conn_list); 251 286 fibril_mutex_unlock(&conn_list_lock); 287 288 return EOK; 252 289 } 253 290 … … 259 296 { 260 297 fibril_mutex_lock(&conn_list_lock); 298 amap_remove(amap, &conn->ident); 261 299 list_remove(&conn->link); 262 300 fibril_mutex_unlock(&conn_list_lock); … … 275 313 276 314 /* Run user callback function */ 277 if (conn->c state_cb!= NULL) {315 if (conn->cb != NULL && conn->cb->cstate_change != NULL) { 278 316 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_conn_state_set() - run user CB"); 279 conn->c state_cb(conn, conn->cstate_cb_arg);317 conn->cb->cstate_change(conn, conn->cb_arg, old_state); 280 318 } else { 281 319 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_conn_state_set() - no user CB"); … … 284 322 assert(old_state != st_closed); 285 323 if (nstate == st_closed) { 324 tcp_conn_remove(conn); 286 325 /* Drop one reference for now being in closed state */ 287 326 tcp_conn_delref(conn); … … 332 371 } 333 372 334 /** Match socket with pattern. */ 335 static bool tcp_socket_match(tcp_sock_t *sock, tcp_sock_t *patt) 336 { 337 log_msg(LOG_DEFAULT, LVL_DEBUG2, 338 "tcp_socket_match(sock=(%u), pat=(%u))", sock->port, patt->port); 339 340 if ((!inet_addr_is_any(&patt->addr)) && 341 (!inet_addr_compare(&patt->addr, &sock->addr))) 342 return false; 343 344 if ((patt->port != TCP_PORT_ANY) && 345 (patt->port != sock->port)) 346 return false; 347 348 log_msg(LOG_DEFAULT, LVL_DEBUG2, " -> match"); 349 350 return true; 351 } 352 353 /** Match socket pair with pattern. */ 354 static bool tcp_sockpair_match(tcp_sockpair_t *sp, tcp_sockpair_t *pattern) 355 { 356 log_msg(LOG_DEFAULT, LVL_DEBUG2, "tcp_sockpair_match(%p, %p)", sp, pattern); 357 358 if (!tcp_socket_match(&sp->local, &pattern->local)) 359 return false; 360 361 if (!tcp_socket_match(&sp->foreign, &pattern->foreign)) 362 return false; 363 364 return true; 365 } 366 367 /** Find connection structure for specified socket pair. 368 * 369 * A connection is uniquely identified by a socket pair. Look up our 370 * connection map and return connection structure based on socket pair. 373 /** Find connection structure for specified endpoint pair. 374 * 375 * A connection is uniquely identified by a endpoint pair. Look up our 376 * connection map and return connection structure based on endpoint pair. 371 377 * The connection reference count is bumped by one. 372 378 * 373 * @param sp Socket pair379 * @param epp Endpoint pair 374 380 * @return Connection structure or NULL if not found. 375 381 */ 376 tcp_conn_t *tcp_conn_find_ref(tcp_sockpair_t *sp) 377 { 378 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_conn_find_ref(%p)", sp); 379 380 log_msg(LOG_DEFAULT, LVL_DEBUG2, "compare conn (f:(%u), l:(%u))", 381 sp->foreign.port, sp->local.port); 382 382 tcp_conn_t *tcp_conn_find_ref(inet_ep2_t *epp) 383 { 384 int rc; 385 void *arg; 386 tcp_conn_t *conn; 387 388 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_conn_find_ref(%p)", epp); 389 383 390 fibril_mutex_lock(&conn_list_lock); 384 385 list_foreach(conn_list, link, tcp_conn_t, conn) { 386 tcp_sockpair_t *csp = &conn->ident; 387 388 log_msg(LOG_DEFAULT, LVL_DEBUG2, " - with (f:(%u), l:(%u))", 389 csp->foreign.port, csp->local.port); 390 391 if (tcp_sockpair_match(sp, csp)) { 392 tcp_conn_addref(conn); 393 fibril_mutex_unlock(&conn_list_lock); 394 return conn; 395 } 396 } 397 391 392 rc = amap_find_match(amap, epp, &arg); 393 if (rc != EOK) { 394 assert(rc == ENOENT); 395 fibril_mutex_unlock(&conn_list_lock); 396 return NULL; 397 } 398 399 conn = (tcp_conn_t *)arg; 400 tcp_conn_addref(conn); 401 398 402 fibril_mutex_unlock(&conn_list_lock); 399 return NULL; 403 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_conn_find_ref: got conn=%p", 404 conn); 405 return conn; 400 406 } 401 407 … … 407 413 { 408 414 log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_conn_reset()", conn->name); 415 conn->reset = true; 409 416 tcp_conn_state_set(conn, st_closed); 410 conn->reset = true;411 417 412 418 tcp_conn_tw_timer_clear(conn); … … 877 883 if (conn->fin_is_acked) { 878 884 log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: FIN acked -> Closed", conn->name); 879 tcp_conn_remove(conn);880 885 tcp_conn_state_set(conn, st_closed); 881 886 return cp_done; … … 1006 1011 1007 1012 /* Signal to the receive function that new data has arrived */ 1008 fibril_condvar_broadcast(&conn->rcv_buf_cv); 1013 if (xfer_size > 0) { 1014 fibril_condvar_broadcast(&conn->rcv_buf_cv); 1015 if (conn->cb != NULL && conn->cb->recv_data != NULL) 1016 conn->cb->recv_data(conn, conn->cb_arg); 1017 } 1009 1018 1010 1019 log_msg(LOG_DEFAULT, LVL_DEBUG, "Received %zu bytes of data.", xfer_size); … … 1098 1107 conn->rcv_buf_fin = true; 1099 1108 fibril_condvar_broadcast(&conn->rcv_buf_cv); 1109 if (conn->cb != NULL && conn->cb->recv_data != NULL) 1110 conn->cb->recv_data(conn, conn->cb_arg); 1100 1111 1101 1112 tcp_segment_delete(seg); … … 1168 1179 * 1169 1180 * @param conn Connection 1170 * @param seg Segment 1171 */ 1172 void tcp_conn_segment_arrived(tcp_conn_t *conn, tcp_segment_t *seg) 1173 { 1181 * @param epp Endpoint pair on which segment was received 1182 * @param seg Segment 1183 */ 1184 void tcp_conn_segment_arrived(tcp_conn_t *conn, inet_ep2_t *epp, 1185 tcp_segment_t *seg) 1186 { 1187 inet_ep2_t aepp; 1188 inet_ep2_t oldepp; 1189 int rc; 1190 1174 1191 log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: tcp_conn_segment_arrived(%p)", 1175 1192 conn->name, seg); 1176 1193 1194 tcp_conn_lock(conn); 1195 1196 if (conn->cstate == st_closed) { 1197 log_msg(LOG_DEFAULT, LVL_WARN, "Connection is closed."); 1198 tcp_unexpected_segment(epp, seg); 1199 tcp_conn_unlock(conn); 1200 return; 1201 } 1202 1203 if (inet_addr_is_any(&conn->ident.remote.addr) || 1204 conn->ident.remote.port == inet_port_any || 1205 inet_addr_is_any(&conn->ident.local.addr)) { 1206 1207 log_msg(LOG_DEFAULT, LVL_DEBUG2, "tcp_conn_segment_arrived: " 1208 "Changing connection ID, updating amap."); 1209 oldepp = conn->ident; 1210 1211 /* Need to remove and re-insert connection with new identity */ 1212 fibril_mutex_lock(&conn_list_lock); 1213 1214 if (inet_addr_is_any(&conn->ident.remote.addr)) 1215 conn->ident.remote.addr = epp->remote.addr; 1216 1217 if (conn->ident.remote.port == inet_port_any) 1218 conn->ident.remote.port = epp->remote.port; 1219 1220 if (inet_addr_is_any(&conn->ident.local.addr)) 1221 conn->ident.local.addr = epp->local.addr; 1222 1223 rc = amap_insert(amap, &conn->ident, conn, af_allow_system, &aepp); 1224 if (rc != EOK) { 1225 assert(rc != EEXISTS); 1226 assert(rc == ENOMEM); 1227 log_msg(LOG_DEFAULT, LVL_ERROR, "Out of memory."); 1228 fibril_mutex_unlock(&conn_list_lock); 1229 tcp_conn_unlock(conn); 1230 return; 1231 } 1232 1233 amap_remove(amap, &oldepp); 1234 fibril_mutex_unlock(&conn_list_lock); 1235 1236 conn->name = (char *) "a"; 1237 } 1238 1177 1239 switch (conn->cstate) { 1178 1240 case st_listen: 1179 tcp_conn_sa_listen(conn, seg); break; 1241 tcp_conn_sa_listen(conn, seg); 1242 break; 1180 1243 case st_syn_sent: 1181 tcp_conn_sa_syn_sent(conn, seg); break; 1244 tcp_conn_sa_syn_sent(conn, seg); 1245 break; 1182 1246 case st_syn_received: 1183 1247 case st_established: … … 1189 1253 case st_time_wait: 1190 1254 /* Process segments in order of sequence number */ 1191 tcp_conn_sa_queue(conn, seg); break; 1255 tcp_conn_sa_queue(conn, seg); 1256 break; 1192 1257 case st_closed: 1193 1258 log_msg(LOG_DEFAULT, LVL_DEBUG, "state=%d", (int) conn->cstate); 1194 1259 assert(false); 1195 1260 } 1261 1262 tcp_conn_unlock(conn); 1196 1263 } 1197 1264 … … 1216 1283 1217 1284 log_msg(LOG_DEFAULT, LVL_DEBUG, "%s: TW Timeout -> Closed", conn->name); 1218 tcp_conn_remove(conn);1219 1285 tcp_conn_state_set(conn, st_closed); 1220 1286 … … 1263 1329 } 1264 1330 1265 /** Handle unexpected segment received on a socket pair.1331 /** Handle unexpected segment received on an endpoint pair. 1266 1332 * 1267 1333 * We reply with an RST unless the received segment has RST. 1268 1334 * 1269 * @param sp Socket pair which received the segment1335 * @param sp Endpoint pair which received the segment 1270 1336 * @param seg Unexpected segment 1271 1337 */ 1272 void tcp_unexpected_segment(tcp_sockpair_t *sp, tcp_segment_t *seg) 1273 { 1274 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_unexpected_segment(%p, %p)", sp, seg); 1338 void tcp_unexpected_segment(inet_ep2_t *epp, tcp_segment_t *seg) 1339 { 1340 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_unexpected_segment(%p, %p)", epp, 1341 seg); 1275 1342 1276 1343 if ((seg->ctrl & CTL_RST) == 0) 1277 tcp_reply_rst( sp, seg);1278 } 1279 1280 /** Compute flipped socket pair for response.1281 * 1282 * Flipped socket pair has local and foreign sockets exchanged.1283 * 1284 * @param sp Socket pair1285 * @param f sp Place to store flipped socket pair1286 */ 1287 void tcp_ sockpair_flipped(tcp_sockpair_t *sp, tcp_sockpair_t *fsp)1288 { 1289 f sp->local = sp->foreign;1290 f sp->foreign = sp->local;1344 tcp_reply_rst(epp, seg); 1345 } 1346 1347 /** Compute flipped endpoint pair for response. 1348 * 1349 * Flipped endpoint pair has local and remote endpoints exchanged. 1350 * 1351 * @param epp Endpoint pair 1352 * @param fepp Place to store flipped endpoint pair 1353 */ 1354 void tcp_ep2_flipped(inet_ep2_t *epp, inet_ep2_t *fepp) 1355 { 1356 fepp->local = epp->remote; 1357 fepp->remote = epp->local; 1291 1358 } 1292 1359 1293 1360 /** Send RST in response to an incoming segment. 1294 1361 * 1295 * @param sp Socket pair which received the segment1362 * @param epp Endpoint pair which received the segment 1296 1363 * @param seg Incoming segment 1297 1364 */ 1298 void tcp_reply_rst( tcp_sockpair_t *sp, tcp_segment_t *seg)1365 void tcp_reply_rst(inet_ep2_t *epp, tcp_segment_t *seg) 1299 1366 { 1300 1367 tcp_segment_t *rseg; 1301 1368 1302 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_reply_rst(%p, %p)", sp, seg);1369 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_reply_rst(%p, %p)", epp, seg); 1303 1370 1304 1371 rseg = tcp_segment_make_rst(seg); 1305 tcp_transmit_segment( sp, rseg);1372 tcp_transmit_segment(epp, rseg); 1306 1373 } 1307 1374 -
uspace/srv/net/tcp/conn.h
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #define CONN_H 37 37 38 #include <inet/endpoint.h> 38 39 #include <stdbool.h> 39 40 #include "tcp_type.h" 40 41 41 extern tcp_conn_t *tcp_conn_new(tcp_sock_t *, tcp_sock_t *); 42 extern int tcp_conns_init(void); 43 extern tcp_conn_t *tcp_conn_new(inet_ep2_t *); 42 44 extern void tcp_conn_delete(tcp_conn_t *); 43 extern voidtcp_conn_add(tcp_conn_t *);45 extern int tcp_conn_add(tcp_conn_t *); 44 46 extern void tcp_conn_remove(tcp_conn_t *); 45 47 extern void tcp_conn_reset(tcp_conn_t *conn); … … 47 49 extern void tcp_conn_fin_sent(tcp_conn_t *); 48 50 extern void tcp_conn_ack_of_fin_rcvd(tcp_conn_t *); 49 extern tcp_conn_t *tcp_conn_find_ref( tcp_sockpair_t *);51 extern tcp_conn_t *tcp_conn_find_ref(inet_ep2_t *); 50 52 extern void tcp_conn_addref(tcp_conn_t *); 51 53 extern void tcp_conn_delref(tcp_conn_t *); … … 53 55 extern void tcp_conn_unlock(tcp_conn_t *); 54 56 extern bool tcp_conn_got_syn(tcp_conn_t *); 55 extern void tcp_conn_segment_arrived(tcp_conn_t *, tcp_segment_t *); 57 extern void tcp_conn_segment_arrived(tcp_conn_t *, inet_ep2_t *, 58 tcp_segment_t *); 56 59 extern void tcp_conn_trim_seg_to_wnd(tcp_conn_t *, tcp_segment_t *); 57 extern void tcp_unexpected_segment( tcp_sockpair_t *, tcp_segment_t *);58 extern void tcp_ sockpair_flipped(tcp_sockpair_t *, tcp_sockpair_t *);59 extern void tcp_reply_rst( tcp_sockpair_t *, tcp_segment_t *);60 extern void tcp_unexpected_segment(inet_ep2_t *, tcp_segment_t *); 61 extern void tcp_ep2_flipped(inet_ep2_t *, inet_ep2_t *); 62 extern void tcp_reply_rst(inet_ep2_t *, tcp_segment_t *); 60 63 61 64 #endif -
uspace/srv/net/tcp/ncsim.c
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 42 42 #include <async.h> 43 43 #include <errno.h> 44 #include <inet/endpoint.h> 44 45 #include <io/log.h> 45 46 #include <stdlib.h> … … 65 66 /** Bounce segment through simulator into receive queue. 66 67 * 67 * @param sp Socket pair, oriented for transmission68 * @param epp Endpoint pair, oriented for transmission 68 69 * @param seg Segment 69 70 */ 70 void tcp_ncsim_bounce_seg( tcp_sockpair_t *sp, tcp_segment_t *seg)71 void tcp_ncsim_bounce_seg(inet_ep2_t *epp, tcp_segment_t *seg) 71 72 { 72 73 tcp_squeue_entry_t *sqe; … … 75 76 76 77 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_ncsim_bounce_seg()"); 77 tcp_rqueue_bounce_seg( sp, seg);78 tcp_rqueue_bounce_seg(epp, seg); 78 79 return; 79 80 … … 92 93 93 94 sqe->delay = random() % (1000 * 1000); 94 sqe-> sp = *sp;95 sqe->epp = *epp; 95 96 sqe->seg = seg; 96 97 … … 147 148 148 149 log_msg(LOG_DEFAULT, LVL_DEBUG, "NCSim - End Sleep"); 149 tcp_rqueue_bounce_seg(&sqe-> sp, sqe->seg);150 tcp_rqueue_bounce_seg(&sqe->epp, sqe->seg); 150 151 free(sqe); 151 152 } -
uspace/srv/net/tcp/ncsim.h
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #define NCSIM_H 37 37 38 #include <inet/endpoint.h> 38 39 #include "tcp_type.h" 39 40 40 41 extern void tcp_ncsim_init(void); 41 extern void tcp_ncsim_bounce_seg( tcp_sockpair_t *, tcp_segment_t *);42 extern void tcp_ncsim_bounce_seg(inet_ep2_t *, tcp_segment_t *); 42 43 extern void tcp_ncsim_fibril_start(void); 43 44 -
uspace/srv/net/tcp/pdu.c
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 38 38 #include <byteorder.h> 39 39 #include <errno.h> 40 #include <inet/endpoint.h> 40 41 #include <mem.h> 41 42 #include <stdlib.h> … … 125 126 } 126 127 127 static void tcp_header_setup( tcp_sockpair_t *sp, tcp_segment_t *seg, tcp_header_t *hdr)128 static void tcp_header_setup(inet_ep2_t *epp, tcp_segment_t *seg, tcp_header_t *hdr) 128 129 { 129 130 uint16_t doff_flags; 130 131 uint16_t doff; 131 132 132 hdr->src_port = host2uint16_t_be( sp->local.port);133 hdr->dest_port = host2uint16_t_be( sp->foreign.port);133 hdr->src_port = host2uint16_t_be(epp->local.port); 134 hdr->dest_port = host2uint16_t_be(epp->remote.port); 134 135 hdr->seq = host2uint32_t_be(seg->seq); 135 136 hdr->ack = host2uint32_t_be(seg->ack); … … 190 191 } 191 192 192 static int tcp_header_encode( tcp_sockpair_t *sp, tcp_segment_t *seg,193 static int tcp_header_encode(inet_ep2_t *epp, tcp_segment_t *seg, 193 194 void **header, size_t *size) 194 195 { … … 199 200 return ENOMEM; 200 201 201 tcp_header_setup( sp, seg, hdr);202 tcp_header_setup(epp, seg, hdr); 202 203 *header = hdr; 203 204 *size = sizeof(tcp_header_t); … … 293 294 294 295 /** Decode incoming PDU */ 295 int tcp_pdu_decode(tcp_pdu_t *pdu, tcp_sockpair_t *sp, tcp_segment_t **seg)296 int tcp_pdu_decode(tcp_pdu_t *pdu, inet_ep2_t *epp, tcp_segment_t **seg) 296 297 { 297 298 tcp_segment_t *nseg; … … 307 308 hdr = (tcp_header_t *)pdu->header; 308 309 309 sp->local.port = uint16_t_be2host(hdr->dest_port);310 sp->local.addr = pdu->dest;311 sp->foreign.port = uint16_t_be2host(hdr->src_port);312 sp->foreign.addr = pdu->src;310 epp->local.port = uint16_t_be2host(hdr->dest_port); 311 epp->local.addr = pdu->dest; 312 epp->remote.port = uint16_t_be2host(hdr->src_port); 313 epp->remote.addr = pdu->src; 313 314 314 315 *seg = nseg; … … 317 318 318 319 /** Encode outgoing PDU */ 319 int tcp_pdu_encode( tcp_sockpair_t *sp, tcp_segment_t *seg, tcp_pdu_t **pdu)320 int tcp_pdu_encode(inet_ep2_t *epp, tcp_segment_t *seg, tcp_pdu_t **pdu) 320 321 { 321 322 tcp_pdu_t *npdu; … … 327 328 return ENOMEM; 328 329 329 npdu->src = sp->local.addr;330 npdu->dest = sp->foreign.addr;331 tcp_header_encode( sp, seg, &npdu->header, &npdu->header_size);330 npdu->src = epp->local.addr; 331 npdu->dest = epp->remote.addr; 332 tcp_header_encode(epp, seg, &npdu->header, &npdu->header_size); 332 333 333 334 text_size = tcp_segment_text_size(seg); -
uspace/srv/net/tcp/pdu.h
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #define PDU_H 37 37 38 #include <inet/endpoint.h> 38 39 #include <sys/types.h> 39 40 #include "std.h" … … 42 43 extern tcp_pdu_t *tcp_pdu_create(void *, size_t, void *, size_t); 43 44 extern void tcp_pdu_delete(tcp_pdu_t *); 44 extern int tcp_pdu_decode(tcp_pdu_t *, tcp_sockpair_t *, tcp_segment_t **);45 extern int tcp_pdu_encode( tcp_sockpair_t *, tcp_segment_t *, tcp_pdu_t **);45 extern int tcp_pdu_decode(tcp_pdu_t *, inet_ep2_t *, tcp_segment_t **); 46 extern int tcp_pdu_encode(inet_ep2_t *, tcp_segment_t *, tcp_pdu_t **); 46 47 47 48 #endif -
uspace/srv/net/tcp/rqueue.c
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 67 67 * This is for testing purposes only. 68 68 * 69 * @param sp Socket pair, oriented for transmission69 * @param sp Endpoint pair, oriented for transmission 70 70 * @param seg Segment 71 71 */ 72 void tcp_rqueue_bounce_seg( tcp_sockpair_t *sp, tcp_segment_t *seg)72 void tcp_rqueue_bounce_seg(inet_ep2_t *epp, tcp_segment_t *seg) 73 73 { 74 tcp_sockpair_t rident;74 inet_ep2_t rident; 75 75 76 76 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_rqueue_bounce_seg()"); … … 80 80 tcp_segment_t *dseg; 81 81 82 if (tcp_pdu_encode( sp, seg, &pdu) != EOK) {82 if (tcp_pdu_encode(epp, seg, &pdu) != EOK) { 83 83 log_msg(LOG_DEFAULT, LVL_WARN, "Not enough memory. Segment dropped."); 84 84 return; … … 97 97 #else 98 98 /* Reverse the identification */ 99 tcp_ sockpair_flipped(sp, &rident);99 tcp_ep2_flipped(epp, &rident); 100 100 101 101 /* Insert segment back into rqueue */ … … 106 106 /** Insert segment into receive queue. 107 107 * 108 * @param sp Socket pair, oriented for reception108 * @param epp Endpoint pair, oriented for reception 109 109 * @param seg Segment 110 110 */ 111 void tcp_rqueue_insert_seg( tcp_sockpair_t *sp, tcp_segment_t *seg)111 void tcp_rqueue_insert_seg(inet_ep2_t *epp, tcp_segment_t *seg) 112 112 { 113 113 tcp_rqueue_entry_t *rqe; … … 122 122 } 123 123 124 rqe-> sp = *sp;124 rqe->epp = *epp; 125 125 rqe->seg = seg; 126 126 … … 140 140 rqe = list_get_instance(link, tcp_rqueue_entry_t, link); 141 141 142 tcp_as_segment_arrived(&rqe-> sp, rqe->seg);142 tcp_as_segment_arrived(&rqe->epp, rqe->seg); 143 143 free(rqe); 144 144 } -
uspace/srv/net/tcp/rqueue.h
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #define RQUEUE_H 37 37 38 #include <inet/endpoint.h> 38 39 #include "tcp_type.h" 39 40 40 41 extern void tcp_rqueue_init(void); 41 extern void tcp_rqueue_bounce_seg( tcp_sockpair_t *, tcp_segment_t *);42 extern void tcp_rqueue_insert_seg( tcp_sockpair_t *, tcp_segment_t *);42 extern void tcp_rqueue_bounce_seg(inet_ep2_t *, tcp_segment_t *); 43 extern void tcp_rqueue_insert_seg(inet_ep2_t *, tcp_segment_t *); 43 44 extern void tcp_rqueue_handler(void *); 44 45 extern void tcp_rqueue_fibril_start(void); -
uspace/srv/net/tcp/service.h
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 30 30 * @{ 31 31 */ 32 /** @file Socket provider32 /** @file HelenOS service implementation 33 33 */ 34 34 35 #ifndef S OCK_H36 #define S OCK_H35 #ifndef SERVICE_H 36 #define SERVICE_H 37 37 38 #include <async.h> 39 40 extern int tcp_sock_init(void); 38 extern int tcp_service_init(void); 41 39 42 40 #endif -
uspace/srv/net/tcp/tcp.c
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 42 42 #include <io/log.h> 43 43 #include <stdio.h> 44 #include <stdlib.h> 44 45 #include <task.h> 45 46 47 #include "conn.h" 46 48 #include "ncsim.h" 47 49 #include "pdu.h" 48 50 #include "rqueue.h" 49 #include "s ock.h"51 #include "service.h" 50 52 #include "std.h" 51 53 #include "tcp.h" … … 159 161 { 160 162 tcp_segment_t *dseg; 161 tcp_sockpair_t rident;163 inet_ep2_t rident; 162 164 163 165 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_received_pdu()"); … … 178 180 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_init()"); 179 181 182 rc = tcp_conns_init(); 183 if (rc != EOK) { 184 assert(rc == ENOMEM); 185 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing connections"); 186 return ENOMEM; 187 } 188 180 189 tcp_rqueue_init(); 181 190 tcp_rqueue_fibril_start(); … … 192 201 } 193 202 194 rc = tcp_s ock_init();195 if (rc != EOK) { 196 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing s ocket service.");203 rc = tcp_service_init(); 204 if (rc != EOK) { 205 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing service."); 197 206 return ENOENT; 198 207 } -
uspace/srv/net/tcp/tcp_type.h
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 41 41 #include <fibril.h> 42 42 #include <fibril_synch.h> 43 #include <socket_core.h>44 43 #include <sys/types.h> 45 44 #include <inet/addr.h> 45 #include <inet/endpoint.h> 46 46 47 47 struct tcp_conn; … … 90 90 /* Connection reset */ 91 91 TCP_ERESET, 92 /* Foreign socket unspecified */92 /* Remote endpoint unspecified */ 93 93 TCP_EUNSPEC, 94 94 /* Insufficient resources */ … … 97 97 TCP_EINVPREC, 98 98 /* Security/compartment not allowed */ 99 TCP_EINVCOMP 99 TCP_EINVCOMP, 100 TCP_EAGAIN 100 101 } tcp_error_t; 101 102 … … 112 113 } tcp_control_t; 113 114 114 typedef struct {115 inet_addr_t addr;116 uint16_t port;117 } tcp_sock_t;118 119 enum tcp_port {120 TCP_PORT_ANY = 0121 };122 123 typedef struct {124 tcp_sock_t local;125 tcp_sock_t foreign;126 } tcp_sockpair_t;127 128 115 /** Connection incoming segments queue */ 129 116 typedef struct { … … 155 142 typedef void (*tcp_cstate_cb_t)(tcp_conn_t *, void *); 156 143 144 /** Connection callbacks */ 145 typedef struct { 146 void (*cstate_change)(tcp_conn_t *, void *, tcp_cstate_t); 147 void (*recv_data)(tcp_conn_t *, void *); 148 } tcp_cb_t; 149 157 150 /** Connection */ 158 151 struct tcp_conn { … … 160 153 link_t link; 161 154 162 /** Connection state change callbackfunction */163 tcp_c state_cb_t cstate_cb;155 /** Connection callbacks function */ 156 tcp_cb_t *cb; 164 157 /** Argument to @c cstate_cb */ 165 void *c state_cb_arg;166 167 /** Connection identification (local and foreign socket) */168 tcp_sockpair_t ident;158 void *cb_arg; 159 160 /** Connection identification (local and remote endpoint) */ 161 inet_ep2_t ident; 169 162 170 163 /** Active or passive connection */ … … 274 267 typedef struct { 275 268 link_t link; 276 tcp_sockpair_t sp;269 inet_ep2_t epp; 277 270 tcp_segment_t *seg; 278 271 } tcp_rqueue_entry_t; … … 282 275 link_t link; 283 276 suseconds_t delay; 284 tcp_sockpair_t sp;277 inet_ep2_t epp; 285 278 tcp_segment_t *seg; 286 279 } tcp_squeue_entry_t; … … 319 312 } tcp_pdu_t; 320 313 321 typedef struct { 322 async_sess_t *sess; 323 socket_cores_t sockets; 324 } tcp_client_t; 325 326 #define TCP_SOCK_FRAGMENT_SIZE 1024 327 328 typedef struct tcp_sockdata { 329 /** Lock */ 330 fibril_mutex_t lock; 331 /** Socket core */ 332 socket_core_t *sock_core; 333 /** Client */ 334 tcp_client_t *client; 314 /** TCP client connection */ 315 typedef struct tcp_cconn { 335 316 /** Connection */ 336 317 tcp_conn_t *conn; 337 /** Local address */ 338 inet_addr_t laddr; 339 /** Backlog size */ 340 int backlog; 341 /** Array of listening connections, @c backlog elements */ 342 struct tcp_sock_lconn **lconn; 343 /** List of connections (from lconn) that are ready to be accepted */ 344 list_t ready; 345 /** Receiving fibril */ 346 fid_t recv_fibril; 347 uint8_t recv_buffer[TCP_SOCK_FRAGMENT_SIZE]; 348 size_t recv_buffer_used; 349 fibril_mutex_t recv_buffer_lock; 350 fibril_condvar_t recv_buffer_cv; 351 tcp_error_t recv_error; 352 } tcp_sockdata_t; 353 354 typedef struct tcp_sock_lconn { 318 /** Connection ID for the client */ 319 sysarg_t id; 320 /** Client */ 321 struct tcp_client *client; 322 link_t lclient; 323 } tcp_cconn_t; 324 325 /** TCP client listener */ 326 typedef struct tcp_clst { 327 /** Local endpoint */ 328 inet_ep_t elocal; 329 /** Connection */ 355 330 tcp_conn_t *conn; 356 tcp_sockdata_t *socket; 357 int index; 358 link_t ready_list; 359 } tcp_sock_lconn_t; 360 331 /** Listener ID for the client */ 332 sysarg_t id; 333 /** Client */ 334 struct tcp_client *client; 335 /** Link to tcp_client_t.clst */ 336 link_t lclient; 337 } tcp_clst_t; 338 339 /** TCP client */ 340 typedef struct tcp_client { 341 /** Client callbac session */ 342 async_sess_t *sess; 343 /** Client's connections */ 344 list_t cconn; /* of tcp_cconn_t */ 345 /** Client's listeners */ 346 list_t clst; 347 } tcp_client_t; 361 348 362 349 #endif -
uspace/srv/net/tcp/test.c
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 50 50 { 51 51 tcp_conn_t *conn; 52 tcp_sock_t lsock; 53 tcp_sock_t fsock; 52 inet_ep2_t epp; 54 53 char rcv_buf[RCV_BUF_SIZE + 1]; 55 54 size_t rcvd; … … 57 56 58 57 printf("test_srv()\n"); 59 60 inet_addr(&lsock.addr, 127, 0, 0, 1); 61 lsock.port = 80; 62 63 inet_addr(&fsock.addr, 127, 0, 0, 1); 64 fsock.port = 1024; 65 58 59 inet_ep2_init(&epp); 60 61 inet_addr(&epp.local.addr, 127, 0, 0, 1); 62 epp.local.port = 80; 63 64 inet_addr(&epp.remote.addr, 127, 0, 0, 1); 65 epp.remote.port = 1024; 66 66 67 printf("S: User open...\n"); 67 tcp_uc_open(& lsock, &fsock, ap_passive, 0, &conn);68 tcp_uc_open(&epp, ap_passive, 0, &conn); 68 69 conn->name = (char *) "S"; 69 70 … … 93 94 { 94 95 tcp_conn_t *conn; 95 tcp_sock_t lsock; 96 tcp_sock_t fsock; 96 inet_ep2_t epp; 97 97 const char *msg = "Hello World!"; 98 98 99 99 printf("test_cli()\n"); 100 101 inet_addr(&lsock.addr, 127, 0, 0, 1); 102 lsock.port = 1024; 103 104 inet_addr(&fsock.addr, 127, 0, 0, 1); 105 fsock.port = 80; 100 101 inet_ep2_init(&epp); 102 103 inet_addr(&epp.local.addr, 127, 0, 0, 1); 104 epp.local.port = 1024; 105 106 inet_addr(&epp.remote.addr, 127, 0, 0, 1); 107 epp.remote.port = 80; 106 108 107 109 async_usleep(1000*1000*3); 108 110 printf("C: User open...\n"); 109 tcp_uc_open(& lsock, &fsock, ap_active, 0, &conn);111 tcp_uc_open(&epp, ap_active, 0, &conn); 110 112 conn->name = (char *) "C"; 111 113 -
uspace/srv/net/tcp/tqueue.c
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 282 282 } 283 283 284 void tcp_transmit_segment( tcp_sockpair_t *sp, tcp_segment_t *seg)284 void tcp_transmit_segment(inet_ep2_t *epp, tcp_segment_t *seg) 285 285 { 286 286 log_msg(LOG_DEFAULT, LVL_DEBUG, 287 "tcp_transmit_segment( f:(%u),l:(%u), %p)",288 sp->local.port, sp->foreign.port, seg);289 287 "tcp_transmit_segment(l:(%u),f:(%u), %p)", 288 epp->local.port, epp->remote.port, seg); 289 290 290 log_msg(LOG_DEFAULT, LVL_DEBUG, "SEG.SEQ=%" PRIu32 ", SEG.WND=%" PRIu32, 291 291 seg->seq, seg->wnd); … … 301 301 tcp_pdu_t *pdu; 302 302 303 if (tcp_pdu_encode( sp, seg, &pdu) != EOK) {303 if (tcp_pdu_encode(epp, seg, &pdu) != EOK) { 304 304 log_msg(LOG_DEFAULT, LVL_WARN, "Not enough memory. Segment dropped."); 305 305 return; … … 351 351 352 352 /* Reset retransmission timer */ 353 tcp_tqueue_timer_set(tqe->conn); 353 fibril_timer_set_locked(conn->retransmit.timer, RETRANSMIT_TIMEOUT, 354 retransmit_timeout_func, (void *) conn); 354 355 355 356 tcp_conn_unlock(conn); 356 tcp_conn_delref(conn);357 357 358 358 log_msg(LOG_DEFAULT, LVL_DEBUG, "### %s: retransmit_timeout_func(%p) end", conn->name, conn); -
uspace/srv/net/tcp/tqueue.h
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #define TQUEUE_H 37 37 38 #include <inet/endpoint.h> 38 39 #include "std.h" 39 40 #include "tcp_type.h" … … 48 49 extern void tcp_prepare_transmit_segment(tcp_conn_t *, tcp_segment_t *); 49 50 extern void tcp_conn_transmit_segment(tcp_conn_t *, tcp_segment_t *); 50 extern void tcp_transmit_segment( tcp_sockpair_t *, tcp_segment_t *);51 extern void tcp_transmit_segment(inet_ep2_t *, tcp_segment_t *); 51 52 extern void tcp_header_setup(tcp_conn_t *, tcp_segment_t *, tcp_header_t *); 52 53 extern void tcp_phdr_setup(tcp_conn_t *, tcp_segment_t *, tcp_phdr_t *); -
uspace/srv/net/tcp/ucall.c
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 35 35 */ 36 36 37 #include <errno.h> 37 38 #include <fibril_synch.h> 38 39 #include <io/log.h> … … 50 51 /** OPEN user call 51 52 * 52 * @param lsock Local socket 53 * @param fsock Foreign socket 53 * @param epp Endpoint pair 54 54 * @param acpass Active/passive 55 55 * @param oflags Open flags … … 65 65 * establishment. 66 66 */ 67 tcp_error_t tcp_uc_open( tcp_sock_t *lsock, tcp_sock_t *fsock, acpass_t acpass,67 tcp_error_t tcp_uc_open(inet_ep2_t *epp, acpass_t acpass, 68 68 tcp_open_flags_t oflags, tcp_conn_t **conn) 69 69 { 70 70 tcp_conn_t *nconn; 71 72 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open(%p, %p, %s, %s, %p)", 73 lsock, fsock, acpass == ap_active ? "active" : "passive", 71 int rc; 72 73 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_open(%p, %s, %s, %p)", 74 epp, acpass == ap_active ? "active" : "passive", 74 75 oflags == tcp_open_nonblock ? "nonblock" : "none", conn); 75 76 76 nconn = tcp_conn_new(lsock, fsock); 77 tcp_conn_add(nconn); 77 nconn = tcp_conn_new(epp); 78 rc = tcp_conn_add(nconn); 79 if (rc != EOK) { 80 tcp_conn_delete(nconn); 81 return TCP_EEXISTS; 82 } 83 78 84 tcp_conn_lock(nconn); 79 85 … … 188 194 /* Wait for data to become available */ 189 195 while (conn->rcv_buf_used == 0 && !conn->rcv_buf_fin && !conn->reset) { 196 tcp_conn_unlock(conn); 197 return TCP_EAGAIN; 190 198 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_receive() - wait for data"); 191 199 fibril_condvar_wait(&conn->rcv_buf_cv, &conn->lock); … … 250 258 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_close - listen/syn_sent"); 251 259 tcp_conn_reset(conn); 252 tcp_conn_remove(conn);253 260 tcp_conn_unlock(conn); 254 261 return TCP_EOK; … … 294 301 } 295 302 296 void tcp_uc_set_c state_cb(tcp_conn_t *conn, tcp_cstate_cb_tcb, void *arg)297 { 298 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_set_c tate_cb(%p, %p, %p)",303 void tcp_uc_set_cb(tcp_conn_t *conn, tcp_cb_t *cb, void *arg) 304 { 305 log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_uc_set_cb(%p, %p, %p)", 299 306 conn, cb, arg); 300 307 301 conn->cstate_cb = cb; 302 conn->cstate_cb_arg = arg; 308 conn->cb = cb; 309 conn->cb_arg = arg; 310 } 311 312 void *tcp_uc_get_userptr(tcp_conn_t *conn) 313 { 314 return conn->cb_arg; 303 315 } 304 316 … … 308 320 309 321 /** Segment arrived */ 310 void tcp_as_segment_arrived( tcp_sockpair_t *sp, tcp_segment_t *seg)322 void tcp_as_segment_arrived(inet_ep2_t *epp, tcp_segment_t *seg) 311 323 { 312 324 tcp_conn_t *conn; … … 314 326 log_msg(LOG_DEFAULT, LVL_DEBUG, 315 327 "tcp_as_segment_arrived(f:(%u), l:(%u))", 316 sp->foreign.port, sp->local.port);317 318 conn = tcp_conn_find_ref( sp);328 epp->remote.port, epp->local.port); 329 330 conn = tcp_conn_find_ref(epp); 319 331 if (conn == NULL) { 320 332 log_msg(LOG_DEFAULT, LVL_WARN, "No connection found."); 321 tcp_unexpected_segment( sp, seg);333 tcp_unexpected_segment(epp, seg); 322 334 return; 323 335 } 324 336 325 tcp_conn_lock(conn); 326 327 if (conn->cstate == st_closed) { 328 log_msg(LOG_DEFAULT, LVL_WARN, "Connection is closed."); 329 tcp_unexpected_segment(sp, seg); 330 tcp_conn_unlock(conn); 331 tcp_conn_delref(conn); 332 return; 333 } 334 335 if (inet_addr_is_any(&conn->ident.foreign.addr)) 336 conn->ident.foreign.addr = sp->foreign.addr; 337 338 if (conn->ident.foreign.port == TCP_PORT_ANY) 339 conn->ident.foreign.port = sp->foreign.port; 340 341 if (inet_addr_is_any(&conn->ident.local.addr)) 342 conn->ident.local.addr = sp->local.addr; 343 344 tcp_conn_segment_arrived(conn, seg); 345 346 tcp_conn_unlock(conn); 337 tcp_conn_segment_arrived(conn, epp, seg); 347 338 tcp_conn_delref(conn); 348 339 } -
uspace/srv/net/tcp/ucall.h
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 1Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #define UCALL_H 37 37 38 #include <inet/endpoint.h> 38 39 #include <sys/types.h> 39 40 #include "tcp_type.h" … … 42 43 * User calls 43 44 */ 44 extern tcp_error_t tcp_uc_open( tcp_sock_t *, tcp_sock_t *, acpass_t,45 extern tcp_error_t tcp_uc_open(inet_ep2_t *, acpass_t, 45 46 tcp_open_flags_t, tcp_conn_t **); 46 47 extern tcp_error_t tcp_uc_send(tcp_conn_t *, void *, size_t, xflags_t); … … 50 51 extern void tcp_uc_status(tcp_conn_t *, tcp_conn_status_t *); 51 52 extern void tcp_uc_delete(tcp_conn_t *); 52 extern void tcp_uc_set_cstate_cb(tcp_conn_t *, tcp_cstate_cb_t, void *); 53 extern void tcp_uc_set_cb(tcp_conn_t *, tcp_cb_t *, void *); 54 extern void *tcp_uc_get_userptr(tcp_conn_t *); 53 55 54 56 /* 55 57 * Arriving segments 56 58 */ 57 extern void tcp_as_segment_arrived( tcp_sockpair_t *, tcp_segment_t *);59 extern void tcp_as_segment_arrived(inet_ep2_t *, tcp_segment_t *); 58 60 59 61 /* -
uspace/srv/net/udp/Makefile
rdf2bce32 rfb4d788 28 28 29 29 USPACE_PREFIX = ../../.. 30 LIBS = $(LIBNET_PREFIX)/libnet.a 31 EXTRA_CFLAGS = -I$(LIBNET_PREFIX)/include 30 31 LIBS = \ 32 $(LIBNETTL_PREFIX)/libnettl.a 33 34 EXTRA_CFLAGS += \ 35 -I$(LIBNETTL_PREFIX)/include 36 32 37 BINARY = udp 33 38 … … 35 40 assoc.c \ 36 41 msg.c \ 37 sock.c \38 42 pdu.c \ 39 ucall.c \43 service.c \ 40 44 udp.c \ 41 45 udp_inet.c -
uspace/srv/net/udp/assoc.c
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 37 37 #include <adt/list.h> 38 #include <errno.h> 38 39 #include <stdbool.h> 39 40 #include <fibril_synch.h> 41 #include <inet/endpoint.h> 40 42 #include <io/log.h> 43 #include <nettl/amap.h> 41 44 #include <stdlib.h> 42 45 … … 44 47 #include "msg.h" 45 48 #include "pdu.h" 46 #include "ucall.h"47 49 #include "udp_inet.h" 48 50 #include "udp_type.h" 49 51 50 LIST_INITIALIZE(assoc_list); 51 FIBRIL_MUTEX_INITIALIZE(assoc_list_lock); 52 53 static udp_assoc_t *udp_assoc_find_ref(udp_sockpair_t *); 54 static int udp_assoc_queue_msg(udp_assoc_t *, udp_sockpair_t *, udp_msg_t *); 55 static bool udp_socket_match(udp_sock_t *, udp_sock_t *); 56 static bool udp_sockpair_match(udp_sockpair_t *, udp_sockpair_t *); 52 static LIST_INITIALIZE(assoc_list); 53 static FIBRIL_MUTEX_INITIALIZE(assoc_list_lock); 54 static amap_t *amap; 55 56 static udp_assoc_t *udp_assoc_find_ref(inet_ep2_t *); 57 static int udp_assoc_queue_msg(udp_assoc_t *, inet_ep2_t *, udp_msg_t *); 58 59 /** Initialize associations. */ 60 int udp_assocs_init(void) 61 { 62 int rc; 63 64 rc = amap_create(&amap); 65 if (rc != EOK) { 66 assert(rc == ENOMEM); 67 return ENOMEM; 68 } 69 70 return EOK; 71 } 57 72 58 73 /** Create new association structure. 59 74 * 60 * @param lsock Local socket (will be deeply copied) 61 * @param fsock Foreign socket (will be deeply copied) 75 * @param epp Endpoint pair (will be copied) 76 * @param cb Callbacks 77 * @param cb_arg Callback argument 62 78 * @return New association or NULL 63 79 */ 64 udp_assoc_t *udp_assoc_new( udp_sock_t *lsock, udp_sock_t *fsock)80 udp_assoc_t *udp_assoc_new(inet_ep2_t *epp, udp_assoc_cb_t *cb, void *cb_arg) 65 81 { 66 82 udp_assoc_t *assoc = NULL; … … 80 96 fibril_condvar_initialize(&assoc->rcv_queue_cv); 81 97 82 if (lsock != NULL) 83 assoc->ident.local = *lsock; 84 85 if (fsock != NULL) 86 assoc->ident.foreign = *fsock; 87 98 if (epp != NULL) 99 assoc->ident = *epp; 100 101 assoc->cb = cb; 102 assoc->cb_arg = cb_arg; 88 103 return assoc; 89 104 error: … … 166 181 * Add association to the association map. 167 182 */ 168 void udp_assoc_add(udp_assoc_t *assoc) 169 { 183 int udp_assoc_add(udp_assoc_t *assoc) 184 { 185 inet_ep2_t aepp; 186 int rc; 187 170 188 udp_assoc_addref(assoc); 171 189 fibril_mutex_lock(&assoc_list_lock); 190 191 rc = amap_insert(amap, &assoc->ident, assoc, af_allow_system, &aepp); 192 if (rc != EOK) { 193 udp_assoc_delref(assoc); 194 fibril_mutex_unlock(&assoc_list_lock); 195 return rc; 196 } 197 198 assoc->ident = aepp; 172 199 list_append(&assoc->link, &assoc_list); 173 200 fibril_mutex_unlock(&assoc_list_lock); 201 202 return EOK; 174 203 } 175 204 … … 181 210 { 182 211 fibril_mutex_lock(&assoc_list_lock); 212 amap_remove(amap, &assoc->ident); 183 213 list_remove(&assoc->link); 184 214 fibril_mutex_unlock(&assoc_list_lock); … … 196 226 assoc, iplink); 197 227 fibril_mutex_lock(&assoc->lock); 198 assoc->ident. iplink = iplink;228 assoc->ident.local_link = iplink; 199 229 fibril_mutex_unlock(&assoc->lock); 200 230 } 201 231 202 /** Set foreign socket in association.203 *204 * @param assoc Association205 * @param fsock Foreign socket (deeply copied)206 */207 void udp_assoc_set_foreign(udp_assoc_t *assoc, udp_sock_t *fsock)208 {209 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_set_foreign(%p, %p)", assoc, fsock);210 fibril_mutex_lock(&assoc->lock);211 assoc->ident.foreign = *fsock;212 fibril_mutex_unlock(&assoc->lock);213 }214 215 /** Set local socket in association.216 *217 * @param assoc Association218 * @param lsock Local socket (deeply copied)219 *220 */221 void udp_assoc_set_local(udp_assoc_t *assoc, udp_sock_t *lsock)222 {223 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_set_local(%p, %p)", assoc, lsock);224 fibril_mutex_lock(&assoc->lock);225 assoc->ident.local = *lsock;226 fibril_mutex_unlock(&assoc->lock);227 }228 229 /** Set local port in association.230 *231 * @param assoc Association232 * @param lport Local port233 *234 */235 void udp_assoc_set_local_port(udp_assoc_t *assoc, uint16_t lport)236 {237 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_set_local(%p, %" PRIu16 ")", assoc, lport);238 fibril_mutex_lock(&assoc->lock);239 assoc->ident.local.port = lport;240 fibril_mutex_unlock(&assoc->lock);241 }242 243 232 /** Send message to association. 244 233 * 245 234 * @param assoc Association 246 * @param fsock Foreign socket or NULL not to override @a assoc235 * @param remote Remote endpoint or NULL not to override @a assoc 247 236 * @param msg Message 248 237 * 249 238 * @return EOK on success 250 * EINVAL if foreign socket is not set239 * EINVAL if remote endpoint is not set 251 240 * ENOMEM if out of resources 252 241 * EIO if no route to destination exists 253 242 */ 254 int udp_assoc_send(udp_assoc_t *assoc, udp_sock_t *fsock, udp_msg_t *msg)243 int udp_assoc_send(udp_assoc_t *assoc, inet_ep_t *remote, udp_msg_t *msg) 255 244 { 256 245 udp_pdu_t *pdu; 257 udp_sockpair_t sp;246 inet_ep2_t epp; 258 247 int rc; 259 248 260 249 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send(%p, %p, %p)", 261 assoc, fsock, msg); 262 263 /* @a fsock can be used to override the foreign socket */ 264 sp = assoc->ident; 265 if (fsock != NULL) 266 sp.foreign = *fsock; 267 268 if ((inet_addr_is_any(&sp.foreign.addr)) || 269 (sp.foreign.port == UDP_PORT_ANY)) 250 assoc, remote, msg); 251 252 /* @a remote can be used to override the remote endpoint */ 253 epp = assoc->ident; 254 if (remote != NULL) 255 epp.remote = *remote; 256 257 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send - check addr any"); 258 259 if ((inet_addr_is_any(&epp.remote.addr)) || 260 (epp.remote.port == inet_port_any)) 270 261 return EINVAL; 271 262 272 rc = udp_pdu_encode(&sp, msg, &pdu); 263 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send - check version"); 264 265 if (epp.remote.addr.version != epp.local.addr.version) 266 return EINVAL; 267 268 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send - encode pdu"); 269 270 rc = udp_pdu_encode(&epp, msg, &pdu); 273 271 if (rc != EOK) 274 272 return ENOMEM; 275 273 274 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send - transmit"); 275 276 276 rc = udp_transmit_pdu(pdu); 277 277 udp_pdu_delete(pdu); … … 280 280 return EIO; 281 281 282 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_send - success"); 282 283 return EOK; 283 284 } … … 287 288 * Pull one message from the association's receive queue. 288 289 */ 289 int udp_assoc_recv(udp_assoc_t *assoc, udp_msg_t **msg, udp_sock_t *fsock)290 int udp_assoc_recv(udp_assoc_t *assoc, udp_msg_t **msg, inet_ep_t *remote) 290 291 { 291 292 link_t *link; … … 303 304 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_recv() - association was reset"); 304 305 fibril_mutex_unlock(&assoc->lock); 305 return E CONNABORTED;306 return ENXIO; 306 307 } 307 308 … … 313 314 314 315 *msg = rqe->msg; 315 * fsock = rqe->sp.foreign;316 *remote = rqe->epp.remote; 316 317 free(rqe); 317 318 … … 323 324 * Find the association to which the message belongs and queue it. 324 325 */ 325 void udp_assoc_received( udp_sockpair_t *rsp, udp_msg_t *msg)326 void udp_assoc_received(inet_ep2_t *repp, udp_msg_t *msg) 326 327 { 327 328 udp_assoc_t *assoc; 328 329 int rc; 329 330 330 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_received(%p, %p)", r sp, msg);331 332 assoc = udp_assoc_find_ref(r sp);331 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_received(%p, %p)", repp, msg); 332 333 assoc = udp_assoc_find_ref(repp); 333 334 if (assoc == NULL) { 334 335 log_msg(LOG_DEFAULT, LVL_DEBUG, "No association found. Message dropped."); … … 339 340 } 340 341 341 rc = udp_assoc_queue_msg(assoc, rsp, msg); 342 if (rc != EOK) { 343 log_msg(LOG_DEFAULT, LVL_DEBUG, "Out of memory. Message dropped."); 342 if (0) { 343 rc = udp_assoc_queue_msg(assoc, repp, msg); 344 if (rc != EOK) { 345 log_msg(LOG_DEFAULT, LVL_DEBUG, "Out of memory. Message dropped."); 344 346 /* XXX Generate ICMP error? */ 345 } 347 } 348 } 349 350 log_msg(LOG_DEFAULT, LVL_DEBUG, "call assoc->cb->recv_msg"); 351 assoc->cb->recv_msg(assoc->cb_arg, repp, msg); 352 udp_assoc_delref(assoc); 346 353 } 347 354 … … 359 366 } 360 367 361 static int udp_assoc_queue_msg(udp_assoc_t *assoc, udp_sockpair_t *sp,368 static int udp_assoc_queue_msg(udp_assoc_t *assoc, inet_ep2_t *epp, 362 369 udp_msg_t *msg) 363 370 { … … 365 372 366 373 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_queue_msg(%p, %p, %p)", 367 assoc, sp, msg);374 assoc, epp, msg); 368 375 369 376 rqe = calloc(1, sizeof(udp_rcv_queue_entry_t)); … … 372 379 373 380 link_initialize(&rqe->link); 374 rqe-> sp = *sp;381 rqe->epp = *epp; 375 382 rqe->msg = msg; 376 383 … … 384 391 } 385 392 386 /** Match socket with pattern. */ 387 static bool udp_socket_match(udp_sock_t *sock, udp_sock_t *patt) 388 { 389 log_msg(LOG_DEFAULT, LVL_DEBUG, 390 "udp_socket_match(sock=(%u), pat=(%u))", sock->port, patt->port); 391 392 if ((!inet_addr_is_any(&patt->addr)) && 393 (!inet_addr_compare(&patt->addr, &sock->addr))) 394 return false; 395 396 if ((patt->port != UDP_PORT_ANY) && 397 (patt->port != sock->port)) 398 return false; 399 400 log_msg(LOG_DEFAULT, LVL_DEBUG, " -> match"); 401 402 return true; 403 } 404 405 /** Match socket pair with pattern. */ 406 static bool udp_sockpair_match(udp_sockpair_t *sp, udp_sockpair_t *pattern) 407 { 408 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sockpair_match(%p, %p)", sp, pattern); 409 410 if (!udp_socket_match(&sp->local, &pattern->local)) 411 return false; 412 413 if (!udp_socket_match(&sp->foreign, &pattern->foreign)) 414 return false; 415 416 log_msg(LOG_DEFAULT, LVL_DEBUG, "Socket pair matched."); 417 return true; 418 } 419 420 421 /** Find association structure for specified socket pair. 422 * 423 * An association is uniquely identified by a socket pair. Look up our 424 * association map and return association structure based on socket pair. 393 /** Find association structure for specified endpoint pair. 394 * 395 * An association is uniquely identified by an endpoint pair. Look up our 396 * association map and return association structure based on endpoint pair. 425 397 * The association reference count is bumped by one. 426 398 * 427 * @param sp Socket pair399 * @param epp Endpoint pair 428 400 * @return Association structure or NULL if not found. 429 401 */ 430 static udp_assoc_t *udp_assoc_find_ref(udp_sockpair_t *sp) 431 { 432 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_find_ref(%p)", sp); 433 402 static udp_assoc_t *udp_assoc_find_ref(inet_ep2_t *epp) 403 { 404 int rc; 405 void *arg; 406 udp_assoc_t *assoc; 407 408 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_assoc_find_ref(%p)", epp); 434 409 fibril_mutex_lock(&assoc_list_lock); 435 436 list_foreach(assoc_list, link, udp_assoc_t, assoc) { 437 udp_sockpair_t *asp = &assoc->ident; 438 439 /* Skip unbound associations */ 440 if (asp->local.port == UDP_PORT_ANY) 441 continue; 442 443 if (udp_sockpair_match(sp, asp)) { 444 log_msg(LOG_DEFAULT, LVL_DEBUG, "Returning assoc %p", assoc); 445 udp_assoc_addref(assoc); 446 fibril_mutex_unlock(&assoc_list_lock); 447 return assoc; 448 } 449 } 450 410 411 rc = amap_find_match(amap, epp, &arg); 412 if (rc != EOK) { 413 assert(rc == ENOMEM); 414 fibril_mutex_unlock(&assoc_list_lock); 415 return NULL; 416 } 417 418 assoc = (udp_assoc_t *)arg; 419 udp_assoc_addref(assoc); 420 451 421 fibril_mutex_unlock(&assoc_list_lock); 452 return NULL;422 return assoc; 453 423 } 454 424 -
uspace/srv/net/udp/assoc.h
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #define ASSOC_H 37 37 38 #include <inet/endpoint.h> 38 39 #include <ipc/loc.h> 39 40 #include <sys/types.h> 40 41 #include "udp_type.h" 41 42 42 extern udp_assoc_t *udp_assoc_new(udp_sock_t *, udp_sock_t *); 43 extern int udp_assocs_init(void); 44 extern udp_assoc_t *udp_assoc_new(inet_ep2_t *, udp_assoc_cb_t *, void *); 43 45 extern void udp_assoc_delete(udp_assoc_t *); 44 extern voidudp_assoc_add(udp_assoc_t *);46 extern int udp_assoc_add(udp_assoc_t *); 45 47 extern void udp_assoc_remove(udp_assoc_t *); 46 48 extern void udp_assoc_addref(udp_assoc_t *); 47 49 extern void udp_assoc_delref(udp_assoc_t *); 48 50 extern void udp_assoc_set_iplink(udp_assoc_t *, service_id_t); 49 extern void udp_assoc_set_foreign(udp_assoc_t *, udp_sock_t *); 50 extern void udp_assoc_set_local(udp_assoc_t *, udp_sock_t *); 51 extern void udp_assoc_set_local_port(udp_assoc_t *, uint16_t); 52 extern int udp_assoc_send(udp_assoc_t *, udp_sock_t *, udp_msg_t *); 53 extern int udp_assoc_recv(udp_assoc_t *, udp_msg_t **, udp_sock_t *); 54 extern void udp_assoc_received(udp_sockpair_t *, udp_msg_t *); 51 extern int udp_assoc_send(udp_assoc_t *, inet_ep_t *, udp_msg_t *); 52 extern int udp_assoc_recv(udp_assoc_t *, udp_msg_t **, inet_ep_t *); 53 extern void udp_assoc_received(inet_ep2_t *, udp_msg_t *); 55 54 extern void udp_assoc_reset(udp_assoc_t *); 56 55 -
uspace/srv/net/udp/msg.c
rdf2bce32 rfb4d788 50 50 void udp_msg_delete(udp_msg_t *msg) 51 51 { 52 free(msg->data); 52 53 free(msg); 53 54 } -
uspace/srv/net/udp/pdu.c
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 41 41 #include <stdlib.h> 42 42 #include <inet/addr.h> 43 #include <net/socket_codes.h>44 43 #include "msg.h" 45 44 #include "pdu.h" … … 163 162 164 163 /** Decode incoming PDU */ 165 int udp_pdu_decode(udp_pdu_t *pdu, udp_sockpair_t *sp, udp_msg_t **msg)164 int udp_pdu_decode(udp_pdu_t *pdu, inet_ep2_t *epp, udp_msg_t **msg) 166 165 { 167 166 udp_msg_t *nmsg; … … 180 179 hdr = (udp_header_t *)pdu->data; 181 180 182 sp->foreign.port = uint16_t_be2host(hdr->src_port); 183 sp->foreign.addr = pdu->src; 184 sp->local.port = uint16_t_be2host(hdr->dest_port); 185 sp->local.addr = pdu->dest; 181 epp->local_link = pdu->iplink; 182 epp->remote.port = uint16_t_be2host(hdr->src_port); 183 epp->remote.addr = pdu->src; 184 epp->local.port = uint16_t_be2host(hdr->dest_port); 185 epp->local.addr = pdu->dest; 186 186 187 187 length = uint16_t_be2host(hdr->length); … … 197 197 return ENOMEM; 198 198 199 nmsg->data = text;200 199 nmsg->data_size = length - sizeof(udp_header_t); 200 nmsg->data = malloc(nmsg->data_size); 201 if (nmsg->data == NULL) 202 return ENOMEM; 203 204 memcpy(nmsg->data, text, nmsg->data_size); 201 205 202 206 *msg = nmsg; … … 205 209 206 210 /** Encode outgoing PDU */ 207 int udp_pdu_encode( udp_sockpair_t *sp, udp_msg_t *msg, udp_pdu_t **pdu)211 int udp_pdu_encode(inet_ep2_t *epp, udp_msg_t *msg, udp_pdu_t **pdu) 208 212 { 209 213 udp_pdu_t *npdu; … … 215 219 return ENOMEM; 216 220 217 npdu->iplink = sp->iplink;218 npdu->src = sp->local.addr;219 npdu->dest = sp->foreign.addr;221 npdu->iplink = epp->local_link; 222 npdu->src = epp->local.addr; 223 npdu->dest = epp->remote.addr; 220 224 221 225 npdu->data_size = sizeof(udp_header_t) + msg->data_size; … … 227 231 228 232 hdr = (udp_header_t *)npdu->data; 229 hdr->src_port = host2uint16_t_be( sp->local.port);230 hdr->dest_port = host2uint16_t_be( sp->foreign.port);233 hdr->src_port = host2uint16_t_be(epp->local.port); 234 hdr->dest_port = host2uint16_t_be(epp->remote.port); 231 235 hdr->length = host2uint16_t_be(npdu->data_size); 232 236 hdr->checksum = 0; -
uspace/srv/net/udp/pdu.h
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #define PDU_H 37 37 38 #include <inet/endpoint.h> 38 39 #include <sys/types.h> 39 40 #include "std.h" … … 42 43 extern udp_pdu_t *udp_pdu_new(void); 43 44 extern void udp_pdu_delete(udp_pdu_t *); 44 extern int udp_pdu_decode(udp_pdu_t *, udp_sockpair_t *, udp_msg_t **);45 extern int udp_pdu_encode( udp_sockpair_t *, udp_msg_t *, udp_pdu_t **);45 extern int udp_pdu_decode(udp_pdu_t *, inet_ep2_t *, udp_msg_t **); 46 extern int udp_pdu_encode(inet_ep2_t *, udp_msg_t *, udp_pdu_t **); 46 47 47 48 #endif -
uspace/srv/net/udp/service.h
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 30 30 * @{ 31 31 */ 32 /** @file Socket provider32 /** @file HelenOS service implementation 33 33 */ 34 34 35 #ifndef S OCK_H36 #define S OCK_H35 #ifndef SERVICE_H 36 #define SERVICE_H 37 37 38 #include <async.h> 39 40 extern int udp_sock_init(void); 38 extern int udp_service_init(void); 41 39 42 40 #endif -
uspace/srv/net/udp/udp.c
rdf2bce32 rfb4d788 41 41 #include <task.h> 42 42 43 #include "assoc.h" 44 #include "service.h" 43 45 #include "udp_inet.h" 44 #include "sock.h"45 46 46 47 #define NAME "udp" … … 52 53 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_init()"); 53 54 55 rc = udp_assocs_init(); 56 if (rc != EOK) { 57 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing associations."); 58 return ENOMEM; 59 } 60 54 61 rc = udp_inet_init(); 55 62 if (rc != EOK) { … … 58 65 } 59 66 60 rc = udp_s ock_init();67 rc = udp_service_init(); 61 68 if (rc != EOK) { 62 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing socketservice.");69 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed initializing UDP service."); 63 70 return ENOENT; 64 71 } -
uspace/srv/net/udp/udp_inet.c
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 64 64 65 65 pdu = udp_pdu_new(); 66 pdu->iplink = dgram->iplink; 66 67 pdu->data = dgram->data; 67 68 pdu->data_size = dgram->size; … … 105 106 { 106 107 udp_msg_t *dmsg; 107 udp_sockpair_t rident;108 inet_ep2_t rident; 108 109 109 110 log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_received_pdu()"); -
uspace/srv/net/udp/udp_type.h
rdf2bce32 rfb4d788 1 1 /* 2 * Copyright (c) 201 2Jiri Svoboda2 * Copyright (c) 2015 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 36 36 #define UDP_TYPE_H 37 37 38 #include <async.h> 38 39 #include <fibril.h> 39 40 #include <fibril_synch.h> 41 #include <inet/endpoint.h> 40 42 #include <ipc/loc.h> 41 #include <socket_core.h>42 43 #include <sys/types.h> 43 44 #include <inet/addr.h> … … 49 50 /* Insufficient resources */ 50 51 UDP_ENORES, 51 /* Foreign socket unspecified */52 /* Remote endpoint unspecified */ 52 53 UDP_EUNSPEC, 53 54 /* No route to destination */ … … 60 61 XF_DUMMY = 0x1 61 62 } xflags_t; 62 63 enum udp_port {64 UDP_PORT_ANY = 065 };66 67 typedef struct {68 inet_addr_t addr;69 uint16_t port;70 } udp_sock_t;71 72 typedef struct {73 service_id_t iplink;74 udp_sock_t local;75 udp_sock_t foreign;76 } udp_sockpair_t;77 63 78 64 /** Unencoded UDP message (datagram) */ … … 99 85 100 86 typedef struct { 101 async_sess_t *sess; 102 socket_cores_t sockets; 103 } udp_client_t; 87 void (*recv_msg)(void *, inet_ep2_t *, udp_msg_t *); 88 } udp_assoc_cb_t; 104 89 105 90 /** UDP association … … 107 92 * This is a rough equivalent of a TCP connection endpoint. It allows 108 93 * sending and receiving UDP datagrams and it is uniquely identified 109 * by a socket pair.94 * by an endpoint pair. 110 95 */ 111 96 typedef struct { … … 113 98 link_t link; 114 99 115 /** Association identification ( local and foreign socket) */116 udp_sockpair_t ident;100 /** Association identification (endpoint pair) */ 101 inet_ep2_t ident; 117 102 118 103 /** True if association was reset by user */ … … 131 116 /** Receive queue CV. Broadcast when new datagram is inserted */ 132 117 fibril_condvar_t rcv_queue_cv; 118 119 udp_assoc_cb_t *cb; 120 void *cb_arg; 133 121 } udp_assoc_t; 134 122 … … 136 124 } udp_assoc_status_t; 137 125 138 typedef struct udp_sockdata { 139 /** Lock */ 140 fibril_mutex_t lock; 141 /** Socket core */ 142 socket_core_t *sock_core; 126 typedef struct { 127 /** Link to receive queue */ 128 link_t link; 129 /** Endpoint pair */ 130 inet_ep2_t epp; 131 /** Message */ 132 udp_msg_t *msg; 133 } udp_rcv_queue_entry_t; 134 135 typedef struct udp_cassoc { 136 /** Association */ 137 udp_assoc_t *assoc; 138 /** Association ID for the client */ 139 sysarg_t id; 143 140 /** Client */ 144 udp_client_t *client; 145 /** Connection */ 146 udp_assoc_t *assoc; 147 /** User-configured IP link */ 148 service_id_t iplink; 149 /** Receiving fibril */ 150 fid_t recv_fibril; 151 uint8_t recv_buffer[UDP_FRAGMENT_SIZE]; 152 size_t recv_buffer_used; 153 udp_sock_t recv_fsock; 154 fibril_mutex_t recv_buffer_lock; 155 fibril_condvar_t recv_buffer_cv; 156 udp_error_t recv_error; 157 } udp_sockdata_t; 141 struct udp_client *client; 142 link_t lclient; 143 } udp_cassoc_t; 158 144 159 145 typedef struct { 160 146 /** Link to receive queue */ 161 147 link_t link; 162 /** Socket pair */163 udp_sockpair_t sp;148 /** Endpoint pair */ 149 inet_ep2_t epp; 164 150 /** Message */ 165 151 udp_msg_t *msg; 166 } udp_rcv_queue_entry_t; 152 /** Client association */ 153 udp_cassoc_t *cassoc; 154 } udp_crcv_queue_entry_t; 155 156 typedef struct udp_client { 157 /** Client callback session */ 158 async_sess_t *sess; 159 /** Client assocations */ 160 list_t cassoc; /* of udp_cassoc_t */ 161 /** Client receive queue */ 162 list_t crcv_queue; 163 } udp_client_t; 167 164 168 165 #endif
Note:
See TracChangeset
for help on using the changeset viewer.
