Example program with HTTPServer and sensor data streaming over TCPSockets, using Donatien Garnier's Net APIs and services code on top of LWIP. Files StreamServer.h and .cpp encapsulate streaming over TCPSockets. Broadcast is done by sendToAll(), and all incoming data is echoed back to the client. Echo code can be replaced with some remote control of the streaming interface. See main() that shows how to periodically send some data to all subscribed clients. To subscribe, a client should open a socket at <mbed_ip> port 123. I used few lines in TCL code to set up a quick sink for the data. HTTP files are served on port 80 concurrently to the streaming.

Dependencies:   mbed

Committer:
iva2k
Date:
Mon Jun 14 03:24:33 2010 +0000
Revision:
1:3ee499525aa5
Parent:
0:e614f7875b60

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
iva2k 0:e614f7875b60 1 /**
iva2k 0:e614f7875b60 2 * @file
iva2k 0:e614f7875b60 3 * SLIP Interface
iva2k 0:e614f7875b60 4 *
iva2k 0:e614f7875b60 5 */
iva2k 0:e614f7875b60 6
iva2k 0:e614f7875b60 7 /*
iva2k 0:e614f7875b60 8 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
iva2k 0:e614f7875b60 9 * All rights reserved.
iva2k 0:e614f7875b60 10 *
iva2k 0:e614f7875b60 11 * Redistribution and use in source and binary forms, with or without
iva2k 0:e614f7875b60 12 * modification, are permitted provided that the following conditions
iva2k 0:e614f7875b60 13 * are met:
iva2k 0:e614f7875b60 14 * 1. Redistributions of source code must retain the above copyright
iva2k 0:e614f7875b60 15 * notice, this list of conditions and the following disclaimer.
iva2k 0:e614f7875b60 16 * 2. Redistributions in binary form must reproduce the above copyright
iva2k 0:e614f7875b60 17 * notice, this list of conditions and the following disclaimer in the
iva2k 0:e614f7875b60 18 * documentation and/or other materials provided with the distribution.
iva2k 0:e614f7875b60 19 * 3. Neither the name of the Institute nor the names of its contributors
iva2k 0:e614f7875b60 20 * may be used to endorse or promote products derived from this software
iva2k 0:e614f7875b60 21 * without specific prior written permission.
iva2k 0:e614f7875b60 22 *
iva2k 0:e614f7875b60 23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
iva2k 0:e614f7875b60 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
iva2k 0:e614f7875b60 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
iva2k 0:e614f7875b60 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
iva2k 0:e614f7875b60 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
iva2k 0:e614f7875b60 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
iva2k 0:e614f7875b60 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
iva2k 0:e614f7875b60 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
iva2k 0:e614f7875b60 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
iva2k 0:e614f7875b60 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
iva2k 0:e614f7875b60 33 * SUCH DAMAGE.
iva2k 0:e614f7875b60 34 *
iva2k 0:e614f7875b60 35 * This file is built upon the file: src/arch/rtxc/netif/sioslip.c
iva2k 0:e614f7875b60 36 *
iva2k 0:e614f7875b60 37 * Author: Magnus Ivarsson <magnus.ivarsson(at)volvo.com>
iva2k 0:e614f7875b60 38 */
iva2k 0:e614f7875b60 39
iva2k 0:e614f7875b60 40 /*
iva2k 0:e614f7875b60 41 * This is an arch independent SLIP netif. The specific serial hooks must be
iva2k 0:e614f7875b60 42 * provided by another file. They are sio_open, sio_read/sio_tryread and sio_send
iva2k 0:e614f7875b60 43 */
iva2k 0:e614f7875b60 44
iva2k 0:e614f7875b60 45 #include "netif/slipif.h"
iva2k 0:e614f7875b60 46 #include "lwip/opt.h"
iva2k 0:e614f7875b60 47
iva2k 0:e614f7875b60 48 #if LWIP_HAVE_SLIPIF
iva2k 0:e614f7875b60 49
iva2k 0:e614f7875b60 50 #include "lwip/def.h"
iva2k 0:e614f7875b60 51 #include "lwip/pbuf.h"
iva2k 0:e614f7875b60 52 #include "lwip/sys.h"
iva2k 0:e614f7875b60 53 #include "lwip/stats.h"
iva2k 0:e614f7875b60 54 #include "lwip/snmp.h"
iva2k 0:e614f7875b60 55 #include "lwip/sio.h"
iva2k 0:e614f7875b60 56
iva2k 0:e614f7875b60 57 #define SLIP_BLOCK 1
iva2k 0:e614f7875b60 58 #define SLIP_DONTBLOCK 0
iva2k 0:e614f7875b60 59
iva2k 0:e614f7875b60 60 #define SLIP_END 0300 /* 0xC0 */
iva2k 0:e614f7875b60 61 #define SLIP_ESC 0333 /* 0xDB */
iva2k 0:e614f7875b60 62 #define SLIP_ESC_END 0334 /* 0xDC */
iva2k 0:e614f7875b60 63 #define SLIP_ESC_ESC 0335 /* 0xDD */
iva2k 0:e614f7875b60 64
iva2k 0:e614f7875b60 65 #define SLIP_MAX_SIZE 1500
iva2k 0:e614f7875b60 66
iva2k 0:e614f7875b60 67 enum slipif_recv_state {
iva2k 0:e614f7875b60 68 SLIP_RECV_NORMAL,
iva2k 0:e614f7875b60 69 SLIP_RECV_ESCAPE,
iva2k 0:e614f7875b60 70 };
iva2k 0:e614f7875b60 71
iva2k 0:e614f7875b60 72 struct slipif_priv {
iva2k 0:e614f7875b60 73 sio_fd_t sd;
iva2k 0:e614f7875b60 74 /* q is the whole pbuf chain for a packet, p is the current pbuf in the chain */
iva2k 0:e614f7875b60 75 struct pbuf *p, *q;
iva2k 0:e614f7875b60 76 enum slipif_recv_state state;
iva2k 0:e614f7875b60 77 u16_t i, recved;
iva2k 0:e614f7875b60 78 };
iva2k 0:e614f7875b60 79
iva2k 0:e614f7875b60 80 /**
iva2k 0:e614f7875b60 81 * Send a pbuf doing the necessary SLIP encapsulation
iva2k 0:e614f7875b60 82 *
iva2k 0:e614f7875b60 83 * Uses the serial layer's sio_send()
iva2k 0:e614f7875b60 84 *
iva2k 0:e614f7875b60 85 * @param netif the lwip network interface structure for this slipif
iva2k 0:e614f7875b60 86 * @param p the pbuf chaing packet to send
iva2k 0:e614f7875b60 87 * @param ipaddr the ip address to send the packet to (not used for slipif)
iva2k 0:e614f7875b60 88 * @return always returns ERR_OK since the serial layer does not provide return values
iva2k 0:e614f7875b60 89 */
iva2k 0:e614f7875b60 90 err_t
iva2k 0:e614f7875b60 91 slipif_output(struct netif *netif, struct pbuf *p, ip_addr_t *ipaddr)
iva2k 0:e614f7875b60 92 {
iva2k 0:e614f7875b60 93 struct slipif_priv *priv;
iva2k 0:e614f7875b60 94 struct pbuf *q;
iva2k 0:e614f7875b60 95 u16_t i;
iva2k 0:e614f7875b60 96 u8_t c;
iva2k 0:e614f7875b60 97
iva2k 0:e614f7875b60 98 LWIP_ASSERT("netif != NULL", (netif != NULL));
iva2k 0:e614f7875b60 99 LWIP_ASSERT("netif->state != NULL", (netif->state != NULL));
iva2k 0:e614f7875b60 100 LWIP_ASSERT("p != NULL", (p != NULL));
iva2k 0:e614f7875b60 101
iva2k 0:e614f7875b60 102 LWIP_UNUSED_ARG(ipaddr);
iva2k 0:e614f7875b60 103
iva2k 0:e614f7875b60 104 priv = netif->state;
iva2k 0:e614f7875b60 105
iva2k 0:e614f7875b60 106 /* Send pbuf out on the serial I/O device. */
iva2k 0:e614f7875b60 107 sio_send(SLIP_END, priv->sd);
iva2k 0:e614f7875b60 108
iva2k 0:e614f7875b60 109 for (q = p; q != NULL; q = q->next) {
iva2k 0:e614f7875b60 110 for (i = 0; i < q->len; i++) {
iva2k 0:e614f7875b60 111 c = ((u8_t *)q->payload)[i];
iva2k 0:e614f7875b60 112 switch (c) {
iva2k 0:e614f7875b60 113 case SLIP_END:
iva2k 0:e614f7875b60 114 sio_send(SLIP_ESC, priv->sd);
iva2k 0:e614f7875b60 115 sio_send(SLIP_ESC_END, priv->sd);
iva2k 0:e614f7875b60 116 break;
iva2k 0:e614f7875b60 117 case SLIP_ESC:
iva2k 0:e614f7875b60 118 sio_send(SLIP_ESC, priv->sd);
iva2k 0:e614f7875b60 119 sio_send(SLIP_ESC_ESC, priv->sd);
iva2k 0:e614f7875b60 120 break;
iva2k 0:e614f7875b60 121 default:
iva2k 0:e614f7875b60 122 sio_send(c, priv->sd);
iva2k 0:e614f7875b60 123 break;
iva2k 0:e614f7875b60 124 }
iva2k 0:e614f7875b60 125 }
iva2k 0:e614f7875b60 126 }
iva2k 0:e614f7875b60 127 sio_send(SLIP_END, priv->sd);
iva2k 0:e614f7875b60 128 return ERR_OK;
iva2k 0:e614f7875b60 129 }
iva2k 0:e614f7875b60 130
iva2k 0:e614f7875b60 131 /**
iva2k 0:e614f7875b60 132 * Static function for easy use of blockig or non-blocking
iva2k 0:e614f7875b60 133 * sio_read
iva2k 0:e614f7875b60 134 *
iva2k 0:e614f7875b60 135 * @param fd serial device handle
iva2k 0:e614f7875b60 136 * @param data pointer to data buffer for receiving
iva2k 0:e614f7875b60 137 * @param len maximum length (in bytes) of data to receive
iva2k 0:e614f7875b60 138 * @param block if 1, call sio_read; if 0, call sio_tryread
iva2k 0:e614f7875b60 139 * @return return value of sio_read of sio_tryread
iva2k 0:e614f7875b60 140 */
iva2k 0:e614f7875b60 141 static u32_t
iva2k 0:e614f7875b60 142 slip_sio_read(sio_fd_t fd, u8_t* data, u32_t len, u8_t block)
iva2k 0:e614f7875b60 143 {
iva2k 0:e614f7875b60 144 if (block) {
iva2k 0:e614f7875b60 145 return sio_read(fd, data, len);
iva2k 0:e614f7875b60 146 } else {
iva2k 0:e614f7875b60 147 return sio_tryread(fd, data, len);
iva2k 0:e614f7875b60 148 }
iva2k 0:e614f7875b60 149 }
iva2k 0:e614f7875b60 150
iva2k 0:e614f7875b60 151 /**
iva2k 0:e614f7875b60 152 * Handle the incoming SLIP stream character by character
iva2k 0:e614f7875b60 153 *
iva2k 0:e614f7875b60 154 * Poll the serial layer by calling sio_read() or sio_tryread().
iva2k 0:e614f7875b60 155 *
iva2k 0:e614f7875b60 156 * @param netif the lwip network interface structure for this slipif
iva2k 0:e614f7875b60 157 * @param block if 1, block until data is received; if 0, return when all data
iva2k 0:e614f7875b60 158 * from the buffer is received (multiple calls to this function will
iva2k 0:e614f7875b60 159 * return a complete packet, NULL is returned before - used for polling)
iva2k 0:e614f7875b60 160 * @return The IP packet when SLIP_END is received
iva2k 0:e614f7875b60 161 */
iva2k 0:e614f7875b60 162 static struct pbuf *
iva2k 0:e614f7875b60 163 slipif_input(struct netif *netif, u8_t block)
iva2k 0:e614f7875b60 164 {
iva2k 0:e614f7875b60 165 struct slipif_priv *priv;
iva2k 0:e614f7875b60 166 u8_t c;
iva2k 0:e614f7875b60 167 struct pbuf *t;
iva2k 0:e614f7875b60 168
iva2k 0:e614f7875b60 169 LWIP_ASSERT("netif != NULL", (netif != NULL));
iva2k 0:e614f7875b60 170 LWIP_ASSERT("netif->state != NULL", (netif->state != NULL));
iva2k 0:e614f7875b60 171
iva2k 0:e614f7875b60 172 priv = netif->state;
iva2k 0:e614f7875b60 173
iva2k 0:e614f7875b60 174 while (slip_sio_read(priv->sd, &c, 1, block) > 0) {
iva2k 0:e614f7875b60 175 switch (priv->state) {
iva2k 0:e614f7875b60 176 case SLIP_RECV_NORMAL:
iva2k 0:e614f7875b60 177 switch (c) {
iva2k 0:e614f7875b60 178 case SLIP_END:
iva2k 0:e614f7875b60 179 if (priv->recved > 0) {
iva2k 0:e614f7875b60 180 /* Received whole packet. */
iva2k 0:e614f7875b60 181 /* Trim the pbuf to the size of the received packet. */
iva2k 0:e614f7875b60 182 pbuf_realloc(priv->q, priv->recved);
iva2k 0:e614f7875b60 183
iva2k 0:e614f7875b60 184 LINK_STATS_INC(link.recv);
iva2k 0:e614f7875b60 185
iva2k 0:e614f7875b60 186 LWIP_DEBUGF(SLIP_DEBUG, ("slipif: Got packet\n"));
iva2k 0:e614f7875b60 187 t = priv->q;
iva2k 0:e614f7875b60 188 priv->p = priv->q = NULL;
iva2k 0:e614f7875b60 189 priv->i = priv->recved = 0;
iva2k 0:e614f7875b60 190 return t;
iva2k 0:e614f7875b60 191 }
iva2k 0:e614f7875b60 192 continue;
iva2k 0:e614f7875b60 193 case SLIP_ESC:
iva2k 0:e614f7875b60 194 priv->state = SLIP_RECV_ESCAPE;
iva2k 0:e614f7875b60 195 continue;
iva2k 0:e614f7875b60 196 }
iva2k 0:e614f7875b60 197 break;
iva2k 0:e614f7875b60 198 case SLIP_RECV_ESCAPE:
iva2k 0:e614f7875b60 199 switch (c) {
iva2k 0:e614f7875b60 200 case SLIP_ESC_END:
iva2k 0:e614f7875b60 201 c = SLIP_END;
iva2k 0:e614f7875b60 202 break;
iva2k 0:e614f7875b60 203 case SLIP_ESC_ESC:
iva2k 0:e614f7875b60 204 c = SLIP_ESC;
iva2k 0:e614f7875b60 205 break;
iva2k 0:e614f7875b60 206 }
iva2k 0:e614f7875b60 207 priv->state = SLIP_RECV_NORMAL;
iva2k 0:e614f7875b60 208 /* FALLTHROUGH */
iva2k 0:e614f7875b60 209 }
iva2k 0:e614f7875b60 210
iva2k 0:e614f7875b60 211 /* byte received, packet not yet completely received */
iva2k 0:e614f7875b60 212 if (priv->p == NULL) {
iva2k 0:e614f7875b60 213 /* allocate a new pbuf */
iva2k 0:e614f7875b60 214 LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: alloc\n"));
iva2k 0:e614f7875b60 215 priv->p = pbuf_alloc(PBUF_LINK, (PBUF_POOL_BUFSIZE - PBUF_LINK_HLEN), PBUF_POOL);
iva2k 0:e614f7875b60 216
iva2k 0:e614f7875b60 217 if (priv->p == NULL) {
iva2k 0:e614f7875b60 218 LINK_STATS_INC(link.drop);
iva2k 0:e614f7875b60 219 LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: no new pbuf! (DROP)\n"));
iva2k 0:e614f7875b60 220 /* don't process any further since we got no pbuf to receive to */
iva2k 0:e614f7875b60 221 break;
iva2k 0:e614f7875b60 222 }
iva2k 0:e614f7875b60 223
iva2k 0:e614f7875b60 224 if (priv->q != NULL) {
iva2k 0:e614f7875b60 225 /* 'chain' the pbuf to the existing chain */
iva2k 0:e614f7875b60 226 pbuf_cat(priv->q, priv->p);
iva2k 0:e614f7875b60 227 } else {
iva2k 0:e614f7875b60 228 /* p is the first pbuf in the chain */
iva2k 0:e614f7875b60 229 priv->q = priv->p;
iva2k 0:e614f7875b60 230 }
iva2k 0:e614f7875b60 231 }
iva2k 0:e614f7875b60 232
iva2k 0:e614f7875b60 233 /* this automatically drops bytes if > SLIP_MAX_SIZE */
iva2k 0:e614f7875b60 234 if ((priv->p != NULL) && (priv->recved <= SLIP_MAX_SIZE)) {
iva2k 0:e614f7875b60 235 ((u8_t *)priv->p->payload)[priv->i] = c;
iva2k 0:e614f7875b60 236 priv->recved++;
iva2k 0:e614f7875b60 237 priv->i++;
iva2k 0:e614f7875b60 238 if (priv->i >= priv->p->len) {
iva2k 0:e614f7875b60 239 /* on to the next pbuf */
iva2k 0:e614f7875b60 240 priv->i = 0;
iva2k 0:e614f7875b60 241 if (priv->p->next != NULL && priv->p->next->len > 0) {
iva2k 0:e614f7875b60 242 /* p is a chain, on to the next in the chain */
iva2k 0:e614f7875b60 243 priv->p = priv->p->next;
iva2k 0:e614f7875b60 244 } else {
iva2k 0:e614f7875b60 245 /* p is a single pbuf, set it to NULL so next time a new
iva2k 0:e614f7875b60 246 * pbuf is allocated */
iva2k 0:e614f7875b60 247 priv->p = NULL;
iva2k 0:e614f7875b60 248 }
iva2k 0:e614f7875b60 249 }
iva2k 0:e614f7875b60 250 }
iva2k 0:e614f7875b60 251 }
iva2k 0:e614f7875b60 252
iva2k 0:e614f7875b60 253 return NULL;
iva2k 0:e614f7875b60 254 }
iva2k 0:e614f7875b60 255
iva2k 0:e614f7875b60 256 #if !NO_SYS
iva2k 0:e614f7875b60 257 /**
iva2k 0:e614f7875b60 258 * The SLIP input thread.
iva2k 0:e614f7875b60 259 *
iva2k 0:e614f7875b60 260 * Feed the IP layer with incoming packets
iva2k 0:e614f7875b60 261 *
iva2k 0:e614f7875b60 262 * @param nf the lwip network interface structure for this slipif
iva2k 0:e614f7875b60 263 */
iva2k 0:e614f7875b60 264 static void
iva2k 0:e614f7875b60 265 slipif_loop_thread(void *nf)
iva2k 0:e614f7875b60 266 {
iva2k 0:e614f7875b60 267 struct pbuf *p;
iva2k 0:e614f7875b60 268 struct netif *netif = (struct netif *)nf;
iva2k 0:e614f7875b60 269
iva2k 0:e614f7875b60 270 while (1) {
iva2k 0:e614f7875b60 271 p = slipif_input(netif, SLIP_BLOCK);
iva2k 0:e614f7875b60 272 if (p != NULL) {
iva2k 0:e614f7875b60 273 if (netif->input(p, netif) != ERR_OK) {
iva2k 0:e614f7875b60 274 pbuf_free(p);
iva2k 0:e614f7875b60 275 p = NULL;
iva2k 0:e614f7875b60 276 }
iva2k 0:e614f7875b60 277 }
iva2k 0:e614f7875b60 278 }
iva2k 0:e614f7875b60 279 }
iva2k 0:e614f7875b60 280 #endif /* !NO_SYS */
iva2k 0:e614f7875b60 281
iva2k 0:e614f7875b60 282 /**
iva2k 0:e614f7875b60 283 * SLIP netif initialization
iva2k 0:e614f7875b60 284 *
iva2k 0:e614f7875b60 285 * Call the arch specific sio_open and remember
iva2k 0:e614f7875b60 286 * the opened device in the state field of the netif.
iva2k 0:e614f7875b60 287 *
iva2k 0:e614f7875b60 288 * @param netif the lwip network interface structure for this slipif
iva2k 0:e614f7875b60 289 * @return ERR_OK if serial line could be opened,
iva2k 0:e614f7875b60 290 * ERR_MEM if no memory could be allocated,
iva2k 0:e614f7875b60 291 * ERR_IF is serial line couldn't be opened
iva2k 0:e614f7875b60 292 *
iva2k 0:e614f7875b60 293 * @note netif->num must contain the number of the serial port to open
iva2k 0:e614f7875b60 294 * (0 by default)
iva2k 0:e614f7875b60 295 */
iva2k 0:e614f7875b60 296 err_t
iva2k 0:e614f7875b60 297 slipif_init(struct netif *netif)
iva2k 0:e614f7875b60 298 {
iva2k 0:e614f7875b60 299 struct slipif_priv *priv;
iva2k 0:e614f7875b60 300
iva2k 0:e614f7875b60 301 LWIP_DEBUGF(SLIP_DEBUG, ("slipif_init: netif->num=%"U16_F"\n", (u16_t)netif->num));
iva2k 0:e614f7875b60 302
iva2k 0:e614f7875b60 303 /* Allocate private data */
iva2k 0:e614f7875b60 304 priv = mem_malloc(sizeof(struct slipif_priv));
iva2k 0:e614f7875b60 305 if (!priv) {
iva2k 0:e614f7875b60 306 return ERR_MEM;
iva2k 0:e614f7875b60 307 }
iva2k 0:e614f7875b60 308
iva2k 0:e614f7875b60 309 netif->name[0] = 's';
iva2k 0:e614f7875b60 310 netif->name[1] = 'l';
iva2k 0:e614f7875b60 311 netif->output = slipif_output;
iva2k 0:e614f7875b60 312 netif->mtu = SLIP_MAX_SIZE;
iva2k 0:e614f7875b60 313 netif->flags |= NETIF_FLAG_POINTTOPOINT;
iva2k 0:e614f7875b60 314
iva2k 0:e614f7875b60 315 /* Try to open the serial port (netif->num contains the port number). */
iva2k 0:e614f7875b60 316 priv->sd = sio_open(netif->num);
iva2k 0:e614f7875b60 317 if (!priv->sd) {
iva2k 0:e614f7875b60 318 /* Opening the serial port failed. */
iva2k 0:e614f7875b60 319 mem_free(priv);
iva2k 0:e614f7875b60 320 return ERR_IF;
iva2k 0:e614f7875b60 321 }
iva2k 0:e614f7875b60 322
iva2k 0:e614f7875b60 323 /* Initialize private data */
iva2k 0:e614f7875b60 324 priv->p = NULL;
iva2k 0:e614f7875b60 325 priv->q = NULL;
iva2k 0:e614f7875b60 326 priv->state = SLIP_RECV_NORMAL;
iva2k 0:e614f7875b60 327 priv->i = 0;
iva2k 0:e614f7875b60 328 priv->recved = 0;
iva2k 0:e614f7875b60 329
iva2k 0:e614f7875b60 330 netif->state = priv;
iva2k 0:e614f7875b60 331
iva2k 0:e614f7875b60 332 /* initialize the snmp variables and counters inside the struct netif
iva2k 0:e614f7875b60 333 * ifSpeed: no assumption can be made without knowing more about the
iva2k 0:e614f7875b60 334 * serial line!
iva2k 0:e614f7875b60 335 */
iva2k 0:e614f7875b60 336 NETIF_INIT_SNMP(netif, snmp_ifType_slip, 0);
iva2k 0:e614f7875b60 337
iva2k 0:e614f7875b60 338 /* Create a thread to poll the serial line. */
iva2k 0:e614f7875b60 339 sys_thread_new(SLIPIF_THREAD_NAME, slipif_loop_thread, netif,
iva2k 0:e614f7875b60 340 SLIPIF_THREAD_STACKSIZE, SLIPIF_THREAD_PRIO);
iva2k 0:e614f7875b60 341 return ERR_OK;
iva2k 0:e614f7875b60 342 }
iva2k 0:e614f7875b60 343
iva2k 0:e614f7875b60 344 /**
iva2k 0:e614f7875b60 345 * Polls the serial device and feeds the IP layer with incoming packets.
iva2k 0:e614f7875b60 346 *
iva2k 0:e614f7875b60 347 * @param netif The lwip network interface structure for this slipif
iva2k 0:e614f7875b60 348 */
iva2k 0:e614f7875b60 349 void
iva2k 0:e614f7875b60 350 slipif_poll(struct netif *netif)
iva2k 0:e614f7875b60 351 {
iva2k 0:e614f7875b60 352 struct pbuf *p;
iva2k 0:e614f7875b60 353 struct slipif_priv *priv;
iva2k 0:e614f7875b60 354
iva2k 0:e614f7875b60 355 LWIP_ASSERT("netif != NULL", (netif != NULL));
iva2k 0:e614f7875b60 356 LWIP_ASSERT("netif->state != NULL", (netif->state != NULL));
iva2k 0:e614f7875b60 357
iva2k 0:e614f7875b60 358 priv = netif->state;
iva2k 0:e614f7875b60 359
iva2k 0:e614f7875b60 360 while ((p = slipif_input(netif, SLIP_DONTBLOCK)) != NULL) {
iva2k 0:e614f7875b60 361 if (netif->input(p, netif) != ERR_OK) {
iva2k 0:e614f7875b60 362 pbuf_free(p);
iva2k 0:e614f7875b60 363 }
iva2k 0:e614f7875b60 364 }
iva2k 0:e614f7875b60 365 }
iva2k 0:e614f7875b60 366
iva2k 0:e614f7875b60 367 #endif /* LWIP_HAVE_SLIPIF */