1 /* 2 * Copyright (c) 2024, The OpenThread Authors. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 3. Neither the name of the copyright holder nor the 13 * names of its contributors may be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 /** 30 * @file 31 * This file includes definitions of the Infrastructure network interface of otbr-agent. 32 */ 33 34 #ifndef OTBR_AGENT_POSIX_INFRA_IF_HPP_ 35 #define OTBR_AGENT_POSIX_INFRA_IF_HPP_ 36 37 #include <net/if.h> 38 39 #include <vector> 40 41 #include <openthread/ip6.h> 42 43 #include "common/mainloop.hpp" 44 #include "common/types.hpp" 45 46 namespace otbr { 47 48 /** 49 * Host infrastructure network interface module. 50 * 51 * The infrastructure network interface MUST be explicitly set by `SetInfraIf` before the InfraIf module can work. 52 * 53 */ 54 class InfraIf 55 { 56 public: 57 class Dependencies 58 { 59 public: 60 virtual ~Dependencies(void) = default; 61 62 virtual otbrError SetInfraIf(unsigned int aInfraIfIndex, 63 bool aIsRunning, 64 const std::vector<Ip6Address> &aIp6Addresses); 65 virtual otbrError HandleIcmp6Nd(uint32_t aInfraIfIndex, 66 const Ip6Address &aSrcAddress, 67 const uint8_t *aData, 68 uint16_t aDataLen); 69 }; 70 71 InfraIf(Dependencies &aDependencies); 72 73 void Init(void); 74 void Deinit(void); 75 void Process(const MainloopContext &aContext); 76 void UpdateFdSet(MainloopContext &aContext); 77 otbrError SetInfraIf(const char *aIfName); 78 otbrError SendIcmp6Nd(uint32_t aInfraIfIndex, 79 const otIp6Address &aDestAddress, 80 const uint8_t *aBuffer, 81 uint16_t aBufferLength); 82 83 private: 84 static int CreateIcmp6Socket(const char *aInfraIfName); 85 bool IsRunning(const std::vector<Ip6Address> &aAddrs) const; 86 short GetFlags(void) const; 87 std::vector<Ip6Address> GetAddresses(void); 88 static bool HasLinkLocalAddress(const std::vector<Ip6Address> &aAddrs); 89 void ReceiveIcmp6Message(void); 90 #ifdef __linux__ 91 void ReceiveNetlinkMessage(void); 92 #endif 93 94 Dependencies &mDeps; 95 char mInfraIfName[IFNAMSIZ]; 96 unsigned int mInfraIfIndex; 97 #ifdef __linux__ 98 int mNetlinkSocket; 99 #endif 100 int mInfraIfIcmp6Socket; 101 }; 102 103 } // namespace otbr 104 105 #endif // OTBR_AGENT_POSIX_INFRA_IF_HPP_ 106