Lr-wpan should use RFC 4944 scheme, i.e., use a PseudoMac48:

PanId:00:00:NodeId
This commit is contained in:
Tommaso Pecorella
2019-11-30 20:56:38 +01:00
parent 413b0a42f1
commit a43a18ac2d
3 changed files with 96 additions and 32 deletions

View File

@@ -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> 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;

View File

@@ -106,7 +106,7 @@ LrWpanAckTestCase::LrWpanAckTestCase ()
void
LrWpanAckTestCase::DataIndication (LrWpanAckTestCase *testCase, Ptr<LrWpanNetDevice> dev, McpsDataIndicationParams params, Ptr<Packet> p)
{
if (dev->GetAddress () == Mac16Address ("00:02"))
if (dev->GetMac ()->GetShortAddress () == Mac16Address ("00:02"))
{
Ptr<Packet> p = Create<Packet> (10); // 10 bytes of dummy data
McpsDataRequestParams params;
@@ -129,7 +129,7 @@ LrWpanAckTestCase::DataIndication (LrWpanAckTestCase *testCase, Ptr<LrWpanNetDev
void
LrWpanAckTestCase::DataConfirm (LrWpanAckTestCase *testCase, Ptr<LrWpanNetDevice> dev, McpsDataConfirmParams params)
{
if (dev->GetAddress () == Mac16Address ("00:01"))
if (dev->GetMac ()->GetShortAddress () == Mac16Address ("00:01"))
{
testCase->m_requestAckTime = Simulator::Now ();
}

View File

@@ -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");