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; }
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; }