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  .AddConstructor<UdpSocketImpl> ()
60  .AddTraceSource ("Drop",
61  "Drop UDP packet due to receive buffer overflow",
63  "ns3::Packet::TracedCallback")
64  .AddAttribute ("IcmpCallback", "Callback invoked whenever an icmp error is received on this socket.",
65  CallbackValue (),
68  .AddAttribute ("IcmpCallback6", "Callback invoked whenever an icmpv6 error is received on this socket.",
69  CallbackValue (),
72  ;
73  return tid;
74 }
75 
77  : m_endPoint (0),
78  m_endPoint6 (0),
79  m_node (0),
80  m_udp (0),
81  m_errno (ERROR_NOTERROR),
82  m_shutdownSend (false),
83  m_shutdownRecv (false),
84  m_connected (false),
85  m_rxAvailable (0)
86 {
88  m_allowBroadcast = false;
89 }
90 
92 {
94 
96  m_node = 0;
102  if (m_endPoint != 0)
103  {
104  NS_ASSERT (m_udp != 0);
113  NS_ASSERT (m_endPoint != 0);
114  m_udp->DeAllocate (m_endPoint);
115  NS_ASSERT (m_endPoint == 0);
116  }
117  if (m_endPoint6 != 0)
118  {
119  NS_ASSERT (m_udp != 0);
128  NS_ASSERT (m_endPoint6 != 0);
129  m_udp->DeAllocate (m_endPoint6);
130  NS_ASSERT (m_endPoint6 == 0);
131  }
132  m_udp = 0;
133 }
134 
135 void
137 {
139  m_node = node;
140 
141 }
142 void
144 {
146  m_udp = udp;
147 }
148 
149 
152 {
154  return m_errno;
155 }
156 
159 {
160  return NS3_SOCK_DGRAM;
161 }
162 
163 Ptr<Node>
165 {
167  return m_node;
168 }
169 
170 void
172 {
174  m_endPoint = 0;
175 }
176 
177 void
179 {
181  m_endPoint6 = 0;
182 }
183 
184 /* Deallocate the end point and cancel all the timers */
185 void
187 {
188  if (m_endPoint != 0)
189  {
190  m_endPoint->SetDestroyCallback (MakeNullCallback<void> ());
191  m_udp->DeAllocate (m_endPoint);
192  m_endPoint = 0;
193  }
194  if (m_endPoint6 != 0)
195  {
196  m_endPoint6->SetDestroyCallback (MakeNullCallback<void> ());
197  m_udp->DeAllocate (m_endPoint6);
198  m_endPoint6 = 0;
199  }
200 }
201 
202 
203 int
205 {
207  bool done = false;
208  if (m_endPoint != 0)
209  {
213  done = true;
214  }
215  if (m_endPoint6 != 0)
216  {
220  done = true;
221  }
222  if (done)
223  {
224  return 0;
225  }
226  return -1;
227 }
228 
229 int
231 {
233  m_endPoint = m_udp->Allocate ();
234  return FinishBind ();
235 }
236 
237 int
239 {
241  m_endPoint6 = m_udp->Allocate6 ();
242  return FinishBind ();
243 }
244 
245 int
247 {
248  NS_LOG_FUNCTION (this << address);
249 
250  if (InetSocketAddress::IsMatchingType (address))
251  {
252  NS_ASSERT_MSG (m_endPoint == 0, "Endpoint already allocated (maybe you used BindToNetDevice before Bind).");
253 
255  Ipv4Address ipv4 = transport.GetIpv4 ();
256  uint16_t port = transport.GetPort ();
257  if (ipv4 == Ipv4Address::GetAny () && port == 0)
258  {
259  m_endPoint = m_udp->Allocate ();
260  }
261  else if (ipv4 == Ipv4Address::GetAny () && port != 0)
262  {
263  m_endPoint = m_udp->Allocate (port);
264  }
265  else if (ipv4 != Ipv4Address::GetAny () && port == 0)
266  {
267  m_endPoint = m_udp->Allocate (ipv4);
268  }
269  else if (ipv4 != Ipv4Address::GetAny () && port != 0)
270  {
271  m_endPoint = m_udp->Allocate (ipv4, port);
272  }
273  if (0 == m_endPoint)
274  {
276  return -1;
277  }
278  }
279  else if (Inet6SocketAddress::IsMatchingType (address))
280  {
281  NS_ASSERT_MSG (m_endPoint == 0, "Endpoint already allocated (maybe you used BindToNetDevice before Bind).");
282 
284  Ipv6Address ipv6 = transport.GetIpv6 ();
285  uint16_t port = transport.GetPort ();
286  if (ipv6 == Ipv6Address::GetAny () && port == 0)
287  {
288  m_endPoint6 = m_udp->Allocate6 ();
289  }
290  else if (ipv6 == Ipv6Address::GetAny () && port != 0)
291  {
292  m_endPoint6 = m_udp->Allocate6 (port);
293  }
294  else if (ipv6 != Ipv6Address::GetAny () && port == 0)
295  {
296  m_endPoint6 = m_udp->Allocate6 (ipv6);
297  }
298  else if (ipv6 != Ipv6Address::GetAny () && port != 0)
299  {
300  m_endPoint6 = m_udp->Allocate6 (ipv6, port);
301  }
302  if (0 == m_endPoint6)
303  {
305  return -1;
306  }
307  }
308  else
309  {
310  NS_LOG_ERROR ("Not IsMatchingType");
312  return -1;
313  }
314 
315  return FinishBind ();
316 }
317 
318 int
320 {
322  m_shutdownSend = true;
323  return 0;
324 }
325 
326 int
328 {
330  m_shutdownRecv = true;
331  return 0;
332 }
333 
334 int
336 {
338  if (m_shutdownRecv == true && m_shutdownSend == true)
339  {
341  return -1;
342  }
343  m_shutdownRecv = true;
344  m_shutdownSend = true;
346  return 0;
347 }
348 
349 int
351 {
352  NS_LOG_FUNCTION (this << address);
353  if (InetSocketAddress::IsMatchingType(address) == true)
354  {
356  m_defaultAddress = Address(transport.GetIpv4 ());
357  m_defaultPort = transport.GetPort ();
358  m_connected = true;
360  }
361  else if (Inet6SocketAddress::IsMatchingType(address) == true)
362  {
364  m_defaultAddress = Address(transport.GetIpv6 ());
365  m_defaultPort = transport.GetPort ();
366  m_connected = true;
368  }
369  else
370  {
371  return -1;
372  }
373 
374  return 0;
375 }
376 
377 int
379 {
381  return -1;
382 }
383 
384 int
385 UdpSocketImpl::Send (Ptr<Packet> p, uint32_t flags)
386 {
387  NS_LOG_FUNCTION (this << p << flags);
388 
389  if (!m_connected)
390  {
392  return -1;
393  }
394 
395  return DoSend (p);
396 }
397 
398 int
400 {
401  NS_LOG_FUNCTION (this << p);
403  {
404  if (Bind () == -1)
405  {
406  NS_ASSERT (m_endPoint == 0);
407  return -1;
408  }
409  NS_ASSERT (m_endPoint != 0);
410  }
412  {
413  if (Bind6 () == -1)
414  {
415  NS_ASSERT (m_endPoint6 == 0);
416  return -1;
417  }
418  NS_ASSERT (m_endPoint6 != 0);
419  }
420  if (m_shutdownSend)
421  {
423  return -1;
424  }
425 
426  return DoSendTo (p, (const Address)m_defaultAddress);
427 }
428 
429 int
431 {
432  NS_LOG_FUNCTION (this << p << address);
433 
434  if (!m_connected)
435  {
436  NS_LOG_LOGIC ("Not connected");
437  if (InetSocketAddress::IsMatchingType(address) == true)
438  {
440  Ipv4Address ipv4 = transport.GetIpv4 ();
441  uint16_t port = transport.GetPort ();
442  return DoSendTo (p, ipv4, port);
443  }
444  else if (Inet6SocketAddress::IsMatchingType(address) == true)
445  {
447  Ipv6Address ipv6 = transport.GetIpv6 ();
448  uint16_t port = transport.GetPort ();
449  return DoSendTo (p, ipv6, port);
450  }
451  else
452  {
453  return -1;
454  }
455  }
456  else
457  {
458  // connected UDP socket must use default addresses
459  NS_LOG_LOGIC ("Connected");
461  {
463  }
465  {
467  }
468  }
470  return(-1);
471 }
472 
473 int
475 {
476  NS_LOG_FUNCTION (this << p << dest << port);
477  if (m_boundnetdevice)
478  {
479  NS_LOG_LOGIC ("Bound interface number " << m_boundnetdevice->GetIfIndex ());
480  }
481  if (m_endPoint == 0)
482  {
483  if (Bind () == -1)
484  {
485  NS_ASSERT (m_endPoint == 0);
486  return -1;
487  }
488  NS_ASSERT (m_endPoint != 0);
489  }
490  if (m_shutdownSend)
491  {
493  return -1;
494  }
495 
496  if (p->GetSize () > GetTxAvailable () )
497  {
499  return -1;
500  }
501 
502  if (IsManualIpTos ())
503  {
504  SocketIpTosTag ipTosTag;
505  ipTosTag.SetTos (GetIpTos ());
506  p->AddPacketTag (ipTosTag);
507  }
508 
509  Ptr<Ipv4> ipv4 = m_node->GetObject<Ipv4> ();
510 
511  // Locally override the IP TTL for this socket
512  // We cannot directly modify the TTL at this stage, so we set a Packet tag
513  // The destination can be either multicast, unicast/anycast, or
514  // either all-hosts broadcast or limited (subnet-directed) broadcast.
515  // For the latter two broadcast types, the TTL will later be set to one
516  // irrespective of what is set in these socket options. So, this tagging
517  // may end up setting the TTL of a limited broadcast packet to be
518  // the same as a unicast, but it will be fixed further down the stack
519  if (m_ipMulticastTtl != 0 && dest.IsMulticast ())
520  {
521  SocketIpTtlTag tag;
522  tag.SetTtl (m_ipMulticastTtl);
523  p->AddPacketTag (tag);
524  }
525  else if (IsManualIpTtl () && GetIpTtl () != 0 && !dest.IsMulticast () && !dest.IsBroadcast ())
526  {
527  SocketIpTtlTag tag;
528  tag.SetTtl (GetIpTtl ());
529  p->AddPacketTag (tag);
530  }
531  {
533  bool found = p->RemovePacketTag (tag);
534  if (!found)
535  {
536  if (m_mtuDiscover)
537  {
538  tag.Enable ();
539  }
540  else
541  {
542  tag.Disable ();
543  }
544  p->AddPacketTag (tag);
545  }
546  }
547  //
548  // If dest is set to the limited broadcast address (all ones),
549  // convert it to send a copy of the packet out of every
550  // interface as a subnet-directed broadcast.
551  // Exception: if the interface has a /32 address, there is no
552  // valid subnet-directed broadcast, so send it as limited broadcast
553  // Note also that some systems will only send limited broadcast packets
554  // out of the "default" interface; here we send it out all interfaces
555  //
556  if (dest.IsBroadcast ())
557  {
558  if (!m_allowBroadcast)
559  {
561  return -1;
562  }
563  NS_LOG_LOGIC ("Limited broadcast start.");
564  for (uint32_t i = 0; i < ipv4->GetNInterfaces (); i++ )
565  {
566  // Get the primary address
567  Ipv4InterfaceAddress iaddr = ipv4->GetAddress (i, 0);
568  Ipv4Address addri = iaddr.GetLocal ();
569  if (addri == Ipv4Address ("127.0.0.1"))
570  continue;
571  // Check if interface-bound socket
572  if (m_boundnetdevice)
573  {
574  if (ipv4->GetNetDevice (i) != m_boundnetdevice)
575  continue;
576  }
577  Ipv4Mask maski = iaddr.GetMask ();
578  if (maski == Ipv4Mask::GetOnes ())
579  {
580  // if the network mask is 255.255.255.255, do not convert dest
581  NS_LOG_LOGIC ("Sending one copy from " << addri << " to " << dest
582  << " (mask is " << maski << ")");
583  m_udp->Send (p->Copy (), addri, dest,
585  NotifyDataSent (p->GetSize ());
587  }
588  else
589  {
590  // Convert to subnet-directed broadcast
591  Ipv4Address bcast = addri.GetSubnetDirectedBroadcast (maski);
592  NS_LOG_LOGIC ("Sending one copy from " << addri << " to " << bcast
593  << " (mask is " << maski << ")");
594  m_udp->Send (p->Copy (), addri, bcast,
596  NotifyDataSent (p->GetSize ());
598  }
599  }
600  NS_LOG_LOGIC ("Limited broadcast end.");
601  return p->GetSize ();
602  }
604  {
605  m_udp->Send (p->Copy (), m_endPoint->GetLocalAddress (), dest,
606  m_endPoint->GetLocalPort (), port, 0);
607  NotifyDataSent (p->GetSize ());
609  return p->GetSize ();
610  }
611  else if (ipv4->GetRoutingProtocol () != 0)
612  {
613  Ipv4Header header;
614  header.SetDestination (dest);
616  Socket::SocketErrno errno_;
617  Ptr<Ipv4Route> route;
618  Ptr<NetDevice> oif = m_boundnetdevice; //specify non-zero if bound to a specific device
619  // TBD-- we could cache the route and just check its validity
620  route = ipv4->GetRoutingProtocol ()->RouteOutput (p, header, oif, errno_);
621  if (route != 0)
622  {
623  NS_LOG_LOGIC ("Route exists");
624  if (!m_allowBroadcast)
625  {
626  uint32_t outputIfIndex = ipv4->GetInterfaceForDevice (route->GetOutputDevice ());
627  uint32_t ifNAddr = ipv4->GetNAddresses (outputIfIndex);
628  for (uint32_t addrI = 0; addrI < ifNAddr; ++addrI)
629  {
630  Ipv4InterfaceAddress ifAddr = ipv4->GetAddress (outputIfIndex, addrI);
631  if (dest == ifAddr.GetBroadcast ())
632  {
634  return -1;
635  }
636  }
637  }
638 
639  header.SetSource (route->GetSource ());
640  m_udp->Send (p->Copy (), header.GetSource (), header.GetDestination (),
641  m_endPoint->GetLocalPort (), port, route);
642  NotifyDataSent (p->GetSize ());
643  return p->GetSize ();
644  }
645  else
646  {
647  NS_LOG_LOGIC ("No route to destination");
648  NS_LOG_ERROR (errno_);
649  m_errno = errno_;
650  return -1;
651  }
652  }
653  else
654  {
655  NS_LOG_ERROR ("ERROR_NOROUTETOHOST");
657  return -1;
658  }
659 
660  return 0;
661 }
662 
663 int
665 {
666  NS_LOG_FUNCTION (this << p << dest << port);
667 
668  if (dest.IsIpv4MappedAddress ())
669  {
670  return (DoSendTo(p, dest.GetIpv4MappedAddress (), port));
671  }
672  if (m_boundnetdevice)
673  {
674  NS_LOG_LOGIC ("Bound interface number " << m_boundnetdevice->GetIfIndex ());
675  }
676  if (m_endPoint6 == 0)
677  {
678  if (Bind6 () == -1)
679  {
680  NS_ASSERT (m_endPoint6 == 0);
681  return -1;
682  }
683  NS_ASSERT (m_endPoint6 != 0);
684  }
685  if (m_shutdownSend)
686  {
688  return -1;
689  }
690 
691  if (p->GetSize () > GetTxAvailable () )
692  {
694  return -1;
695  }
696 
697  if (IsManualIpv6Tclass ())
698  {
699  SocketIpv6TclassTag ipTclassTag;
700  ipTclassTag.SetTclass (GetIpv6Tclass ());
701  p->AddPacketTag (ipTclassTag);
702  }
703 
704  Ptr<Ipv6> ipv6 = m_node->GetObject<Ipv6> ();
705 
706  // Locally override the IP TTL for this socket
707  // We cannot directly modify the TTL at this stage, so we set a Packet tag
708  // The destination can be either multicast, unicast/anycast, or
709  // either all-hosts broadcast or limited (subnet-directed) broadcast.
710  // For the latter two broadcast types, the TTL will later be set to one
711  // irrespective of what is set in these socket options. So, this tagging
712  // may end up setting the TTL of a limited broadcast packet to be
713  // the same as a unicast, but it will be fixed further down the stack
714  if (m_ipMulticastTtl != 0 && dest.IsMulticast ())
715  {
718  p->AddPacketTag (tag);
719  }
720  else if (IsManualIpv6HopLimit () && GetIpv6HopLimit () != 0 && !dest.IsMulticast ())
721  {
723  tag.SetHopLimit (GetIpv6HopLimit ());
724  p->AddPacketTag (tag);
725  }
726  // There is no analgous to an IPv4 broadcast address in IPv6.
727  // Instead, we use a set of link-local, site-local, and global
728  // multicast addresses. The Ipv6 routing layers should all
729  // provide an interface-specific route to these addresses such
730  // that we can treat these multicast addresses as "not broadcast"
731 
733  {
734  m_udp->Send (p->Copy (), m_endPoint6->GetLocalAddress (), dest,
735  m_endPoint6->GetLocalPort (), port, 0);
736  NotifyDataSent (p->GetSize ());
738  return p->GetSize ();
739  }
740  else if (ipv6->GetRoutingProtocol () != 0)
741  {
742  Ipv6Header header;
743  header.SetDestinationAddress (dest);
745  Socket::SocketErrno errno_;
746  Ptr<Ipv6Route> route;
747  Ptr<NetDevice> oif = m_boundnetdevice; //specify non-zero if bound to a specific device
748  // TBD-- we could cache the route and just check its validity
749  route = ipv6->GetRoutingProtocol ()->RouteOutput (p, header, oif, errno_);
750  if (route != 0)
751  {
752  NS_LOG_LOGIC ("Route exists");
753  header.SetSourceAddress (route->GetSource ());
754  m_udp->Send (p->Copy (), header.GetSourceAddress (), header.GetDestinationAddress (),
755  m_endPoint6->GetLocalPort (), port, route);
756  NotifyDataSent (p->GetSize ());
757  return p->GetSize ();
758  }
759  else
760  {
761  NS_LOG_LOGIC ("No route to destination");
762  NS_LOG_ERROR (errno_);
763  m_errno = errno_;
764  return -1;
765  }
766  }
767  else
768  {
769  NS_LOG_ERROR ("ERROR_NOROUTETOHOST");
771  return -1;
772  }
773 
774  return 0;
775 }
776 
777 
778 // maximum message size for UDP broadcast is limited by MTU
779 // size of underlying link; we are not checking that now.
780 // \todo Check MTU size of underlying link
781 uint32_t
783 {
785  // No finite send buffer is modelled, but we must respect
786  // the maximum size of an IP datagram (65535 bytes - headers).
788 }
789 
790 int
792 {
793  NS_LOG_FUNCTION (this << p << flags << address);
794  if (InetSocketAddress::IsMatchingType (address))
795  {
796  if (IsManualIpTos ())
797  {
798  SocketIpTosTag ipTosTag;
799  ipTosTag.SetTos (GetIpTos ());
800  p->AddPacketTag (ipTosTag);
801  }
802 
804  Ipv4Address ipv4 = transport.GetIpv4 ();
805  uint16_t port = transport.GetPort ();
806  return DoSendTo (p, ipv4, port);
807  }
808  else if (Inet6SocketAddress::IsMatchingType (address))
809  {
810  if (IsManualIpv6Tclass ())
811  {
812  SocketIpv6TclassTag ipTclassTag;
813  ipTclassTag.SetTclass (GetIpv6Tclass ());
814  p->AddPacketTag (ipTclassTag);
815  }
816 
818  Ipv6Address ipv6 = transport.GetIpv6 ();
819  uint16_t port = transport.GetPort ();
820  return DoSendTo (p, ipv6, port);
821  }
822  return -1;
823 }
824 
825 uint32_t
827 {
829  // We separately maintain this state to avoid walking the queue
830  // every time this might be called
831  return m_rxAvailable;
832 }
833 
835 UdpSocketImpl::Recv (uint32_t maxSize, uint32_t flags)
836 {
837  NS_LOG_FUNCTION (this << maxSize << flags);
838  if (m_deliveryQueue.empty () )
839  {
841  return 0;
842  }
843  Ptr<Packet> p = m_deliveryQueue.front ();
844  if (p->GetSize () <= maxSize)
845  {
846  m_deliveryQueue.pop ();
847  m_rxAvailable -= p->GetSize ();
848  }
849  else
850  {
851  p = 0;
852  }
853  return p;
854 }
855 
857 UdpSocketImpl::RecvFrom (uint32_t maxSize, uint32_t flags,
858  Address &fromAddress)
859 {
860  NS_LOG_FUNCTION (this << maxSize << flags);
861  Ptr<Packet> packet = Recv (maxSize, flags);
862  if (packet != 0)
863  {
864  SocketAddressTag tag;
865  bool found;
866  found = packet->PeekPacketTag (tag);
867  NS_ASSERT (found);
868  fromAddress = tag.GetAddress ();
869  }
870  return packet;
871 }
872 
873 int
875 {
877  if (m_endPoint != 0)
878  {
880  }
881  else if (m_endPoint6 != 0)
882  {
884  }
885  else
886  { // It is possible to call this method on a socket without a name
887  // in which case, behavior is unspecified
888  // Should this return an InetSocketAddress or an Inet6SocketAddress?
889  address = InetSocketAddress (Ipv4Address::GetZero (), 0);
890  }
891  return 0;
892 }
893 
894 int
895 UdpSocketImpl::MulticastJoinGroup (uint32_t interface, const Address &groupAddress)
896 {
897  NS_LOG_FUNCTION (interface << groupAddress);
898  /*
899  1) sanity check interface
900  2) sanity check that it has not been called yet on this interface/group
901  3) determine address family of groupAddress
902  4) locally store a list of (interface, groupAddress)
903  5) call ipv4->MulticastJoinGroup () or Ipv6->MulticastJoinGroup ()
904  */
905  return 0;
906 }
907 
908 int
909 UdpSocketImpl::MulticastLeaveGroup (uint32_t interface, const Address &groupAddress)
910 {
911  NS_LOG_FUNCTION (interface << groupAddress);
912  /*
913  1) sanity check interface
914  2) determine address family of groupAddress
915  3) delete from local list of (interface, groupAddress); raise a LOG_WARN
916  if not already present (but return 0)
917  5) call ipv4->MulticastLeaveGroup () or Ipv6->MulticastLeaveGroup ()
918  */
919  return 0;
920 }
921 
922 void
924 {
925  NS_LOG_FUNCTION (netdevice);
926 
927  Socket::BindToNetDevice (netdevice); // Includes sanity check
928  if (m_endPoint == 0)
929  {
930  if (Bind () == -1)
931  {
932  NS_ASSERT (m_endPoint == 0);
933  return;
934  }
935  NS_ASSERT (m_endPoint != 0);
936  }
937  m_endPoint->BindToNetDevice (netdevice);
938 
939  if (m_endPoint6 == 0)
940  {
941  if (Bind6 () == -1)
942  {
943  NS_ASSERT (m_endPoint6 == 0);
944  return;
945  }
946  NS_ASSERT (m_endPoint6 != 0);
947  }
948  m_endPoint6->BindToNetDevice (netdevice);
949  return;
950 }
951 
952 void
954  Ptr<Ipv4Interface> incomingInterface)
955 {
956  NS_LOG_FUNCTION (this << packet << header << port);
957 
958  if (m_shutdownRecv)
959  {
960  return;
961  }
962 
963  // Should check via getsockopt ()..
964  if (IsRecvPktInfo ())
965  {
966  Ipv4PacketInfoTag tag;
967  packet->RemovePacketTag (tag);
968  tag.SetRecvIf (incomingInterface->GetDevice ()->GetIfIndex ());
969  packet->AddPacketTag (tag);
970  }
971 
972  //Check only version 4 options
973  if (IsIpRecvTos ())
974  {
975  SocketIpTosTag ipTosTag;
976  ipTosTag.SetTos (header.GetTos ());
977  packet->AddPacketTag (ipTosTag);
978  }
979 
980  if (IsIpRecvTtl ())
981  {
982  SocketIpTtlTag ipTtlTag;
983  ipTtlTag.SetTtl (header.GetTtl ());
984  packet->AddPacketTag (ipTtlTag);
985  }
986 
987  if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
988  {
990  SocketAddressTag tag;
991  tag.SetAddress (address);
992  packet->AddPacketTag (tag);
993  m_deliveryQueue.push (packet);
994  m_rxAvailable += packet->GetSize ();
995  NotifyDataRecv ();
996  }
997  else
998  {
999  // In general, this case should not occur unless the
1000  // receiving application reads data from this socket slowly
1001  // in comparison to the arrival rate
1002  //
1003  // drop and trace packet
1004  NS_LOG_WARN ("No receive buffer space available. Drop.");
1005  m_dropTrace (packet);
1006  }
1007 }
1008 
1009 void
1010 UdpSocketImpl::ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface)
1011 {
1012  NS_LOG_FUNCTION (this << packet << header.GetSourceAddress () << port);
1013 
1014  if (m_shutdownRecv)
1015  {
1016  return;
1017  }
1018 
1019  // Should check via getsockopt ()..
1020  if (IsRecvPktInfo ())
1021  {
1022  Ipv6PacketInfoTag tag;
1023  packet->RemovePacketTag (tag);
1024  tag.SetRecvIf (incomingInterface->GetDevice ()->GetIfIndex ());
1025  packet->AddPacketTag (tag);
1026  }
1027 
1028  //Check only version 6 options
1029  if (IsIpv6RecvTclass ())
1030  {
1031  SocketIpv6TclassTag ipTclassTag;
1032  ipTclassTag.SetTclass (header.GetTrafficClass ());
1033  packet->AddPacketTag (ipTclassTag);
1034  }
1035 
1036  if (IsIpv6RecvHopLimit ())
1037  {
1038  SocketIpv6HopLimitTag ipHopLimitTag;
1039  ipHopLimitTag.SetHopLimit (header.GetHopLimit ());
1040  packet->AddPacketTag (ipHopLimitTag);
1041  }
1042 
1043  if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
1044  {
1046  SocketAddressTag tag;
1047  tag.SetAddress (address);
1048  packet->AddPacketTag (tag);
1049  m_deliveryQueue.push (packet);
1050  m_rxAvailable += packet->GetSize ();
1051  NotifyDataRecv ();
1052  }
1053  else
1054  {
1055  // In general, this case should not occur unless the
1056  // receiving application reads data from this socket slowly
1057  // in comparison to the arrival rate
1058  //
1059  // drop and trace packet
1060  NS_LOG_WARN ("No receive buffer space available. Drop.");
1061  m_dropTrace (packet);
1062  }
1063 }
1064 
1065 void
1066 UdpSocketImpl::ForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl,
1067  uint8_t icmpType, uint8_t icmpCode,
1068  uint32_t icmpInfo)
1069 {
1070  NS_LOG_FUNCTION (this << icmpSource << (uint32_t)icmpTtl << (uint32_t)icmpType <<
1071  (uint32_t)icmpCode << icmpInfo);
1072  if (!m_icmpCallback.IsNull ())
1073  {
1074  m_icmpCallback (icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
1075  }
1076 }
1077 
1078 void
1079 UdpSocketImpl::ForwardIcmp6 (Ipv6Address icmpSource, uint8_t icmpTtl,
1080  uint8_t icmpType, uint8_t icmpCode,
1081  uint32_t icmpInfo)
1082 {
1083  NS_LOG_FUNCTION (this << icmpSource << (uint32_t)icmpTtl << (uint32_t)icmpType <<
1084  (uint32_t)icmpCode << icmpInfo);
1085  if (!m_icmpCallback6.IsNull ())
1086  {
1087  m_icmpCallback6 (icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
1088  }
1089 }
1090 
1091 void
1093 {
1094  m_rcvBufSize = size;
1095 }
1096 
1097 uint32_t
1099 {
1100  return m_rcvBufSize;
1101 }
1102 
1103 void
1105 {
1106  m_ipMulticastTtl = ipTtl;
1107 }
1108 
1109 uint8_t
1111 {
1112  return m_ipMulticastTtl;
1113 }
1114 
1115 void
1117 {
1118  m_ipMulticastIf = ipIf;
1119 }
1120 
1121 int32_t
1123 {
1124  return m_ipMulticastIf;
1125 }
1126 
1127 void
1129 {
1130  m_ipMulticastLoop = loop;
1131 }
1132 
1133 bool
1135 {
1136  return m_ipMulticastLoop;
1137 }
1138 
1139 void
1141 {
1142  m_mtuDiscover = discover;
1143 }
1144 bool
1146 {
1147  return m_mtuDiscover;
1148 }
1149 
1150 bool
1152 {
1153  m_allowBroadcast = allowBroadcast;
1154  return true;
1155 }
1156 
1157 bool
1159 {
1160  return m_allowBroadcast;
1161 }
1162 
1163 
1164 } // 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:816
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:382
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:507
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:470
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:403
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:304
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:174
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:522
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:61
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:370
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:495
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:760
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:363
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:1681
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:415
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:582
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:1723
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:1290
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:376
void NotifyDataSent(uint32_t size)
Notify through the callback (if set) that some data have been sent.
Definition: socket.cc:284
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:642
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:216
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:388
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:445
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:457
Ptr< const AttributeChecker > MakeCallbackChecker(void)
Definition: callback.cc:75
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
Definition: socket.cc:329
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:84
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:482
void Disable(void)
Disables the DF (Don't Fragment) flag.
Definition: socket.cc:702
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:529
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:696
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:51
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:294
TypeId SetParent(TypeId tid)
Definition: type-id.cc:631
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.