void handle_tcp_ack_packet(ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header, socket_internal_t *tcp_socket) { msg_t m_recv_tcp, m_send_tcp; uint8_t target_pid; if (tcp_socket->socket_values.tcp_control.state == TCP_LAST_ACK) { target_pid = tcp_socket->recv_pid; close_socket(tcp_socket); msg_send(&m_send_tcp, target_pid, 0); return; } else if (tcp_socket->socket_values.tcp_control.state == TCP_CLOSING) { msg_send(&m_send_tcp, tcp_socket->recv_pid, 0); msg_send(&m_send_tcp, tcp_socket->send_pid, 0); return; } else if (get_waiting_connection_socket(tcp_socket->socket_id, ipv6_header, tcp_header) != NULL) { m_send_tcp.content.ptr = (char *)tcp_header; net_msg_send_recv(&m_send_tcp, &m_recv_tcp, tcp_socket->recv_pid, TCP_ACK); return; } else if (tcp_socket->socket_values.tcp_control.state == TCP_ESTABLISHED) { if (check_tcp_consistency(&tcp_socket->socket_values, tcp_header, 0) == PACKET_OK) { m_send_tcp.content.ptr = (char *)tcp_header; net_msg_send(&m_send_tcp, tcp_socket->send_pid, 0, TCP_ACK); return; } } printf("NO WAY OF HANDLING THIS ACK!\n"); }
uint8_t handle_payload(ipv6_hdr_t *ipv6_header, tcp_hdr_t *tcp_header, socket_internal_t *tcp_socket, uint8_t *payload) { msg_t m_send_tcp, m_recv_tcp; uint8_t tcp_payload_len = ipv6_header->length - TCP_HDR_LEN; uint8_t acknowledged_bytes = 0; if (tcp_payload_len > tcp_socket->socket_values.tcp_control.rcv_wnd) { mutex_lock(&tcp_socket->tcp_buffer_mutex); memcpy(tcp_socket->tcp_input_buffer, payload, tcp_socket->socket_values.tcp_control.rcv_wnd); acknowledged_bytes = tcp_socket->socket_values.tcp_control.rcv_wnd; tcp_socket->socket_values.tcp_control.rcv_wnd = 0; tcp_socket->tcp_input_buffer_end = tcp_socket->tcp_input_buffer_end + tcp_socket->socket_values.tcp_control.rcv_wnd; mutex_unlock(&tcp_socket->tcp_buffer_mutex); } else { mutex_lock(&tcp_socket->tcp_buffer_mutex); memcpy(tcp_socket->tcp_input_buffer, payload, tcp_payload_len); tcp_socket->socket_values.tcp_control.rcv_wnd = tcp_socket->socket_values.tcp_control.rcv_wnd - tcp_payload_len; acknowledged_bytes = tcp_payload_len; tcp_socket->tcp_input_buffer_end = tcp_socket->tcp_input_buffer_end + tcp_payload_len; mutex_unlock(&tcp_socket->tcp_buffer_mutex); } if (thread_getstatus(tcp_socket->recv_pid) == STATUS_RECEIVE_BLOCKED) { net_msg_send_recv(&m_send_tcp, &m_recv_tcp, tcp_socket->recv_pid, UNDEFINED); } return acknowledged_bytes; }