err_t irqTCPRecv(void * arg, struct tcp_pcb * tpcb, struct pbuf * p, err_t err)
{
    (void) tpcb;
    struct socket_event e;
    struct socket *s = (struct socket *) arg;

    if(err != ERR_OK) {
        e.event = SOCKET_EVENT_ERROR;
        e.i.e = lwipv4_socket_error_remap(err);
        s->event = &e;
        ((socket_api_handler_t)(s->handler))();
        s->event = NULL;
        return ERR_OK;
    }
    /* Check for a disconnect */
    if (p == NULL) {
        e.event = SOCKET_EVENT_DISCONNECT;
        s->event = &e;
        ((socket_api_handler_t) (s->handler))();
        s->event = NULL;
        /* Zero the impl, since a disconnect will cause a free */
        s->impl = NULL;
        return ERR_OK;
    }

    rx_core(s, p);

    e.event = SOCKET_EVENT_RX_DONE;
    s->event = &e;
    ((socket_api_handler_t)(s->handler))();
    s->event = NULL;
    return ERR_OK;
}
void irqUDPRecv(void * arg, struct udp_pcb * upcb,
        struct pbuf * p,
        struct ip_addr * addr,
        u16_t port)
{
    (void) upcb;
    // These parameters are extracted from the IP and UDP headers.
    (void) addr;
    (void) port;
    struct socket *s = (struct socket *) arg;
    struct socket_event e;

    rx_core(s, p);

    e.event = SOCKET_EVENT_RX_DONE;
    s->event = &e;
    ((socket_api_handler_t)(s->handler))();
    s->event = NULL;
}
Ejemplo n.º 3
0
err_t irqTCPRecv(void * arg, struct tcp_pcb * tpcb, struct pbuf * p, err_t err)
{
    struct socket_event e;
    struct socket *s = (struct socket *) arg;

    if(err != ERR_OK) {
        e.event = SOCKET_EVENT_ERROR;
        e.i.e = lwipv4_socket_error_remap(err);
        s->event = &e;
        ((socket_api_handler_t)(s->handler))();
        s->event = NULL;
        return ERR_OK;
    }
    /* Check for a disconnect */
    if (p == NULL) {
        e.event = SOCKET_EVENT_DISCONNECT;
        s->event = &e;
        ((socket_api_handler_t) (s->handler))();
        s->event = NULL;
        /* if close has been called, we have to remove impl, since it could be freed */
        switch (tpcb->state) {
            case FIN_WAIT_1:
            case FIN_WAIT_2:
            case TIME_WAIT:
                /* Zero the impl, since a disconnect will cause a free */
                s->impl = NULL;
                break;
            default:
                break;
        }
        return ERR_OK;
    }

    rx_core(s, p);

    e.event = SOCKET_EVENT_RX_DONE;
    s->event = &e;
    ((socket_api_handler_t)(s->handler))();
    s->event = NULL;
    return ERR_OK;
}