Example #1
0
int send_tcp(socket_internal_t *current_socket, tcp_hdr_t *current_tcp_packet,
             ipv6_hdr_t *temp_ipv6_header, uint8_t flags, uint8_t payload_length)
{
    socket_t *current_tcp_socket = &current_socket->socket_values;
    uint8_t header_length = TCP_HDR_LEN / 4;

    if (IS_TCP_SYN(flags) || IS_TCP_SYN_ACK(flags)) {
        tcp_mss_option_t current_mss_option;
        header_length += sizeof(tcp_mss_option_t) / 4;

        current_mss_option.kind 	= TCP_MSS_OPTION;
        current_mss_option.len 		= sizeof(tcp_mss_option_t);
        current_mss_option.mss		= DESTINY_SOCKET_STATIC_MSS;
        memcpy(((uint8_t *)current_tcp_packet) + TCP_HDR_LEN,
               &current_mss_option, sizeof(tcp_mss_option_t));
    }

    set_tcp_packet(current_tcp_packet, current_tcp_socket->local_address.sin6_port,
                   current_tcp_socket->foreign_address.sin6_port,
                   (flags == TCP_ACK ? current_tcp_socket->tcp_control.send_una - 1 :
                    current_tcp_socket->tcp_control.send_una),
                   current_tcp_socket->tcp_control.rcv_nxt, header_length, flags,
                   current_tcp_socket->tcp_control.rcv_wnd, 0, 0);

    /* Fill IPv6 Header */
    memcpy(&(temp_ipv6_header->destaddr),
           &current_tcp_socket->foreign_address.sin6_addr, 16);
    memcpy(&(temp_ipv6_header->srcaddr),
           &current_tcp_socket->local_address.sin6_addr, 16);
    temp_ipv6_header->length = header_length * 4 + payload_length;

    current_tcp_packet->checksum = ~tcp_csum(temp_ipv6_header, current_tcp_packet);

#ifdef TCP_HC
    uint16_t compressed_size;

    compressed_size = compress_tcp_packet(current_socket,
                                          (uint8_t *)current_tcp_packet,
                                          temp_ipv6_header, flags,
                                          payload_length);

    if (compressed_size == 0) {
        /* Error in compressing tcp packet header */
        return -1;
    }

    ipv6_sendto(&current_tcp_socket->foreign_address.sin6_addr,
                IPPROTO_TCP, (uint8_t *)(current_tcp_packet),
                compressed_size);
    return 1;
#else
    switch_tcp_packet_byte_order(current_tcp_packet);
    ipv6_sendto(&current_tcp_socket->foreign_address.sin6_addr,
                IPPROTO_TCP, (uint8_t *)(current_tcp_packet),
                header_length * 4 + payload_length);
    return 1;
#endif
}
Example #2
0
int32_t destiny_socket_sendto(int s, const void *buf, uint32_t len, int flags,
                              sockaddr6_t *to, uint32_t tolen)
{
    if (isUDPSocket(s) &&
        (get_socket(s)->socket_values.foreign_address.sin6_port == 0)) {
        uint8_t send_buffer[BUFFER_SIZE];

        ipv6_hdr_t *temp_ipv6_header = ((ipv6_hdr_t *)(&send_buffer));
        udp_hdr_t *current_udp_packet = ((udp_hdr_t *)(&send_buffer[IPV6_HDR_LEN]));
        uint8_t *payload = &send_buffer[IPV6_HDR_LEN + UDP_HDR_LEN];

        memcpy(&(temp_ipv6_header->destaddr), &to->sin6_addr, 16);
        ipv6_iface_get_best_src_addr(&(temp_ipv6_header->srcaddr), &(temp_ipv6_header->destaddr));

        current_udp_packet->src_port = get_free_source_port(IPPROTO_UDP);
        current_udp_packet->dst_port = to->sin6_port;
        current_udp_packet->checksum = 0;

        memcpy(payload, buf, len);
        current_udp_packet->length = HTONS(UDP_HDR_LEN + len);
        temp_ipv6_header->length = UDP_HDR_LEN + len;

        current_udp_packet->checksum = ~udp_csum(temp_ipv6_header,
                                       current_udp_packet);

        ipv6_sendto(&to->sin6_addr, IPPROTO_UDP,
                    (uint8_t *)(current_udp_packet),
                    NTOHS(current_udp_packet->length));
        return current_udp_packet->length;
    }
    else {
        return -1;
    }
}
Example #3
0
int rpl_srh_sendto(const void *buf, uint16_t len, ipv6_addr_t *src, ipv6_addr_t *dest, ipv6_srh_t *srh_header, uint8_t srh_length)
{
    ipv6_hdr_t *temp_ipv6_header = ((ipv6_hdr_t *)(&srh_send_buffer));
    ipv6_srh_t *current_packet = ((ipv6_srh_t *)(&srh_send_buffer[IPV6_HDR_LEN]));
    uint8_t *payload = &srh_send_buffer[IPV6_HDR_LEN + srh_length];
    memcpy(&(temp_ipv6_header->destaddr), dest, sizeof(ipv6_addr_t));
    memcpy(&(temp_ipv6_header->srcaddr), src, sizeof(ipv6_addr_t));
    memcpy(current_packet, srh_header, srh_length);
    memcpy(payload, buf, len);
    uint16_t plength = srh_length + len;

    DEBUGF("Build SRH package finished. Going to send it.\n");
    DEBUGF("SRH-length: %d\n", current_packet->hdrextlen);
    DEBUGF("My payload length: %d\n", plength);

    return ipv6_sendto(&temp_ipv6_header->destaddr, IPV6_PROTO_NUM_SRH, (uint8_t *)current_packet, plength, &temp_ipv6_header->destaddr);
}