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 *);
108a3595821594453ea89ef8e6790927694b0a1adf1Samuel Tanint split_interface_lease(const char *ifname, int *ifname_len,
109a3595821594453ea89ef8e6790927694b0a1adf1Samuel Tan			  const char **lease_identifier);
110d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
111d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/* The below functions are provided by if-KERNEL.c */
112d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_conf(struct interface *);
113d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_init(struct interface *);
114d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_getssid(struct interface *);
115d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_vimaster(const char *);
116d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_openlinksocket(void);
117d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_managelink(struct dhcpcd_ctx *);
118d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
119d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan/* dhcpcd uses the same routing flags as BSD.
120d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * If the platform doesn't use these flags,
121d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan * map them in the platform interace file. */
122d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifndef RTM_ADD
123d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define RTM_ADD		0x1	/* Add Route */
124d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define RTM_DELETE	0x2	/* Delete Route */
125d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define RTM_CHANGE	0x3	/* Change Metrics or flags */
126d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define RTM_GET		0x4	/* Report Metrics */
127d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif
128d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
129d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifdef INET
130d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanextern const char *if_pfname;
131d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_openrawsocket(struct interface *, uint16_t);
132d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanssize_t if_sendrawpacket(const struct interface *,
133f20514bf582d08567217a3b06171bab5a11458eaSamuel Tan    uint16_t, const void *, size_t, const uint8_t *dest_hw_addr);
134d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanssize_t if_readrawpacket(struct interface *, uint16_t, void *, size_t, int *);
135d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
136d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_address(const struct interface *,
137d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan    const struct in_addr *, const struct in_addr *,
138d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan    const struct in_addr *, int);
139d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define if_addaddress(ifp, addr, net, brd)	\
140d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	if_address(ifp, addr, net, brd, 1)
141d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define if_deladdress(ifp, addr, net)		\
142d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan	if_address(ifp, addr, net, NULL, -1)
143d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
144d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_addrflags(const struct in_addr *, const struct interface *);
145d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
146d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_route(unsigned char, const struct rt *rt);
147d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_initrt(struct interface *);
148d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif
149d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
150d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifdef INET6
151d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_checkipv6(struct dhcpcd_ctx *ctx, const struct interface *, int);
152d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#ifdef IPV6_MANAGETEMPADDR
153d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint ip6_use_tempaddr(const char *ifname);
154d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint ip6_temp_preferred_lifetime(const char *ifname);
155d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint ip6_temp_valid_lifetime(const char *ifname);
156d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#else
157d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define ip6_use_tempaddr(a) (0)
158d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif
159d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
160d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_address6(const struct ipv6_addr *, int);
161d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define if_addaddress6(a) if_address6(a, 1)
162d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define if_deladdress6(a) if_address6(a, -1)
163d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
164d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_addrflags6(const struct in6_addr *, const struct interface *);
165d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_getlifetime6(struct ipv6_addr *);
166d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
167d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_route6(unsigned char, const struct rt6 *rt);
168d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_initrt6(struct interface *);
169d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#else
170d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#define if_checkipv6(a, b, c) (-1)
171d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif
172d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan
173d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tanint if_machinearch(char *, size_t);
174d7ed851d6fc26c5e7db96971dbe6b44342b97727Samuel Tan#endif
175