RREQ reveived

This commit is contained in:
Pavel Boyko
2009-07-14 17:12:05 +04:00
parent dfd1652a5c
commit f38e5b6a5f

View File

@@ -133,6 +133,40 @@ RoutingProtocol::DoDispose ()
Ipv4RoutingProtocol::DoDispose ();
}
void
RoutingProtocol::Start ()
{
NS_LOG_FUNCTION (this);
// Open UDP sockets for control traffic on each IP interface
const Ipv4Address loopback ("127.0.0.1");
for (uint32_t i = 0; i < m_ipv4->GetNInterfaces (); i++)
{
Ipv4InterfaceAddress iface = m_ipv4->GetAddress (i, 0);
if (iface.GetLocal() == loopback) continue;
// Create a socket to listen only on this interface
Ptr<Socket> socket = Socket::CreateSocket( GetObject<Node> (), TypeId::LookupByName ("ns3::UdpSocketFactory"));
NS_ASSERT (socket != 0);
int status = socket->Bind (InetSocketAddress (iface.GetLocal(), AODV_PORT));
NS_ASSERT (status != -1);
socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this));
status = socket->Connect (InetSocketAddress (iface.GetBroadcast(), AODV_PORT));
NS_ASSERT (status != -1);
m_socketAddresses.insert(std::make_pair(socket, iface));
NS_LOG_INFO ("Interface " << iface << " used by AODV");
// Add local broadcast record to the routing table
aodv_rt_entry rt(/*dst=*/iface.GetBroadcast (),
/*know seqno=*/true, /*seqno=*/0,
/*iface=*/iface.GetLocal (),
/*hops=*/1,
/*next hop=*/iface.GetBroadcast (),
/*lifetime=*/Seconds(1e9)); // TODO use infty
rtable.rt_add (rt);
}
}
Ptr<Ipv4Route>
RoutingProtocol::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, uint32_t oif, Socket::SocketErrno &sockerr)
{
@@ -161,48 +195,52 @@ RoutingProtocol::RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<
LocalDeliverCallback lcb, ErrorCallback ecb)
{
NS_LOG_FUNCTION (this << p->GetUid() << header.GetDestination() << idev->GetAddress());
return false;
#if 0
NS_ASSERT (m_ipv4 != 0);
// Check if input device supports IP
NS_ASSERT (m_ipv4->GetInterfaceForDevice (idev) >= 0);
uint32_t iif = m_ipv4->GetInterfaceForDevice (idev);
Ipv4Address dst = header.GetDestination();
Ipv4Address dst = header.GetDestination ();
for(std::vector<Ipv4InterfaceAddress>::const_iterator j = m_myAddresses.begin(); j != m_myAddresses.end(); ++j)
{
if (j->GetLocal() == dst)
// Local delivery to AODV interfaces
for(std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin(); j != m_socketAddresses.end(); ++j)
{
NS_LOG_LOGIC ("Local delivery of unicast");
lcb(p,header, iif);
Ipv4InterfaceAddress iface = j->second;
if (dst == iface.GetLocal ())
{
NS_LOG_LOGIC ("Unicast local delivery to " << iface.GetLocal ());
lcb(p, header, iif);
return true;
}
if (dst == iface.GetBroadcast ())
{
NS_LOG_LOGIC ("Broadcast local delivery to " << iface.GetLocal ());
// TODO not duplicate
lcb(p, header, iif);
// TODO has TTL, forward
return true;
}
}
// TODO: local delivery to non-AODV interfaces
// Forwarding
aodv_rt_entry rt;
if (rtable.rt_lookup(dst, rt))
{
Ptr<Ipv4Route> rtentry;
rtentry->SetDestination (dst);
rtentry->SetGateway (rt.GetNextHop());
rtentry->SetSource (rt.GetInterface());
// TODO store interface index, not address?
rtentry->SetOutputDevice (m_ipv4->GetNetDevice(m_ipv4->GetInterfaceForAddress (rt.GetInterface())));
ucb (rtentry, p, header);
return true;
}
if (j->GetBroadcast() == dst)
{
NS_LOG_LOGIC ("Local delivery of broadcast");
// TODO not duplicate
lcb(p,header, iif);
// TODO forward
return true;
}
}
return false;
Ptr<Ipv4Route> rtentry;
aodv_rt_entry toDst;
if(rtable.rt_lookup(dst, toDst))
{
rtentry->SetDestination(dst);
rtentry->SetGateway(toDst.GetNextHop());
rtentry->SetSource(toDst.GetInterface());
uint32_t interfaceIdx = 0;
rtentry->SetOutputDevice(m_ipv4->GetNetDevice (interfaceIdx));
ucb (rtentry, p, header);
return true;
}
return false;
#endif
}
void
@@ -222,41 +260,6 @@ RoutingProtocol::SetIpv4 (Ptr<Ipv4> ipv4)
Simulator::ScheduleNow (&RoutingProtocol::Start, this);
}
void
RoutingProtocol::Start ()
{
NS_LOG_FUNCTION (this);
// Open UDP sockets for control traffic on each IP interface
const Ipv4Address loopback ("127.0.0.1");
for (uint32_t i = 0; i < m_ipv4->GetNInterfaces (); i++)
{
Ipv4InterfaceAddress iface = m_ipv4->GetAddress (i, 0);
if (iface.GetLocal() == loopback) continue;
// Create a socket to listen only on this interface
Ptr<Socket> socket = Socket::CreateSocket( GetObject<Node> (), TypeId::LookupByName ("ns3::Ipv4RawSocketFactory"));
NS_ASSERT (socket != 0);
socket->SetAttribute ("Protocol", UintegerValue (17)); // UDP
int status = socket->Bind (InetSocketAddress (iface.GetLocal(), AODV_PORT));
NS_ASSERT (status != -1);
socket->SetRecvCallback (MakeCallback (&RoutingProtocol::RecvAodv, this));
status = socket->Connect (InetSocketAddress (iface.GetBroadcast(), AODV_PORT));
NS_ASSERT (status != -1);
m_socketAddresses.insert(std::make_pair(socket, iface));
NS_LOG_INFO ("Interface " << iface << " used by AODV");
// Add local broadcast record to the routing table
aodv_rt_entry rt(/*dst=*/iface.GetBroadcast (),
/*know seqno=*/true, /*seqno=*/0,
/*iface=*/iface.GetLocal (),
/*hops=*/1,
/*next hop=*/iface.GetBroadcast (),
/*lifetime=*/Seconds(1e9)); // TODO use infty
rtable.rt_add (rt);
}
}
void
RoutingProtocol::NotifyInterfaceUp (uint32_t i)
{
@@ -281,6 +284,56 @@ RoutingProtocol::NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress a
{
}
// TODO add use an expanding ring search technique
void
RoutingProtocol::SendRequest (Ipv4Address dst, bool G, bool D)
{
NS_LOG_FUNCTION (this << dst);
// Create RREQ header
TypeHeader tHeader (AODVTYPE_RREQ);
RreqHeader rreqHeader;
rreqHeader.SetDst (dst);
aodv_rt_entry rt;
if(rtable.rt_lookup (dst, rt))
{
rreqHeader.SetHopCount (rt.GetLastValidHopCount());
rreqHeader.SetDstSeqno (rt.GetSeqNo());
}
else
{
rreqHeader.SetUnknownSeqno(true);
}
if (G) rreqHeader.SetGratiousRrep(true);
if (D) rreqHeader.SetDestinationOnly(true);
seqno++;
rreqHeader.SetOriginSeqno(seqno);
bid++;
rreqHeader.SetId(bid);
rreqHeader.SetHopCount(0);
// Send RREQ as subnet directed broadcast from each (own) interface
Ipv4Header ipv4Header;
Ptr<Packet> packet = Create<Packet> ();
for(std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin(); j != m_socketAddresses.end(); ++j)
{
Ptr<Socket> socket = j->first;
Ipv4InterfaceAddress iface = j->second;
rreqHeader.SetOrigin (iface.GetLocal());
InsertBroadcastId (iface.GetLocal(), bid);
packet->AddHeader (rreqHeader);
packet->AddHeader (tHeader);
socket->Send (packet);
}
// htimer.SetDelay(HELLO_INTERVAL);
// htimer.Schedule();
}
void
RoutingProtocol::RecvAodv (Ptr<Socket> socket)
{
@@ -649,72 +702,6 @@ RoutingProtocol::SendHello ()
// TODO send hello packet from interfaces
}
// TODO add use an expanding ring search technique
void
RoutingProtocol::SendRequest (Ipv4Address dst, bool G, bool D)
{
NS_LOG_FUNCTION (this << dst);
// Create dummy UDP header
UdpHeader udpHeader;
udpHeader.SetSourcePort (AODV_PORT);
udpHeader.SetDestinationPort (AODV_PORT);
// Create RREQ header
TypeHeader tHeader (AODVTYPE_RREQ);
RreqHeader rreqHeader;
rreqHeader.SetDst (dst);
aodv_rt_entry rt;
if(rtable.rt_lookup (dst, rt))
{
rreqHeader.SetHopCount (rt.GetLastValidHopCount());
rreqHeader.SetDstSeqno (rt.GetSeqNo());
}
else
{
rreqHeader.SetUnknownSeqno(true);
}
if (G) rreqHeader.SetGratiousRrep(true);
if (D) rreqHeader.SetDestinationOnly(true);
seqno++;
rreqHeader.SetOriginSeqno(seqno);
bid++;
rreqHeader.SetId(bid);
rreqHeader.SetHopCount(0);
// Send RREQ as subnet directed broadcast from each (own) interface
Ipv4Header ipv4Header;
Ptr<Packet> packet = Create<Packet> ();
for(std::map<Ptr<Socket>, Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin(); j != m_socketAddresses.end(); ++j)
{
Ptr<Socket> socket = j->first;
Ipv4InterfaceAddress iface = j->second;
ipv4Header.SetDestination (iface.GetBroadcast());
ipv4Header.SetSource (iface.GetLocal ());
ipv4Header.SetTtl (NET_DIAMETER);
NS_LOG_LOGIC ("Sending RREQ from " << iface.GetLocal() << " to " << iface.GetBroadcast() << " with TTL " << (int)ipv4Header.GetTtl());
rreqHeader.SetOrigin (iface.GetLocal());
InsertBroadcastId (iface.GetLocal(), bid);
packet->AddHeader (rreqHeader);
packet->AddHeader (tHeader);
packet->AddHeader (udpHeader);
packet->AddHeader (ipv4Header);
udpHeader.Print (std::cout);
std::cout << "\n";
socket->Send (packet);
}
// htimer.SetDelay(HELLO_INTERVAL);
// htimer.Schedule();
}
void
RoutingProtocol::SendReply (RreqHeader & rreqHeader, aodv_rt_entry & toOrigin)