BuildHeader added + support of raw socket in ipv4-l3-protol added

This commit is contained in:
Borovkova Elena
2009-07-28 14:23:22 +04:00
parent 807146f0b0
commit ff7cc0bd55
6 changed files with 82 additions and 24 deletions

View File

@@ -141,6 +141,21 @@ Ipv4L3Protocol::CreateRawSocket2 (void)
void
Ipv4L3Protocol::DeleteRawSocket2 (Ptr<Socket> socket)
{
NS_LOG_FUNCTION (this << socket);
for (RawSocketList::iterator i = m_rawSocket.begin (); i != m_rawSocket.end (); ++i)
{
if ((*i) == socket)
{
m_rawSocket.erase (i);
return;
}
}
return;
}
void
Ipv4L3Protocol::DeleteRawSocket (Ptr<Socket> socket)
{
NS_LOG_FUNCTION (this << socket);
@@ -154,6 +169,7 @@ Ipv4L3Protocol::DeleteRawSocket (Ptr<Socket> socket)
}
return;
}
/*
* This method is called by AddAgregate and completes the aggregation
* by setting the node in the ipv4 stack
@@ -424,6 +440,14 @@ Ipv4L3Protocol::Receive( Ptr<NetDevice> device, Ptr<const Packet> p, uint16_t pr
socket->ForwardUp (packet, ipHeader, device);
}
NS_LOG_UNCOND(m_rawSocket.size());
for (RawSocketList::iterator i = m_rawSocket.begin (); i != m_rawSocket.end (); ++i)
{
NS_LOG_UNCOND ("Forwarding to raw socket");
Ptr<RawSocketImpl> socket = *i;
socket->ForwardUp (p, device);
}
NS_LOG_UNCOND("in route input");
m_routingProtocol->RouteInput (packet, ipHeader, device,
MakeCallback (&Ipv4L3Protocol::IpForward, this),
MakeCallback (&Ipv4L3Protocol::IpMulticastForward, this),

View File

@@ -75,6 +75,8 @@ public:
Ptr<Socket> CreateRawSocket (void);
Ptr<Socket> CreateRawSocket2 (void);
void DeleteRawSocket (Ptr<Socket> socket);
void DeleteRawSocket2 (Ptr<Socket> socket);
/**
* \param protocol a template for the protocol to add to this L4 Demux.

View File

@@ -144,14 +144,14 @@ RawSocketImpl::GetTxAvailable (void) const
int
RawSocketImpl::Send (Ptr<Packet> p, uint32_t flags)
{
NS_LOG_FUNCTION (this << p << flags);
NS_LOG_FUNCTION (this << " packet " << p << flags);
InetSocketAddress to = InetSocketAddress (m_dst, m_protocol);
return SendTo (p, flags, to);
}
int
RawSocketImpl::SendTo (Ptr<Packet> packet, uint32_t flags, const Address &toAddress)
{
NS_LOG_FUNCTION (this << packet << flags << toAddress);
if (!InetSocketAddress::IsMatchingType (toAddress))
{
m_err = Socket::ERROR_INVAL;
@@ -163,7 +163,9 @@ RawSocketImpl::SendTo (Ptr<Packet> packet, uint32_t flags, const Address &toAddr
}
InetSocketAddress ad = InetSocketAddress::ConvertFrom (toAddress);
Ptr<Ipv4L3Protocol> ipv4 = m_node->GetObject<Ipv4L3Protocol> ();
NS_ASSERT(ipv4 != 0);
Ipv4Address dst = ad.GetIpv4 ();
NS_LOG_LOGIC ("RawSocketImpl::SendTo packet uid " << packet->GetUid() << " address " << dst);
if (ipv4->GetRoutingProtocol ())
{
Ipv4Header header;
@@ -262,13 +264,16 @@ RawSocketImpl::SetProtocol (uint16_t protocol)
}
bool
RawSocketImpl::ForwardUp (Ptr<const Packet> p, Ipv4Header ipHeader, Ptr<NetDevice> device)
RawSocketImpl::ForwardUp (Ptr<const Packet> p, Ptr<NetDevice> device)
{
NS_LOG_FUNCTION (this << *p << ipHeader << device);
NS_LOG_FUNCTION (this << *p << device);
if (m_shutdownRecv)
{
return false;
} NS_LOG_LOGIC ("src = " << m_src << " dst = " << m_dst);
Ptr<Packet> copy = p->Copy ();
Ipv4Header ipHeader;
copy->RemoveHeader (ipHeader);
if ((m_src == Ipv4Address::GetAny () || ipHeader.GetDestination () == m_src) && (m_dst == Ipv4Address::GetAny () || ipHeader.GetSource () == m_dst)
&& ipHeader.GetProtocol () == m_protocol)
{
@@ -284,7 +289,6 @@ RawSocketImpl::ForwardUp (Ptr<const Packet> p, Ipv4Header ipHeader, Ptr<NetDevic
return false;
}
}
copy->AddHeader (ipHeader);
struct Data data;
data.packet = copy;
data.fromIp = ipHeader.GetSource ();

View File

@@ -40,7 +40,7 @@ public:
Address &fromAddress);
void SetProtocol (uint16_t protocol);
bool ForwardUp (Ptr<const Packet> p, Ipv4Header ipHeader, Ptr<NetDevice> device);
bool ForwardUp (Ptr<const Packet> p, Ptr<NetDevice> device);
private:
virtual void DoDispose (void);
@@ -63,4 +63,4 @@ private:
} // namespace ns3
#endif /* IPV4_RAW_SOCKET_IMPL_H */
#endif /* RAW_SOCKET_IMPL_H */

View File

@@ -45,7 +45,7 @@
#include "ns3/raw-socket-factory.h"
#include "ns3/ipv4-raw-socket-factory.h"
#include "src/internet-stack/udp-l4-protocol.h"
/// UDP Port for AODV control traffic
@@ -235,15 +235,16 @@ RoutingProtocol::Start ()
continue;
// Create a socket to listen only on this interface
NS_LOG_UNCOND("create raw socket");
Ptr<RawSocketImpl> socket = CreateObject<RawSocketImpl> ();
socket->SetNode(GetObject<Node> ());
//Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (), RawSocketFactory::GetTypeId());
// Ptr<Socket> socket = Socket::CreateSocket (GetObject<Node> (), RawSocketFactory::GetTypeId());
NS_ASSERT (socket != 0);
int status = socket->Bind (InetSocketAddress (iface.GetLocal (), AODV_PORT));
NS_ASSERT (status != -1);
// 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);
// 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");
@@ -439,13 +440,12 @@ RoutingProtocol::IsMyOwnPacket (Ipv4Address src)
void
RoutingProtocol::SendRequest (Ipv4Address dst, bool D, bool G)
{
NS_LOG_FUNCTION (this << dst);
NS_LOG_FUNCTION ( this << dst);
// Create RREQ header
TypeHeader tHeader (AODVTYPE_RREQ);
RreqHeader rreqHeader;
Ipv4Header ipv4Header;
ipv4Header.SetTtl (NET_DIAMETER);
rreqHeader.SetDst (dst);
RoutingTableEntry rt;
@@ -488,6 +488,8 @@ RoutingProtocol::SendRequest (Ipv4Address dst, bool D, bool G)
rreqHeader.SetId (m_broadcastID);
rreqHeader.SetHopCount (0);
// Send RREQ as subnet directed broadcast from each (own) interface
Ptr<Packet> packet = Create<Packet> ();
for (std::map<Ptr<Socket> , Ipv4InterfaceAddress>::const_iterator j = m_socketAddresses.begin (); j != m_socketAddresses.end (); ++j)
@@ -498,11 +500,10 @@ RoutingProtocol::SendRequest (Ipv4Address dst, bool D, bool G)
rreqHeader.SetOrigin (iface.GetLocal ());
InsertBroadcastId (iface.GetLocal (), m_broadcastID);
ipv4Header.SetSource (iface.GetLocal ());
ipv4Header.SetDestination (iface.GetBroadcast());
packet->AddHeader (rreqHeader);
packet->AddHeader (tHeader);
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*/ m_seqNo, /*TTL*/ NET_DIAMETER); //TODO add seqno for broadcast
socket->Send (packet);
}
@@ -719,7 +720,7 @@ RoutingProtocol::RecvRequest (Ptr<Packet> p, Ipv4Address receiver, Ipv4Address s
{
Ptr<Socket> socket = j->first;
Ipv4InterfaceAddress iface = j->second;
socket->Send (packet);
socket->Send (packet,0);
}
htimer.Cancel();
@@ -1094,7 +1095,7 @@ RoutingProtocol::SendHello ()
packet->AddHeader (helloHeader);
TypeHeader tHeader (AODVTYPE_RREP);
packet->AddHeader (tHeader);
socket->Send (packet);
socket->Send (packet,0);
}
}
@@ -1193,7 +1194,7 @@ 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);
socket->Send (packet);
socket->Send (packet,0);
}
}
@@ -1212,13 +1213,31 @@ 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, Ptr<Packet> p)
{
// TODO local_rt_repair
}
void
RoutingProtocol::HandleLinkFailure (Ipv4Address addr)
{

View File

@@ -204,6 +204,15 @@ 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);