diff --git a/configs/sim/ipforward/defconfig b/configs/sim/ipforward/defconfig index 2ba63dee80..312519a65f 100644 --- a/configs/sim/ipforward/defconfig +++ b/configs/sim/ipforward/defconfig @@ -303,7 +303,7 @@ CONFIG_SCHED_LPWORK=y CONFIG_SCHED_LPNTHREADS=1 CONFIG_SCHED_LPWORKPRIORITY=140 CONFIG_SCHED_LPWORKPERIOD=50000 -CONFIG_SCHED_LPWORKSTACKSIZE=2048 +CONFIG_SCHED_LPWORKSTACKSIZE=8192 # # Stack and heap information @@ -376,9 +376,26 @@ CONFIG_DEV_LOOP=y # CONFIG_MODEM is not set # CONFIG_MTD is not set # CONFIG_EEPROM is not set -# CONFIG_NETDEVICES is not set +CONFIG_NETDEVICES=y + +# +# General Ethernet MAC Driver Options +# +# CONFIG_NETDEV_LOOPBACK is not set +# CONFIG_NETDEV_TELNET is not set +CONFIG_NETDEV_MULTINIC=y CONFIG_ARCH_HAVE_NETDEV_STATISTICS=y +# CONFIG_NETDEV_LATEINIT is not set +# CONFIG_NET_DUMPPACKET is not set + +# +# External Ethernet MAC Device Support +# +# CONFIG_NET_DM90x0 is not set +# CONFIG_ENC28J60 is not set +# CONFIG_ENCX24J600 is not set # CONFIG_NET_SLIP is not set +# CONFIG_NET_FTMAC100 is not set # CONFIG_PIPES is not set # CONFIG_PM is not set # CONFIG_POWER is not set @@ -480,6 +497,8 @@ CONFIG_TUN_LPWORK=y CONFIG_NET_IPv6=y CONFIG_NET_IPv6_NCONF_ENTRIES=4 CONFIG_NET_IPFORWARD=y +# CONFIG_NET_IPFORWARD_BROADCAST is not set +CONFIG_NET_IPFORWARD_NSTRUCT=4 # # Socket Support @@ -790,7 +809,7 @@ CONFIG_BUILTIN_PROXY_STACKSIZE=1024 # CONFIG_EXAMPLES_IGMP is not set CONFIG_EXAMPLES_IPFORWARD=y CONFIG_EXAMPLES_IPFORWARD_PRIORITY=100 -CONFIG_EXAMPLES_IPFORWARD_STACKSIZE=2048 +CONFIG_EXAMPLES_IPFORWARD_STACKSIZE=8192 # CONFIG_EXAMPLES_JSON is not set # CONFIG_EXAMPLES_MEDIA is not set # CONFIG_EXAMPLES_MM is not set diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 2c3fe2990c..33fd566307 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -684,7 +684,7 @@ static int tun_ifdown(struct net_driver_s *dev) } /**************************************************************************** - * Name: tun_txavail + * Name: tun_txavail_work * * Description: * Driver callback invoked when new TX data is available. This is a @@ -702,9 +702,9 @@ static int tun_ifdown(struct net_driver_s *dev) * ****************************************************************************/ -static int tun_txavail(struct net_driver_s *dev) +static void tun_txavail_work(FAR void *arg) { - FAR struct tun_device_s *priv = (FAR struct tun_device_s *)dev->d_private; + FAR struct tun_device_s *priv = (FAR struct tun_device_s *)arg; tun_lock(priv); @@ -713,11 +713,10 @@ static int tun_txavail(struct net_driver_s *dev) if (priv->read_d_len != 0 || priv->write_d_len != 0) { tun_unlock(priv); - return OK; + return; } net_lock(); - if (priv->bifup) { /* Poll the network for new XMIT data */ @@ -728,6 +727,37 @@ static int tun_txavail(struct net_driver_s *dev) net_unlock(); tun_unlock(priv); +} + +/**************************************************************************** + * Name: tun_txavail + * + * Description: + * Driver callback invoked when new TX data is available. This is a + * stimulus perform an out-of-cycle poll and, thereby, reduce the TX + * latency. + * + * Parameters: + * dev - Reference to the NuttX driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * Called from the network stack with the network locked. + * + ****************************************************************************/ + +static int tun_txavail(struct net_driver_s *dev) +{ + FAR struct tun_device_s *priv = (FAR struct tun_device_s *)dev->d_private; + + /* Schedule to perform the TX poll on the worker thread. */ + + if (work_available(&priv->work)) + { + work_queue(TUNWORK, &priv->work, tun_txavail_work, priv, 0); + } return OK; } diff --git a/net/devif/ipv4_forward.c b/net/devif/ipv4_forward.c index 075f47bc7a..1614808f9f 100644 --- a/net/devif/ipv4_forward.c +++ b/net/devif/ipv4_forward.c @@ -91,7 +91,7 @@ static int ipv4_hdrsize(FAR struct ipv4_hdr_s *ipv4) case IP_PROTO_TCP: { FAR struct tcp_hdr_s *tcp = - (FAR struct tcp_hdr_s *)((FAR uintptr_t *)ipv4 + IPv4_HDRLEN); + (FAR struct tcp_hdr_s *)((FAR uint8_t *)ipv4 + IPv4_HDRLEN); unsigned int tcpsize; /* The TCP header length is encoded in the top 4 bits of the diff --git a/net/devif/ipv6_forward.c b/net/devif/ipv6_forward.c index 240ed6de6a..cd33b54d86 100644 --- a/net/devif/ipv6_forward.c +++ b/net/devif/ipv6_forward.c @@ -97,7 +97,7 @@ static int ipv6_hdrsize(FAR struct ipv6_hdr_s *ipv6) case IP_PROTO_TCP: { FAR struct tcp_hdr_s *tcp = - (FAR struct tcp_hdr_s *)((FAR uintptr_t *)ipv6 + IPv6_HDRLEN); + (FAR struct tcp_hdr_s *)((FAR uint8_t *)ipv6 + IPv6_HDRLEN); unsigned int tcpsize; /* The TCP header length is encoded in the top 4 bits of the @@ -337,7 +337,7 @@ static int ipv6_packet_conversion(FAR struct net_driver_s *dev, return ret; } #else -# define ipv6_packet_conversion(dev, ipv6) (PACKET_NOT_FORWARDED) +# define ipv6_packet_conversion(dev, fwddev, ipv6) (PACKET_NOT_FORWARDED) #endif /* CONFIG_NET_6LOWPAN */ /**************************************************************************** diff --git a/net/netdev/netdev_txnotify.c b/net/netdev/netdev_txnotify.c index 72382e01df..fca1b9d070 100644 --- a/net/netdev/netdev_txnotify.c +++ b/net/netdev/netdev_txnotify.c @@ -167,7 +167,7 @@ void netdev_ipv6_txnotify(FAR const net_ipv6addr_t ripaddr) void netdev_txnotify_dev(FAR struct net_driver_s *dev) { - if (dev && dev->d_txavail) + if (dev != NULL && dev->d_txavail != NULL) { /* Notify the device driver that new TX data is available. */