00001 /*- 00002 * © Portions copyright (c) 2005 Nokia Corporation. All rights reserved. 00003 * © Portions copyright (c) 2007 Symbian Software Ltd. All rights reserved. 00004 * Copyright (c) 1982, 1986, 1989, 1993 00005 * The Regents of the University of California. All rights reserved. 00006 * 00007 * Redistribution and use in source and binary forms, with or without 00008 * modification, are permitted provided that the following conditions 00009 * are met: 00010 * 1. Redistributions of source code must retain the above copyright 00011 * notice, this list of conditions and the following disclaimer. 00012 * 2. Redistributions in binary form must reproduce the above copyright 00013 * notice, this list of conditions and the following disclaimer in the 00014 * documentation and/or other materials provided with the distribution. 00015 * 4. Neither the name of the University nor the names of its contributors 00016 * may be used to endorse or promote products derived from this software 00017 * without specific prior written permission. 00018 * 00019 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 00020 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00021 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00022 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 00023 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00024 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 00025 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00026 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00027 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 00028 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00029 * SUCH DAMAGE. 00030 * 00031 * @(#)if.h 8.1 (Berkeley) 6/10/93 00032 * $FreeBSD: src/sys/net/if.h,v 1.96.2.3 2005/10/07 14:00:05 glebius Exp $ 00033 */ 00034 00035 #ifndef _NET_IF_H_ 00036 #define _NET_IF_H_ 00037 00038 #include <sys/cdefs.h> 00039 00040 #ifdef __SYMBIAN32__ 00041 #include <sys/socket.h> 00042 // __SYMBIAN32__ 00043 #endif 00044 00045 00046 #ifdef _KERNEL 00047 #include <sys/queue.h> 00048 #endif 00049 00050 #if __BSD_VISIBLE 00051 /* 00052 * <net/if.h> does not depend on <sys/time.h> on most other systems. This 00053 * helps userland compatibility. (struct timeval ifi_lastchange) 00054 */ 00055 #ifndef _KERNEL 00056 #include <sys/time.h> 00057 #endif 00058 00059 struct ifnet; 00060 #endif 00061 00062 /* 00063 * Length of interface external name, including terminating '\0'. 00064 * Note: this is the same size as a generic device's external name. 00065 */ 00066 #ifdef __SYMBIAN32__ 00067 // KCommsDbSvrMaxColumnNameLength = 50 00068 #define IF_NAMESIZE 50 00069 #else 00070 #define IF_NAMESIZE 16 00071 #endif 00072 #if __BSD_VISIBLE 00073 #define IFNAMSIZ IF_NAMESIZE 00074 #define IF_MAXUNIT 0x7fff /* historical value */ 00075 #endif 00076 #if __BSD_VISIBLE 00077 00078 /* 00079 * Structure used to query names of interface cloners. 00080 */ 00081 00082 struct if_clonereq { 00083 int ifcr_total; /* total cloners (out) */ 00084 int ifcr_count; /* room for this many in user buffer */ 00085 char *ifcr_buffer; /* buffer for cloner names */ 00086 }; 00087 00088 /* 00089 * Structure describing information about an interface 00090 * which may be of interest to management entities. 00091 */ 00092 struct if_data { 00093 /* generic interface information */ 00094 u_char ifi_type; /* ethernet, tokenring, etc */ 00095 u_char ifi_physical; /* e.g., AUI, Thinnet, 10base-T, etc */ 00096 u_char ifi_addrlen; /* media address length */ 00097 u_char ifi_hdrlen; /* media header length */ 00098 u_char ifi_link_state; /* current link state */ 00099 u_char ifi_recvquota; /* polling quota for receive intrs */ 00100 u_char ifi_xmitquota; /* polling quota for xmit intrs */ 00101 u_char ifi_datalen; /* length of this data struct */ 00102 u_long ifi_mtu; /* maximum transmission unit */ 00103 u_long ifi_metric; /* routing metric (external only) */ 00104 u_long ifi_baudrate; /* linespeed */ 00105 /* volatile statistics */ 00106 u_long ifi_ipackets; /* packets received on interface */ 00107 u_long ifi_ierrors; /* input errors on interface */ 00108 u_long ifi_opackets; /* packets sent on interface */ 00109 u_long ifi_oerrors; /* output errors on interface */ 00110 u_long ifi_collisions; /* collisions on csma interfaces */ 00111 u_long ifi_ibytes; /* total number of octets received */ 00112 u_long ifi_obytes; /* total number of octets sent */ 00113 u_long ifi_imcasts; /* packets received via multicast */ 00114 u_long ifi_omcasts; /* packets sent via multicast */ 00115 u_long ifi_iqdrops; /* dropped on input, this interface */ 00116 u_long ifi_noproto; /* destined for unsupported protocol */ 00117 u_long ifi_hwassist; /* HW offload capabilities */ 00118 time_t ifi_epoch; /* uptime at attach or stat reset */ 00119 #ifdef __alpha__ 00120 u_int ifi_timepad; /* time_t is int, not long on alpha */ 00121 #endif 00122 struct timeval ifi_lastchange; /* time of last administrative change */ 00123 }; 00124 00125 /*- 00126 * Interface flags are of two types: network stack owned flags, and driver 00127 * owned flags. Historically, these values were stored in the same ifnet 00128 * flags field, but with the advent of fine-grained locking, they have been 00129 * broken out such that the network stack is responsible for synchronizing 00130 * the stack-owned fields, and the device driver the device-owned fields. 00131 * Both halves can perform lockless reads of the other half's field, subject 00132 * to accepting the involved races. 00133 * 00134 * Both sets of flags come from the same number space, and should not be 00135 * permitted to conflict, as they are exposed to user space via a single 00136 * field. 00137 * 00138 * The following symbols identify read and write requirements for fields: 00139 * 00140 * (i) if_flags field set by device driver before attach, read-only there 00141 * after. 00142 * (n) if_flags field written only by the network stack, read by either the 00143 * stack or driver. 00144 * (d) if_drv_flags field written only by the device driver, read by either 00145 * the stack or driver. 00146 */ 00147 #define IFF_UP 0x1 /* (n) interface is up */ 00148 #define IFF_BROADCAST 0x2 /* (i) broadcast address valid */ 00149 #define IFF_DEBUG 0x4 /* (n) turn on debugging */ 00150 #define IFF_LOOPBACK 0x8 /* (i) is a loopback net */ 00151 #define IFF_POINTOPOINT 0x10 /* (i) is a point-to-point link */ 00152 #define IFF_SMART 0x20 /* (i) interface manages own routes */ 00153 #define IFF_DRV_RUNNING 0x40 /* (d) resources allocated */ 00154 #define IFF_NOARP 0x80 /* (n) no address resolution protocol */ 00155 #define IFF_PROMISC 0x100 /* (n) receive all packets */ 00156 #define IFF_ALLMULTI 0x200 /* (n) receive all multicast packets */ 00157 #define IFF_DRV_OACTIVE 0x400 /* (d) tx hardware queue is full */ 00158 #define IFF_SIMPLEX 0x800 /* (i) can't hear own transmissions */ 00159 #define IFF_LINK0 0x1000 /* per link layer defined bit */ 00160 #define IFF_LINK1 0x2000 /* per link layer defined bit */ 00161 #define IFF_LINK2 0x4000 /* per link layer defined bit */ 00162 #define IFF_ALTPHYS IFF_LINK2 /* use alternate physical connection */ 00163 #define IFF_MULTICAST 0x8000 /* (i) supports multicast */ 00164 /* 0x10000 */ 00165 #define IFF_PPROMISC 0x20000 /* (n) user-requested promisc mode */ 00166 #define IFF_MONITOR 0x40000 /* (n) user-requested monitor mode */ 00167 #define IFF_STATICARP 0x80000 /* (n) static ARP */ 00168 #define IFF_NEEDSGIANT 0x100000 /* (i) hold Giant over if_start calls */ 00169 00170 /* 00171 * Old names for driver flags so that user space tools can continue to use 00172 * the old (portable) names. 00173 */ 00174 #ifndef _KERNEL 00175 #define IFF_RUNNING IFF_DRV_RUNNING 00176 #define IFF_OACTIVE IFF_DRV_OACTIVE 00177 #endif 00178 00179 /* flags set internally only: */ 00180 #define IFF_CANTCHANGE \ 00181 (IFF_BROADCAST|IFF_POINTOPOINT|IFF_DRV_RUNNING|IFF_DRV_OACTIVE|\ 00182 IFF_SIMPLEX|IFF_MULTICAST|IFF_ALLMULTI|IFF_SMART|IFF_PROMISC) 00183 00184 /* 00185 * Values for if_link_state. 00186 */ 00187 #define LINK_STATE_UNKNOWN 0 /* link invalid/unknown */ 00188 #define LINK_STATE_DOWN 1 /* link is down */ 00189 #define LINK_STATE_UP 2 /* link is up */ 00190 00191 /* 00192 * Some convenience macros used for setting ifi_baudrate. 00193 * XXX 1000 vs. 1024? [email protected] 00194 */ 00195 #define IF_Kbps(x) ((x) * 1000) /* kilobits/sec. */ 00196 #define IF_Mbps(x) (IF_Kbps((x) * 1000)) /* megabits/sec. */ 00197 #define IF_Gbps(x) (IF_Mbps((x) * 1000)) /* gigabits/sec. */ 00198 00199 /* Capabilities that interfaces can advertise. */ 00200 #define IFCAP_RXCSUM 0x0001 /* can offload checksum on RX */ 00201 #define IFCAP_TXCSUM 0x0002 /* can offload checksum on TX */ 00202 #define IFCAP_NETCONS 0x0004 /* can be a network console */ 00203 #define IFCAP_VLAN_MTU 0x0008 /* VLAN-compatible MTU */ 00204 #define IFCAP_VLAN_HWTAGGING 0x0010 /* hardware VLAN tag support */ 00205 #define IFCAP_JUMBO_MTU 0x0020 /* 9000 byte MTU supported */ 00206 #define IFCAP_POLLING 0x0040 /* driver supports polling */ 00207 00208 #define IFCAP_HWCSUM (IFCAP_RXCSUM | IFCAP_TXCSUM) 00209 00210 #define IFQ_MAXLEN 50 00211 #define IFNET_SLOWHZ 1 /* granularity is 1 second */ 00212 00213 /* 00214 * Message format for use in obtaining information about interfaces 00215 * from getkerninfo and the routing socket 00216 */ 00217 struct if_msghdr { 00218 u_short ifm_msglen; /* to skip over non-understood messages */ 00219 u_char ifm_version; /* future binary compatibility */ 00220 u_char ifm_type; /* message type */ 00221 int ifm_addrs; /* like rtm_addrs */ 00222 int ifm_flags; /* value of if_flags */ 00223 u_short ifm_index; /* index for associated ifp */ 00224 struct if_data ifm_data;/* statistics and other data about if */ 00225 }; 00226 00227 /* 00228 * Message format for use in obtaining information about interface addresses 00229 * from getkerninfo and the routing socket 00230 */ 00231 struct ifa_msghdr { 00232 u_short ifam_msglen; /* to skip over non-understood messages */ 00233 u_char ifam_version; /* future binary compatibility */ 00234 u_char ifam_type; /* message type */ 00235 int ifam_addrs; /* like rtm_addrs */ 00236 int ifam_flags; /* value of ifa_flags */ 00237 u_short ifam_index; /* index for associated ifp */ 00238 int ifam_metric; /* value of ifa_metric */ 00239 }; 00240 00241 /* 00242 * Message format for use in obtaining information about multicast addresses 00243 * from the routing socket 00244 */ 00245 struct ifma_msghdr { 00246 u_short ifmam_msglen; /* to skip over non-understood messages */ 00247 u_char ifmam_version; /* future binary compatibility */ 00248 u_char ifmam_type; /* message type */ 00249 int ifmam_addrs; /* like rtm_addrs */ 00250 int ifmam_flags; /* value of ifa_flags */ 00251 u_short ifmam_index; /* index for associated ifp */ 00252 }; 00253 00254 /* 00255 * Message format announcing the arrival or departure of a network interface. 00256 */ 00257 struct if_announcemsghdr { 00258 u_short ifan_msglen; /* to skip over non-understood messages */ 00259 u_char ifan_version; /* future binary compatibility */ 00260 u_char ifan_type; /* message type */ 00261 u_short ifan_index; /* index for associated ifp */ 00262 char ifan_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 00263 u_short ifan_what; /* what type of announcement */ 00264 }; 00265 00266 #define IFAN_ARRIVAL 0 /* interface arrival */ 00267 #define IFAN_DEPARTURE 1 /* interface departure */ 00268 00269 /* 00270 * Interface request structure used for socket 00271 * ioctl's. All interface ioctl's must have parameter 00272 * definitions which begin with ifr_name. The 00273 * remainder may be interface specific. 00274 */ 00275 struct ifreq { 00276 char ifr_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 00277 union { 00278 struct sockaddr ifru_addr; 00279 struct sockaddr ifru_dstaddr; 00280 struct sockaddr ifru_broadaddr; 00281 short ifru_flags[2]; 00282 short ifru_index; 00283 int ifru_metric; 00284 int ifru_mtu; 00285 int ifru_phys; 00286 int ifru_media; 00287 caddr_t ifru_data; 00288 int ifru_cap[2]; 00289 } ifr_ifru; 00290 #define ifr_addr ifr_ifru.ifru_addr /* address */ 00291 #define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-to-p link */ 00292 #define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ 00293 #define ifr_flags ifr_ifru.ifru_flags[0] /* flags (low 16 bits) */ 00294 #define ifr_flagshigh ifr_ifru.ifru_flags[1] /* flags (high 16 bits) */ 00295 #define ifr_metric ifr_ifru.ifru_metric /* metric */ 00296 #define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ 00297 #define ifr_phys ifr_ifru.ifru_phys /* physical wire */ 00298 #define ifr_media ifr_ifru.ifru_media /* physical media */ 00299 #define ifr_data ifr_ifru.ifru_data /* for use by interface */ 00300 #define ifr_reqcap ifr_ifru.ifru_cap[0] /* requested capabilities */ 00301 #define ifr_curcap ifr_ifru.ifru_cap[1] /* current capabilities */ 00302 #define ifr_index ifr_ifru.ifru_index /* interface index */ 00303 }; 00304 00305 #define _SIZEOF_ADDR_IFREQ(ifr) \ 00306 ((ifr).ifr_addr.sa_len > sizeof(struct sockaddr) ? \ 00307 (sizeof(struct ifreq) - sizeof(struct sockaddr) + \ 00308 (ifr).ifr_addr.sa_len) : sizeof(struct ifreq)) 00309 00310 struct ifaliasreq { 00311 char ifra_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 00312 struct sockaddr ifra_addr; 00313 struct sockaddr ifra_broadaddr; 00314 struct sockaddr ifra_mask; 00315 }; 00316 00317 struct ifmediareq { 00318 char ifm_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 00319 int ifm_current; /* current media options */ 00320 int ifm_mask; /* don't care mask */ 00321 int ifm_status; /* media status */ 00322 int ifm_active; /* active options */ 00323 int ifm_count; /* # entries in ifm_ulist array */ 00324 int *ifm_ulist; /* media words */ 00325 }; 00326 00327 struct ifdrv { 00328 char ifd_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 00329 unsigned long ifd_cmd; 00330 size_t ifd_len; 00331 void *ifd_data; 00332 }; 00333 00334 /* 00335 * Structure used to retrieve aux status data from interfaces. 00336 * Kernel suppliers to this interface should respect the formatting 00337 * needed by ifconfig(8): each line starts with a TAB and ends with 00338 * a newline. The canonical example to copy and paste is in if_tun.c. 00339 */ 00340 00341 #define IFSTATMAX 800 /* 10 lines of text */ 00342 struct ifstat { 00343 char ifs_name[IFNAMSIZ]; /* if name, e.g. "en0" */ 00344 char ascii[IFSTATMAX + 1]; 00345 }; 00346 00347 /* 00348 * Structure used in SIOCGIFCONF request. 00349 * Used to retrieve interface configuration 00350 * for machine (useful for programs which 00351 * must know all networks accessible). 00352 */ 00353 struct ifconf { 00354 int ifc_len; /* size of associated buffer */ 00355 union { 00356 caddr_t ifcu_buf; 00357 struct ifreq *ifcu_req; 00358 } ifc_ifcu; 00359 #define ifc_buf ifc_ifcu.ifcu_buf /* buffer address */ 00360 #define ifc_req ifc_ifcu.ifcu_req /* array of structures returned */ 00361 }; 00362 00363 00364 /* 00365 * Structure for SIOC[AGD]LIFADDR 00366 */ 00367 struct if_laddrreq { 00368 char iflr_name[IFNAMSIZ]; 00369 u_int flags; 00370 #define IFLR_PREFIX 0x8000 /* in: prefix given out: kernel fills id */ 00371 u_int prefixlen; /* in/out */ 00372 struct sockaddr_storage addr; /* in/out */ 00373 struct sockaddr_storage dstaddr; /* out */ 00374 }; 00375 00376 #endif /* __BSD_VISIBLE */ 00377 00378 #ifndef _KERNEL 00379 struct if_nameindex { 00380 unsigned int if_index; /* 1, 2, ... */ 00381 char *if_name; /* null terminated name: "le0", ... */ 00382 }; 00383 00384 __BEGIN_DECLS 00385 IMPORT_C void if_freenameindex(struct if_nameindex *); 00386 IMPORT_C char *if_indextoname(unsigned int, char *); 00387 IMPORT_C struct if_nameindex *if_nameindex(void); 00388 IMPORT_C unsigned int if_nametoindex(const char *); 00389 __END_DECLS 00390 #endif 00391 00392 #ifdef _KERNEL 00393 struct thread; 00394 00395 /* XXX - this should go away soon. */ 00396 #include <net/if_var.h> 00397 #endif 00398 00399 #endif /* !_NET_IF_H_ */