This is an automated email from the ASF dual-hosted git repository. xiaoxiang781216 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit b23dda6efb5bae41eebc101a26181a5c4f2a66b8 Author: p-szafonimateusz <[email protected]> AuthorDate: Mon Nov 9 11:51:10 2026 +0100 net/can: Move can_callback.c into can.c. Move the code of can_callback.c into can.c without changes and remove can_callback.c. Only the include lists and the file guards are merged; the functions are copied as they are. Assisted-by: Claude:claude-opus-5-5 Signed-off-by: p-szafonimateusz <[email protected]> --- .github/CODEOWNERS | 1 - Documentation/os/networking/socketcan.rst | 3 +- net/can/CMakeLists.txt | 2 +- net/can/Make.defs | 1 - net/can/can.c | 198 ++++++++++++++++++++++++-- net/can/can_callback.c | 227 ------------------------------ 6 files changed, 192 insertions(+), 240 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a48267a5508..95da9e2ea29 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -15892,7 +15892,6 @@ net/bluetooth/bluetooth_sockif.c [email protected] [email protected] x net/can/Kconfig [email protected] [email protected] [email protected] [email protected] [email protected] net/can/can.c [email protected] [email protected] [email protected] [email protected] [email protected] net/can/can.h [email protected] [email protected] [email protected] [email protected] [email protected] -net/can/can_callback.c [email protected] [email protected] [email protected] [email protected] [email protected] net/can/can_getsockopt.c [email protected] [email protected] [email protected] [email protected] [email protected] net/can/can_input.c [email protected] [email protected] [email protected] [email protected] [email protected] net/can/can_notifier.c [email protected] [email protected] diff --git a/Documentation/os/networking/socketcan.rst b/Documentation/os/networking/socketcan.rst index 38315aac8a1..6ef87f71233 100644 --- a/Documentation/os/networking/socketcan.rst +++ b/Documentation/os/networking/socketcan.rst @@ -92,13 +92,12 @@ Files supporting SocketCAN can be found in the following locations: - **Header File**: ``include/nuttx/net/can.h`` - **Main Modules**: - - ``can.c`` - Connection management + - ``can.c`` - Connection management and callbacks - ``can_sockif.c`` - Socket interface implementation - ``can_sendmsg.c`` - Message transmission - ``can_sendmsg_buffered.c`` - Message transmission with buffering - ``can_recvmsg.c`` - Message reception - ``can_poll.c`` - Polling support - - ``can_callback.c`` - Callback handling Configuration Options --------------------- diff --git a/net/can/CMakeLists.txt b/net/can/CMakeLists.txt index bcf4c54de3f..e7cc230b23e 100644 --- a/net/can/CMakeLists.txt +++ b/net/can/CMakeLists.txt @@ -43,7 +43,7 @@ if(CONFIG_NET_CAN) list(APPEND SRCS can_bufpool.c) endif() - list(APPEND SRCS can.c can_input.c can_callback.c can_poll.c) + list(APPEND SRCS can.c can_input.c can_poll.c) target_sources(net PRIVATE ${SRCS}) endif() diff --git a/net/can/Make.defs b/net/can/Make.defs index 0a5c0e92084..d296a6bc1e4 100644 --- a/net/can/Make.defs +++ b/net/can/Make.defs @@ -51,7 +51,6 @@ endif NET_CSRCS += can.c NET_CSRCS += can_input.c -NET_CSRCS += can_callback.c NET_CSRCS += can_poll.c # Include can build support diff --git a/net/can/can.c b/net/can/can.c index 4d72db7c08c..ee7317dfd2c 100644 --- a/net/can/can.c +++ b/net/can/can.c @@ -26,24 +26,30 @@ #include <nuttx/config.h> -#include <stdint.h> -#include <string.h> +#ifdef CONFIG_NET_CAN + #include <assert.h> #include <errno.h> -#include <nuttx/debug.h> +#include <stdint.h> +#include <string.h> +#include <sys/time.h> #include <arch/irq.h> +#include <nuttx/debug.h> #include <nuttx/kmalloc.h> -#include <nuttx/queue.h> +#include <nuttx/mm/iob.h> #include <nuttx/mutex.h> -#include <nuttx/net/netconfig.h> +#include <nuttx/net/can.h> #include <nuttx/net/net.h> +#include <nuttx/net/netconfig.h> +#include <nuttx/net/netdev.h> +#include <nuttx/net/netstats.h> +#include <nuttx/queue.h> -#include "utils/utils.h" #include "can/can.h" - -#ifdef CONFIG_NET_CAN +#include "devif/devif.h" +#include "utils/utils.h" /**************************************************************************** * Pre-processor Definitions @@ -68,10 +74,186 @@ NET_BUFPOOL_DECLARE(g_can_connections, sizeof(struct can_conn_s), static dq_queue_t g_active_can_connections; +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: can_data_event + * + * Description: + * Handle data that is not accepted by the application because there is no + * listener in place ready to receive the data. + * + * Assumptions: + * - The caller has checked that CAN_NEWDATA is set in flags and that is no + * other handler available to process the incoming data. + * - This function must be called with the network locked. + * + ****************************************************************************/ + +static inline uint32_t +can_data_event(FAR struct net_driver_s *dev, FAR struct can_conn_s *conn, + uint32_t flags) +{ + int buflen = dev->d_len; + int recvlen; + uint32_t ret; + + ret = (flags & ~CAN_NEWDATA); + + /* Save as the packet data as in the read-ahead buffer. NOTE that + * partial packets will not be buffered. + */ + + recvlen = can_datahandler(dev, conn); + if (recvlen < buflen) + { + /* There is no handler to receive new data and there are no free + * read-ahead buffers to retain the data -- drop the packet. + */ + + ninfo("Dropped %d bytes\n", dev->d_len); + +#ifdef CONFIG_NET_STATISTICS + g_netstats.can.drop++; +#endif + NETDEV_RXDROPPED(dev); + } + + /* In any event, the new data has now been handled */ + + dev->d_len = 0; + return ret; +} + /**************************************************************************** * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: can_callback + * + * Description: + * Inform the application holding the packet socket of a change in state. + * + * Returned Value: + * OK if packet has been processed, otherwise ERROR. + * + * Assumptions: + * This function can be called from an interrupt. + * + ****************************************************************************/ + +uint32_t can_callback(FAR struct net_driver_s *dev, + FAR struct can_conn_s *conn, uint32_t flags) +{ + /* Some sanity checking */ + + if (conn) + { + conn_lock(&conn->sconn); + flags = devif_conn_event(dev, flags, conn->sconn.list); + + /* Either we did not get the lock or there is no application listening + * If we did not get a lock we store the frame in the read-ahead buffer + */ + + if ((flags & CAN_NEWDATA) != 0) + { + /* Data was not handled.. dispose of it appropriately */ + + flags = can_data_event(dev, conn, flags); + } + + conn_unlock(&conn->sconn); + } + + return flags; +} + +/**************************************************************************** + * Name: can_datahandler + * + * Description: + * Handle data that is not accepted by the application. This may be called + * either (1) from the data receive logic if it cannot buffer the data, or + * (2) from the CAN event logic is there is no listener in place ready to + * receive the data. + * + * Input Parameters: + * dev - The device which as active when the event was detected. + * conn - A pointer to the CAN connection structure + * + * Returned Value: + * The number of bytes actually buffered is returned. This will be either + * zero or equal to buflen; partial packets are not buffered. + * + * Assumptions: + * - The caller has checked that CAN_NEWDATA is set in flags and that is no + * other handler available to process the incoming data. + * - This function must be called with the network locked. + * + ****************************************************************************/ + +int can_datahandler(FAR struct net_driver_s *dev, + FAR struct can_conn_s *conn) +{ + FAR struct iob_s *iob = dev->d_iob; + int ret = 0; + + conn_lock(&conn->sconn); +#if CONFIG_NET_RECV_BUFSIZE > 0 +# if CONFIG_NET_CAN_NBUFFERS > 0 + int bufnum = div_const_roundup(conn->rcvbufs, NET_CAN_PKTSIZE); +# else + int bufnum = div_const_roundup(conn->rcvbufs, CONFIG_IOB_BUFSIZE); +# endif + /* Check the frame count pending on conn->readahead */ + + if (iob_get_queue_entry_count(&conn->readahead) >= bufnum) + { + nwarn("WARNING: There are no free receive buffer to retain the data. " + "Receive buffer number:%d, received frames:%u \n", + bufnum, iob_get_queue_entry_count(&conn->readahead)); + goto errout; + } +#endif + + /* Concat the iob to readahead */ + + ret = iob_tryadd_queue(iob, &conn->readahead); + if (ret >= 0) + { +#ifdef CONFIG_NET_CAN_NOTIFIER + /* Provide notification(s) that additional CAN read-ahead data is + * available. + */ + + can_readahead_signal(conn); +#endif + ret = iob->io_pktlen; + + /* Device buffer has been enqueued, clear the handle */ + + netdev_iob_clear(dev); + } + else + { + nerr("ERROR: Failed to queue the I/O buffer chain: %d\n", ret); + ret = 0; + goto errout; + } + + conn_unlock(&conn->sconn); + return ret; + +errout: + netdev_iob_release(dev); + conn_unlock(&conn->sconn); + return ret; +} + /**************************************************************************** * Name: can_alloc() * diff --git a/net/can/can_callback.c b/net/can/can_callback.c deleted file mode 100644 index cf061b9aeb2..00000000000 --- a/net/can/can_callback.c +++ /dev/null @@ -1,227 +0,0 @@ -/**************************************************************************** - * net/can/can_callback.c - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. The - * ASF licenses this file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the - * License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include <nuttx/config.h> -#if defined(CONFIG_NET) && defined(CONFIG_NET_CAN) - -#include <stdint.h> -#include <nuttx/debug.h> - -#include <nuttx/net/netconfig.h> -#include <nuttx/net/netdev.h> -#include <nuttx/mm/iob.h> -#include <nuttx/net/netstats.h> -#include <nuttx/net/can.h> - -#include "devif/devif.h" -#include "utils/utils.h" -#include "can/can.h" - -#ifdef CONFIG_NET_TIMESTAMP -#include <sys/time.h> -#endif - -/**************************************************************************** - * Private Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: can_data_event - * - * Description: - * Handle data that is not accepted by the application because there is no - * listener in place ready to receive the data. - * - * Assumptions: - * - The caller has checked that CAN_NEWDATA is set in flags and that is no - * other handler available to process the incoming data. - * - This function must be called with the network locked. - * - ****************************************************************************/ - -static inline uint32_t -can_data_event(FAR struct net_driver_s *dev, FAR struct can_conn_s *conn, - uint32_t flags) -{ - int buflen = dev->d_len; - int recvlen; - uint32_t ret; - - ret = (flags & ~CAN_NEWDATA); - - /* Save as the packet data as in the read-ahead buffer. NOTE that - * partial packets will not be buffered. - */ - - recvlen = can_datahandler(dev, conn); - if (recvlen < buflen) - { - /* There is no handler to receive new data and there are no free - * read-ahead buffers to retain the data -- drop the packet. - */ - - ninfo("Dropped %d bytes\n", dev->d_len); - -#ifdef CONFIG_NET_STATISTICS - g_netstats.can.drop++; -#endif - NETDEV_RXDROPPED(dev); - } - - /* In any event, the new data has now been handled */ - - dev->d_len = 0; - return ret; -} - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: can_callback - * - * Description: - * Inform the application holding the packet socket of a change in state. - * - * Returned Value: - * OK if packet has been processed, otherwise ERROR. - * - * Assumptions: - * This function can be called from an interrupt. - * - ****************************************************************************/ - -uint32_t can_callback(FAR struct net_driver_s *dev, - FAR struct can_conn_s *conn, uint32_t flags) -{ - /* Some sanity checking */ - - if (conn) - { - conn_lock(&conn->sconn); - flags = devif_conn_event(dev, flags, conn->sconn.list); - - /* Either we did not get the lock or there is no application listening - * If we did not get a lock we store the frame in the read-ahead buffer - */ - - if ((flags & CAN_NEWDATA) != 0) - { - /* Data was not handled.. dispose of it appropriately */ - - flags = can_data_event(dev, conn, flags); - } - - conn_unlock(&conn->sconn); - } - - return flags; -} - -/**************************************************************************** - * Name: can_datahandler - * - * Description: - * Handle data that is not accepted by the application. This may be called - * either (1) from the data receive logic if it cannot buffer the data, or - * (2) from the CAN event logic is there is no listener in place ready to - * receive the data. - * - * Input Parameters: - * dev - The device which as active when the event was detected. - * conn - A pointer to the CAN connection structure - * - * Returned Value: - * The number of bytes actually buffered is returned. This will be either - * zero or equal to buflen; partial packets are not buffered. - * - * Assumptions: - * - The caller has checked that CAN_NEWDATA is set in flags and that is no - * other handler available to process the incoming data. - * - This function must be called with the network locked. - * - ****************************************************************************/ - -int can_datahandler(FAR struct net_driver_s *dev, - FAR struct can_conn_s *conn) -{ - FAR struct iob_s *iob = dev->d_iob; - int ret = 0; - - conn_lock(&conn->sconn); -#if CONFIG_NET_RECV_BUFSIZE > 0 -# if CONFIG_NET_CAN_NBUFFERS > 0 - int bufnum = div_const_roundup(conn->rcvbufs, NET_CAN_PKTSIZE); -# else - int bufnum = div_const_roundup(conn->rcvbufs, CONFIG_IOB_BUFSIZE); -# endif - /* Check the frame count pending on conn->readahead */ - - if (iob_get_queue_entry_count(&conn->readahead) >= bufnum) - { - nwarn("WARNING: There are no free receive buffer to retain the data. " - "Receive buffer number:%d, received frames:%u \n", - bufnum, iob_get_queue_entry_count(&conn->readahead)); - goto errout; - } -#endif - - /* Concat the iob to readahead */ - - ret = iob_tryadd_queue(iob, &conn->readahead); - if (ret >= 0) - { -#ifdef CONFIG_NET_CAN_NOTIFIER - /* Provide notification(s) that additional CAN read-ahead data is - * available. - */ - - can_readahead_signal(conn); -#endif - ret = iob->io_pktlen; - - /* Device buffer has been enqueued, clear the handle */ - - netdev_iob_clear(dev); - } - else - { - nerr("ERROR: Failed to queue the I/O buffer chain: %d\n", ret); - ret = 0; - goto errout; - } - - conn_unlock(&conn->sconn); - return ret; - -errout: - netdev_iob_release(dev); - conn_unlock(&conn->sconn); - return ret; -} - -#endif /* CONFIG_NET && CONFIG_NET_CAN */
