1f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project/* 2f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * dhcpcd - DHCP client daemon 3f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * Copyright 2006-2008 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 DHCP_H 29f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_H 30f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 31f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <arpa/inet.h> 32f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 33f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include <stdint.h> 34f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 35f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include "config.h" 36f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include "dhcpcd.h" 37f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#include "net.h" 38f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 39f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project/* Max MTU - defines dhcp option length */ 40f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define MTU_MAX 1500 41f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define MTU_MIN 576 42f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 43f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project/* UDP port numbers for DHCP */ 44f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_SERVER_PORT 67 45f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_CLIENT_PORT 68 46f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 47f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define MAGIC_COOKIE 0x63825363 48f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define BROADCAST_FLAG 0x8000 49f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 50f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project/* DHCP message OP code */ 51f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_BOOTREQUEST 1 52f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_BOOTREPLY 2 53f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 54f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project/* DHCP message type */ 55f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_DISCOVER 1 56f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_OFFER 2 57f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_REQUEST 3 58f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_DECLINE 4 59f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_ACK 5 60f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_NAK 6 61f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_RELEASE 7 62f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_INFORM 8 63f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 64f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project/* DHCP options */ 65f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectenum DHO 66f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project{ 67f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_PAD = 0, 68f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_SUBNETMASK = 1, 69f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_ROUTER = 3, 70f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_DNSSERVER = 6, 71f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_HOSTNAME = 12, 72f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_DNSDOMAIN = 15, 73f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_MTU = 26, 74f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_BROADCAST = 28, 75f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_STATICROUTE = 33, 76f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_NISDOMAIN = 40, 77f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_NISSERVER = 41, 78f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_NTPSERVER = 42, 79f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_VENDOR = 43, 80f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_IPADDRESS = 50, 81f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_LEASETIME = 51, 82f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_OPTIONSOVERLOADED = 52, 83f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_MESSAGETYPE = 53, 84f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_SERVERID = 54, 85f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_PARAMETERREQUESTLIST = 55, 86f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_MESSAGE = 56, 87f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_MAXMESSAGESIZE = 57, 88f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_RENEWALTIME = 58, 89f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_REBINDTIME = 59, 90f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_VENDORCLASSID = 60, 91f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_CLIENTID = 61, 92f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_USERCLASS = 77, /* RFC 3004 */ 93f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_FQDN = 81, 94f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_DNSSEARCH = 119, /* RFC 3397 */ 95f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_CSR = 121, /* RFC 3442 */ 96f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_MSCSR = 249, /* MS code for RFC 3442 */ 97f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project DHO_END = 255 98f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project}; 99f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 100f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project/* FQDN values - lsnybble used in flags 101f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * hsnybble to create order 102f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project * and to allow 0x00 to mean disable 103f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project */ 104f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectenum FQDN { 105f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project FQDN_DISABLE = 0x00, 106f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project FQDN_NONE = 0x18, 107f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project FQDN_PTR = 0x20, 108f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project FQDN_BOTH = 0x31 109f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project}; 110f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 111f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project/* Sizes for DHCP options */ 112f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_CHADDR_LEN 16 113f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define SERVERNAME_LEN 64 114f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define BOOTFILE_LEN 128 115f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_UDP_LEN (20 + 8) 116f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_BASE_LEN (4 + 4 + 2 + 2 + 4 + 4 + 4 + 4 + 4) 117f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_RESERVE_LEN (4 + 4 + 4 + 4 + 2) 118f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_FIXED_LEN (DHCP_BASE_LEN + DHCP_CHADDR_LEN + \ 119f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project + SERVERNAME_LEN + BOOTFILE_LEN) 120f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define DHCP_OPTION_LEN (MTU_MAX - DHCP_FIXED_LEN - DHCP_UDP_LEN \ 121f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project - DHCP_RESERVE_LEN) 122f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 123f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project/* Some crappy DHCP servers require the BOOTP minimum length */ 124f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define BOOTP_MESSAGE_LENTH_MIN 300 125f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 126f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectstruct dhcp_message { 127f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint8_t op; /* message type */ 128f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint8_t hwtype; /* hardware address type */ 129f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint8_t hwlen; /* hardware address length */ 130f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint8_t hwopcount; /* should be zero in client message */ 131f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint32_t xid; /* transaction id */ 132f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint16_t secs; /* elapsed time in sec. from boot */ 133f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint16_t flags; 134f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint32_t ciaddr; /* (previously allocated) client IP */ 135f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint32_t yiaddr; /* 'your' client IP address */ 136f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint32_t siaddr; /* should be zero in client's messages */ 137f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint32_t giaddr; /* should be zero in client's messages */ 138f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint8_t chaddr[DHCP_CHADDR_LEN]; /* client's hardware address */ 139f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint8_t servername[SERVERNAME_LEN]; /* server host name */ 140f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint8_t bootfile[BOOTFILE_LEN]; /* boot file name */ 141f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint32_t cookie; 142f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint8_t options[DHCP_OPTION_LEN]; /* message options - cookie */ 143f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project}; 144f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 145f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectstruct dhcp_lease { 146f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project struct in_addr addr; 147f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project struct in_addr net; 148f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint32_t leasetime; 149f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint32_t renewaltime; 150f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint32_t rebindtime; 151f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project struct in_addr server; 152f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project time_t leasedfrom; 153f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project struct timeval boundtime; 154f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint8_t frominfo; 155f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project}; 156f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 157f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define add_option_mask(var, val) (var[val >> 3] |= 1 << (val & 7)) 158f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define del_option_mask(var, val) (var[val >> 3] &= ~(1 << (val & 7))) 159f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#define has_option_mask(var, val) (var[val >> 3] & (1 << (val & 7))) 160f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectint make_option_mask(uint8_t *, char **, int); 161f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectvoid print_options(void); 162f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectchar *get_option_string(const struct dhcp_message *, uint8_t); 163938bc384f44031877543765a9ae18c764f5da9c8Dmitry Shmidtint get_option_addr(struct in_addr *, const struct dhcp_message *, uint8_t); 164f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectint get_option_uint32(uint32_t *, const struct dhcp_message *, uint8_t); 165f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectint get_option_uint16(uint16_t *, const struct dhcp_message *, uint8_t); 166f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectint get_option_uint8(uint8_t *, const struct dhcp_message *, uint8_t); 167f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectstruct rt *get_option_routes(const struct dhcp_message *); 168f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectssize_t configure_env(char **, const char *, const struct dhcp_message *, 169f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project const struct options *); 170f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 171f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectssize_t make_message(struct dhcp_message **, 172f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project const struct interface *, const struct dhcp_lease *, 173f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project uint32_t, uint8_t, const struct options *); 174f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectint valid_dhcp_packet(unsigned char *); 175f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project 176f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectssize_t write_lease(const struct interface *, const struct dhcp_message *); 177f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Projectstruct dhcp_message *read_lease(const struct interface *iface); 178f7c5421560640d23fc10803b9d59a9ff1d83e467The Android Open Source Project#endif 179