A Discrete-Event Network Simulator
API
udp-socket-impl.cc
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2007 INRIA
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License version 2 as
7  * published by the Free Software Foundation;
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17  *
18  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
19  */
20 
21 #include "ns3/log.h"
22 #include "ns3/node.h"
23 #include "ns3/inet-socket-address.h"
24 #include "ns3/inet6-socket-address.h"
25 #include "ns3/ipv4-route.h"
26 #include "ns3/ipv6-route.h"
27 #include "ns3/ipv4.h"
28 #include "ns3/ipv6.h"
29 #include "ns3/ipv4-header.h"
30 #include "ns3/ipv4-routing-protocol.h"
31 #include "ns3/ipv6-routing-protocol.h"
32 #include "ns3/udp-socket-factory.h"
33 #include "ns3/trace-source-accessor.h"
34 #include "ns3/ipv4-packet-info-tag.h"
35 #include "ns3/ipv6-packet-info-tag.h"
36 #include "udp-socket-impl.h"
37 #include "udp-l4-protocol.h"
38 #include "ipv4-end-point.h"
39 #include "ipv6-end-point.h"
40 #include <limits>
41 
42 namespace ns3 {
43 
44 NS_LOG_COMPONENT_DEFINE ("UdpSocketImpl");
45 
46 NS_OBJECT_ENSURE_REGISTERED (UdpSocketImpl);
47 
48 // The correct maximum UDP message size is 65507, as determined by the following formula:
49 // 0xffff - (sizeof(IP Header) + sizeof(UDP Header)) = 65535-(20+8) = 65507
50 // \todo MAX_IPV4_UDP_DATAGRAM_SIZE is correct only for IPv4
51 static const uint32_t MAX_IPV4_UDP_DATAGRAM_SIZE = 65507;
52 
53 // Add attributes generic to all UdpSockets to base class UdpSocket
54 TypeId
56 {
57  static TypeId tid = TypeId ("ns3::UdpSocketImpl")
58  .SetParent<UdpSocket> ()
59  .SetGroupName ("Internet")
60  .AddConstructor<UdpSocketImpl> ()
61  .AddTraceSource ("Drop",
62  "Drop UDP packet due to receive buffer overflow",
64  "ns3::Packet::TracedCallback")
65  .AddAttribute ("IcmpCallback", "Callback invoked whenever an icmp error is received on this socket.",
66  CallbackValue (),
69  .AddAttribute ("IcmpCallback6", "Callback invoked whenever an icmpv6 error is received on this socket.",
70  CallbackValue (),
73  ;
74  return tid;
75 }
76 
78  : m_endPoint (0),
79  m_endPoint6 (0),
80  m_node (0),
81  m_udp (0),
82  m_errno (ERROR_NOTERROR),
83  m_shutdownSend (false),
84  m_shutdownRecv (false),
85  m_connected (false),
86  m_rxAvailable (0)
87 {
89  m_allowBroadcast = false;
90 }
91 
93 {
95 
97  m_node = 0;
103  if (m_endPoint != 0)
104  {
105  NS_ASSERT (m_udp != 0);
114  NS_ASSERT (m_endPoint != 0);
115  m_udp->DeAllocate (m_endPoint);
116  NS_ASSERT (m_endPoint == 0);
117  }
118  if (m_endPoint6 != 0)
119  {
120  NS_ASSERT (m_udp != 0);
129  NS_ASSERT (m_endPoint6 != 0);
130  m_udp->DeAllocate (m_endPoint6);
131  NS_ASSERT (m_endPoint6 == 0);
132  }
133  m_udp = 0;
134 }
135 
136 void
138 {
140  m_node = node;
141 
142 }
143 void
145 {
147  m_udp = udp;
148 }
149 
150 
153 {
155  return m_errno;
156 }
157 
160 {
161  return NS3_SOCK_DGRAM;
162 }
163 
164 Ptr<Node>
166 {
168  return m_node;
169 }
170 
171 void
173 {
175  m_endPoint = 0;
176 }
177 
178 void
180 {
182  m_endPoint6 = 0;
183 }
184 
185 /* Deallocate the end point and cancel all the timers */
186 void
188 {
189  if (m_endPoint != 0)
190  {
191  m_endPoint->SetDestroyCallback (MakeNullCallback<void> ());
192  m_udp->DeAllocate (m_endPoint);
193  m_endPoint = 0;
194  }
195  if (m_endPoint6 != 0)
196  {
197  m_endPoint6->SetDestroyCallback (MakeNullCallback<void> ());
198  m_udp->DeAllocate (m_endPoint6);
199  m_endPoint6 = 0;
200  }
201 }
202 
203 
204 int
206 {
208  bool done = false;
209  if (m_endPoint != 0)
210  {
214  done = true;
215  }
216  if (m_endPoint6 != 0)
217  {
221  done = true;
222  }
223  if (done)
224  {
225  return 0;
226  }
227  return -1;
228 }
229 
230 int
232 {
234  m_endPoint = m_udp->Allocate ();
235  return FinishBind ();
236 }
237 
238 int
240 {
242  m_endPoint6 = m_udp->Allocate6 ();
243  return FinishBind ();
244 }
245 
246 int
248 {
249  NS_LOG_FUNCTION (this << address);
250 
251  if (InetSocketAddress::IsMatchingType (address))
252  {
253  NS_ASSERT_MSG (m_endPoint == 0, "Endpoint already allocated (maybe you used BindToNetDevice before Bind).");
254 
256  Ipv4Address ipv4 = transport.GetIpv4 ();
257  uint16_t port = transport.GetPort ();
258  if (ipv4 == Ipv4Address::GetAny () && port == 0)
259  {
260  m_endPoint = m_udp->Allocate ();
261  }
262  else if (ipv4 == Ipv4Address::GetAny () && port != 0)
263  {
264  m_endPoint = m_udp->Allocate (port);
265  }
266  else if (ipv4 != Ipv4Address::GetAny () && port == 0)
267  {
268  m_endPoint = m_udp->Allocate (ipv4);
269  }
270  else if (ipv4 != Ipv4Address::GetAny () && port != 0)
271  {
272  m_endPoint = m_udp->Allocate (ipv4, port);
273  }
274  if (0 == m_endPoint)
275  {
277  return -1;
278  }
279  }
280  else if (Inet6SocketAddress::IsMatchingType (address))
281  {
282  NS_ASSERT_MSG (m_endPoint == 0, "Endpoint already allocated (maybe you used BindToNetDevice before Bind).");
283 
285  Ipv6Address ipv6 = transport.GetIpv6 ();
286  uint16_t port = transport.GetPort ();
287  if (ipv6 == Ipv6Address::GetAny () && port == 0)
288  {
289  m_endPoint6 = m_udp->Allocate6 ();
290  }
291  else if (ipv6 == Ipv6Address::GetAny () && port != 0)
292  {
293  m_endPoint6 = m_udp->Allocate6 (port);
294  }
295  else if (ipv6 != Ipv6Address::GetAny () && port == 0)
296  {
297  m_endPoint6 = m_udp->Allocate6 (ipv6);
298  }
299  else if (ipv6 != Ipv6Address::GetAny () && port != 0)
300  {
301  m_endPoint6 = m_udp->Allocate6 (ipv6, port);
302  }
303  if (0 == m_endPoint6)
304  {
306  return -1;
307  }
308  }
309  else
310  {
311  NS_LOG_ERROR ("Not IsMatchingType");
313  return -1;
314  }
315 
316  return FinishBind ();
317 }
318 
319 int
321 {
323  m_shutdownSend = true;
324  return 0;
325 }
326 
327 int
329 {
331  m_shutdownRecv = true;
332  return 0;
333 }
334 
335 int
337 {
339  if (m_shutdownRecv == true && m_shutdownSend == true)
340  {
342  return -1;
343  }
344  m_shutdownRecv = true;
345  m_shutdownSend = true;
347  return 0;
348 }
349 
350 int
352 {
353  NS_LOG_FUNCTION (this << address);
354  if (InetSocketAddress::IsMatchingType(address) == true)
355  {
357  m_defaultAddress = Address(transport.GetIpv4 ());
358  m_defaultPort = transport.GetPort ();
359  m_connected = true;
361  }
362  else if (Inet6SocketAddress::IsMatchingType(address) == true)
363  {
365  m_defaultAddress = Address(transport.GetIpv6 ());
366  m_defaultPort = transport.GetPort ();
367  m_connected = true;
369  }
370  else
371  {
372  return -1;
373  }
374 
375  return 0;
376 }
377 
378 int
380 {
382  return -1;
383 }
384 
385 int
386 UdpSocketImpl::Send (Ptr<Packet> p, uint32_t flags)
387 {
388  NS_LOG_FUNCTION (this << p << flags);
389 
390  if (!m_connected)
391  {
393  return -1;
394  }
395 
396  return DoSend (p);
397 }
398 
399 int
401 {
402  NS_LOG_FUNCTION (this << p);
404  {
405  if (Bind () == -1)
406  {
407  NS_ASSERT (m_endPoint == 0);
408  return -1;
409  }
410  NS_ASSERT (m_endPoint != 0);
411  }
413  {
414  if (Bind6 () == -1)
415  {
416  NS_ASSERT (m_endPoint6 == 0);
417  return -1;
418  }
419  NS_ASSERT (m_endPoint6 != 0);
420  }
421  if (m_shutdownSend)
422  {
424  return -1;
425  }
426 
427  return DoSendTo (p, (const Address)m_defaultAddress);
428 }
429 
430 int
432 {
433  NS_LOG_FUNCTION (this << p << address);
434 
435  if (!m_connected)
436  {
437  NS_LOG_LOGIC ("Not connected");
438  if (InetSocketAddress::IsMatchingType(address) == true)
439  {
441  Ipv4Address ipv4 = transport.GetIpv4 ();
442  uint16_t port = transport.GetPort ();
443  return DoSendTo (p, ipv4, port);
444  }
445  else if (Inet6SocketAddress::IsMatchingType(address) == true)
446  {
448  Ipv6Address ipv6 = transport.GetIpv6 ();
449  uint16_t port = transport.GetPort ();
450  return DoSendTo (p, ipv6, port);
451  }
452  else
453  {
454  return -1;
455  }
456  }
457  else
458  {
459  // connected UDP socket must use default addresses
460  NS_LOG_LOGIC ("Connected");
462  {
464  }
466  {
468  }
469  }
471  return(-1);
472 }
473 
474 int
476 {
477  NS_LOG_FUNCTION (this << p << dest << port);
478  if (m_boundnetdevice)
479  {
480  NS_LOG_LOGIC ("Bound interface number " << m_boundnetdevice->GetIfIndex ());
481  }
482  if (m_endPoint == 0)
483  {
484  if (Bind () == -1)
485  {
486  NS_ASSERT (m_endPoint == 0);
487  return -1;
488  }
489  NS_ASSERT (m_endPoint != 0);
490  }
491  if (m_shutdownSend)
492  {
494  return -1;
495  }
496 
497  if (p->GetSize () > GetTxAvailable () )
498  {
500  return -1;
501  }
502 
503  if (IsManualIpTos ())
504  {
505  SocketIpTosTag ipTosTag;
506  ipTosTag.SetTos (GetIpTos ());
507  p->AddPacketTag (ipTosTag);
508  }
509 
510  Ptr<Ipv4> ipv4 = m_node->GetObject<Ipv4> ();
511 
512  // Locally override the IP TTL for this socket
513  // We cannot directly modify the TTL at this stage, so we set a Packet tag
514  // The destination can be either multicast, unicast/anycast, or
515  // either all-hosts broadcast or limited (subnet-directed) broadcast.
516  // For the latter two broadcast types, the TTL will later be set to one
517  // irrespective of what is set in these socket options. So, this tagging
518  // may end up setting the TTL of a limited broadcast packet to be
519  // the same as a unicast, but it will be fixed further down the stack
520  if (m_ipMulticastTtl != 0 && dest.IsMulticast ())
521  {
522  SocketIpTtlTag tag;
523  tag.SetTtl (m_ipMulticastTtl);
524  p->AddPacketTag (tag);
525  }
526  else if (IsManualIpTtl () && GetIpTtl () != 0 && !dest.IsMulticast () && !dest.IsBroadcast ())
527  {
528  SocketIpTtlTag tag;
529  tag.SetTtl (GetIpTtl ());
530  p->AddPacketTag (tag);
531  }
532  {
534  bool found = p->RemovePacketTag (tag);
535  if (!found)
536  {
537  if (m_mtuDiscover)
538  {
539  tag.Enable ();
540  }
541  else
542  {
543  tag.Disable ();
544  }
545  p->AddPacketTag (tag);
546  }
547  }
548  //
549  // If dest is set to the limited broadcast address (all ones),
550  // convert it to send a copy of the packet out of every
551  // interface as a subnet-directed broadcast.
552  // Exception: if the interface has a /32 address, there is no
553  // valid subnet-directed broadcast, so send it as limited broadcast
554  // Note also that some systems will only send limited broadcast packets
555  // out of the "default" interface; here we send it out all interfaces
556  //
557  if (dest.IsBroadcast ())
558  {
559  if (!m_allowBroadcast)
560  {
562  return -1;
563  }
564  NS_LOG_LOGIC ("Limited broadcast start.");
565  for (uint32_t i = 0; i < ipv4->GetNInterfaces (); i++ )
566  {
567  // Get the primary address
568  Ipv4InterfaceAddress iaddr = ipv4->GetAddress (i, 0);
569  Ipv4Address addri = iaddr.GetLocal ();
570  if (addri == Ipv4Address ("127.0.0.1"))
571  continue;
572  // Check if interface-bound socket
573  if (m_boundnetdevice)
574  {
575  if (ipv4->GetNetDevice (i) != m_boundnetdevice)
576  continue;
577  }
578  Ipv4Mask maski = iaddr.GetMask ();
579  if (maski == Ipv4Mask::GetOnes ())
580  {
581  // if the network mask is 255.255.255.255, do not convert dest
582  NS_LOG_LOGIC ("Sending one copy from " << addri << " to " << dest
583  << " (mask is " << maski << ")");
584  m_udp->Send (p->Copy (), addri, dest,
586  NotifyDataSent (p->GetSize ());
588  }
589  else
590  {
591  // Convert to subnet-directed broadcast
592  Ipv4Address bcast = addri.GetSubnetDirectedBroadcast (maski);
593  NS_LOG_LOGIC ("Sending one copy from " << addri << " to " << bcast
594  << " (mask is " << maski << ")");
595  m_udp->Send (p->Copy (), addri, bcast,
597  NotifyDataSent (p->GetSize ());
599  }
600  }
601  NS_LOG_LOGIC ("Limited broadcast end.");
602  return p->GetSize ();
603  }
605  {
606  m_udp->Send (p->Copy (), m_endPoint->GetLocalAddress (), dest,
607  m_endPoint->GetLocalPort (), port, 0);
608  NotifyDataSent (p->GetSize ());
610  return p->GetSize ();
611  }
612  else if (ipv4->GetRoutingProtocol () != 0)
613  {
614  Ipv4Header header;
615  header.SetDestination (dest);
617  Socket::SocketErrno errno_;
618  Ptr<Ipv4Route> route;
619  Ptr<NetDevice> oif = m_boundnetdevice; //specify non-zero if bound to a specific device
620  // TBD-- we could cache the route and just check its validity
621  route = ipv4->GetRoutingProtocol ()->RouteOutput (p, header, oif, errno_);
622  if (route != 0)
623  {
624  NS_LOG_LOGIC ("Route exists");
625  if (!m_allowBroadcast)
626  {
627  uint32_t outputIfIndex = ipv4->GetInterfaceForDevice (route->GetOutputDevice ());
628  uint32_t ifNAddr = ipv4->GetNAddresses (outputIfIndex);
629  for (uint32_t addrI = 0; addrI < ifNAddr; ++addrI)
630  {
631  Ipv4InterfaceAddress ifAddr = ipv4->GetAddress (outputIfIndex, addrI);
632  if (dest == ifAddr.GetBroadcast ())
633  {
635  return -1;
636  }
637  }
638  }
639 
640  header.SetSource (route->GetSource ());
641  m_udp->Send (p->Copy (), header.GetSource (), header.GetDestination (),
642  m_endPoint->GetLocalPort (), port, route);
643  NotifyDataSent (p->GetSize ());
644  return p->GetSize ();
645  }
646  else
647  {
648  NS_LOG_LOGIC ("No route to destination");
649  NS_LOG_ERROR (errno_);
650  m_errno = errno_;
651  return -1;
652  }
653  }
654  else
655  {
656  NS_LOG_ERROR ("ERROR_NOROUTETOHOST");
658  return -1;
659  }
660 
661  return 0;
662 }
663 
664 int
666 {
667  NS_LOG_FUNCTION (this << p << dest << port);
668 
669  if (dest.IsIpv4MappedAddress ())
670  {
671  return (DoSendTo(p, dest.GetIpv4MappedAddress (), port));
672  }
673  if (m_boundnetdevice)
674  {
675  NS_LOG_LOGIC ("Bound interface number " << m_boundnetdevice->GetIfIndex ());
676  }
677  if (m_endPoint6 == 0)
678  {
679  if (Bind6 () == -1)
680  {
681  NS_ASSERT (m_endPoint6 == 0);
682  return -1;
683  }
684  NS_ASSERT (m_endPoint6 != 0);
685  }
686  if (m_shutdownSend)
687  {
689  return -1;
690  }
691 
692  if (p->GetSize () > GetTxAvailable () )
693  {
695  return -1;
696  }
697 
698  if (IsManualIpv6Tclass ())
699  {
700  SocketIpv6TclassTag ipTclassTag;
701  ipTclassTag.SetTclass (GetIpv6Tclass ());
702  p->AddPacketTag (ipTclassTag);
703  }
704 
705  Ptr<Ipv6> ipv6 = m_node->GetObject<Ipv6> ();
706 
707  // Locally override the IP TTL for this socket
708  // We cannot directly modify the TTL at this stage, so we set a Packet tag
709  // The destination can be either multicast, unicast/anycast, or
710  // either all-hosts broadcast or limited (subnet-directed) broadcast.
711  // For the latter two broadcast types, the TTL will later be set to one
712  // irrespective of what is set in these socket options. So, this tagging
713  // may end up setting the TTL of a limited broadcast packet to be
714  // the same as a unicast, but it will be fixed further down the stack
715  if (m_ipMulticastTtl != 0 && dest.IsMulticast ())
716  {
719  p->AddPacketTag (tag);
720  }
721  else if (IsManualIpv6HopLimit () && GetIpv6HopLimit () != 0 && !dest.IsMulticast ())
722  {
724  tag.SetHopLimit (GetIpv6HopLimit ());
725  p->AddPacketTag (tag);
726  }
727  // There is no analgous to an IPv4 broadcast address in IPv6.
728  // Instead, we use a set of link-local, site-local, and global
729  // multicast addresses. The Ipv6 routing layers should all
730  // provide an interface-specific route to these addresses such
731  // that we can treat these multicast addresses as "not broadcast"
732 
734  {
735  m_udp->Send (p->Copy (), m_endPoint6->GetLocalAddress (), dest,
736  m_endPoint6->GetLocalPort (), port, 0);
737  NotifyDataSent (p->GetSize ());
739  return p->GetSize ();
740  }
741  else if (ipv6->GetRoutingProtocol () != 0)
742  {
743  Ipv6Header header;
744  header.SetDestinationAddress (dest);
746  Socket::SocketErrno errno_;
747  Ptr<Ipv6Route> route;
748  Ptr<NetDevice> oif = m_boundnetdevice; //specify non-zero if bound to a specific device
749  // TBD-- we could cache the route and just check its validity
750  route = ipv6->GetRoutingProtocol ()->RouteOutput (p, header, oif, errno_);
751  if (route != 0)
752  {
753  NS_LOG_LOGIC ("Route exists");
754  header.SetSourceAddress (route->GetSource ());
755  m_udp->Send (p->Copy (), header.GetSourceAddress (), header.GetDestinationAddress (),
756  m_endPoint6->GetLocalPort (), port, route);
757  NotifyDataSent (p->GetSize ());
758  return p->GetSize ();
759  }
760  else
761  {
762  NS_LOG_LOGIC ("No route to destination");
763  NS_LOG_ERROR (errno_);
764  m_errno = errno_;
765  return -1;
766  }
767  }
768  else
769  {
770  NS_LOG_ERROR ("ERROR_NOROUTETOHOST");
772  return -1;
773  }
774 
775  return 0;
776 }
777 
778 
779 // maximum message size for UDP broadcast is limited by MTU
780 // size of underlying link; we are not checking that now.
781 // \todo Check MTU size of underlying link
782 uint32_t
784 {
786  // No finite send buffer is modelled, but we must respect
787  // the maximum size of an IP datagram (65535 bytes - headers).
789 }
790 
791 int
793 {
794  NS_LOG_FUNCTION (this << p << flags << address);
795  if (InetSocketAddress::IsMatchingType (address))
796  {
797  if (IsManualIpTos ())
798  {
799  SocketIpTosTag ipTosTag;
800  ipTosTag.SetTos (GetIpTos ());
801  p->AddPacketTag (ipTosTag);
802  }
803 
805  Ipv4Address ipv4 = transport.GetIpv4 ();
806  uint16_t port = transport.GetPort ();
807  return DoSendTo (p, ipv4, port);
808  }
809  else if (Inet6SocketAddress::IsMatchingType (address))
810  {
811  if (IsManualIpv6Tclass ())
812  {
813  SocketIpv6TclassTag ipTclassTag;
814  ipTclassTag.SetTclass (GetIpv6Tclass ());
815  p->AddPacketTag (ipTclassTag);
816  }
817 
819  Ipv6Address ipv6 = transport.GetIpv6 ();
820  uint16_t port = transport.GetPort ();
821  return DoSendTo (p, ipv6, port);
822  }
823  return -1;
824 }
825 
826 uint32_t
828 {
830  // We separately maintain this state to avoid walking the queue
831  // every time this might be called
832  return m_rxAvailable;
833 }
834 
836 UdpSocketImpl::Recv (uint32_t maxSize, uint32_t flags)
837 {
838  NS_LOG_FUNCTION (this << maxSize << flags);
839  if (m_deliveryQueue.empty () )
840  {
842  return 0;
843  }
844  Ptr<Packet> p = m_deliveryQueue.front ();
845  if (p->GetSize () <= maxSize)
846  {
847  m_deliveryQueue.pop ();
848  m_rxAvailable -= p->GetSize ();
849  }
850  else
851  {
852  p = 0;
853  }
854  return p;
855 }
856 
858 UdpSocketImpl::RecvFrom (uint32_t maxSize, uint32_t flags,
859  Address &fromAddress)
860 {
861  NS_LOG_FUNCTION (this << maxSize << flags);
862  Ptr<Packet> packet = Recv (maxSize, flags);
863  if (packet != 0)
864  {
865  SocketAddressTag tag;
866  bool found;
867  found = packet->PeekPacketTag (tag);
868  NS_ASSERT (found);
869  fromAddress = tag.GetAddress ();
870  }
871  return packet;
872 }
873 
874 int
876 {
878  if (m_endPoint != 0)
879  {
881  }
882  else if (m_endPoint6 != 0)
883  {
885  }
886  else
887  { // It is possible to call this method on a socket without a name
888  // in which case, behavior is unspecified
889  // Should this return an InetSocketAddress or an Inet6SocketAddress?
890  address = InetSocketAddress (Ipv4Address::GetZero (), 0);
891  }
892  return 0;
893 }
894 
895 int
896 UdpSocketImpl::MulticastJoinGroup (uint32_t interface, const Address &groupAddress)
897 {
898  NS_LOG_FUNCTION (interface << groupAddress);
899  /*
900  1) sanity check interface
901  2) sanity check that it has not been called yet on this interface/group
902  3) determine address family of groupAddress
903  4) locally store a list of (interface, groupAddress)
904  5) call ipv4->MulticastJoinGroup () or Ipv6->MulticastJoinGroup ()
905  */
906  return 0;
907 }
908 
909 int
910 UdpSocketImpl::MulticastLeaveGroup (uint32_t interface, const Address &groupAddress)
911 {
912  NS_LOG_FUNCTION (interface << groupAddress);
913  /*
914  1) sanity check interface
915  2) determine address family of groupAddress
916  3) delete from local list of (interface, groupAddress); raise a LOG_WARN
917  if not already present (but return 0)
918  5) call ipv4->MulticastLeaveGroup () or Ipv6->MulticastLeaveGroup ()
919  */
920  return 0;
921 }
922 
923 void
925 {
926  NS_LOG_FUNCTION (netdevice);
927 
928  Socket::BindToNetDevice (netdevice); // Includes sanity check
929  if (m_endPoint == 0)
930  {
931  if (Bind () == -1)
932  {
933  NS_ASSERT (m_endPoint == 0);
934  return;
935  }
936  NS_ASSERT (m_endPoint != 0);
937  }
938  m_endPoint->BindToNetDevice (netdevice);
939 
940  if (m_endPoint6 == 0)
941  {
942  if (Bind6 () == -1)
943  {
944  NS_ASSERT (m_endPoint6 == 0);
945  return;
946  }
947  NS_ASSERT (m_endPoint6 != 0);
948  }
949  m_endPoint6->BindToNetDevice (netdevice);
950  return;
951 }
952 
953 void
955  Ptr<Ipv4Interface> incomingInterface)
956 {
957  NS_LOG_FUNCTION (this << packet << header << port);
958 
959  if (m_shutdownRecv)
960  {
961  return;
962  }
963 
964  // Should check via getsockopt ()..
965  if (IsRecvPktInfo ())
966  {
967  Ipv4PacketInfoTag tag;
968  packet->RemovePacketTag (tag);
969  tag.SetRecvIf (incomingInterface->GetDevice ()->GetIfIndex ());
970  packet->AddPacketTag (tag);
971  }
972 
973  //Check only version 4 options
974  if (IsIpRecvTos ())
975  {
976  SocketIpTosTag ipTosTag;
977  ipTosTag.SetTos (header.GetTos ());
978  packet->AddPacketTag (ipTosTag);
979  }
980 
981  if (IsIpRecvTtl ())
982  {
983  SocketIpTtlTag ipTtlTag;
984  ipTtlTag.SetTtl (header.GetTtl ());
985  packet->AddPacketTag (ipTtlTag);
986  }
987 
988  if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
989  {
991  SocketAddressTag tag;
992  tag.SetAddress (address);
993  packet->AddPacketTag (tag);
994  m_deliveryQueue.push (packet);
995  m_rxAvailable += packet->GetSize ();
996  NotifyDataRecv ();
997  }
998  else
999  {
1000  // In general, this case should not occur unless the
1001  // receiving application reads data from this socket slowly
1002  // in comparison to the arrival rate
1003  //
1004  // drop and trace packet
1005  NS_LOG_WARN ("No receive buffer space available. Drop.");
1006  m_dropTrace (packet);
1007  }
1008 }
1009 
1010 void
1011 UdpSocketImpl::ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface)
1012 {
1013  NS_LOG_FUNCTION (this << packet << header.GetSourceAddress () << port);
1014 
1015  if (m_shutdownRecv)
1016  {
1017  return;
1018  }
1019 
1020  // Should check via getsockopt ()..
1021  if (IsRecvPktInfo ())
1022  {
1023  Ipv6PacketInfoTag tag;
1024  packet->RemovePacketTag (tag);
1025  tag.SetRecvIf (incomingInterface->GetDevice ()->GetIfIndex ());
1026  packet->AddPacketTag (tag);
1027  }
1028 
1029  //Check only version 6 options
1030  if (IsIpv6RecvTclass ())
1031  {
1032  SocketIpv6TclassTag ipTclassTag;
1033  ipTclassTag.SetTclass (header.GetTrafficClass ());
1034  packet->AddPacketTag (ipTclassTag);
1035  }
1036 
1037  if (IsIpv6RecvHopLimit ())
1038  {
1039  SocketIpv6HopLimitTag ipHopLimitTag;
1040  ipHopLimitTag.SetHopLimit (header.GetHopLimit ());
1041  packet->AddPacketTag (ipHopLimitTag);
1042  }
1043 
1044  if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
1045  {
1047  SocketAddressTag tag;
1048  tag.SetAddress (address);
1049  packet->AddPacketTag (tag);
1050  m_deliveryQueue.push (packet);
1051  m_rxAvailable += packet->GetSize ();
1052  NotifyDataRecv ();
1053  }
1054  else
1055  {
1056  // In general, this case should not occur unless the
1057  // receiving application reads data from this socket slowly
1058  // in comparison to the arrival rate
1059  //
1060  // drop and trace packet
1061  NS_LOG_WARN ("No receive buffer space available. Drop.");
1062  m_dropTrace (packet);
1063  }
1064 }
1065 
1066 void
1067 UdpSocketImpl::ForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl,
1068  uint8_t icmpType, uint8_t icmpCode,
1069  uint32_t icmpInfo)
1070 {
1071  NS_LOG_FUNCTION (this << icmpSource << (uint32_t)icmpTtl << (uint32_t)icmpType <<
1072  (uint32_t)icmpCode << icmpInfo);
1073  if (!m_icmpCallback.IsNull ())
1074  {
1075  m_icmpCallback (icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
1076  }
1077 }
1078 
1079 void
1080 UdpSocketImpl::ForwardIcmp6 (Ipv6Address icmpSource, uint8_t icmpTtl,
1081  uint8_t icmpType, uint8_t icmpCode,
1082  uint32_t icmpInfo)
1083 {
1084  NS_LOG_FUNCTION (this << icmpSource << (uint32_t)icmpTtl << (uint32_t)icmpType <<
1085  (uint32_t)icmpCode << icmpInfo);
1086  if (!m_icmpCallback6.IsNull ())
1087  {
1088  m_icmpCallback6 (icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
1089  }
1090 }
1091 
1092 void
1094 {
1095  m_rcvBufSize = size;
1096 }
1097 
1098 uint32_t
1100 {
1101  return m_rcvBufSize;
1102 }
1103 
1104 void
1106 {
1107  m_ipMulticastTtl = ipTtl;
1108 }
1109 
1110 uint8_t
1112 {
1113  return m_ipMulticastTtl;
1114 }
1115 
1116 void
1118 {
1119  m_ipMulticastIf = ipIf;
1120 }
1121 
1122 int32_t
1124 {
1125  return m_ipMulticastIf;
1126 }
1127 
1128 void
1130 {
1131  m_ipMulticastLoop = loop;
1132 }
1133 
1134 bool
1136 {
1137  return m_ipMulticastLoop;
1138 }
1139 
1140 void
1142 {
1143  m_mtuDiscover = discover;
1144 }
1145 bool
1147 {
1148  return m_mtuDiscover;
1149 }
1150 
1151 bool
1153 {
1154  m_allowBroadcast = allowBroadcast;
1155  return true;
1156 }
1157 
1158 bool
1160 {
1161  return m_allowBroadcast;
1162 }
1163 
1164 
1165 } // namespace ns3
static bool IsMatchingType(const Address &address)
If the Address matches the type.
void SetSource(Ipv4Address source)
Definition: ipv4-header.cc:285
Ipv6Address GetLocalAddress()
Get the local address.
(abstract) base class of all UdpSockets
Definition: udp-socket.h:46
uint8_t GetTrafficClass(void) const
Get the "Traffic class" field.
Definition: ipv6-header.cc:51
bool m_shutdownSend
Send no longer allowed.
void SetTclass(uint8_t tclass)
Set the tag's Tclass.
Definition: socket.cc:822
static const uint32_t MAX_IPV4_UDP_DATAGRAM_SIZE
Maximum UDP datagram size.
static Ipv4Mask GetOnes(void)
Ipv6Address GetIpv6(void) const
Get the IPv6 address.
virtual bool GetAllowBroadcast() const
Query whether broadcast datagram transmissions are allowed.
bool IsManualIpTtl(void) const
Checks if the socket has a specific IPv4 TTL set.
Definition: socket.cc:383
Introspection did not find any typical Config paths.
Definition: ipv6-header.h:33
an Inet address class
Ipv4Address GetIpv4(void) const
void SetDestination(Ipv4Address destination)
Definition: ipv4-header.cc:298
static Ipv4Address GetAny(void)
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void Destroy(void)
Kill this socket by zeroing its attributes (IPv4)
bool IsIpv6RecvHopLimit(void) const
Ask if the socket is currently passing information about IPv6 Hop Limit up the stack.
Definition: socket.cc:508
Ptr< UdpL4Protocol > m_udp
the associated UDP L4 protocol
SocketErrno
Enumeration of the possible errors returned by a socket.
Definition: socket.h:82
virtual bool GetIpMulticastLoop(void) const
Get the IP multicast loop capability.
Ipv4Mask GetMask(void) const
Get the network mask.
virtual uint8_t GetIpTtl(void) const
Query the value of IP Time to Live field of this socket.
Definition: socket.cc:471
Ipv4EndPoint * m_endPoint
the IPv4 endpoint
uint8_t GetIpTos(void) const
Query the value of IP Type of Service of this socket.
Definition: socket.cc:404
This class implements a tag that carries the socket-specific HOPLIMIT of a packet to the IPv6 layer...
Definition: socket.h:1047
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:44
enum SocketErrno m_errno
Socket error code.
virtual void SetIpMulticastIf(int32_t ipIf)
Set the IP multicast interface.
Ipv4Address GetLocal(void) const
Get the local address.
Access to the IPv6 forwarding table, interfaces, and configuration.
Definition: ipv6.h:80
bool m_allowBroadcast
Allow send broadcast packets.
void NotifyDataRecv(void)
Notify through the callback (if set) that some data have been received.
Definition: socket.cc:305
a class to represent an Ipv4 address mask
Definition: ipv4-address.h:226
void SetRxCallback(Callback< void, Ptr< Packet >, Ipv4Header, uint16_t, Ptr< Ipv4Interface > > callback)
Set the reception callback.
Ptr< Packet > Recv(void)
Read a single packet from the socket.
Definition: socket.cc:175
void SetDestroyCallback(Callback< void > callback)
Set the default destroy callback.
std::queue< Ptr< Packet > > m_deliveryQueue
Queue for incoming packets.
void AddPacketTag(const Tag &tag) const
Add a packet tag.
Definition: packet.cc:836
void SetAddress(Address addr)
Set the tag's address.
Definition: socket.cc:523
Ipv4Address GetDestination(void) const
Definition: ipv4-header.cc:304
virtual int Close(void)
Close a socket.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
Definition: assert.h:67
static Ipv6Address GetAny()
Get the "any" (::) Ipv6Address.
virtual uint8_t GetIpMulticastTtl(void) const
Get the IP multicast TTL.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:201
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:766
void SetNextHeader(uint8_t next)
Set the "Next header" field.
Definition: ipv6-header.cc:76
bool IsManualIpTos(void) const
Checks if the socket has a specific IPv4 ToS set.
Definition: socket.cc:371
uint32_t m_rxAvailable
Number of available bytes to be received.
bool IsMulticast(void) const
void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
virtual uint8_t GetIpv6HopLimit(void) const
Query the value of IP Hop Limit field of this socket.
Definition: socket.cc:496
Ipv4Address GetSource(void) const
Definition: ipv4-header.cc:291
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
SocketType
Enumeration of the possible socket types.
Definition: socket.h:104
void SetProtocol(uint8_t num)
Definition: ipv4-header.cc:278
void SetTos(uint8_t tos)
Set the tag's TOS.
Definition: socket.cc:765
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
This class implements a tag that carries the socket-specific TTL of a packet to the IP layer...
Definition: socket.h:999
virtual void SetRcvBufSize(uint32_t size)
Set the receiving buffer size.
bool IsRecvPktInfo() const
Get status indicating whether enable/disable packet information to socket.
Definition: socket.cc:364
A sockets interface to UDP.
bool m_connected
Connection established.
Ipv4Address GetSubnetDirectedBroadcast(Ipv4Mask const &mask) const
Generate subnet-directed broadcast address corresponding to mask.
void ForwardIcmp6(Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo)
Called by the L3 protocol when it received an ICMPv6 packet to pass on to TCP.
uint16_t port
Definition: dsdv-manet.cc:44
a polymophic address class
Definition: address.h:90
virtual int Bind(void)
Allocate a local IPv4 endpoint for this socket.
void SetDestroyCallback(Callback< void > callback)
Set the default destroy callback.
AttributeValue implementation for Callback.
Definition: callback.h:1687
void ForwardUp(Ptr< Packet > packet, Ipv4Header header, uint16_t port, Ptr< Ipv4Interface > incomingInterface)
Called by the L3 protocol when it received a packet to pass on to TCP.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
virtual enum SocketErrno GetErrno(void) const
Get last error number.
Ptr< NetDevice > GetOutputDevice(void) const
Definition: ipv4-route.cc:84
bool IsIpRecvTos(void) const
Ask if the socket is currently passing information about IP Type of Service up the stack...
Definition: socket.cc:416
Packet header for IPv4.
Definition: ipv4-header.h:31
virtual int ShutdownRecv(void)
virtual int GetSockName(Address &address) const
Get socket address.
bool PeekPacketTag(Tag &tag) const
Search a matching tag and call Tag::Deserialize if it is found.
Definition: packet.cc:858
void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
virtual int MulticastLeaveGroup(uint32_t interfaceIndex, const Address &groupAddress)
Corresponds to socket option MCAST_LEAVE_GROUP.
int DoSendTo(Ptr< Packet > p, const Address &daddr)
Send a packet to a specific destination.
void ForwardIcmp(Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo)
Called by the L3 protocol when it received an ICMP packet to pass on to TCP.
Callback< void, Ipv6Address, uint8_t, uint8_t, uint8_t, uint32_t > m_icmpCallback6
ICMPv6 callback.
void SetTtl(uint8_t ttl)
Set the tag's TTL.
Definition: socket.cc:584
int DoSend(Ptr< Packet > p)
Send a packet.
uint16_t GetLocalPort()
Get the local port.
void SetNode(Ptr< Node > node)
Set the associated node.
virtual uint32_t GetRcvBufSize(void) const
Get the receiving buffer size.
virtual uint32_t GetRxAvailable(void) const
Return number of bytes which can be returned from one or multiple calls to Recv.
virtual int Bind6(void)
Allocate a local IPv6 endpoint for this socket.
UdpSocketImpl()
Create an unbound udp socket.
virtual int Connect(const Address &address)
Initiate a connection to a remote host.
virtual int MulticastJoinGroup(uint32_t interfaceIndex, const Address &groupAddress)
Corresponds to socket option MCAST_JOIN_GROUP.
Ptr< const AttributeAccessor > MakeCallbackAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Definition: callback.h:1729
Ipv4Address GetLocalAddress(void)
Get the local address.
bool IsBroadcast(void) const
uint8_t m_ipMulticastTtl
Multicast TTL.
Address m_defaultAddress
Default address.
virtual enum SocketType GetSocketType(void) const
An Inet6 address class.
This class implements a tag that carries an address of a packet across the socket interface...
Definition: socket.h:951
virtual void SetMtuDiscover(bool discover)
Set the MTU discover capability.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1296
virtual int32_t GetIpMulticastIf(void) const
Get the IP multicast interface.
bool IsManualIpv6Tclass(void) const
Checks if the socket has a specific IPv6 Tclass set.
Definition: socket.cc:377
void NotifyDataSent(uint32_t size)
Notify through the callback (if set) that some data have been sent.
Definition: socket.cc:285
virtual Ptr< NetDevice > GetDevice() const
Get the NetDevice.
Ipv4Address GetSource(void) const
Definition: ipv4-route.cc:56
void Destroy6(void)
Kill this socket by zeroing its attributes (IPv6)
static bool IsMatchingType(const Address &address)
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Definition: log.h:252
int FinishBind(void)
Finish the binding process.
void SetHopLimit(uint8_t hopLimit)
Set the tag's Hop Limit.
Definition: socket.cc:645
static TypeId GetTypeId(void)
Get the type ID.
void NotifyConnectionSucceeded(void)
Notify through the callback (if set) that the connection has been established.
Definition: socket.cc:217
Access to the Ipv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:76
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Definition: packet.cc:122
bool IsManualIpv6HopLimit(void) const
Checks if the socket has a specific IPv6 Hop Limit set.
Definition: socket.cc:389
virtual void SetIpMulticastLoop(bool loop)
Set the IP multicast loop capability.
uint8_t GetHopLimit(void) const
Get the "Hop limit" field (TTL).
Definition: ipv6-header.cc:91
virtual int Send(Ptr< Packet > p, uint32_t flags)
Send data (or dummy data) to the remote host.
bool m_shutdownRecv
Receive no longer allowed.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address.
Ptr< Node > m_node
the associated node
void SetIcmpCallback(Callback< void, Ipv6Address, uint8_t, uint8_t, uint8_t, uint32_t > callback)
Set the ICMP callback.
indicates whether the socket has IPV6_TCLASS set.
Definition: socket.h:1192
uint8_t GetIpv6Tclass(void) const
Query the value of IPv6 Traffic Class field of this socket.
Definition: socket.cc:446
bool IsMulticast() const
If the IPv6 address is multicast (ff00::/8).
static Ipv4Address GetZero(void)
bool IsIpv6RecvTclass(void) const
Ask if the socket is currently passing information about IPv6 Traffic Class up the stack...
Definition: socket.cc:458
Ptr< const AttributeChecker > MakeCallbackChecker(void)
Definition: callback.cc:75
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
Definition: socket.cc:330
This class implements Linux struct pktinfo in order to deliver ancillary information to the socket in...
virtual int ShutdownSend(void)
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Definition: assert.h:90
void SetSourceAddress(Ipv6Address src)
Set the "Source address" field.
Definition: ipv6-header.cc:96
bool IsIpRecvTtl(void) const
Ask if the socket is currently passing information about IP_TTL up the stack.
Definition: socket.cc:483
void Disable(void)
Disables the DF (Don't Fragment) flag.
Definition: socket.cc:706
Describes an IPv6 address.
Definition: ipv6-address.h:47
void ForwardUp6(Ptr< Packet > packet, Ipv6Header header, uint16_t port, Ptr< Ipv6Interface > incomingInterface)
Called by the L3 protocol when it received a packet to pass on to TCP.
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:40
virtual uint32_t GetTxAvailable(void) const
Returns the number of bytes which can be sent in a single call to Send.
Ipv4Address GetBroadcast(void) const
Get the broadcast address.
Ptr< NetDevice > m_boundnetdevice
the device this socket is bound to (might be null).
Definition: socket.h:914
virtual bool SetAllowBroadcast(bool allowBroadcast)
Configure whether broadcast datagram transmissions are allowed.
a class to store IPv4 address information on an interface
uint32_t m_rcvBufSize
Receive buffer size.
uint16_t GetLocalPort(void)
Get the local port.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Definition: log.h:228
Ptr< NetDevice > GetDevice(void) const
Address GetAddress(void) const
Get the tag's address.
Definition: socket.cc:530
void SetUdp(Ptr< UdpL4Protocol > udp)
Set the associated UDP L4 protocol.
bool m_ipMulticastLoop
Allow multicast loop.
virtual int Listen(void)
Listen for incoming connections.
bool RemovePacketTag(Tag &tag)
Remove a packet tag.
Definition: packet.cc:843
Ipv6Address GetSourceAddress(void) const
Get the "Source address" field.
Definition: ipv6-header.cc:101
indicates whether packets should be sent out with the DF (Don't Fragment) flag set.
Definition: socket.h:1095
static Inet6SocketAddress ConvertFrom(const Address &addr)
Convert the address to a InetSocketAddress.
uint16_t m_defaultPort
Default port.
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &address)
Send data to a specified peer.
Ipv6EndPoint * m_endPoint6
the IPv6 endpoint
void SetRxCallback(Callback< void, Ptr< Packet >, Ipv6Header, uint16_t, Ptr< Ipv6Interface > > callback)
Set the reception callback.
static bool IsMatchingType(const Address &addr)
If the address match.
void Enable(void)
Enables the DF (Don't Fragment) flag.
Definition: socket.cc:700
uint16_t GetPort(void) const
Get the port.
void DeallocateEndPoint(void)
Deallocate m_endPoint and m_endPoint6.
Ipv4Address GetIpv4MappedAddress() const
Return the Ipv4 address.
int32_t m_ipMulticastIf
Multicast Interface.
virtual Ptr< Packet > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)
Read a single packet from the socket and retrieve the sender address.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
Definition: log.h:220
uint16_t GetPort(void) const
uint8_t GetTtl(void) const
Definition: ipv4-header.cc:265
uint8_t GetTos(void) const
Definition: ipv4-header.cc:194
This class implements a tag that carries socket ancillary data to the socket interface.
static Ipv4Address ConvertFrom(const Address &address)
tuple address
Definition: first.py:37
TracedCallback< Ptr< const Packet > > m_dropTrace
Trace for dropped packets.
indicates whether the socket has IP_TOS set.
Definition: socket.h:1145
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:455
void SetIcmpCallback(Callback< void, Ipv4Address, uint8_t, uint8_t, uint8_t, uint32_t > callback)
Set the ICMP callback.
bool IsIpv4MappedAddress() const
If the address is an IPv4-mapped address.
a unique identifier for an interface.
Definition: type-id.h:57
static const uint8_t PROT_NUMBER
protocol number (0x11)
bool m_mtuDiscover
Allow MTU discovery.
void SetDestinationAddress(Ipv6Address dst)
Set the "Destination address" field.
Definition: ipv6-header.cc:106
void NotifySend(uint32_t spaceAvailable)
Notify through the callback (if set) that some data have been sent.
Definition: socket.cc:295
TypeId SetParent(TypeId tid)
Definition: type-id.cc:638
void SetRecvIf(uint32_t ifindex)
Set the tag's receiving interface.
static bool IsMatchingType(const Address &address)
Callback< void, Ipv4Address, uint8_t, uint8_t, uint8_t, uint32_t > m_icmpCallback
ICMP callback.
Ipv6Address GetDestinationAddress(void) const
Get the "Destination address" field.
Definition: ipv6-header.cc:111
static Ipv6Address ConvertFrom(const Address &address)
Convert the Address object into an Ipv6Address ones.
virtual bool GetMtuDiscover(void) const
Get the MTU discover capability.
virtual void SetIpMulticastTtl(uint8_t ipTtl)
Set the IP multicast TTL.
virtual Ptr< Node > GetNode(void) const
Return the node this socket is associated with.
void SetRecvIf(uint32_t ifindex)
Set the tag's receiving interface.