/** * Send a pbuf doing the necessary SLIP encapsulation * * Uses the serial layer's sio_send() */ err_t slipif_output(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr) { struct pbuf *q; int i; u8_t c; /* Send pbuf out on the serial I/O device. */ sio_send(SLIP_END, netif->state); for (q = p; q != NULL; q = q->next) { for (i = 0; i < q->len; i++) { c = ((u8_t *)q->payload)[i]; switch (c) { case SLIP_END: sio_send(SLIP_ESC, netif->state); sio_send(SLIP_ESC_END, netif->state); break; case SLIP_ESC: sio_send(SLIP_ESC, netif->state); sio_send(SLIP_ESC_ESC, netif->state); break; default: sio_send(c, netif->state); break; } } } sio_send(SLIP_END, netif->state); return 0; }
/** * Send a pbuf doing the necessary SLIP encapsulation * * Uses the serial layer's sio_send() * * @param netif the lwip network interface structure for this slipif * @param p the pbuf chaing packet to send * @param ipaddr the ip address to send the packet to (not used for slipif) * @return always returns ERR_OK since the serial layer does not provide return values */ err_t slipif_output(struct netif *netif, struct pbuf *p, ip_addr_t *ipaddr) { struct slipif_priv *priv; struct pbuf *q; u16_t i; u8_t c; LWIP_ASSERT("netif != NULL", (netif != NULL)); LWIP_ASSERT("netif->state != NULL", (netif->state != NULL)); LWIP_ASSERT("p != NULL", (p != NULL)); LWIP_UNUSED_ARG(ipaddr); LWIP_DEBUGF(SLIP_DEBUG, ("slipif_output(%"U16_F"): sending %"U16_F" bytes\n", (u16_t)netif->num, p->tot_len)); priv = netif->state; /* Send pbuf out on the serial I/O device. */ /* Start with packet delimiter. */ sio_send(SLIP_END, priv->sd); for (q = p; q != NULL; q = q->next) { for (i = 0; i < q->len; i++) { c = ((u8_t *)q->payload)[i]; switch (c) { case SLIP_END: /* need to escape this byte (0xC0 -> 0xDB, 0xDC) */ sio_send(SLIP_ESC, priv->sd); sio_send(SLIP_ESC_END, priv->sd); break; case SLIP_ESC: /* need to escape this byte (0xDB -> 0xDB, 0xDD) */ sio_send(SLIP_ESC, priv->sd); sio_send(SLIP_ESC_ESC, priv->sd); break; default: /* normal byte - no need for escaping */ sio_send(c, priv->sd); break; } } } /* End with packet delimiter. */ sio_send(SLIP_END, priv->sd); return ERR_OK; }
/** * Send a pbuf doing the necessary SLIP encapsulation * * Uses the serial layer's sio_send() * * @param netif the lwip network interface structure for this slipif * @param p the pbuf chaing packet to send * @param ipaddr the ip address to send the packet to (not used for slipif) * @return always returns ERR_OK since the serial layer does not provide return values */ err_t slipif_output(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr) { struct slipif_priv *priv; struct pbuf *q; u16_t i; u8_t c; LWIP_ASSERT("netif != NULL", (netif != NULL)); LWIP_ASSERT("netif->state != NULL", (netif->state != NULL)); LWIP_ASSERT("p != NULL", (p != NULL)); LWIP_UNUSED_ARG(ipaddr); priv = netif->state; /* Send pbuf out on the serial I/O device. */ sio_send(SLIP_END, priv->sd); for (q = p; q != NULL; q = q->next) { for (i = 0; i < q->len; i++) { c = ((u8_t *)q->payload)[i]; switch (c) { case SLIP_END: sio_send(SLIP_ESC, priv->sd); sio_send(SLIP_ESC_END, priv->sd); break; case SLIP_ESC: sio_send(SLIP_ESC, priv->sd); sio_send(SLIP_ESC_ESC, priv->sd); break; default: sio_send(c, priv->sd); break; } } } sio_send(SLIP_END, priv->sd); return ERR_OK; }