1*4a64e381SAndroid Build Coastguard Worker /* 2*4a64e381SAndroid Build Coastguard Worker * Copyright (c) 2020, The OpenThread Authors. 3*4a64e381SAndroid Build Coastguard Worker * All rights reserved. 4*4a64e381SAndroid Build Coastguard Worker * 5*4a64e381SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*4a64e381SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met: 7*4a64e381SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 8*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 9*4a64e381SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 10*4a64e381SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 11*4a64e381SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 12*4a64e381SAndroid Build Coastguard Worker * 3. Neither the name of the copyright holder nor the 13*4a64e381SAndroid Build Coastguard Worker * names of its contributors may be used to endorse or promote products 14*4a64e381SAndroid Build Coastguard Worker * derived from this software without specific prior written permission. 15*4a64e381SAndroid Build Coastguard Worker * 16*4a64e381SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17*4a64e381SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*4a64e381SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*4a64e381SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20*4a64e381SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21*4a64e381SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22*4a64e381SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23*4a64e381SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24*4a64e381SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25*4a64e381SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26*4a64e381SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE. 27*4a64e381SAndroid Build Coastguard Worker */ 28*4a64e381SAndroid Build Coastguard Worker 29*4a64e381SAndroid Build Coastguard Worker /** 30*4a64e381SAndroid Build Coastguard Worker * @file 31*4a64e381SAndroid Build Coastguard Worker * This file includes definition for ICMPv6 Neighbor Advertisement (ND) proxy management. 32*4a64e381SAndroid Build Coastguard Worker */ 33*4a64e381SAndroid Build Coastguard Worker 34*4a64e381SAndroid Build Coastguard Worker #ifndef ND_PROXY_HPP_ 35*4a64e381SAndroid Build Coastguard Worker #define ND_PROXY_HPP_ 36*4a64e381SAndroid Build Coastguard Worker 37*4a64e381SAndroid Build Coastguard Worker #include "openthread-br/config.h" 38*4a64e381SAndroid Build Coastguard Worker 39*4a64e381SAndroid Build Coastguard Worker #if OTBR_ENABLE_DUA_ROUTING 40*4a64e381SAndroid Build Coastguard Worker 41*4a64e381SAndroid Build Coastguard Worker #ifdef __APPLE__ 42*4a64e381SAndroid Build Coastguard Worker #define __APPLE_USE_RFC_3542 43*4a64e381SAndroid Build Coastguard Worker #endif 44*4a64e381SAndroid Build Coastguard Worker 45*4a64e381SAndroid Build Coastguard Worker #include <inttypes.h> 46*4a64e381SAndroid Build Coastguard Worker #include <libnetfilter_queue/libnetfilter_queue.h> 47*4a64e381SAndroid Build Coastguard Worker #include <map> 48*4a64e381SAndroid Build Coastguard Worker #include <netinet/in.h> 49*4a64e381SAndroid Build Coastguard Worker #include <set> 50*4a64e381SAndroid Build Coastguard Worker #include <string> 51*4a64e381SAndroid Build Coastguard Worker #include <utility> 52*4a64e381SAndroid Build Coastguard Worker 53*4a64e381SAndroid Build Coastguard Worker #include <openthread/backbone_router_ftd.h> 54*4a64e381SAndroid Build Coastguard Worker 55*4a64e381SAndroid Build Coastguard Worker #include "common/code_utils.hpp" 56*4a64e381SAndroid Build Coastguard Worker #include "common/mainloop.hpp" 57*4a64e381SAndroid Build Coastguard Worker #include "common/types.hpp" 58*4a64e381SAndroid Build Coastguard Worker #include "ncp/rcp_host.hpp" 59*4a64e381SAndroid Build Coastguard Worker 60*4a64e381SAndroid Build Coastguard Worker namespace otbr { 61*4a64e381SAndroid Build Coastguard Worker namespace BackboneRouter { 62*4a64e381SAndroid Build Coastguard Worker 63*4a64e381SAndroid Build Coastguard Worker /** 64*4a64e381SAndroid Build Coastguard Worker * @addtogroup border-router-bbr 65*4a64e381SAndroid Build Coastguard Worker * 66*4a64e381SAndroid Build Coastguard Worker * @brief 67*4a64e381SAndroid Build Coastguard Worker * This module includes definition for ND Proxy manager. 68*4a64e381SAndroid Build Coastguard Worker * 69*4a64e381SAndroid Build Coastguard Worker * @{ 70*4a64e381SAndroid Build Coastguard Worker */ 71*4a64e381SAndroid Build Coastguard Worker 72*4a64e381SAndroid Build Coastguard Worker /** 73*4a64e381SAndroid Build Coastguard Worker * This class implements ND Proxy manager. 74*4a64e381SAndroid Build Coastguard Worker */ 75*4a64e381SAndroid Build Coastguard Worker class NdProxyManager : public MainloopProcessor, private NonCopyable 76*4a64e381SAndroid Build Coastguard Worker { 77*4a64e381SAndroid Build Coastguard Worker public: 78*4a64e381SAndroid Build Coastguard Worker /** 79*4a64e381SAndroid Build Coastguard Worker * This constructor initializes a NdProxyManager instance. 80*4a64e381SAndroid Build Coastguard Worker */ NdProxyManager(otbr::Ncp::RcpHost & aHost,std::string aBackboneInterfaceName)81*4a64e381SAndroid Build Coastguard Worker explicit NdProxyManager(otbr::Ncp::RcpHost &aHost, std::string aBackboneInterfaceName) 82*4a64e381SAndroid Build Coastguard Worker : mHost(aHost) 83*4a64e381SAndroid Build Coastguard Worker , mBackboneInterfaceName(std::move(aBackboneInterfaceName)) 84*4a64e381SAndroid Build Coastguard Worker , mIcmp6RawSock(-1) 85*4a64e381SAndroid Build Coastguard Worker , mUnicastNsQueueSock(-1) 86*4a64e381SAndroid Build Coastguard Worker , mNfqHandler(nullptr) 87*4a64e381SAndroid Build Coastguard Worker , mNfqQueueHandler(nullptr) 88*4a64e381SAndroid Build Coastguard Worker { 89*4a64e381SAndroid Build Coastguard Worker } 90*4a64e381SAndroid Build Coastguard Worker 91*4a64e381SAndroid Build Coastguard Worker /** 92*4a64e381SAndroid Build Coastguard Worker * This method initializes a ND Proxy manager instance. 93*4a64e381SAndroid Build Coastguard Worker */ 94*4a64e381SAndroid Build Coastguard Worker void Init(void); 95*4a64e381SAndroid Build Coastguard Worker 96*4a64e381SAndroid Build Coastguard Worker /** 97*4a64e381SAndroid Build Coastguard Worker * This method enables the ND Proxy manager. 98*4a64e381SAndroid Build Coastguard Worker * 99*4a64e381SAndroid Build Coastguard Worker * @param[in] aDomainPrefix The Domain Prefix. 100*4a64e381SAndroid Build Coastguard Worker */ 101*4a64e381SAndroid Build Coastguard Worker void Enable(const Ip6Prefix &aDomainPrefix); 102*4a64e381SAndroid Build Coastguard Worker 103*4a64e381SAndroid Build Coastguard Worker /** 104*4a64e381SAndroid Build Coastguard Worker * This method disables the ND Proxy manager. 105*4a64e381SAndroid Build Coastguard Worker */ 106*4a64e381SAndroid Build Coastguard Worker void Disable(void); 107*4a64e381SAndroid Build Coastguard Worker 108*4a64e381SAndroid Build Coastguard Worker void Update(MainloopContext &aMainloop) override; 109*4a64e381SAndroid Build Coastguard Worker void Process(const MainloopContext &aMainloop) override; 110*4a64e381SAndroid Build Coastguard Worker 111*4a64e381SAndroid Build Coastguard Worker /** 112*4a64e381SAndroid Build Coastguard Worker * This method handles a Backbone Router ND Proxy event. 113*4a64e381SAndroid Build Coastguard Worker * 114*4a64e381SAndroid Build Coastguard Worker * @param[in] aEvent The Backbone Router ND Proxy event type. 115*4a64e381SAndroid Build Coastguard Worker * @param[in] aDua The Domain Unicast Address of the ND Proxy, or `nullptr` if @p `aEvent` is 116*4a64e381SAndroid Build Coastguard Worker * `OT_BACKBONE_ROUTER_NDPROXY_CLEARED`. 117*4a64e381SAndroid Build Coastguard Worker */ 118*4a64e381SAndroid Build Coastguard Worker void HandleBackboneRouterNdProxyEvent(otBackboneRouterNdProxyEvent aEvent, const otIp6Address *aDua); 119*4a64e381SAndroid Build Coastguard Worker 120*4a64e381SAndroid Build Coastguard Worker /** 121*4a64e381SAndroid Build Coastguard Worker * This method returns if the ND Proxy manager is enabled. 122*4a64e381SAndroid Build Coastguard Worker * 123*4a64e381SAndroid Build Coastguard Worker * @returns If the ND Proxy manager is enabled; 124*4a64e381SAndroid Build Coastguard Worker */ IsEnabled(void) const125*4a64e381SAndroid Build Coastguard Worker bool IsEnabled(void) const { return mIcmp6RawSock >= 0; } 126*4a64e381SAndroid Build Coastguard Worker 127*4a64e381SAndroid Build Coastguard Worker private: 128*4a64e381SAndroid Build Coastguard Worker enum 129*4a64e381SAndroid Build Coastguard Worker { 130*4a64e381SAndroid Build Coastguard Worker kMaxICMP6PacketSize = 1500, ///< Max size of an ICMP6 packet in bytes. 131*4a64e381SAndroid Build Coastguard Worker }; 132*4a64e381SAndroid Build Coastguard Worker 133*4a64e381SAndroid Build Coastguard Worker void SendNeighborAdvertisement(const Ip6Address &aTarget, const Ip6Address &aDst); 134*4a64e381SAndroid Build Coastguard Worker otbrError UpdateMacAddress(void); 135*4a64e381SAndroid Build Coastguard Worker otbrError InitIcmp6RawSocket(void); 136*4a64e381SAndroid Build Coastguard Worker void FiniIcmp6RawSocket(void); 137*4a64e381SAndroid Build Coastguard Worker otbrError InitNetfilterQueue(void); 138*4a64e381SAndroid Build Coastguard Worker void FiniNetfilterQueue(void); 139*4a64e381SAndroid Build Coastguard Worker void ProcessMulticastNeighborSolicition(void); 140*4a64e381SAndroid Build Coastguard Worker void ProcessUnicastNeighborSolicition(void); 141*4a64e381SAndroid Build Coastguard Worker void JoinSolicitedNodeMulticastGroup(const Ip6Address &aTarget) const; 142*4a64e381SAndroid Build Coastguard Worker void LeaveSolicitedNodeMulticastGroup(const Ip6Address &aTarget) const; 143*4a64e381SAndroid Build Coastguard Worker static int HandleNetfilterQueue(struct nfq_q_handle *aNfQueueHandler, 144*4a64e381SAndroid Build Coastguard Worker struct nfgenmsg *aNfMsg, 145*4a64e381SAndroid Build Coastguard Worker struct nfq_data *aNfData, 146*4a64e381SAndroid Build Coastguard Worker void *aContext); 147*4a64e381SAndroid Build Coastguard Worker int HandleNetfilterQueue(struct nfq_q_handle *aNfQueueHandler, struct nfgenmsg *aNfMsg, struct nfq_data *aNfData); 148*4a64e381SAndroid Build Coastguard Worker 149*4a64e381SAndroid Build Coastguard Worker otbr::Ncp::RcpHost &mHost; 150*4a64e381SAndroid Build Coastguard Worker std::string mBackboneInterfaceName; 151*4a64e381SAndroid Build Coastguard Worker std::set<Ip6Address> mNdProxySet; 152*4a64e381SAndroid Build Coastguard Worker uint32_t mBackboneIfIndex; 153*4a64e381SAndroid Build Coastguard Worker int mIcmp6RawSock; 154*4a64e381SAndroid Build Coastguard Worker int mUnicastNsQueueSock; 155*4a64e381SAndroid Build Coastguard Worker struct nfq_handle *mNfqHandler; ///< A pointer to an NFQUEUE handler. 156*4a64e381SAndroid Build Coastguard Worker struct nfq_q_handle *mNfqQueueHandler; ///< A pointer to a newly created queue. 157*4a64e381SAndroid Build Coastguard Worker MacAddress mMacAddress; 158*4a64e381SAndroid Build Coastguard Worker Ip6Prefix mDomainPrefix; 159*4a64e381SAndroid Build Coastguard Worker }; 160*4a64e381SAndroid Build Coastguard Worker 161*4a64e381SAndroid Build Coastguard Worker /** 162*4a64e381SAndroid Build Coastguard Worker * @} 163*4a64e381SAndroid Build Coastguard Worker */ 164*4a64e381SAndroid Build Coastguard Worker 165*4a64e381SAndroid Build Coastguard Worker } // namespace BackboneRouter 166*4a64e381SAndroid Build Coastguard Worker } // namespace otbr 167*4a64e381SAndroid Build Coastguard Worker 168*4a64e381SAndroid Build Coastguard Worker #endif // OTBR_ENABLE_DUA_ROUTING 169*4a64e381SAndroid Build Coastguard Worker #endif // ND_PROXY_HPP_ 170