Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
libDHCPv6.h
00001 /* 00002 * Copyright (c) 2014-2015, 2017-2018, Arm Limited and affiliates. 00003 * SPDX-License-Identifier: Apache-2.0 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); 00006 * you may not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, 00013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 */ 00017 00018 /* 00019 * \file libDHCPv6.h 00020 * \brief Add short description about this file!!! 00021 * 00022 */ 00023 00024 #ifndef LIBDHCPV6_H_ 00025 #define LIBDHCPV6_H_ 00026 00027 #include "ns_list.h" 00028 00029 typedef struct dhcp_duid_options_params { 00030 uint16_t type; 00031 uint16_t duid_length; 00032 uint8_t *duid; 00033 } dhcp_duid_options_params_t; 00034 00035 typedef struct { 00036 uint16_t link_type; 00037 uint32_t link_time; 00038 uint8_t *link_id; 00039 } dhcp_link_options_params_t; 00040 00041 typedef struct { 00042 uint16_t type; 00043 uint16_t len; 00044 uint8_t *msg_ptr; 00045 } dhcp_options_msg_t; 00046 00047 typedef struct { 00048 uint8_t *ipv6Address; 00049 uint32_t validLifeTime; 00050 uint32_t preferredLifeTime; 00051 } dhcp_ia_addressoptions_msg_t; 00052 00053 typedef struct { 00054 uint8_t *requestedAddress; 00055 uint32_t validLifeTime; 00056 uint32_t preferredLifeTime; 00057 } dhcpv6_ia_non_temporal_address_s; 00058 00059 typedef struct { 00060 dhcp_duid_options_params_t clientDUID; 00061 dhcp_duid_options_params_t serverDUID; 00062 uint32_t transaction_ID; 00063 uint32_t iaId; 00064 uint32_t T0; 00065 uint32_t T1; 00066 bool rapidCommit; 00067 } dhcpv6_reply_packet_s; 00068 00069 typedef struct { 00070 uint8_t *vendorData; 00071 uint16_t vendorDataLength; 00072 } dhcpv6_vendor_data_packet_s; 00073 00074 typedef struct { 00075 uint8_t messageType; 00076 uint32_t transActionId; 00077 dhcp_duid_options_params_t clientDUID; 00078 uint32_t iaID; 00079 uint32_t timerT0; 00080 uint32_t timerT1; 00081 uint16_t *requestedOptionList; 00082 uint8_t requestedOptionCnt; 00083 } dhcpv6_solication_base_packet_s; 00084 00085 typedef struct { 00086 uint32_t iaId; 00087 uint32_t T0; 00088 uint32_t T1; 00089 uint8_t *nonTemporalAddress; 00090 uint32_t validLifeTime; 00091 uint32_t preferredValidLifeTime; 00092 } dhcp_ia_non_temporal_params_t; 00093 00094 typedef struct dhcpv6_ia_nontemp_addres_entry_t { 00095 uint32_t validLifetime; 00096 uint32_t preferredTime; 00097 uint8_t addressPrefix[16]; 00098 } dhcpv6_ia_nontemp_addres_entry_t; 00099 00100 00101 typedef struct dhcpv6_client_server_entry_s { 00102 int8_t interfaceId; 00103 uint8_t instanceId; // instance identifying specific client 00104 uint8_t dyn_server_duid_length; 00105 bool useServerAddress; //This indicate 00106 bool iaNonTemporalStructValid; 00107 bool GlobalAddress; 00108 uint8_t server_address[16]; 00109 uint8_t *serverDynamic_DUID; 00110 uint32_t T0; 00111 uint32_t T1; 00112 uint32_t IAID; //Take random for that 00113 uint32_t transActionId; //Client save this and use for get 00114 uint32_t reNewTimer; 00115 dhcp_duid_options_params_t clientDUID; 00116 dhcp_duid_options_params_t serverDUID; 00117 dhcpv6_ia_nontemp_addres_entry_t iaNontemporalAddress; // Dynamical Part 00118 ns_list_link_t link; /*!< List link entry */ 00119 } dhcpv6_client_server_data_t; 00120 00121 typedef NS_LIST_HEAD (dhcpv6_client_server_data_t, link) dhcpv6_client_server_entry_s; 00122 00123 typedef struct dhcpv6_relay_msg { 00124 uint8_t type; 00125 uint8_t hop_limit; 00126 uint8_t *link_address; 00127 uint8_t *peer_address; 00128 dhcp_options_msg_t relay_options; 00129 } dhcpv6_relay_msg_t; 00130 00131 /** UDP Port Number definition */ 00132 #define DHCPV6_SERVER_PORT 547 00133 #define DHCPV6_CLIENT_PORT 546 00134 00135 /** Message type Definition */ 00136 #define DHCPV6_SOLICATION_TYPE 1 00137 #define DHCPV6_ADVERTISMENT_TYPE 2 00138 #define DHCPV6_REQUEST_TYPE 3 00139 #define DHCPV6_RENEW_TYPE 5 00140 #define DHCPV6_REPLY_TYPE 7 00141 #define DHCPV6_RELEASE_TYPE 8 00142 #define DHCPV6_RELAY_FORWARD 12 00143 #define DHCPV6_RELAY_REPLY 13 00144 #define DHCPV6_LEASEQUERY_TYPE 14 00145 #define DHCPV6_LEASEQUERY_REPLY_TYPE 15 00146 00147 /* DHCP timeout values for different messages RFC3315 00148 * LQ from RFC5007 00149 * UPDATE from RFC7083 00150 * 00151 * Timers are 16-bit, and in 1/10s ticks, so times must be <=6553 00152 */ 00153 00154 #define SOL_MAX_DELAY 1 //sec Max delay of first Solicit 00155 #define SOL_TIMEOUT 1 //sec Initial Solicit timeout 00156 #define SOL_MAX_RT 3600 //secs Max Solicit timeout value 00157 #define REQ_TIMEOUT 1 //sec Initial Request timeout 00158 #define REQ_MAX_RT 30 //secs Max Request timeout value 00159 #define REQ_MAX_RC 10 // Max Request retry attempts 00160 #define CNF_MAX_DELAY 1 //sec Max delay of first Confirm 00161 #define CNF_TIMEOUT 1 //sec Initial Confirm timeout 00162 #define CNF_MAX_RT 4 //secs Max Confirm timeout 00163 #define CNF_MAX_RD 10 //secs Max Confirm duration 00164 #define REN_TIMEOUT 10 //secs Initial Renew timeout 00165 #define REN_MAX_RT 600 //secs Max Renew timeout value 00166 #define REB_TIMEOUT 10 //secs Initial Rebind timeout 00167 #define REB_MAX_RT 600 //secs Max Rebind timeout value 00168 #define INF_MAX_DELAY 1 //sec Max delay of first Information-request 00169 #define INF_TIMEOUT 1 //sec Initial Information-request timeout 00170 #define INF_MAX_RT 120 //secs Max Information-request timeout value 00171 #define REL_TIMEOUT 1 //sec Initial Release timeout 00172 #define REL_MAX_RC 5 // MAX Release attempts 00173 #define DEC_TIMEOUT 1 //sec Initial Decline timeout 00174 #define DEC_MAX_RC 5 // Max Decline attempts 00175 #define REC_TIMEOUT 2 //secs Initial Reconfigure timeout 00176 #define REC_MAX_RC 8 // Max Reconfigure attempts 00177 #define HOP_COUNT_LIMIT 32 // Max hop count in a Relay-forward message 00178 #define LQ_TIMEOUT 1 //sec Initial LEASEQUERY timeout 00179 #define LQ_MAX_RT 10 //secs Max LEASEQUERY timeout value 00180 #define LQ_MAX_RC 5 // Max LEASEQUERY retry attempts 00181 00182 00183 00184 #define DHCP_MESSGAGE_MAX_SUPPORTED_OPTIONS 8 00185 00186 #define DHCPV6_ELAPSED_TIME_OPTION 0x0008 00187 #define DHCPV6_ELAPSED_TIME_OPTION_LEN 0x0002 00188 /** Client Identifier part */ 00189 #define DHCPV6_CLIENT_ID_OPTION 0x001 00190 #define DHCPV6_CLIENT_ID_OPTION_LEN 0x000c 00191 /** Client Identifier part End */ 00192 /** Server Identifier Part */ 00193 #define DHCPV6_SERVER_ID_OPTION 0x002 00194 #define DHCPV6_SERVER_ID_OPTION_LEN 0x000c 00195 #define DHCPV6_SERVER_ID_MAC48_OPTION_LEN 0x000a 00196 #define DHCPV6_SERVER_ID_MAC64_OPTION_LEN 0x000c 00197 /** Server Identifier END */ 00198 /** Common for server and Client Identifier option */ 00199 #define DHCPV6_DUID_LINK_LAYER_PLUS_TIME_TYPE 0x0001 00200 #define DHCPV6_DUID_EN_TYPE 0x0002 00201 #define DHCPV6_DUID_LINK_LAYER_TYPE 0x0003 00202 #define DHCPV6_DUID_UUID_TYPE 0x0004 00203 #define DHCPV6_DUID_HARDWARE_IEEE_802_NETWORKS_TYPE 0x0006 00204 #define DHCPV6_DUID_HARDWARE_EUI64_TYPE 0x001b 00205 #define DHCPV6_DUID_HARDWARE_EUI48_TYPE 0x0001 00206 00207 /** Identity Association part */ 00208 #define DHCPV6_IDENTITY_ASSOCIATION_OPTION 0x0003 00209 #define DHCPV6_IDENTITY_ASSOCIATION_OPTION_MIN_LEN 0x000c 00210 00211 #define DHCPV6_IA_ADDRESS_OPTION 0x0005 00212 #define DHCPV6_IA_ADDRESS_OPTION_LEN 0x0018 00213 00214 #define DHCPV6_OPTION_REQUEST_OPTION 0x0006 00215 00216 #define DHCPV6_OPTION_IA_PREFIX_DELEGATION 0x001a 00217 #define DHCPV6_OPTION_IA_PREFIX_DELEGATION_MIN_LENGTH 0x000c 00218 /** Identity Association END */ 00219 00220 #define DHCPV6_OPTION_VENDOR_SPECIFIC_INFO 0x0011 00221 /** SEQUENCYID, RouterIDMask 32-bit*/ 00222 00223 #define DHCPV6_STATUS_CODE_OPTION 0x000d 00224 #define DHCPV6_STATUS_CODE_OPTION_LEN 0x0002 00225 #define DHCPV6_STATUS_NO_ADDR_AVAILABLE_CODE 0x0002 00226 00227 #define DHCPV6_OPTION_RAPID_COMMIT 0x000E //Define Reply for Solication 00228 #define DHCPV6_OPTION_RAPID_COMMIT_LEN 0x0000 00229 00230 #define DHCPV6_OPTION_CLIENT_DATA 0x002d 00231 00232 #define DHCPV6_OPTION_CLT_TIME 0x002e 00233 00234 #define DHCPV6_RELAY_LENGTH 34 00235 #define DHCPV6_OPTION_RELAY 0x0009 00236 00237 00238 00239 /** DHCPv6 client Nontemporal address and server data allocate, free and search */ 00240 dhcpv6_client_server_data_t *libdhcvp6_nontemporalAddress_server_data_allocate(int8_t interfaceId, uint8_t instanceId, uint8_t *nonTemporalPrefix, uint8_t *serverIPv6Address); 00241 void libdhcvp6_nontemporalAddress_server_data_free(dhcpv6_client_server_data_t *removedEntry); 00242 00243 uint32_t libdhcpv6_renew_time_define(dhcpv6_client_server_data_t *addresInfo); 00244 uint32_t libdhcpv6_txid_get(void); 00245 dhcpv6_client_server_data_t *libdhcpv6_nonTemporal_entry_get_by_iaid(uint32_t iaId); 00246 dhcpv6_client_server_data_t *libdhcpv6_nonTemporal_entry_get_by_transactionId(uint32_t txId); 00247 dhcpv6_client_server_data_t *libdhcpv6_nonTemporal_entry_get_by_prefix(int8_t interfaceId, uint8_t *prefix); 00248 dhcpv6_client_server_data_t *libdhcpv6_nonTemporal_entry_get_by_instance(uint8_t instanceId); 00249 dhcpv6_client_server_data_t *libdhcpv6_nonTemporal_validate_class_pointer(void *class_ptr); 00250 uint8_t libdhcpv6_nonTemporal_entry_get_unique_instance_id(void); 00251 00252 00253 /** 00254 * This Function for verify dhcpv6 message payload 00255 * 00256 * \param ptr payload pointer 00257 * \param data_len payload length 00258 * 00259 * return 0 Valid Payload structure 00260 * return <0 Maloformed payload 00261 */ 00262 int libdhcpv6_message_malformed_check(uint8_t *ptr, uint16_t data_len); 00263 00264 int libdhcpv6_message_option_discover(uint8_t *ptr, uint16_t data_len, uint16_t discovered_type, dhcp_options_msg_t *option_info); 00265 00266 /** Static Option sizes */ 00267 #define libdhcpv6_header_size() 4 00268 #define libdhcpv6_ia_address_option_size() 28 00269 #define libdhcpv6_elapsed_time_option_size() 6 00270 #define libdhcpv6_rapid_commit_option_size() 4 00271 #define libdhcvp6_thread_vendor_spesific_option_size() 21 00272 #define libdhcpv6_status_option_size() 6 00273 #define libdhcpv6_client_last_transaction_time_option_size() 8 00274 00275 /** Dynamic Option lengths */ 00276 uint16_t libdhcpv6_duid_option_size(uint16_t duidLength); 00277 uint8_t libdhcpv6_duid_linktype_size(uint16_t linkType); 00278 uint16_t libdhcvp6_request_option_size(uint8_t optionCnt); 00279 uint16_t libdhcpv6_non_temporal_address_size(bool addressDefined); 00280 00281 uint16_t libdhcpv6_solication_message_length(uint16_t clientDUIDLength, bool addressDefined, uint8_t requestOptionCount); 00282 uint16_t libdhcpv6_address_request_message_len(uint16_t clientDUIDLength, uint16_t serverDUIDLength, uint8_t requstOptionCnt, bool add_address); 00283 #ifdef HAVE_DHCPV6_SERVER 00284 uint16_t libdhcpv6_address_reply_message_len(uint16_t clientDUIDLength, uint16_t serverDUIDLength, uint16_t vendorDataLen, bool rapidCommon, bool status); 00285 #else 00286 #define libdhcpv6_address_reply_message_len(clientDUIDLength, serverDUIDLength, vendorDataLen, rapidCommon, status) 0 00287 #endif 00288 00289 uint8_t *libdhcpv6_generic_nontemporal_address_message_write(uint8_t *ptr, dhcpv6_solication_base_packet_s *packet, dhcpv6_ia_non_temporal_address_s *nonTemporalAddress, dhcp_duid_options_params_t *serverLink); 00290 uint8_t *libdhcpv6_reply_message_write(uint8_t *ptr, dhcpv6_reply_packet_s *replyPacket, dhcpv6_ia_non_temporal_address_s *nonTemporalAddress, dhcpv6_vendor_data_packet_s *vendorData); 00291 uint8_t *libdhcpv6_dhcp_relay_msg_write(uint8_t *ptr, uint8_t type, uint8_t hop_limit, uint8_t *peer_addres, uint8_t *link_address); 00292 uint8_t *libdhcpv6_dhcp_option_header_write(uint8_t *ptr, uint16_t length); 00293 00294 int libdhcpv6_get_IA_address(uint8_t *ptr, uint16_t data_length, dhcp_ia_non_temporal_params_t *params); 00295 int libdhcpv6_get_duid_by_selected_type_id_opt(uint8_t *ptr, uint16_t data_length, uint16_t type, dhcp_duid_options_params_t *params); 00296 bool libdhcpv6_duid_length_validate(uint16_t duid_type, uint16_t duid_length); 00297 int libdhcpv6_get_link_address_from_duid(uint8_t *ptr, uint16_t data_length, uint16_t type, dhcp_link_options_params_t *params); 00298 int libdhcpv6_compare_DUID(dhcp_duid_options_params_t *targetId, dhcp_duid_options_params_t *parsedId); 00299 00300 /** 00301 * This Function write dhcpv6 basic header 00302 * 00303 * \param ptr pointer where header will be writed 00304 * \param msgType dhcpv6 message type 00305 * \param transActionId 24-bit unique Transaction ID 00306 * 00307 * return incremented pointer after write 00308 */ 00309 uint8_t *libdhcpv6_header_write(uint8_t *ptr, uint8_t msgType, uint32_t transActionId); 00310 00311 /** 00312 * This Function write dhcpv6 elapsed time option 00313 * 00314 * \param ptr pointer where option will be writed 00315 * \param elapsedTime option elapsed time 00316 * 00317 * return incremented pointer after write 00318 */ 00319 uint8_t *libdhcpv6_elapsed_time_option_write(uint8_t *ptr, uint16_t elapsedTime); 00320 00321 /** 00322 * This Function write dhcpv6 rapid common option 00323 * 00324 * \param ptr pointer where option will be writed 00325 * 00326 * return incremented pointer after write 00327 */ 00328 uint8_t *libdhcpv6_rapid_commit_option_write(uint8_t *ptr); 00329 00330 /** 00331 * This Function write dhcpv6 thread requested vendor spesific data 00332 * 00333 * \param ptr pointer where option will be writed 00334 * \param data Vendor Data 00335 * \param dataLength Vendor Data length 00336 * 00337 * return incremented pointer after write 00338 */ 00339 uint8_t *libdhcvp6_vendor_specific_option_write(uint8_t *ptr, uint8_t *data, uint16_t dataLength); 00340 00341 /** 00342 * This Function write dhcpv6 request option write 00343 * 00344 * \param ptr pointer where option will be writed 00345 * \param optionCnt Option counter for read behind pointer 00346 * \param optionPtr Option list pointer 00347 * return incremented pointer after write 00348 */ 00349 uint8_t *libdhcvp6_request_option_write(uint8_t *ptr, uint8_t optionCnt, uint16_t *optionPtr); 00350 00351 00352 00353 /** 00354 * This Function for Client / Server DUID write for specific link type 00355 * 00356 * \param ptr payload pointer 00357 * \param duidPtr pointer id 00358 * \param duidRole supported values DHCPV6_SERVER_ID_OPTION & DHCPV6_CLIENT_ID_OPTION 00359 * \param linkType supported values DHCPV6_DUID_HARDWARE_EUI64_TYPE & DHCPV6_DUID_HARDWARE_EUI48_TYPE & DHCPV6_DUID_HARDWARE_IEEE_802_NETWORKS_TYPE 00360 * 00361 * return incremented pointer after write 00362 */ 00363 uint8_t *libdhcpv6_duid_option_write(uint8_t *ptr, uint16_t duidRole, const dhcp_duid_options_params_t *duid); 00364 uint8_t *libdhcpv6_ia_address_option_write(uint8_t *ptr, const uint8_t *addressPtr, uint32_t preferredValidLifeTime, uint32_t validLifeTime); 00365 uint8_t *libdhcpv6_identity_association_option_write(uint8_t *ptr, uint32_t iaID, uint32_t TimerT1, uint32_t TimerT2, bool withAddress); 00366 uint8_t *libdhcpv6_identity_association_option_write_with_status(uint8_t *ptr, uint32_t iaID, uint32_t TimerT1, uint32_t TimerT2, uint16_t status); 00367 uint8_t *libdhcpv6_status_code_write(uint8_t *ptr, uint16_t statusCode); 00368 uint8_t *libdhcpv6_prefix_delegation_info_option_write(uint8_t *ptr, uint32_t iaId); 00369 00370 int libdhcpv6_reply_message_option_validate(dhcp_duid_options_params_t *clientId, dhcp_duid_options_params_t *serverId, dhcp_ia_non_temporal_params_t *dhcp_ia_non_temporal_params, uint8_t *ptr, uint16_t data_length); 00371 00372 #ifdef HAVE_DHCPV6_SERVER 00373 int libdhcpv6_renew_message_options_validate(uint8_t *ptr, uint16_t data_length, dhcp_duid_options_params_t *clientLinkData, dhcp_duid_options_params_t *serverLinkData, dhcp_ia_non_temporal_params_t *dhcp_ia_non_temporal_params); 00374 int libdhcpv6_solication_message_options_validate(uint8_t *ptr, uint16_t data_length, dhcp_duid_options_params_t *clientLink, dhcp_ia_non_temporal_params_t *dhcp_ia_non_temporal_params); 00375 #else 00376 #define libdhcpv6_renew_message_options_validate(ptr, data_length, clientLinkData, serverLinkData, dhcp_ia_non_temporal_params) -1 00377 #define libdhcpv6_solication_message_options_validate(ptr, data_length, clientLink, dhcp_ia_non_temporal_params) -1 00378 #endif 00379 int libdhcpv6_advertisment_message_option_validate(dhcp_duid_options_params_t *clientId, dhcp_duid_options_params_t *serverId, dhcp_ia_non_temporal_params_t *dhcp_ia_non_temporal_params, uint8_t *ptr, uint16_t data_length); 00380 bool libdhcpv6_rapid_commit_option_at_packet(uint8_t *ptr, uint16_t length); 00381 bool libdhcpv6_time_elapsed_option_at_packet(uint8_t *ptr, uint16_t length); 00382 bool libdhcpv6_relay_msg_read(uint8_t *ptr, uint16_t length, dhcpv6_relay_msg_t *relay_msg); 00383 00384 #endif /* LIBDHCPV6_H_ */
Generated on Tue Jul 12 2022 13:54:26 by
