diff --git a/RELEASE_NOTES b/RELEASE_NOTES index d00197e96..221f8589e 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -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 ------------ diff --git a/src/internet/model/ipv4-raw-socket-impl.cc b/src/internet/model/ipv4-raw-socket-impl.cc index 5f7ffe258..9ce435b97 100644 --- a/src/internet/model/ipv4-raw-socket-impl.cc +++ b/src/internet/model/ipv4-raw-socket-impl.cc @@ -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 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 p, uint32_t flags, { return 0; } + InetSocketAddress ad = InetSocketAddress::ConvertFrom (toAddress); Ptr ipv4 = m_node->GetObject (); 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 p, Ipv4Header ipHeader, PtrGetDevice ()->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); diff --git a/src/internet/model/ipv6-raw-socket-impl.cc b/src/internet/model/ipv6-raw-socket-impl.cc index cb47e3ad7..3de31568b 100644 --- a/src/internet/model/ipv6-raw-socket-impl.cc +++ b/src/internet/model/ipv6-raw-socket-impl.cc @@ -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 p, uint32_t flags, const Address& toA Ptr ipv6 = m_node->GetObject (); 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 p, Ipv6Header hdr, Ptr p, Ipv6Header hdr, PtrAddPacketTag (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; diff --git a/src/internet/model/udp-socket-impl.cc b/src/internet/model/udp-socket-impl.cc index 79806c21c..e10a973b9 100644 --- a/src/internet/model/udp-socket-impl.cc +++ b/src/internet/model/udp-socket-impl.cc @@ -421,7 +421,7 @@ int UdpSocketImpl::DoSend (Ptr 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 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 p, Ipv6Address dest, uint16_t port) return -1; } - if (IsManualIpv6Tclass ()) + if (IsManualIpv6Tclass ()) { SocketIpv6TclassTag ipTclassTag; ipTclassTag.SetTclass (GetIpv6Tclass ());