2 * Copyright (c) 2020, The OpenThread Authors.
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.
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.
31 * The file implements the Thread Backbone agent.
34 #include "backbone_router/backbone_agent.hpp"
39 #include <openthread/backbone_router_ftd.h>
41 #include "common/code_utils.hpp"
44 namespace BackboneRouter {
46 BackboneAgent::BackboneAgent(otbr::Ncp::ControllerOpenThread &aNcp)
48 , mBackboneRouterState(OT_BACKBONE_ROUTER_STATE_DISABLED)
49 , mNdProxyManager(aNcp)
53 void BackboneAgent::Init(void)
55 mNcp.On(Ncp::kEventBackboneRouterState, HandleBackboneRouterState, this);
56 mNcp.On(Ncp::kEventBackboneRouterDomainPrefixEvent, HandleBackboneRouterDomainPrefixEvent, this);
57 mNcp.On(Ncp::kEventBackboneRouterNdProxyEvent, HandleBackboneRouterNdProxyEvent, this);
59 mNdProxyManager.Init();
61 HandleBackboneRouterState();
64 void BackboneAgent::HandleBackboneRouterState(void *aContext, int aEvent, va_list aArguments)
66 OT_UNUSED_VARIABLE(aEvent);
67 OT_UNUSED_VARIABLE(aArguments);
69 assert(aEvent == Ncp::kEventBackboneRouterState);
71 static_cast<BackboneAgent *>(aContext)->HandleBackboneRouterState();
74 void BackboneAgent::HandleBackboneRouterState(void)
76 otBackboneRouterState state = otBackboneRouterGetState(mNcp.GetInstance());
77 bool wasPrimary = (mBackboneRouterState == OT_BACKBONE_ROUTER_STATE_PRIMARY);
79 otbrLog(OTBR_LOG_DEBUG, "BackboneAgent: HandleBackboneRouterState: state=%d, mBackboneRouterState=%d", state,
80 mBackboneRouterState);
81 VerifyOrExit(mBackboneRouterState != state);
83 mBackboneRouterState = state;
98 void BackboneAgent::OnBecomePrimary(void)
100 otbrLog(OTBR_LOG_NOTICE, "BackboneAgent: Backbone Router becomes Primary!");
102 if (mDomainPrefix.IsValid())
104 mNdProxyManager.Enable(mDomainPrefix);
108 void BackboneAgent::OnResignPrimary(void)
110 otbrLog(OTBR_LOG_NOTICE, "BackboneAgent: Backbone Router resigns Primary to %s!",
111 StateToString(mBackboneRouterState));
113 mNdProxyManager.Disable();
116 const char *BackboneAgent::StateToString(otBackboneRouterState aState)
118 const char *ret = "Unknown";
122 case OT_BACKBONE_ROUTER_STATE_DISABLED:
125 case OT_BACKBONE_ROUTER_STATE_SECONDARY:
128 case OT_BACKBONE_ROUTER_STATE_PRIMARY:
135 void BackboneAgent::UpdateFdSet(fd_set & aReadFdSet,
136 fd_set & aWriteFdSet,
137 fd_set & aErrorFdSet,
139 timeval &aTimeout) const
141 mNdProxyManager.UpdateFdSet(aReadFdSet, aWriteFdSet, aErrorFdSet, aMaxFd, aTimeout);
144 void BackboneAgent::Process(const fd_set &aReadFdSet, const fd_set &aWriteFdSet, const fd_set &aErrorFdSet)
146 mNdProxyManager.Process(aReadFdSet, aWriteFdSet, aErrorFdSet);
149 void BackboneAgent::HandleBackboneRouterDomainPrefixEvent(void *aContext, int aEvent, va_list aArguments)
151 OT_UNUSED_VARIABLE(aEvent);
153 otBackboneRouterDomainPrefixEvent event;
154 const otIp6Prefix * domainPrefix;
156 assert(aEvent == Ncp::kEventBackboneRouterDomainPrefixEvent);
158 event = static_cast<otBackboneRouterDomainPrefixEvent>(va_arg(aArguments, int));
159 domainPrefix = va_arg(aArguments, const otIp6Prefix *);
160 static_cast<BackboneAgent *>(aContext)->HandleBackboneRouterDomainPrefixEvent(event, domainPrefix);
163 void BackboneAgent::HandleBackboneRouterDomainPrefixEvent(otBackboneRouterDomainPrefixEvent aEvent,
164 const otIp6Prefix * aDomainPrefix)
166 if (aEvent == OT_BACKBONE_ROUTER_DOMAIN_PREFIX_REMOVED)
168 mDomainPrefix.Clear();
172 assert(aDomainPrefix != nullptr);
173 mDomainPrefix.Set(*aDomainPrefix);
174 assert(mDomainPrefix.IsValid());
177 VerifyOrExit(IsPrimary() && aEvent != OT_BACKBONE_ROUTER_DOMAIN_PREFIX_REMOVED);
179 mNdProxyManager.Disable();
180 mNdProxyManager.Enable(mDomainPrefix);
185 void BackboneAgent::HandleBackboneRouterNdProxyEvent(void *aContext, int aEvent, va_list aArguments)
187 OT_UNUSED_VARIABLE(aEvent);
189 otBackboneRouterNdProxyEvent event;
190 const otIp6Address * address;
192 assert(aEvent == Ncp::kEventBackboneRouterNdProxyEvent);
194 event = static_cast<otBackboneRouterNdProxyEvent>(va_arg(aArguments, int));
195 address = va_arg(aArguments, const otIp6Address *);
196 static_cast<BackboneAgent *>(aContext)->HandleBackboneRouterNdProxyEvent(event, address);
199 void BackboneAgent::HandleBackboneRouterNdProxyEvent(otBackboneRouterNdProxyEvent aEvent, const otIp6Address *aDua)
201 mNdProxyManager.HandleBackboneRouterNdProxyEvent(aEvent, aDua);
204 } // namespace BackboneRouter