internet: (fixes #2500) Ipv[4,6]RawSocket ignores IpTtl tag

This commit is contained in:
Tommaso Pecorella
2016-09-12 22:53:56 +02:00
parent fdae292bfc
commit dcb87ae4c5
4 changed files with 81 additions and 6 deletions

View File

@@ -101,6 +101,7 @@ Bugs fixed
- Bug 2479 - Flow monitor does not a have a "DROP_QUEUE_DISC" drop reason
- Bug 2484 - Corrected the exit from CA_LOSS state in TCP
- Bug 2486 - NextTxSequence was not traced back from TCB
- Bug 2500 - Ipv[4,6]RawSocket ignores IpTtl tag
Known issues
------------

View File

@@ -182,6 +182,8 @@ Ipv4RawSocketImpl::Connect (const Address &address)
}
InetSocketAddress ad = InetSocketAddress::ConvertFrom (address);
m_dst = ad.GetIpv4 ();
SetIpTos (ad.GetTos ());
return 0;
}
int
@@ -202,6 +204,7 @@ Ipv4RawSocketImpl::Send (Ptr<Packet> p, uint32_t flags)
{
NS_LOG_FUNCTION (this << p << flags);
InetSocketAddress to = InetSocketAddress (m_dst, m_protocol);
to.SetTos (GetIpTos ());
return SendTo (p, flags, to);
}
int
@@ -218,10 +221,36 @@ Ipv4RawSocketImpl::SendTo (Ptr<Packet> p, uint32_t flags,
{
return 0;
}
InetSocketAddress ad = InetSocketAddress::ConvertFrom (toAddress);
Ptr<Ipv4> ipv4 = m_node->GetObject<Ipv4> ();
Ipv4Address dst = ad.GetIpv4 ();
Ipv4Address src = m_src;
uint8_t tos = ad.GetTos ();
uint8_t priority = GetPriority ();
if (tos)
{
SocketIpTosTag ipTosTag;
ipTosTag.SetTos (tos);
// This packet may already have a SocketIpTosTag (see BUG 2440)
p->ReplacePacketTag (ipTosTag);
priority = IpTos2Priority (tos);
}
if (priority)
{
SocketPriorityTag priorityTag;
priorityTag.SetPriority (priority);
p->ReplacePacketTag (priorityTag);
}
if (IsManualIpTtl () && GetIpTtl () != 0 && !dst.IsMulticast () && !dst.IsBroadcast ())
{
SocketIpTtlTag tag;
tag.SetTtl (GetIpTtl ());
p->AddPacketTag (tag);
}
if (ipv4->GetRoutingProtocol ())
{
Ipv4Header header;
@@ -357,7 +386,23 @@ Ipv4RawSocketImpl::ForwardUp (Ptr<const Packet> p, Ipv4Header ipHeader, Ptr<Ipv4
tag.SetRecvIf (incomingInterface->GetDevice ()->GetIfIndex ());
copy->AddPacketTag (tag);
}
if (m_protocol == 1)
//Check only version 4 options
if (IsIpRecvTos ())
{
SocketIpTosTag ipTosTag;
ipTosTag.SetTos (ipHeader.GetTos ());
copy->AddPacketTag (ipTosTag);
}
if (IsIpRecvTtl ())
{
SocketIpTtlTag ipTtlTag;
ipTtlTag.SetTtl (ipHeader.GetTtl ());
copy->AddPacketTag (ipTtlTag);
}
if (m_protocol == 1)
{
Icmpv4Header icmpHeader;
copy->PeekHeader (icmpHeader);

View File

@@ -186,9 +186,9 @@ int Ipv6RawSocketImpl::Connect (const Address& address)
m_err = Socket::ERROR_INVAL;
return -1;
}
Inet6SocketAddress ad = Inet6SocketAddress::ConvertFrom (address);
m_dst = ad.GetIpv6 ();
return 0;
}
@@ -225,6 +225,20 @@ int Ipv6RawSocketImpl::SendTo (Ptr<Packet> p, uint32_t flags, const Address& toA
Ptr<Ipv6L3Protocol> ipv6 = m_node->GetObject<Ipv6L3Protocol> ();
Ipv6Address dst = ad.GetIpv6 ();
if (IsManualIpv6Tclass ())
{
SocketIpv6TclassTag ipTclassTag;
ipTclassTag.SetTclass (GetIpv6Tclass ());
p->AddPacketTag (ipTclassTag);
}
if (IsManualIpv6HopLimit () && GetIpv6HopLimit () != 0 && !dst.IsMulticast ())
{
SocketIpv6HopLimitTag tag;
tag.SetHopLimit (GetIpv6HopLimit ());
p->AddPacketTag (tag);
}
if (ipv6->GetRoutingProtocol ())
{
Ipv6Header hdr;
@@ -418,7 +432,7 @@ bool Ipv6RawSocketImpl::ForwardUp (Ptr<const Packet> p, Ipv6Header hdr, Ptr<NetD
}
}
// Should check via getsockopt ()..
// Should check via getsockopt ().
if (IsRecvPktInfo ())
{
Ipv6PacketInfoTag tag;
@@ -427,6 +441,21 @@ bool Ipv6RawSocketImpl::ForwardUp (Ptr<const Packet> p, Ipv6Header hdr, Ptr<NetD
copy->AddPacketTag (tag);
}
// Check only version 6 options
if (IsIpv6RecvTclass ())
{
SocketIpv6TclassTag ipTclassTag;
ipTclassTag.SetTclass (hdr.GetTrafficClass ());
copy->AddPacketTag (ipTclassTag);
}
if (IsIpv6RecvHopLimit ())
{
SocketIpv6HopLimitTag ipHopLimitTag;
ipHopLimitTag.SetHopLimit (hdr.GetHopLimit ());
copy->AddPacketTag (ipHopLimitTag);
}
copy->AddHeader (hdr);
Data data;
data.packet = copy;

View File

@@ -421,7 +421,7 @@ int
UdpSocketImpl::DoSend (Ptr<Packet> p)
{
NS_LOG_FUNCTION (this << p);
if ((m_endPoint == 0) && (InetSocketAddress::IsMatchingType(m_defaultAddress) == true))
if ((m_endPoint == 0) && (Ipv4Address::IsMatchingType(m_defaultAddress) == true))
{
if (Bind () == -1)
{
@@ -430,7 +430,7 @@ UdpSocketImpl::DoSend (Ptr<Packet> p)
}
NS_ASSERT (m_endPoint != 0);
}
else if ((m_endPoint6 == 0) && (Inet6SocketAddress::IsMatchingType(m_defaultAddress) == true))
else if ((m_endPoint6 == 0) && (Ipv6Address::IsMatchingType(m_defaultAddress) == true))
{
if (Bind6 () == -1)
{
@@ -692,7 +692,7 @@ UdpSocketImpl::DoSendTo (Ptr<Packet> p, Ipv6Address dest, uint16_t port)
return -1;
}
if (IsManualIpv6Tclass ())
if (IsManualIpv6Tclass ())
{
SocketIpv6TclassTag ipTclassTag;
ipTclassTag.SetTclass (GetIpv6Tclass ());