414 lines
16 KiB
C
414 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
|
|
|
|
/* RFC 2863 operational status */
|
|
|
|
enum
|
|
{
|
|
IF_OPER_UNKNOWN,
|
|
IF_OPER_NOTPRESENT,
|
|
IF_OPER_DOWN,
|
|
IF_OPER_LOWERLAYERDOWN,
|
|
IF_OPER_TESTING,
|
|
IF_OPER_DORMANT,
|
|
IF_OPER_UP,
|
|
};
|
|
|
|
/****************************************************************************
|
|
* 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 */
|
|
FAR void *ifru_data; /* For use by interface */
|
|
} 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 */
|
|
#define ifr_data ifr_ifru.ifru_data /* for use by interface */
|
|
|
|
/* 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 */
|