Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

slipif.c File Reference

#include "netif/slipif.h"
#include "lwip/opt.h"
#include "lwip/def.h"
#include "lwip/pbuf.h"
#include "lwip/sys.h"
#include "lwip/stats.h"
#include "lwip/sio.h"

Include dependency graph for slipif.c:

Go to the source code of this file.

Defines

#define SLIP_END   0300
#define SLIP_ESC   0333
#define SLIP_ESC_END   0334
#define SLIP_ESC_ESC   0335
#define MAX_SIZE   1500

Functions

err_t slipif_output (struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr)
pbufslipif_input (struct netif *netif)
void slipif_loop (void *nf)
err_t slipif_init (struct netif *netif)


Define Documentation

#define MAX_SIZE   1500
 

Definition at line 52 of file slipif.c.

Referenced by slipif_input().

#define SLIP_END   0300
 

Definition at line 47 of file slipif.c.

Referenced by slipif_input(), and slipif_output().

#define SLIP_ESC   0333
 

Definition at line 48 of file slipif.c.

Referenced by slipif_input(), and slipif_output().

#define SLIP_ESC_END   0334
 

Definition at line 49 of file slipif.c.

Referenced by slipif_input(), and slipif_output().

#define SLIP_ESC_ESC   0335
 

Definition at line 50 of file slipif.c.

Referenced by slipif_input(), and slipif_output().


Function Documentation

err_t slipif_init struct netif netif  ) 
 

SLIP netif initialization

Call the arch specific sio_open and remember the opened device in the state field of the netif.

Definition at line 197 of file slipif.c.

References DEBUGF, ERR_IF, ERR_OK, netif::mtu, netif::name, netif::num, netif::output, sio_open(), SLIP_DEBUG, slipif_loop(), slipif_output(), SLIPIF_THREAD_PRIO, netif::state, and sys_thread_new().

00198 {
00199         
00200   DEBUGF(SLIP_DEBUG, ("slipif_init: netif->num=%x\n", (int)netif->num));
00201 
00202   netif->name[0] = 's';
00203   netif->name[1] = 'l';
00204   netif->output = slipif_output;
00205   netif->mtu = 1500;    
00206 
00207   netif->state = sio_open(netif->num);
00208   if (!netif->state)
00209       return ERR_IF;
00210 
00211   sys_thread_new(slipif_loop, netif, SLIPIF_THREAD_PRIO);
00212   return ERR_OK;
00213 }

Here is the call graph for this function:

struct pbuf* slipif_input struct netif netif  )  [static]
 

Handle the incoming SLIP stream character by character

Poll the serial layer by calling sio_recv()

Returns:
The IP packet when SLIP_END is received

Definition at line 99 of file slipif.c.

References DEBUGF, MAX_SIZE, NULL, pbuf_alloc(), pbuf_chain(), PBUF_LINK, PBUF_POOL, pbuf_realloc(), sio_recv(), SLIP_DEBUG, SLIP_END, SLIP_ESC, SLIP_ESC_END, SLIP_ESC_ESC, netif::state, and u8_t.

Referenced by slipif_loop().

00100 {
00101   u8_t c;
00102   struct pbuf *p, *q;
00103   int recved;
00104   int i;
00105 
00106   q = p = NULL;
00107   recved = i = 0;
00108   c = 0;
00109 
00110   while(1) {
00111     c = sio_recv(netif->state);
00112     switch(c) {
00113     case SLIP_END:
00114       if(recved > 0) {
00115         /* Received whole packet. */
00116         pbuf_realloc(q, recved);
00117         
00118 #ifdef LINK_STATS
00119         ++lwip_stats.link.recv;
00120 #endif /* LINK_STATS */         
00121         
00122         DEBUGF(SLIP_DEBUG, ("slipif: Got packet\n"));
00123         return q;
00124       }
00125       break;
00126 
00127     case SLIP_ESC:
00128       c = sio_recv(netif->state);
00129       switch(c) {
00130       case SLIP_ESC_END:
00131         c = SLIP_END;
00132         break;
00133       case SLIP_ESC_ESC:
00134         c = SLIP_ESC;
00135         break;
00136       }
00137       /* FALLTHROUGH */
00138       
00139     default:
00140       if(p == NULL) {
00141         DEBUGF(SLIP_DEBUG, ("slipif_input: alloc\n"));
00142         p = pbuf_alloc(PBUF_LINK, PBUF_POOL_BUFSIZE, PBUF_POOL);
00143 
00144 #ifdef LINK_STATS           
00145         if(p == NULL) {
00146           ++lwip_stats.link.drop;
00147           DEBUGF(SLIP_DEBUG, ("slipif_input: no new pbuf! (DROP)\n"));
00148         }
00149 #endif /* LINK_STATS */                  
00150         
00151         if(q != NULL) {
00152           pbuf_chain(q, p);
00153         } else {
00154           q = p;
00155         }
00156       }
00157       if(p != NULL && recved < MAX_SIZE) {
00158         ((u8_t *)p->payload)[i] = c;
00159         recved++;
00160         i++;
00161         if(i >= p->len) {
00162           i = 0;
00163           p = NULL;
00164         }
00165       }
00166       break;
00167     }
00168     
00169   }
00170   return NULL;
00171 }

Here is the call graph for this function:

void slipif_loop void *  nf  )  [static]
 

The SLIP input thread

Feed the IP layer with incoming packets

Definition at line 179 of file slipif.c.

References slipif_input().

Referenced by slipif_init().

00180 {
00181   struct pbuf *p;
00182   struct netif *netif = (struct netif *)nf;
00183 
00184   while(1) {
00185     p = slipif_input(netif);
00186     netif->input(p, netif);
00187   }
00188 }

Here is the call graph for this function:

err_t slipif_output struct netif netif,
struct pbuf p,
struct ip_addr ipaddr
 

Send a pbuf doing the necessary SLIP encapsulation

Uses the serial layer's sio_send()

Definition at line 60 of file slipif.c.

References NULL, sio_send(), SLIP_END, SLIP_ESC, SLIP_ESC_END, SLIP_ESC_ESC, netif::state, and u8_t.

Referenced by slipif_init().

00061 {
00062   struct pbuf *q;
00063   int i;
00064   u8_t c;
00065 
00066   /* Send pbuf out on the serial I/O device. */
00067   sio_send(SLIP_END, netif->state);
00068 
00069   for(q = p; q != NULL; q = q->next) {
00070     for(i = 0; i < q->len; i++) {
00071       c = ((u8_t *)q->payload)[i];
00072       switch(c) {
00073       case SLIP_END:
00074         sio_send(SLIP_ESC, netif->state);
00075         sio_send(SLIP_ESC_END, netif->state);
00076         break;
00077       case SLIP_ESC:
00078         sio_send(SLIP_ESC, netif->state);
00079         sio_send(SLIP_ESC_ESC, netif->state);
00080         break;
00081       default:
00082         sio_send(c, netif->state);
00083         break;
00084       }
00085     }
00086   }
00087   sio_send(SLIP_END, netif->state);
00088   return 0;
00089 }

Here is the call graph for this function:


Generated on Wed Jan 14 12:59:12 2004 for RTL-lwIP-0.4 by doxygen 1.3.4