socketcan : support error frame filter

add error mask for CAN_RAW_ERR_FILTER

Signed-off-by: xucheng5 <xucheng5@xiaomi.com>
This commit is contained in:
xucheng5 2023-08-17 15:27:28 +08:00 committed by Petro Karashchenko
parent ef3f807f89
commit b756a7c3a9
4 changed files with 33 additions and 0 deletions

View File

@ -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

View File

@ -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:

View File

@ -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)

View File

@ -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: