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 */