internet: (fixes #2500) Ipv[4,6]RawSocket ignores IpTtl tag
This commit is contained in:
@@ -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
|
||||
------------
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 ());
|
||||
|
||||
Reference in New Issue
Block a user