if.h revision f20514bf582d08567217a3b06171bab5a11458ea
1d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/* 2d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * dhcpcd - DHCP client daemon 3d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * Copyright (c) 2006-2015 Roy Marples <roy@marples.name> 4d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * All rights reserved 5d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 6d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * Redistribution and use in source and binary forms, with or without 7d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * modification, are permitted provided that the following conditions 8d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * are met: 9d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * 1. Redistributions of source code must retain the above copyright 10d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * notice, this list of conditions and the following disclaimer. 11d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * 2. Redistributions in binary form must reproduce the above copyright 12d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * notice, this list of conditions and the following disclaimer in the 13d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * documentation and/or other materials provided with the distribution. 14d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * 15d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * SUCH DAMAGE. 26d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan */ 27d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 28d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifndef INTERFACE_H 29d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define INTERFACE_H 30d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 31d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include <net/if.h> 32d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifdef __FreeBSD__ 33d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include <net/if_var.h> 34d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif 35d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include <net/route.h> /* for RTM_ADD et all */ 36d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include <netinet/in.h> 37d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifdef BSD 38d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include <netinet/in_var.h> /* for IN_IFF_TENTATIVE et all */ 39d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif 40d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 41d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/* Some systems have route metrics. 42d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * OpenBSD route priority is not this. */ 43d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifndef HAVE_ROUTE_METRIC 44d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan# if defined(__linux__) 45d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan# define HAVE_ROUTE_METRIC 1 46d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan# endif 47d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif 48d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 49d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/* Some systems have in-built IPv4 DAD. 50d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * However, we need them to do DAD at carrier up as well. */ 51d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifdef IN_IFF_TENTATIVE 52d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan# ifdef __NetBSD__ 53d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan# define NOCARRIER_PRESERVE_IP 54d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan# endif 55d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif 56d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 57d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include "config.h" 58d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include "dhcpcd.h" 59d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include "ipv4.h" 60d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#include "ipv6.h" 61d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 62d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define EUI64_ADDR_LEN 8 63d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define INFINIBAND_ADDR_LEN 20 64d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 65d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/* Linux 2.4 doesn't define this */ 66d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifndef ARPHRD_IEEE1394 67d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan# define ARPHRD_IEEE1394 24 68d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif 69d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 70d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/* The BSD's don't define this yet */ 71d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifndef ARPHRD_INFINIBAND 72d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan# define ARPHRD_INFINIBAND 32 73d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif 74d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 75d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/* Work out if we have a private address or not 76d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * 10/8 77d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * 172.16/12 78d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * 192.168/16 79d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan */ 80d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifndef IN_PRIVATE 81d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan# define IN_PRIVATE(addr) (((addr & IN_CLASSA_NET) == 0x0a000000) || \ 82d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan ((addr & 0xfff00000) == 0xac100000) || \ 83d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan ((addr & IN_CLASSB_NET) == 0xc0a80000)) 84d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif 85d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 86d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define LINKLOCAL_ADDR 0xa9fe0000 87d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define LINKLOCAL_MASK IN_CLASSB_NET 88d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define LINKLOCAL_BRDC (LINKLOCAL_ADDR | ~LINKLOCAL_MASK) 89d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 90d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifndef IN_LINKLOCAL 91d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan# define IN_LINKLOCAL(addr) ((addr & IN_CLASSB_NET) == LINKLOCAL_ADDR) 92d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif 93d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 94d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define RAW_EOF 1 << 0 95d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define RAW_PARTIALCSUM 2 << 0 96d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 97d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_setflag(struct interface *ifp, short flag); 98d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define if_up(ifp) if_setflag((ifp), (IFF_UP | IFF_RUNNING)) 99d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanstruct if_head *if_discover(struct dhcpcd_ctx *, int, char * const *); 100d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanstruct interface *if_find(struct if_head *, const char *); 101d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanstruct interface *if_findindex(struct if_head *, unsigned int); 102d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanvoid if_sortinterfaces(struct dhcpcd_ctx *); 103d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanvoid if_free(struct interface *); 104d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_domtu(const char *, short int); 105d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define if_getmtu(iface) if_domtu(iface, 0) 106d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define if_setmtu(iface, mtu) if_domtu(iface, mtu) 107d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_carrier(struct interface *); 108d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 109d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/* The below functions are provided by if-KERNEL.c */ 110d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_conf(struct interface *); 111d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_init(struct interface *); 112d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_getssid(struct interface *); 113d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_vimaster(const char *); 114d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_openlinksocket(void); 115d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_managelink(struct dhcpcd_ctx *); 116d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 117d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/* dhcpcd uses the same routing flags as BSD. 118d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * If the platform doesn't use these flags, 119d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * map them in the platform interace file. */ 120d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifndef RTM_ADD 121d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define RTM_ADD 0x1 /* Add Route */ 122d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define RTM_DELETE 0x2 /* Delete Route */ 123d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define RTM_CHANGE 0x3 /* Change Metrics or flags */ 124d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define RTM_GET 0x4 /* Report Metrics */ 125d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif 126d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 127d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifdef INET 128d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanextern const char *if_pfname; 129d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_openrawsocket(struct interface *, uint16_t); 130d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanssize_t if_sendrawpacket(const struct interface *, 131f20514bf582d08567217a3b06171bab5a11458eaSamuel Tan uint16_t, const void *, size_t, const uint8_t *dest_hw_addr); 132d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanssize_t if_readrawpacket(struct interface *, uint16_t, void *, size_t, int *); 133d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 134d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_address(const struct interface *, 135d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan const struct in_addr *, const struct in_addr *, 136d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan const struct in_addr *, int); 137d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define if_addaddress(ifp, addr, net, brd) \ 138d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan if_address(ifp, addr, net, brd, 1) 139d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define if_deladdress(ifp, addr, net) \ 140d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan if_address(ifp, addr, net, NULL, -1) 141d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 142d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_addrflags(const struct in_addr *, const struct interface *); 143d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 144d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_route(unsigned char, const struct rt *rt); 145d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_initrt(struct interface *); 146d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif 147d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 148d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifdef INET6 149d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_checkipv6(struct dhcpcd_ctx *ctx, const struct interface *, int); 150d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifdef IPV6_MANAGETEMPADDR 151d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint ip6_use_tempaddr(const char *ifname); 152d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint ip6_temp_preferred_lifetime(const char *ifname); 153d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint ip6_temp_valid_lifetime(const char *ifname); 154d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#else 155d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define ip6_use_tempaddr(a) (0) 156d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif 157d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 158d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_address6(const struct ipv6_addr *, int); 159d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define if_addaddress6(a) if_address6(a, 1) 160d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define if_deladdress6(a) if_address6(a, -1) 161d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 162d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_addrflags6(const struct in6_addr *, const struct interface *); 163d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_getlifetime6(struct ipv6_addr *); 164d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 165d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_route6(unsigned char, const struct rt6 *rt); 166d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_initrt6(struct interface *); 167d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#else 168d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define if_checkipv6(a, b, c) (-1) 169d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif 170d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan 171d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_machinearch(char *, size_t); 172d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif 173