1f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project/*
2f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * dhcpcd - DHCP client daemon
3a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt * Copyright (c) 2006-2011 Roy Marples <roy@marples.name>
4f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * All rights reserved
5f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project
6f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * Redistribution and use in source and binary forms, with or without
7f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * modification, are permitted provided that the following conditions
8f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * are met:
9f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
10f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
11f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
12f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
13f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project *    documentation and/or other materials provided with the distribution.
14f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project *
15f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * SUCH DAMAGE.
26f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project */
27f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project
28f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#ifndef DHCPCD_H
29f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCPCD_H
30f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project
31f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <sys/socket.h>
32f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <net/if.h>
33a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt#include <netinet/in.h>
34f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project
35f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <limits.h>
36f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project
37e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#include "control.h"
38e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#include "dhcp.h"
39e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#include "if-options.h"
40e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
41e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#define HWADDR_LEN 20
42e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#define IF_SSIDSIZE 33
43e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#define PROFILE_LEN 64
44e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
45e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtenum DHS {
46e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	DHS_INIT,
47e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	DHS_DISCOVER,
48e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	DHS_REQUEST,
49e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	DHS_BOUND,
50e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	DHS_RENEW,
51e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	DHS_REBIND,
52e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	DHS_REBOOT,
53e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	DHS_INFORM,
54e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	DHS_RENEW_REQUESTED,
55e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	DHS_INIT_IPV4LL,
56e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	DHS_PROBE
57e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt};
58e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
59e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#define LINK_UP 	1
60e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#define LINK_UNKNOWN	0
61e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#define LINK_DOWN 	-1
62e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
63e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtstruct if_state {
64e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	enum DHS state;
65e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	char profile[PROFILE_LEN];
66e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	struct if_options *options;
67e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	struct dhcp_message *sent;
68e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	struct dhcp_message *offer;
69e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	struct dhcp_message *new;
70e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	struct dhcp_message *old;
71e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	struct dhcp_lease lease;
72e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	const char *reason;
73e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	time_t interval;
74e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	time_t nakoff;
75e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	uint32_t xid;
76e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	int socket;
77e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	int probes;
78e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	int claims;
79e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	int conflicts;
80e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	time_t defend;
81e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	struct in_addr fail;
82e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	size_t arping_index;
83e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt};
84e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
85a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtstruct ra_opt {
86a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	uint8_t type;
87a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	struct timeval expire;
88a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	char *option;
89a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	struct ra_opt *next;
90a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt};
91a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt
92a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtstruct ra {
93a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	struct in6_addr from;
94a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	char sfrom[INET6_ADDRSTRLEN];
95a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	unsigned char *data;
96a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	ssize_t data_len;
97a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	struct timeval received;
98a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	uint32_t lifetime;
99a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	struct in6_addr prefix;
100a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	int prefix_len;
101a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	uint32_t prefix_vltime;
102a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	uint32_t prefix_pltime;
103a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	char sprefix[INET6_ADDRSTRLEN];
104a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	struct ra_opt *options;
105a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	int expired;
106a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	struct ra *next;
107a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt};
108a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt
109e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtstruct interface {
110e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	char name[IF_NAMESIZE];
111e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	struct if_state *state;
112e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
113e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	int flags;
114e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	sa_family_t family;
115e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	unsigned char hwaddr[HWADDR_LEN];
116e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	size_t hwlen;
117f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project	int metric;
118e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	int carrier;
119e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	int wireless;
120e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	char ssid[IF_SSIDSIZE];
121e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
122e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	int raw_fd;
123e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	int udp_fd;
124e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	int arp_fd;
125e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	size_t buffer_size, buffer_len, buffer_pos;
126e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	unsigned char *buffer;
127e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
128e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	struct in_addr addr;
129e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	struct in_addr net;
130e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	struct in_addr dst;
131e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
132e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	char leasefile[PATH_MAX];
133e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	time_t start_uptime;
134e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
135e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	unsigned char *clientid;
136e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
137a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	unsigned char *rs;
138a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	size_t rslen;
139a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	int rsprobes;
140a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	struct ra *ras;
141a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt
142e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	struct interface *next;
143f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project};
144e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
145e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtextern int pidfd;
146a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtextern unsigned long long options;
147e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtextern int ifac;
148e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtextern char **ifav;
149e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtextern int ifdc;
150e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtextern char **ifdv;
151e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtextern struct interface *ifaces;
1520d3a47d979ac35a49b2a2da9e80e16bd37aab877repo syncextern int avoid_routes;
153e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
154e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtstruct interface *find_interface(const char *);
155e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtint handle_args(struct fd_list *, int, char **);
156a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtvoid handle_carrier(int, int, const char *);
157e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid handle_interface(int, const char *);
158e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid handle_hwaddr(const char *, unsigned char *, size_t);
159e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid handle_ifa(int, const char *,
160e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt    struct in_addr *, struct in_addr *, struct in_addr *);
161e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid handle_exit_timeout(void *);
162e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid start_interface(void *);
163e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid start_discover(void *);
164e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid start_request(void *);
165e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid start_renew(void *);
166e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid start_rebind(void *);
167e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid start_reboot(struct interface *);
168e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid start_expire(void *);
169e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid send_decline(struct interface *);
170e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid open_sockets(struct interface *);
171e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtvoid close_sockets(struct interface *);
172a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtvoid drop_dhcp(struct interface *, const char *);
173a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtvoid drop_interface(struct interface *, const char *);
174e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtint select_profile(struct interface *, const char *);
175e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
176f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#endif
177