This is an automated email from the ASF dual-hosted git repository.
pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new b756a7c3a9 socketcan : support error frame filter
b756a7c3a9 is described below
commit b756a7c3a9bae10966c6eab5a365e0a4f4b92cd1
Author: xucheng5 <[email protected]>
AuthorDate: Thu Aug 17 15:27:28 2023 +0800
socketcan : support error frame filter
add error mask for CAN_RAW_ERR_FILTER
Signed-off-by: xucheng5 <[email protected]>
---
net/can/can.h | 3 +++
net/can/can_getsockopt.c | 12 ++++++++++++
net/can/can_recvmsg.c | 10 ++++++++++
net/can/can_setsockopt.c | 8 ++++++++
4 files changed, 33 insertions(+)
diff --git a/net/can/can.h b/net/can/can.h
index 7c86473729..46de920dc8 100644
--- a/net/can/can.h
+++ b/net/can/can.h
@@ -106,6 +106,9 @@ struct can_conn_s
# endif
struct can_filter filters[CONFIG_NET_CAN_RAW_FILTER_MAX];
int32_t filter_count;
+# ifdef CONFIG_NET_CAN_ERRORS
+ can_err_mask_t err_mask;
+# endif
# ifdef CONFIG_NET_CAN_RAW_TX_DEADLINE
int32_t tx_deadline;
# endif
diff --git a/net/can/can_getsockopt.c b/net/can/can_getsockopt.c
index 744c5b4c1f..a979c5098d 100644
--- a/net/can/can_getsockopt.c
+++ b/net/can/can_getsockopt.c
@@ -141,6 +141,18 @@ int can_getsockopt(FAR struct socket *psock, int level,
int option,
break;
case CAN_RAW_ERR_FILTER:
+#ifdef CONFIG_NET_CAN_ERRORS
+ if (*value_len < sizeof(can_err_mask_t))
+ {
+ return -EINVAL;
+ }
+ else
+ {
+ FAR can_err_mask_t *mask = (FAR can_err_mask_t *)value;
+ *mask = conn->err_mask;
+ *value_len = sizeof(can_err_mask_t);
+ }
+#endif
break;
case CAN_RAW_LOOPBACK:
diff --git a/net/can/can_recvmsg.c b/net/can/can_recvmsg.c
index f9cc7f272a..7477734489 100644
--- a/net/can/can_recvmsg.c
+++ b/net/can/can_recvmsg.c
@@ -301,6 +301,16 @@ static inline int can_readahead(struct can_recvfrom_s
*pstate)
static int can_recv_filter(struct can_conn_s *conn, canid_t id)
{
uint32_t i;
+
+#ifdef CONFIG_NET_CAN_ERRORS
+ /* error message frame */
+
+ if (id & CAN_ERR_FLAG)
+ {
+ return id & conn->err_mask ? 1 : 0;
+ }
+#endif
+
for (i = 0; i < conn->filter_count; i++)
{
if (conn->filters[i].can_id & CAN_INV_FILTER)
diff --git a/net/can/can_setsockopt.c b/net/can/can_setsockopt.c
index 8716dcf491..2b1ce233ac 100644
--- a/net/can/can_setsockopt.c
+++ b/net/can/can_setsockopt.c
@@ -153,6 +153,14 @@ int can_setsockopt(FAR struct socket *psock, int level,
int option,
break;
case CAN_RAW_ERR_FILTER:
+#ifdef CONFIG_NET_CAN_ERRORS
+ if (value_len != sizeof(can_err_mask_t))
+ {
+ return -EINVAL;
+ }
+
+ conn->err_mask = *(FAR can_err_mask_t *)value & CAN_ERR_MASK;
+#endif
break;
case CAN_RAW_LOOPBACK: