haiku/headers/posix/net/if.h
Axel Dörfler 1f9c8c4576 * Changed the _SIZEOF_ADDR_IFREQ() macro such that it can be used how we are
using it - hopefully, that is actually correct (it's adopted from FreeBSD).
* Fixed bug that cut off the sockaddr_dl reported by the system, so that DHCP
  wouldn't work anymore (and ifconfig wouldn't show the actual MAC address
  anymore).
* Changed the listing code to actually pad to ifreq size, and leave the length
  of the sockaddr untouched.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37941 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-08-06 12:58:02 +00:00

127 lines
3.0 KiB
C

/*
* Copyright 2006-2010, 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(ifreq) \
? IF_NAMESIZE + (request).ifr_addr.sa_len : sizeof(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 index, char* nameBuffer);
struct if_nameindex* if_nameindex(void);
void if_freenameindex(struct if_nameindex* interfaceArray);
#ifdef __cplusplus
}
#endif
#endif /* _NET_IF_H */