44fa45df3a
This was introduced into the main API in 2010 (d72ede75fb
), but was actually only fully used for the past month (c2a9a890f3
) when SIOCGIFMEDIA was supported for all *BSD drivers and not just WiFi. Most userland consumers of this structure did not use it correctly, as was the case in #17770, and only worked because in the fallback case the network stack just treated it as if it were an ifreq. Nothing actually used the ifm_count/ifm_ulist (though tentative APIs were exposed for it) as noted by previous commits; and the fact that Haiku's IFM_* declarations are so spartan makes most of the returned values unintelligible to userland without using FreeBSD compat headers. If, in the future, we decide to implement ifmedia listing and selection properly, that should likely be done with separate ioctls instead of having multi-function ones like this. This is technically an ABI break, but in practice it should not matter: ifmediareq::ifm_current aligns with ifreq::ifr_media, so the things that used this structure like our in-tree code did will continue to work. Until this past May, the only other field that was usually set was ifm_active, but in the absence of setting ifm_status all non-Haiku consumers should ignore it completely. The only consumer of this ioctl that I know of out of the tree, wpa_supplicant, still works after these changes.
128 lines
3.0 KiB
C
128 lines
3.0 KiB
C
/*
|
|
* Copyright 2006-2012 Haiku, Inc. All Rights Reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*/
|
|
#ifndef _NET_IF_H
|
|
#define _NET_IF_H
|
|
|
|
|
|
#include <net/route.h>
|
|
#include <sys/socket.h>
|
|
|
|
|
|
#define IF_NAMESIZE 32
|
|
|
|
/* BSD specific/proprietary part */
|
|
|
|
#define IFNAMSIZ IF_NAMESIZE
|
|
|
|
struct ifreq_stream_stats {
|
|
uint32_t packets;
|
|
uint32_t errors;
|
|
uint64_t bytes;
|
|
uint32_t multicast_packets;
|
|
uint32_t dropped;
|
|
};
|
|
|
|
struct ifreq_stats {
|
|
struct ifreq_stream_stats receive;
|
|
struct ifreq_stream_stats send;
|
|
uint32_t collisions;
|
|
};
|
|
|
|
struct ifreq {
|
|
char ifr_name[IF_NAMESIZE];
|
|
union {
|
|
struct sockaddr ifr_addr;
|
|
struct sockaddr ifr_dstaddr;
|
|
struct sockaddr ifr_broadaddr;
|
|
struct sockaddr ifr_mask;
|
|
struct ifreq_stats ifr_stats;
|
|
struct route_entry ifr_route;
|
|
int ifr_flags;
|
|
int ifr_index;
|
|
int ifr_metric;
|
|
int ifr_mtu;
|
|
int ifr_media;
|
|
int ifr_type;
|
|
int ifr_reqcap;
|
|
int ifr_count;
|
|
uint8_t* ifr_data;
|
|
};
|
|
};
|
|
|
|
/* used with SIOC_IF_ALIAS_ADD, SIOC_IF_ALIAS_GET, SIOC_ALIAS_SET */
|
|
struct ifaliasreq {
|
|
char ifra_name[IF_NAMESIZE];
|
|
int ifra_index;
|
|
struct sockaddr_storage ifra_addr;
|
|
union {
|
|
struct sockaddr_storage ifra_broadaddr;
|
|
struct sockaddr_storage ifra_destination;
|
|
};
|
|
struct sockaddr_storage ifra_mask;
|
|
uint32_t ifra_flags;
|
|
};
|
|
|
|
|
|
/* interface flags */
|
|
#define IFF_UP 0x0001
|
|
#define IFF_BROADCAST 0x0002 /* valid broadcast address */
|
|
#define IFF_LOOPBACK 0x0008
|
|
#define IFF_POINTOPOINT 0x0010 /* point-to-point link */
|
|
#define IFF_NOARP 0x0040 /* no address resolution */
|
|
#define IFF_AUTOUP 0x0080 /* auto dial */
|
|
#define IFF_PROMISC 0x0100 /* receive all packets */
|
|
#define IFF_ALLMULTI 0x0200 /* receive all multicast packets */
|
|
#define IFF_SIMPLEX 0x0800 /* doesn't receive own transmissions */
|
|
#define IFF_LINK 0x1000 /* has link */
|
|
#define IFF_AUTO_CONFIGURED 0x2000
|
|
#define IFF_CONFIGURING 0x4000
|
|
#define IFF_MULTICAST 0x8000 /* supports multicast */
|
|
|
|
/* interface alias flags */
|
|
#define IFAF_AUTO_CONFIGURED 0x0001 /* has been automatically configured */
|
|
#define IFAF_CONFIGURING 0x0002 /* auto configuration in progress */
|
|
|
|
|
|
/* used with SIOCGIFCOUNT, and SIOCGIFCONF */
|
|
struct ifconf {
|
|
int ifc_len; /* size of buffer */
|
|
union {
|
|
void* ifc_buf;
|
|
struct ifreq* ifc_req;
|
|
int ifc_value;
|
|
};
|
|
};
|
|
|
|
/* Macro that returns the size of a single address within a SIOCGIFCONF buffer;
|
|
it looks like this because of compatibility with other platforms. */
|
|
#define _SIZEOF_ADDR_IFREQ(request) \
|
|
(IF_NAMESIZE + (request).ifr_addr.sa_len > (int)sizeof(struct ifreq) \
|
|
? IF_NAMESIZE + (request).ifr_addr.sa_len : sizeof(struct ifreq))
|
|
|
|
|
|
/* POSIX definitions follow */
|
|
|
|
struct if_nameindex {
|
|
unsigned if_index; /* positive interface index */
|
|
char* if_name; /* interface name, ie. "loopback" */
|
|
};
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
unsigned if_nametoindex(const char* name);
|
|
char* if_indextoname(unsigned interfaceIndex, char* nameBuffer);
|
|
struct if_nameindex* if_nameindex(void);
|
|
void if_freenameindex(struct if_nameindex* interfaceArray);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
#endif /* _NET_IF_H */
|