88d62a1157
adapts to third-party code compilation. in the process of porting ConnMan, we encounter some situations where the structure is not defined, or the returned data types do not match the expectations. Refer to the common implementation of other systems and add relevant definitions. Signed-off-by: zhanghongyu <zhanghongyu@xiaomi.com>
399 lines
16 KiB
C
399 lines
16 KiB
C
/****************************************************************************
|
|
* include/net/if.h
|
|
*
|
|
* 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.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef __INCLUDE_NET_IF_H
|
|
#define __INCLUDE_NET_IF_H
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <signal.h>
|
|
#include <sys/socket.h>
|
|
|
|
/****************************************************************************
|
|
* Pre-processor Definitions
|
|
****************************************************************************/
|
|
|
|
/* If CONFIG_NETDEV_IFINDEX is enabled then there is limit to the number of
|
|
* devices that can be registered due to the nature of some static data.
|
|
*/
|
|
|
|
#define MAX_IFINDEX 32
|
|
|
|
/* Sizing parameters */
|
|
|
|
#define IFNAMSIZ 16 /* Older naming standard */
|
|
#define IF_NAMESIZE 16 /* Newer naming standard */
|
|
#define IFHWADDRLEN 6
|
|
|
|
/* Interface flag bits */
|
|
|
|
#define IFF_DOWN (1 << 0) /* Interface is down */
|
|
#define IFF_UP (1 << 1) /* Interface is up */
|
|
#define IFF_RUNNING (1 << 2) /* Carrier is available */
|
|
#define IFF_IPv6 (1 << 3) /* Configured for IPv6 packet (vs ARP or IPv4) */
|
|
#define IFF_LOOPBACK (1 << 5) /* Is a loopback net */
|
|
#define IFF_POINTOPOINT (1 << 6) /* Is point-to-point link */
|
|
#define IFF_NOARP (1 << 7) /* ARP is not required for this packet */
|
|
#define IFF_NAT (1 << 8) /* NAT is enabled for this interface */
|
|
#define IFF_SLAVE (1 << 11) /* Slave of a load balancer. */
|
|
#define IFF_MULTICAST (1 << 12) /* Supports multicast. */
|
|
#define IFF_BROADCAST (1 << 13) /* Broadcast address valid. */
|
|
#define IFF_DYNAMIC (1 << 15) /* Dialup device with changing addresses. */
|
|
|
|
/* Interface flag helpers */
|
|
|
|
#define IFF_SET_UP(f) do { (f) |= IFF_UP; } while (0)
|
|
#define IFF_SET_RUNNING(f) do { (f) |= IFF_RUNNING; } while (0)
|
|
#define IFF_SET_NOARP(f) do { (f) |= IFF_NOARP; } while (0)
|
|
#define IFF_SET_NAT(f) do { (f) |= IFF_NAT; } while (0)
|
|
#define IFF_SET_LOOPBACK(f) do { (f) |= IFF_LOOPBACK; } while (0)
|
|
#define IFF_SET_POINTOPOINT(f) do { (f) |= IFF_POINTOPOINT; } while (0)
|
|
#define IFF_SET_MULTICAST(f) do { (f) |= IFF_MULTICAST; } while (0)
|
|
#define IFF_SET_BROADCAST(f) do { (f) |= IFF_BROADCAST; } while (0)
|
|
#define IFF_SET_SLAVE(f) do { (f) |= IFF_SLAVE; } while (0)
|
|
#define IFF_SET_DYNAMIC(f) do { (f) |= IFF_DYNAMIC; } while (0)
|
|
|
|
#define IFF_CLR_UP(f) do { (f) &= ~IFF_UP; } while (0)
|
|
#define IFF_CLR_RUNNING(f) do { (f) &= ~IFF_RUNNING; } while (0)
|
|
#define IFF_CLR_NOARP(f) do { (f) &= ~IFF_NOARP; } while (0)
|
|
#define IFF_CLR_NAT(f) do { (f) &= ~IFF_NAT; } while (0)
|
|
#define IFF_CLR_LOOPBACK(f) do { (f) &= ~IFF_LOOPBACK; } while (0)
|
|
#define IFF_CLR_POINTOPOINT(f) do { (f) &= ~IFF_POINTOPOINT; } while (0)
|
|
#define IFF_CLR_MULTICAST(f) do { (f) &= ~IFF_MULTICAST; } while (0)
|
|
#define IFF_CLR_BROADCAST(f) do { (f) &= ~IFF_BROADCAST; } while (0)
|
|
#define IFF_CLR_SLAVE(f) do { (f) &= ~IFF_SLAVE; } while (0)
|
|
#define IFF_CLR_DYNAMIC(f) do { (f) &= ~IFF_DYNAMIC; } while (0)
|
|
|
|
#define IFF_IS_UP(f) (((f) & IFF_UP) != 0)
|
|
#define IFF_IS_RUNNING(f) (((f) & IFF_RUNNING) != 0)
|
|
#define IFF_IS_NOARP(f) (((f) & IFF_NOARP) != 0)
|
|
#define IFF_IS_NAT(f) (((f) & IFF_NAT) != 0)
|
|
#define IFF_IS_LOOPBACK(f) (((f) & IFF_LOOPBACK) != 0)
|
|
#define IFF_IS_POINTOPOINT(f) (((f) & IFF_POINTOPOINT) != 0)
|
|
#define IFF_IS_MULTICAST(f) (((f) & IFF_MULTICAST) != 0)
|
|
#define IFF_IS_BROADCAST(f) (((f) & IFF_BROADCAST) != 0)
|
|
#define IFF_IS_SLAVE(f) (((f) & IFF_SLAVE) != 0)
|
|
#define IFF_IS_DYNAMIC(f) (((f) & IFF_DYNAMIC) != 0)
|
|
|
|
/* We only need to manage the IPv6 bit if both IPv6 and IPv4 are supported.
|
|
* Otherwise, we can save a few bytes by ignoring it.
|
|
*/
|
|
|
|
#if defined(CONFIG_NET_IPv4) && defined(CONFIG_NET_IPv6)
|
|
# define IFF_SET_IPv6(f) do { (f) |= IFF_IPv6; } while (0)
|
|
# define IFF_CLR_IPv6(f) do { (f) &= ~IFF_IPv6; } while (0)
|
|
# define IFF_IS_IPv6(f) (((f) & IFF_IPv6) != 0)
|
|
|
|
# define IFF_SET_IPv4(f) IFF_CLR_IPv6(f)
|
|
# define IFF_CLR_IPv4(f) IFF_SET_IPv6(f)
|
|
# define IFF_IS_IPv4(f) (!IFF_IS_IPv6(f))
|
|
|
|
#elif defined(CONFIG_NET_IPv6)
|
|
# define IFF_SET_IPv6(f)
|
|
# define IFF_CLR_IPv6(f)
|
|
# define IFF_IS_IPv6(f) (1)
|
|
|
|
# define IFF_SET_IPv4(f)
|
|
# define IFF_CLR_IPv4(f)
|
|
# define IFF_IS_IPv4(f) (0)
|
|
|
|
#else /* if defined(CONFIG_NET_IPv4) */
|
|
# define IFF_SET_IPv6(f)
|
|
# define IFF_CLR_IPv6(f)
|
|
# define IFF_IS_IPv6(f) (0)
|
|
|
|
# define IFF_SET_IPv4(f)
|
|
# define IFF_CLR_IPv4(f)
|
|
# define IFF_IS_IPv4(f) (1)
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Public Type Definitions
|
|
****************************************************************************/
|
|
|
|
struct if_nameindex
|
|
{
|
|
unsigned int if_index; /* 1, 2, ... */
|
|
FAR char *if_name; /* null terminated name: "eth0", ... */
|
|
};
|
|
|
|
/* Structure passed with the SIOCMIINOTIFY ioctl command to enable
|
|
* notification of of PHY state changes.
|
|
*/
|
|
|
|
struct mii_ioctl_notify_s
|
|
{
|
|
pid_t pid; /* PID of the task to receive the signal. Zero means "this task" */
|
|
struct sigevent event; /* Describe the way a task is to be notified */
|
|
};
|
|
|
|
/* Structure passed to read from or write to the MII/PHY management
|
|
* interface via the SIOCxMIIREG ioctl commands.
|
|
*/
|
|
|
|
struct mii_ioctl_data_s
|
|
{
|
|
uint16_t phy_id; /* PHY device address */
|
|
uint16_t reg_num; /* PHY register address */
|
|
uint16_t val_in; /* PHY input data */
|
|
uint16_t val_out; /* PHY output data */
|
|
};
|
|
|
|
/* Structure passed to get or set the CAN bitrate
|
|
* SIOCxCANBITRATE ioctl commands.
|
|
*/
|
|
|
|
struct can_ioctl_data_s
|
|
{
|
|
uint16_t arbi_bitrate; /* Classic CAN / Arbitration phase bitrate kbit/s */
|
|
uint16_t arbi_samplep; /* Classic CAN / Arbitration phase input % */
|
|
uint16_t data_bitrate; /* Data phase bitrate kbit/s */
|
|
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.
|
|
* One for IPv6 and one for IPv4.
|
|
* Notice that they are (and must be) cast compatible and really different
|
|
* only in the size of the structure allocation.
|
|
*
|
|
* This is the I/F request that should be used with IPv6.
|
|
*/
|
|
|
|
struct lifreq
|
|
{
|
|
char lifr_name[IFNAMSIZ]; /* Network device name (e.g. "eth0") */
|
|
int16_t lifr_ifindex; /* Interface index */
|
|
union
|
|
{
|
|
struct sockaddr_storage lifru_addr; /* IP Address */
|
|
struct sockaddr_storage lifru_dstaddr; /* P-to-P Address */
|
|
struct sockaddr_storage lifru_broadaddr; /* Broadcast address */
|
|
struct sockaddr_storage lifru_netmask; /* Netmask */
|
|
struct sockaddr lifru_hwaddr; /* MAC address */
|
|
int lifru_count; /* Number of devices */
|
|
int lifru_mtu; /* MTU size */
|
|
uint32_t lifru_flags; /* Interface flags */
|
|
struct mii_ioctl_notify_s llfru_mii_notify; /* PHY event notification */
|
|
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_filter_s lifru_can_filter; /* CAN filter request data */
|
|
} lifr_ifru;
|
|
};
|
|
|
|
#define lifr_addr lifr_ifru.lifru_addr /* IP address */
|
|
#define lifr_dstaddr lifr_ifru.lifru_dstaddr /* P-to-P Address */
|
|
#define lifr_broadaddr lifr_ifru.lifru_broadaddr /* Broadcast address */
|
|
#define lifr_netmask lifr_ifru.lifru_netmask /* Interface net mask */
|
|
#define lifr_hwaddr lifr_ifru.lifru_hwaddr /* MAC address */
|
|
#define lifr_mtu lifr_ifru.lifru_mtu /* MTU */
|
|
#define lifr_count lifr_ifru.lifru_count /* Number of devices */
|
|
#define lifr_flags lifr_ifru.lifru_flags /* interface flags */
|
|
#define lifr_mii_notify_pid lifr_ifru.llfru_mii_notify.pid /* PID to be notified */
|
|
#define lifr_mii_notify_event lifr_ifru.llfru_mii_notify.event /* Describes notification */
|
|
#define lifr_mii_phy_id lifr_ifru.lifru_mii_data.phy_id /* PHY device address */
|
|
#define lifr_mii_reg_num lifr_ifru.lifru_mii_data.reg_num /* PHY register address */
|
|
#define lifr_mii_val_in lifr_ifru.lifru_mii_data.val_in /* PHY input data */
|
|
#define lifr_mii_val_out lifr_ifru.lifru_mii_data.val_out /* PHY output data */
|
|
|
|
/* Used only with the SIOCGLIFCONF IOCTL command */
|
|
|
|
struct lifconf
|
|
{
|
|
size_t lifc_len; /* Size of buffer */
|
|
union
|
|
{
|
|
FAR char *lifcu_buf; /* Buffer address */
|
|
FAR struct lifreq *lifcu_req; /* Array of ifreq structures */
|
|
} lifc_ifcu;
|
|
};
|
|
|
|
#define lifc_buf lifc_ifcu.lifcu_buf /* Buffer address */
|
|
#define lifc_req lifc_ifcu.lifcu_req /* Array of ifreq structures */
|
|
|
|
/* This is the I/F request that should be used with IPv4. */
|
|
|
|
struct ifreq
|
|
{
|
|
char ifr_name[IFNAMSIZ]; /* Network device name (e.g. "eth0") */
|
|
int16_t ifr_ifindex; /* Interface index */
|
|
union
|
|
{
|
|
struct sockaddr ifru_addr; /* IP Address */
|
|
struct sockaddr ifru_dstaddr; /* P-to-P Address */
|
|
struct sockaddr ifru_broadaddr; /* Broadcast address */
|
|
struct sockaddr ifru_netmask; /* Netmask */
|
|
struct sockaddr ifru_hwaddr; /* MAC address */
|
|
int ifru_count; /* Number of devices */
|
|
int ifru_mtu; /* MTU size */
|
|
uint32_t ifru_flags; /* Interface flags */
|
|
struct mii_ioctl_notify_s ifru_mii_notify; /* PHY event notification */
|
|
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_filter_s ifru_can_filter; /* CAN filter request data */
|
|
} ifr_ifru;
|
|
};
|
|
|
|
#define ifr_addr ifr_ifru.ifru_addr /* IP address */
|
|
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* P-to-P Address */
|
|
#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* Broadcast address */
|
|
#define ifr_netmask ifr_ifru.ifru_netmask /* Interface net mask */
|
|
#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
|
|
#define ifr_mtu ifr_ifru.ifru_mtu /* MTU */
|
|
#define ifr_count ifr_ifru.ifru_count /* Number of devices */
|
|
#define ifr_flags ifr_ifru.ifru_flags /* interface flags */
|
|
#define ifr_mii_notify_pid ifr_ifru.ifru_mii_notify.pid /* PID to be notified */
|
|
#define ifr_mii_notify_event ifr_ifru.ifru_mii_notify.event /* Describes notification */
|
|
#define ifr_mii_phy_id ifr_ifru.ifru_mii_data.phy_id /* PHY device address */
|
|
#define ifr_mii_reg_num ifr_ifru.ifru_mii_data.reg_num /* PHY register address */
|
|
#define ifr_mii_val_in ifr_ifru.ifru_mii_data.val_in /* PHY input data */
|
|
#define ifr_mii_val_out ifr_ifru.ifru_mii_data.val_out /* PHY output data */
|
|
|
|
/* Used only with the SIOCGIFCONF IOCTL command */
|
|
|
|
struct ifconf
|
|
{
|
|
size_t ifc_len; /* Size of buffer */
|
|
union
|
|
{
|
|
FAR char *ifcu_buf; /* Buffer address */
|
|
FAR struct ifreq *ifcu_req; /* Array of ifreq structures */
|
|
} ifc_ifcu;
|
|
};
|
|
|
|
#define ifc_buf ifc_ifcu.ifcu_buf /* Buffer address */
|
|
#define ifc_req ifc_ifcu.ifcu_req /* Array of ifreq structures */
|
|
|
|
/****************************************************************************
|
|
* Public Function Prototypes
|
|
****************************************************************************/
|
|
|
|
#ifdef __cplusplus
|
|
#define EXTERN extern "C"
|
|
extern "C"
|
|
{
|
|
#else
|
|
#define EXTERN extern
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Name: if_nametoindex
|
|
*
|
|
* Description:
|
|
* The if_nametoindex() function returns the interface index corresponding
|
|
* to name ifname.
|
|
*
|
|
* Input Parameters:
|
|
* ifname - The interface name
|
|
*
|
|
* Returned Value:
|
|
* The corresponding index if ifname is the name of an interface;
|
|
* otherwise, zero.
|
|
*
|
|
****************************************************************************/
|
|
|
|
unsigned int if_nametoindex(FAR const char *ifname);
|
|
|
|
/****************************************************************************
|
|
* Name: if_indextoname
|
|
*
|
|
* Description:
|
|
* The if_indextoname() function maps an interface index to its
|
|
* corresponding name.
|
|
*
|
|
* Input Parameters:
|
|
* ifname - Points to a buffer of at least IF_NAMESIZE bytes.
|
|
* if_indextoname() will place in this buffer the name
|
|
* of the interface with index ifindex.
|
|
*
|
|
* Returned Value:
|
|
* If ifindex is an interface index, then the function will return the
|
|
* value supplied by ifname.
|
|
* Otherwise, the function returns a NULL pointer and sets errno to
|
|
* indicate the error.
|
|
*
|
|
****************************************************************************/
|
|
|
|
FAR char *if_indextoname(unsigned int ifindex, FAR char *ifname);
|
|
|
|
/****************************************************************************
|
|
* Name: if_nameindex
|
|
*
|
|
* Description:
|
|
* The if_nameindex() function returns an array of if_nameindex structures,
|
|
* each containing information about one of the network interfaces on the
|
|
* local system. The if_nameindex structure contains at least the following
|
|
* entries:
|
|
* unsigned int if_index;
|
|
* FAR char *if_name;
|
|
* The if_index field contains the interface index. The if_name field
|
|
* points to the null-terminated interface name. The end of the array
|
|
* is indicated by entry with if_index set to zero and if_name set to NULL.
|
|
*
|
|
* Input Parameters:
|
|
* None
|
|
*
|
|
* Returned Value:
|
|
* On success, if_nameindex() returns pointer to the array; on error, NULL
|
|
* is returned, and errno is set to indicate the error.
|
|
*
|
|
****************************************************************************/
|
|
|
|
FAR struct if_nameindex *if_nameindex(void);
|
|
|
|
/****************************************************************************
|
|
* Name: if_freenameindex
|
|
*
|
|
* Description:
|
|
* The if_freenameindex() function free the data structure returned by
|
|
* if_nameindex().
|
|
*
|
|
* Input Parameters:
|
|
* ifn - The data structure to free
|
|
*
|
|
* Returned Value:
|
|
* None
|
|
*
|
|
****************************************************************************/
|
|
|
|
void if_freenameindex(FAR struct if_nameindex *ifn);
|
|
|
|
#undef EXTERN
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __INCLUDE_NET_IF_H */
|