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 = ¤t_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, ¤t_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), ¤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 = 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(¤t_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(¤t_tcp_socket->foreign_address.sin6_addr, IPPROTO_TCP, (uint8_t *)(current_tcp_packet), header_length * 4 + payload_length); return 1; #endif }
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; } }
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); }