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 50eff3d35472b5c699b6f9f2ea3518c4e1cd7f21 Author: p-szafonimateusz <[email protected]> AuthorDate: Mon Nov 9 11:51:11 2026 +0100 net/can: Move can_setsockopt.c into can_raw.c. Move the code of can_setsockopt.c into can_raw.c without changes and remove can_setsockopt.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 - net/can/CMakeLists.txt | 4 - net/can/Make.defs | 4 - net/can/can_raw.c | 209 ++++++++++++++++++++++++++++++++++++++ net/can/can_setsockopt.c | 257 ----------------------------------------------- 5 files changed, 209 insertions(+), 266 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 062498fce51..1c83ccb642e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -15893,7 +15893,6 @@ net/can/Kconfig [email protected] [email protected] [email protected] raide 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_raw.c [email protected] [email protected] [email protected] [email protected] [email protected] -net/can/can_setsockopt.c [email protected] [email protected] [email protected] [email protected] [email protected] net/devif/devif.h [email protected] [email protected] [email protected] [email protected] net/devif/devif_callback.c [email protected] [email protected] [email protected] [email protected] net/devif/devif_filesend.c [email protected] [email protected] [email protected] [email protected] diff --git a/net/can/CMakeLists.txt b/net/can/CMakeLists.txt index cbfd6a37b6a..39f2ac08f28 100644 --- a/net/can/CMakeLists.txt +++ b/net/can/CMakeLists.txt @@ -25,10 +25,6 @@ if(CONFIG_NET_CAN) # Socket layer list(APPEND SRCS can_raw.c) - if(CONFIG_NET_CANPROTO_OPTIONS) - list(APPEND SRCS can_setsockopt.c) - endif() - if(CONFIG_NET_CAN_NBUFFERS GREATER 0) list(APPEND SRCS can_bufpool.c) endif() diff --git a/net/can/Make.defs b/net/can/Make.defs index ac39110e57a..58c33961a64 100644 --- a/net/can/Make.defs +++ b/net/can/Make.defs @@ -28,10 +28,6 @@ ifeq ($(CONFIG_NET_CAN),y) SOCK_CSRCS += can_raw.c -ifeq ($(CONFIG_NET_CANPROTO_OPTIONS),y) -SOCK_CSRCS += can_setsockopt.c -endif - ifdef CONFIG_NET_CAN_NBUFFERS ifneq (${CONFIG_NET_CAN_NBUFFERS},0) SOCK_CSRCS += can_bufpool.c diff --git a/net/can/can_raw.c b/net/can/can_raw.c index 903f6c76b6e..c51889064da 100644 --- a/net/can/can_raw.c +++ b/net/can/can_raw.c @@ -1530,6 +1530,215 @@ int can_getsockopt(FAR struct socket *psock, int level, int option, return ret; } +/**************************************************************************** + * Name: can_setsockopt + * + * Description: + * can_setsockopt() sets the CAN-protocol option specified by the + * 'option' argument to the value pointed to by the 'value' argument for + * the socket specified by the 'psock' argument. + * + * See <nuttx/can.h> for the a complete list of values of CAN protocol + * options. + * + * Input Parameters: + * psock Socket structure of socket to operate on + * level Protocol level to set the option + * option identifies the option to set + * value Points to the argument value + * value_len The length of the argument value + * + * Returned Value: + * Returns zero (OK) on success. On failure, it returns a negated errno + * value to indicate the nature of the error. See psock_setcockopt() for + * the list of possible error values. + * + ****************************************************************************/ + +int can_setsockopt(FAR struct socket *psock, int level, int option, + FAR const void *value, socklen_t value_len) +{ + FAR struct can_conn_s *conn; + int ret = OK; + int count = 0; + + DEBUGASSERT(value_len == 0 || value != NULL); + + conn = psock->s_conn; + + /* SO_RCVBUF and SO_SNDBUF are socket-level options that are kept in + * the CAN connection; psock_socketlevel_option() handles the others. + */ + + if (level == SOL_SOCKET) + { + if (option != SO_RCVBUF && option != SO_SNDBUF) + { + return -ENOPROTOOPT; + } + } + else if (level != SOL_CAN_RAW) + { + return -ENOPROTOOPT; + } + + if (psock->s_type != SOCK_RAW) + { + nerr("ERROR: Not a RAW CAN socket\n"); + return -ENOTCONN; + } + + switch (option) + { + case CAN_RAW_FILTER: + if (value_len == 0) + { + conn->filter_count = 0; + ret = OK; + } + else if (value_len % sizeof(struct can_filter) != 0) + { + ret = -EINVAL; + } + else if (value_len > CONFIG_NET_CAN_RAW_FILTER_MAX * + sizeof(struct can_filter)) + { + ret = -EINVAL; + } + else + { + int i; + + count = value_len / sizeof(struct can_filter); + + for (i = 0; i < count; i++) + { + conn->filters[i] = ((struct can_filter *)value)[i]; + } + + conn->filter_count = count; + + ret = OK; + } + break; + +#ifdef CONFIG_NET_CAN_ERRORS + case CAN_RAW_ERR_FILTER: + if (value_len != sizeof(can_err_mask_t)) + { + return -EINVAL; + } + + conn->err_mask = *(FAR can_err_mask_t *)value; + break; +#endif + + case CAN_RAW_LOOPBACK: + case CAN_RAW_RECV_OWN_MSGS: +#ifdef CONFIG_NET_CAN_CANFD + case CAN_RAW_FD_FRAMES: +#endif +#ifdef CONFIG_NET_CAN_RAW_TX_DEADLINE + case CAN_RAW_TX_DEADLINE: +#endif + /* Verify that option is the size of an 'int'. Should also check + * that 'value' is properly aligned for an 'int' + */ + + if (value_len != sizeof(int)) + { + return -EINVAL; + } + + /* Lock the network so that we have exclusive access to the socket + * options. + */ + + conn_lock(&conn->sconn); + + /* Set or clear the option bit */ + + if (*(FAR int *)value) + { + _SO_SETOPT(conn->sconn.s_options, option); + } + else + { + _SO_CLROPT(conn->sconn.s_options, option); + } + + conn_unlock(&conn->sconn); + break; + +#if CONFIG_NET_RECV_BUFSIZE > 0 + case SO_RCVBUF: + { + int buffersize; + + /* Verify that option is the size of an 'int'. Should also check + * that 'value' is properly aligned for an 'int' + */ + + if (value_len != sizeof(int)) + { + return -EINVAL; + } + + /* Get the value. Is the option being set or cleared? */ + + buffersize = *(FAR int *)value; + if (buffersize < 0) + { + return -EINVAL; + } + +#if CONFIG_NET_MAX_RECV_BUFSIZE > 0 + buffersize = MIN(buffersize, CONFIG_NET_MAX_RECV_BUFSIZE); +#endif + conn->rcvbufs = buffersize; + + break; + } +#endif + +#if CONFIG_NET_SEND_BUFSIZE > 0 + case SO_SNDBUF: + { + int buffersize; + + /* Verify options */ + + if (value_len != sizeof(int)) + { + return -EINVAL; + } + + buffersize = *(FAR int *)value; + if (buffersize < 0) + { + return -EINVAL; + } + +# if CONFIG_NET_MAX_SEND_BUFSIZE > 0 + /* Limit the size of the send buffer */ + + buffersize = MIN(buffersize, CONFIG_NET_MAX_SEND_BUFSIZE); +# endif + + conn->sndbufs = buffersize; + break; + } +#endif + + default: + nerr("ERROR: Unrecognized CAN option: %d\n", option); + ret = -ENOPROTOOPT; + break; + } + + return ret; +} + #endif /**************************************************************************** diff --git a/net/can/can_setsockopt.c b/net/can/can_setsockopt.c deleted file mode 100644 index 175fd1fd85a..00000000000 --- a/net/can/can_setsockopt.c +++ /dev/null @@ -1,257 +0,0 @@ -/**************************************************************************** - * net/can/can_setsockopt.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> - -#include <sys/time.h> -#include <stdint.h> -#include <errno.h> -#include <assert.h> -#include <nuttx/debug.h> - -#include <nuttx/net/net.h> -#include <nuttx/net/can.h> - -#include "socket/socket.h" -#include "utils/utils.h" -#include "can/can.h" - -#ifdef CONFIG_NET_CANPROTO_OPTIONS - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: can_setsockopt - * - * Description: - * can_setsockopt() sets the CAN-protocol option specified by the - * 'option' argument to the value pointed to by the 'value' argument for - * the socket specified by the 'psock' argument. - * - * See <nuttx/can.h> for the a complete list of values of CAN protocol - * options. - * - * Input Parameters: - * psock Socket structure of socket to operate on - * level Protocol level to set the option - * option identifies the option to set - * value Points to the argument value - * value_len The length of the argument value - * - * Returned Value: - * Returns zero (OK) on success. On failure, it returns a negated errno - * value to indicate the nature of the error. See psock_setcockopt() for - * the list of possible error values. - * - ****************************************************************************/ - -int can_setsockopt(FAR struct socket *psock, int level, int option, - FAR const void *value, socklen_t value_len) -{ - FAR struct can_conn_s *conn; - int ret = OK; - int count = 0; - - DEBUGASSERT(value_len == 0 || value != NULL); - - conn = psock->s_conn; - - /* SO_RCVBUF and SO_SNDBUF are socket-level options that are kept in - * the CAN connection; psock_socketlevel_option() handles the others. - */ - - if (level == SOL_SOCKET) - { - if (option != SO_RCVBUF && option != SO_SNDBUF) - { - return -ENOPROTOOPT; - } - } - else if (level != SOL_CAN_RAW) - { - return -ENOPROTOOPT; - } - - if (psock->s_type != SOCK_RAW) - { - nerr("ERROR: Not a RAW CAN socket\n"); - return -ENOTCONN; - } - - switch (option) - { - case CAN_RAW_FILTER: - if (value_len == 0) - { - conn->filter_count = 0; - ret = OK; - } - else if (value_len % sizeof(struct can_filter) != 0) - { - ret = -EINVAL; - } - else if (value_len > CONFIG_NET_CAN_RAW_FILTER_MAX * - sizeof(struct can_filter)) - { - ret = -EINVAL; - } - else - { - int i; - - count = value_len / sizeof(struct can_filter); - - for (i = 0; i < count; i++) - { - conn->filters[i] = ((struct can_filter *)value)[i]; - } - - conn->filter_count = count; - - ret = OK; - } - break; - -#ifdef CONFIG_NET_CAN_ERRORS - case CAN_RAW_ERR_FILTER: - if (value_len != sizeof(can_err_mask_t)) - { - return -EINVAL; - } - - conn->err_mask = *(FAR can_err_mask_t *)value; - break; -#endif - - case CAN_RAW_LOOPBACK: - case CAN_RAW_RECV_OWN_MSGS: -#ifdef CONFIG_NET_CAN_CANFD - case CAN_RAW_FD_FRAMES: -#endif -#ifdef CONFIG_NET_CAN_RAW_TX_DEADLINE - case CAN_RAW_TX_DEADLINE: -#endif - /* Verify that option is the size of an 'int'. Should also check - * that 'value' is properly aligned for an 'int' - */ - - if (value_len != sizeof(int)) - { - return -EINVAL; - } - - /* Lock the network so that we have exclusive access to the socket - * options. - */ - - conn_lock(&conn->sconn); - - /* Set or clear the option bit */ - - if (*(FAR int *)value) - { - _SO_SETOPT(conn->sconn.s_options, option); - } - else - { - _SO_CLROPT(conn->sconn.s_options, option); - } - - conn_unlock(&conn->sconn); - break; - -#if CONFIG_NET_RECV_BUFSIZE > 0 - case SO_RCVBUF: - { - int buffersize; - - /* Verify that option is the size of an 'int'. Should also check - * that 'value' is properly aligned for an 'int' - */ - - if (value_len != sizeof(int)) - { - return -EINVAL; - } - - /* Get the value. Is the option being set or cleared? */ - - buffersize = *(FAR int *)value; - if (buffersize < 0) - { - return -EINVAL; - } - -#if CONFIG_NET_MAX_RECV_BUFSIZE > 0 - buffersize = MIN(buffersize, CONFIG_NET_MAX_RECV_BUFSIZE); -#endif - conn->rcvbufs = buffersize; - - break; - } -#endif - -#if CONFIG_NET_SEND_BUFSIZE > 0 - case SO_SNDBUF: - { - int buffersize; - - /* Verify options */ - - if (value_len != sizeof(int)) - { - return -EINVAL; - } - - buffersize = *(FAR int *)value; - if (buffersize < 0) - { - return -EINVAL; - } - -# if CONFIG_NET_MAX_SEND_BUFSIZE > 0 - /* Limit the size of the send buffer */ - - buffersize = MIN(buffersize, CONFIG_NET_MAX_SEND_BUFSIZE); -# endif - - conn->sndbufs = buffersize; - break; - } -#endif - - default: - nerr("ERROR: Unrecognized CAN option: %d\n", option); - ret = -ENOPROTOOPT; - break; - } - - return ret; -} - -#endif /* CONFIG_NET_CANPROTO_OPTIONS */
