int destiny_socket_accept(int s, sockaddr6_t *addr, uint32_t *addrlen) { socket_internal_t *server_socket = get_socket(s); if (is_tcp_socket(s) && (server_socket->socket_values.tcp_control.state == LISTEN)) { socket_internal_t *current_queued_socket = get_waiting_connection_socket(s, NULL, NULL); if (current_queued_socket != NULL) { return handle_new_tcp_connection(current_queued_socket, server_socket, thread_getpid()); } else { /* No waiting connections, waiting for message from TCP Layer */ msg_t msg_recv_client_syn; msg_recv_client_syn.type = UNDEFINED; while (msg_recv_client_syn.type != TCP_SYN) { msg_receive(&msg_recv_client_syn); } current_queued_socket = get_waiting_connection_socket(s, NULL, NULL); return handle_new_tcp_connection(current_queued_socket, server_socket, thread_getpid()); } } else { return -1; } }
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"); }