otError ThreadNetif::Down(void) { VerifyOrExit(mIsUp); #if OPENTHREAD_ENABLE_DTLS mDtls.Stop(); #endif #if OPENTHREAD_ENABLE_DNS_CLIENT mDnsClient.Stop(); #endif #if OPENTHREAD_ENABLE_SNTP_CLIENT mSntpClient.Stop(); #endif mCoap.Stop(); mMleRouter.Disable(); RemoveAllExternalUnicastAddresses(); UnsubscribeAllExternalMulticastAddresses(); UnsubscribeAllRoutersMulticast(); UnsubscribeAllNodesMulticast(); mIsUp = false; GetIp6().RemoveNetif(*this); mMeshForwarder.Stop(); #if OPENTHREAD_ENABLE_CHANNEL_MONITOR GetInstance().GetChannelMonitor().Stop(); #endif GetNotifier().Signal(OT_CHANGED_THREAD_NETIF_STATE); exit: return OT_ERROR_NONE; }
otError ThreadNetif::Up(void) { VerifyOrExit(!mIsUp); // Enable the MAC just in case it was disabled while the Interface was down. mMac.SetEnabled(true); #if OPENTHREAD_ENABLE_CHANNEL_MONITOR GetInstance().GetChannelMonitor().Start(); #endif mMeshForwarder.Start(); GetIp6().AddNetif(*this); mIsUp = true; SubscribeAllNodesMulticast(); mMleRouter.Enable(); mCoap.Start(kCoapUdpPort); #if OPENTHREAD_ENABLE_DNS_CLIENT mDnsClient.Start(); #endif #if OPENTHREAD_ENABLE_SNTP_CLIENT mSntpClient.Start(); #endif GetNotifier().Signal(OT_CHANGED_THREAD_NETIF_STATE); exit: return OT_ERROR_NONE; }
int8_t Routes::Lookup(const Address &aSource, const Address &aDestination) { int8_t maxPrefixMatch = -1; uint8_t prefixMatch; int8_t rval = -1; for (Route *cur = mRoutes; cur; cur = cur->mNext) { prefixMatch = cur->mPrefix.PrefixMatch(aDestination); if (prefixMatch < cur->mPrefixLength) { continue; } if (prefixMatch > cur->mPrefixLength) { prefixMatch = cur->mPrefixLength; } if (maxPrefixMatch > static_cast<int8_t>(prefixMatch)) { continue; } maxPrefixMatch = static_cast<int8_t>(prefixMatch); rval = cur->mInterfaceId; } for (Netif *netif = GetIp6().GetNetifList(); netif; netif = netif->GetNext()) { if (netif->RouteLookup(aSource, aDestination, &prefixMatch) == OT_ERROR_NONE && static_cast<int8_t>(prefixMatch) > maxPrefixMatch) { maxPrefixMatch = static_cast<int8_t>(prefixMatch); rval = netif->GetInterfaceId(); } } return rval; }
otError ThreadNetif::Up(void) { if (!mIsUp) { // Enable the MAC just in case it was disabled while the Interface was down. mMac.SetEnabled(true); GetIp6().AddNetif(*this); mMeshForwarder.Start(); mCoap.Start(kCoapUdpPort); #if OPENTHREAD_ENABLE_DNS_CLIENT mDnsClient.Start(); #endif #if OPENTHREAD_ENABLE_CHANNEL_MONITOR GetInstance().GetChannelMonitor().Start(); #endif mMleRouter.Enable(); mIsUp = true; } return OT_ERROR_NONE; }
otError ThreadNetif::Down(void) { mCoap.Stop(); #if OPENTHREAD_ENABLE_DNS_CLIENT mDnsClient.Stop(); #endif #if OPENTHREAD_ENABLE_CHANNEL_MONITOR GetInstance().GetChannelMonitor().Stop(); #endif mMleRouter.Disable(); mMeshForwarder.Stop(); GetIp6().RemoveNetif(*this); RemoveAllExternalUnicastAddresses(); UnsubscribeAllExternalMulticastAddresses(); mIsUp = false; #if OPENTHREAD_ENABLE_DTLS mDtls.Stop(); #endif return OT_ERROR_NONE; }
otError Udp::SendDatagram(Message &aMessage, MessageInfo &aMessageInfo, IpProto aIpProto) { return GetIp6().SendDatagram(aMessage, aMessageInfo, aIpProto); }
Message *Udp::NewMessage(uint16_t aReserved) { return GetIp6().NewMessage(sizeof(UdpHeader) + aReserved); }
void Mpl::HandleRetransmissionTimer(void) { uint32_t now = TimerMilli::GetNow(); uint32_t nextDelta = 0xffffffff; MplBufferedMessageMetadata messageMetadata; Message *message = mBufferedMessageSet.GetHead(); Message *nextMessage = NULL; while (message != NULL) { nextMessage = message->GetNext(); messageMetadata.ReadFrom(*message); if (messageMetadata.IsLater(now)) { // Calculate the next retransmission time and choose the lowest. if (messageMetadata.GetTransmissionTime() - now < nextDelta) { nextDelta = messageMetadata.GetTransmissionTime() - now; } } else { // Update the number of transmission timer expirations. messageMetadata.SetTransmissionCount(messageMetadata.GetTransmissionCount() + 1); if (messageMetadata.GetTransmissionCount() < GetTimerExpirations()) { Message *messageCopy = message->Clone(message->GetLength() - sizeof(MplBufferedMessageMetadata)); if (messageCopy != NULL) { if (messageMetadata.GetTransmissionCount() > 1) { messageCopy->SetSubType(Message::kSubTypeMplRetransmission); } GetIp6().EnqueueDatagram(*messageCopy); } messageMetadata.GenerateNextTransmissionTime(now, kDataMessageInterval); messageMetadata.UpdateIn(*message); // Check if retransmission time is lower than the current lowest one. if (messageMetadata.GetTransmissionTime() - now < nextDelta) { nextDelta = messageMetadata.GetTransmissionTime() - now; } } else { mBufferedMessageSet.Dequeue(*message); if (messageMetadata.GetTransmissionCount() == GetTimerExpirations()) { if (messageMetadata.GetTransmissionCount() > 1) { message->SetSubType(Message::kSubTypeMplRetransmission); } // Remove the extra metadata from the MPL Data Message. messageMetadata.RemoveFrom(*message); GetIp6().EnqueueDatagram(*message); } else { // Stop retransmitting if the number of timer expirations is already exceeded. message->Free(); } } } message = nextMessage; } if (nextDelta != 0xffffffff) { mRetransmissionTimer.Start(nextDelta); } }
template <> Ip6::Mpl &Instance::Get(void) { return GetIp6().GetMpl(); }
template <> Ip6::Ip6 &Instance::Get(void) { return GetIp6(); }