1/*
2 * Copyright 2006-2012 Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _NET_IF_H
6#define _NET_IF_H
7
8
9#include <net/route.h>
10#include <sys/socket.h>
11
12
13#define IF_NAMESIZE	32
14
15/* BSD specific/proprietary part */
16
17#define IFNAMSIZ IF_NAMESIZE
18
19struct ifreq_stream_stats {
20	uint32_t	packets;
21	uint32_t	errors;
22	uint64_t	bytes;
23	uint32_t	multicast_packets;
24	uint32_t	dropped;
25};
26
27struct ifreq_stats {
28	struct ifreq_stream_stats receive;
29	struct ifreq_stream_stats send;
30	uint32_t	collisions;
31};
32
33struct ifreq {
34	char			ifr_name[IF_NAMESIZE];
35	union {
36		struct sockaddr ifr_addr;
37		struct sockaddr ifr_dstaddr;
38		struct sockaddr ifr_broadaddr;
39		struct sockaddr ifr_mask;
40		struct ifreq_stats ifr_stats;
41		struct route_entry ifr_route;
42		int			ifr_flags;
43		int			ifr_index;
44		int			ifr_metric;
45		int			ifr_mtu;
46		int			ifr_media;
47		int			ifr_type;
48		int			ifr_reqcap;
49		int			ifr_count;
50		uint8_t*	ifr_data;
51	};
52};
53
54/* used with SIOC_IF_ALIAS_ADD, SIOC_IF_ALIAS_GET, SIOC_ALIAS_SET */
55struct ifaliasreq {
56	char			ifra_name[IF_NAMESIZE];
57	int				ifra_index;
58	struct sockaddr_storage ifra_addr;
59	union {
60		struct sockaddr_storage ifra_broadaddr;
61		struct sockaddr_storage ifra_destination;
62	};
63	struct sockaddr_storage ifra_mask;
64	uint32_t		ifra_flags;
65};
66
67
68/* interface flags */
69#define IFF_UP				0x0001
70#define IFF_BROADCAST		0x0002	/* valid broadcast address */
71#define IFF_LOOPBACK		0x0008
72#define IFF_POINTOPOINT		0x0010	/* point-to-point link */
73#define IFF_NOARP			0x0040	/* no address resolution */
74#define IFF_AUTOUP			0x0080	/* auto dial */
75#define IFF_PROMISC			0x0100	/* receive all packets */
76#define IFF_ALLMULTI		0x0200	/* receive all multicast packets */
77#define IFF_SIMPLEX			0x0800	/* doesn't receive own transmissions */
78#define IFF_LINK			0x1000	/* has link */
79#define IFF_AUTO_CONFIGURED	0x2000
80#define IFF_CONFIGURING		0x4000
81#define IFF_MULTICAST		0x8000	/* supports multicast */
82
83/* interface alias flags */
84#define IFAF_AUTO_CONFIGURED	0x0001	/* has been automatically configured */
85#define IFAF_CONFIGURING		0x0002	/* auto configuration in progress */
86
87
88/* used with SIOCGIFCOUNT, and SIOCGIFCONF */
89struct ifconf {
90	int				ifc_len;	/* size of buffer */
91	union {
92		void*		ifc_buf;
93		struct ifreq* ifc_req;
94		int			ifc_value;
95	};
96};
97
98/* Macro that returns the size of a single address within a SIOCGIFCONF buffer;
99   it looks like this because of compatibility with other platforms. */
100#define _SIZEOF_ADDR_IFREQ(request) \
101	(IF_NAMESIZE + (request).ifr_addr.sa_len > (int)sizeof(struct ifreq) \
102		? IF_NAMESIZE + (request).ifr_addr.sa_len : sizeof(struct ifreq))
103
104
105/* POSIX definitions follow */
106
107struct if_nameindex {
108	unsigned		if_index;	/* positive interface index */
109	char*			if_name;	/* interface name, ie. "loopback" */
110};
111
112
113#ifdef __cplusplus
114extern "C" {
115#endif
116
117unsigned if_nametoindex(const char* name);
118char* if_indextoname(unsigned interfaceIndex, char* nameBuffer);
119struct if_nameindex* if_nameindex(void);
120void if_freenameindex(struct if_nameindex* interfaceArray);
121
122#ifdef __cplusplus
123}
124#endif
125
126
127#endif	/* _NET_IF_H */
128