Add Ipv6Address::MakeAutoconfigured[LinkLocal]Address

This commit is contained in:
Tommaso Pecorella
2019-12-01 14:12:54 +01:00
parent 46ec310396
commit 876372b764
4 changed files with 89 additions and 81 deletions

View File

@@ -361,6 +361,34 @@ Ipv4Address Ipv6Address::GetIpv4MappedAddress() const
return (v4Addr);
}
Ipv6Address Ipv6Address::MakeAutoconfiguredAddress (Address addr, Ipv6Address prefix)
{
Ipv6Address ipv6Addr = Ipv6Address::GetAny ();
if (Mac64Address::IsMatchingType (addr))
{
ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac64Address::ConvertFrom (addr), Ipv6Address (prefix) );
}
else if (Mac48Address::IsMatchingType (addr))
{
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");
}
return ipv6Addr;
}
Ipv6Address Ipv6Address::MakeAutoconfiguredAddress (Mac16Address addr, Ipv6Address prefix)
{
NS_LOG_FUNCTION (addr << prefix);
@@ -370,6 +398,7 @@ Ipv6Address Ipv6Address::MakeAutoconfiguredAddress (Mac16Address addr, Ipv6Addre
addr.CopyTo (buf);
prefix.GetBytes (buf2);
memset (buf2+8, 0, 8);
memcpy (buf2 + 14, buf, 2);
buf2[11] = 0xff;
@@ -425,6 +454,7 @@ Ipv6Address Ipv6Address::MakeAutoconfiguredAddress (Mac8Address addr, Ipv6Addres
buf[0] = 0;
addr.CopyTo (&buf[1]);
prefix.GetBytes (buf2);
memset (buf2+8, 0, 8);
memcpy (buf2 + 14, buf, 2);
buf2[11] = 0xff;
@@ -434,6 +464,34 @@ Ipv6Address Ipv6Address::MakeAutoconfiguredAddress (Mac8Address addr, Ipv6Addres
return ret;
}
Ipv6Address Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Address addr)
{
Ipv6Address ipv6Addr = Ipv6Address::GetAny ();
if (Mac64Address::IsMatchingType (addr))
{
ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac64Address::ConvertFrom (addr));
}
else if (Mac48Address::IsMatchingType (addr))
{
ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac48Address::ConvertFrom (addr));
}
else if (Mac16Address::IsMatchingType (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");
}
return ipv6Addr;
}
Ipv6Address Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac16Address addr)
{
NS_LOG_FUNCTION (addr);

View File

@@ -140,6 +140,17 @@ public:
*/
Ipv4Address GetIpv4MappedAddress () const;
/**
* \brief Make the autoconfigured IPv6 address from a Mac address.
*
* Actually the MAC supported are: Mac8, Mac16, Mac48, and Mac64.
*
* \param addr the MAC address.
* \param prefix the IPv6 prefix
* \return autoconfigured IPv6 address
*/
static Ipv6Address MakeAutoconfiguredAddress (Address addr, Ipv6Address prefix);
/**
* \brief Make the autoconfigured IPv6 address with Mac16Address.
*
@@ -181,6 +192,16 @@ public:
*/
static Ipv6Address MakeAutoconfiguredAddress (Mac8Address addr, Ipv6Address prefix);
/**
* \brief Make the autoconfigured link-local IPv6 address from a Mac address.
*
* Actually the MAC supported are: Mac8, Mac16, Mac48, and Mac64.
*
* \param mac the MAC address.
* \return autoconfigured link-local IPv6 address
*/
static Ipv6Address MakeAutoconfiguredLinkLocalAddress (Address mac);
/**
* \brief Make the autoconfigured link-local IPv6 address with Mac16Address.
*

View File

@@ -552,7 +552,7 @@ SixLowPanNetDevice::CompressLowPanHc1 (Ptr<Packet> packet, Address const &src, A
uint8_t bufTwo[16];
Ipv6Address srcAddr = ipHeader.GetSourceAddress ();
srcAddr.GetBytes (bufOne);
Ipv6Address mySrcAddr = MakeLinkLocalAddressFromMac (src);
Ipv6Address mySrcAddr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src);
NS_LOG_LOGIC ("Checking source compression: " << mySrcAddr << " - " << srcAddr );
@@ -582,7 +582,7 @@ SixLowPanNetDevice::CompressLowPanHc1 (Ptr<Packet> packet, Address const &src, A
Ipv6Address dstAddr = ipHeader.GetDestinationAddress ();
dstAddr.GetBytes (bufOne);
Ipv6Address myDstAddr = MakeLinkLocalAddressFromMac (dst);
Ipv6Address myDstAddr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst);
NS_LOG_LOGIC ("Checking destination compression: " << myDstAddr << " - " << dstAddr );
@@ -675,7 +675,7 @@ SixLowPanNetDevice::DecompressLowPanHc1 (Ptr<Packet> packet, Address const &src,
address[j + 8] = 0;
address[j] = prefix[j];
}
ipHeader.SetSourceAddress ( MakeGlobalAddressFromMac (src, Ipv6Address (address)));
ipHeader.SetSourceAddress (Ipv6Address::MakeAutoconfiguredAddress (src, Ipv6Address (address)));
break;
case SixLowPanHc1::HC1_PCII:
interface = encoding.GetSrcInterface ();
@@ -688,7 +688,7 @@ SixLowPanNetDevice::DecompressLowPanHc1 (Ptr<Packet> packet, Address const &src,
ipHeader.SetSourceAddress ( Ipv6Address (address) );
break;
case SixLowPanHc1::HC1_PCIC:
ipHeader.SetSourceAddress (MakeLinkLocalAddressFromMac (src));
ipHeader.SetSourceAddress (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src));
break;
}
@@ -715,7 +715,7 @@ SixLowPanNetDevice::DecompressLowPanHc1 (Ptr<Packet> packet, Address const &src,
address[j + 8] = 0;
address[j] = prefix[j];
}
ipHeader.SetDestinationAddress ( MakeGlobalAddressFromMac (dst, Ipv6Address (address)));
ipHeader.SetDestinationAddress (Ipv6Address::MakeAutoconfiguredAddress (dst, Ipv6Address (address)));
break;
case SixLowPanHc1::HC1_PCII:
interface = encoding.GetDstInterface ();
@@ -728,7 +728,7 @@ SixLowPanNetDevice::DecompressLowPanHc1 (Ptr<Packet> packet, Address const &src,
ipHeader.SetDestinationAddress ( Ipv6Address (address) );
break;
case SixLowPanHc1::HC1_PCIC:
ipHeader.SetDestinationAddress (MakeLinkLocalAddressFromMac (dst));
ipHeader.SetDestinationAddress (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst));
break;
}
@@ -873,7 +873,7 @@ SixLowPanNetDevice::CompressLowPanIphc (Ptr<Packet> packet, Address const &src,
// Set the Source Address
iphcHeader.SetSrcAddress (srcAddr);
Ipv6Address mySrcAddr = MakeLinkLocalAddressFromMac (src);
Ipv6Address mySrcAddr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src);
NS_LOG_LOGIC ("Checking source compression: " << mySrcAddr << " - " << srcAddr );
if ( mySrcAddr == srcAddr )
@@ -914,7 +914,7 @@ SixLowPanNetDevice::CompressLowPanIphc (Ptr<Packet> packet, Address const &src,
// Set the Destination Address
iphcHeader.SetDstAddress (dstAddr);
Ipv6Address myDstAddr = MakeLinkLocalAddressFromMac (dst);
Ipv6Address myDstAddr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst);
NS_LOG_LOGIC ("Checking destination compression: " << myDstAddr << " - " << dstAddr );
if ( !iphcHeader.GetM () )
@@ -1034,7 +1034,7 @@ SixLowPanNetDevice::DecompressLowPanIphc (Ptr<Packet> packet, Address const &src
{
if ( encoding.GetSam () == SixLowPanIphc::HC_COMPR_0 )
{
ipHeader.SetSourceAddress (MakeLinkLocalAddressFromMac (src));
ipHeader.SetSourceAddress (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src));
}
else
{
@@ -1060,7 +1060,7 @@ SixLowPanNetDevice::DecompressLowPanIphc (Ptr<Packet> packet, Address const &src
{
if ( !encoding.GetM () && encoding.GetDam () == SixLowPanIphc::HC_COMPR_0 )
{
ipHeader.SetDestinationAddress (MakeLinkLocalAddressFromMac (dst));
ipHeader.SetDestinationAddress (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst));
}
else
{
@@ -2078,62 +2078,6 @@ void SixLowPanNetDevice::HandleFragmentsTimeout (FragmentKey key, uint32_t iif)
m_fragmentsTimers.erase (key);
}
Ipv6Address SixLowPanNetDevice::MakeLinkLocalAddressFromMac (Address const &addr)
{
Ipv6Address ipv6Addr = Ipv6Address::GetAny ();
if (Mac64Address::IsMatchingType (addr))
{
ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac64Address::ConvertFrom (addr));
}
else if (Mac48Address::IsMatchingType (addr))
{
ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac48Address::ConvertFrom (addr));
}
else if (Mac16Address::IsMatchingType (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");
}
return ipv6Addr;
}
Ipv6Address SixLowPanNetDevice::MakeGlobalAddressFromMac (Address const &addr, Ipv6Address prefix)
{
Ipv6Address ipv6Addr = Ipv6Address::GetAny ();
if (Mac64Address::IsMatchingType (addr))
{
ipv6Addr = Ipv6Address::MakeAutoconfiguredAddress (Mac64Address::ConvertFrom (addr), Ipv6Address (prefix) );
}
else if (Mac48Address::IsMatchingType (addr))
{
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");
}
return ipv6Addr;
}
}
// namespace ns3

View File

@@ -270,21 +270,6 @@ private:
*/
TracedCallback<DropReason, Ptr<const Packet>, Ptr<SixLowPanNetDevice>, uint32_t> m_dropTrace;
/**
* \brief Make a link-local address from a MAC address.
* \param [in] addr The MAC address.
* \return The IPv6 link-local address.
*/
Ipv6Address MakeLinkLocalAddressFromMac (Address const &addr);
/**
* \brief Make a global address from a MAC address.
* \param [in] addr the MAC address.
* \param [in] prefix The address prefix.
* \return The IPv6 address.
*/
Ipv6Address MakeGlobalAddressFromMac (Address const &addr, Ipv6Address prefix);
/**
* \brief Compress the headers according to HC1 compression.
* \param [in] packet The packet to be compressed.