123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841 |
- /****************************************************************************
- * net/devif/devif_poll.c
- *
- * Copyright (C) 2007-2010, 2012, 2014, 2016-2019 Gregory Nutt. All rights
- * reserved.
- * Author: Gregory Nutt <gnutt@nuttx.org>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * 3. Neither the name NuttX nor the names of its contributors may be
- * used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * 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.
- *
- ****************************************************************************/
- /****************************************************************************
- * Included Files
- ****************************************************************************/
- #include <nuttx/config.h>
- #ifdef CONFIG_NET
- #include <debug.h>
- #include <nuttx/clock.h>
- #include <nuttx/net/netconfig.h>
- #include <nuttx/net/netdev.h>
- #include <nuttx/net/net.h>
- #include "devif/devif.h"
- #include "arp/arp.h"
- #include "can/can.h"
- #include "tcp/tcp.h"
- #include "udp/udp.h"
- #include "pkt/pkt.h"
- #include "bluetooth/bluetooth.h"
- #include "ieee802154/ieee802154.h"
- #include "icmp/icmp.h"
- #include "igmp/igmp.h"
- #include "icmpv6/icmpv6.h"
- #include "mld/mld.h"
- #include "ipforward/ipforward.h"
- #include "sixlowpan/sixlowpan.h"
- /****************************************************************************
- * Private Types
- ****************************************************************************/
- enum devif_packet_type
- {
- DEVIF_PKT = 0,
- DEVIF_ICMP,
- DEVIF_IGMP,
- DEVIF_TCP,
- DEVIF_UDP,
- DEVIF_ICMP6
- };
- /****************************************************************************
- * Private Functions
- ****************************************************************************/
- /****************************************************************************
- * Name: devif_packet_conversion
- *
- * Description:
- * Generic output conversion hook. Only needed for IEEE802.15.4 (and
- * other non-standard packet radios) for now but this is a point where
- * support for other conversions may be provided.
- *
- * TCP output comes through three different mechansims. Either from:
- *
- * 1. TCP socket output. For the case of TCP output to a radio,
- * the TCP output is caught in the socket send()/sendto() logic and
- * redirected to 6LoWPAN logic.
- * 2. TCP output from the TCP state machine. That will occur
- * during TCP packet processing by the TCP state meachine.
- * 3. TCP output resulting from TX or timer polling
- *
- * Cases 2 is handled here. Logic here detected if (1) an attempt
- * to return with d_len > 0 and (2) that the device is a radio
- * network driver. Under those conditions, 6LoWPAN logic will be called
- * to create the radio frames.
- *
- * All outgoing ICMPv6 messages come through one of two mechanisms:
- *
- * 1. The output from internal ICMPv6 message passing. These outgoing
- * messages will use device polling and will be handled here.
- * 2. ICMPv6 output resulting from TX or timer polling.
- *
- * Assumptions:
- * The network is locked.
- *
- ****************************************************************************/
- #ifdef CONFIG_NET_6LOWPAN
- static void devif_packet_conversion(FAR struct net_driver_s *dev,
- enum devif_packet_type pkttype)
- {
- if (dev->d_len > 0)
- {
- /* Check if this is a device served by 6LoWPAN */
- if (dev->d_lltype == NET_LL_IEEE802154 ||
- dev->d_lltype == NET_LL_PKTRADIO)
- {
- FAR struct ipv6_hdr_s *ipv6 = (FAR struct ipv6_hdr_s *)dev->d_buf;
- #ifdef CONFIG_NET_IPv4
- if ((ipv6->vtc & IP_VERSION_MASK) != IPv6_VERSION)
- {
- nerr("ERROR: IPv6 version error: %02x... Packet dropped\n",
- ipv6->vtc);
- }
- else
- #endif
- #ifdef CONFIG_NET_TCP
- if (pkttype == DEVIF_TCP)
- {
- /* This packet came from a response to TCP polling and is
- * directed to an radio driver using 6LoWPAN. Verify that the
- * outgoing packet is IPv6 with TCP protocol.
- */
- if (ipv6->proto == IP_PROTO_TCP)
- {
- /* Let 6LoWPAN convert IPv6 TCP output into radio frames. */
- sixlowpan_tcp_send(dev, dev, ipv6);
- }
- else
- {
- nerr("ERROR: TCP protocol error: %u... Packet dropped\n",
- ipv6->proto);
- }
- }
- else
- #endif
- #ifdef CONFIG_NET_ICMPv6
- if (pkttype == DEVIF_ICMP6)
- {
- /* This packet came from a response to ICMPv6 polling and is
- * directed to a radio using 6LoWPAN. Verify that the outgoing
- * packet is IPv6 with TCP protocol.
- */
- if (ipv6->proto == IP_PROTO_ICMP6)
- {
- /* Let 6LoWPAN convert IPv6 ICMPv6 output into radio frames. */
- sixlowpan_icmpv6_send(dev, dev, ipv6);
- }
- else
- {
- nerr("ERROR: ICMPv6 protocol error: %u... Packet dropped\n",
- ipv6->proto);
- }
- }
- else
- #endif
- {
- nerr("ERROR: Unhandled packet dropped. pkttype=%u protocol=%u\n",
- pkttype, ipv6->proto);
- }
- UNUSED(ipv6);
- dev->d_len = 0;
- }
- }
- }
- #else
- # define devif_packet_conversion(dev,pkttype)
- #endif /* CONFIG_NET_6LOWPAN */
- /****************************************************************************
- * Name: devif_poll_pkt_connections
- *
- * Description:
- * Poll all packet connections for available packets to send.
- *
- * Assumptions:
- * This function is called from the MAC device driver with the network
- * locked.
- *
- ****************************************************************************/
- #ifdef CONFIG_NET_PKT
- static int devif_poll_pkt_connections(FAR struct net_driver_s *dev,
- devif_poll_callback_t callback)
- {
- FAR struct pkt_conn_s *pkt_conn = NULL;
- int bstop = 0;
- /* Traverse all of the allocated packet connections and perform the poll action */
- while (!bstop && (pkt_conn = pkt_nextconn(pkt_conn)))
- {
- /* Perform the packet TX poll */
- pkt_poll(dev, pkt_conn);
- /* Perform any necessary conversions on outgoing packets */
- devif_packet_conversion(dev, DEVIF_PKT);
- /* Call back into the driver */
- bstop = callback(dev);
- }
- return bstop;
- }
- #endif /* CONFIG_NET_PKT */
- /****************************************************************************
- * Name: devif_poll_pkt_connections
- *
- * Description:
- * Poll all packet connections for available packets to send.
- *
- * Assumptions:
- * This function is called from the MAC device driver with the network
- * locked.
- *
- ****************************************************************************/
- #ifdef CONFIG_NET_CAN
- static int devif_poll_can_connections(FAR struct net_driver_s *dev,
- devif_poll_callback_t callback)
- {
- FAR struct can_conn_s *can_conn = NULL;
- int bstop = 0;
- /* Traverse all of the allocated packet connections and
- * perform the poll action
- */
- while (!bstop && (can_conn = can_nextconn(can_conn)))
- {
- /* Perform the packet TX poll */
- can_poll(dev, can_conn);
- /* Call back into the driver */
- bstop = callback(dev);
- }
- return bstop;
- }
- #endif /* CONFIG_NET_PKT */
- /****************************************************************************
- * Name: devif_poll_bluetooth_connections
- *
- * Description:
- * Poll all packet connections for available packets to send.
- *
- * Assumptions:
- * This function is called from the MAC device driver with the network
- * locked.
- *
- ****************************************************************************/
- #ifdef CONFIG_NET_BLUETOOTH
- static int devif_poll_bluetooth_connections(FAR struct net_driver_s *dev,
- devif_poll_callback_t callback)
- {
- FAR struct bluetooth_conn_s *bluetooth_conn = NULL;
- int bstop = 0;
- /* Traverse all of the allocated packet connections and perform the poll action */
- while (!bstop && (bluetooth_conn = bluetooth_conn_next(bluetooth_conn)))
- {
- /* Perform the packet TX poll */
- bluetooth_poll(dev, bluetooth_conn);
- /* Call back into the driver */
- bstop = callback(dev);
- }
- return bstop;
- }
- #endif /* CONFIG_NET_BLUETOOTH */
- /****************************************************************************
- * Name: devif_poll_ieee802154_connections
- *
- * Description:
- * Poll all packet connections for available packets to send.
- *
- * Assumptions:
- * This function is called from the MAC device driver with the network
- * locked.
- *
- ****************************************************************************/
- #ifdef CONFIG_NET_IEEE802154
- static int devif_poll_ieee802154_connections(FAR struct net_driver_s *dev,
- devif_poll_callback_t callback)
- {
- FAR struct ieee802154_conn_s *ieee802154_conn = NULL;
- int bstop = 0;
- /* Traverse all of the allocated packet connections and perform the poll action */
- while (!bstop && (ieee802154_conn = ieee802154_conn_next(ieee802154_conn)))
- {
- /* Perform the packet TX poll */
- ieee802154_poll(dev, ieee802154_conn);
- /* Call back into the driver */
- bstop = callback(dev);
- }
- return bstop;
- }
- #endif /* CONFIG_NET_IEEE802154 */
- /****************************************************************************
- * Name: devif_poll_icmp
- *
- * Description:
- * Poll all of the connections waiting to send an ICMP ECHO request
- *
- ****************************************************************************/
- #if defined(CONFIG_NET_ICMP) && defined(CONFIG_NET_ICMP_SOCKET)
- static inline int devif_poll_icmp(FAR struct net_driver_s *dev,
- devif_poll_callback_t callback)
- {
- FAR struct icmp_conn_s *conn = NULL;
- int bstop = 0;
- /* Traverse all of the allocated ICMP connections and perform the poll action */
- while (!bstop && (conn = icmp_nextconn(conn)) != NULL)
- {
- /* Perform the ICMP poll */
- icmp_poll(dev, conn);
- /* Perform any necessary conversions on outgoing packets */
- devif_packet_conversion(dev, DEVIF_ICMP);
- /* Call back into the driver */
- bstop = callback(dev);
- }
- return bstop;
- }
- #endif /* CONFIG_NET_ICMP && CONFIG_NET_ICMP_SOCKET */
- /****************************************************************************
- * Name: devif_poll_icmpv6
- *
- * Description:
- * Poll all of the connections waiting to send an ICMPv6 ECHO request
- *
- ****************************************************************************/
- #if defined(CONFIG_NET_ICMPv6_SOCKET) || defined(CONFIG_NET_ICMPv6_NEIGHBOR)
- static inline int devif_poll_icmpv6(FAR struct net_driver_s *dev,
- devif_poll_callback_t callback)
- {
- FAR struct icmpv6_conn_s *conn = NULL;
- int bstop = 0;
- /* Traverse all of the allocated ICMPV6 connections and perform the poll action */
- do
- {
- /* Perform the ICMPV6 poll
- * Note: conn equal NULL in the first iteration means poll dev's callback list
- * since icmpv6_autoconfig and icmpv6_neighbor still append it's callback into
- * this list.
- */
- icmpv6_poll(dev, conn);
- /* Perform any necessary conversions on outgoing packets */
- devif_packet_conversion(dev, DEVIF_ICMP6);
- /* Call back into the driver */
- bstop = callback(dev);
- }
- while (!bstop && (conn = icmpv6_nextconn(conn)) != NULL);
- return bstop;
- }
- #endif /* CONFIG_NET_ICMPv6_SOCKET || CONFIG_NET_ICMPv6_NEIGHBOR*/
- /****************************************************************************
- * Name: devif_poll_forward
- *
- * Description:
- * Poll the device event to see if any task is waiting to forward a packet.
- *
- ****************************************************************************/
- #ifdef CONFIG_NET_IPFORWARD
- static inline int devif_poll_forward(FAR struct net_driver_s *dev,
- devif_poll_callback_t callback)
- {
- /* Perform the forwarding poll */
- ipfwd_poll(dev);
- /* NOTE: that 6LoWPAN packet conversions are handled differently for
- * forwarded packets. That is because we don't know what the packet
- * type is at this point; not within peeking into the device's d_buf.
- */
- /* Call back into the driver */
- return callback(dev);
- }
- #endif /* CONFIG_NET_ICMPv6_SOCKET || CONFIG_NET_ICMPv6_NEIGHBOR*/
- /****************************************************************************
- * Name: devif_poll_igmp
- *
- * Description:
- * Poll all IGMP connections for available packets to send.
- *
- * Assumptions:
- * This function is called from the MAC device driver with the network
- * locked.
- *
- ****************************************************************************/
- #ifdef CONFIG_NET_IGMP
- static inline int devif_poll_igmp(FAR struct net_driver_s *dev,
- devif_poll_callback_t callback)
- {
- /* Perform the IGMP TX poll */
- igmp_poll(dev);
- /* Perform any necessary conversions on outgoing packets */
- devif_packet_conversion(dev, DEVIF_IGMP);
- /* Call back into the driver */
- return callback(dev);
- }
- #endif /* CONFIG_NET_IGMP */
- /****************************************************************************
- * Name: devif_poll_mld
- *
- * Description:
- * Poll all MLD connections for available packets to send.
- *
- * Assumptions:
- * This function is called from the MAC device driver with the network
- * locked.
- *
- ****************************************************************************/
- #ifdef CONFIG_NET_MLD
- static inline int devif_poll_mld(FAR struct net_driver_s *dev,
- devif_poll_callback_t callback)
- {
- /* Perform the MLD TX poll */
- mld_poll(dev);
- /* Perform any necessary conversions on outgoing ICMPv6 packets */
- devif_packet_conversion(dev, DEVIF_ICMP6);
- /* Call back into the driver */
- return callback(dev);
- }
- #endif /* CONFIG_NET_MLD */
- /****************************************************************************
- * Name: devif_poll_udp_connections
- *
- * Description:
- * Poll all UDP connections for available packets to send.
- *
- * Assumptions:
- * This function is called from the MAC device driver with the network
- * locked.
- *
- ****************************************************************************/
- #ifdef NET_UDP_HAVE_STACK
- static int devif_poll_udp_connections(FAR struct net_driver_s *dev,
- devif_poll_callback_t callback)
- {
- FAR struct udp_conn_s *conn = NULL;
- int bstop = 0;
- /* Traverse all of the allocated UDP connections and perform the poll action */
- while (!bstop && (conn = udp_nextconn(conn)))
- {
- /* Perform the UDP TX poll */
- udp_poll(dev, conn);
- /* Perform any necessary conversions on outgoing packets */
- devif_packet_conversion(dev, DEVIF_UDP);
- /* Call back into the driver */
- bstop = callback(dev);
- }
- return bstop;
- }
- #endif /* NET_UDP_HAVE_STACK */
- /****************************************************************************
- * Name: devif_poll_tcp_connections
- *
- * Description:
- * Poll all UDP connections for available packets to send.
- *
- * Assumptions:
- * This function is called from the MAC device driver with the network
- * locked.
- *
- ****************************************************************************/
- #ifdef NET_TCP_HAVE_STACK
- static inline int devif_poll_tcp_connections(FAR struct net_driver_s *dev,
- devif_poll_callback_t callback)
- {
- FAR struct tcp_conn_s *conn = NULL;
- int bstop = 0;
- /* Traverse all of the active TCP connections and perform the poll action */
- while (!bstop && (conn = tcp_nextconn(conn)))
- {
- /* Perform the TCP TX poll */
- tcp_poll(dev, conn);
- /* Perform any necessary conversions on outgoing packets */
- devif_packet_conversion(dev, DEVIF_TCP);
- /* Call back into the driver */
- bstop = callback(dev);
- }
- return bstop;
- }
- #else
- # define devif_poll_tcp_connections(dev, callback) (0)
- #endif
- /****************************************************************************
- * Name: devif_poll_tcp_timer
- *
- * Description:
- * The TCP timer has expired. Update TCP timing state in each active,
- * TCP connection.
- *
- * Assumptions:
- * This function is called from the MAC device driver with the network
- * locked.
- *
- ****************************************************************************/
- #ifdef NET_TCP_HAVE_STACK
- static inline int devif_poll_tcp_timer(FAR struct net_driver_s *dev,
- devif_poll_callback_t callback,
- int hsec)
- {
- FAR struct tcp_conn_s *conn = NULL;
- int bstop = 0;
- /* Traverse all of the active TCP connections and perform the poll action. */
- while (!bstop && (conn = tcp_nextconn(conn)))
- {
- /* Perform the TCP timer poll */
- tcp_timer(dev, conn, hsec);
- /* Perform any necessary conversions on outgoing packets */
- devif_packet_conversion(dev, DEVIF_TCP);
- /* Call back into the driver */
- bstop = callback(dev);
- }
- return bstop;
- }
- #else
- # define devif_poll_tcp_timer(dev, callback, hsec) (0)
- #endif
- /****************************************************************************
- * Public Functions
- ****************************************************************************/
- /****************************************************************************
- * Name: devif_poll
- *
- * Description:
- * This function will traverse each active network connection structure and
- * will perform network polling operations. devif_poll() may be called
- * asynchronously with the network driver can accept another outgoing
- * packet.
- *
- * This function will call the provided callback function for every active
- * connection. Polling will continue until all connections have been polled
- * or until the user-supplied function returns a non-zero value (which it
- * should do only if it cannot accept further write data).
- *
- * When the callback function is called, there may be an outbound packet
- * waiting for service in the device packet buffer, and if so the d_len field
- * is set to a value larger than zero. The device driver should then send
- * out the packet.
- *
- * Assumptions:
- * This function is called from the MAC device driver with the network
- * locked.
- *
- ****************************************************************************/
- int devif_poll(FAR struct net_driver_s *dev, devif_poll_callback_t callback)
- {
- int bstop = false;
- /* Traverse all of the active packet connections and perform the poll
- * action.
- */
- #ifdef CONFIG_NET_ARP_SEND
- /* Check for pending ARP requests */
- bstop = arp_poll(dev, callback);
- if (!bstop)
- #endif
- #ifdef CONFIG_NET_PKT
- {
- /* Check for pending packet socket transfer */
- bstop = devif_poll_pkt_connections(dev, callback);
- }
- if (!bstop)
- #endif
- #ifdef CONFIG_NET_CAN
- {
- /* Check for pending packet socket transfer */
- bstop = devif_poll_can_connections(dev, callback);
- }
- if (!bstop)
- #endif
- #ifdef CONFIG_NET_BLUETOOTH
- {
- /* Check for pending PF_BLUETOOTH socket transfer */
- bstop = devif_poll_bluetooth_connections(dev, callback);
- }
- if (!bstop)
- #endif
- #ifdef CONFIG_NET_IEEE802154
- {
- /* Check for pending PF_IEEE802154 socket transfer */
- bstop = devif_poll_ieee802154_connections(dev, callback);
- }
- if (!bstop)
- #endif
- #ifdef CONFIG_NET_IGMP
- {
- /* Check for pending IGMP messages */
- bstop = devif_poll_igmp(dev, callback);
- }
- if (!bstop)
- #endif
- #ifdef CONFIG_NET_MLD
- {
- /* Check for pending MLD messages */
- bstop = devif_poll_mld(dev, callback);
- }
- if (!bstop)
- #endif
- #ifdef NET_TCP_HAVE_STACK
- {
- /* Traverse all of the active TCP connections and perform the poll
- * action.
- */
- bstop = devif_poll_tcp_connections(dev, callback);
- }
- if (!bstop)
- #endif
- #ifdef NET_UDP_HAVE_STACK
- {
- /* Traverse all of the allocated UDP connections and perform
- * the poll action
- */
- bstop = devif_poll_udp_connections(dev, callback);
- }
- if (!bstop)
- #endif
- #if defined(CONFIG_NET_ICMP) && defined(CONFIG_NET_ICMP_SOCKET)
- {
- /* Traverse all of the tasks waiting to send an ICMP ECHO request. */
- bstop = devif_poll_icmp(dev, callback);
- }
- if (!bstop)
- #endif
- #if defined(CONFIG_NET_ICMPv6_SOCKET) || defined(CONFIG_NET_ICMPv6_NEIGHBOR)
- {
- /* Traverse all of the tasks waiting to send an ICMPv6 ECHO request. */
- bstop = devif_poll_icmpv6(dev, callback);
- }
- if (!bstop)
- #endif
- #ifdef CONFIG_NET_IPFORWARD
- {
- /* Traverse all of the tasks waiting to forward a packet to this device. */
- bstop = devif_poll_forward(dev, callback);
- }
- if (!bstop)
- #endif
- {
- /* Nothing more to do */
- }
- return bstop;
- }
- /****************************************************************************
- * Name: devif_timer
- *
- * Description:
- * These function will traverse each active network connection structure and
- * perform network timer operations. The Ethernet driver MUST implement
- * logic to periodically call devif_timer().
- *
- * This function will call the provided callback function for every active
- * connection. Polling will continue until all connections have been polled
- * or until the user-supplied function returns a non-zero value (which it
- * should do only if it cannot accept further write data).
- *
- * When the callback function is called, there may be an outbound packet
- * waiting for service in the device packet buffer, and if so the d_len field
- * is set to a value larger than zero. The device driver should then send
- * out the packet.
- *
- * Assumptions:
- * This function is called from the MAC device driver with the network
- * locked.
- *
- ****************************************************************************/
- int devif_timer(FAR struct net_driver_s *dev, int delay,
- devif_poll_callback_t callback)
- {
- #if defined(CONFIG_NET_IPv4_REASSEMBLY) || defined(NET_TCP_HAVE_STACK)
- int hsec = TICK2HSEC(delay);
- #endif
- int bstop = false;
- #ifdef NET_TCP_HAVE_STACK
- /* Traverse all of the active TCP connections and perform the
- * timer action.
- */
- bstop = devif_poll_tcp_timer(dev, callback, hsec);
- #endif
- /* If possible, continue with a normal poll checking for pending
- * network driver actions.
- */
- if (!bstop)
- {
- bstop = devif_poll(dev, callback);
- }
- return bstop;
- }
- #endif /* CONFIG_NET */
|