uan: (fixes #2413) Changes in the UAN module to support NS-3 IP stack
This commit is contained in:
@@ -56,7 +56,8 @@ us a note on ns-developers mailing list.</p>
|
||||
<ul>
|
||||
<li> When deserializing Packet contents, <b>Header::Deserialize (Buffer::Iterator start)</b> and <b>Trailer::Deserialize (Buffer::Iterator start)</b> can not successfully deserialize variable-length headers and trailers. New variants of these methods that also include an 'end' parameter are now provided.</li>
|
||||
<li> Ipv[4,6]AddressGenerator can now check if an address is allocated (<b>Ipv[4,6]AddressGenerator::IsAddressAllocated</b>) or a network has some allocated address (<b>Ipv[4,6]AddressGenerator::IsNetworkAllocated</b>).</li>
|
||||
<li> LTE UEs can now use IPv6 to send and receive traffic.
|
||||
<li> LTE UEs can now use IPv6 to send and receive traffic.</li>
|
||||
<li> UAN module now supports IP stack.</li>
|
||||
</ul>
|
||||
<h2>Changes to existing API:</h2>
|
||||
<ul>
|
||||
|
||||
@@ -31,6 +31,7 @@ New user-visible features
|
||||
- (internet) Ipv[4,6]AddressGenerator can now check if an address or a network is allocated.
|
||||
- (internet) Ipv6AddressHelper is now more pedantic but you can use more than one in a script.
|
||||
- (lte) UEs can now use IPv6 to send and receive traffic.
|
||||
- (uan) UAN module now supports IP stack
|
||||
|
||||
Bugs fixed
|
||||
----------
|
||||
|
||||
@@ -104,9 +104,15 @@ Ipv6Address Ipv6AddressHelper::NewAddress (Address addr)
|
||||
Ipv6AddressGenerator::AddAllocated (address);
|
||||
return address;
|
||||
}
|
||||
else if (Mac8Address::IsMatchingType (addr))
|
||||
{
|
||||
Ipv6Address address = Ipv6Address::MakeAutoconfiguredAddress (Mac8Address::ConvertFrom (addr), m_network);
|
||||
Ipv6AddressGenerator::AddAllocated (address);
|
||||
return address;
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_FATAL_ERROR ("Did not pass in a valid Mac Address (16, 48 or 64 bits)");
|
||||
NS_FATAL_ERROR ("Did not pass in a valid Mac Address (8, 16, 48 or 64 bits)");
|
||||
}
|
||||
/* never reached */
|
||||
return Ipv6Address ("::");
|
||||
|
||||
@@ -136,7 +136,7 @@ uint32_t
|
||||
ArpHeader::GetSerializedSize (void) const
|
||||
{
|
||||
NS_LOG_FUNCTION (this);
|
||||
NS_ASSERT((m_macSource.GetLength () == 6) || (m_macSource.GetLength () == 8));
|
||||
NS_ASSERT ((m_macSource.GetLength () == 6) || (m_macSource.GetLength () == 8) || (m_macSource.GetLength () == 1));
|
||||
NS_ASSERT (m_macSource.GetLength () == m_macDest.GetLength ());
|
||||
|
||||
uint32_t length = 16; // Length minus two hardware addresses
|
||||
|
||||
@@ -113,6 +113,12 @@ void Ipv6Interface::DoSetup ()
|
||||
AddAddress (ifaddr);
|
||||
m_linkLocalAddress = ifaddr;
|
||||
}
|
||||
else if (Mac8Address::IsMatchingType (addr))
|
||||
{
|
||||
Ipv6InterfaceAddress ifaddr = Ipv6InterfaceAddress (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac8Address::ConvertFrom (addr)), Ipv6Prefix (64));
|
||||
AddAddress (ifaddr);
|
||||
m_linkLocalAddress = ifaddr;
|
||||
}
|
||||
else
|
||||
{
|
||||
NS_FATAL_ERROR ("IPv6 autoconf for this kind of address not implemented.");
|
||||
|
||||
@@ -415,6 +415,25 @@ Ipv6Address Ipv6Address::MakeAutoconfiguredAddress (Mac64Address addr, Ipv6Addre
|
||||
return ret;
|
||||
}
|
||||
|
||||
Ipv6Address Ipv6Address::MakeAutoconfiguredAddress (Mac8Address addr, Ipv6Address prefix)
|
||||
{
|
||||
NS_LOG_FUNCTION (addr << prefix);
|
||||
Ipv6Address ret;
|
||||
uint8_t buf[2];
|
||||
uint8_t buf2[16];
|
||||
|
||||
buf[0] = 0;
|
||||
addr.CopyTo (&buf[1]);
|
||||
prefix.GetBytes (buf2);
|
||||
|
||||
memcpy (buf2 + 14, buf, 2);
|
||||
buf2[11] = 0xff;
|
||||
buf2[12] = 0xfe;
|
||||
|
||||
ret.Set (buf2);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Ipv6Address Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac16Address addr)
|
||||
{
|
||||
NS_LOG_FUNCTION (addr);
|
||||
@@ -475,6 +494,27 @@ Ipv6Address Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac64Address addr)
|
||||
return ret;
|
||||
}
|
||||
|
||||
Ipv6Address Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac8Address addr)
|
||||
{
|
||||
NS_LOG_FUNCTION (addr);
|
||||
Ipv6Address ret;
|
||||
uint8_t buf[2];
|
||||
uint8_t buf2[16];
|
||||
|
||||
buf[0] = 0;
|
||||
addr.CopyTo (&buf[1]);
|
||||
|
||||
memset (buf2, 0x00, sizeof (buf2));
|
||||
buf2[0] = 0xfe;
|
||||
buf2[1] = 0x80;
|
||||
memcpy (buf2 + 14, buf, 2);
|
||||
buf2[11] = 0xff;
|
||||
buf2[12] = 0xfe;
|
||||
|
||||
ret.Set (buf2);
|
||||
return ret;
|
||||
}
|
||||
|
||||
Ipv6Address Ipv6Address::MakeSolicitedAddress (Ipv6Address addr)
|
||||
{
|
||||
NS_LOG_FUNCTION (addr);
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "ns3/address.h"
|
||||
#include "ns3/ipv4-address.h"
|
||||
#include "ns3/deprecated.h"
|
||||
#include "mac8-address.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -163,6 +164,14 @@ public:
|
||||
*/
|
||||
static Ipv6Address MakeAutoconfiguredAddress (Mac64Address addr, Ipv6Address prefix);
|
||||
|
||||
/**
|
||||
* \brief Make the autoconfigured IPv6 address with Mac8Address.
|
||||
* \param addr the Mac8Address address (8 bits).
|
||||
* \param prefix the IPv6 prefix
|
||||
* \return autoconfigured IPv6 address
|
||||
*/
|
||||
static Ipv6Address MakeAutoconfiguredAddress (Mac8Address addr, Ipv6Address prefix);
|
||||
|
||||
/**
|
||||
* \brief Make the autoconfigured link-local IPv6 address with Mac16Address.
|
||||
* \param mac the MAC address (16 bits).
|
||||
@@ -184,6 +193,13 @@ public:
|
||||
*/
|
||||
static Ipv6Address MakeAutoconfiguredLinkLocalAddress (Mac64Address mac);
|
||||
|
||||
/**
|
||||
* \brief Make the autoconfigured link-local IPv6 address with Mac8Address.
|
||||
* \param mac the MAC address (8 bits).
|
||||
* \return autoconfigured link-local IPv6 address
|
||||
*/
|
||||
static Ipv6Address MakeAutoconfiguredLinkLocalAddress (Mac8Address mac);
|
||||
|
||||
/**
|
||||
* \brief Print this address to the given output stream.
|
||||
*
|
||||
|
||||
@@ -18,83 +18,78 @@
|
||||
* Author: Leonard Tracy <lentracy@gmail.com>
|
||||
*/
|
||||
|
||||
#include "uan-address.h"
|
||||
#include "mac8-address.h"
|
||||
#include "ns3/address.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
UanAddress::UanAddress ()
|
||||
Mac8Address::Mac8Address ()
|
||||
{
|
||||
m_address = 255;
|
||||
}
|
||||
|
||||
UanAddress::UanAddress (uint8_t addr)
|
||||
Mac8Address::Mac8Address (uint8_t addr)
|
||||
: m_address (addr)
|
||||
{
|
||||
}
|
||||
|
||||
UanAddress::~UanAddress ()
|
||||
Mac8Address::~Mac8Address ()
|
||||
{
|
||||
}
|
||||
|
||||
uint8_t
|
||||
UanAddress::GetType (void)
|
||||
Mac8Address::GetType (void)
|
||||
{
|
||||
static uint8_t type = Address::Register ();
|
||||
return type;
|
||||
}
|
||||
|
||||
Address
|
||||
UanAddress::ConvertTo (void) const
|
||||
Mac8Address::ConvertTo (void) const
|
||||
{
|
||||
return Address (GetType (), &m_address, 1);
|
||||
}
|
||||
|
||||
UanAddress
|
||||
UanAddress::ConvertFrom (const Address &address)
|
||||
Mac8Address
|
||||
Mac8Address::ConvertFrom (const Address &address)
|
||||
{
|
||||
NS_ASSERT (IsMatchingType (address));
|
||||
UanAddress uAddr;
|
||||
Mac8Address uAddr;
|
||||
address.CopyTo (&uAddr.m_address);
|
||||
return uAddr;
|
||||
}
|
||||
|
||||
uint8_t
|
||||
UanAddress::GetAsInt (void) const
|
||||
{
|
||||
return m_address;
|
||||
}
|
||||
bool
|
||||
UanAddress::IsMatchingType (const Address &address)
|
||||
Mac8Address::IsMatchingType (const Address &address)
|
||||
{
|
||||
return address.CheckCompatible (GetType (), 1);
|
||||
}
|
||||
|
||||
UanAddress::operator Address () const
|
||||
Mac8Address::operator Address () const
|
||||
{
|
||||
return ConvertTo ();
|
||||
}
|
||||
|
||||
void
|
||||
UanAddress::CopyFrom (const uint8_t *pBuffer)
|
||||
Mac8Address::CopyFrom (const uint8_t *pBuffer)
|
||||
{
|
||||
m_address = *pBuffer;
|
||||
}
|
||||
|
||||
void
|
||||
UanAddress::CopyTo (uint8_t *pBuffer)
|
||||
Mac8Address::CopyTo (uint8_t *pBuffer) const
|
||||
{
|
||||
*pBuffer = m_address;
|
||||
|
||||
}
|
||||
|
||||
UanAddress
|
||||
UanAddress::GetBroadcast ()
|
||||
Mac8Address
|
||||
Mac8Address::GetBroadcast ()
|
||||
{
|
||||
return UanAddress (255);
|
||||
return Mac8Address (255);
|
||||
}
|
||||
UanAddress
|
||||
UanAddress::Allocate ()
|
||||
Mac8Address
|
||||
Mac8Address::Allocate ()
|
||||
{
|
||||
static uint8_t nextAllocated = 0;
|
||||
|
||||
@@ -104,35 +99,35 @@ UanAddress::Allocate ()
|
||||
nextAllocated = 0;
|
||||
}
|
||||
|
||||
return UanAddress (address);
|
||||
return Mac8Address (address);
|
||||
}
|
||||
|
||||
bool
|
||||
operator < (const UanAddress &a, const UanAddress &b)
|
||||
operator < (const Mac8Address &a, const Mac8Address &b)
|
||||
{
|
||||
return a.m_address < b.m_address;
|
||||
}
|
||||
|
||||
bool
|
||||
operator == (const UanAddress &a, const UanAddress &b)
|
||||
operator == (const Mac8Address &a, const Mac8Address &b)
|
||||
{
|
||||
return a.m_address == b.m_address;
|
||||
}
|
||||
|
||||
bool
|
||||
operator != (const UanAddress &a, const UanAddress &b)
|
||||
operator != (const Mac8Address &a, const Mac8Address &b)
|
||||
{
|
||||
return !(a == b);
|
||||
}
|
||||
|
||||
std::ostream&
|
||||
operator<< (std::ostream& os, const UanAddress & address)
|
||||
operator<< (std::ostream& os, const Mac8Address & address)
|
||||
{
|
||||
os << (int) address.m_address;
|
||||
return os;
|
||||
}
|
||||
std::istream&
|
||||
operator>> (std::istream& is, UanAddress & address)
|
||||
operator>> (std::istream& is, Mac8Address & address)
|
||||
{
|
||||
uint8_t x;
|
||||
is >> x;
|
||||
@@ -18,18 +18,20 @@
|
||||
* Author: Leonard Tracy <lentracy@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef UAN_ADDRESS_H
|
||||
#define UAN_ADDRESS_H
|
||||
#ifndef MAC8_ADDRESS_H
|
||||
#define MAC8_ADDRESS_H
|
||||
|
||||
#include "ns3/address.h"
|
||||
#include <iostream>
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
class Address;
|
||||
|
||||
/**
|
||||
* \ingroup uan
|
||||
* \ingroup network
|
||||
*
|
||||
* A class used for addressing UAN MAC's.
|
||||
* A class used for addressing MAC8 MAC's.
|
||||
*
|
||||
* This implementation uses a simple 8 bit flat addressing scheme.
|
||||
* It is unlikely that perceived underwater networks will soon
|
||||
@@ -37,33 +39,33 @@ namespace ns3 {
|
||||
* - the ocean is big), so this should provide adequate addressing
|
||||
* for most applications.
|
||||
*/
|
||||
class UanAddress
|
||||
class Mac8Address
|
||||
{
|
||||
public:
|
||||
/** Constructor */
|
||||
UanAddress ();
|
||||
Mac8Address ();
|
||||
/**
|
||||
* Create UanAddress object with address addr.
|
||||
* Create Mac8Address object with address addr.
|
||||
*
|
||||
* \param addr Byte address to assign to this address.
|
||||
*/
|
||||
UanAddress (uint8_t addr);
|
||||
Mac8Address (uint8_t addr);
|
||||
/** Destructor */
|
||||
virtual ~UanAddress ();
|
||||
virtual ~Mac8Address ();
|
||||
|
||||
/**
|
||||
* Convert a generic address to a UanAddress.
|
||||
* Convert a generic address to a Mac8Address.
|
||||
*
|
||||
* \param address Address to convert to UAN address.
|
||||
* \return UanAddress from Address.
|
||||
* \param address Address to convert to Mac8Address address.
|
||||
* \return Mac8Address from Address.
|
||||
*/
|
||||
static UanAddress ConvertFrom (const Address &address);
|
||||
static Mac8Address ConvertFrom (const Address &address);
|
||||
|
||||
/**
|
||||
* Check that a generic Address is compatible with UanAddress.
|
||||
* Check that a generic Address is compatible with Mac8Address.
|
||||
*
|
||||
* \param address Address to test.
|
||||
* \return True if address given is consistant with UanAddress.
|
||||
* \return True if address given is consistant with Mac8Address.
|
||||
*/
|
||||
static bool IsMatchingType (const Address &address);
|
||||
|
||||
@@ -86,38 +88,31 @@ public:
|
||||
*
|
||||
* \param pBuffer
|
||||
*/
|
||||
void CopyTo (uint8_t *pBuffer);
|
||||
|
||||
/**
|
||||
* Convert to integer.
|
||||
*
|
||||
* \return 8 bit integer version of address.
|
||||
*/
|
||||
uint8_t GetAsInt (void) const;
|
||||
void CopyTo (uint8_t *pBuffer) const;
|
||||
|
||||
/**
|
||||
* Get the broadcast address (255).
|
||||
*
|
||||
* \return Broadcast address.
|
||||
*/
|
||||
static UanAddress GetBroadcast (void);
|
||||
static Mac8Address GetBroadcast (void);
|
||||
|
||||
/**
|
||||
* Allocates UanAddress from 0-254
|
||||
* Allocates Mac8Address from 0-254
|
||||
*
|
||||
* Will wrap back to 0 if more than 254 are allocated.
|
||||
* Excludes the broadcast address.
|
||||
*
|
||||
* \return The next sequential UanAddress.
|
||||
* \return The next sequential Mac8Address.
|
||||
*/
|
||||
static UanAddress Allocate ();
|
||||
static Mac8Address Allocate ();
|
||||
|
||||
|
||||
private:
|
||||
uint8_t m_address; //!< The address.
|
||||
|
||||
/**
|
||||
* Get the UanAddress type.
|
||||
* Get the Mac8Address type.
|
||||
*
|
||||
* \return The type value.
|
||||
*/
|
||||
@@ -129,13 +124,13 @@ private:
|
||||
*/
|
||||
Address ConvertTo (void) const;
|
||||
|
||||
friend bool operator < (const UanAddress &a, const UanAddress &b);
|
||||
friend bool operator == (const UanAddress &a, const UanAddress &b);
|
||||
friend bool operator != (const UanAddress &a, const UanAddress &b);
|
||||
friend std::ostream& operator<< (std::ostream& os, const UanAddress & address);
|
||||
friend std::istream& operator>> (std::istream& is, UanAddress & address);
|
||||
friend bool operator < (const Mac8Address &a, const Mac8Address &b);
|
||||
friend bool operator == (const Mac8Address &a, const Mac8Address &b);
|
||||
friend bool operator != (const Mac8Address &a, const Mac8Address &b);
|
||||
friend std::ostream& operator<< (std::ostream& os, const Mac8Address & address);
|
||||
friend std::istream& operator>> (std::istream& is, Mac8Address & address);
|
||||
|
||||
}; // class UanAddress
|
||||
}; // class Mac8Address
|
||||
|
||||
|
||||
/**
|
||||
@@ -145,7 +140,7 @@ private:
|
||||
* \param b Second address to compare.
|
||||
* \return True if a < b.
|
||||
*/
|
||||
bool operator < (const UanAddress &a, const UanAddress &b);
|
||||
bool operator < (const Mac8Address &a, const Mac8Address &b);
|
||||
|
||||
/**
|
||||
* Address comparison, equalit.
|
||||
@@ -154,7 +149,7 @@ bool operator < (const UanAddress &a, const UanAddress &b);
|
||||
* \param b Second address to compare.
|
||||
* \return True if a == b.
|
||||
*/
|
||||
bool operator == (const UanAddress &a, const UanAddress &b);
|
||||
bool operator == (const Mac8Address &a, const Mac8Address &b);
|
||||
|
||||
/**
|
||||
* Address comparison, unequal.
|
||||
@@ -163,7 +158,7 @@ bool operator == (const UanAddress &a, const UanAddress &b);
|
||||
* \param b Second address to compare.
|
||||
* \return True if a != b.
|
||||
*/
|
||||
bool operator != (const UanAddress &a, const UanAddress &b);
|
||||
bool operator != (const Mac8Address &a, const Mac8Address &b);
|
||||
|
||||
/**
|
||||
* Write \pname{address} to stream \pname{os} as 8 bit integer.
|
||||
@@ -172,7 +167,7 @@ bool operator != (const UanAddress &a, const UanAddress &b);
|
||||
* \param address The address
|
||||
* \return The output stream.
|
||||
*/
|
||||
std::ostream& operator<< (std::ostream& os, const UanAddress & address);
|
||||
std::ostream& operator<< (std::ostream& os, const Mac8Address & address);
|
||||
|
||||
/**
|
||||
* Read \pname{address} from stream \pname{is} as 8 bit integer.
|
||||
@@ -181,8 +176,8 @@ std::ostream& operator<< (std::ostream& os, const UanAddress & address);
|
||||
* \param address The address variable to set.
|
||||
* \return The input stream.
|
||||
*/
|
||||
std::istream& operator>> (std::istream& is, UanAddress & address);
|
||||
std::istream& operator>> (std::istream& is, Mac8Address & address);
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
#endif /* UAN_ADDRESS_H */
|
||||
#endif /* MAC8_ADDRESS_H */
|
||||
@@ -62,6 +62,7 @@ def build(bld):
|
||||
'utils/packet-socket-server.cc',
|
||||
'utils/packet-data-calculators.cc',
|
||||
'utils/packet-probe.cc',
|
||||
'utils/mac8-address.cc',
|
||||
'helper/application-container.cc',
|
||||
'helper/net-device-container.cc',
|
||||
'helper/node-container.cc',
|
||||
@@ -152,6 +153,7 @@ def build(bld):
|
||||
'utils/pcap-test.h',
|
||||
'utils/packet-data-calculators.h',
|
||||
'utils/packet-probe.h',
|
||||
'utils/mac8-address.h',
|
||||
'helper/application-container.h',
|
||||
'helper/net-device-container.h',
|
||||
'helper/node-container.h',
|
||||
|
||||
@@ -2099,6 +2099,10 @@ Ipv6Address SixLowPanNetDevice::MakeLinkLocalAddressFromMac (Address const &addr
|
||||
{
|
||||
ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac16Address::ConvertFrom (addr));
|
||||
}
|
||||
else if (Mac8Address::IsMatchingType (addr))
|
||||
{
|
||||
ipv6Addr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (Mac8Address::ConvertFrom (addr));
|
||||
}
|
||||
}
|
||||
if (ipv6Addr.IsAny ())
|
||||
{
|
||||
|
||||
@@ -635,7 +635,7 @@ TracedCallbackTypedefTestCase::DoRun (void)
|
||||
empty, empty, empty);
|
||||
|
||||
CHECK (UanNetDevice::RxTxTracedCallback,
|
||||
Ptr<const Packet>, UanAddress,
|
||||
Ptr<const Packet>, Mac8Address,
|
||||
empty, empty, empty);
|
||||
|
||||
CHECK (UanPhy::TracedCallback,
|
||||
|
||||
@@ -244,7 +244,7 @@ UanHelper::Install (Ptr<Node> node, Ptr<UanChannel> channel) const
|
||||
Ptr<UanPhy> phy = m_phy.Create<UanPhy> ();
|
||||
Ptr<UanTransducer> trans = m_transducer.Create<UanTransducer> ();
|
||||
|
||||
mac->SetAddress (UanAddress::Allocate ());
|
||||
mac->SetAddress (Mac8Address::Allocate ());
|
||||
device->SetMac (mac);
|
||||
device->SetPhy (phy);
|
||||
device->SetTransducer (trans);
|
||||
|
||||
@@ -19,7 +19,11 @@
|
||||
*/
|
||||
|
||||
#include "uan-header-common.h"
|
||||
#include "uan-address.h"
|
||||
#include "ns3/mac8-address.h"
|
||||
|
||||
static const uint16_t ARP_PROT_NUMBER = 0x0806;
|
||||
static const uint16_t IPV4_PROT_NUMBER = 0x0800;
|
||||
static const uint16_t IPV6_PROT_NUMBER = 0x86DD;
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -29,13 +33,13 @@ UanHeaderCommon::UanHeaderCommon ()
|
||||
{
|
||||
}
|
||||
|
||||
UanHeaderCommon::UanHeaderCommon (const UanAddress src, const UanAddress dest, uint8_t type)
|
||||
UanHeaderCommon::UanHeaderCommon (const Mac8Address src, const Mac8Address dest, uint8_t type, uint8_t protocolNumber)
|
||||
: Header (),
|
||||
m_dest (dest),
|
||||
m_src (src),
|
||||
m_type (type)
|
||||
m_dest (dest),
|
||||
m_src (src)
|
||||
{
|
||||
|
||||
SetProtocolNumber (protocolNumber);
|
||||
m_uanProtocolBits.m_type = type;
|
||||
}
|
||||
|
||||
TypeId
|
||||
@@ -60,12 +64,12 @@ UanHeaderCommon::~UanHeaderCommon ()
|
||||
|
||||
|
||||
void
|
||||
UanHeaderCommon::SetDest (UanAddress dest)
|
||||
UanHeaderCommon::SetDest (Mac8Address dest)
|
||||
{
|
||||
m_dest = dest;
|
||||
}
|
||||
void
|
||||
UanHeaderCommon::SetSrc (UanAddress src)
|
||||
UanHeaderCommon::SetSrc (Mac8Address src)
|
||||
{
|
||||
m_src = src;
|
||||
}
|
||||
@@ -73,15 +77,30 @@ UanHeaderCommon::SetSrc (UanAddress src)
|
||||
void
|
||||
UanHeaderCommon::SetType (uint8_t type)
|
||||
{
|
||||
m_type = type;
|
||||
m_uanProtocolBits.m_type = type;
|
||||
}
|
||||
|
||||
UanAddress
|
||||
void
|
||||
UanHeaderCommon::SetProtocolNumber (uint16_t protocolNumber)
|
||||
{
|
||||
if (protocolNumber == 0)
|
||||
m_uanProtocolBits.m_protocolNumber = 0;
|
||||
else if (protocolNumber == IPV4_PROT_NUMBER)
|
||||
m_uanProtocolBits.m_protocolNumber = 1;
|
||||
else if (protocolNumber == ARP_PROT_NUMBER)
|
||||
m_uanProtocolBits.m_protocolNumber = 2;
|
||||
else if (protocolNumber == IPV6_PROT_NUMBER)
|
||||
m_uanProtocolBits.m_protocolNumber = 3;
|
||||
else
|
||||
NS_ASSERT_MSG (false, "UanHeaderCommon::SetProtocolNumber(): Protocol not supported");
|
||||
}
|
||||
|
||||
Mac8Address
|
||||
UanHeaderCommon::GetDest (void) const
|
||||
{
|
||||
return m_dest;
|
||||
}
|
||||
UanAddress
|
||||
Mac8Address
|
||||
UanHeaderCommon::GetSrc (void) const
|
||||
{
|
||||
return m_src;
|
||||
@@ -89,7 +108,19 @@ UanHeaderCommon::GetSrc (void) const
|
||||
uint8_t
|
||||
UanHeaderCommon::GetType (void) const
|
||||
{
|
||||
return m_type;
|
||||
return m_uanProtocolBits.m_type;
|
||||
}
|
||||
|
||||
uint16_t
|
||||
UanHeaderCommon::GetProtocolNumber (void) const
|
||||
{
|
||||
if (m_uanProtocolBits.m_protocolNumber == 1)
|
||||
return IPV4_PROT_NUMBER;
|
||||
if (m_uanProtocolBits.m_protocolNumber == 2)
|
||||
return ARP_PROT_NUMBER;
|
||||
if (m_uanProtocolBits.m_protocolNumber == 3)
|
||||
return IPV6_PROT_NUMBER;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Inherrited methods
|
||||
@@ -103,9 +134,15 @@ UanHeaderCommon::GetSerializedSize (void) const
|
||||
void
|
||||
UanHeaderCommon::Serialize (Buffer::Iterator start) const
|
||||
{
|
||||
start.WriteU8 (m_src.GetAsInt ());
|
||||
start.WriteU8 (m_dest.GetAsInt ());
|
||||
start.WriteU8 (m_type);
|
||||
uint8_t address = 0;
|
||||
m_src.CopyTo (&address);
|
||||
start.WriteU8 (address);
|
||||
m_dest.CopyTo (&address);
|
||||
start.WriteU8 (address);
|
||||
char tmp = m_uanProtocolBits.m_type;
|
||||
tmp = tmp << 4;
|
||||
tmp += m_uanProtocolBits.m_protocolNumber;
|
||||
start.WriteU8 (tmp);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
@@ -113,9 +150,11 @@ UanHeaderCommon::Deserialize (Buffer::Iterator start)
|
||||
{
|
||||
Buffer::Iterator rbuf = start;
|
||||
|
||||
m_src = UanAddress (rbuf.ReadU8 ());
|
||||
m_dest = UanAddress (rbuf.ReadU8 ());
|
||||
m_type = rbuf.ReadU8 ();
|
||||
m_src = Mac8Address (rbuf.ReadU8 ());
|
||||
m_dest = Mac8Address (rbuf.ReadU8 ());
|
||||
char tmp = rbuf.ReadU8 ();
|
||||
m_uanProtocolBits.m_type = tmp >> 4;
|
||||
m_uanProtocolBits.m_protocolNumber = tmp;
|
||||
|
||||
return rbuf.GetDistanceFrom (start);
|
||||
}
|
||||
@@ -123,7 +162,7 @@ UanHeaderCommon::Deserialize (Buffer::Iterator start)
|
||||
void
|
||||
UanHeaderCommon::Print (std::ostream &os) const
|
||||
{
|
||||
os << "UAN src=" << m_src << " dest=" << m_dest << " type=" << (uint32_t) m_type;
|
||||
os << "UAN src=" << m_src << " dest=" << m_dest << " type=" << (uint32_t) m_uanProtocolBits.m_type << "Protocol Number=" << (uint32_t) m_uanProtocolBits.m_protocolNumber;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -24,19 +24,37 @@
|
||||
#include "ns3/header.h"
|
||||
#include "ns3/nstime.h"
|
||||
#include "ns3/simulator.h"
|
||||
#include "uan-address.h"
|
||||
#include "ns3/mac8-address.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
struct UanProtocolBits
|
||||
{
|
||||
uint8_t m_type : 4;
|
||||
uint8_t m_protocolNumber : 4;
|
||||
};
|
||||
|
||||
/**
|
||||
* \ingroup uan
|
||||
*
|
||||
* Common packet header fields.
|
||||
*
|
||||
* Includes 1 byte src address, 1 byte dest address,
|
||||
* and a 1 byte type field.
|
||||
* 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
* | src addr | dst addr | prtcl | type |
|
||||
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
*
|
||||
* The type field is protocol specific; see the relevant MAC protocol.
|
||||
*
|
||||
* src addr: The MAC8 source address
|
||||
*
|
||||
* dst addr: The MAC8 destination address
|
||||
*
|
||||
* prtcl: The layer 3 protocol
|
||||
* prtcl=1 (IPv4)
|
||||
* prtcl=2 (ARP)
|
||||
* prtcl=3 (IPv6)
|
||||
*
|
||||
* type: The type field is MAC protocol specific
|
||||
*/
|
||||
class UanHeaderCommon : public Header
|
||||
{
|
||||
@@ -50,8 +68,9 @@ public:
|
||||
* \param src Source address defined in header.
|
||||
* \param dest Destination address defined in header.
|
||||
* \param type Header type.
|
||||
* \param protocolNumber the layer 3 protocol number
|
||||
*/
|
||||
UanHeaderCommon (const UanAddress src, const UanAddress dest, uint8_t type);
|
||||
UanHeaderCommon (const Mac8Address src, const Mac8Address dest, uint8_t type, uint8_t protocolNumber);
|
||||
/** Destructor */
|
||||
virtual ~UanHeaderCommon ();
|
||||
|
||||
@@ -66,13 +85,13 @@ public:
|
||||
*
|
||||
* \param dest Address of destination node.
|
||||
*/
|
||||
void SetDest (UanAddress dest);
|
||||
void SetDest (Mac8Address dest);
|
||||
/**
|
||||
* Set the source address.
|
||||
*
|
||||
* \param src Address of packet source node.
|
||||
*/
|
||||
void SetSrc (UanAddress src);
|
||||
void SetSrc (Mac8Address src);
|
||||
/**
|
||||
* Set the header type.
|
||||
*
|
||||
@@ -80,26 +99,38 @@ public:
|
||||
* \param type The type value.
|
||||
*/
|
||||
void SetType (uint8_t type);
|
||||
/**
|
||||
* Set the packet type.
|
||||
*
|
||||
* Used to indicate the layer 3 protocol
|
||||
* \param protocolNumber The layer 3 protocol number value.
|
||||
*/
|
||||
void SetProtocolNumber (uint16_t protocolNumber);
|
||||
|
||||
/**
|
||||
* Get the destination address.
|
||||
*
|
||||
* \return UanAddress in destination field.
|
||||
* \return Mac8Address in destination field.
|
||||
*/
|
||||
UanAddress GetDest (void) const;
|
||||
Mac8Address GetDest (void) const;
|
||||
/**
|
||||
* Get the source address
|
||||
*
|
||||
* \return UanAddress in source field.
|
||||
* \return Mac8Address in source field.
|
||||
*/
|
||||
UanAddress GetSrc (void) const;
|
||||
Mac8Address GetSrc (void) const;
|
||||
/**
|
||||
* Get the header type value.
|
||||
*
|
||||
* \return value of type field.
|
||||
*/
|
||||
uint8_t GetType (void) const;
|
||||
|
||||
/**
|
||||
* Get the packet type value.
|
||||
*
|
||||
* \return value of protocolNumber field.
|
||||
*/
|
||||
uint16_t GetProtocolNumber (void) const;
|
||||
|
||||
// Inherited methods
|
||||
virtual uint32_t GetSerializedSize (void) const;
|
||||
@@ -108,9 +139,9 @@ public:
|
||||
virtual void Print (std::ostream &os) const;
|
||||
virtual TypeId GetInstanceTypeId (void) const;
|
||||
private:
|
||||
UanAddress m_dest; //!< The destination address.
|
||||
UanAddress m_src; //!< The source address.
|
||||
uint8_t m_type; //!< The type field.
|
||||
Mac8Address m_dest; //!< The destination address.
|
||||
Mac8Address m_src; //!< The source address.
|
||||
UanProtocolBits m_uanProtocolBits; //!< The type and protocol bits
|
||||
|
||||
}; // class UanHeaderCommon
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
|
||||
|
||||
#include "uan-header-rc.h"
|
||||
#include "ns3/mac8-address.h"
|
||||
|
||||
#include <set>
|
||||
|
||||
@@ -391,12 +392,12 @@ UanHeaderRcCts::UanHeaderRcCts ()
|
||||
m_timeStampRts (Seconds (0)),
|
||||
m_retryNo (0),
|
||||
m_delay (Seconds (0)),
|
||||
m_address (UanAddress::GetBroadcast ())
|
||||
m_address (Mac8Address::GetBroadcast ())
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
UanHeaderRcCts::UanHeaderRcCts (uint8_t frameNo, uint8_t retryNo, Time ts, Time delay, UanAddress addr)
|
||||
UanHeaderRcCts::UanHeaderRcCts (uint8_t frameNo, uint8_t retryNo, Time ts, Time delay, Mac8Address addr)
|
||||
: Header (),
|
||||
m_frameNo (frameNo),
|
||||
m_timeStampRts (ts),
|
||||
@@ -450,7 +451,7 @@ UanHeaderRcCts::SetRetryNo (uint8_t no)
|
||||
}
|
||||
|
||||
void
|
||||
UanHeaderRcCts::SetAddress (UanAddress addr)
|
||||
UanHeaderRcCts::SetAddress (Mac8Address addr)
|
||||
{
|
||||
m_address = addr;
|
||||
}
|
||||
@@ -478,7 +479,7 @@ UanHeaderRcCts::GetRetryNo () const
|
||||
return m_retryNo;
|
||||
}
|
||||
|
||||
UanAddress
|
||||
Mac8Address
|
||||
UanHeaderRcCts::GetAddress () const
|
||||
{
|
||||
return m_address;
|
||||
@@ -494,7 +495,9 @@ UanHeaderRcCts::GetSerializedSize (void) const
|
||||
void
|
||||
UanHeaderRcCts::Serialize (Buffer::Iterator start) const
|
||||
{
|
||||
start.WriteU8 (m_address.GetAsInt ());
|
||||
uint8_t address = 0;
|
||||
m_address.CopyTo (&address);
|
||||
start.WriteU8 (address);
|
||||
start.WriteU8 (m_frameNo);
|
||||
start.WriteU8 (m_retryNo);
|
||||
start.WriteU32 ((uint32_t)(m_timeStampRts.GetSeconds () * 1000.0 + 0.5));
|
||||
@@ -505,7 +508,7 @@ uint32_t
|
||||
UanHeaderRcCts::Deserialize (Buffer::Iterator start)
|
||||
{
|
||||
Buffer::Iterator rbuf = start;
|
||||
m_address = UanAddress (rbuf.ReadU8 ());
|
||||
m_address = Mac8Address (rbuf.ReadU8 ());
|
||||
m_frameNo = rbuf.ReadU8 ();
|
||||
m_retryNo = rbuf.ReadU8 ();
|
||||
m_timeStampRts = Seconds ( ( (double) rbuf.ReadU32 ()) / 1000.0 );
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
#include "ns3/header.h"
|
||||
#include "ns3/nstime.h"
|
||||
#include "ns3/uan-address.h"
|
||||
#include "ns3/mac8-address.h"
|
||||
|
||||
#include <set>
|
||||
|
||||
@@ -333,7 +333,7 @@ public:
|
||||
* \param addr Destination of CTS packet.
|
||||
* \note Times are serialized, with ms precission, into 32 bit fields.
|
||||
*/
|
||||
UanHeaderRcCts (uint8_t frameNo, uint8_t retryNo, Time rtsTs, Time delay, UanAddress addr);
|
||||
UanHeaderRcCts (uint8_t frameNo, uint8_t retryNo, Time rtsTs, Time delay, Mac8Address addr);
|
||||
/** Destructor */
|
||||
virtual ~UanHeaderRcCts ();
|
||||
|
||||
@@ -372,7 +372,7 @@ public:
|
||||
*
|
||||
* \param addr The destination address.
|
||||
*/
|
||||
void SetAddress (UanAddress addr);
|
||||
void SetAddress (Mac8Address addr);
|
||||
|
||||
/**
|
||||
* Get the frame number of the RTS being cleared.
|
||||
@@ -404,7 +404,7 @@ public:
|
||||
*
|
||||
* \return The destination address.
|
||||
*/
|
||||
UanAddress GetAddress (void) const;
|
||||
Mac8Address GetAddress (void) const;
|
||||
|
||||
// Inherrited methods
|
||||
virtual uint32_t GetSerializedSize (void) const;
|
||||
@@ -418,7 +418,7 @@ private:
|
||||
Time m_timeStampRts; //!< RX time of RTS packet at gateway.
|
||||
uint8_t m_retryNo; //!< Retry number of received RTS packet.
|
||||
Time m_delay; //!< Delay until transmission.
|
||||
UanAddress m_address; //!< Destination of CTS packet.
|
||||
Mac8Address m_address; //!< Destination of CTS packet.
|
||||
|
||||
}; // class UanHeaderRcCts
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
|
||||
#include "uan-mac-aloha.h"
|
||||
#include "uan-tx-mode.h"
|
||||
#include "uan-address.h"
|
||||
#include "ns3/log.h"
|
||||
#include "uan-phy.h"
|
||||
#include "uan-header-common.h"
|
||||
@@ -77,34 +76,24 @@ UanMacAloha::GetTypeId (void)
|
||||
return tid;
|
||||
}
|
||||
|
||||
Address
|
||||
UanMacAloha::GetAddress (void)
|
||||
{
|
||||
return m_address;
|
||||
}
|
||||
|
||||
void
|
||||
UanMacAloha::SetAddress (UanAddress addr)
|
||||
{
|
||||
m_address=addr;
|
||||
}
|
||||
bool
|
||||
UanMacAloha::Enqueue (Ptr<Packet> packet, const Address &dest, uint16_t protocolNumber)
|
||||
UanMacAloha::Enqueue (Ptr<Packet> packet, uint16_t protocolNumber, const Address &dest)
|
||||
{
|
||||
NS_LOG_DEBUG ("" << Simulator::Now ().GetSeconds () << " MAC " << UanAddress::ConvertFrom (GetAddress ()) << " Queueing packet for " << UanAddress::ConvertFrom (dest));
|
||||
NS_LOG_DEBUG ("" << Simulator::Now ().GetSeconds () << " MAC " << Mac8Address::ConvertFrom (GetAddress ()) << " Queueing packet for " << Mac8Address::ConvertFrom (dest));
|
||||
|
||||
if (!m_phy->IsStateTx ())
|
||||
{
|
||||
UanAddress src = UanAddress::ConvertFrom (GetAddress ());
|
||||
UanAddress udest = UanAddress::ConvertFrom (dest);
|
||||
Mac8Address src = Mac8Address::ConvertFrom (GetAddress ());
|
||||
Mac8Address udest = Mac8Address::ConvertFrom (dest);
|
||||
|
||||
UanHeaderCommon header;
|
||||
header.SetSrc (src);
|
||||
header.SetDest (udest);
|
||||
header.SetType (0);
|
||||
header.SetProtocolNumber (protocolNumber);
|
||||
|
||||
packet->AddHeader (header);
|
||||
m_phy->SendPacket (packet, protocolNumber);
|
||||
m_phy->SendPacket (packet, GetTxModeIndex ());
|
||||
return true;
|
||||
}
|
||||
else
|
||||
@@ -112,7 +101,7 @@ UanMacAloha::Enqueue (Ptr<Packet> packet, const Address &dest, uint16_t protocol
|
||||
}
|
||||
|
||||
void
|
||||
UanMacAloha::SetForwardUpCb (Callback<void, Ptr<Packet>, const UanAddress& > cb)
|
||||
UanMacAloha::SetForwardUpCb (Callback<void, Ptr<Packet>, uint16_t, const Mac8Address&> cb)
|
||||
{
|
||||
m_forUpCb = cb;
|
||||
}
|
||||
@@ -132,9 +121,9 @@ UanMacAloha::RxPacketGood (Ptr<Packet> pkt, double sinr, UanTxMode txMode)
|
||||
pkt->RemoveHeader (header);
|
||||
NS_LOG_DEBUG ("Receiving packet from " << header.GetSrc () << " For " << header.GetDest ());
|
||||
|
||||
if (header.GetDest () == GetAddress () || header.GetDest () == UanAddress::GetBroadcast ())
|
||||
if (header.GetDest () == GetAddress () || header.GetDest () == Mac8Address::GetBroadcast ())
|
||||
{
|
||||
m_forUpCb (pkt, header.GetSrc ());
|
||||
m_forUpCb (pkt, header.GetProtocolNumber (), header.GetSrc ());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -142,14 +131,7 @@ UanMacAloha::RxPacketGood (Ptr<Packet> pkt, double sinr, UanTxMode txMode)
|
||||
void
|
||||
UanMacAloha::RxPacketError (Ptr<Packet> pkt, double sinr)
|
||||
{
|
||||
NS_LOG_DEBUG ("" << Simulator::Now () << " MAC " << UanAddress::ConvertFrom (GetAddress ()) << " Received packet in error with sinr " << sinr);
|
||||
}
|
||||
|
||||
Address
|
||||
UanMacAloha::GetBroadcast (void) const
|
||||
{
|
||||
UanAddress broadcast (255);
|
||||
return broadcast;
|
||||
NS_LOG_DEBUG ("" << Simulator::Now () << " MAC " << Mac8Address::ConvertFrom (GetAddress ()) << " Received packet in error with sinr " << sinr);
|
||||
}
|
||||
|
||||
int64_t
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#define UAN_MAC_ALOHA_H
|
||||
|
||||
#include "uan-mac.h"
|
||||
#include "uan-address.h"
|
||||
#include "ns3/mac8-address.h"
|
||||
|
||||
namespace ns3
|
||||
{
|
||||
@@ -55,22 +55,19 @@ public:
|
||||
|
||||
|
||||
// Inherited methods
|
||||
Address GetAddress (void);
|
||||
virtual void SetAddress (UanAddress addr);
|
||||
virtual bool Enqueue (Ptr<Packet> pkt, const Address &dest, uint16_t protocolNumber);
|
||||
virtual void SetForwardUpCb (Callback<void, Ptr<Packet>, const UanAddress& > cb);
|
||||
virtual bool Enqueue (Ptr<Packet> pkt, uint16_t protocolNumber, const Address &dest);
|
||||
virtual void SetForwardUpCb (Callback<void, Ptr<Packet>, uint16_t, const Mac8Address&> cb);
|
||||
virtual void AttachPhy (Ptr<UanPhy> phy);
|
||||
virtual Address GetBroadcast (void) const;
|
||||
virtual void Clear (void);
|
||||
int64_t AssignStreams (int64_t stream);
|
||||
|
||||
private:
|
||||
/** The MAC address. */
|
||||
UanAddress m_address;
|
||||
Mac8Address m_address;
|
||||
/** PHY layer attached to this MAC. */
|
||||
Ptr<UanPhy> m_phy;
|
||||
/** Forwarding up callback. */
|
||||
Callback<void, Ptr<Packet>, const UanAddress& > m_forUpCb;
|
||||
Callback<void, Ptr<Packet>, uint16_t, const Mac8Address& > m_forUpCb;
|
||||
/** Flag when we've been cleared. */
|
||||
bool m_cleared;
|
||||
|
||||
|
||||
@@ -107,20 +107,8 @@ UanMacCw::GetTypeId (void)
|
||||
return tid;
|
||||
}
|
||||
|
||||
Address
|
||||
UanMacCw::GetAddress ()
|
||||
{
|
||||
return this->m_address;
|
||||
}
|
||||
|
||||
void
|
||||
UanMacCw::SetAddress (UanAddress addr)
|
||||
{
|
||||
m_address = addr;
|
||||
}
|
||||
|
||||
bool
|
||||
UanMacCw::Enqueue (Ptr<Packet> packet, const Address &dest, uint16_t protocolNumber)
|
||||
UanMacCw::Enqueue (Ptr<Packet> packet, uint16_t protocolNumber, const Address &dest)
|
||||
{
|
||||
|
||||
switch (m_state)
|
||||
@@ -148,17 +136,17 @@ UanMacCw::Enqueue (Ptr<Packet> packet, const Address &dest, uint16_t protocolNum
|
||||
NS_ASSERT (!m_pktTx);
|
||||
|
||||
UanHeaderCommon header;
|
||||
header.SetDest (UanAddress::ConvertFrom (dest));
|
||||
header.SetDest (Mac8Address::ConvertFrom (dest));
|
||||
header.SetSrc (m_address);
|
||||
header.SetType (0);
|
||||
packet->AddHeader (header);
|
||||
|
||||
m_enqueueLogger (packet, protocolNumber);
|
||||
m_enqueueLogger (packet, GetTxModeIndex ());
|
||||
|
||||
if (m_phy->IsStateBusy ())
|
||||
{
|
||||
m_pktTx = packet;
|
||||
m_pktTxProt = protocolNumber;
|
||||
m_pktTxProt = GetTxModeIndex ();
|
||||
m_state = CCABUSY;
|
||||
uint32_t cw = (uint32_t) m_rv->GetValue (0,m_cw);
|
||||
m_savedDelayS = Seconds ((double)(cw) * m_slotTime.GetSeconds ());
|
||||
@@ -172,7 +160,7 @@ UanMacCw::Enqueue (Ptr<Packet> packet, const Address &dest, uint16_t protocolNum
|
||||
NS_LOG_DEBUG ("Time " << Simulator::Now ().GetSeconds () << ": Addr " << GetAddress () << ": Enqueuing new packet while idle (sending)");
|
||||
NS_ASSERT (m_phy->GetTransducer ()->GetArrivalList ().size () == 0 && !m_phy->IsStateTx ());
|
||||
m_state = TX;
|
||||
m_phy->SendPacket (packet,protocolNumber);
|
||||
m_phy->SendPacket (packet,GetTxModeIndex ());
|
||||
|
||||
}
|
||||
break;
|
||||
@@ -188,7 +176,7 @@ UanMacCw::Enqueue (Ptr<Packet> packet, const Address &dest, uint16_t protocolNum
|
||||
}
|
||||
|
||||
void
|
||||
UanMacCw::SetForwardUpCb (Callback<void, Ptr<Packet>, const UanAddress&> cb)
|
||||
UanMacCw::SetForwardUpCb (Callback<void, Ptr<Packet>, uint16_t, const Mac8Address&> cb)
|
||||
{
|
||||
m_forwardUpCb = cb;
|
||||
}
|
||||
@@ -202,13 +190,6 @@ UanMacCw::AttachPhy (Ptr<UanPhy> phy)
|
||||
m_phy->RegisterListener (this);
|
||||
}
|
||||
|
||||
Address
|
||||
UanMacCw::GetBroadcast (void) const
|
||||
{
|
||||
return UanAddress::GetBroadcast ();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
UanMacCw::NotifyRxStart (void)
|
||||
{
|
||||
@@ -347,9 +328,9 @@ UanMacCw::PhyRxPacketGood (Ptr<Packet> packet, double sinr, UanTxMode mode)
|
||||
UanHeaderCommon header;
|
||||
packet->RemoveHeader (header);
|
||||
|
||||
if (header.GetDest () == m_address || header.GetDest () == UanAddress::GetBroadcast ())
|
||||
if (header.GetDest () == m_address || header.GetDest () == Mac8Address::GetBroadcast ())
|
||||
{
|
||||
m_forwardUpCb (packet, header.GetSrc ());
|
||||
m_forwardUpCb (packet, header.GetProtocolNumber (), header.GetSrc ());
|
||||
}
|
||||
}
|
||||
void
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
#include "ns3/simulator.h"
|
||||
#include "ns3/uan-phy.h"
|
||||
#include "ns3/uan-tx-mode.h"
|
||||
#include "ns3/uan-address.h"
|
||||
#include "ns3/mac8-address.h"
|
||||
#include "ns3/random-variable-stream.h"
|
||||
|
||||
namespace ns3 {
|
||||
@@ -83,12 +83,9 @@ public:
|
||||
virtual Time GetSlotTime (void);
|
||||
|
||||
// Inherited methods from UanMac
|
||||
virtual Address GetAddress ();
|
||||
virtual void SetAddress (UanAddress addr);
|
||||
virtual bool Enqueue (Ptr<Packet> pkt, const Address &dest, uint16_t protocolNumber);
|
||||
virtual void SetForwardUpCb (Callback<void, Ptr<Packet>, const UanAddress&> cb);
|
||||
virtual bool Enqueue (Ptr<Packet> pkt, uint16_t protocolNumber, const Address &dest);
|
||||
virtual void SetForwardUpCb (Callback<void, Ptr<Packet>, uint16_t, const Mac8Address&> cb);
|
||||
virtual void AttachPhy (Ptr<UanPhy> phy);
|
||||
virtual Address GetBroadcast (void) const;
|
||||
virtual void Clear (void);
|
||||
int64_t AssignStreams (int64_t stream);
|
||||
|
||||
@@ -119,9 +116,9 @@ private:
|
||||
} State;
|
||||
|
||||
/** Forwarding up callback. */
|
||||
Callback <void, Ptr<Packet>, const UanAddress& > m_forwardUpCb;
|
||||
Callback <void, Ptr<Packet>, uint16_t, const Mac8Address&> m_forwardUpCb;
|
||||
/** The MAC address. */
|
||||
UanAddress m_address;
|
||||
Mac8Address m_address;
|
||||
/** PHY layer attached to this MAC. */
|
||||
Ptr<UanPhy> m_phy;
|
||||
/** A packet destined for this MAC was received. */
|
||||
|
||||
@@ -83,7 +83,7 @@ UanMacRcGw::Clear ()
|
||||
m_phy = 0;
|
||||
}
|
||||
m_propDelay.clear ();
|
||||
std::map<UanAddress, AckData>::iterator it = m_ackData.begin ();
|
||||
std::map<Mac8Address, AckData>::iterator it = m_ackData.begin ();
|
||||
for (; it != m_ackData.end (); it++)
|
||||
{
|
||||
it->second.rxFrames.clear ();
|
||||
@@ -170,20 +170,8 @@ UanMacRcGw::GetTypeId (void)
|
||||
return tid;
|
||||
}
|
||||
|
||||
Address
|
||||
UanMacRcGw::GetAddress (void)
|
||||
{
|
||||
return m_address;
|
||||
}
|
||||
|
||||
void
|
||||
UanMacRcGw::SetAddress (UanAddress addr)
|
||||
{
|
||||
m_address = addr;
|
||||
}
|
||||
|
||||
bool
|
||||
UanMacRcGw::Enqueue (Ptr<Packet> packet, const Address &dest, uint16_t protocolNumber)
|
||||
UanMacRcGw::Enqueue (Ptr<Packet> packet, uint16_t protocolNumber, const Address &dest)
|
||||
{
|
||||
NS_UNUSED (dest);
|
||||
NS_UNUSED (protocolNumber);
|
||||
@@ -192,7 +180,7 @@ UanMacRcGw::Enqueue (Ptr<Packet> packet, const Address &dest, uint16_t protocolN
|
||||
}
|
||||
|
||||
void
|
||||
UanMacRcGw::SetForwardUpCb (Callback<void, Ptr<Packet>, const UanAddress&> cb)
|
||||
UanMacRcGw::SetForwardUpCb (Callback<void, Ptr<Packet>, uint16_t, const Mac8Address&> cb)
|
||||
{
|
||||
m_forwardUpCb = cb;
|
||||
}
|
||||
@@ -211,12 +199,6 @@ UanMacRcGw::ReceiveError (Ptr<Packet> pkt, double sinr)
|
||||
NS_UNUSED (sinr);
|
||||
}
|
||||
|
||||
Address
|
||||
UanMacRcGw::GetBroadcast (void) const
|
||||
{
|
||||
return UanAddress::GetBroadcast ();
|
||||
}
|
||||
|
||||
void
|
||||
UanMacRcGw::ReceivePacket (Ptr<Packet> pkt, double sinr, UanTxMode mode)
|
||||
{
|
||||
@@ -224,7 +206,7 @@ UanMacRcGw::ReceivePacket (Ptr<Packet> pkt, double sinr, UanTxMode mode)
|
||||
UanHeaderCommon ch;
|
||||
pkt->PeekHeader (ch);
|
||||
|
||||
if (ch.GetDest () == m_address || ch.GetDest () == UanAddress::GetBroadcast ())
|
||||
if (ch.GetDest () == m_address || ch.GetDest () == Mac8Address::GetBroadcast ())
|
||||
{
|
||||
m_rxLogger (pkt, mode);
|
||||
}
|
||||
@@ -251,7 +233,7 @@ UanMacRcGw::ReceivePacket (Ptr<Packet> pkt, double sinr, UanTxMode mode)
|
||||
NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " GW Received data packet from " << ch.GetSrc () << " length = " << pkt->GetSize ());
|
||||
m_ackData[ch.GetSrc ()].rxFrames.insert (dh.GetFrameNo ());
|
||||
}
|
||||
m_forwardUpCb (pkt, ch.GetSrc ());
|
||||
m_forwardUpCb (pkt, ch.GetProtocolNumber (), ch.GetSrc ());
|
||||
}
|
||||
break;
|
||||
case UanMacRc::TYPE_GWPING:
|
||||
@@ -275,7 +257,7 @@ UanMacRcGw::ReceivePacket (Ptr<Packet> pkt, double sinr, UanTxMode mode)
|
||||
req.length = rh.GetLength ();
|
||||
NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " GW storing reservation from " << ch.GetSrc () << " with length " << req.length);
|
||||
m_requests.insert (std::make_pair (ch.GetSrc (), req));
|
||||
std::map<UanAddress, Time>::iterator it = m_propDelay.find (ch.GetSrc ());
|
||||
std::map<Mac8Address, Time>::iterator it = m_propDelay.find (ch.GetSrc ());
|
||||
if (it == m_propDelay.end ())
|
||||
{
|
||||
m_sortedRes.insert (std::make_pair (m_maxDelta, ch.GetSrc ()));
|
||||
@@ -322,7 +304,7 @@ UanMacRcGw::StartCycle (void)
|
||||
double pDelay = 0;
|
||||
if (numRts > 0)
|
||||
{
|
||||
std::map<UanAddress, Request>::iterator rit = m_requests.begin ();
|
||||
std::map<Mac8Address, Request>::iterator rit = m_requests.begin ();
|
||||
for (; rit != m_requests.end (); rit++)
|
||||
{
|
||||
totalBytes += (*rit).second.length;
|
||||
@@ -392,7 +374,7 @@ UanMacRcGw::StartCycle (void)
|
||||
ctsg.SetRetryRate (m_currentRetryRate);
|
||||
ctsg.SetTxTimeStamp (Simulator::Now ());
|
||||
|
||||
UanHeaderCommon ch (m_address, UanAddress::GetBroadcast (), UanMacRc::TYPE_CTS);
|
||||
UanHeaderCommon ch (m_address, Mac8Address::GetBroadcast (), UanMacRc::TYPE_CTS, 0);
|
||||
Ptr<Packet> p = Create<Packet> ();
|
||||
p->AddHeader (ctsg);
|
||||
p->AddHeader (ch);
|
||||
@@ -410,7 +392,7 @@ UanMacRcGw::StartCycle (void)
|
||||
m_state = CTSING;
|
||||
Simulator::Schedule (nextEarliest, &UanMacRcGw::CycleStarted, this);
|
||||
|
||||
std::set<std::pair<Time, UanAddress> >::iterator it = m_sortedRes.begin ();
|
||||
std::set<std::pair<Time, Mac8Address> >::iterator it = m_sortedRes.begin ();
|
||||
Time minPdelay = (*it).first;
|
||||
Ptr<Packet> cts = Create<Packet> ();
|
||||
|
||||
@@ -422,7 +404,7 @@ UanMacRcGw::StartCycle (void)
|
||||
AckData newData;
|
||||
newData.expFrames = req.numFrames;
|
||||
newData.frameNo = req.frameNo;
|
||||
UanAddress dest = (*it).second;
|
||||
Mac8Address dest = (*it).second;
|
||||
m_ackData.insert (std::make_pair (dest, newData));
|
||||
|
||||
Time earliestArr = ctsTxTimeTotal + pdelay + pdelay + m_sifs;
|
||||
@@ -449,7 +431,7 @@ UanMacRcGw::StartCycle (void)
|
||||
ctsg.SetWindowTime (Seconds (effWinSize));
|
||||
ctsg.SetTxTimeStamp (Simulator::Now ());
|
||||
UanHeaderCommon ch;
|
||||
ch.SetDest (UanAddress::GetBroadcast ());
|
||||
ch.SetDest (Mac8Address::GetBroadcast ());
|
||||
ch.SetSrc (m_address);
|
||||
ch.SetType (UanMacRc::TYPE_CTS);
|
||||
cts->AddHeader (ctsg);
|
||||
@@ -479,10 +461,10 @@ UanMacRcGw::EndCycle ()
|
||||
|
||||
Time ackTime = Seconds (m_ackSize * 8.0 / m_phy->GetMode (m_currentRateNum).GetDataRateBps ());
|
||||
|
||||
std::map<UanAddress, AckData>::iterator it = m_ackData.begin ();
|
||||
std::map<Mac8Address, AckData>::iterator it = m_ackData.begin ();
|
||||
for (; it != m_ackData.end (); it++)
|
||||
{
|
||||
UanAddress dest = (*it).first;
|
||||
Mac8Address dest = (*it).first;
|
||||
AckData &data = (*it).second;
|
||||
|
||||
std::list<uint32_t> toNack;
|
||||
@@ -583,7 +565,7 @@ UanMacRcGw::GetExpPdk (void)
|
||||
{
|
||||
uint32_t n = m_numNodes;
|
||||
std::vector<double> pds;
|
||||
std::map<UanAddress, Time>::iterator pdit = m_propDelay.begin ();
|
||||
std::map<Mac8Address, Time>::iterator pdit = m_propDelay.begin ();
|
||||
|
||||
for (; pdit != m_propDelay.end (); pdit++)
|
||||
{
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#define UAN_MAC_RC_GW_H
|
||||
|
||||
#include "uan-mac.h"
|
||||
#include "uan-address.h"
|
||||
#include "ns3/mac8-address.h"
|
||||
|
||||
#include "ns3/nstime.h"
|
||||
#include "ns3/traced-callback.h"
|
||||
@@ -67,12 +67,9 @@ public:
|
||||
static TypeId GetTypeId (void);
|
||||
|
||||
// Inherited methods
|
||||
virtual Address GetAddress (void);
|
||||
virtual void SetAddress (UanAddress addr);
|
||||
virtual bool Enqueue (Ptr<Packet> pkt, const Address &dest, uint16_t protocolNumber);
|
||||
virtual void SetForwardUpCb (Callback<void, Ptr<Packet>, const UanAddress&> cb);
|
||||
virtual bool Enqueue (Ptr<Packet> pkt, uint16_t protocolNumber, const Address &dest);
|
||||
virtual void SetForwardUpCb (Callback<void, Ptr<Packet>, uint16_t, const Mac8Address&> cb);
|
||||
virtual void AttachPhy (Ptr<UanPhy> phy);
|
||||
virtual Address GetBroadcast (void) const;
|
||||
virtual void Clear (void);
|
||||
int64_t AssignStreams (int64_t stream);
|
||||
|
||||
@@ -126,10 +123,10 @@ private:
|
||||
uint8_t expFrames; //!< Expected number of frames.
|
||||
};
|
||||
/** Forwarding up callback. */
|
||||
Callback<void, Ptr<Packet>, const UanAddress& > m_forwardUpCb;
|
||||
Callback<void, Ptr<Packet>, uint16_t, const Mac8Address&> m_forwardUpCb;
|
||||
|
||||
Ptr<UanPhy> m_phy; //!< PHY layer attached to this MAC.
|
||||
UanAddress m_address; //!< The MAC address.
|
||||
Mac8Address m_address; //!< The MAC address.
|
||||
Time m_maxDelta; //!< Maximum propagation delay between gateway and non-gateway nodes .
|
||||
Time m_sifs; //!< Spacing between frames to account for timing error and processing delay.
|
||||
uint32_t m_maxRes; //!< Maximum number of reservations to accept per cycle.
|
||||
@@ -149,15 +146,15 @@ private:
|
||||
double m_retryStep; //!< Retry rate increment.
|
||||
|
||||
/** Propagation delay to each node. */
|
||||
std::map<UanAddress, Time> m_propDelay;
|
||||
std::map<Mac8Address, Time> m_propDelay;
|
||||
|
||||
/** AckData for each node. */
|
||||
std::map<UanAddress, AckData> m_ackData;
|
||||
std::map<Mac8Address, AckData> m_ackData;
|
||||
|
||||
/** Request for each node. */
|
||||
std::map<UanAddress, Request> m_requests;
|
||||
std::map<Mac8Address, Request> m_requests;
|
||||
/** Queued request times. */
|
||||
std::set<std::pair<Time, UanAddress> > m_sortedRes;
|
||||
std::set<std::pair<Time, Mac8Address> > m_sortedRes;
|
||||
|
||||
/** Flag when we've been cleared. */
|
||||
bool m_cleared;
|
||||
|
||||
@@ -52,7 +52,7 @@ Reservation::Reservation ()
|
||||
|
||||
}
|
||||
|
||||
Reservation::Reservation (std::list<std::pair <Ptr<Packet>, UanAddress > > &list, uint8_t frameNo, uint32_t maxPkts)
|
||||
Reservation::Reservation (std::list<std::pair <Ptr<Packet>, Mac8Address > > &list, uint8_t frameNo, uint32_t maxPkts)
|
||||
: m_frameNo (frameNo),
|
||||
m_retryNo (0),
|
||||
m_transmitted (false)
|
||||
@@ -75,7 +75,7 @@ Reservation::Reservation (std::list<std::pair <Ptr<Packet>, UanAddress > > &list
|
||||
|
||||
Reservation::~Reservation ()
|
||||
{
|
||||
std::list<std::pair <Ptr<Packet>, UanAddress > >::iterator it;
|
||||
std::list<std::pair <Ptr<Packet>, Mac8Address > >::iterator it;
|
||||
for (it = m_pktList.begin (); it != m_pktList.end (); it++)
|
||||
{
|
||||
it->first = Ptr<Packet> ((Packet *) 0);
|
||||
@@ -95,7 +95,7 @@ Reservation::GetLength () const
|
||||
return m_length;
|
||||
}
|
||||
|
||||
const std::list<std::pair <Ptr<Packet>, UanAddress > > &
|
||||
const std::list<std::pair <Ptr<Packet>, Mac8Address > > &
|
||||
Reservation::GetPktList (void) const
|
||||
{
|
||||
return m_pktList;
|
||||
@@ -187,7 +187,7 @@ UanMacRc::Clear ()
|
||||
m_phy->Clear ();
|
||||
m_phy = 0;
|
||||
}
|
||||
std::list<std::pair <Ptr<Packet>, UanAddress > >::iterator it;
|
||||
std::list<std::pair <Ptr<Packet>, Mac8Address > >::iterator it;
|
||||
for (it = m_pktQueue.begin (); it != m_pktQueue.end (); it++)
|
||||
{
|
||||
it->first = 0;
|
||||
@@ -276,20 +276,8 @@ UanMacRc::AssignStreams (int64_t stream)
|
||||
return 1;
|
||||
}
|
||||
|
||||
Address
|
||||
UanMacRc::GetAddress (void)
|
||||
{
|
||||
return m_address;
|
||||
}
|
||||
|
||||
void
|
||||
UanMacRc::SetAddress (UanAddress addr)
|
||||
{
|
||||
m_address = addr;
|
||||
}
|
||||
|
||||
bool
|
||||
UanMacRc::Enqueue (Ptr<Packet> packet, const Address &dest, uint16_t protocolNumber)
|
||||
UanMacRc::Enqueue (Ptr<Packet> packet, uint16_t protocolNumber, const Address &dest)
|
||||
{
|
||||
if (protocolNumber > 0)
|
||||
{
|
||||
@@ -302,7 +290,7 @@ UanMacRc::Enqueue (Ptr<Packet> packet, const Address &dest, uint16_t protocolNum
|
||||
return false;
|
||||
}
|
||||
|
||||
m_pktQueue.push_back (std::make_pair (packet, UanAddress::ConvertFrom (dest)));
|
||||
m_pktQueue.push_back (std::make_pair (packet, Mac8Address::ConvertFrom (dest)));
|
||||
|
||||
switch (m_state)
|
||||
{
|
||||
@@ -325,7 +313,7 @@ UanMacRc::Enqueue (Ptr<Packet> packet, const Address &dest, uint16_t protocolNum
|
||||
}
|
||||
|
||||
void
|
||||
UanMacRc::SetForwardUpCb (Callback<void, Ptr<Packet>, const UanAddress&> cb)
|
||||
UanMacRc::SetForwardUpCb (Callback<void, Ptr<Packet>, uint16_t, const Mac8Address&> cb)
|
||||
{
|
||||
m_forwardUpCb = cb;
|
||||
}
|
||||
@@ -337,19 +325,13 @@ UanMacRc::AttachPhy (Ptr<UanPhy> phy)
|
||||
m_phy->SetReceiveOkCallback (MakeCallback (&UanMacRc::ReceiveOkFromPhy, this));
|
||||
}
|
||||
|
||||
Address
|
||||
UanMacRc::GetBroadcast (void) const
|
||||
{
|
||||
return UanAddress::GetBroadcast ();
|
||||
}
|
||||
|
||||
void
|
||||
UanMacRc::ReceiveOkFromPhy (Ptr<Packet> pkt, double sinr, UanTxMode mode)
|
||||
{
|
||||
NS_UNUSED (sinr);
|
||||
UanHeaderCommon ch;
|
||||
pkt->RemoveHeader (ch);
|
||||
if (ch.GetDest () == m_address || ch.GetDest () == UanAddress::GetBroadcast ())
|
||||
if (ch.GetDest () == m_address || ch.GetDest () == Mac8Address::GetBroadcast ())
|
||||
{
|
||||
m_rxLogger (pkt, mode);
|
||||
}
|
||||
@@ -363,7 +345,7 @@ UanMacRc::ReceiveOkFromPhy (Ptr<Packet> pkt, double sinr, UanTxMode mode)
|
||||
NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Node " << m_address << " UanMacRc Receiving DATA packet from PHY");
|
||||
UanHeaderRcData dh;
|
||||
pkt->RemoveHeader (dh);
|
||||
m_forwardUpCb (pkt, ch.GetSrc ());
|
||||
m_forwardUpCb (pkt, ch.GetProtocolNumber (), ch.GetSrc ());
|
||||
}
|
||||
break;
|
||||
case TYPE_RTS:
|
||||
@@ -394,7 +376,7 @@ UanMacRc::ReceiveOkFromPhy (Ptr<Packet> pkt, double sinr, UanTxMode mode)
|
||||
}
|
||||
|
||||
UanHeaderRcCts ctsh;
|
||||
ctsh.SetAddress (UanAddress::GetBroadcast ());
|
||||
ctsh.SetAddress (Mac8Address::GetBroadcast ());
|
||||
while (pkt->GetSize () > 0)
|
||||
{
|
||||
pkt->RemoveHeader (ctsh);
|
||||
@@ -469,8 +451,8 @@ UanMacRc::ScheduleData (const UanHeaderRcCts &ctsh, const UanHeaderRcCtsGlobal &
|
||||
|
||||
Time frameDelay = Seconds (0);
|
||||
|
||||
const std::list<std::pair <Ptr<Packet>, UanAddress > > l = it->GetPktList ();
|
||||
std::list<std::pair <Ptr<Packet>, UanAddress > >::const_iterator pit;
|
||||
const std::list<std::pair <Ptr<Packet>, Mac8Address > > l = it->GetPktList ();
|
||||
std::list<std::pair <Ptr<Packet>, Mac8Address > >::const_iterator pit;
|
||||
pit = l.begin ();
|
||||
|
||||
|
||||
@@ -580,8 +562,8 @@ UanMacRc::ProcessAck (Ptr<Packet> ack)
|
||||
}
|
||||
if (ah.GetNoNacks () > 0)
|
||||
{
|
||||
const std::list<std::pair <Ptr<Packet>, UanAddress > > l = it->GetPktList ();
|
||||
std::list<std::pair <Ptr<Packet>, UanAddress > >::const_iterator pit;
|
||||
const std::list<std::pair <Ptr<Packet>, Mac8Address > > l = it->GetPktList ();
|
||||
std::list<std::pair <Ptr<Packet>, Mac8Address > >::const_iterator pit;
|
||||
pit = l.begin ();
|
||||
|
||||
const std::set<uint8_t> &nacks = ah.GetNackedFrames ();
|
||||
@@ -635,7 +617,7 @@ UanMacRc::Associate (void)
|
||||
{
|
||||
Ptr<Packet> pkt = Create<Packet> (0);
|
||||
pkt->AddHeader (CreateRtsHeader (res));
|
||||
pkt->AddHeader (UanHeaderCommon (m_address, UanAddress::GetBroadcast (), (uint8_t) TYPE_GWPING));
|
||||
pkt->AddHeader (UanHeaderCommon (m_address, Mac8Address::GetBroadcast (), static_cast<uint8_t>(TYPE_GWPING), 0));
|
||||
NS_LOG_DEBUG (Simulator::Now ().GetSeconds () << " Sending first GWPING " << *pkt);
|
||||
SendPacket (pkt,m_currentRate + m_numRates);
|
||||
}
|
||||
@@ -666,7 +648,7 @@ UanMacRc::AssociateTimeout ()
|
||||
res.IncrementRetry ();
|
||||
|
||||
pkt->AddHeader (CreateRtsHeader (res));
|
||||
pkt->AddHeader (UanHeaderCommon (m_address, UanAddress::GetBroadcast (), (uint8_t) TYPE_GWPING));
|
||||
pkt->AddHeader (UanHeaderCommon (m_address, Mac8Address::GetBroadcast (), static_cast<uint8_t> (TYPE_GWPING), 0));
|
||||
|
||||
SendPacket (pkt,m_currentRate + m_numRates);
|
||||
m_resList.push_back (res);
|
||||
@@ -699,7 +681,7 @@ UanMacRc::SendRts (void)
|
||||
{
|
||||
Ptr<Packet> pkt = Create<Packet> (0);
|
||||
pkt->AddHeader (CreateRtsHeader (res));
|
||||
pkt->AddHeader (UanHeaderCommon (m_address, UanAddress::GetBroadcast (), (uint8_t) TYPE_RTS));
|
||||
pkt->AddHeader (UanHeaderCommon (m_address, Mac8Address::GetBroadcast (), static_cast<uint8_t> (TYPE_RTS), 0));
|
||||
SendPacket (pkt,m_currentRate + m_numRates);
|
||||
}
|
||||
m_state = RTSSENT;
|
||||
@@ -762,7 +744,7 @@ UanMacRc::RtsTimeout (void)
|
||||
res.IncrementRetry ();
|
||||
m_resList.push_back (res);
|
||||
pkt->AddHeader (CreateRtsHeader (res));
|
||||
pkt->AddHeader (UanHeaderCommon (m_address, UanAddress::GetBroadcast (), (uint8_t) TYPE_RTS));
|
||||
pkt->AddHeader (UanHeaderCommon (m_address, Mac8Address::GetBroadcast (), static_cast<uint8_t> (TYPE_RTS), 0));
|
||||
SendPacket (pkt,m_currentRate + m_numRates);
|
||||
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
#define UAN_MAC_RC_H
|
||||
|
||||
#include "uan-mac.h"
|
||||
#include "uan-address.h"
|
||||
#include "ns3/mac8-address.h"
|
||||
|
||||
#include "ns3/nstime.h"
|
||||
#include "ns3/trace-source-accessor.h"
|
||||
@@ -63,7 +63,7 @@ public:
|
||||
* \param maxPkts Maximum number of packets to assign to reservation
|
||||
* from packet list (0 = no maximum).
|
||||
*/
|
||||
Reservation (std::list<std::pair <Ptr<Packet>, UanAddress > > &list, uint8_t frameNo, uint32_t maxPkts = 0);
|
||||
Reservation (std::list<std::pair <Ptr<Packet>, Mac8Address > > &list, uint8_t frameNo, uint32_t maxPkts = 0);
|
||||
/** Destructor */
|
||||
~Reservation ();
|
||||
/**
|
||||
@@ -85,7 +85,7 @@ public:
|
||||
*
|
||||
* \return The list of packets.
|
||||
*/
|
||||
const std::list<std::pair <Ptr<Packet>, UanAddress > > &GetPktList (void) const;
|
||||
const std::list<std::pair <Ptr<Packet>, Mac8Address > > &GetPktList (void) const;
|
||||
/**
|
||||
* Get the frame number.
|
||||
*
|
||||
@@ -131,7 +131,7 @@ public:
|
||||
|
||||
private:
|
||||
/** Queued packets for each address. */
|
||||
std::list<std::pair <Ptr<Packet>, UanAddress > > m_pktList;
|
||||
std::list<std::pair <Ptr<Packet>, Mac8Address > > m_pktList;
|
||||
/** Total length of queued packets. */
|
||||
uint32_t m_length;
|
||||
/** Frame number. */
|
||||
@@ -183,12 +183,9 @@ public:
|
||||
static TypeId GetTypeId (void);
|
||||
|
||||
// Inherited methods
|
||||
virtual Address GetAddress (void);
|
||||
virtual void SetAddress (UanAddress addr);
|
||||
virtual bool Enqueue (Ptr<Packet> pkt, const Address &dest, uint16_t protocolNumber);
|
||||
virtual void SetForwardUpCb (Callback<void, Ptr<Packet>, const UanAddress&> cb);
|
||||
virtual bool Enqueue (Ptr<Packet> pkt, uint16_t protocolNumber, const Address &dest);
|
||||
virtual void SetForwardUpCb (Callback<void, Ptr<Packet>, uint16_t, const Mac8Address&> cb);
|
||||
virtual void AttachPhy (Ptr<UanPhy> phy);
|
||||
virtual Address GetBroadcast (void) const;
|
||||
virtual void Clear (void);
|
||||
int64_t AssignStreams (int64_t stream);
|
||||
|
||||
@@ -215,9 +212,9 @@ private:
|
||||
bool m_rtsBlocked; //!< RTS blocked while processing ACK.
|
||||
|
||||
EventId m_startAgain; //!< (Unused).
|
||||
UanAddress m_address; //!< My addrese.s
|
||||
Mac8Address m_address; //!< My addrese.s
|
||||
double m_retryRate; //!< Number of retry attempts per second (of RTS/GWPING.
|
||||
UanAddress m_assocAddr; //!< Next hop address.
|
||||
Mac8Address m_assocAddr; //!< Next hop address.
|
||||
Ptr<UanPhy> m_phy; //!< PHY layer attached to this MAC.
|
||||
uint32_t m_numRates; //!< Number of rates per Phy layer.
|
||||
uint32_t m_currentRate; //!< Rate number corresponding to data rate of current cycle.
|
||||
@@ -236,12 +233,12 @@ private:
|
||||
bool m_cleared; //!< Flag when we've been cleared.
|
||||
|
||||
/** Pending packets. */
|
||||
std::list<std::pair <Ptr<Packet>, UanAddress > > m_pktQueue;
|
||||
std::list<std::pair <Ptr<Packet>, Mac8Address > > m_pktQueue;
|
||||
/** List of scheduled reservations. */
|
||||
std::list<Reservation> m_resList;
|
||||
|
||||
/** The callback to forward a packet up to higher layer. */
|
||||
Callback<void, Ptr<Packet>, const UanAddress& > m_forwardUpCb;
|
||||
Callback<void, Ptr<Packet>, uint16_t, const Mac8Address&> m_forwardUpCb;
|
||||
|
||||
/** A packet was destined for and received at this MAC layer. */
|
||||
TracedCallback<Ptr<const Packet>, UanTxMode > m_rxLogger;
|
||||
|
||||
@@ -24,6 +24,12 @@ namespace ns3 {
|
||||
|
||||
NS_OBJECT_ENSURE_REGISTERED (UanMac);
|
||||
|
||||
UanMac::UanMac ()
|
||||
: m_txModeIndex (0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
TypeId UanMac::GetTypeId (void)
|
||||
{
|
||||
static TypeId tid = TypeId ("ns3::UanMac")
|
||||
@@ -33,4 +39,35 @@ TypeId UanMac::GetTypeId (void)
|
||||
return tid;
|
||||
}
|
||||
|
||||
void
|
||||
UanMac::SetTxModeIndex (uint32_t txModeIndex)
|
||||
{
|
||||
m_txModeIndex = txModeIndex;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
UanMac::GetTxModeIndex ()
|
||||
{
|
||||
return m_txModeIndex;
|
||||
}
|
||||
|
||||
Address
|
||||
UanMac::GetAddress (void)
|
||||
{
|
||||
return m_address;
|
||||
}
|
||||
|
||||
void
|
||||
UanMac::SetAddress (Mac8Address addr)
|
||||
{
|
||||
m_address=addr;
|
||||
}
|
||||
|
||||
Address
|
||||
UanMac::GetBroadcast (void) const
|
||||
{
|
||||
Mac8Address broadcast = Mac8Address (255);
|
||||
return broadcast;
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include "ns3/address.h"
|
||||
#include "ns3/nstime.h"
|
||||
#include "ns3/ptr.h"
|
||||
#include "ns3/mac8-address.h"
|
||||
|
||||
namespace ns3 {
|
||||
|
||||
@@ -36,7 +37,7 @@ class UanChannel;
|
||||
class UanNetDevice;
|
||||
class UanTransducer;
|
||||
class UanTxMode;
|
||||
class UanAddress;
|
||||
class Mac8Address;
|
||||
|
||||
|
||||
|
||||
@@ -48,6 +49,8 @@ class UanAddress;
|
||||
class UanMac : public Object
|
||||
{
|
||||
public:
|
||||
/** Default constructor */
|
||||
UanMac ();
|
||||
/**
|
||||
* Register this type.
|
||||
* \return The TypeId.
|
||||
@@ -59,24 +62,24 @@ public:
|
||||
*
|
||||
* \return MAC Address.
|
||||
*/
|
||||
virtual Address GetAddress (void) = 0;
|
||||
virtual Address GetAddress (void);
|
||||
|
||||
/**
|
||||
* Set the address.
|
||||
*
|
||||
* \param addr UanAddress for this MAC.
|
||||
* \param addr Mac8Address for this MAC.
|
||||
*/
|
||||
virtual void SetAddress (UanAddress addr) = 0;
|
||||
virtual void SetAddress (Mac8Address addr);
|
||||
|
||||
/**
|
||||
* Enqueue packet to be transmitted.
|
||||
*
|
||||
* \param pkt Packet to be transmitted.
|
||||
* \param dest Destination address.
|
||||
* \param protocolNumber Protocol number. Usage varies by MAC.
|
||||
* \param protocolNumber The type of the packet.
|
||||
* \return True if packet was successfully enqueued.
|
||||
*/
|
||||
virtual bool Enqueue (Ptr<Packet> pkt, const Address &dest, uint16_t protocolNumber) = 0;
|
||||
virtual bool Enqueue (Ptr<Packet> pkt, uint16_t protocolNumber, const Address &dest) = 0;
|
||||
/**
|
||||
* Set the callback to forward packets up to higher layers.
|
||||
*
|
||||
@@ -84,7 +87,7 @@ public:
|
||||
* \pname{packet} The packet.
|
||||
* \pname{address} The source address.
|
||||
*/
|
||||
virtual void SetForwardUpCb (Callback<void, Ptr<Packet>, const UanAddress&> cb) = 0;
|
||||
virtual void SetForwardUpCb (Callback<void, Ptr<Packet>, uint16_t, const Mac8Address&> cb) = 0;
|
||||
|
||||
/**
|
||||
* Attach PHY layer to this MAC.
|
||||
@@ -101,7 +104,7 @@ public:
|
||||
*
|
||||
* \return The broadcast address.
|
||||
*/
|
||||
virtual Address GetBroadcast (void) const = 0;
|
||||
virtual Address GetBroadcast (void) const;
|
||||
|
||||
/** Clears all pointer references. */
|
||||
virtual void Clear (void) = 0;
|
||||
@@ -125,6 +128,15 @@ public:
|
||||
typedef void (* PacketModeTracedCallback)
|
||||
(Ptr<const Packet> packet, UanTxMode mode);
|
||||
|
||||
uint32_t GetTxModeIndex ();
|
||||
void SetTxModeIndex (uint32_t txModeIndex);
|
||||
|
||||
private:
|
||||
/** Modulation type */
|
||||
uint32_t m_txModeIndex;
|
||||
/** The MAC address. */
|
||||
Mac8Address m_address;
|
||||
|
||||
}; // class UanMac
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
@@ -271,21 +271,19 @@ UanNetDevice::GetBroadcast () const
|
||||
bool
|
||||
UanNetDevice::IsMulticast () const
|
||||
{
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
Address
|
||||
UanNetDevice::GetMulticast (Ipv4Address multicastGroup) const
|
||||
{
|
||||
NS_UNUSED (multicastGroup);
|
||||
NS_FATAL_ERROR ("UanNetDevice does not support multicast");
|
||||
return m_mac->GetBroadcast ();
|
||||
}
|
||||
|
||||
Address
|
||||
UanNetDevice::GetMulticast (Ipv6Address addr) const
|
||||
{
|
||||
NS_FATAL_ERROR ("UanNetDevice does not support multicast");
|
||||
return m_mac->GetBroadcast ();
|
||||
}
|
||||
|
||||
@@ -303,7 +301,11 @@ UanNetDevice::IsPointToPoint () const
|
||||
bool
|
||||
UanNetDevice::Send (Ptr<Packet> packet, const Address &dest, uint16_t protocolNumber)
|
||||
{
|
||||
return m_mac->Enqueue (packet, dest, protocolNumber);
|
||||
uint8_t tmp [6];
|
||||
dest.CopyTo (tmp);
|
||||
Mac8Address udest (tmp[0]);
|
||||
|
||||
return m_mac->Enqueue (packet, protocolNumber, udest);
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -331,7 +333,7 @@ UanNetDevice::SetNode (Ptr<Node> node)
|
||||
bool
|
||||
UanNetDevice::NeedsArp () const
|
||||
{
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -341,11 +343,11 @@ UanNetDevice::SetReceiveCallback (NetDevice::ReceiveCallback cb)
|
||||
}
|
||||
|
||||
void
|
||||
UanNetDevice::ForwardUp (Ptr<Packet> pkt, const UanAddress &src)
|
||||
UanNetDevice::ForwardUp (Ptr<Packet> pkt, uint16_t protocolNumber, const Mac8Address &src)
|
||||
{
|
||||
NS_LOG_DEBUG ("Forwarding packet up to application");
|
||||
m_rxLogger (pkt, src);
|
||||
m_forwardUp (this, pkt, 0, src);
|
||||
m_forwardUp (this, pkt, protocolNumber, src);
|
||||
|
||||
}
|
||||
|
||||
@@ -402,7 +404,7 @@ void
|
||||
UanNetDevice::SetAddress (Address address)
|
||||
{
|
||||
NS_ASSERT_MSG (0, "Tried to set MAC address with no MAC");
|
||||
m_mac->SetAddress (UanAddress::ConvertFrom (address));
|
||||
m_mac->SetAddress (Mac8Address::ConvertFrom (address));
|
||||
}
|
||||
|
||||
void
|
||||
@@ -411,5 +413,17 @@ UanNetDevice::SetSleepMode (bool sleep)
|
||||
m_phy->SetSleepMode (sleep);
|
||||
}
|
||||
|
||||
void
|
||||
UanNetDevice::SetTxModeIndex (uint32_t txModeIndex)
|
||||
{
|
||||
m_mac->SetTxModeIndex (txModeIndex);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
UanNetDevice::GetTxModeIndex ()
|
||||
{
|
||||
return m_mac->GetTxModeIndex ();
|
||||
}
|
||||
|
||||
} // namespace ns3
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#include "ns3/net-device.h"
|
||||
#include "ns3/pointer.h"
|
||||
#include "ns3/traced-callback.h"
|
||||
#include "uan-address.h"
|
||||
#include "ns3/mac8-address.h"
|
||||
#include <list>
|
||||
|
||||
namespace ns3 {
|
||||
@@ -146,6 +146,8 @@ public:
|
||||
virtual bool SupportsSendFrom (void) const;
|
||||
virtual void AddLinkChangeCallback (Callback<void> callback);
|
||||
virtual void SetAddress (Address address);
|
||||
uint32_t GetTxModeIndex ();
|
||||
void SetTxModeIndex (uint32_t txModeIndex);
|
||||
|
||||
/**
|
||||
* TracedCallback signature for MAC send/receive events.
|
||||
@@ -154,7 +156,7 @@ public:
|
||||
* \param [in] address The source address.
|
||||
*/
|
||||
typedef void (* RxTxTracedCallback)
|
||||
(Ptr<const Packet> packet, UanAddress address);
|
||||
(Ptr<const Packet> packet, Mac8Address address);
|
||||
|
||||
private:
|
||||
/**
|
||||
@@ -162,8 +164,9 @@ private:
|
||||
*
|
||||
* \param pkt The packet.
|
||||
* \param src The source address.
|
||||
* \param protocolNumber The layer 3 protocol number.
|
||||
*/
|
||||
virtual void ForwardUp (Ptr<Packet> pkt, const UanAddress &src);
|
||||
virtual void ForwardUp (Ptr<Packet> pkt, uint16_t protocolNumber, const Mac8Address &src);
|
||||
|
||||
/** \return The channel attached to this device. */
|
||||
Ptr<UanChannel> DoGetChannel (void) const;
|
||||
@@ -182,9 +185,9 @@ private:
|
||||
ReceiveCallback m_forwardUp; //!< The receive callback.
|
||||
|
||||
/** Trace source triggered when forwarding up received payload from the MAC layer. */
|
||||
TracedCallback<Ptr<const Packet>, UanAddress> m_rxLogger;
|
||||
TracedCallback<Ptr<const Packet>, Mac8Address> m_rxLogger;
|
||||
/** Trace source triggered when sending to the MAC layer */
|
||||
TracedCallback<Ptr<const Packet>, UanAddress> m_txLogger;
|
||||
TracedCallback<Ptr<const Packet>, Mac8Address> m_txLogger;
|
||||
|
||||
/** Flag when we've been cleared. */
|
||||
bool m_cleared;
|
||||
|
||||
@@ -109,7 +109,8 @@ void
|
||||
UanTest::SendOnePacket (Ptr<UanNetDevice> dev, uint16_t mode)
|
||||
{
|
||||
Ptr<Packet> pkt = Create<Packet> (17);
|
||||
dev->Send (pkt, dev->GetBroadcast (), mode);
|
||||
dev->SetTxModeIndex (mode);
|
||||
dev->Send (pkt, dev->GetBroadcast (), 0);
|
||||
|
||||
}
|
||||
Ptr<UanNetDevice>
|
||||
@@ -127,7 +128,7 @@ UanTest::CreateNode (Vector pos, Ptr<UanChannel> chan)
|
||||
|
||||
mobility->SetPosition (pos);
|
||||
node->AggregateObject (mobility);
|
||||
mac->SetAddress (UanAddress::Allocate ());
|
||||
mac->SetAddress (Mac8Address::Allocate ());
|
||||
|
||||
dev->SetPhy (phy);
|
||||
dev->SetMac (mac);
|
||||
|
||||
@@ -8,7 +8,6 @@ def build(bld):
|
||||
'model/uan-mac.cc',
|
||||
'model/uan-transducer.cc',
|
||||
'model/uan-transducer-hd.cc',
|
||||
'model/uan-address.cc',
|
||||
'model/uan-net-device.cc',
|
||||
'model/uan-tx-mode.cc',
|
||||
'model/uan-prop-model.cc',
|
||||
@@ -46,7 +45,6 @@ def build(bld):
|
||||
'model/uan-transducer.h',
|
||||
'model/uan-phy-gen.h',
|
||||
'model/uan-transducer-hd.h',
|
||||
'model/uan-address.h',
|
||||
'model/uan-prop-model-ideal.h',
|
||||
'model/uan-mac-aloha.h',
|
||||
'model/uan-header-common.h',
|
||||
|
||||
Reference in New Issue
Block a user