From a43a18ac2d82bed452d18030f577abcb73a749f3 Mon Sep 17 00:00:00 2001 From: Tommaso Pecorella Date: Sat, 30 Nov 2019 20:56:38 +0100 Subject: [PATCH] Lr-wpan should use RFC 4944 scheme, i.e., use a PseudoMac48: PanId:00:00:NodeId --- src/lr-wpan/model/lr-wpan-net-device.cc | 74 +++++++++++++++++++-- src/lr-wpan/test/lr-wpan-ack-test.cc | 4 +- src/sixlowpan/model/sixlowpan-net-device.cc | 50 +++++++------- 3 files changed, 96 insertions(+), 32 deletions(-) diff --git a/src/lr-wpan/model/lr-wpan-net-device.cc b/src/lr-wpan/model/lr-wpan-net-device.cc index 9980981ac..4524e0eac 100644 --- a/src/lr-wpan/model/lr-wpan-net-device.cc +++ b/src/lr-wpan/model/lr-wpan-net-device.cc @@ -251,14 +251,53 @@ void LrWpanNetDevice::SetAddress (Address address) { NS_LOG_FUNCTION (this); - m_mac->SetShortAddress (Mac16Address::ConvertFrom (address)); + if (Mac16Address::IsMatchingType (address)) + { + m_mac->SetShortAddress (Mac16Address::ConvertFrom (address)); + } + else if (Mac48Address::IsMatchingType (address)) + { + uint8_t buf[6]; + Mac48Address addr = Mac48Address::ConvertFrom (address); + addr.CopyTo (buf); + Mac16Address addr16; + addr16.CopyFrom (buf+4); + m_mac->SetShortAddress (addr16); + uint16_t panId; + panId = buf[0]; + panId <<= 8; + panId |= buf[1]; + m_mac->SetPanId (panId); + } + else + { + NS_ABORT_MSG ("LrWpanNetDevice::SetAddress - address is not of a compatible type"); + } } Address LrWpanNetDevice::GetAddress (void) const { NS_LOG_FUNCTION (this); - return m_mac->GetShortAddress (); + + if (m_mac->GetShortAddress () == Mac16Address ("00:00")) + { + return m_mac->GetExtendedAddress (); + } + uint8_t buf[6]; + + uint16_t panId = m_mac->GetPanId (); + buf[0] = panId >> 8; + // Make sure the U/L bit is set + buf[0] |= 0x02; + buf[1] = panId & 0xff; + buf[2] = 0; + buf[3] = 0; + m_mac->GetShortAddress ().CopyTo (buf+4); + + Mac48Address pseudoAddress; + pseudoAddress.CopyFrom (buf); + return pseudoAddress; } bool @@ -304,7 +343,19 @@ Address LrWpanNetDevice::GetBroadcast (void) const { NS_LOG_FUNCTION (this); - return Mac16Address ("ff:ff"); + uint8_t buf[6]; + + uint16_t panId = m_mac->GetPanId (); + buf[0] = panId >> 8; + buf[1] = panId & 0xff; + buf[2] = 0; + buf[3] = 0; + buf[4] = 0xff; + buf[5] = 0xff; + + Mac48Address pseudoAddress; + pseudoAddress.CopyFrom (buf); + return pseudoAddress; } bool @@ -351,7 +402,7 @@ LrWpanNetDevice::GetMulticast (Ipv6Address addr) const // newaddr.CopyFrom(buf2); // return newaddr; - return Mac16Address ("ff:ff"); + return GetBroadcast (); } bool @@ -385,7 +436,20 @@ LrWpanNetDevice::Send (Ptr packet, const Address& dest, uint16_t protoco } McpsDataRequestParams m_mcpsDataRequestParams; - m_mcpsDataRequestParams.m_dstAddr = Mac16Address::ConvertFrom (dest); + + std::cout << "Trying to send a packet to " << dest << std::endl; + Mac16Address dst16; + if (Mac48Address::IsMatchingType (dest)) + { + uint8_t buf[6]; + dest.CopyTo (buf); + dst16.CopyFrom (buf+4); + } + else + { + dst16 = Mac16Address::ConvertFrom (dest); + } + m_mcpsDataRequestParams.m_dstAddr = dst16; m_mcpsDataRequestParams.m_dstAddrMode = SHORT_ADDR; m_mcpsDataRequestParams.m_dstPanId = m_mac->GetPanId (); m_mcpsDataRequestParams.m_srcAddrMode = SHORT_ADDR; diff --git a/src/lr-wpan/test/lr-wpan-ack-test.cc b/src/lr-wpan/test/lr-wpan-ack-test.cc index 4426e983a..79bebbad8 100644 --- a/src/lr-wpan/test/lr-wpan-ack-test.cc +++ b/src/lr-wpan/test/lr-wpan-ack-test.cc @@ -106,7 +106,7 @@ LrWpanAckTestCase::LrWpanAckTestCase () void LrWpanAckTestCase::DataIndication (LrWpanAckTestCase *testCase, Ptr dev, McpsDataIndicationParams params, Ptr p) { - if (dev->GetAddress () == Mac16Address ("00:02")) + if (dev->GetMac ()->GetShortAddress () == Mac16Address ("00:02")) { Ptr p = Create (10); // 10 bytes of dummy data McpsDataRequestParams params; @@ -129,7 +129,7 @@ LrWpanAckTestCase::DataIndication (LrWpanAckTestCase *testCase, Ptr dev, McpsDataConfirmParams params) { - if (dev->GetAddress () == Mac16Address ("00:01")) + if (dev->GetMac ()->GetShortAddress () == Mac16Address ("00:01")) { testCase->m_requestAckTime = Simulator::Now (); } diff --git a/src/sixlowpan/model/sixlowpan-net-device.cc b/src/sixlowpan/model/sixlowpan-net-device.cc index 73226e375..53add63d2 100644 --- a/src/sixlowpan/model/sixlowpan-net-device.cc +++ b/src/sixlowpan/model/sixlowpan-net-device.cc @@ -2082,25 +2082,23 @@ Ipv6Address SixLowPanNetDevice::MakeLinkLocalAddressFromMac (Address const &addr { Ipv6Address ipv6Addr = Ipv6Address::GetAny (); - if (m_forceEtherType && Mac48Address::IsMatchingType (addr)) + if (Mac64Address::IsMatchingType (addr)) + { + ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac64Address::ConvertFrom (addr)); + } + else if (Mac48Address::IsMatchingType (addr)) { ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac48Address::ConvertFrom (addr)); } - else + else if (Mac16Address::IsMatchingType (addr)) { - if (Mac64Address::IsMatchingType (addr)) - { - ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac64Address::ConvertFrom (addr)); - } - else if (Mac16Address::IsMatchingType (addr)) - { - ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac16Address::ConvertFrom (addr)); - } - else if (Mac8Address::IsMatchingType (addr)) - { - ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac8Address::ConvertFrom (addr)); - } + ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac16Address::ConvertFrom (addr)); } + else if (Mac8Address::IsMatchingType (addr)) + { + ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac8Address::ConvertFrom (addr)); + } + if (ipv6Addr.IsAny ()) { NS_ABORT_MSG ("Unknown address type"); @@ -2112,21 +2110,23 @@ Ipv6Address SixLowPanNetDevice::MakeGlobalAddressFromMac (Address const &addr, I { Ipv6Address ipv6Addr = Ipv6Address::GetAny (); - if (m_forceEtherType && Mac48Address::IsMatchingType (addr)) + if (Mac64Address::IsMatchingType (addr)) { - ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac48Address::ConvertFrom (addr), Ipv6Address (prefix) ); + ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac64Address::ConvertFrom (addr), Ipv6Address (prefix) ); } - else + else if (Mac48Address::IsMatchingType (addr)) { - if (Mac64Address::IsMatchingType (addr)) - { - ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac64Address::ConvertFrom (addr), Ipv6Address (prefix)); - } - else if (Mac16Address::IsMatchingType (addr)) - { - ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac16Address::ConvertFrom (addr), Ipv6Address (prefix) ); - } + ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac48Address::ConvertFrom (addr), Ipv6Address (prefix)); } + else if (Mac16Address::IsMatchingType (addr)) + { + ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac16Address::ConvertFrom (addr), Ipv6Address (prefix) ); + } + else if (Mac8Address::IsMatchingType (addr)) + { + ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac8Address::ConvertFrom (addr), Ipv6Address (prefix) ); + } + if (ipv6Addr.IsAny ()) { NS_ABORT_MSG ("Unknown address type");