Warning, cross-references for /kernel/lwip/netif/slipif.c need to be fixed.
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 #include "netif/slipif.h"
0046 #include "lwip/opt.h"
0047
0048 #if LWIP_HAVE_SLIPIF
0049
0050 #include "lwip/def.h"
0051 #include "lwip/pbuf.h"
0052 #include "lwip/sys.h"
0053 #include "lwip/stats.h"
0054 #include "lwip/snmp.h"
0055 #include "lwip/sio.h"
0056
0057 #define SLIP_BLOCK 1
0058 #define SLIP_DONTBLOCK 0
0059
0060 #define SLIP_END 0300
0061 #define SLIP_ESC 0333
0062 #define SLIP_ESC_END 0334
0063 #define SLIP_ESC_ESC 0335
0064
0065 #define SLIP_MAX_SIZE 1500
0066
0067 enum slipif_recv_state {
0068 SLIP_RECV_NORMAL,
0069 SLIP_RECV_ESCAPE,
0070 };
0071
0072 struct slipif_priv {
0073 sio_fd_t sd;
0074
0075 struct pbuf *p, *q;
0076 enum slipif_recv_state state;
0077 u16_t i, recved;
0078 };
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090 err_t
0091 slipif_output(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr)
0092 {
0093 struct slipif_priv *priv;
0094 struct pbuf *q;
0095 u16_t i;
0096 u8_t c;
0097
0098 LWIP_ASSERT("netif != NULL", (netif != NULL));
0099 LWIP_ASSERT("netif->state != NULL", (netif->state != NULL));
0100 LWIP_ASSERT("p != NULL", (p != NULL));
0101
0102 LWIP_UNUSED_ARG(ipaddr);
0103
0104 priv = netif->state;
0105
0106
0107 sio_send(SLIP_END, priv->sd);
0108
0109 for (q = p; q != NULL; q = q->next) {
0110 for (i = 0; i < q->len; i++) {
0111 c = ((u8_t *)q->payload)[i];
0112 switch (c) {
0113 case SLIP_END:
0114 sio_send(SLIP_ESC, priv->sd);
0115 sio_send(SLIP_ESC_END, priv->sd);
0116 break;
0117 case SLIP_ESC:
0118 sio_send(SLIP_ESC, priv->sd);
0119 sio_send(SLIP_ESC_ESC, priv->sd);
0120 break;
0121 default:
0122 sio_send(c, priv->sd);
0123 break;
0124 }
0125 }
0126 }
0127 sio_send(SLIP_END, priv->sd);
0128 return ERR_OK;
0129 }
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141 static u32_t
0142 slip_sio_read(sio_fd_t fd, u8_t* data, u32_t len, u8_t block)
0143 {
0144 if (block) {
0145 return sio_read(fd, data, len);
0146 } else {
0147 return sio_tryread(fd, data, len);
0148 }
0149 }
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162 static struct pbuf *
0163 slipif_input(struct netif *netif, u8_t block)
0164 {
0165 struct slipif_priv *priv;
0166 u8_t c;
0167 struct pbuf *t;
0168
0169 LWIP_ASSERT("netif != NULL", (netif != NULL));
0170 LWIP_ASSERT("netif->state != NULL", (netif->state != NULL));
0171
0172 priv = netif->state;
0173
0174 while (slip_sio_read(priv->sd, &c, 1, block) > 0) {
0175 switch (priv->state) {
0176 case SLIP_RECV_NORMAL:
0177 switch (c) {
0178 case SLIP_END:
0179 if (priv->recved > 0) {
0180
0181
0182 pbuf_realloc(priv->q, priv->recved);
0183
0184 LINK_STATS_INC(link.recv);
0185
0186 LWIP_DEBUGF(SLIP_DEBUG, ("slipif: Got packet\n"));
0187 t = priv->q;
0188 priv->p = priv->q = NULL;
0189 priv->i = priv->recved = 0;
0190 return t;
0191 }
0192 continue;
0193 case SLIP_ESC:
0194 priv->state = SLIP_RECV_ESCAPE;
0195 continue;
0196 }
0197 break;
0198 case SLIP_RECV_ESCAPE:
0199 switch (c) {
0200 case SLIP_ESC_END:
0201 c = SLIP_END;
0202 break;
0203 case SLIP_ESC_ESC:
0204 c = SLIP_ESC;
0205 break;
0206 }
0207 priv->state = SLIP_RECV_NORMAL;
0208
0209 }
0210
0211
0212 if (priv->p == NULL) {
0213
0214 LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: alloc\n"));
0215 priv->p = pbuf_alloc(PBUF_LINK, (PBUF_POOL_BUFSIZE - PBUF_LINK_HLEN), PBUF_POOL);
0216
0217 if (priv->p == NULL) {
0218 LINK_STATS_INC(link.drop);
0219 LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: no new pbuf! (DROP)\n"));
0220
0221 break;
0222 }
0223
0224 if (priv->q != NULL) {
0225
0226 pbuf_cat(priv->q, priv->p);
0227 } else {
0228
0229 priv->q = priv->p;
0230 }
0231 }
0232
0233
0234 if ((priv->p != NULL) && (priv->recved <= SLIP_MAX_SIZE)) {
0235 ((u8_t *)priv->p->payload)[priv->i] = c;
0236 priv->recved++;
0237 priv->i++;
0238 if (priv->i >= priv->p->len) {
0239
0240 priv->i = 0;
0241 if (priv->p->next != NULL && priv->p->next->len > 0) {
0242
0243 priv->p = priv->p->next;
0244 } else {
0245
0246
0247 priv->p = NULL;
0248 }
0249 }
0250 }
0251 }
0252
0253 return NULL;
0254 }
0255
0256 #if !NO_SYS
0257
0258
0259
0260
0261
0262
0263
0264 static void
0265 slipif_loop_thread(void *nf)
0266 {
0267 struct pbuf *p;
0268 struct netif *netif = (struct netif *)nf;
0269
0270 while (1) {
0271 p = slipif_input(netif, SLIP_BLOCK);
0272 if (p != NULL) {
0273 if (netif->input(p, netif) != ERR_OK) {
0274 pbuf_free(p);
0275 p = NULL;
0276 }
0277 }
0278 }
0279 }
0280 #endif
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296 err_t
0297 slipif_init(struct netif *netif)
0298 {
0299 struct slipif_priv *priv;
0300
0301 LWIP_DEBUGF(SLIP_DEBUG, ("slipif_init: netif->num=%"U16_F"\n", (u16_t)netif->num));
0302
0303
0304 priv = mem_malloc(sizeof(struct slipif_priv));
0305 if (!priv) {
0306 return ERR_MEM;
0307 }
0308
0309 netif->name[0] = 's';
0310 netif->name[1] = 'l';
0311 netif->output = slipif_output;
0312 netif->mtu = SLIP_MAX_SIZE;
0313 netif->flags |= NETIF_FLAG_POINTTOPOINT;
0314
0315
0316 priv->sd = sio_open(netif->num);
0317 if (!priv->sd) {
0318
0319 mem_free(priv);
0320 return ERR_IF;
0321 }
0322
0323
0324 priv->p = NULL;
0325 priv->q = NULL;
0326 priv->state = SLIP_RECV_NORMAL;
0327 priv->i = 0;
0328 priv->recved = 0;
0329
0330 netif->state = priv;
0331
0332
0333
0334
0335
0336 NETIF_INIT_SNMP(netif, snmp_ifType_slip, 0);
0337
0338
0339 sys_thread_new(SLIPIF_THREAD_NAME, slipif_loop_thread, netif,
0340 SLIPIF_THREAD_STACKSIZE, SLIPIF_THREAD_PRIO);
0341 return ERR_OK;
0342 }
0343
0344
0345
0346
0347
0348
0349 void
0350 slipif_poll(struct netif *netif)
0351 {
0352 struct pbuf *p;
0353 struct slipif_priv *priv;
0354
0355 LWIP_ASSERT("netif != NULL", (netif != NULL));
0356 LWIP_ASSERT("netif->state != NULL", (netif->state != NULL));
0357
0358 priv = netif->state;
0359
0360 while ((p = slipif_input(netif, SLIP_DONTBLOCK)) != NULL) {
0361 if (netif->input(p, netif) != ERR_OK) {
0362 pbuf_free(p);
0363 }
0364 }
0365 }
0366
0367 #endif