From d9580c5a997f0d33b216956db4a05ad784aaa065 Mon Sep 17 00:00:00 2001 From: patacongo Date: Sat, 12 Mar 2011 16:33:55 +0000 Subject: Add SLIP test configuration git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3371 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/drivers/net/slip.c | 74 ++++++++++++++++-------------------------------- 1 file changed, 24 insertions(+), 50 deletions(-) (limited to 'nuttx/drivers/net/slip.c') diff --git a/nuttx/drivers/net/slip.c b/nuttx/drivers/net/slip.c index 37e57f77b..9f73ae76e 100644 --- a/nuttx/drivers/net/slip.c +++ b/nuttx/drivers/net/slip.c @@ -1,7 +1,7 @@ /**************************************************************************** * drivers/net/slip.c * - * Copyright (C) 2010 Gregory Nutt. All rights reserved. + * Copyright (C) 2011 Gregory Nutt. All rights reserved. * Author: Gregory Nutt * * Reference: RFC 1055 @@ -60,7 +60,6 @@ #include #include -#include #include #if defined(CONFIG_NET) && defined(CONFIG_NET_SLIP) @@ -117,10 +116,6 @@ # define SLIP_STAT(p,f) #endif -/* This is a helper pointer for accessing the contents of the Ethernet header */ - -#define BUF ((struct uip_eth_hdr *)priv->dev.d_buf) - /**************************************************************************** * Private Types ****************************************************************************/ @@ -131,10 +126,7 @@ struct slip_statistics_s { uint32_t transmitted; /* Number of packets transmitted */ - /* Number of packets received is the sum of: */ - uint32_t rxip; /* Number of IP packets received */ - uint32_t rxarp; /* + Number of ARP packets received */ - uint32_t rxproto; /* + Number of unsupported packets received */ + uint32_t received /* Number of packets received */ }; #endif @@ -185,11 +177,11 @@ static inline void slip_putc(FAR struct slip_driver_s *priv, int ch); static int slip_transmit(FAR struct slip_driver_s *priv); static int slip_uiptxpoll(struct uip_driver_s *dev); -/* Interrupt handling */ +/* Packet receiver task */ static inline int slip_getc(FAR struct slip_driver_s *priv); static inline void slip_readpacket(FAR struct slip_driver_s *priv); -static void slip_receive(FAR struct slip_driver_s *priv); +static inline void slip_receive(FAR struct slip_driver_s *priv); static int slip_rxtask(int argc, char *argv[]); /* Watchdog timer expirations */ @@ -306,6 +298,7 @@ static int slip_transmit(FAR struct slip_driver_s *priv) /* Increment statistics */ + nvdbg("Sending packet size %d\n", priv->dev.d_len); SLIP_STAT(priv, transmitted); /* Send an initial END character to flush out any data that may have @@ -423,7 +416,6 @@ static int slip_uiptxpoll(struct uip_driver_s *dev) if (priv->dev.d_len > 0) { - uip_arp_out(&priv->dev); slip_transmit(priv); } @@ -479,6 +471,7 @@ static inline void slip_readpacket(FAR struct slip_driver_s *priv) * packet if we run out of room. */ + nvdbg("Receiving packet\n"); for (;;) { /* Get the next character in the stream */ @@ -494,6 +487,8 @@ static inline void slip_readpacket(FAR struct slip_driver_s *priv) */ case SLIP_END: + nvdbg("END\n"); + /* a minor optimization: if there is no data in the packet, ignore * it. This is meant to avoid bothering IP with all the empty * packets generated by the duplicate END characters which are in @@ -502,6 +497,7 @@ static inline void slip_readpacket(FAR struct slip_driver_s *priv) if (nbytes > 0) { + nvdbg("Received packet size %d\n", nbytes); priv->dev.d_len = nbytes; return; } @@ -513,6 +509,7 @@ static inline void slip_readpacket(FAR struct slip_driver_s *priv) */ case SLIP_ESC: + nvdbg("ESC\n"); ch = slip_getc(priv); /* if "ch" is not one of these two, then we have a protocol @@ -523,8 +520,10 @@ static inline void slip_readpacket(FAR struct slip_driver_s *priv) switch (ch) { case SLIP_ESC_END: + nvdbg("ESC-END\n"); ch = SLIP_END; break; + nvdbg("ESC-ESC\n"); case SLIP_ESC_ESC: ch = SLIP_ESC; break; @@ -564,53 +563,28 @@ static inline void slip_readpacket(FAR struct slip_driver_s *priv) * ****************************************************************************/ -static void slip_receive(FAR struct slip_driver_s *priv) +static inline void slip_receive(FAR struct slip_driver_s *priv) { /* Copy the data data from the hardware to priv->dev.d_buf until we put * together a whole packet. */ slip_readpacket(priv); + SLIP_STAT(priv, received); - /* We only accept IP packets of the configured type and ARP packets */ - -#ifdef CONFIG_NET_IPv6 - if (BUF->type == HTONS(UIP_ETHTYPE_IP6)) -#else - if (BUF->type == HTONS(UIP_ETHTYPE_IP)) -#endif - { - SLIP_STAT(priv, rxip); - uip_arp_ipin(&priv->dev); - uip_input(&priv->dev); + /* All packets are assumed to be IP packets (we don't have a choice.. there + * is no Ethernet header containing the EtherType) + */ - /* If the above function invocation resulted in data that should be - * sent out on the network, the field d_len will set to a value > 0. - */ + uip_input(&priv->dev); - if (priv->dev.d_len > 0) - { - uip_arp_out(&priv->dev); - slip_transmit(priv); - } - } - else if (BUF->type == htons(UIP_ETHTYPE_ARP)) - { - SLIP_STAT(priv, rxarp); - uip_arp_arpin(&priv->dev); - - /* If the above function invocation resulted in data that should be - * sent out on the network, the field d_len will set to a value > 0. - */ + /* If the above function invocation resulted in data that should be + * sent out on the network, the field d_len will set to a value > 0. + */ - if (priv->dev.d_len > 0) - { - slip_transmit(priv); - } - } - else + if (priv->dev.d_len > 0) { - SLIP_STAT(priv, rxproto); + slip_transmit(priv); } } @@ -912,7 +886,7 @@ int slip_initialize(int intf, const char *devname) /* Get the interface structure associated with this interface number. */ - DEBUGASSERT(inf < CONFIG_SLIP_NINTERFACES); + DEBUGASSERT(intf < CONFIG_SLIP_NINTERFACES); priv = &g_slip[intf]; /* Initialize the driver structure */ -- cgit v1.2.3