mbed-os/features/nanostack/sal-stack-nanostack/source/6LoWPAN/Thread/thread_resolution_client.h

164 lines
6.5 KiB
C

/*
* Copyright (c) 2015-2017, Pelion and affiliates.
* SPDX-License-Identifier: BSD-3-Clause
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/**
* Thread CoAP address resolution client implementation.
*
* This client must be enabled for ROUTER, REED and non-sleepy HOST.
*
*/
#ifndef THREAD_RESOLUTION_CLIENT_H_
#define THREAD_RESOLUTION_CLIENT_H_
#include <ns_types.h>
#define TRACE_GROUP_THREAD_RESOLUTION_CLIENT "TRsC"
/** Notification callback.
*
* callback to inform when unsolicited notification is received
*
* \param interface_id interface id of thread instance
* \param ip_addr IP address from response
* \param loc_addr 16-bit "RLOC" address from response
* \param ml_eid 64-bit extended MAC address from response
*/
typedef void thread_resolution_client_notification_cb(int8_t interface_id, const uint8_t ip_addr[16], uint16_t loc_addr, const uint8_t ml_eid[8]);
/** Resolution response callback.
*
* callback to inform when response to resolution is received
*
* \param interface_id interface id of thread instance
* \param status status of operation 0 success, -1 failed
* \param ip_addr IP address from response
* \param loc_addr 16-bit "RLOC" address from response
* \param last_transaction_time last transaction time from response; 0 if not present
* \param mleid Target MLEID
*
*/
typedef void thread_resolution_client_response_cb(int8_t interface_id, int8_t status, const uint8_t ip_addr[16], uint16_t loc_addr, uint32_t last_transaction_time, uint8_t *mleid);
/** Error callback.
*
* callback to inform when address error is received
*
* \param interface_id interface id of thread instance
* \param ip_addr target IP address from error
* \param ml_eid 64-bit ML-EID from error
*/
typedef void thread_resolution_client_error_cb(int8_t interface_id, const uint8_t ip_addr[16], const uint8_t ml_eid[8]);
#ifdef HAVE_THREAD_NEIGHBOR_DISCOVERY
/** Initialise thread resolution client.
*
* This instance needs to be initialised once for each thread network interface.
* if only one thread instance is supported this is needed to call only once.
*
* \param interface_id interface id of this thread instance.
*/
void thread_resolution_client_init(int8_t interface_id);
/** Delete Thread resolution client.
*
* \param interface_id interface id of this thread instance.
*/
void thread_resolution_client_delete(int8_t interface_id);
/** Set callback pointer for notifications
*
* \param interface_id interface id of this thread instance.
* \param notification_cb callback function
*/
void thread_resolution_client_set_notification_cb(int8_t interface_id, thread_resolution_client_notification_cb notification_cb);
/** Set callback pointer for errors
*
* \param interface_id interface id of this thread instance.
* \param error_cb callback function
*/
void thread_resolution_client_set_error_cb(int8_t interface_id, thread_resolution_client_error_cb error_cb);
/** Initiate address resolution
*
* Intent is that this API should ultimately implement collation of multiple
* replies and selection by time indicators, and it should also implement the
* "retry delay" blockage.
*
* Initial implementation will just be a direct shim to CoAP, and return every
* POSTed response.
*
* \note The callback sets a per-instance callback pointer; it's not possible
* to have different callbacks for multiple ongoing resolutions. Indeed, there
* is currently no transaction state.
*
* \param interface_id interface id of this thread instance.
* \param ip_addr IP address to resolve
* \param resp_cb callback to inform result of the request.
*
* return 0 success (resolution in progress), -1 failure
*/
int thread_resolution_client_resolve(int8_t interface_id, uint8_t ip_addr[16], thread_resolution_client_response_cb *resp_cb);
/** Send an address error message
*
* \param interface_id interface id of this thread instance.
* \param dest_ip_addr address to send error message (unicast or multicast)
* \param target_ip_addr target IP address that is in error
* \param ml_eid ML-EID for error report (routers with different ML-EID are in error)
*/
int thread_resolution_client_address_error(int8_t interface_id, const uint8_t dest_ip_addr[16], const uint8_t target_ip_addr[16], const uint8_t ml_eid[8]);
/** Periodic timer
*
* Called to maintain address query set.
*
* \param interface_id interface id of this thread instance.
* \param seconds number of seconds elapsed since last call (usually 1)
*/
void thread_resolution_client_timer(int8_t interface_id, uint16_t seconds);
#else //HAVE_THREAD_NEIGHBOR_DISCOVERY
#define thread_resolution_client_init(interface_id)
#define thread_resolution_client_delete(interface_id)
#define thread_resolution_client_set_notification_cb(interface_id, notification_cb)
#define thread_resolution_client_set_error_cb(interface_id, error_cb)
#define thread_resolution_client_resolve(interface_id, ip_addr, resp_cb) (-1)
#define thread_resolution_client_address_error(interface_id, dest_ip_addr, target_ip_addr, ml_eid)
#define thread_resolution_client_timer(interface_id, seconds)
#endif //HAVE_THREAD_NEIGHBOR_DISCOVERY
#endif /* THREAD_RESOLUTION_CLIENT_H_ */