Welcome to mirror list, hosted at ThFree Co, Russian Federation.

if.h « net « include « phoenix « sys « libc « newlib - cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 42987b546c669b4dbd8bf46cc40da673152c474a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
/*
 * Copyright (c) 1982, 1986, 1989, 1993
 *	The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	@(#)if.h	8.1 (Berkeley) 6/10/93
 * $FreeBSD: src/sys/net/if.h,v 1.71 2002/03/19 21:54:16 alfred Exp $
 */

#ifndef _NET_IF_H
#define	_NET_IF_H

#include <phoenix/iface.h>
#include <sys/queue.h>
#include <sys/socket.h>
#include <sys/time.h>

struct ifnet;

/*
 * Length of interface external name, including terminating '\0'.
 * Note: this is the same size as a generic device's external name.
 */
#define	IFNAMSIZ		16
#define IF_NAMESIZE		IFNAMSIZ
#define	IF_MAXUNIT		0x7fff			/* ifp->if_unit is only 15 bits */

/* Structure describing a `cloning' interface. */
struct if_clone {
	LIST_ENTRY(if_clone) ifc_list;		/* On list of cloners */
	const char *ifc_name;				/* Name of device, e.g. `gif' */
	size_t ifc_namelen;					/* Length of name */
	int ifc_maxunit;					/* Maximum unit number */
	unsigned char *ifc_units;			/* Bitmap to handle units */
	int ifc_bmlen;						/* Bitmap length */

	int	(*ifc_create)(struct if_clone *, int);
	int	(*ifc_destroy)(struct ifnet *);
};

#define IF_CLONE_INITIALIZER(name, create, destroy, maxunit)		\
	{ { 0 }, name, sizeof(name) - 1, maxunit, NULL, 0, create, destroy }

/* Structure used to query names of interface cloners. */
struct if_clonereq {
	int	ifcr_total;			/* Total cloners (out) */
	int	ifcr_count;			/* Room for this many in user buffer */
	char *ifcr_buffer;		/* Buffer for cloner names */
};

/*
 * Structure describing information about an interface
 * which may be of interest to management entities.
 */
struct if_data {
	/* Generic interface information */
	u_char ifi_type;					/* Ethernet, tokenring, etc */
	u_char ifi_physical;				/* E.g., AUI, Thinnet, 10base-T, etc */
	u_char ifi_addrlen;					/* Media address length */
	u_char ifi_hdrlen;					/* Media header length */
	u_char ifi_recvquota;				/* Polling quota for receive intrs */
	u_char ifi_xmitquota;				/* Polling quota for xmit intrs */
	u_long ifi_mtu;						/* Maximum transmission unit */
	u_long ifi_metric;					/* Routing metric (external only) */
	u_long ifi_baudrate;				/* Linespeed */
	/* Volatile statistics */
	u_long ifi_ipackets;				/* Packets received on interface */
	u_long ifi_ierrors;					/* Input errors on interface */
	u_long ifi_opackets;				/* Packets sent on interface */
	u_long ifi_oerrors;					/* Output errors on interface */
	u_long ifi_collisions;				/* Collisions on csma interfaces */
	u_long ifi_ibytes;					/* Total number of octets received */
	u_long ifi_obytes;					/* Total number of octets sent */
	u_long ifi_imcasts;					/* Packets received via multicast */
	u_long ifi_omcasts;					/* Packets sent via multicast */
	u_long ifi_iqdrops;					/* Dropped on input, this interface */
	u_long ifi_noproto;					/* Destined for unsupported protocol */
	u_long ifi_hwassist;				/* HW offload capabilities */
	u_long ifi_unused;					/* XXX was ifi_xmittiming */
	struct timeval ifi_lastchange;		/* Time of last administrative change */
};

/*
 * The following flag(s) ought to go in if_flags, but we cannot change
 * struct ifnet because of binary compatibility, so we store them in
 * if_ipending, which is not used so far.
 * If possible, make sure the value is not conflicting with other
 * IFF flags, so we have an easier time when we want to merge them.
 */
#define	IFF_POLLING			0x10000		/* Interface is in polling mode. */

/* Flags set internally only */
#define	IFF_CANTCHANGE 		(IFF_BROADCAST | IFF_POINTOPOINT | IFF_RUNNING | IFF_OACTIVE | IFF_SIMPLEX | IFF_MULTICAST | IFF_ALLMULTI | IFF_NOTRAILERS)

/* Capabilities that interfaces can advertise. */
#define IFCAP_RXCSUM		0x0001		/* Can offload checksum on RX */
#define IFCAP_TXCSUM		0x0002		/* Can offload checksum on TX */
#define IFCAP_NETCONS		0x0004		/* Can be a network console */

#define IFCAP_HWCSUM		(IFCAP_RXCSUM | IFCAP_TXCSUM)

#define	IFQ_MAXLEN			50
#define	IFNET_SLOWHZ		1			/* Granularity is 1 second */

/* Message format for use in obtaining information about interfaces from getkerninfo and the routing socket */
struct if_msghdr {
	u_short	ifm_msglen;			/* To skip over non-understood messages */
	u_char ifm_version;			/* Future binary compatibility */
	u_char ifm_type;			/* Message type */
	int	ifm_addrs;				/* Like rtm_addrs */
	int	ifm_flags;				/* Value of if_flags */
	u_short	ifm_index;			/* Index for associated ifp */
	struct if_data ifm_data;	/* Statistics and other data about if */
};

/* Message format for use in obtaining information about interface addresses from getkerninfo and the routing socket */
struct ifa_msghdr {
	u_short	ifam_msglen;		/* To skip over non-understood messages */
	u_char ifam_version;		/* Future binary compatibility */
	u_char ifam_type;			/* Message type */
	int	ifam_addrs;				/* Like rtm_addrs */
	int	ifam_flags;				/* Value of ifa_flags */
	u_short	ifam_index;			/* Index for associated ifp */
	int	ifam_metric;			/* Value of ifa_metric */
};

/* Message format for use in obtaining information about multicast addresses from the routing socket */
struct ifma_msghdr {
	u_short	ifmam_msglen;		/* To skip over non-understood messages */
	u_char ifmam_version;		/* Future binary compatibility */
	u_char ifmam_type;			/* Message type */
	int	ifmam_addrs;			/* Like rtm_addrs */
	int	ifmam_flags;			/* Value of ifa_flags */
	u_short	ifmam_index;		/* Index for associated ifp */
};

/* Message format announcing the arrival or departure of a network interface. */
struct if_announcemsghdr {
	u_short	ifan_msglen;		/* To skip over non-understood messages */
	u_char ifan_version;		/* Future binary compatibility */
	u_char ifan_type;			/* Message type */
	u_short	ifan_index;			/* Index for associated ifp */
	char ifan_name[IFNAMSIZ]; 	/* If name, e.g. "en0" */
	u_short	ifan_what;			/* What type of announcement */
};

#define	IFAN_ARRIVAL		0		/* Interface arrival */
#define	IFAN_DEPARTURE		1		/* Interface departure */

struct ifaliasreq {
	char ifra_name[IFNAMSIZ];	/* if name, e.g. "en0" */
	struct sockaddr ifra_addr;
	struct sockaddr ifra_broadaddr;
	struct sockaddr ifra_mask;
};

struct ifmediareq {
	char ifm_name[IFNAMSIZ];	/* If name, e.g. "en0" */
	int	ifm_current;			/* Current media options */
	int	ifm_mask;				/* Don't care mask */
	int	ifm_status;				/* Media status */
	int	ifm_active;				/* Active options */
	int	ifm_count;				/* # entries in ifm_ulist array */
	int	*ifm_ulist;				/* Media words */
};

/* 
 * Structure used to retrieve aux status data from interfaces.
 * Kernel suppliers to this interface should respect the formatting
 * needed by ifconfig(8): each line starts with a TAB and ends with
 * a newline.  The canonical example to copy and paste is in if_tun.c.
 */
#define	IFSTATMAX			800			/* 10 lines of text */
struct ifstat {
	char ifs_name[IFNAMSIZ];			/* if name, e.g. "en0" */
	char ascii[IFSTATMAX + 1];
};

/*
 * Structure used in SIOCGIFCONF request.
 * Used to retrieve interface configuration
 * for machine (useful for programs which
 * must know all networks accessible).
 */
struct	ifconf {
	int	ifc_len;		/* Size of associated buffer */
	union {
		caddr_t	ifcu_buf;
		struct	ifreq *ifcu_req;
	} ifc_ifcu;
#define	ifc_buf				ifc_ifcu.ifcu_buf		/* Buffer address */
#define	ifc_req				ifc_ifcu.ifcu_req		/* Array of structures returned */
};


/* Structure for SIOC[AGD]LIFADDR */
struct if_laddrreq {
	char iflr_name[IFNAMSIZ];
	u_int flags;
#define	IFLR_PREFIX			0x8000		/* in: prefix given  out: kernel fills id */
	u_int prefixlen;					/* in/out */
	struct sockaddr_storage addr;		/* in/out */
	struct sockaddr_storage dstaddr;	/* out */
};

struct if_nameindex {
	u_int if_index;		/* 1, 2, ... */
	char *if_name;		/* null terminated name: "le0", ... */
};

unsigned int if_nametoindex(const char *ifname);
char *if_indextoname(unsigned int ifindex, char *ifname);
struct if_nameindex *if_nameindex();
void if_freenameindex(struct if_nameindex *ptr);

#endif