1*53ee8cc1Swenshuai.xi /* net/if.h -- declarations for inquiring about network interfaces 2*53ee8cc1Swenshuai.xi Copyright (C) 1997,98,99,2000,2001 Free Software Foundation, Inc. 3*53ee8cc1Swenshuai.xi This file is part of the GNU C Library. 4*53ee8cc1Swenshuai.xi 5*53ee8cc1Swenshuai.xi The GNU C Library is free software; you can redistribute it and/or 6*53ee8cc1Swenshuai.xi modify it under the terms of the GNU Lesser General Public 7*53ee8cc1Swenshuai.xi License as published by the Free Software Foundation; either 8*53ee8cc1Swenshuai.xi version 2.1 of the License, or (at your option) any later version. 9*53ee8cc1Swenshuai.xi 10*53ee8cc1Swenshuai.xi The GNU C Library is distributed in the hope that it will be useful, 11*53ee8cc1Swenshuai.xi but WITHOUT ANY WARRANTY; without even the implied warranty of 12*53ee8cc1Swenshuai.xi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13*53ee8cc1Swenshuai.xi Lesser General Public License for more details. 14*53ee8cc1Swenshuai.xi 15*53ee8cc1Swenshuai.xi You should have received a copy of the GNU Lesser General Public 16*53ee8cc1Swenshuai.xi License along with the GNU C Library; if not, write to the Free 17*53ee8cc1Swenshuai.xi Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18*53ee8cc1Swenshuai.xi 02111-1307 USA. */ 19*53ee8cc1Swenshuai.xi 20*53ee8cc1Swenshuai.xi #ifndef _NET_IF_H 21*53ee8cc1Swenshuai.xi #define _NET_IF_H 1 22*53ee8cc1Swenshuai.xi 23*53ee8cc1Swenshuai.xi #include <features.h> 24*53ee8cc1Swenshuai.xi 25*53ee8cc1Swenshuai.xi #ifdef __USE_MISC 26*53ee8cc1Swenshuai.xi # include <sys/types.h> 27*53ee8cc1Swenshuai.xi # include <sys/socket.h> 28*53ee8cc1Swenshuai.xi #endif 29*53ee8cc1Swenshuai.xi 30*53ee8cc1Swenshuai.xi 31*53ee8cc1Swenshuai.xi /* Length of interface name. */ 32*53ee8cc1Swenshuai.xi #define IF_NAMESIZE 16 33*53ee8cc1Swenshuai.xi 34*53ee8cc1Swenshuai.xi struct if_nameindex 35*53ee8cc1Swenshuai.xi { 36*53ee8cc1Swenshuai.xi unsigned int if_index; /* 1, 2, ... */ 37*53ee8cc1Swenshuai.xi char *if_name; /* null terminated name: "eth0", ... */ 38*53ee8cc1Swenshuai.xi }; 39*53ee8cc1Swenshuai.xi 40*53ee8cc1Swenshuai.xi 41*53ee8cc1Swenshuai.xi #ifdef __USE_MISC 42*53ee8cc1Swenshuai.xi /* Standard interface flags. */ 43*53ee8cc1Swenshuai.xi enum 44*53ee8cc1Swenshuai.xi { 45*53ee8cc1Swenshuai.xi IFF_UP = 0x1, /* Interface is up. */ 46*53ee8cc1Swenshuai.xi # define IFF_UP IFF_UP 47*53ee8cc1Swenshuai.xi IFF_BROADCAST = 0x2, /* Broadcast address valid. */ 48*53ee8cc1Swenshuai.xi # define IFF_BROADCAST IFF_BROADCAST 49*53ee8cc1Swenshuai.xi IFF_DEBUG = 0x4, /* Turn on debugging. */ 50*53ee8cc1Swenshuai.xi # define IFF_DEBUG IFF_DEBUG 51*53ee8cc1Swenshuai.xi IFF_LOOPBACK = 0x8, /* Is a loopback net. */ 52*53ee8cc1Swenshuai.xi # define IFF_LOOPBACK IFF_LOOPBACK 53*53ee8cc1Swenshuai.xi IFF_POINTOPOINT = 0x10, /* Interface is point-to-point link. */ 54*53ee8cc1Swenshuai.xi # define IFF_POINTOPOINT IFF_POINTOPOINT 55*53ee8cc1Swenshuai.xi IFF_NOTRAILERS = 0x20, /* Avoid use of trailers. */ 56*53ee8cc1Swenshuai.xi # define IFF_NOTRAILERS IFF_NOTRAILERS 57*53ee8cc1Swenshuai.xi IFF_RUNNING = 0x40, /* Resources allocated. */ 58*53ee8cc1Swenshuai.xi # define IFF_RUNNING IFF_RUNNING 59*53ee8cc1Swenshuai.xi IFF_NOARP = 0x80, /* No address resolution protocol. */ 60*53ee8cc1Swenshuai.xi # define IFF_NOARP IFF_NOARP 61*53ee8cc1Swenshuai.xi IFF_PROMISC = 0x100, /* Receive all packets. */ 62*53ee8cc1Swenshuai.xi # define IFF_PROMISC IFF_PROMISC 63*53ee8cc1Swenshuai.xi 64*53ee8cc1Swenshuai.xi /* Not supported */ 65*53ee8cc1Swenshuai.xi IFF_ALLMULTI = 0x200, /* Receive all multicast packets. */ 66*53ee8cc1Swenshuai.xi # define IFF_ALLMULTI IFF_ALLMULTI 67*53ee8cc1Swenshuai.xi 68*53ee8cc1Swenshuai.xi IFF_MASTER = 0x400, /* Master of a load balancer. */ 69*53ee8cc1Swenshuai.xi # define IFF_MASTER IFF_MASTER 70*53ee8cc1Swenshuai.xi IFF_SLAVE = 0x800, /* Slave of a load balancer. */ 71*53ee8cc1Swenshuai.xi # define IFF_SLAVE IFF_SLAVE 72*53ee8cc1Swenshuai.xi 73*53ee8cc1Swenshuai.xi IFF_MULTICAST = 0x1000, /* Supports multicast. */ 74*53ee8cc1Swenshuai.xi # define IFF_MULTICAST IFF_MULTICAST 75*53ee8cc1Swenshuai.xi 76*53ee8cc1Swenshuai.xi IFF_PORTSEL = 0x2000, /* Can set media type. */ 77*53ee8cc1Swenshuai.xi # define IFF_PORTSEL IFF_PORTSEL 78*53ee8cc1Swenshuai.xi IFF_AUTOMEDIA = 0x4000, /* Auto media select active. */ 79*53ee8cc1Swenshuai.xi # define IFF_AUTOMEDIA IFF_AUTOMEDIA 80*53ee8cc1Swenshuai.xi IFF_DYNAMIC = 0x8000 /* Dialup device with changing addresses. */ 81*53ee8cc1Swenshuai.xi # define IFF_DYNAMIC IFF_DYNAMIC 82*53ee8cc1Swenshuai.xi }; 83*53ee8cc1Swenshuai.xi 84*53ee8cc1Swenshuai.xi /* The ifaddr structure contains information about one address of an 85*53ee8cc1Swenshuai.xi interface. They are maintained by the different address families, 86*53ee8cc1Swenshuai.xi are allocated and attached when an address is set, and are linked 87*53ee8cc1Swenshuai.xi together so all addresses for an interface can be located. */ 88*53ee8cc1Swenshuai.xi 89*53ee8cc1Swenshuai.xi struct ifaddr 90*53ee8cc1Swenshuai.xi { 91*53ee8cc1Swenshuai.xi struct sockaddr ifa_addr; /* Address of interface. */ 92*53ee8cc1Swenshuai.xi union 93*53ee8cc1Swenshuai.xi { 94*53ee8cc1Swenshuai.xi struct sockaddr ifu_broadaddr; 95*53ee8cc1Swenshuai.xi struct sockaddr ifu_dstaddr; 96*53ee8cc1Swenshuai.xi } ifa_ifu; 97*53ee8cc1Swenshuai.xi struct iface *ifa_ifp; /* Back-pointer to interface. */ 98*53ee8cc1Swenshuai.xi struct ifaddr *ifa_next; /* Next address for interface. */ 99*53ee8cc1Swenshuai.xi }; 100*53ee8cc1Swenshuai.xi 101*53ee8cc1Swenshuai.xi # define ifa_broadaddr ifa_ifu.ifu_broadaddr /* broadcast address */ 102*53ee8cc1Swenshuai.xi # define ifa_dstaddr ifa_ifu.ifu_dstaddr /* other end of link */ 103*53ee8cc1Swenshuai.xi 104*53ee8cc1Swenshuai.xi /* Device mapping structure. I'd just gone off and designed a 105*53ee8cc1Swenshuai.xi beautiful scheme using only loadable modules with arguments for 106*53ee8cc1Swenshuai.xi driver options and along come the PCMCIA people 8) 107*53ee8cc1Swenshuai.xi 108*53ee8cc1Swenshuai.xi Ah well. The get() side of this is good for WDSETUP, and it'll be 109*53ee8cc1Swenshuai.xi handy for debugging things. The set side is fine for now and being 110*53ee8cc1Swenshuai.xi very small might be worth keeping for clean configuration. */ 111*53ee8cc1Swenshuai.xi 112*53ee8cc1Swenshuai.xi struct ifmap 113*53ee8cc1Swenshuai.xi { 114*53ee8cc1Swenshuai.xi unsigned long int mem_start; 115*53ee8cc1Swenshuai.xi unsigned long int mem_end; 116*53ee8cc1Swenshuai.xi unsigned short int base_addr; 117*53ee8cc1Swenshuai.xi unsigned char irq; 118*53ee8cc1Swenshuai.xi unsigned char dma; 119*53ee8cc1Swenshuai.xi unsigned char port; 120*53ee8cc1Swenshuai.xi /* 3 bytes spare */ 121*53ee8cc1Swenshuai.xi }; 122*53ee8cc1Swenshuai.xi 123*53ee8cc1Swenshuai.xi /* Interface request structure used for socket ioctl's. All interface 124*53ee8cc1Swenshuai.xi ioctl's must have parameter definitions which begin with ifr_name. 125*53ee8cc1Swenshuai.xi The remainder may be interface specific. */ 126*53ee8cc1Swenshuai.xi 127*53ee8cc1Swenshuai.xi struct ifreq 128*53ee8cc1Swenshuai.xi { 129*53ee8cc1Swenshuai.xi # define IFHWADDRLEN 6 130*53ee8cc1Swenshuai.xi # define IFNAMSIZ IF_NAMESIZE 131*53ee8cc1Swenshuai.xi union 132*53ee8cc1Swenshuai.xi { 133*53ee8cc1Swenshuai.xi char ifrn_name[IFNAMSIZ]; /* Interface name, e.g. "en0". */ 134*53ee8cc1Swenshuai.xi } ifr_ifrn; 135*53ee8cc1Swenshuai.xi 136*53ee8cc1Swenshuai.xi union 137*53ee8cc1Swenshuai.xi { 138*53ee8cc1Swenshuai.xi struct sockaddr ifru_addr; 139*53ee8cc1Swenshuai.xi struct sockaddr ifru_dstaddr; 140*53ee8cc1Swenshuai.xi struct sockaddr ifru_broadaddr; 141*53ee8cc1Swenshuai.xi struct sockaddr ifru_netmask; 142*53ee8cc1Swenshuai.xi struct sockaddr ifru_hwaddr; 143*53ee8cc1Swenshuai.xi short int ifru_flags; 144*53ee8cc1Swenshuai.xi int ifru_ivalue; 145*53ee8cc1Swenshuai.xi int ifru_mtu; 146*53ee8cc1Swenshuai.xi struct ifmap ifru_map; 147*53ee8cc1Swenshuai.xi char ifru_slave[IFNAMSIZ]; /* Just fits the size */ 148*53ee8cc1Swenshuai.xi char ifru_newname[IFNAMSIZ]; 149*53ee8cc1Swenshuai.xi __caddr_t ifru_data; 150*53ee8cc1Swenshuai.xi } ifr_ifru; 151*53ee8cc1Swenshuai.xi }; 152*53ee8cc1Swenshuai.xi # define ifr_name ifr_ifrn.ifrn_name /* interface name */ 153*53ee8cc1Swenshuai.xi # define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */ 154*53ee8cc1Swenshuai.xi # define ifr_addr ifr_ifru.ifru_addr /* address */ 155*53ee8cc1Swenshuai.xi # define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */ 156*53ee8cc1Swenshuai.xi # define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */ 157*53ee8cc1Swenshuai.xi # define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */ 158*53ee8cc1Swenshuai.xi # define ifr_flags ifr_ifru.ifru_flags /* flags */ 159*53ee8cc1Swenshuai.xi # define ifr_metric ifr_ifru.ifru_ivalue /* metric */ 160*53ee8cc1Swenshuai.xi # define ifr_mtu ifr_ifru.ifru_mtu /* mtu */ 161*53ee8cc1Swenshuai.xi # define ifr_map ifr_ifru.ifru_map /* device map */ 162*53ee8cc1Swenshuai.xi # define ifr_slave ifr_ifru.ifru_slave /* slave device */ 163*53ee8cc1Swenshuai.xi # define ifr_data ifr_ifru.ifru_data /* for use by interface */ 164*53ee8cc1Swenshuai.xi # define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */ 165*53ee8cc1Swenshuai.xi # define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */ 166*53ee8cc1Swenshuai.xi # define ifr_qlen ifr_ifru.ifru_ivalue /* queue length */ 167*53ee8cc1Swenshuai.xi # define ifr_newname ifr_ifru.ifru_newname /* New name */ 168*53ee8cc1Swenshuai.xi # define _IOT_ifreq _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0) 169*53ee8cc1Swenshuai.xi # define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0) 170*53ee8cc1Swenshuai.xi # define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0) 171*53ee8cc1Swenshuai.xi 172*53ee8cc1Swenshuai.xi 173*53ee8cc1Swenshuai.xi /* Structure used in SIOCGIFCONF request. Used to retrieve interface 174*53ee8cc1Swenshuai.xi configuration for machine (useful for programs which must know all 175*53ee8cc1Swenshuai.xi networks accessible). */ 176*53ee8cc1Swenshuai.xi 177*53ee8cc1Swenshuai.xi struct ifconf 178*53ee8cc1Swenshuai.xi { 179*53ee8cc1Swenshuai.xi int ifc_len; /* Size of buffer. */ 180*53ee8cc1Swenshuai.xi union 181*53ee8cc1Swenshuai.xi { 182*53ee8cc1Swenshuai.xi __caddr_t ifcu_buf; 183*53ee8cc1Swenshuai.xi struct ifreq *ifcu_req; 184*53ee8cc1Swenshuai.xi } ifc_ifcu; 185*53ee8cc1Swenshuai.xi }; 186*53ee8cc1Swenshuai.xi # define ifc_buf ifc_ifcu.ifcu_buf /* Buffer address. */ 187*53ee8cc1Swenshuai.xi # define ifc_req ifc_ifcu.ifcu_req /* Array of structures. */ 188*53ee8cc1Swenshuai.xi # define _IOT_ifconf _IOT(_IOTS(struct ifconf),1,0,0,0,0) /* not right */ 189*53ee8cc1Swenshuai.xi #endif /* Misc. */ 190*53ee8cc1Swenshuai.xi 191*53ee8cc1Swenshuai.xi __BEGIN_DECLS 192*53ee8cc1Swenshuai.xi 193*53ee8cc1Swenshuai.xi /* Convert an interface name to an index, and vice versa. */ 194*53ee8cc1Swenshuai.xi extern unsigned int if_nametoindex (__const char *__ifname) __THROW; 195*53ee8cc1Swenshuai.xi extern char *if_indextoname (unsigned int __ifindex, char *__ifname) __THROW; 196*53ee8cc1Swenshuai.xi 197*53ee8cc1Swenshuai.xi /* Return a list of all interfaces and their indices. */ 198*53ee8cc1Swenshuai.xi extern struct if_nameindex *if_nameindex (void) __THROW; 199*53ee8cc1Swenshuai.xi 200*53ee8cc1Swenshuai.xi /* Free the data returned from if_nameindex. */ 201*53ee8cc1Swenshuai.xi extern void if_freenameindex (struct if_nameindex *__ptr) __THROW; 202*53ee8cc1Swenshuai.xi 203*53ee8cc1Swenshuai.xi __END_DECLS 204*53ee8cc1Swenshuai.xi 205*53ee8cc1Swenshuai.xi #endif /* net/if.h */ 206