/* * The olsr.org Optimized Link-State Routing daemon(olsrd) * Copyright (c) 2004, Andreas Tønnesen(andreto@olsr.org) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 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. * * Neither the name of olsr.org, olsrd 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 COPYRIGHT HOLDERS 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 * COPYRIGHT OWNER 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. * * Visit http://www.olsr.org for more information. * * If you find this software useful feel free to make a donation * to the project. For more information see the website or contact * the copyright holders. * * $Id: interfaces.h,v 1.43 2007/10/13 12:09:11 bernd67 Exp $ */ #ifndef _OLSR_INTERFACE #define _OLSR_INTERFACE #include #include #include #include "olsr_types.h" #define _PATH_PROCNET_IFINET6 "/proc/net/if_inet6" #define IPV6_ADDR_ANY 0x0000U #define IPV6_ADDR_UNICAST 0x0001U #define IPV6_ADDR_MULTICAST 0x0002U #define IPV6_ADDR_ANYCAST 0x0004U #define IPV6_ADDR_LOOPBACK 0x0010U #define IPV6_ADDR_LINKLOCAL 0x0020U #define IPV6_ADDR_SITELOCAL 0x0040U #define IPV6_ADDR_COMPATv4 0x0080U #define IPV6_ADDR_SCOPE_MASK 0x00f0U #define IPV6_ADDR_MAPPED 0x1000U #define IPV6_ADDR_RESERVED 0x2000U #define MAX_IF_METRIC 100 enum olsr_if_wieght { WEIGHT_LOWEST = 0, WEIGHT_LOW, WEIGHT_ETHERNET_1GBP, /* Ethernet 1Gb+ */ WEIGHT_ETHERNET_1GB, /* Ethernet 1Gb */ WEIGHT_ETHERNET_100MB, /* Ethernet 100Mb */ WEIGHT_ETHERNET_10MB, /* Ethernet 10Mb */ WEIGHT_ETHERNET_DEFAULT, /* Ethernet unknown rate*/ WEIGHT_WLAN_HIGH, /* >54Mb WLAN */ WEIGHT_WLAN_54MB, /* 54Mb 802.11g */ WEIGHT_WLAN_11MB, /* 11Mb 802.11b */ WEIGHT_WLAN_LOW, /* <11Mb WLAN */ WEIGHT_WLAN_DEFAULT, /* WLAN unknown rate */ WEIGHT_SERIAL, /* Serial device */ WEIGHT_HIGH, /* Max */ WEIGHT_HIGHEST = WEIGHT_HIGH }; struct if_gen_property { olsr_u32_t owner_id; void *data; struct if_gen_property *next; }; struct vtimes { olsr_u8_t hello; olsr_u8_t tc; olsr_u8_t mid; olsr_u8_t hna; }; /* Output buffer structure. This should actually be in net_olsr.h but we have circular references then. */ struct olsr_netbuf { olsr_u8_t *buff; /* Pointer to the allocated buffer */ int bufsize; /* Size of the buffer */ int maxsize; /* Max bytes of payload that can be added to the buffer */ int pending; /* How much data is currently pending in the buffer */ int reserved; /* Plugins can reserve space in buffers */ }; /** *A struct containing all necessary information about each *interface participating in the OLSD routing */ struct interface { /* IP version 4 */ struct sockaddr int_addr; /* address */ struct sockaddr int_netmask; /* netmask */ struct sockaddr int_broadaddr; /* broadcast address */ /* IP version 6 */ struct sockaddr_in6 int6_addr; /* Address */ struct sockaddr_in6 int6_multaddr; /* Multicast */ /* IP independent */ union olsr_ip_addr ip_addr; int is_hcif; /* Is this a emulated host-client if? */ int olsr_socket; /* The broadcast socket for this interface */ int int_metric; /* metric of interface */ int int_mtu; /* MTU of interface */ int int_flags; /* see below */ char *int_name; /* from kernel if structure */ int if_index; /* Kernels index of this interface */ int is_wireless; /* wireless interface or not*/ olsr_u16_t olsr_seqnum; /* Olsr message seqno */ float hello_etime; struct vtimes valtimes; clock_t fwdtimer; /* Timeout for OLSR forwarding on this if */ struct olsr_netbuf netbuf; /* the buffer to construct the packet data */ struct if_gen_property *gen_properties;/* Generic interface properties */ int ttl_index; /* index in TTL array for fish-eye */ #ifdef linux /* Struct uesd to store original redirect/ingress setting */ struct nic_state { char redirect; /* The original state of icmp redirect */ char spoof; /* The original state of the IP spoof filter */ } nic_state; #endif struct interface *int_next; }; #define OLSR_DEFAULT_MTU 1500 /* Ifchange actions */ #define IFCHG_IF_ADD 1 #define IFCHG_IF_REMOVE 2 #define IFCHG_IF_UPDATE 3 /* The interface linked-list */ extern struct interface *ifnet; /* Datastructures to use when creating new sockets */ extern struct sockaddr_in addrsock; extern struct sockaddr_in6 addrsock6; int ifinit(void); olsr_u32_t get_if_property_id(void); olsr_bool add_if_geninfo(struct interface *, void *, olsr_u32_t); void * get_if_geninfo(struct interface *, olsr_u32_t); void * del_if_geninfo(struct interface *, olsr_u32_t); void run_ifchg_cbs(struct interface *, int); struct interface * if_ifwithsock(int); struct interface * if_ifwithaddr(const union olsr_ip_addr *); struct interface * if_ifwithname(const char *); struct interface * if_ifwithindex(const int if_index); const char * if_ifwithindex_name(const int if_index); struct olsr_if * queue_if(char *, int); int add_ifchgf(int (*f)(struct interface *, int)); int del_ifchgf(int (*f)(struct interface *, int)); #endif