SendPacketFromRawSocket = BuildPacket + socket->SendTo()

This commit is contained in:
Borovkova Elena
2009-08-05 23:04:55 +04:00
parent c895721193
commit 0b13bf2538
2 changed files with 61 additions and 69 deletions

View File

@@ -481,9 +481,7 @@ RoutingProtocol::SendRequest (Ipv4Address dst, uint16_t ttl )
Ptr<Packet> packet = Create<Packet> ();
packet->AddHeader (rreqHeader);
packet->AddHeader (tHeader);
BuildPacket (/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/iface.GetLocal (),
/*destination address*/iface.GetBroadcast (), /*id*/0, /*TTL*/ttl);
socket->Send (packet);
SendPacketFromRawSocket (/*packet*/packet, /*pair<Ptr<Socket> , Ipv4InterfaceAddress>*/ *j, /*dst*/iface.GetBroadcast (), /*TTL*/ ttl, /*id*/0);
}
ScheduleRreqRetry (dst, ttl);
htimer.Cancel ();
@@ -719,9 +717,8 @@ RoutingProtocol::RecvRequest (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address s
packet->AddHeader (rreqHeader);
TypeHeader tHeader (AODVTYPE_RREQ);
packet->AddHeader (tHeader);
BuildPacket (/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/iface.GetLocal (),
/*destination address*/iface.GetBroadcast (), /*id*/ipv4Header.GetIdentification (), /*TTL*/ipv4Header.GetTtl () - 1);
socket->Send (packet);
SendPacketFromRawSocket (/*packet*/packet, /*pair<Ptr<Socket> , Ipv4InterfaceAddress>*/ *j, /*dst*/iface.GetBroadcast (),
/*TTL*/ ipv4Header.GetTtl () - 1, /*id*/ipv4Header.GetIdentification ());
}
htimer.Cancel ();
@@ -753,10 +750,10 @@ RoutingProtocol::SendReply (RreqHeader const & rreqHeader, RoutingTableEntry con
packet->AddHeader (rrepHeader);
TypeHeader tHeader (AODVTYPE_RREP);
packet->AddHeader (tHeader);
BuildPacket (/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/toOrigin.GetInterface ().GetLocal (),
/*destination address*/toOrigin.GetNextHop (), /*id*/0, /*TTL*/1); //TODO TTL
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ().GetLocal ());
socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT));
NS_ASSERT (socket);
SendPacketFromRawSocket (/*packet*/packet, /*pair<Ptr<Socket> , Ipv4InterfaceAddress>*/ std::make_pair(socket, toOrigin.GetInterface ()),
/*dst*/toOrigin.GetNextHop (), /*TTL*/ toOrigin.GetHop (), /*id*/0);
}
void
@@ -775,10 +772,10 @@ RoutingProtocol::SendReplyByIntermediateNode (RoutingTableEntry & toDst, Routing
packet->AddHeader (rrepHeader);
TypeHeader tHeader (AODVTYPE_RREP);
packet->AddHeader (tHeader);
BuildPacket (/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/toOrigin.GetInterface ().GetLocal (),
/*destination address*/toOrigin.GetNextHop (), /*id*/0, /*TTL*/toOrigin.GetHop ());
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ().GetLocal ());
socket->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT));
NS_ASSERT (socket);
SendPacketFromRawSocket (/*packet*/packet, /*pair<Ptr<Socket> , Ipv4InterfaceAddress>*/ std::make_pair(socket, toOrigin.GetInterface ()),
/*dst*/toOrigin.GetNextHop (), /*TTL*/ toOrigin.GetHop (), /*id*/0);
// Generating gratuitous RREPs
if (gratRep)
@@ -789,10 +786,10 @@ RoutingProtocol::SendReplyByIntermediateNode (RoutingTableEntry & toDst, Routing
Ptr<Packet> packetToDst = Create<Packet> ();
packetToDst->AddHeader (rrepHeader);
packetToDst->AddHeader (tHeader);
BuildPacket (/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/toDst.GetInterface ().GetLocal (),
/*destination address*/toDst.GetNextHop (), /*id*/0, /*TTL*/toDst.GetHop ());
socket = FindSocketWithInterfaceAddress (toDst.GetInterface ().GetLocal ());
socket->SendTo (packetToDst, 0, InetSocketAddress (toDst.GetNextHop (), AODV_PORT));
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toDst.GetInterface ().GetLocal ());
NS_ASSERT (socket);
SendPacketFromRawSocket (/*packet*/packet, /*pair<Ptr<Socket> , Ipv4InterfaceAddress>*/ std::make_pair(socket, toDst.GetInterface ()),
/*dst*/toDst.GetNextHop (), /*TTL*/ toDst.GetHop (), /*id*/0);
}
}
@@ -807,10 +804,10 @@ RoutingProtocol::SendReplyAck (Ipv4Address neighbor )
packet->AddHeader (typeHeader);
RoutingTableEntry toNeighbor;
m_routingTable.LookupRoute (neighbor, toNeighbor);
BuildPacket (/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/toNeighbor.GetInterface ().GetLocal (),
/*destination address*/neighbor, /*id*/0, /*TTL*/35); // TODO TTL
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toNeighbor.GetInterface ().GetLocal ());
socket->SendTo (packet, 0, InetSocketAddress (neighbor, AODV_PORT));
NS_ASSERT (socket);
SendPacketFromRawSocket (/*packet*/packet, /*pair<Ptr<Socket> , Ipv4InterfaceAddress>*/ std::make_pair(socket, toNeighbor.GetInterface ()),
/*dst*/neighbor, /*TTL*/ 1, /*id*/0);
}
void
@@ -844,8 +841,8 @@ RoutingProtocol::RecvReply (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address sen
*/
Ptr<NetDevice> dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (receiver));
RoutingTableEntry newEntry (/*device=*/dev, /*dst=*/dst, /*validSeqNo=*/true, /*seqno=*/rrepHeader.GetDstSeqno (),
/*iface=*/m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0),/*hop=*/hop, /*nextHop=*/sender,
/*lifeTime=*/rrepHeader.GetLifeTime ());
/*iface=*/m_ipv4->GetAddress (m_ipv4->GetInterfaceForAddress (receiver), 0),/*hop=*/hop,
/*nextHop=*/sender, /*lifeTime=*/rrepHeader.GetLifeTime ());
RoutingTableEntry toDst;
if (m_routingTable.LookupRoute (dst, toDst))
{
@@ -920,16 +917,10 @@ RoutingProtocol::RecvReply (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address sen
packet->AddHeader (rrepHeader);
TypeHeader tHeader (AODVTYPE_RREP);
packet->AddHeader (tHeader);
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j)
{
dev = m_ipv4->GetNetDevice (m_ipv4->GetInterfaceForAddress (j->second.GetLocal ()));
if (dev->GetAddress () == toOrigin.GetOutputDevice ()->GetAddress ())
{
BuildPacket (/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/j->second.GetLocal (),
/*destination address*/toOrigin.GetNextHop (), /*id*/0, /*TTL*/ipv4Header.GetTtl () - 1);
j->first->SendTo (packet, 0, InetSocketAddress (toOrigin.GetNextHop (), AODV_PORT));
}
}
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toOrigin.GetInterface ().GetLocal ());
NS_ASSERT (socket);
SendPacketFromRawSocket (/*packet*/packet, /*pair<Ptr<Socket> , Ipv4InterfaceAddress>*/ std::make_pair(socket, toOrigin.GetInterface ()),
/*dst*/toOrigin.GetNextHop (), /*TTL*/ ipv4Header.GetTtl () - 1, /*id*/0);
}
void
@@ -1114,12 +1105,33 @@ RoutingProtocol::SendHello ()
packet->AddHeader (helloHeader);
TypeHeader tHeader (AODVTYPE_RREP);
packet->AddHeader (tHeader);
BuildPacket (/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/iface.GetLocal (),
/*destination address*/iface.GetBroadcast (), /*id*/0, /*TTL*/1);
socket->Send (packet);
SendPacketFromRawSocket (/*packet*/packet, /*pair<Ptr<Socket> , Ipv4InterfaceAddress>*/ *j,
/*dst*/iface.GetBroadcast (), /*TTL*/ 1, /*id*/0);
}
}
void
RoutingProtocol::SendPacketFromRawSocket (Ptr<Packet> packet, std::pair<Ptr<Socket> , Ipv4InterfaceAddress> socketAddress, Ipv4Address dst,
uint16_t ttl, uint16_t id )
{
UdpHeader udpHeader;
udpHeader.SetDestinationPort (AODV_PORT);
udpHeader.SetSourcePort (AODV_PORT);
packet->AddHeader (udpHeader);
Ipv4Header ipv4Header;
ipv4Header.SetSource (socketAddress.second.GetLocal ());
ipv4Header.SetDestination (dst);
ipv4Header.SetIdentification (id);
ipv4Header.EnableChecksum ();
ipv4Header.SetProtocol (UdpL4Protocol::PROT_NUMBER);
ipv4Header.SetTtl (ttl);
ipv4Header.SetPayloadSize (packet->GetSize ());
packet->AddHeader (ipv4Header);
socketAddress.first->SendTo (packet, 0, InetSocketAddress (dst, AODV_PORT));
}
void
RoutingProtocol::SendPacketFromQueue (Ipv4Address dst, Ptr<Ipv4Route> route )
{
@@ -1196,11 +1208,10 @@ RoutingProtocol::SendRerrMessage (Ptr<Packet> packet, std::vector<Ipv4Address> p
{
RoutingTableEntry toPrecursor;
m_routingTable.LookupRoute (precursors.front (), toPrecursor);
BuildPacket (/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/
toPrecursor.GetInterface ().GetLocal (),
/*destination address*/precursors.front (), /*id*/0, /*TTL*/1);
Ptr<Socket> socket = FindSocketWithInterfaceAddress (toPrecursor.GetInterface ().GetLocal ());
socket->SendTo (packet, 0, InetSocketAddress (toPrecursor.GetDestination (), AODV_PORT));
NS_ASSERT (socket);
SendPacketFromRawSocket (/*packet*/packet, /*pair<Ptr<Socket> , Ipv4InterfaceAddress>*/ std::make_pair(socket, toPrecursor.GetInterface ()),
/*dst*/precursors.front (), /*TTL*/ 1, /*id*/0);
return;
}
@@ -1225,9 +1236,9 @@ RoutingProtocol::SendRerrMessage (Ptr<Packet> packet, std::vector<Ipv4Address> p
for (std::vector<Ipv4Address>::const_iterator i = ifaces.begin (); i != ifaces.end (); ++i)
{
Ptr<Socket> socket = FindSocketWithInterfaceAddress (*i);
BuildPacket (/*packet*/packet, /*source port*/AODV_PORT, /*destination port*/AODV_PORT, /*source address*/*i,
/*destination address*/m_socketAddresses[socket].GetBroadcast (), /*id*/0, /*TTL*/1);
socket->Send (packet, 0);
NS_ASSERT (socket);
SendPacketFromRawSocket (/*packet*/packet, /*pair<Ptr<Socket> , Ipv4InterfaceAddress>*/ std::make_pair(socket, toPrecursor.GetInterface ()),
/*dst*/m_socketAddresses[socket].GetBroadcast (), /*TTL*/ 1, /*id*/0);
}
}
@@ -1246,25 +1257,6 @@ RoutingProtocol::FindSocketWithInterfaceAddress (Ipv4Address addr ) const
return socket;
}
void
RoutingProtocol::BuildPacket (Ptr<Packet> packet, uint16_t sport, uint16_t dport, Ipv4Address src, Ipv4Address dst, uint32_t identification,
uint16_t ttl )
{
UdpHeader udpHeader;
udpHeader.SetDestinationPort (sport);
udpHeader.SetSourcePort (dport);
packet->AddHeader (udpHeader);
Ipv4Header ipv4Header;
ipv4Header.SetSource (src);
ipv4Header.SetDestination (dst);
ipv4Header.SetIdentification (identification);
ipv4Header.EnableChecksum ();
ipv4Header.SetProtocol (UdpL4Protocol::PROT_NUMBER);
ipv4Header.SetTtl (ttl);
ipv4Header.SetPayloadSize (packet->GetSize ());
packet->AddHeader (ipv4Header);
}
void
RoutingProtocol::LocalRouteRepair (Ipv4Address dst, Ipv4Address origin )

View File

@@ -172,15 +172,6 @@ private:
bool IsMyOwnPacket(Ipv4Address src);
/// Find socket with local interface address iface
Ptr<Socket> FindSocketWithInterfaceAddress(Ipv4Address iface) const;
/**
* Add UDP and IP header to packet.
* \param sport - source port number
* \param dport - destination port number
* \param src - source IP address
* \param dst - destination IP address
* \param identification - used as sequence number for broadcast traffic
*/
void BuildPacket(Ptr<Packet> packet, uint16_t sport, uint16_t dport, Ipv4Address src, Ipv4Address dst, uint32_t identification, uint16_t ttl);
/// Process hello message
void ProcessHello(RrepHeader const & rrepHeader, Ipv4Address receiverIfaceAddr);
@@ -222,6 +213,15 @@ private:
void SendRerrWhenBreaksLinkToNextHop (Ipv4Address nextHop);
/// Forward RERR
void SendRerrMessage(Ptr<Packet> packet, std::vector<Ipv4Address> precursors);
/**
* Add UDP and IP header to packet.
* \param sport - source port number
* \param dport - destination port number
* \param src - source IP address
* \param dst - destination IP address
* \param identification - used as sequence number for broadcast traffic
*/
void SendPacketFromRawSocket (Ptr<Packet> packet, std::pair<Ptr<Socket> , Ipv4InterfaceAddress> socketAddress, Ipv4Address dst, uint16_t ttl, uint16_t id);
//\}
/// Notify that packet is dropped for some reason