Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers libDHCPv6.h Source File

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_ */