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