diff --git a/sys/net/include/destiny/types.h b/sys/net/include/destiny/types.h index 01b4f9d59c..b9966b099f 100644 --- a/sys/net/include/destiny/types.h +++ b/sys/net/include/destiny/types.h @@ -51,21 +51,22 @@ typedef struct __attribute__((packed)) { * @see RFC 793 */ typedef struct __attribute__((packed)) { - uint16_t src_port; ///< source port - uint16_t dst_port; ///< destination port - uint32_t seq_nr; ///< sequence number - uint32_t ack_nr; ///< acknowledgement number - uint8_t dataOffset_reserved; ///< 4 MSBs data offsets, - ///< 4 LSBs reserved (must be zero) - uint8_t reserved_flags; ///< MSB reserved, rest flags - uint16_t window; ///< receiver window + uint16_t src_port; ///< source port + uint16_t dst_port; ///< destination port + uint32_t seq_nr; ///< sequence number + uint32_t ack_nr; ///< acknowledgement number + uint8_t flag_ns :1; ///< ECN-nonce concealment protection (since RFC 3540). + uint8_t reserved :3; ///< for future use - set to zero + uint8_t data_offset :4; + uint8_t reserved_flags; ///< TODO: break this down into another bitfield: flag_fin, flag_syn, etc + uint16_t window; ///< receiver window /** * internet checksum * * @see RFC 1071 */ - uint16_t checksum; - uint16_t urg_pointer; ///< urgent pointer + uint16_t checksum; + uint16_t urg_pointer; ///< urgent pointer } tcp_hdr_t; /** diff --git a/sys/net/transport_layer/destiny/socket.c b/sys/net/transport_layer/destiny/socket.c index 9594480cdf..cf74bd0501 100644 --- a/sys/net/transport_layer/destiny/socket.c +++ b/sys/net/transport_layer/destiny/socket.c @@ -48,7 +48,7 @@ void set_socket_address(sockaddr6_t *sockaddr, sa_family_t sin6_family, ipv6_addr_t *sin6_addr); void set_tcp_packet(tcp_hdr_t *tcp_hdr, uint16_t src_port, uint16_t dst_port, uint32_t seq_nr, uint32_t ack_nr, - uint8_t dataOffset_reserved, uint8_t reserved_flags, + uint8_t data_offset, uint8_t reserved_flags, uint16_t window, uint16_t checksum, uint16_t urg_pointer); void printf_tcp_context(tcp_hc_context_t *current_tcp_context) @@ -390,19 +390,21 @@ void set_socket_address(sockaddr6_t *sockaddr, uint8_t sin6_family, } void set_tcp_packet(tcp_hdr_t *tcp_hdr, uint16_t src_port, uint16_t dst_port, - uint32_t seq_nr, uint32_t ack_nr, uint8_t dataOffset_reserved, + uint32_t seq_nr, uint32_t ack_nr, uint8_t data_offset, uint8_t reserved_flags, uint16_t window, uint16_t checksum, uint16_t urg_pointer) { - tcp_hdr->ack_nr = ack_nr; - tcp_hdr->checksum = checksum; - tcp_hdr->dataOffset_reserved = dataOffset_reserved; - tcp_hdr->dst_port = dst_port; - tcp_hdr->reserved_flags = reserved_flags; - tcp_hdr->seq_nr = seq_nr; - tcp_hdr->src_port = src_port; - tcp_hdr->urg_pointer = urg_pointer; - tcp_hdr->window = window; + tcp_hdr->ack_nr = ack_nr; + tcp_hdr->checksum = checksum; + tcp_hdr->data_offset = data_offset; + tcp_hdr->dst_port = dst_port; + tcp_hdr->reserved_flags = reserved_flags; + tcp_hdr->reserved = 0; + tcp_hdr->flag_ns = 0; + tcp_hdr->seq_nr = seq_nr; + tcp_hdr->src_port = src_port; + tcp_hdr->urg_pointer = urg_pointer; + tcp_hdr->window = window; } /* Check for consistent ACK and SEQ number */ @@ -428,7 +430,7 @@ int check_tcp_consistency(socket_t *current_tcp_socket, tcp_hdr_t *tcp_header) void switch_tcp_packet_byte_order(tcp_hdr_t *current_tcp_packet) { - if (current_tcp_packet->dataOffset_reserved * 4 > TCP_HDR_LEN) { + if (current_tcp_packet->data_offset * 4 > TCP_HDR_LEN) { if (*(((uint8_t *)current_tcp_packet) + TCP_HDR_LEN) == TCP_MSS_OPTION) { uint8_t *packet_pointer = (uint8_t *)current_tcp_packet; packet_pointer += (TCP_HDR_LEN + 2); @@ -621,7 +623,7 @@ int destiny_socket_connect(int socket, sockaddr6_t *addr, uint32_t addrlen) /* Got SYN ACK from Server */ /* Refresh foreign TCP socket information */ - if ((tcp_header->dataOffset_reserved * 4 > TCP_HDR_LEN) && + if ((tcp_header->data_offset * 4 > TCP_HDR_LEN) && (*(((uint8_t *)tcp_header) + TCP_HDR_LEN) == TCP_MSS_OPTION)) { current_tcp_socket->tcp_control.mss = *((uint16_t *)(((uint8_t *)tcp_header) + TCP_HDR_LEN + 2)); @@ -1360,7 +1362,7 @@ socket_internal_t *new_tcp_queued_socket(ipv6_hdr_t *ipv6_header, &ipv6_header->destaddr); /* Foreign TCP information */ - if ((tcp_header->dataOffset_reserved * 4 > TCP_HDR_LEN) && + if ((tcp_header->data_offset * 4 > TCP_HDR_LEN) && (*(((uint8_t *)tcp_header) + TCP_HDR_LEN) == TCP_MSS_OPTION)) { current_queued_socket->socket_values.tcp_control.mss = *((uint16_t *)(((uint8_t *)tcp_header) + TCP_HDR_LEN + 2)); diff --git a/sys/net/transport_layer/destiny/tcp.c b/sys/net/transport_layer/destiny/tcp.c index 07dfb9bda7..0a0e7a3dbb 100644 --- a/sys/net/transport_layer/destiny/tcp.c +++ b/sys/net/transport_layer/destiny/tcp.c @@ -48,7 +48,7 @@ void printTCPHeader(tcp_hdr_t *tcp_header) printf("\nBEGIN: TCP HEADER\n"); printf("ack_nr: %" PRIu32 "\n", tcp_header->ack_nr); printf("checksum: %i\n", tcp_header->checksum); - printf("dataOffset_reserved: %i\n", tcp_header->dataOffset_reserved); + printf("data_offset: %i\n", tcp_header->data_offset); printf("dst_port: %i\n", tcp_header->dst_port); printf("reserved_flags: %i\n", tcp_header->reserved_flags); printf("seq_nr: %" PRIu32 "\n", tcp_header->seq_nr); @@ -331,15 +331,14 @@ void tcp_packet_handler(void) #endif chksum = tcp_csum(ipv6_header, tcp_header); - payload = (uint8_t *)(m_recv_ip.content.ptr + IPV6_HDR_LEN + - tcp_header->dataOffset_reserved * 4); + payload = (uint8_t *)(m_recv_ip.content.ptr + IPV6_HDR_LEN + tcp_header->data_offset * 4); if ((chksum == 0xffff) && (tcp_socket != NULL)) { #ifdef TCP_HC update_tcp_hc_context(true, tcp_socket, tcp_header); #endif /* Remove reserved bits from tcp flags field */ - uint8_t tcp_flags = tcp_header->reserved_flags & REMOVE_RESERVED; + uint8_t tcp_flags = tcp_header->reserved_flags; switch (tcp_flags) { case TCP_ACK: { diff --git a/sys/net/transport_layer/destiny/tcp_hc.c b/sys/net/transport_layer/destiny/tcp_hc.c index 77343191ac..c4ca3c4bc3 100644 --- a/sys/net/transport_layer/destiny/tcp_hc.c +++ b/sys/net/transport_layer/destiny/tcp_hc.c @@ -90,7 +90,7 @@ uint16_t compress_tcp_packet(socket_internal_t *current_socket, /* Move tcp packet 3 bytes to add padding and Context ID */ memmove(current_tcp_packet + 3, current_tcp_packet, - ((((tcp_hdr_t *)current_tcp_packet)->dataOffset_reserved) * 4) + + ((((tcp_hdr_t *)current_tcp_packet)->data_offset) * 4) + payload_length); /* 1 padding byte with value 0x01 to introduce full header TCP_HC @@ -102,7 +102,7 @@ uint16_t compress_tcp_packet(socket_internal_t *current_socket, memcpy(current_tcp_packet + 1, ¤t_context, 2); /* Return correct header length (+3) */ - packet_size = ((((tcp_hdr_t *)(current_tcp_packet + 3))->dataOffset_reserved) * 4) + 3 + + packet_size = ((((tcp_hdr_t *)(current_tcp_packet + 3))->data_offset) * 4) + 3 + payload_length; /* Update the tcp context fields */ @@ -616,7 +616,7 @@ socket_internal_t *decompress_tcp_packet(ipv6_hdr_t *temp_ipv6_header) ¤t_socket->socket_values.foreign_address.sin6_port, 2); /* Ordinary TCP header length */ - full_tcp_header.dataOffset_reserved = TCP_HDR_LEN / 4; + full_tcp_header.data_offset = TCP_HDR_LEN / 4; /* Move payload to end of tcp header */ memmove(((uint8_t *)temp_ipv6_header) + IPV6_HDR_LEN + TCP_HDR_LEN,