/*-----------------------------------------------------------------------------------*/ static struct pbuf * sioslipif_input(void) { u8_t c; struct pbuf *p, *q; int recved; int i; p = pbuf_alloc(PBUF_LINK, PBUF_MAX_SIZE, PBUF_POOL); q = p; recved = i = 0; while (1) { c = sio_recv(); switch (c) { case SLIP_END: if (recved > 0) { /* Received whole packet. */ pbuf_realloc(p, recved); return p; } break; case SLIP_ESC: c = sio_recv(); switch (c) { case SLIP_ESC_END: c = SLIP_END; break; case SLIP_ESC_ESC: c = SLIP_ESC; break; } /* FALLTHROUGH */ default: if (recved < p->tot_len && q != NULL) { ((u8_t *)q->payload)[i] = c; recved++; i++; if (i >= q->len) { i = 0; q = q->next; } } break; } } }
/** * Handle the incoming SLIP stream character by character * * Poll the serial layer by calling sio_recv() * * @return The IP packet when SLIP_END is received */ static struct pbuf * slipif_input(struct netif *netif) { u8_t c; struct pbuf *p, *q; int recved; int i; q = p = NULL; recved = i = 0; c = 0; while (1) { c = sio_recv(netif->state); switch (c) { case SLIP_END: if (recved > 0) { /* Received whole packet. */ pbuf_realloc(q, recved); LINK_STATS_INC(link.recv); LWIP_DEBUGF(SLIP_DEBUG, ("slipif: Got packet\n")); return q; } break; case SLIP_ESC: c = sio_recv(netif->state); switch (c) { case SLIP_ESC_END: c = SLIP_END; break; case SLIP_ESC_ESC: c = SLIP_ESC; break; } /* FALLTHROUGH */ default: if (p == NULL) { LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: alloc\n")); p = pbuf_alloc(PBUF_LINK, PBUF_POOL_BUFSIZE, PBUF_POOL); if (p == NULL) { LINK_STATS_INC(link.drop); LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: no new pbuf! (DROP)\n")); } if (q != NULL) { pbuf_cat(q, p); } else { q = p; } } if (p != NULL && recved < MAX_SIZE) { ((u8_t *)p->payload)[i] = c; recved++; i++; if (i >= p->len) { i = 0; if (p->next != NULL && p->next->len > 0) p = p->next; else p = NULL; } } break; } } return NULL; }
/** * Handle the incoming SLIP stream character by character * * Poll the serial layer by calling sio_recv() * * @param netif the lwip network interface structure for this slipif * @return The IP packet when SLIP_END is received */ static struct pbuf * slipif_input(struct netif *netif) { u8_t c; /* q is the whole pbuf chain for a packet, p is the current pbuf in the chain */ struct pbuf *p, *q; u16_t recved; u16_t i; LWIP_ASSERT("netif != NULL", (netif != NULL)); LWIP_ASSERT("netif->state != NULL", (netif->state != NULL)); q = p = NULL; recved = i = 0; c = 0; while (1) { c = sio_recv(netif->state); switch (c) { case SLIP_END: if (recved > 0) { /* Received whole packet. */ /* Trim the pbuf to the size of the received packet. */ pbuf_realloc(q, recved); LINK_STATS_INC(link.recv); LWIP_DEBUGF(SLIP_DEBUG, ("slipif: Got packet\n")); return q; } break; case SLIP_ESC: c = sio_recv(netif->state); switch (c) { case SLIP_ESC_END: c = SLIP_END; break; case SLIP_ESC_ESC: c = SLIP_ESC; break; } /* FALLTHROUGH */ default: /* byte received, packet not yet completely received */ if (p == NULL) { /* allocate a new pbuf */ LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: alloc\n")); p = pbuf_alloc(PBUF_LINK, PBUF_POOL_BUFSIZE, PBUF_POOL); if (p == NULL) { LINK_STATS_INC(link.drop); LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: no new pbuf! (DROP)\n")); /* don't process any further since we got no pbuf to receive to */ break; } if (q != NULL) { /* 'chain' the pbuf to the existing chain */ pbuf_cat(q, p); } else { /* p is the first pbuf in the chain */ q = p; } } /* this automatically drops bytes if > MAX_SIZE */ if ((p != NULL) && (recved <= MAX_SIZE)) { ((u8_t *)p->payload)[i] = c; recved++; i++; if (i >= p->len) { /* on to the next pbuf */ i = 0; if (p->next != NULL && p->next->len > 0) { /* p is a chain, on to the next in the chain */ p = p->next; } else { /* p is a single pbuf, set it to NULL so next time a new * pbuf is allocated */ p = NULL; } } } break; } } #if ((COMPILER_TYPE!=IAR) && (COMPILER_TYPE != Keil4)) return NULL; #endif }