blob: 87b6211c214d9353adbd78f8fdd87c87c7bf5af9 [file] [log] [blame]
/*
* Copyright (c) 2016, The OpenThread Authors.
* All rights reserved.
*
* 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.
*/
/**
* @file
* This file includes definitions for the Thread network interface.
*/
#ifndef THREAD_NETIF_HPP_
#define THREAD_NETIF_HPP_
#include <openthread/config.h>
#include <openthread/types.h>
#include "coap/coap.hpp"
#include "coap/coap_secure.hpp"
#include "mac/mac.hpp"
#if OPENTHREAD_ENABLE_TMF_PROXY && OPENTHREAD_FTD
#include "thread/tmf_proxy.hpp"
#endif // OPENTHREAD_ENABLE_TMF_PROXY && OPENTHREAD_FTD
#if OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD
#include "meshcop/commissioner.hpp"
#endif // OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD
#include "meshcop/dataset_manager.hpp"
#if OPENTHREAD_ENABLE_DTLS
#include "meshcop/dtls.hpp"
#endif // OPENTHREAD_ENABLE_DTLS
#if OPENTHREAD_ENABLE_JOINER
#include "meshcop/joiner.hpp"
#endif // OPENTHREAD_ENABLE_JOINER
#include "meshcop/joiner_router.hpp"
#include "meshcop/leader.hpp"
#include "net/dhcp6.hpp"
#include "net/dhcp6_client.hpp"
#include "net/dhcp6_server.hpp"
#include "net/dns_client.hpp"
#include "net/ip6_filter.hpp"
#include "net/netif.hpp"
#include "thread/address_resolver.hpp"
#include "thread/announce_begin_server.hpp"
#include "thread/energy_scan_server.hpp"
#include "thread/network_diagnostic.hpp"
#include "thread/key_manager.hpp"
#include "thread/mesh_forwarder.hpp"
#include "thread/mle.hpp"
#include "thread/mle_router.hpp"
#include "thread/network_data_local.hpp"
#include "thread/panid_query_server.hpp"
#include "utils/child_supervision.hpp"
#if OPENTHREAD_ENABLE_JAM_DETECTION
#include "utils/jam_detector.hpp"
#endif // OPENTHREAD_ENABLE_JAM_DETECTION
namespace ot {
/**
* @addtogroup core-netif
*
* @brief
* This module includes definitions for the Thread network interface.
*
* @{
*/
class ThreadNetif: public Ip6::Netif
{
public:
/**
* This constructor initializes the Thread network interface.
*
* @param[in] aIp6 A reference to the IPv6 network object.
*
*/
ThreadNetif(Ip6::Ip6 &aIp6);
/**
* This method enables the Thread network interface.
*
*/
otError Up(void);
/**
* This method disables the Thread network interface.
*
*/
otError Down(void);
/**
* This method indicates whether or not the Thread network interface is enabled.
*
* @retval TRUE If the Thread network interface is enabled.
* @retval FALSE If the Thread network interface is not enabled.
*
*/
bool IsUp(void) const { return mIsUp; }
/**
* This method retrieves the link address.
*
* @param[out] aAddress A reference to the link address.
*
*/
virtual otError GetLinkAddress(Ip6::LinkAddress &aAddress) const;
/**
* This method submits a message to the network interface.
*
* @param[in] aMessage A reference to the message.
*
* @retval OT_ERROR_NONE Successfully submitted the message to the interface.
*
*/
virtual otError SendMessage(Message &aMessage) { return mMeshForwarder.SendMessage(aMessage); }
/**
* This method performs a route lookup.
*
* @param[in] aSource A reference to the IPv6 source address.
* @param[in] aDestination A reference to the IPv6 destination address.
* @param[out] aPrefixMatch A pointer where the number of prefix match bits for the chosen route is stored.
*
* @retval OT_ERROR_NONE Successfully found a route.
* @retval OT_ERROR_NO_ROUTE Could not find a valid route.
*
*/
virtual otError RouteLookup(const Ip6::Address &aSource, const Ip6::Address &aDestination, uint8_t *aPrefixMatch);
#if OPENTHREAD_FTD || OPENTHREAD_ENABLE_MTD_NETWORK_DIAGNOSTIC
/**
* This method returns a reference to the network diagnostic object.
*
* @returns A reference to the address resolver object.
*
*/
NetworkDiagnostic::NetworkDiagnostic &GetNetworkDiagnostic(void) { return mNetworkDiagnostic; }
#endif // OPENTHREAD_FTD || OPENTHREAD_ENABLE_MTD_NETWORK_DIAGNOSTIC
#if OPENTHREAD_ENABLE_DHCP6_CLIENT
/**
* This method returns a reference to the dhcp client object.
*
* @returns A reference to the dhcp client object.
*
*/
Dhcp6::Dhcp6Client &GetDhcp6Client(void) { return mDhcp6Client; }
#endif // OPENTHREAD_ENABLE_DHCP6_CLIENT
#if OPENTHREAD_ENABLE_DHCP6_SERVER
/**
* This method returns a reference to the dhcp server object.
*
* @returns A reference to the the dhcp server object.
*
*/
Dhcp6::Dhcp6Server &GetDhcp6Server(void) { return mDhcp6Server; }
#endif // OPENTHREAD_ENABLE_DHCP6_SERVER
#if OPENTHREAD_ENABLE_DNS_CLIENT
/**
* This method returns a reference to the dns client object.
*
* @returns A reference to the dns client object.
*
*/
Dns::Client &GetDnsClient(void) { return mDnsClient; }
#endif // OPENTHREAD_ENABLE_DNS_CLIENT
/**
* This method returns a reference to the CoAP object.
*
* @returns A reference to the CoAP object.
*
*/
Coap::Coap &GetCoap(void) { return mCoap; }
/**
* This method returns a reference to the IPv6 filter object.
*
* @returns A reference to the IPv6 filter object.
*
*/
Ip6::Filter &GetIp6Filter(void) { return mIp6Filter; }
/**
* This method returns a reference to the key manager object.
*
* @returns A reference to the key manager object.
*
*/
KeyManager &GetKeyManager(void) { return mKeyManager; }
/**
* This method returns a reference to the lowpan object.
*
* @returns A reference to the lowpan object.
*
*/
Lowpan::Lowpan &GetLowpan(void) { return mLowpan; }
/**
* This method returns a reference to the mac object.
*
* @returns A reference to the mac object.
*
*/
Mac::Mac &GetMac(void) { return mMac; }
/**
* This method returns a reference to the mle object.
*
* @returns A reference to the mle object.
*
*/
Mle::MleRouter &GetMle(void) { return mMleRouter; }
/**
* This method returns a reference to the mesh forwarder object.
*
* @returns A reference to the mesh forwarder object.
*
*/
MeshForwarder &GetMeshForwarder(void) { return mMeshForwarder; }
#if OPENTHREAD_ENABLE_BORDER_ROUTER
/**
* This method returns a reference to the network data local object.
*
* @returns A reference to the network data local object.
*
*/
NetworkData::Local &GetNetworkDataLocal(void) { return mNetworkDataLocal; }
#endif // OPENTHREAD_ENABLE_BORDER_ROUTER
/**
* This method returns a reference to the network data leader object.
*
* @returns A reference to the network data leader object.
*
*/
NetworkData::Leader &GetNetworkDataLeader(void) { return mNetworkDataLeader; }
/**
* This method returns a reference to the active dataset object.
*
* @returns A reference to the active dataset object.
*
*/
MeshCoP::ActiveDataset &GetActiveDataset(void) { return mActiveDataset; }
/**
* This method returns a reference to the pending dataset object.
*
* @returns A reference to the pending dataset object.
*
*/
MeshCoP::PendingDataset &GetPendingDataset(void) { return mPendingDataset; }
#if OPENTHREAD_FTD
/**
* This method returns a reference to the joiner router object.
*
* @returns A reference to the joiner router object.
*
*/
MeshCoP::JoinerRouter &GetJoinerRouter(void) { return mJoinerRouter; }
/**
* This method returns a reference to the MeshCoP leader object.
*
* @returns A reference to the MeshCoP leader object.
*
*/
MeshCoP::Leader &GetLeader(void) { return mLeader; }
/**
* This method returns a reference to the address resolver object.
*
* @returns A reference to the address resolver object.
*
*/
AddressResolver &GetAddressResolver(void) { return mAddressResolver; }
#endif // OPENTHREAD_FTD
/**
* This method returns a reference to the announce begin server object.
*
* @returns A reference to the announce begin server object.
*
*/
AnnounceBeginServer &GetAnnounceBeginServer(void) { return mAnnounceBegin; }
#if OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD
/**
* This method returns a reference to the commissioner object.
*
* @returns A reference to the commissioenr object.
*
*/
MeshCoP::Commissioner &GetCommissioner(void) { return mCommissioner; }
#endif // OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD
#if OPENTHREAD_ENABLE_DTLS
/**
* This method returns a reference to the Dtls object.
*
* @returns A reference to the Dtls object.
*
*/
MeshCoP::Dtls &GetDtls(void) { return mDtls; }
/**
* This method returns a reference to the secure CoAP object.
*
* @returns A reference to the secure CoAP object.
*
*/
Coap::CoapSecure &GetCoapSecure(void) { return mCoapSecure; }
#endif // OPENTHREAD_ENABLE_DTLS
#if OPENTHREAD_ENABLE_JOINER
/**
* This method returns a reference to the joiner object.
*
* @returns A reference to the joiner object.
*
*/
MeshCoP::Joiner &GetJoiner(void) { return mJoiner; }
#endif // OPENTHREAD_ENABLE_JOINER
#if OPENTHREAD_ENABLE_JAM_DETECTION
/**
* This method returns the jam detector instance.
*
* @returns Reference to the JamDetector instance.
*
*/
Utils::JamDetector &GetJamDetector(void) { return mJamDetector; }
#endif // OPENTHREAD_ENABLE_JAM_DETECTION
#if OPENTHREAD_ENABLE_TMF_PROXY && OPENTHREAD_FTD
/**
* This method returns the TMF proxy object.
*
* @returns Reference to the TMF proxy object.
*
*/
TmfProxy &GetTmfProxy(void) { return mTmfProxy; }
#endif // OPENTHREAD_ENABLE_TMF_PROXY && OPENTHREAD_FTD
/**
* This method returns a reference to the child supervisor object.
*
* @returns A reference to the child supervisor object.
*
*/
Utils::ChildSupervisor &GetChildSupervisor(void) { return mChildSupervisor; }
/**
* This method returns a reference to the supervision listener object.
*
* @returns A reference to the supervision listener object.
*
*/
Utils::SupervisionListener &GetSupervisionListener(void) { return mSupervisionListener; }
/**
* This method returns a reference to the energy scan server object.
*
* @returns A reference to the energy scan server object.
*
*/
EnergyScanServer &GetEnergyScanServer(void) { return mEnergyScan; }
/**
* This method returns a reference to the PAN ID query server object.
*
* @returns A reference to the PAN ID query server object.
*
*/
PanIdQueryServer &GetPanIdQueryServer(void) { return mPanIdQuery; }
private:
static otError TmfFilter(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, void *aContext);
Coap::Coap mCoap;
#if OPENTHREAD_ENABLE_DHCP6_CLIENT
Dhcp6::Dhcp6Client mDhcp6Client;
#endif // OPENTHREAD_ENABLE_DHCP6_CLIENT
#if OPENTHREAD_ENABLE_DHCP6_SERVER
Dhcp6::Dhcp6Server mDhcp6Server;
#endif // OPENTHREAD_ENABLE_DHCP6_SERVER
#if OPENTHREAD_ENABLE_DNS_CLIENT
Dns::Client mDnsClient;
#endif // OPENTHREAD_ENABLE_DNS_CLIENT
MeshCoP::ActiveDataset mActiveDataset;
MeshCoP::PendingDataset mPendingDataset;
Ip6::Filter mIp6Filter;
KeyManager mKeyManager;
Lowpan::Lowpan mLowpan;
Mac::Mac mMac;
MeshForwarder mMeshForwarder;
Mle::MleRouter mMleRouter;
#if OPENTHREAD_ENABLE_BORDER_ROUTER
NetworkData::Local mNetworkDataLocal;
#endif // OPENTHREAD_ENABLE_BORDER_ROUTER
NetworkData::Leader mNetworkDataLeader;
#if OPENTHREAD_FTD || OPENTHREAD_ENABLE_MTD_NETWORK_DIAGNOSTIC
NetworkDiagnostic::NetworkDiagnostic mNetworkDiagnostic;
#endif // OPENTHREAD_FTD || OPENTHREAD_ENABLE_MTD_NETWORK_DIAGNOSTIC
bool mIsUp;
#if OPENTHREAD_ENABLE_COMMISSIONER && OPENTHREAD_FTD
MeshCoP::Commissioner mCommissioner;
#endif // OPENTHREAD_ENABLE_COMMISSIONER
#if OPENTHREAD_ENABLE_DTLS
MeshCoP::Dtls mDtls;
Coap::CoapSecure mCoapSecure;
#endif// OPENTHREAD_ENABLE_DTLS
#if OPENTHREAD_ENABLE_JOINER
MeshCoP::Joiner mJoiner;
#endif // OPENTHREAD_ENABLE_JOINER
#if OPENTHREAD_ENABLE_JAM_DETECTION
Utils::JamDetector mJamDetector;
#endif // OPENTHREAD_ENABLE_JAM_DETECTION
#if OPENTHREAD_ENABLE_TMF_PROXY && OPENTHREAD_FTD
TmfProxy mTmfProxy;
#endif // OPENTHREAD_ENABLE_TMF_PROXY && OPENTHREAD_FTD
#if OPENTHREAD_FTD
MeshCoP::JoinerRouter mJoinerRouter;
MeshCoP::Leader mLeader;
AddressResolver mAddressResolver;
#endif // OPENTHREAD_FTD
Utils::ChildSupervisor mChildSupervisor;
Utils::SupervisionListener mSupervisionListener;
AnnounceBeginServer mAnnounceBegin;
PanIdQueryServer mPanIdQuery;
EnergyScanServer mEnergyScan;
};
/**
* This structure represents Thread-specific link information.
*
*/
struct ThreadMessageInfo
{
uint16_t mPanId; ///< Source PAN ID
uint8_t mChannel; ///< 802.15.4 Channel
int8_t mRss; ///< Received Signal Strength in dBm.
uint8_t mLqi; ///< Link Quality Indicator for a received message.
bool mLinkSecurity; ///< Indicates whether or not link security is enabled.
};
/**
* @}
*/
} // namespace ot
#endif // THREAD_NETIF_HPP_