Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
otError Udp::SendDatagram(Message &aMessage, MessageInfo &aMessageInfo, IpProto aIpProto)
{
    return GetIp6().SendDatagram(aMessage, aMessageInfo, aIpProto);
}
Ejemplo n.º 7
0
Message *Udp::NewMessage(uint16_t aReserved)
{
    return GetIp6().NewMessage(sizeof(UdpHeader) + aReserved);
}
Ejemplo n.º 8
0
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);
    }
}
Ejemplo n.º 9
0
template <> Ip6::Mpl &Instance::Get(void)
{
    return GetIp6().GetMpl();
}
Ejemplo n.º 10
0
template <> Ip6::Ip6 &Instance::Get(void)
{
    return GetIp6();
}