/* * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * http://www.ntop.org * * Copyright (C) 2003 Abdelkader Lahmadi * Olivier Festor * Copyright (C) 2003-04 Luca Deri * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef INET6 #ifndef _IFACE_H_ #define _IFACE_H_ /* ******************************** */ #ifdef WIN32 struct icmp6_hdr { u_int8_t icmp6_type; /* type field */ u_int8_t icmp6_code; /* code field */ u_int16_t icmp6_cksum; /* checksum field */ union { u_int32_t icmp6_un_data32[1]; /* type-specific field */ u_int16_t icmp6_un_data16[2]; /* type-specific field */ u_int8_t icmp6_un_data8[4]; /* type-specific field */ } icmp6_dataun; }; #endif #ifndef ICMP6_NI_REPLY #define ICMP6_NI_REPLY 140 #endif #ifndef ICMP6_ECHO_REPLY #define ICMP6_ECHO_REPLY 129 #endif #ifndef ICMP6_ECHO_REQUEST #define ICMP6_ECHO_REQUEST 128 #endif #ifndef ICMP6_DST_UNREACH #define ICMP6_DST_UNREACH 1 #endif #ifndef ICMP6_TIME_EXCEEDED #define ICMP6_TIME_EXCEEDED 3 #endif #ifndef ICMP6_PARAM_PROB #define ICMP6_PARAM_PROB 4 #endif #ifndef ICMP6_NI_QUERY #define ICMP6_NI_QUERY 139 #endif #ifndef ICMP6_NI_REPLY #define ICMP6_NI_REPLY 140 #endif #ifndef ICMP6_DST_UNREACH #define ICMP6_DST_UNREACH 1 #endif #ifndef ICMP6_DST_UNREACH_NOPORT #define ICMP6_DST_UNREACH_NOPORT 4 #endif #ifndef ICMP6_DST_UNREACH_NOROUTE #define ICMP6_DST_UNREACH_NOROUTE 0 #endif #ifndef ICMP6_DST_UNREACH_ADDR #define ICMP6_DST_UNREACH_ADDR 3 #endif #ifndef ICMP6_DST_UNREACH_ADMIN #define ICMP6_DST_UNREACH_ADMIN 1 #endif #ifndef ND_ROUTER_SOLICIT #define ND_ROUTER_SOLICIT 133 #endif #ifndef ND_ROUTER_ADVERT #define ND_ROUTER_ADVERT 134 #endif #ifndef ND_NEIGHBOR_SOLICIT #define ND_NEIGHBOR_SOLICIT 135 #endif #ifndef ND_NEIGHBOR_ADVERT #define ND_NEIGHBOR_ADVERT 136 #endif #ifndef ND_REDIRECT #define ND_REDIRECT 137 #endif /* ******************************** */ #define IFACE_TYPE_ALL 0x00 #define IFACE_TYPE_UNKNOWN 0x00 #define IFACE_TYPE_ETHER 0x06 /* Ethernet CSMACD */ #define IFACE_TYPE_FDDI 0x0f #define IFACE_TYPE_LAPB 0x10 #define IFACE_TYPE_SDLC 0x11 #define IFACE_TYPE_ISDNBASIC 0x14 #define IFACE_TYPE_ISDNPRIMARY 0x15 #define IFACE_TYPE_PPP 0x17 /* RFC 1331 */ #define IFACE_TYPE_LOOP 0x18 /* loopback */ #define IFACE_TYPE_SLIP 0x1c /* IP over generic TTY */ #define IFACE_TYPE_RS232 0x21 #define IFACE_TYPE_PARA 0x22 /* parallel-port */ #define IFACE_TYPE_ATM 0x25 /* ATM cells */ #define IFACE_TYPE_SONET 0x27 /* SONET or SDH */ #define IFACE_TYPE_MODEM 0x30 /* Generic Modem */ #define IFACE_TYPE_SONETPATH 0x32 #define IFACE_TYPE_SONETVT 0x33 #define IFACE_TYPE_GIF 0x37 /*0xf0*/ #define IFACE_TYPE_FAITH 0x38 /*0xf2*/ #define IFACE_TYPE_STF 0x39 /*0xf3*/ #define IFACE_TYPE_L2VLAN 0x87 /* Layer 2 VLAN using 802.1Q */ #define IFACE_TYPE_IEEE1394 0x90 /* IEEE1394 SerialBus */ #define IFACE_INFO_UP 0x01 #define IFACE_INFO_LOOPBACK 0x02 #define IFACE_INFO_P2P 0x04 #define IFACE_INFO_BROADCAST 0x08 #define IFACE_INFO_MULTICAST 0x10 #define IFACE_INFO_PROMISC 0x20 #define IFACE_INFO_SIMPLEX 0x40 #define _IFACE_ADDR_INET #define _IFACE_ADDR_INET6 /* ******************************** */ #ifdef WIN32 /* Fragment header */ struct ip6_frag { u_int8_t ip6f_nxt; /* next header */ u_int8_t ip6f_reserved; /* reserved field */ u_int16_t ip6f_offlg; /* offset, reserved, and flag */ u_int32_t ip6f_ident; /* identification */ }; #endif #ifndef INET6_ADDRSTRLEN #define INET6_ADDRSTRLEN 46 #endif #if defined _IFACE_ADDR_INET struct iface_addr_inet { struct in_addr addr; struct in_addr bcast; int mask; }; #endif #if defined _IFACE_ADDR_INET6 struct iface_addr_inet6 { struct in6_addr addr; int prefixlen; }; #endif #ifndef IFF_SIMPLEX #define IFF_SIMPLEX 0x0 #endif struct iface_addr { int family; struct iface_if *ifi; struct iface_addr *next; union { struct iface_addr_inet inet; struct iface_addr_inet6 inet6; } af; }; #ifndef IFNAMSIZ #define IFNAMSIZ 16 #endif struct iface_if { int index; int info; char name[IFNAMSIZ]; int type; struct { char *addr; int size; } phys; struct iface_addr *addrs; struct iface_if *next; }; struct iface_handler { char *buf; struct iface_if *if_list; int if_count; struct iface_addr *addr_list; int addr_count; struct rt_addrinfo *addrinfo; }; /** * @brief Retrieve a list of interfaces supporting IPv6. * @param idx array where to store interface index. * @param size size of the @c idx array. * @return number of interfaces retrieved. * * @deprecated you should look by yourself using the iface_* functions * * The list retrieve are all the interfaces which: * - are UP * - have at least one IPv6 address (even link local) * - are not the loopback interface * * If idx is set to NULL, the total number of * interfaces available will be returned. */ int iface6(int *idx, int size); /** * @brief Create a new iface handler holding all the * information about the interfaces at the time it was called. * @return iface handler */ struct iface_handler *iface_new(void); /** * @brief Destroy iface handler. * @param hdlr iface handler */ void iface_destroy(struct iface_handler *hdlr); /** * @brief Get the number of addresses associated. * @param hdlr iface handler. * @return total number of addresses */ int iface_addrcount(struct iface_handler *hdlr); /** * @brief Get the number of interfaces. * @param hdlr iface handler. * @return number of interfaces. */ int iface_ifcount(struct iface_handler *hdlr); /** * @brief Get the first interface. * @param hdlr iface handler. * @return an interface descriptor. */ struct iface_if *iface_getif_first(struct iface_handler *hdlr); /** * @brief Get the next interface. * @param ii interface descriptor. * @return an interface descriptor or NULL * if ii==NULL. */ struct iface_if *iface_getif_next(struct iface_if *ii); /** * @brief Give the number of addresses associated to an interface. * @param ii interface descriptor. * @param family family address to count, if 0 all addresses are counted. * @return number of addresses. */ int iface_if_addrcount(struct iface_if *ii, int family); /** * @brief Retrieve interface by its index number. * @param hdlr iface handler. * @param index interface index. * @return interface descriptor */ struct iface_if *iface_getif_byindex(struct iface_handler *hdlr, int idx); /** * @brief Retrieve interface by its name. * @param hdlr iface handler. * @param name interface name. * @return interface descriptor */ struct iface_if *iface_getif_byname(struct iface_handler *hdlr, char *name); /** * @brief Converts interface index to readable interface name. * @param ii interface descriptor * @param name buffer where to write interface name. * @param size size of the buffer. * @return name * * @note To check if there was enough room when writing the * interface name you could test name[size-1], * or use IFNAMSIZ for size (see net/if.h) * * @note It is possible to use NULL instead of * passing a buffer for the interface name, * in this case an allocated string will be returned, and * should be freed using free. * If allocation had failed NULL wil be returned. */ char *iface_if_getname(struct iface_if *ii, char *name, int size); /** * @brief Return interface index. * @param ii interface descriptor * @return interface index. */ int iface_if_getindex(struct iface_if *ii); /** * @brief Return information flags about the interface * @param ii interface descriptor. * @return information flags as defined by IFACE_INFO_*. */ int iface_if_getinfo(struct iface_if *ii); /** * @brief Return interface type. * @param ii interface descriptor. * @return the interface type as defined by IFACE_TYPE_*. */ int iface_if_gettype(struct iface_if *ii); /** * @brief Retrieve the physical address of an interface. * @param ii interface descriptor. * @param type a pointer where will be stored the interface type * or NULL * @param addr a pointer where to store the physical address * or NULL * @param addrlen the available size for addr * or NULL ifaddr is NULL * @return the real address size when successful, 0 * if the interface doesn't have a physical address. * * After returning, the copied addresse size will be stored in * addrsize. * * @note when retrieving the physical addresse of an interface, * you could call iface_getphys once for * retriving type and addresse size and another time * for retrieving the physical address. */ int iface_if_getphys(struct iface_if *ii, int *type, char *addr, int *addrsize); /** * @brief get the first address assiociated with the interface. * @param ii interface descriptor. * @param family family of the address wanted (AF_*) * or 0 as a wildcard. * @return an address descriptor. */ struct iface_addr *iface_getaddr_first(struct iface_if *ii, int family); /** * @brief get the next address assiociated with the interface. * @param ia address descripor * @param family family of the address wanted (AF_*) * or 0 as a wildcard. * @return an address descriptor or NULL if ia==NULL. * * @note you should not change family between calls to * iface_getaddr_first or iface_getaddr_next */ struct iface_addr *iface_getaddr_next(struct iface_addr *ia, int family); /** * @brief Get the address family. * @param ahdlr address descripor * @return address family */ int iface_addr_getfamily(struct iface_addr *ia); /** * @brief Get the interface index on which the address is associated * @param ahdlr address descripor * @return interface index */ int iface_addr_ifindex(struct iface_addr *ia); /** * @brief return information about the address. * @param ahdlr address descripor * @return infobuf or NULL on error. * * The infobuf is one of the iface_addr_* structures * and should be coherent with the address family, to have * the structure defined you should define the constant _IFACE_ADDR_* * before the inclusion of the iface header. */ void *iface_addr_getinfo(struct iface_addr *ia, void *infobuf); #endif /* _IFACE_H_ */ #endif /* INET6 */ extern void calculateUniqueInterfaceName(int deviceId); extern void sanitizeIfName(char *deviceDescr); #ifdef HAVE_SNMP extern char* getIfName(char *hostname, char *community, int ifIdx, char *ifName_buf, u_short ifName_buflen); #endif