forked from nuttx/nuttx-update
net/netdev: Add CONFIG_NETDEV_CAN_FILTER_IOCTL
This commit is contained in:
parent
5f82c82e4d
commit
4610aee973
6 changed files with 99 additions and 36 deletions
|
@ -149,6 +149,20 @@ struct can_ioctl_data_s
|
||||||
uint16_t data_samplep; /* Data phase sample point % */
|
uint16_t data_samplep; /* Data phase sample point % */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Structure passed to add or remove hardware-level CAN ID filters
|
||||||
|
* SIOCxCANSTDFILTER / SIOCxCANEXTFILTER ioctl commands.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct can_ioctl_filter_s
|
||||||
|
{
|
||||||
|
uint32_t fid1; /* 11- or 29-bit ID (context dependent). For dual match or
|
||||||
|
* for the lower address in a range of addresses */
|
||||||
|
uint32_t fid2; /* 11- or 29-bit ID. For dual match, address mask or for
|
||||||
|
* upper address in address range */
|
||||||
|
uint8_t ftype; /* See CAN_FILTER_* definitions */
|
||||||
|
uint8_t fprio; /* See CAN_MSGPRIO_* definitions */
|
||||||
|
};
|
||||||
|
|
||||||
/* There are two forms of the I/F request structure.
|
/* There are two forms of the I/F request structure.
|
||||||
* One for IPv6 and one for IPv4.
|
* One for IPv6 and one for IPv4.
|
||||||
* Notice that they are (and must be) cast compatible and really different
|
* Notice that they are (and must be) cast compatible and really different
|
||||||
|
@ -159,21 +173,22 @@ struct can_ioctl_data_s
|
||||||
|
|
||||||
struct lifreq
|
struct lifreq
|
||||||
{
|
{
|
||||||
char lifr_name[IFNAMSIZ]; /* Network device name (e.g. "eth0") */
|
char lifr_name[IFNAMSIZ]; /* Network device name (e.g. "eth0") */
|
||||||
int16_t lifr_ifindex; /* Interface index */
|
int16_t lifr_ifindex; /* Interface index */
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
struct sockaddr_storage lifru_addr; /* IP Address */
|
struct sockaddr_storage lifru_addr; /* IP Address */
|
||||||
struct sockaddr_storage lifru_dstaddr; /* P-to-P Address */
|
struct sockaddr_storage lifru_dstaddr; /* P-to-P Address */
|
||||||
struct sockaddr_storage lifru_broadaddr; /* Broadcast address */
|
struct sockaddr_storage lifru_broadaddr; /* Broadcast address */
|
||||||
struct sockaddr_storage lifru_netmask; /* Netmask */
|
struct sockaddr_storage lifru_netmask; /* Netmask */
|
||||||
struct sockaddr lifru_hwaddr; /* MAC address */
|
struct sockaddr lifru_hwaddr; /* MAC address */
|
||||||
int lifru_count; /* Number of devices */
|
int lifru_count; /* Number of devices */
|
||||||
int lifru_mtu; /* MTU size */
|
int lifru_mtu; /* MTU size */
|
||||||
uint8_t lifru_flags; /* Interface flags */
|
uint8_t lifru_flags; /* Interface flags */
|
||||||
struct mii_ioctl_notify_s llfru_mii_notify; /* PHY event notification */
|
struct mii_ioctl_notify_s llfru_mii_notify; /* PHY event notification */
|
||||||
struct mii_ioctl_data_s lifru_mii_data; /* MII request data */
|
struct mii_ioctl_data_s lifru_mii_data; /* MII request data */
|
||||||
struct can_ioctl_data_s lifru_can_data; /* CAN bitrate request data */
|
struct can_ioctl_data_s lifru_can_data; /* CAN bitrate request data */
|
||||||
|
struct can_ioctl_filter_s lifru_can_filter; /* CAN filter request data */
|
||||||
} lifr_ifru;
|
} lifr_ifru;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -196,36 +211,37 @@ struct lifreq
|
||||||
|
|
||||||
struct lifconf
|
struct lifconf
|
||||||
{
|
{
|
||||||
size_t lifc_len; /* Size of buffer */
|
size_t lifc_len; /* Size of buffer */
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
FAR char *lifcu_buf; /* Buffer address */
|
FAR char *lifcu_buf; /* Buffer address */
|
||||||
FAR struct lifreq *lifcu_req; /* Array of ifreq structures */
|
FAR struct lifreq *lifcu_req; /* Array of ifreq structures */
|
||||||
} lifc_ifcu;
|
} lifc_ifcu;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define lifc_buf lifc_ifcu.lifcu_buf /* Buffer address */
|
#define lifc_buf lifc_ifcu.lifcu_buf /* Buffer address */
|
||||||
#define lifc_req lifc_ifcu.lifcu_req /* Array of ifreq structures */
|
#define lifc_req lifc_ifcu.lifcu_req /* Array of ifreq structures */
|
||||||
|
|
||||||
/* This is the I/F request that should be used with IPv4. */
|
/* This is the I/F request that should be used with IPv4. */
|
||||||
|
|
||||||
struct ifreq
|
struct ifreq
|
||||||
{
|
{
|
||||||
char ifr_name[IFNAMSIZ]; /* Network device name (e.g. "eth0") */
|
char ifr_name[IFNAMSIZ]; /* Network device name (e.g. "eth0") */
|
||||||
int16_t ifr_ifindex; /* Interface index */
|
int16_t ifr_ifindex; /* Interface index */
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
struct sockaddr ifru_addr; /* IP Address */
|
struct sockaddr ifru_addr; /* IP Address */
|
||||||
struct sockaddr ifru_dstaddr; /* P-to-P Address */
|
struct sockaddr ifru_dstaddr; /* P-to-P Address */
|
||||||
struct sockaddr ifru_broadaddr; /* Broadcast address */
|
struct sockaddr ifru_broadaddr; /* Broadcast address */
|
||||||
struct sockaddr ifru_netmask; /* Netmask */
|
struct sockaddr ifru_netmask; /* Netmask */
|
||||||
struct sockaddr ifru_hwaddr; /* MAC address */
|
struct sockaddr ifru_hwaddr; /* MAC address */
|
||||||
int ifru_count; /* Number of devices */
|
int ifru_count; /* Number of devices */
|
||||||
int ifru_mtu; /* MTU size */
|
int ifru_mtu; /* MTU size */
|
||||||
uint8_t ifru_flags; /* Interface flags */
|
uint8_t ifru_flags; /* Interface flags */
|
||||||
struct mii_ioctl_notify_s ifru_mii_notify; /* PHY event notification */
|
struct mii_ioctl_notify_s ifru_mii_notify; /* PHY event notification */
|
||||||
struct mii_ioctl_data_s ifru_mii_data; /* MII request data */
|
struct mii_ioctl_data_s ifru_mii_data; /* MII request data */
|
||||||
struct can_ioctl_data_s ifru_can_data; /* CAN bitrate request data */
|
struct can_ioctl_data_s ifru_can_data; /* CAN bitrate request data */
|
||||||
|
struct can_ioctl_filter_s ifru_can_filter; /* CAN filter request data */
|
||||||
} ifr_ifru;
|
} ifr_ifru;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -248,7 +264,7 @@ struct ifreq
|
||||||
|
|
||||||
struct ifconf
|
struct ifconf
|
||||||
{
|
{
|
||||||
size_t ifc_len; /* Size of buffer */
|
size_t ifc_len; /* Size of buffer */
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
FAR char *ifcu_buf; /* Buffer address */
|
FAR char *ifcu_buf; /* Buffer address */
|
||||||
|
|
|
@ -82,6 +82,22 @@
|
||||||
#define CAN_RAW_TX_DEADLINE (__SO_PROTOCOL + 6)
|
#define CAN_RAW_TX_DEADLINE (__SO_PROTOCOL + 6)
|
||||||
/* Abort frame when deadline passed */
|
/* Abort frame when deadline passed */
|
||||||
|
|
||||||
|
/* CAN filter support (Hardware level filtering) ****************************/
|
||||||
|
|
||||||
|
/* Some CAN hardware supports a notion of prioritizing messages that match
|
||||||
|
* filters. Only two priority levels are currently supported and are encoded
|
||||||
|
* as defined below:
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CAN_MSGPRIO_LOW 0
|
||||||
|
#define CAN_MSGPRIO_HIGH 1
|
||||||
|
|
||||||
|
/* Filter type. Not all CAN hardware will support all filter types. */
|
||||||
|
|
||||||
|
#define CAN_FILTER_MASK 0 /* Address match under a mask */
|
||||||
|
#define CAN_FILTER_DUAL 1 /* Dual address match */
|
||||||
|
#define CAN_FILTER_RANGE 2 /* Match a range of addresses */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Types
|
* Public Types
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
|
@ -112,8 +112,12 @@
|
||||||
|
|
||||||
/* SocketCAN ****************************************************************/
|
/* SocketCAN ****************************************************************/
|
||||||
|
|
||||||
#define SIOCGCANBITRATE _SIOC(0x002C) /* Get bitrate from a CAN controller */
|
#define SIOCGCANBITRATE _SIOC(0x002C) /* Get bitrate from a CAN controller */
|
||||||
#define SIOCSCANBITRATE _SIOC(0x002D) /* Set bitrate of a CAN controller */
|
#define SIOCSCANBITRATE _SIOC(0x002D) /* Set bitrate of a CAN controller */
|
||||||
|
#define SIOCACANEXTFILTER _SIOC(0x002E) /* Add hardware-level exteneded ID filter */
|
||||||
|
#define SIOCDCANEXTFILTER _SIOC(0x002F) /* Delete hardware-level exteneded ID filter */
|
||||||
|
#define SIOCACANSTDFILTER _SIOC(0x0030) /* Add hardware-level standard ID filter */
|
||||||
|
#define SIOCDCANSTDFILTER _SIOC(0x0031) /* Delete hardware-level standard ID filter */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Type Definitions
|
* Public Type Definitions
|
||||||
|
|
|
@ -31,7 +31,7 @@ config NET_CAN_HAVE_ERRORS
|
||||||
default n
|
default n
|
||||||
|
|
||||||
config CAN_CONNS
|
config CAN_CONNS
|
||||||
int "Number of CAN connections"
|
int "Max number of CAN socket connections"
|
||||||
default 4
|
default 4
|
||||||
---help---
|
---help---
|
||||||
Maximum number of CAN connections (all tasks).
|
Maximum number of CAN connections (all tasks).
|
||||||
|
|
|
@ -24,6 +24,15 @@ config NETDEV_CAN_BITRATE_IOCTL
|
||||||
---help---
|
---help---
|
||||||
Enable support for ioctl() commands to change CAN bitrate
|
Enable support for ioctl() commands to change CAN bitrate
|
||||||
|
|
||||||
|
config NETDEV_CAN_FILTER_IOCTL
|
||||||
|
bool "Enable CAN filter ioctl()"
|
||||||
|
default n
|
||||||
|
select NETDEV_IOCTL
|
||||||
|
depends on NET_CAN
|
||||||
|
---help---
|
||||||
|
Enable support for ioctl() commands to add/remove CAN hardware-level
|
||||||
|
filters (NOTE: Not supported by all drivers)
|
||||||
|
|
||||||
config NETDEV_WIRELESS_IOCTL
|
config NETDEV_WIRELESS_IOCTL
|
||||||
bool "Enable Wireless ioctl()"
|
bool "Enable Wireless ioctl()"
|
||||||
default n
|
default n
|
||||||
|
|
|
@ -1072,7 +1072,7 @@ static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd,
|
||||||
if (dev && dev->d_ioctl)
|
if (dev && dev->d_ioctl)
|
||||||
{
|
{
|
||||||
struct can_ioctl_data_s *can_bitrate_data =
|
struct can_ioctl_data_s *can_bitrate_data =
|
||||||
&req->ifr_ifru.ifru_can_data;
|
&req->ifr_ifru.ifru_can_data;
|
||||||
ret = dev->d_ioctl(dev, cmd,
|
ret = dev->d_ioctl(dev, cmd,
|
||||||
(unsigned long)(uintptr_t)can_bitrate_data);
|
(unsigned long)(uintptr_t)can_bitrate_data);
|
||||||
}
|
}
|
||||||
|
@ -1080,6 +1080,24 @@ static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd,
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(CONFIG_NETDEV_IOCTL) && defined(CONFIG_NETDEV_CAN_FILTER_IOCTL)
|
||||||
|
case SIOCACANEXTFILTER: /* Add an extended-ID filter */
|
||||||
|
case SIOCDCANEXTFILTER: /* Delete an extended-ID filter */
|
||||||
|
case SIOCACANSTDFILTER: /* Add a standard-ID filter */
|
||||||
|
case SIOCDCANSTDFILTER: /* Delete a standard-ID filter */
|
||||||
|
{
|
||||||
|
dev = netdev_ifr_dev(req);
|
||||||
|
if (dev && dev->d_ioctl)
|
||||||
|
{
|
||||||
|
struct can_ioctl_filter_s *can_filter =
|
||||||
|
&req->ifr_ifru.ifru_can_filter;
|
||||||
|
ret = dev->d_ioctl(dev, cmd,
|
||||||
|
(unsigned long)(uintptr_t)can_filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_NETDEV_IFINDEX
|
#ifdef CONFIG_NETDEV_IFINDEX
|
||||||
case SIOCGIFNAME: /* Get interface name */
|
case SIOCGIFNAME: /* Get interface name */
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue