blob: 97a89385836ceebb3cc63655367787d850cd856f [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
51/*
52 * DHCPv6 options types
53 */
khemendra kumar34719e32017-12-08 18:06:52 +053054enum
55{
56 DHCPV6_OPTION_CLIENTID = 1,
57 DHCPV6_OPTION_SERVERID = 2,
58 DHCPV6_OPTION_IA_NA = 3,
59 DHCPV6_OPTION_IA_TA = 4,
60 DHCPV6_OPTION_IAADDR = 5,
61 DHCPV6_OPTION_ORO = 6,
62 DHCPV6_OPTION_PREFERENCE = 7,
63 DHCPV6_OPTION_ELAPSED_TIME = 8,
64 DHCPV6_OPTION_RELAY_MSG = 9,
65 DHCPV6_OPTION_AUTH = 11,
66 DHCPV6_OPTION_UNICAST = 12,
67 DHCPV6_OPTION_STATUS_CODE = 13,
68 DHCPV6_OPTION_RAPID_COMMIT = 14,
69 DHCPV6_OPTION_USER_CLASS = 15,
70 DHCPV6_OPTION_VENDOR_CLASS = 16,
71 DHCPV6_OPTION_VENDOR_OPTS = 17,
72 DHCPV6_OPTION_INTERFACE_ID = 18, // relay agent fills this
73 DHCPV6_OPTION_RECONF_MSG = 19,
74 DHCPV6_OPTION_RECONF_ACCEPT = 20,
75 DHCPV6_OPTION_REMOTEID = 37, // relay agent fills this
76 DHCPV6_OPTION_VSS = 68, // relay agent fills this
77 DHCPV6_OPTION_CLIENT_LINK_LAYER_ADDRESS = 79,
78 DHCPV6_OPTION_MAX
Ed Warnickecb9cada2015-12-08 15:45:58 -070079};
80
81/*
82* DHCPv6 status codes
83 */
khemendra kumar34719e32017-12-08 18:06:52 +053084enum
85{
86 DHCPV6_STATUS_SUCCESS = 0,
87 DHCPV6_STATUS_UNSPEC_FAIL = 1,
88 DHCPV6_STATUS_NOADDRS_AVAIL = 2,
89 DHCPV6_STATUS_NO_BINDING = 3,
90 DHCPV6_STATUS_NOT_ONLINK = 4,
91 DHCPV6_STATUS_USE_MULTICAST = 5,
Ed Warnickecb9cada2015-12-08 15:45:58 -070092};
93
94/*
95 * DHCPv6 DUID types
96 */
khemendra kumar34719e32017-12-08 18:06:52 +053097enum
98{
99 DHCPV6_DUID_LLT = 1, /* DUID Based on Link-layer Address Plus Time */
100 DHCPV6_DUID_EN = 2, /* DUID Based on Enterprise Number */
101 DHCPV6_DUID_LL = 3, /* DUID Based on Link-layer Address */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700102};
103
104//Structure for DHCPv6 payload from client
khemendra kumar34719e32017-12-08 18:06:52 +0530105typedef struct dhcpv6_hdr_
106{
107 union
108 {
109 u8 msg_type; //DHCP msg type
110 u32 xid; // transaction id
111 } u;
112 u8 data[0];
Ed Warnickecb9cada2015-12-08 15:45:58 -0700113} dhcpv6_header_t;
114
115
116
khemendra kumar34719e32017-12-08 18:06:52 +0530117/* *INDENT-OFF* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700118typedef CLIB_PACKED (struct dhcpv6_relay_ctx_ {
119 dhcpv6_header_t *pkt;
120 u32 pkt_len;
121 u32 dhcpv6_len; //DHCPv6 payload load
122// if_ordinal iod;
123 u32 if_index;
124 u32 ctx_id;
125 char ctx_name[32+1];
126 u8 dhcp_msg_type;
127}) dhcpv6_relay_ctx_t;
khemendra kumar34719e32017-12-08 18:06:52 +0530128/* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700129
130//Structure for DHCPv6 RELAY-FORWARD and DHCPv6 RELAY-REPLY pkts
khemendra kumar34719e32017-12-08 18:06:52 +0530131/* *INDENT-OFF* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700132typedef CLIB_PACKED (struct dhcpv6_relay_hdr_ {
133 u8 msg_type;
134 u8 hop_count;
135 ip6_address_t link_addr;
136 ip6_address_t peer_addr;
137 u8 data[0];
138}) dhcpv6_relay_hdr_t;
khemendra kumar34719e32017-12-08 18:06:52 +0530139/* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700140
khemendra kumar34719e32017-12-08 18:06:52 +0530141typedef enum dhcp_stats_action_type_
142{
143 DHCP_STATS_ACTION_FORWARDED = 1,
144 DHCP_STATS_ACTION_RECEIVED,
145 DHCP_STATS_ACTION_DROPPED
Ed Warnickecb9cada2015-12-08 15:45:58 -0700146} dhcp_stats_action_type_t;
147//Generic counters for a packet
khemendra kumar34719e32017-12-08 18:06:52 +0530148typedef struct dhcp_stats_counters_
149{
150 u64 rx_pkts; //counter for received pkts
151 u64 tx_pkts; //counter for forwarded pkts
152 u64 drops; //counter for dropped pkts
Ed Warnickecb9cada2015-12-08 15:45:58 -0700153} dhcp_stats_counters_t;
154
155
khemendra kumar34719e32017-12-08 18:06:52 +0530156typedef enum dhcpv6_stats_drop_reason_
157{
158 DHCPV6_RELAY_PKT_DROP_RELAYDISABLE = 1,
159 DHCPV6_RELAY_PKT_DROP_MAX_HOPS,
160 DHCPV6_RELAY_PKT_DROP_VALIDATION_FAIL,
161 DHCPV6_RELAY_PKT_DROP_UNKNOWN_OP_INTF,
162 DHCPV6_RELAY_PKT_DROP_BAD_CONTEXT,
163 DHCPV6_RELAY_PKT_DROP_OPT_INSERT_FAIL,
164 DHCPV6_RELAY_PKT_DROP_REPLY_FROM_CLIENT,
Ed Warnickecb9cada2015-12-08 15:45:58 -0700165} dhcpv6_stats_drop_reason_t;
166
khemendra kumar34719e32017-12-08 18:06:52 +0530167/* *INDENT-OFF* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700168typedef CLIB_PACKED (struct {
169 u16 option;
170 u16 length;
171 u8 data[0];
172}) dhcpv6_option_t;
khemendra kumar34719e32017-12-08 18:06:52 +0530173/* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700174
khemendra kumar34719e32017-12-08 18:06:52 +0530175/* *INDENT-OFF* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700176typedef CLIB_PACKED (struct {
177 dhcpv6_option_t opt;
178 u32 int_idx;
179}) dhcpv6_int_id_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;
John Lo70bfcaf2017-11-14 13:19:26 -0500185 u8 vss_type;
186 u8 data[0];
Ed Warnickecb9cada2015-12-08 15:45:58 -0700187}) dhcpv6_vss_t;
khemendra kumar34719e32017-12-08 18:06:52 +0530188/* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700189
khemendra kumar34719e32017-12-08 18:06:52 +0530190/* *INDENT-OFF* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700191typedef CLIB_PACKED (struct {
192 dhcpv6_option_t opt;
193 u32 ent_num;
194 u32 rmt_id;
195}) dhcpv6_rmt_id_t;
khemendra kumar34719e32017-12-08 18:06:52 +0530196/* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700197
khemendra kumar34719e32017-12-08 18:06:52 +0530198/* *INDENT-OFF* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700199typedef CLIB_PACKED (struct {
200 dhcpv6_option_t opt;
201 u16 link_type;
202 u8 data[6]; // data[0]:data[5]: MAC address
203}) dhcpv6_client_mac_t;
khemendra kumar34719e32017-12-08 18:06:52 +0530204/* *INDENT-ON* */
Ed Warnickecb9cada2015-12-08 15:45:58 -0700205
206
Neale Ranns2dd68522017-02-16 03:38:59 -0800207#endif /* included_vnet_dhcp6_packet_h */
khemendra kumar34719e32017-12-08 18:06:52 +0530208
209/*
210 * fd.io coding-style-patch-verification: ON
211 *
212 * Local Variables:
213 * eval: (c-set-style "gnu")
214 * End:
215 */