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