diff --git a/projects/tlayer/main.c b/projects/tlayer/main.c index 5cd70ff4a6..e62475b0b8 100644 --- a/projects/tlayer/main.c +++ b/projects/tlayer/main.c @@ -48,38 +48,47 @@ void init_tl (char *str) void tcp_ch(void) { + uint32_t state = 0; msg_t recv_msg; sockaddr6_t stSockAddr; - while (1) + msg_receive(&recv_msg); + + int SocketFD = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP); + + if (-1 == SocketFD) { - msg_receive(&recv_msg); + printf("cannot create socket"); + } - int SocketFD = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP); - - if (-1 == SocketFD) - { - printf("cannot create socket"); - } - - memset(&stSockAddr, 0, sizeof(stSockAddr)); - - stSockAddr.sin6_family = AF_INET6; - stSockAddr.sin6_port = HTONS(1100); - ipv6_init_address(&stSockAddr.sin6_addr, 0xabcd, 0x0, 0x0, 0x0, 0x3612, 0x00ff, 0xfe00, current_message.node_number); - ipv6_print_addr(&stSockAddr.sin6_addr); - - if (-1 == connect(SocketFD, &stSockAddr, sizeof(stSockAddr), tcp_cht_pid)) - { - printf("connect failed"); - close(SocketFD); - } - - /* perform read write operations ... */ + memset(&stSockAddr, 0, sizeof(stSockAddr)); + stSockAddr.sin6_family = AF_INET6; + stSockAddr.sin6_port = HTONS(1100); + ipv6_init_address(&stSockAddr.sin6_addr, 0xabcd, 0x0, 0x0, 0x0, 0x3612, 0x00ff, 0xfe00, current_message.node_number); + ipv6_print_addr(&stSockAddr.sin6_addr); + if (-1 == connect(SocketFD, &stSockAddr, sizeof(stSockAddr), tcp_cht_pid)) + { + printf("connect failed"); close(SocketFD); } + msg_receive(&recv_msg); + state = recv_msg.content.value; + while (state == 1) + { + printf("Trying to send data!\n"); + if (send(SocketFD, (void*) current_message.tcp_string_msg, strlen(current_message.tcp_string_msg)+1, 0) < 0) + { + printf("Could not send %s!\n", current_message.tcp_string_msg); + } + + msg_receive(&recv_msg); + state = recv_msg.content.value; + } + + close(SocketFD); + } void init_udp_server(void) @@ -191,9 +200,27 @@ void init_tcp_cht(char *str) void send_tcp(char *str) { msg_t send_msg; - sscanf(str, "send_tcp %s %i", current_message.tcp_string_msg, ¤t_message.node_number); + sscanf(str, "send_tcp %s", current_message.tcp_string_msg); - msg_send(&send_msg, tcp_cht_pid, 1); + send_msg.content.value = 1; + msg_send(&send_msg, tcp_cht_pid, 0); + } + +void connect_tcp(char *str) + { + msg_t send_msg; + sscanf(str, "connect_tcp %i", ¤t_message.node_number); + + send_msg.content.value = 1; + msg_send(&send_msg, tcp_cht_pid, 0); + } + +void disconnect_tcp(char *str) + { + msg_t send_msg; + + send_msg.content.value = 0; + msg_send(&send_msg, tcp_cht_pid, 0); } void init(char *str){ @@ -382,6 +409,7 @@ const shell_command_t shell_commands[] = { {"init_udp_server_thread", "", init_udp_server_thread}, {"init_tcp_server_thread", "", init_tcp_server_thread}, {"init_tcp_cht", "", init_tcp_cht}, + {"connect_tcp", "", connect_tcp}, {"send_tcp", "", send_tcp}, {"send_udp", "", send_udp}, {NULL, NULL, NULL} diff --git a/sys/net/destiny/socket.c b/sys/net/destiny/socket.c index 7e23fe6f7b..b12af7b4bb 100644 --- a/sys/net/destiny/socket.c +++ b/sys/net/destiny/socket.c @@ -38,8 +38,11 @@ void print_tcp_flags (tcp_hdr_t *tcp_header) void print_tcp_status(int in_or_out, ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header) { printf("--- %s TCP packet: ---\n", (in_or_out == INC_PACKET ? "Incoming" : "Outgoing")); + printf("IPv6 Source:"); ipv6_print_addr(&ipv6_header->srcaddr); + printf("IPv6 Dest:"); ipv6_print_addr(&ipv6_header->destaddr); + printf("TCP Length: %i\n", ipv6_header->length-TCP_HDR_LEN); printf("Source Port: %i, Dest. Port: %i\n", tcp_header->src_port, tcp_header->dst_port); printf("ACK: %li, SEQ: %li, Window: %i\n", tcp_header->ack_nr, tcp_header->seq_nr, tcp_header->window); print_tcp_flags(tcp_header); @@ -326,6 +329,7 @@ int check_tcp_consistency(socket_t *current_tcp_socket, tcp_hdr_t *tcp_header) int connect(int socket, sockaddr6_t *addr, uint32_t addrlen, uint8_t tcp_client_thread) { // Variables + socket_internal_t *current_int_tcp_socket; socket_t *current_tcp_socket; msg_t msg_from_server, msg_reply_fin; uint8_t send_buffer[BUFFER_SIZE]; @@ -333,12 +337,14 @@ int connect(int socket, sockaddr6_t *addr, uint32_t addrlen, uint8_t tcp_client_ tcp_hdr_t *current_tcp_packet = ((tcp_hdr_t*)(&send_buffer[IPV6_HDR_LEN])); // Check if socket exists - current_tcp_socket = &getSocket(socket)->in_socket; - if (current_tcp_socket == NULL) + current_int_tcp_socket = getSocket(socket); + if (current_int_tcp_socket == NULL) { return -1; } + current_tcp_socket = ¤t_int_tcp_socket->in_socket; + // Set client thread process ID getSocket(socket)->pid = tcp_client_thread; @@ -402,9 +408,49 @@ int connect(int socket, sockaddr6_t *addr, uint32_t addrlen, uint8_t tcp_client_ return 0; } +void set_tcp_packet_auto(tcp_hdr_t *current_tcp_packet, socket_t *current_socket) + { + set_tcp_packet(current_tcp_packet, current_socket->local_address.sin6_port, current_socket->foreign_address.sin6_port, current_socket->local_tcp_status.seq_nr, + current_socket->local_tcp_status.ack_nr, 0, 0, current_socket->local_tcp_status.window, 0, 0); + } + int32_t send(int s, void *msg, uint64_t len, int flags) { - return -1; + // Variables + socket_internal_t *current_int_tcp_socket; + socket_t *current_tcp_socket; + uint8_t send_buffer[BUFFER_SIZE]; + ipv6_hdr_t *temp_ipv6_header = ((ipv6_hdr_t*)(&send_buffer)); + tcp_hdr_t *current_tcp_packet = ((tcp_hdr_t*)(&send_buffer[IPV6_HDR_LEN])); + + // Check if socket exists + current_int_tcp_socket = getSocket(s); + if (current_int_tcp_socket == NULL) + { + return -1; + } + + current_tcp_socket = ¤t_int_tcp_socket->in_socket; + + // Refresh local TCP socket information + current_tcp_socket->local_tcp_status.seq_nr = current_tcp_socket->local_tcp_status.seq_nr + len; + + // IPv6 information + memcpy(&(temp_ipv6_header->destaddr), ¤t_tcp_socket->foreign_address.sin6_addr, 16); + memcpy(&(temp_ipv6_header->srcaddr), ¤t_tcp_socket->local_address.sin6_addr, 16); + temp_ipv6_header->length = TCP_HDR_LEN+len; + + // Fill TCP packet header + set_tcp_packet_auto(current_tcp_packet, current_tcp_socket); + + // Add packet data + memcpy(&send_buffer[IPV6_HDR_LEN+TCP_HDR_LEN], msg, len); + + // Checksum + current_tcp_packet->checksum = ~tcp_csum(temp_ipv6_header, current_tcp_packet); + + sixlowpan_send(¤t_tcp_socket->foreign_address.sin6_addr, (uint8_t*)(current_tcp_packet), TCP_HDR_LEN+len, IPPROTO_TCP); + return 1; } int32_t recv(int s, void *buf, uint64_t len, int flags) diff --git a/sys/net/destiny/tcp.c b/sys/net/destiny/tcp.c index 7acfe7ae7f..2fa3264e79 100644 --- a/sys/net/destiny/tcp.c +++ b/sys/net/destiny/tcp.c @@ -111,6 +111,13 @@ void handle_tcp_fin_ack_packet(ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header, s } +void handle_tcp_no_flags_packet(ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header, socket_internal_t *tcp_socket, uint8_t *payload) + { + char message[128]; + memcpy(message, payload, ipv6_header->length-TCP_HDR_LEN); + printf("Packet-Content: %s\n", message); + } + void tcp_packet_handler (void) { msg_t m_recv_ip, m_send_ip; @@ -184,8 +191,8 @@ void tcp_packet_handler (void) } default: { - // TODO: any other case printf("DEFAULT!\n"); + handle_tcp_no_flags_packet(ipv6_header, tcp_header, tcp_socket, payload); } } }