]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/libsystemd-network/dhcp-protocol.h
sd-dhcp-server: support IPv6 only mode
[thirdparty/systemd.git] / src / libsystemd-network / dhcp-protocol.h
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
5f404b1e
PF
2#pragma once
3
4/***
810adae9 5 Copyright © 2013 Intel Corporation. All rights reserved.
5f404b1e
PF
6***/
7
5f404b1e 8#include <netinet/ip.h>
71d35b6b 9#include <netinet/udp.h>
5f404b1e
PF
10#include <stdint.h>
11
12#include "macro.h"
13#include "sparse-endian.h"
14bd102e
SS
14#include "time-util.h"
15
16/* RFC 8925 - IPv6-Only Preferred Option for DHCPv4 3.4.
17 * MIN_V6ONLY_WAIT: The lower boundary for V6ONLY_WAIT. Value: 300 seconds */
18#define MIN_V6ONLY_WAIT_USEC (300U * USEC_PER_SEC)
5f404b1e
PF
19
20struct DHCPMessage {
21 uint8_t op;
22 uint8_t htype;
23 uint8_t hlen;
24 uint8_t hops;
25 be32_t xid;
26 be16_t secs;
27 be16_t flags;
3b349af6
PF
28 be32_t ciaddr;
29 be32_t yiaddr;
30 be32_t siaddr;
31 be32_t giaddr;
5f404b1e
PF
32 uint8_t chaddr[16];
33 uint8_t sname[64];
34 uint8_t file[128];
3b7ca119 35 be32_t magic;
d42add3c 36 uint8_t options[];
5f404b1e
PF
37} _packed_;
38
39typedef struct DHCPMessage DHCPMessage;
40
41struct DHCPPacket {
42 struct iphdr ip;
43 struct udphdr udp;
44 DHCPMessage dhcp;
45} _packed_;
46
47typedef struct DHCPPacket DHCPPacket;
48
8c00042c
PF
49#define DHCP_IP_SIZE (int32_t)(sizeof(struct iphdr))
50#define DHCP_IP_UDP_SIZE (int32_t)(sizeof(struct udphdr) + DHCP_IP_SIZE)
4473cd7f
YW
51#define DHCP_HEADER_SIZE (int32_t)(sizeof(DHCPMessage))
52#define DHCP_MIN_MESSAGE_SIZE 576 /* the minimum internet hosts must be able to receive, see RFC 2132 Section 9.10 */
53#define DHCP_MIN_OPTIONS_SIZE (DHCP_MIN_MESSAGE_SIZE - DHCP_HEADER_SIZE)
54#define DHCP_MIN_PACKET_SIZE (DHCP_MIN_MESSAGE_SIZE + DHCP_IP_UDP_SIZE)
3b7ca119 55#define DHCP_MAGIC_COOKIE (uint32_t)(0x63825363)
8c00042c 56
46a66b79
PF
57enum {
58 DHCP_PORT_SERVER = 67,
59 DHCP_PORT_CLIENT = 68,
60};
61
5f404b1e 62enum DHCPState {
8412d4c8 63 DHCP_STATE_STOPPED,
64 DHCP_STATE_INIT,
65 DHCP_STATE_SELECTING,
66 DHCP_STATE_INIT_REBOOT,
67 DHCP_STATE_REBOOTING,
68 DHCP_STATE_REQUESTING,
69 DHCP_STATE_BOUND,
70 DHCP_STATE_RENEWING,
71 DHCP_STATE_REBINDING,
72 _DHCP_STATE_MAX,
73 _DHCP_STATE_INVALID = -EINVAL,
5f404b1e
PF
74};
75
76typedef enum DHCPState DHCPState;
77
78enum {
79 BOOTREQUEST = 1,
80 BOOTREPLY = 2,
81};
82
83enum {
71a9e3a3
YW
84 DHCP_DISCOVER = 1, /* [RFC2132] */
85 DHCP_OFFER = 2, /* [RFC2132] */
86 DHCP_REQUEST = 3, /* [RFC2132] */
87 DHCP_DECLINE = 4, /* [RFC2132] */
88 DHCP_ACK = 5, /* [RFC2132] */
89 DHCP_NAK = 6, /* [RFC2132] */
90 DHCP_RELEASE = 7, /* [RFC2132] */
91 DHCP_INFORM = 8, /* [RFC2132] */
92 DHCP_FORCERENEW = 9, /* [RFC3203] */
93 DHCPLEASEQUERY = 10, /* [RFC4388] */
94 DHCPLEASEUNASSIGNED = 11, /* [RFC4388] */
95 DHCPLEASEUNKNOWN = 12, /* [RFC4388] */
96 DHCPLEASEACTIVE = 13, /* [RFC4388] */
97 DHCPBULKLEASEQUERY = 14, /* [RFC6926] */
98 DHCPLEASEQUERYDONE = 15, /* [RFC6926] */
99 DHCPACTIVELEASEQUERY = 16, /* [RFC7724] */
100 DHCPLEASEQUERYSTATUS = 17, /* [RFC7724] */
101 DHCPTLS = 18, /* [RFC7724] */
5f404b1e
PF
102};
103
104enum {
105 DHCP_OVERLOAD_FILE = 1,
106 DHCP_OVERLOAD_SNAME = 2,
107};
108
23873e25
BG
109#define DHCP_MAX_FQDN_LENGTH 255
110
111enum {
112 DHCP_FQDN_FLAG_S = (1 << 0),
113 DHCP_FQDN_FLAG_O = (1 << 1),
114 DHCP_FQDN_FLAG_E = (1 << 2),
115 DHCP_FQDN_FLAG_N = (1 << 3),
116};
8412d4c8 117
118const char *dhcp_state_to_string(DHCPState s) _const_;