{
static TypeId tid = TypeId ("ns3::MooseBridgeNetDevice")
.SetParent<BridgeNetDevice> ()
- .AddConstructor<MooseBridgeNetDevice> ();
+ .AddConstructor<MooseBridgeNetDevice> ()
+ .AddAttribute ("MooseExpirationTime",
+ "Time it takes for learned MOOSE state entry to expire.",
+ TimeValue (Seconds (30)),
+ MakeTimeAccessor (&MooseBridgeNetDevice::m_expirationTime),
+ MakeTimeChecker ());
return tid;
}
SuffixState* state = iter->second;
if(state->expirationTime > now){
+ return MooseAddress(iter->second->ethernet);
+ } else {
m_ethernetState.erase(iter);
m_suffixState.erase(iter->second->ethernet);
return MooseAddress(Mac48Address::GetBroadcast());
- } else {
- return MooseAddress(iter->second->ethernet);
}
}
state.suffix = moose.GetMooseSuffix();
state.expirationTime = now + m_expirationTime;
+ NS_LOG_LOGIC("Allocating New MOOSE Suffix: (" << moose.GetMoosePrefix().GetInt() << "," << moose.GetMooseSuffix().GetInt() << ") for " << addr48);
+
m_ethernetState[state.suffix] = &state;
} else {
SuffixState &state = iter->second;
if(state.expirationTime > now){
moose = MooseAddress::Combine(m_mooseAddress.GetMoosePrefix(), state.suffix);
+
+ NS_LOG_LOGIC("Using Allocated MOOSE Suffix: (" << moose.GetMoosePrefix().GetInt() << "," << moose.GetMooseSuffix().GetInt() << ")");
+
state.expirationTime = now + m_expirationTime;
} else {
// Delete old and alloc new
// Allocate New
SuffixState &state = m_suffixState[addr48];
-
+
moose = MooseAddress::Allocate(m_mooseAddress.GetMoosePrefix());
state.ethernet = addr48;
state.suffix = moose.GetMooseSuffix();
state.expirationTime = now + m_expirationTime;
+ NS_LOG_LOGIC("Expired MOOSE Suffix: (" << moose.GetMoosePrefix().GetInt() << "," << moose.GetMooseSuffix().GetInt() << ")");
+
m_ethernetState[state.suffix] = &state;
}
#include "moose-bridge-net-device.h"
#include "bridge-port-net-device.h"
#include "moose-bridge-port-net-device.h"
+#include "ns3/arp-header.h"
#include "ns3/moose-address.h"
#include "ns3/node.h"
#include "ns3/channel.h"
void MooseBridgePortNetDevice::Send (Ptr<Packet> packet, const Address& src, const Address& dest, uint16_t protocolNumber){
NS_LOG_FUNCTION_NOARGS();
NS_LOG_DEBUG("Send(device=" << m_device << ",packet=" << packet << ",src=" << src << ",dest=" << dest << ",port=" << this << ",protocol=" << protocolNumber);
-
- BridgePortNetDevice::Send(packet, src, dest, protocolNumber);
+
+ Ptr<MooseBridgeNetDevice> bridge = m_bridge->GetObject<MooseBridgeNetDevice>();
+
+ NS_ASSERT(bridge != NULL);
+
+ Ptr<Packet> npacket = packet->Copy();
+
+ if(protocolNumber == ArpL3Protocol::PROT_NUMBER){
+ // Need to do ARP rewriting.
+
+ ArpHeader arpHeader;
+ npacket->RemoveHeader(arpHeader);
+
+ Mac48Address arp_dst48 = Mac48Address::ConvertFrom(arpHeader.GetDestinationHardwareAddress());
+ MooseAddress arp_mdst(arp_dst48);
+
+ if(arp_mdst.GetMooseType() == MooseAddress::MOOSE){
+ if(arpHeader.IsRequest()){
+ arpHeader.SetRequest(
+ arpHeader.GetSourceHardwareAddress(),
+ arpHeader.GetSourceIpv4Address(),
+ bridge->FromMoose(arp_mdst).GetMacAddress(),
+ arpHeader.GetDestinationIpv4Address()
+ );
+ } else if(arpHeader.IsReply()){
+ arpHeader.SetReply(
+ arpHeader.GetSourceHardwareAddress(),
+ arpHeader.GetSourceIpv4Address(),
+ bridge->FromMoose(arp_mdst).GetMacAddress(),
+ arpHeader.GetDestinationIpv4Address()
+ );
+ } else {
+ NS_ASSERT (arpHeader.IsReply() || arpHeader.IsRequest());
+ }
+
+ NS_LOG_LOGIC("Rewriting ARP Header Destination (from=" << arp_dst48 << ",to=" << bridge->FromMoose(arp_mdst).GetMacAddress() << ")");
+
+ }
+
+ npacket->AddHeader(arpHeader);
+
+ }
+
+ BridgePortNetDevice::Send(npacket, src, dest, protocolNumber);
}
void MooseBridgePortNetDevice::Receive (Ptr<NetDevice> device, Ptr<const Packet> packet, uint16_t protocol, Address const &src, Address const &dst, NetDevice::PacketType packetType){
MooseAddress newsrc = bridge->ToMoose(msrc);
- packet->Print(std::cout); std::cout << std::endl;
+ Ptr<Packet> npacket = packet->Copy();
+
if(protocol == ArpL3Protocol::PROT_NUMBER){
// Need to do ARP rewriting.
+ ArpHeader arpHeader;
+ npacket->RemoveHeader(arpHeader);
+
+ Mac48Address arp_src48 = Mac48Address::ConvertFrom(arpHeader.GetSourceHardwareAddress());
+ MooseAddress arp_msrc(arp_src48);
+
+ if(arp_msrc.GetMooseType() == MooseAddress::HOST){
+ if(arpHeader.IsRequest()){
+ arpHeader.SetRequest(
+ bridge->ToMoose(arp_msrc).GetMacAddress(),
+ arpHeader.GetSourceIpv4Address(),
+ arpHeader.GetDestinationHardwareAddress(),
+ arpHeader.GetDestinationIpv4Address()
+ );
+ } else if(arpHeader.IsReply()){
+ arpHeader.SetReply(
+ bridge->ToMoose(arp_msrc).GetMacAddress(),
+ arpHeader.GetSourceIpv4Address(),
+ arpHeader.GetDestinationHardwareAddress(),
+ arpHeader.GetDestinationIpv4Address()
+ );
+ } else {
+ NS_ASSERT (arpHeader.IsReply() || arpHeader.IsRequest());
+ }
+
+ NS_LOG_LOGIC("Rewriting ARP Header Source (from=" << arp_src48 << ",to=" << bridge->ToMoose(arp_msrc).GetMacAddress() << ")");
+ }
+
+ npacket->AddHeader(arpHeader);
+
}
bridge->Learn(newsrc, this);
- bridge->Forward(this, packet, protocol, newsrc.GetMacAddress(), dst, packetType);
+ bridge->Forward(this, npacket, protocol, newsrc.GetMacAddress(), dst, packetType);
} else {