socket_internal_t *get_socket(int s) { if (exists_socket(s)) { return &(sockets[s - 1]); } else { return NULL; } }
wiced_result_t socket_t::notify_disconnected(wiced_tcp_socket_t*, void* socket) { if (socket && 0) { // replace with unique_lock once the multithreading changes have been incorporated SocketListLock lock(clients); if (exists_socket((socket_t*)socket)) { tcp_socket_t* tcp_socket = tcp((socket_t*)socket); if (tcp_socket) tcp_socket->notify_disconnected(); } } return WICED_SUCCESS; }
bool is_tcp_socket(int s) { if ((exists_socket(s)) && (get_socket(s)->socket_values.domain == PF_INET6) && (get_socket(s)->socket_values.type == SOCK_STREAM) && ((get_socket(s)->socket_values.protocol == IPPROTO_TCP) || (get_socket(s)->socket_values.protocol == 0))) { return true; } else { return false; } }
bool isUDPSocket(uint8_t s) { if ((exists_socket(s)) && (get_socket(s)->socket_values.domain == PF_INET6) && (get_socket(s)->socket_values.type == SOCK_DGRAM) && ((get_socket(s)->socket_values.protocol == IPPROTO_UDP) || (get_socket(s)->socket_values.protocol == 0))) { return true; } else { return false; } }
int bind_udp_socket(int s, sockaddr6_t *name, int namelen, uint8_t pid) { int i; if (!exists_socket(s)) { return -1; } for (i = 1; i < MAX_SOCKETS + 1; i++) { if (isUDPSocket(i) && (get_socket(i)->socket_values.local_address.sin6_port == name->sin6_port)) { return -1; } } memcpy(&get_socket(s)->socket_values.local_address, name, namelen); get_socket(s)->recv_pid = pid; return 0; }
int bind_tcp_socket(int s, sockaddr6_t *name, int namelen, uint8_t pid) { int i; if (!exists_socket(s)) { return -1; } for (i = 1; i < MAX_SOCKETS + 1; i++) { if (is_tcp_socket(i) && (get_socket(i)->socket_values.local_address.sin6_port == name->sin6_port)) { return -1; } } memcpy(&get_socket(s)->socket_values.local_address, name, namelen); get_socket(s)->recv_pid = pid; get_socket(s)->socket_values.tcp_control.rto = TCP_INITIAL_ACK_TIMEOUT; return 0; }
int32_t destiny_socket_recv(int s, void *buf, uint32_t len, int flags) { /* Variables */ uint8_t read_bytes; msg_t m_recv, m_send; socket_internal_t *current_int_tcp_socket; /* Check if socket exists */ if (!is_tcp_socket(s)) { printf("INFO: NO TCP SOCKET!\n"); return -1; } current_int_tcp_socket = get_socket(s); /* Setting Thread PID */ current_int_tcp_socket->recv_pid = thread_getpid(); if (current_int_tcp_socket->tcp_input_buffer_end > 0) { return read_from_socket(current_int_tcp_socket, buf, len); } msg_receive(&m_recv); if ((exists_socket(s)) && (current_int_tcp_socket->tcp_input_buffer_end > 0)) { read_bytes = read_from_socket(current_int_tcp_socket, buf, len); net_msg_reply(&m_recv, &m_send, UNDEFINED); return read_bytes; } /* Received FIN */ if (m_recv.type == CLOSE_CONN) { /* Sent FIN_ACK, wait for ACK */ msg_receive(&m_recv); /* Received ACK, return with closed socket!*/ return -1; } /* Received Last ACK (connection closed) or no data to read yet */ return -1; }
int destiny_socket_bind(int s, sockaddr6_t *addr, int addrlen) { if (exists_socket(s)) { socket_t *current_socket = &get_socket(s)->socket_values; switch (current_socket->domain) { case (PF_INET): { /* Not provided */ return -1; break; } case (PF_INET6): { switch (current_socket->type) { /* TCP */ case (SOCK_STREAM): { if ((current_socket->protocol == 0) || (current_socket->protocol == IPPROTO_TCP)) { return bind_tcp_socket(s, addr, addrlen, thread_getpid()); break; } else { return -1; break; } break; } /* UDP */ case (SOCK_DGRAM): { if ((current_socket->protocol == 0) || (current_socket->protocol == IPPROTO_UDP)) { return bind_udp_socket(s, addr, addrlen, thread_getpid()); break; } else { return -1; break; } break; } case (SOCK_SEQPACKET): { /* not provided */ return -1; break; } case (SOCK_RAW): { /* not provided */ return -1; break; } default: { return -1; break; } } break; } case (PF_UNIX): { /* Not provided */ return -1; break; } } } else { printf("SOCKET DOES NOT EXIST!\n"); return -1; } return -1; }