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