diff --git a/arch/platform/jn516x/lib/slip.c b/arch/platform/jn516x/lib/slip.c index 8e66c5f66..a5ce4c16d 100644 --- a/arch/platform/jn516x/lib/slip.c +++ b/arch/platform/jn516x/lib/slip.c @@ -167,7 +167,7 @@ slip_write_char(uint8_t c) slip_arch_writeb(c); } /*---------------------------------------------------------------------------*/ -uint8_t +void slip_write(const void *_ptr, int len) { const uint8_t *ptr = _ptr; @@ -181,14 +181,12 @@ slip_write(const void *_ptr, int len) slip_write_char(c); } slip_arch_writeb(SLIP_END); - - return len; } /*---------------------------------------------------------------------------*/ /* slip_send: forward (IPv4) packets with {UIP_FW_NETIF(..., slip_send)} * was used in slip-bridge.c */ -uint8_t +void slip_send(void) { uint16_t i; @@ -203,8 +201,6 @@ slip_send(void) slip_write_char(c); } slip_arch_writeb(SLIP_END); - - return UIP_FW_OK; } /*---------------------------------------------------------------------------*/ static void diff --git a/examples/slip-radio/project-conf.h b/examples/slip-radio/project-conf.h index 89e135a42..2f05bec5e 100644 --- a/examples/slip-radio/project-conf.h +++ b/examples/slip-radio/project-conf.h @@ -37,7 +37,7 @@ /*---------------------------------------------------------------------------*/ #define UIP_CONF_ROUTER 0 -#define CMD_CONF_OUTPUT slip_radio_cmd_output +#define CMD_CONF_OUTPUT slip_write /* Default CMD handlers if the target did not specify them */ #ifndef CMD_CONF_HANDLERS diff --git a/examples/slip-radio/slip-net.c b/examples/slip-radio/slip-net.c index 1a787c85c..e1efbf4cf 100644 --- a/examples/slip-radio/slip-net.c +++ b/examples/slip-radio/slip-net.c @@ -49,27 +49,6 @@ slipnet_init(void) { } /*---------------------------------------------------------------------------*/ -void -slip_send_packet(const uint8_t *ptr, int len) -{ - uint16_t i; - uint8_t c; - - slip_arch_writeb(SLIP_END); - for(i = 0; i < len; ++i) { - c = *ptr++; - if(c == SLIP_END) { - slip_arch_writeb(SLIP_ESC); - c = SLIP_ESC_END; - } else if(c == SLIP_ESC) { - slip_arch_writeb(SLIP_ESC); - c = SLIP_ESC_ESC; - } - slip_arch_writeb(c); - } - slip_arch_writeb(SLIP_END); -} -/*---------------------------------------------------------------------------*/ static void slipnet_input(void) { @@ -94,7 +73,7 @@ slipnet_input(void) } LOG_DBG_("\n"); - slip_send_packet(uip_buf, uip_len); + slip_write(uip_buf, uip_len); } /*---------------------------------------------------------------------------*/ static uint8_t diff --git a/examples/slip-radio/slip-radio.c b/examples/slip-radio/slip-radio.c index 720bc9694..53a0324bc 100644 --- a/examples/slip-radio/slip-radio.c +++ b/examples/slip-radio/slip-radio.c @@ -56,8 +56,6 @@ extern const struct slip_radio_sensors SLIP_RADIO_CONF_SENSORS; #endif -void slip_send_packet(const uint8_t *ptr, int len); - /* max 16 packets at the same time??? */ uint8_t packet_ids[16]; int packet_pos; @@ -187,12 +185,6 @@ slip_radio_cmd_handler(const uint8_t *data, int len) return 0; } /*---------------------------------------------------------------------------*/ -void -slip_radio_cmd_output(const uint8_t *data, int data_len) -{ - slip_send_packet(data, data_len); -} -/*---------------------------------------------------------------------------*/ static void slip_input_callback(void) { diff --git a/os/dev/slip.c b/os/dev/slip.c index b27dca332..3cfe9ea07 100644 --- a/os/dev/slip.c +++ b/os/dev/slip.c @@ -26,48 +26,41 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * This file is part of the Contiki operating system. - * */ - +/*---------------------------------------------------------------------------*/ +#include "contiki.h" +#include "net/ipv6/uip.h" +#include "dev/slip.h" #include #include - -#include "contiki.h" - -#include "net/ipv6/uip.h" -#define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN]) - -#include "dev/slip.h" - +/*---------------------------------------------------------------------------*/ #define SLIP_END 0300 #define SLIP_ESC 0333 #define SLIP_ESC_END 0334 #define SLIP_ESC_ESC 0335 - +/*---------------------------------------------------------------------------*/ PROCESS(slip_process, "SLIP driver"); - -uint8_t slip_active; - -#if 1 -#define SLIP_STATISTICS(statement) -#else -uint16_t slip_rubbish, slip_twopackets, slip_overflow, slip_ip_drop; +/*---------------------------------------------------------------------------*/ +static uint8_t slip_active; +/*---------------------------------------------------------------------------*/ +#if SLIP_CONF_WITH_STATS +static uint16_t slip_rubbish, slip_twopackets, slip_overflow, slip_ip_drop; #define SLIP_STATISTICS(statement) statement +#else +#define SLIP_STATISTICS(statement) #endif - +/*---------------------------------------------------------------------------*/ /* Must be at least one byte larger than UIP_BUFSIZE! */ #define RX_BUFSIZE (UIP_BUFSIZE - UIP_LLH_LEN + 16) - +/*---------------------------------------------------------------------------*/ enum { - STATE_TWOPACKETS = 0, /* We have 2 packets and drop incoming data. */ + STATE_TWOPACKETS = 0, /* We have 2 packets and drop incoming data. */ STATE_OK = 1, STATE_ESC = 2, STATE_RUBBISH = 3, }; - +/*---------------------------------------------------------------------------*/ /* * Variables begin and end manage the buffer space in a cyclic * fashion. The first used byte is at begin and end is one byte past @@ -78,13 +71,12 @@ enum { * [pkt_end, end). If more bytes arrive in state STATE_TWOPACKETS * they are discarded. */ - static uint8_t state = STATE_TWOPACKETS; static uint16_t begin, next_free; static uint8_t rxbuf[RX_BUFSIZE]; -static uint16_t pkt_end; /* SLIP_END tracker. */ +static uint16_t pkt_end; /* SLIP_END tracker. */ -static void (* input_callback)(void) = NULL; +static void (*input_callback)(void) = NULL; /*---------------------------------------------------------------------------*/ void slip_set_input_callback(void (*c)(void)) @@ -92,36 +84,13 @@ slip_set_input_callback(void (*c)(void)) input_callback = c; } /*---------------------------------------------------------------------------*/ -/* slip_send: forward (IPv4) packets with {UIP_FW_NETIF(..., slip_send)} - * was used in slip-bridge.c - */ -uint8_t +void slip_send(void) { - uint16_t i; - uint8_t *ptr; - uint8_t c; - - slip_arch_writeb(SLIP_END); - - ptr = &uip_buf[UIP_LLH_LEN]; - for(i = 0; i < uip_len; ++i) { - c = *ptr++; - if(c == SLIP_END) { - slip_arch_writeb(SLIP_ESC); - c = SLIP_ESC_END; - } else if(c == SLIP_ESC) { - slip_arch_writeb(SLIP_ESC); - c = SLIP_ESC_ESC; - } - slip_arch_writeb(c); - } - slip_arch_writeb(SLIP_END); - - return UIP_FW_OK; + slip_write(&uip_buf[UIP_LLH_LEN], uip_len); } /*---------------------------------------------------------------------------*/ -uint8_t +void slip_write(const void *_ptr, int len) { const uint8_t *ptr = _ptr; @@ -141,9 +110,8 @@ slip_write(const void *_ptr, int len) } slip_arch_writeb(c); } - slip_arch_writeb(SLIP_END); - return len; + slip_arch_writeb(SLIP_END); } /*---------------------------------------------------------------------------*/ static void @@ -153,56 +121,9 @@ rxbuf_init(void) state = STATE_OK; } /*---------------------------------------------------------------------------*/ -/* Upper half does the polling. */ static uint16_t slip_poll_handler(uint8_t *outbuf, uint16_t blen) { -#ifdef SLIP_CONF_MICROSOFT_CHAT - /* This is a hack and won't work across buffer edge! */ - if(rxbuf[begin] == 'C') { - int i; - if(begin < next_free && (next_free - begin) >= 6 - && memcmp(&rxbuf[begin], "CLIENT", 6) == 0) { - state = STATE_TWOPACKETS; /* Interrupts do nothing. */ - memset(&rxbuf[begin], 0x0, 6); - - rxbuf_init(); - - for(i = 0; i < 13; i++) { - slip_arch_writeb("CLIENTSERVER\300"[i]); - } - return 0; - } - } -#endif /* SLIP_CONF_MICROSOFT_CHAT */ - -#ifdef SLIP_CONF_ANSWER_MAC_REQUEST - else if(rxbuf[begin] == '?') { - /* Used by tapslip6 to request mac for auto configure */ - int i, j; - char* hexchar = "0123456789abcdef"; - if(begin < next_free && (next_free - begin) >= 2 - && rxbuf[begin + 1] == 'M') { - state = STATE_TWOPACKETS; /* Interrupts do nothing. */ - rxbuf[begin] = 0; - rxbuf[begin + 1] = 0; - - rxbuf_init(); - - linkaddr_t addr = get_mac_addr(); - /* this is just a test so far... just to see if it works */ - slip_arch_writeb('!'); - slip_arch_writeb('M'); - for(j = 0; j < 8; j++) { - slip_arch_writeb(hexchar[addr.u8[j] >> 4]); - slip_arch_writeb(hexchar[addr.u8[j] & 15]); - } - slip_arch_writeb(SLIP_END); - return 0; - } - } -#endif /* SLIP_CONF_ANSWER_MAC_REQUEST */ - /* * Interrupt can not change begin but may change pkt_end. * If pkt_end != begin it will not change again. @@ -221,7 +142,7 @@ slip_poll_handler(uint8_t *outbuf, uint16_t blen) len = 0; break; } - if (esc) { + if(esc) { if(rxbuf[i] == SLIP_ESC_ESC) { outbuf[len] = SLIP_ESC; len++; @@ -245,7 +166,7 @@ slip_poll_handler(uint8_t *outbuf, uint16_t blen) len = 0; break; } - if (esc) { + if(esc) { if(rxbuf[i] == SLIP_ESC_ESC) { outbuf[len] = SLIP_ESC; len++; @@ -266,7 +187,7 @@ slip_poll_handler(uint8_t *outbuf, uint16_t blen) len = 0; break; } - if (esc) { + if(esc) { if(rxbuf[i] == SLIP_ESC_ESC) { outbuf[len] = SLIP_ESC; len++; @@ -332,17 +253,13 @@ PROCESS_THREAD(slip_process, ev, data) /* Move packet from rxbuf to buffer provided by uIP. */ uip_len = slip_poll_handler(&uip_buf[UIP_LLH_LEN], - UIP_BUFSIZE - UIP_LLH_LEN); + UIP_BUFSIZE - UIP_LLH_LEN); if(uip_len > 0) { if(input_callback) { input_callback(); } -#ifdef SLIP_CONF_TCPIP_INPUT - SLIP_CONF_TCPIP_INPUT(); -#else tcpip_input(); -#endif } } @@ -364,7 +281,7 @@ slip_input_byte(unsigned char c) if(c != SLIP_ESC_END && c != SLIP_ESC_ESC) { state = STATE_RUBBISH; SLIP_STATISTICS(slip_rubbish++); - next_free = pkt_end; /* remove rubbish */ + next_free = pkt_end; /* remove rubbish */ return 0; } state = STATE_OK; @@ -389,22 +306,14 @@ slip_input_byte(unsigned char c) } rxbuf[cur_end] = c; -#ifdef SLIP_CONF_MICROSOFT_CHAT - /* There could be a separate poll routine for this. */ - if(c == 'T' && rxbuf[begin] == 'C') { - process_poll(&slip_process); - return 1; - } -#endif /* SLIP_CONF_MICROSOFT_CHAT */ - if(c == SLIP_END) { /* * We have a new packet, possibly of zero length. * * There may already be one packet buffered. */ - if(cur_end != pkt_end) { /* Non zero length. */ - if(begin == pkt_end) { /* None buffered. */ + if(cur_end != pkt_end) { /* Non zero length. */ + if(begin == pkt_end) { /* None buffered. */ pkt_end = cur_end; } else { SLIP_STATISTICS(slip_twopackets++); diff --git a/os/dev/slip.h b/os/dev/slip.h index 759de1a46..bb0ca3baf 100644 --- a/os/dev/slip.h +++ b/os/dev/slip.h @@ -41,7 +41,7 @@ PROCESS_NAME(slip_process); /** * Send an IP packet from the uIP buffer with SLIP. */ -uint8_t slip_send(void); +void slip_send(void); /** * Input a SLIP byte. @@ -62,13 +62,10 @@ uint8_t slip_send(void); */ int slip_input_byte(unsigned char c); -uint8_t slip_write(const void *ptr, int len); - -/* Did we receive any bytes lately? */ -extern uint8_t slip_active; - -/* Statistics. */ -extern uint16_t slip_rubbish, slip_twopackets, slip_overflow, slip_ip_drop; +/** + * Send using SLIP len bytes starting from the location pointed to by ptr + */ +void slip_write(const void *ptr, int len); /** * Set a function to be called when there is activity on the SLIP