BuildHeader added + support of raw socket in ipv4-l3-protol added
This commit is contained in:
@@ -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),
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user