uan: (fixes #2413) Changes in the UAN module to support NS-3 IP stack

This commit is contained in:
Hossam Khader
2018-02-24 20:07:05 -06:00
parent 56b004d52b
commit ad5f9374e0
31 changed files with 427 additions and 308 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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.
*

View File

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

View File

@@ -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 */

View File

@@ -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',

View File

@@ -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 ())
{

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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. */

View File

@@ -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++)
{

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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',