/* * Copyright (c) 2013-2018, Arm Limited and affiliates. * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef DHCP_SERVICE_API_H_ #define DHCP_SERVICE_API_H_ #include /** * \file dhcp_service_api.h * \brief DHCP server connection interfaces * * \section dhcp-service DHCP Service Instance * - dhcp_service_init(), Initializes a DHCP service. * - dhcp_service_delete(), Removes the DHCP service. * * \section dhcp-msg DHCP Service Messages * - dhcp_service_send_req(), Sends out DHCP request messages. * - dhcp_service_send_resp(), Sends out DHCP response messages. * * \section dhcp-tim DHCP Service Timers (retry timers) * - dhcp_service_send_req(), Sends out DHCP request messages. * - dhcp_service_set_retry_timers(), Sets the retransmission parameters. * - dhcp_service_req_remove(), Stops retrying and retransmissions. * - dhcp_service_timer_tick(), Indicates if a timeout occurred. * */ /** Defines Debug Trace String for DHCP service */ #define DHCP_SERVICE_API_TRACE_STR "DHcS" /* * Return values for callbacks */ /** Message belongs to someone else. */ #define RET_MSG_NOT_MINE 0 /** Message is handled. */ #define RET_MSG_ACCEPTED 1 /** Message is not the final one and needs to hold on a bit. */ #define RET_MSG_WAIT_ANOTHER -1 /** Message is unexpected or corrupted. */ #define RET_MSG_CORRUPTED -2 /** \name DHCP options */ ///@{ #define TX_OPT_NONE 0x00 /**< No options. */ #define TX_OPT_USE_SHORT_ADDR 0x01 /**< Use short addresses. */ #define TX_OPT_MULTICAST_HOP_LIMIT_64 0x02 /**< Use multicast hop limit of 64. */ ///@} /** * /enum dhcp_instance_type * /brief DHCP instance types. */ typedef enum dhcp_instance_type { DHCP_INSTANCE_CLIENT, DHCP_INSTANCE_SERVER, DHCP_INTANCE_RELAY_AGENT } dhcp_instance_type_e; /** * \brief DHCP Service receive callback. * * When the DHCP service receives a DHCP message it will go through a list of registered DHCP services instances * until some instance acknowledges that the message belongs to it. * \param instance_id An instance of registered server. * \param msg_tr_id The message transaction ID. * \param msg_name Message type. * \param msg_ptr An allocated message pointer. Should not deallocate unless RET_MSG_ACCEPTED returned (then responsibility of client). * \param msg_len The length of the message. * * Return values * \return RET_MSG_ACCEPTED - Message is handled. * \return RET_MSG_CORRUPTED - Message is corrupted. * \return RET_MSG_NOT_MINE - Message belongs to someone else. */ typedef int (dhcp_service_receive_req_cb)(uint16_t instance_id, uint32_t msg_tr_id, uint8_t msg_name, uint8_t *msg_ptr, uint16_t msg_len); /** * \brief DHCP Service Message Response callback. * * When the DHCP service receives a response to a DHCP message, this callback receives it. * * \param instance_id An instance of a registered server. * \param ptr A pointer for the client object. * \param msg_name Message type. * \param msg_ptr An allocated message pointer. Should not deallocate unless RET_MSG_ACCEPTED returned (then responsibility of client). * \param msg_len The length of the message. * * Return values * \return RET_MSG_ACCEPTED - Message is handled * \return RET_MSG_WAIT_ANOTHER - This message was not the last one for this transaction and a new reply is expected. */ typedef int (dhcp_service_receive_resp_cb)(uint16_t instance_id, void *ptr, uint8_t msg_name, uint8_t *msg_ptr, uint16_t msg_len); /** * \brief Neighbour table update callback this is called for DHCP relay and server link local responses. * * \param interface interface where address is got * \param ll_addr Link local which neighbour must be guarantee. * */ typedef void (dhcp_relay_neighbour_cb)(int8_t interface, uint8_t ll_addr[static 16]); /** * \brief Initialize a new DHCP service instance. * * Creates and shares the socket for other DHCP services. * * \param interface_id Interface for the new DHCP instance. * \param instance_type The type of the new DHCP instance. * \param receive_req_cb A callback function to receive DHCP messages. * * \return Instance ID that is used to identify the service. */ uint16_t dhcp_service_init(int8_t interface_id, dhcp_instance_type_e instance_type, dhcp_service_receive_req_cb *receive_req_cb); /** * \brief Enable DHCPv6 Relay Agent to server. * * * \param instance The instance ID of the registered server. * \param server_address global server IPv6 address */ void dhcp_service_relay_instance_enable(uint16_t instance, uint8_t *server_address); /** * \brief Enable DHCPv6 Relay Agent to add interface ID option to relay frame. Default is disabled. * * * \param instance The instance ID of the registered server. * \param enable true add interface option */ void dhcp_service_relay_interface_id_option_enable(uint16_t instance, bool enable); /** * \brief Get DHCPv6 Relay Agent address pointer. * * \param instance The instance ID of the registered server. * * \return NULL when address is not available * { */ uint8_t *dhcp_service_relay_global_addres_get(uint16_t instance); /** * \brief Deletes a server instance. * * Removes all data related to this instance. * * \param instance The instance ID of the registered server. */ void dhcp_service_delete(uint16_t instance); /** * \brief Sends a DHCP response message. * * \param msg_tr_id The message transaction ID. * \param options Options for this request. * \param msg_ptr An allocated message pointer. Should not deallocate unless RET_MSG_ACCEPTED returned (then responsibility of client). * \param msg_len The length of the message. * * \return 0, if everything went fine. * \return -1, if error occurred. */ int dhcp_service_send_resp(uint32_t msg_tr_id, uint8_t options, uint8_t *msg_ptr, uint16_t msg_len); /** * \brief Sends DHCP request message. * * Service takes care of retransmissions. * * \param instance_id The instance ID of the registered server. * \param options Options for this request. * \param ptr A void pointer to the client object. * \param addr The address of the server. * \param msg_ptr An allocated message pointer. This pointer is the responsibility of the service after this call. * \param msg_len The length of the message. * \param receive_resp_cb Callback pointer * * \return Transaction ID of the DHCP transaction * \return 0, if error occurred. */ uint32_t dhcp_service_send_req(uint16_t instance_id, uint8_t options, void *ptr, const uint8_t addr[static 16], uint8_t *msg_ptr, uint16_t msg_len, dhcp_service_receive_resp_cb *receive_resp_cb); /** * \brief Setting retransmission parameters. * * Sets the retransmission parameters for this transaction. * * \param msg_tr_id The message transaction ID. * \param timeout_init An initial timeout value. * \param timeout_max The maximum timeout value when initial timeout is doubled with every retry. * \param retrans_max The maximum number of retries after which an error is received. * */ void dhcp_service_set_retry_timers(uint32_t msg_tr_id, uint16_t timeout_init, uint16_t timeout_max, uint8_t retrans_max); /** * \brief Update DHCP service server address to active tx process. * * \param msg_tr_id The message transaction ID. * \param server_address New destination address to server / relay Agent. * */ void dhcp_service_update_server_address(uint32_t msg_tr_id, uint8_t *server_address); /** * \brief Stops transactions for a message (retransmissions). * * Clears off sending retransmissions for a particular message transaction by finding it via its message transaction ID. * * \param msg_tr_id The message transaction ID. * */ void dhcp_service_req_remove(uint32_t msg_tr_id); /** * \brief Stops transactions for a messages (retransmissions). * * Clears off sending retransmissions for a particular message transaction by finding it via its message class pointer. * * \param msg_class_ptr The message class pointer. * */ void dhcp_service_req_remove_all(void *msg_class_ptr); /** * \brief Timer tick function for retransmissions. * * Retransmission timer ticks should be increased with 100ms interval, if necessary. One tick is one millisecond. * */ bool dhcp_service_timer_tick(uint16_t ticks); /** * \brief Register callback which is called when Relay or server RX direct message. * * \param interface_id Interface id for registed callback. * \param notify_cb callback pointer * * \return 0, if everything went fine. * \return -1, if error occurred. */ int dhcp_service_link_local_rx_cb_set(int8_t interface_id, dhcp_relay_neighbour_cb *notify_cb); #endif //DHCP_SERVICE_API_H_