Example #1
0
socket_internal_t *get_socket(int s)
{
    if (exists_socket(s)) {
        return &(sockets[s - 1]);
    }
    else {
        return NULL;
    }
}
Example #2
0
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;
}
Example #3
0
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;
    }
}
Example #4
0
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;
    }
}
Example #5
0
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;
}
Example #6
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;
}
Example #7
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;
}
Example #8
0
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;
}