ソースの整理中ですが、利用はできます。

Dependencies:   EthernetInterface HttpServer TextLCD mbed-rpc mbed-rtos mbed Socket lwip-eth lwip-sys lwip

Committer:
yueee_yt
Date:
Wed Mar 12 04:19:54 2014 +0000
Revision:
0:7766f6712673
???????????????

Who changed what in which revision?

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