blob: d5467952a64a21a8a8774e9472fdc28237e1f90d [file] [log] [blame]
Neale Ranns2dd68522017-02-16 03:38:59 -08001#ifndef included_vnet_dhcp6_packet_h
2#define included_vnet_dhcp6_packet_h
Ed Warnickecb9cada2015-12-08 15:45:58 -07003
4/*
5 * DHCP packet format
6 *
7 * Copyright (c) 2013 Cisco and/or its affiliates.
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at:
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 */
20#include <vnet/ip/ip6_packet.h>
21
22// #define DHCP_VRF_NAME_MAX_LEN L3VM_MAX_NAME_STR_LEN
23// #define DHCPV6_MAX_VRF_NAME_LEN L3VM_MAX_NAME_STR_LEN
24#define DHCP_MAX_RELAY_ADDR 16
25#define PROTO_UDP 17
26#define DHCPV6_CLIENT_PORT 546
27#define DHCPV6_SERVER_PORT 547
28#define HOP_COUNT_LIMIT 32
29#define DHCPV6_CISCO_ENT_NUM 9
30
31/*
32 * DHCPv6 message types
33 */
khemendra kumar34719e32017-12-08 18:06:52 +053034typedef enum dhcpv6_msg_type_
35{
36 DHCPV6_MSG_SOLICIT = 1,
37 DHCPV6_MSG_ADVERTISE = 2,
38 DHCPV6_MSG_REQUEST = 3,
39 DHCPV6_MSG_CONFIRM = 4,
40 DHCPV6_MSG_RENEW = 5,
41 DHCPV6_MSG_REBIND = 6,
42 DHCPV6_MSG_REPLY = 7,
43 DHCPV6_MSG_RELEASE = 8,
44 DHCPV6_MSG_DECLINE = 9,
45 DHCPV6_MSG_RECONFIGURE = 10,
46 DHCPV6_MSG_INFORMATION_REQUEST = 11,
47 DHCPV6_MSG_RELAY_FORW = 12,
48 DHCPV6_MSG_RELAY_REPL = 13,
Ed Warnickecb9cada2015-12-08 15:45:58 -070049} dhcpv6_msg_type_t;
50
Juraj Sloboda81119e82018-05-25 14:02:20 +020051/* Name, code, min payload length */
52#define dhcpv6_foreach_option \
53 _(CLIENTID , 1 , 4 ) \
54 _(SERVERID , 2 , 4 ) \
55 _(IA_NA , 3 , 12) \
56 _(IA_TA , 4 , 4 ) \
57 _(IAADDR , 5 , 24) \
58 _(ORO , 6 , 0 ) \
59 _(PREFERENCE , 7 , 1 ) \
60 _(ELAPSED_TIME , 8 , 2 ) \
61 _(RELAY_MSG , 9 , 0 ) \
62 _(AUTH , 11 , 11) \
63 _(UNICAST , 12 , 16) \
64 _(STATUS_CODE , 13 , 2 ) \
65 _(RAPID_COMMIT , 14 , 0 ) \
66 _(USER_CLASS , 15 , 0 ) \
67 _(VENDOR_CLASS , 16 , 4 ) \
68 _(VENDOR_OPTS , 17 , 4 ) \
69 _(INTERFACE_ID , 18 , 0 ) \
70 _(RECONF_MSG , 19 , 1 ) \
71 _(RECONF_ACCEPT , 20 , 0 ) \
72 _(DNS_SEARCH , 24 , 0 ) \
73 _(IA_PD , 25 , 12) \
74 _(IAPREFIX , 26 , 25) \
75 _(REMOTEID , 37 , 4 ) \
76 _(VSS , 68 , 1 ) \
77 _(CLIENT_LINK_LAYER_ADDRESS, 79 , 2 )
78
Ed Warnickecb9cada2015-12-08 15:45:58 -070079/*
80 * DHCPv6 options types
81 */
khemendra kumar34719e32017-12-08 18:06:52 +053082enum
83{
Juraj Sloboda81119e82018-05-25 14:02:20 +020084#define _(a,b,c) DHCPV6_OPTION_##a = b,
85 dhcpv6_foreach_option
86#undef _
khemendra kumar34719e32017-12-08 18:06:52 +053087 DHCPV6_OPTION_MAX
Ed Warnickecb9cada2015-12-08 15:45:58 -070088};
89
90/*
91* DHCPv6 status codes
92 */
khemendra kumar34719e32017-12-08 18:06:52 +053093enum
94{
95 DHCPV6_STATUS_SUCCESS = 0,
96 DHCPV6_STATUS_UNSPEC_FAIL = 1,
97 DHCPV6_STATUS_NOADDRS_AVAIL = 2,
98 DHCPV6_STATUS_NO_BINDING = 3,
99 DHCPV6_STATUS_NOT_ONLINK = 4,
100 DHCPV6_STATUS_USE_MULTICAST = 5,
Juraj Sloboda81119e82018-05-25 14:02:20 +0200101 DHCPV6_STATUS_NOPREFIX_AVAIL = 6,
Ed Warnickecb9cada2015-12-08 15:45:58 -0700102};
103
104/*
105 * DHCPv6 DUID types
106 */
khemendra kumar34719e32017-12-08 18:06:52 +0530107enum
108{
109 DHCPV6_DUID_LLT = 1, /* DUID Based on Link-layer Address Plus Time */
110 DHCPV6_DUID_EN = 2, /* DUID Based on Enterprise Number */
111 DHCPV6_DUID_LL = 3, /* DUID Based on Link-layer Address */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700112};
113
114//Structure for DHCPv6 payload from client
khemendra kumar34719e32017-12-08 18:06:52 +0530115typedef struct dhcpv6_hdr_
116{
Juraj Sloboda81119e82018-05-25 14:02:20 +0200117 u8 msg_type; //DHCP msg type
118 u8 xid[3]; //Transaction id
khemendra kumar34719e32017-12-08 18:06:52 +0530119 u8 data[0];
Ed Warnickecb9cada2015-12-08 15:45:58 -0700120} dhcpv6_header_t;
121
khemendra kumar34719e32017-12-08 18:06:52 +0530122/* *INDENT-OFF* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700123typedef CLIB_PACKED (struct dhcpv6_relay_ctx_ {
124 dhcpv6_header_t *pkt;
125 u32 pkt_len;
126 u32 dhcpv6_len; //DHCPv6 payload load
127// if_ordinal iod;
128 u32 if_index;
129 u32 ctx_id;
130 char ctx_name[32+1];
131 u8 dhcp_msg_type;
132}) dhcpv6_relay_ctx_t;
khemendra kumar34719e32017-12-08 18:06:52 +0530133/* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700134
135//Structure for DHCPv6 RELAY-FORWARD and DHCPv6 RELAY-REPLY pkts
khemendra kumar34719e32017-12-08 18:06:52 +0530136/* *INDENT-OFF* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700137typedef CLIB_PACKED (struct dhcpv6_relay_hdr_ {
138 u8 msg_type;
139 u8 hop_count;
140 ip6_address_t link_addr;
141 ip6_address_t peer_addr;
142 u8 data[0];
143}) dhcpv6_relay_hdr_t;
khemendra kumar34719e32017-12-08 18:06:52 +0530144/* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700145
khemendra kumar34719e32017-12-08 18:06:52 +0530146typedef enum dhcp_stats_action_type_
147{
148 DHCP_STATS_ACTION_FORWARDED = 1,
149 DHCP_STATS_ACTION_RECEIVED,
150 DHCP_STATS_ACTION_DROPPED
Ed Warnickecb9cada2015-12-08 15:45:58 -0700151} dhcp_stats_action_type_t;
152//Generic counters for a packet
khemendra kumar34719e32017-12-08 18:06:52 +0530153typedef struct dhcp_stats_counters_
154{
155 u64 rx_pkts; //counter for received pkts
156 u64 tx_pkts; //counter for forwarded pkts
157 u64 drops; //counter for dropped pkts
Ed Warnickecb9cada2015-12-08 15:45:58 -0700158} dhcp_stats_counters_t;
159
160
khemendra kumar34719e32017-12-08 18:06:52 +0530161typedef enum dhcpv6_stats_drop_reason_
162{
163 DHCPV6_RELAY_PKT_DROP_RELAYDISABLE = 1,
164 DHCPV6_RELAY_PKT_DROP_MAX_HOPS,
165 DHCPV6_RELAY_PKT_DROP_VALIDATION_FAIL,
166 DHCPV6_RELAY_PKT_DROP_UNKNOWN_OP_INTF,
167 DHCPV6_RELAY_PKT_DROP_BAD_CONTEXT,
168 DHCPV6_RELAY_PKT_DROP_OPT_INSERT_FAIL,
169 DHCPV6_RELAY_PKT_DROP_REPLY_FROM_CLIENT,
Ed Warnickecb9cada2015-12-08 15:45:58 -0700170} dhcpv6_stats_drop_reason_t;
171
Juraj Sloboda81119e82018-05-25 14:02:20 +0200172#define dhcpv6_optlen(opt) clib_net_to_host_u16((opt)->length)
173
khemendra kumar34719e32017-12-08 18:06:52 +0530174/* *INDENT-OFF* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700175typedef CLIB_PACKED (struct {
176 u16 option;
177 u16 length;
178 u8 data[0];
179}) dhcpv6_option_t;
khemendra kumar34719e32017-12-08 18:06:52 +0530180/* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700181
khemendra kumar34719e32017-12-08 18:06:52 +0530182/* *INDENT-OFF* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700183typedef CLIB_PACKED (struct {
184 dhcpv6_option_t opt;
Juraj Sloboda81119e82018-05-25 14:02:20 +0200185 u16 status_code;
186}) dhcpv6_status_code_t;
187/* *INDENT-ON* */
188
189/* *INDENT-OFF* */
190typedef CLIB_PACKED (struct {
191 dhcpv6_option_t opt;
Ed Warnickecb9cada2015-12-08 15:45:58 -0700192 u32 int_idx;
193}) dhcpv6_int_id_t;
khemendra kumar34719e32017-12-08 18:06:52 +0530194/* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700195
khemendra kumar34719e32017-12-08 18:06:52 +0530196/* *INDENT-OFF* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700197typedef CLIB_PACKED (struct {
198 dhcpv6_option_t opt;
John Lo70bfcaf2017-11-14 13:19:26 -0500199 u8 vss_type;
200 u8 data[0];
Ed Warnickecb9cada2015-12-08 15:45:58 -0700201}) dhcpv6_vss_t;
khemendra kumar34719e32017-12-08 18:06:52 +0530202/* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700203
khemendra kumar34719e32017-12-08 18:06:52 +0530204/* *INDENT-OFF* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700205typedef CLIB_PACKED (struct {
206 dhcpv6_option_t opt;
207 u32 ent_num;
208 u32 rmt_id;
209}) dhcpv6_rmt_id_t;
khemendra kumar34719e32017-12-08 18:06:52 +0530210/* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700211
khemendra kumar34719e32017-12-08 18:06:52 +0530212/* *INDENT-OFF* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700213typedef CLIB_PACKED (struct {
214 dhcpv6_option_t opt;
215 u16 link_type;
216 u8 data[6]; // data[0]:data[5]: MAC address
217}) dhcpv6_client_mac_t;
khemendra kumar34719e32017-12-08 18:06:52 +0530218/* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700219
Juraj Sloboda81119e82018-05-25 14:02:20 +0200220typedef CLIB_PACKED (struct
221 {
222 dhcpv6_option_t opt; u32 iaid; u32 t1;
223 u32 t2;
224 u8 data[0];
225 }) dhcpv6_ia_header_t;
226
227typedef CLIB_PACKED (struct
228 {
229 dhcpv6_option_t opt; u32 preferred; u32 valid; u8 prefix;
230 ip6_address_t addr;
231 }) dhcpv6_ia_opt_pd_t;
232
233typedef CLIB_PACKED (struct
234 {
Juraj Slobodadd3b8f72018-05-04 14:20:06 +0200235 dhcpv6_option_t opt; ip6_address_t addr; u32 preferred;
236 u32 valid;
237 }) dhcpv6_ia_opt_addr_t;
238
239typedef CLIB_PACKED (struct
240 {
Juraj Sloboda81119e82018-05-25 14:02:20 +0200241 dhcpv6_option_t opt;
242 u16 options[0];
243 }) dhcpv6_oro_t;
244
245typedef CLIB_PACKED (struct
246 {
247 dhcpv6_option_t opt; u16 elapsed_10ms;
248 }) dhcpv6_elapsed_t;
249
250typedef CLIB_PACKED (struct
251 {
252 dhcpv6_option_t opt; u16 duid_type;
253 u16 hardware_type;
254 }) dhcpv6_duid_t;
255
256typedef CLIB_PACKED (struct
257 {
258 dhcpv6_option_t opt; u16 status_code;
259 u8 message[0];
260 }) dhcpv6_status_t;
261
Ed Warnickecb9cada2015-12-08 15:45:58 -0700262
Neale Ranns2dd68522017-02-16 03:38:59 -0800263#endif /* included_vnet_dhcp6_packet_h */
khemendra kumar34719e32017-12-08 18:06:52 +0530264
265/*
266 * fd.io coding-style-patch-verification: ON
267 *
268 * Local Variables:
269 * eval: (c-set-style "gnu")
270 * End:
271 */