FD.io VPP  v21.06-3-gbb25fbf28
Vector Packet Processing
dhcp6_packet.h
Go to the documentation of this file.
1 #ifndef included_vnet_dhcp6_packet_h
2 #define included_vnet_dhcp6_packet_h
3 
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  */
34 typedef enum dhcpv6_msg_type_
35 {
50 
51 /* 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 
79 /*
80  * DHCPv6 options types
81  */
82 enum
83 {
84 #define _(a,b,c) DHCPV6_OPTION_##a = b,
86 #undef _
88 };
89 
90 /*
91 * DHCPv6 status codes
92  */
93 enum
94 {
102 };
103 
104 /*
105  * DHCPv6 DUID types
106  */
107 enum
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 */
112 };
113 
114 //Structure for DHCPv6 payload from client
115 typedef struct dhcpv6_hdr_
116 {
117  u8 msg_type; //DHCP msg type
118  u8 xid[3]; //Transaction id
119  u8 data[0];
121 
122 /* *INDENT-OFF* */
123 typedef 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;
133 /* *INDENT-ON* */
134 
135 //Structure for DHCPv6 RELAY-FORWARD and DHCPv6 RELAY-REPLY pkts
136 /* *INDENT-OFF* */
137 typedef 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;
144 /* *INDENT-ON* */
145 
147 {
152 //Generic counters for a packet
153 typedef 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
159 
160 
162 {
171 
172 #define dhcpv6_optlen(opt) clib_net_to_host_u16((opt)->length)
173 
174 /* *INDENT-OFF* */
175 typedef CLIB_PACKED (struct {
176  u16 option;
177  u16 length;
178  u8 data[0];
179 }) dhcpv6_option_t;
180 /* *INDENT-ON* */
181 
182 /* *INDENT-OFF* */
183 typedef CLIB_PACKED (struct {
184  dhcpv6_option_t opt;
185  u16 status_code;
186 }) dhcpv6_status_code_t;
187 /* *INDENT-ON* */
188 
189 /* *INDENT-OFF* */
190 typedef CLIB_PACKED (struct {
191  dhcpv6_option_t opt;
192  u32 int_idx;
193 }) dhcpv6_int_id_t;
194 /* *INDENT-ON* */
195 
196 /* *INDENT-OFF* */
197 typedef CLIB_PACKED (struct {
198  dhcpv6_option_t opt;
199  u8 vss_type;
200  u8 data[0];
201 }) dhcpv6_vss_t;
202 /* *INDENT-ON* */
203 
204 /* *INDENT-OFF* */
205 typedef CLIB_PACKED (struct {
206  dhcpv6_option_t opt;
207  u32 ent_num;
208  u32 rmt_id;
209 }) dhcpv6_rmt_id_t;
210 /* *INDENT-ON* */
211 
212 /* *INDENT-OFF* */
213 typedef 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;
218 /* *INDENT-ON* */
219 
220 typedef 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 
227 typedef 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 
233 typedef CLIB_PACKED (struct
234  {
235  dhcpv6_option_t opt; ip6_address_t addr; u32 preferred;
236  u32 valid;
237  }) dhcpv6_ia_opt_addr_t;
238 
239 typedef CLIB_PACKED (struct
240  {
241  dhcpv6_option_t opt;
242  u16 options[0];
243  }) dhcpv6_oro_t;
244 
245 typedef CLIB_PACKED (struct
246  {
247  dhcpv6_option_t opt; u16 elapsed_10ms;
248  }) dhcpv6_elapsed_t;
249 
250 typedef CLIB_PACKED (struct
251  {
252  dhcpv6_option_t opt; u16 duid_type;
253  u16 hardware_type;
254  }) dhcpv6_duid_t;
255 
256 typedef CLIB_PACKED (struct
257  {
258  dhcpv6_option_t opt; u16 status_code;
259  u8 message[0];
260  }) dhcpv6_status_t;
261 
262 
263 #endif /* included_vnet_dhcp6_packet_h */
264 
265 /*
266  * fd.io coding-style-patch-verification: ON
267  *
268  * Local Variables:
269  * eval: (c-set-style "gnu")
270  * End:
271  */
DHCPV6_RELAY_PKT_DROP_VALIDATION_FAIL
@ DHCPV6_RELAY_PKT_DROP_VALIDATION_FAIL
Definition: dhcp6_packet.h:165
DHCPV6_MSG_REBIND
@ DHCPV6_MSG_REBIND
Definition: dhcp6_packet.h:41
DHCPV6_STATUS_USE_MULTICAST
@ DHCPV6_STATUS_USE_MULTICAST
Definition: dhcp6_packet.h:100
DHCPV6_RELAY_PKT_DROP_REPLY_FROM_CLIENT
@ DHCPV6_RELAY_PKT_DROP_REPLY_FROM_CLIENT
Definition: dhcp6_packet.h:169
dhcpv6_foreach_option
#define dhcpv6_foreach_option
Definition: dhcp6_packet.h:52
DHCPV6_STATUS_NOADDRS_AVAIL
@ DHCPV6_STATUS_NOADDRS_AVAIL
Definition: dhcp6_packet.h:97
DHCPV6_RELAY_PKT_DROP_OPT_INSERT_FAIL
@ DHCPV6_RELAY_PKT_DROP_OPT_INSERT_FAIL
Definition: dhcp6_packet.h:168
dhcpv6_msg_type_t
enum dhcpv6_msg_type_ dhcpv6_msg_type_t
CLIB_PACKED
typedef CLIB_PACKED(struct dhcpv6_relay_ctx_ { dhcpv6_header_t *pkt;u32 pkt_len;u32 dhcpv6_len;u32 if_index;u32 ctx_id;char ctx_name[32+1];u8 dhcp_msg_type;}) dhcpv6_relay_ctx_t
dhcp_stats_counters_::tx_pkts
u64 tx_pkts
Definition: dhcp6_packet.h:156
DHCPV6_STATUS_NOPREFIX_AVAIL
@ DHCPV6_STATUS_NOPREFIX_AVAIL
Definition: dhcp6_packet.h:101
dhcpv6_hdr_::xid
u8 xid[3]
Definition: dhcp6_packet.h:118
DHCPV6_MSG_DECLINE
@ DHCPV6_MSG_DECLINE
Definition: dhcp6_packet.h:44
DHCPV6_STATUS_NOT_ONLINK
@ DHCPV6_STATUS_NOT_ONLINK
Definition: dhcp6_packet.h:99
u16
unsigned short u16
Definition: types.h:57
dhcpv6_hdr_::data
u8 data[0]
Definition: dhcp6_packet.h:119
DHCPV6_MSG_REPLY
@ DHCPV6_MSG_REPLY
Definition: dhcp6_packet.h:42
dhcp_stats_counters_::rx_pkts
u64 rx_pkts
Definition: dhcp6_packet.h:155
addr
vhost_vring_addr_t addr
Definition: vhost_user.h:130
dhcpv6_msg_type_
dhcpv6_msg_type_
Definition: dhcp6_packet.h:34
DHCP_STATS_ACTION_FORWARDED
@ DHCP_STATS_ACTION_FORWARDED
Definition: dhcp6_packet.h:148
DHCPV6_MSG_RELEASE
@ DHCPV6_MSG_RELEASE
Definition: dhcp6_packet.h:43
ip6_packet.h
dhcp_stats_counters_::drops
u64 drops
Definition: dhcp6_packet.h:157
DHCPV6_STATUS_NO_BINDING
@ DHCPV6_STATUS_NO_BINDING
Definition: dhcp6_packet.h:98
DHCPV6_MSG_RECONFIGURE
@ DHCPV6_MSG_RECONFIGURE
Definition: dhcp6_packet.h:45
dhcpv6_header_t
struct dhcpv6_hdr_ dhcpv6_header_t
DHCPV6_MSG_RENEW
@ DHCPV6_MSG_RENEW
Definition: dhcp6_packet.h:40
DHCPV6_MSG_ADVERTISE
@ DHCPV6_MSG_ADVERTISE
Definition: dhcp6_packet.h:37
DHCPV6_RELAY_PKT_DROP_UNKNOWN_OP_INTF
@ DHCPV6_RELAY_PKT_DROP_UNKNOWN_OP_INTF
Definition: dhcp6_packet.h:166
DHCPV6_MSG_INFORMATION_REQUEST
@ DHCPV6_MSG_INFORMATION_REQUEST
Definition: dhcp6_packet.h:46
DHCP_STATS_ACTION_DROPPED
@ DHCP_STATS_ACTION_DROPPED
Definition: dhcp6_packet.h:150
data
u8 data[128]
Definition: ipsec_types.api:92
dhcpv6_hdr_::msg_type
u8 msg_type
Definition: dhcp6_packet.h:117
dhcp_stats_counters_
Definition: dhcp6_packet.h:153
dhcpv6_stats_drop_reason_
dhcpv6_stats_drop_reason_
Definition: dhcp6_packet.h:161
DHCPV6_STATUS_SUCCESS
@ DHCPV6_STATUS_SUCCESS
Definition: dhcp6_packet.h:95
u64
unsigned long u64
Definition: types.h:89
dhcp_stats_action_type_
dhcp_stats_action_type_
Definition: dhcp6_packet.h:146
DHCPV6_RELAY_PKT_DROP_RELAYDISABLE
@ DHCPV6_RELAY_PKT_DROP_RELAYDISABLE
Definition: dhcp6_packet.h:163
u32
unsigned int u32
Definition: types.h:88
options
static struct option options[]
Definition: main.c:52
dhcpv6_hdr_
Definition: dhcp6_packet.h:115
dhcp_stats_counters_t
struct dhcp_stats_counters_ dhcp_stats_counters_t
DHCPV6_MSG_RELAY_FORW
@ DHCPV6_MSG_RELAY_FORW
Definition: dhcp6_packet.h:47
DHCPV6_DUID_LLT
@ DHCPV6_DUID_LLT
Definition: dhcp6_packet.h:109
length
char const int length
Definition: cJSON.h:163
vss_type
vss_type
Definition: dhcp.api:22
DHCPV6_MSG_CONFIRM
@ DHCPV6_MSG_CONFIRM
Definition: dhcp6_packet.h:39
u8
unsigned char u8
Definition: types.h:56
DHCPV6_MSG_SOLICIT
@ DHCPV6_MSG_SOLICIT
Definition: dhcp6_packet.h:36
DHCPV6_STATUS_UNSPEC_FAIL
@ DHCPV6_STATUS_UNSPEC_FAIL
Definition: dhcp6_packet.h:96
DHCPV6_DUID_LL
@ DHCPV6_DUID_LL
Definition: dhcp6_packet.h:111
DHCPV6_MSG_RELAY_REPL
@ DHCPV6_MSG_RELAY_REPL
Definition: dhcp6_packet.h:48
dhcpv6_stats_drop_reason_t
enum dhcpv6_stats_drop_reason_ dhcpv6_stats_drop_reason_t
DHCPV6_OPTION_MAX
@ DHCPV6_OPTION_MAX
Definition: dhcp6_packet.h:87
DHCP_STATS_ACTION_RECEIVED
@ DHCP_STATS_ACTION_RECEIVED
Definition: dhcp6_packet.h:149
DHCPV6_RELAY_PKT_DROP_MAX_HOPS
@ DHCPV6_RELAY_PKT_DROP_MAX_HOPS
Definition: dhcp6_packet.h:164
DHCPV6_MSG_REQUEST
@ DHCPV6_MSG_REQUEST
Definition: dhcp6_packet.h:38
DHCPV6_RELAY_PKT_DROP_BAD_CONTEXT
@ DHCPV6_RELAY_PKT_DROP_BAD_CONTEXT
Definition: dhcp6_packet.h:167
dhcp_stats_action_type_t
enum dhcp_stats_action_type_ dhcp_stats_action_type_t
DHCPV6_DUID_EN
@ DHCPV6_DUID_EN
Definition: dhcp6_packet.h:110
prefix
vl_api_prefix_t prefix
Definition: ip.api:146