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/ipv6-l3-protocol.h"
30 #include "ns3/ipv4-header.h"
31 #include "ns3/ipv4-routing-protocol.h"
32 #include "ns3/ipv6-routing-protocol.h"
33 #include "ns3/udp-socket-factory.h"
34 #include "ns3/trace-source-accessor.h"
35 #include "ns3/ipv4-packet-info-tag.h"
36 #include "ns3/ipv6-packet-info-tag.h"
37 #include "udp-socket-impl.h"
38 #include "udp-l4-protocol.h"
39 #include "ipv4-end-point.h"
40 #include "ipv6-end-point.h"
41 #include <limits>
42 
43 namespace ns3 {
44 
45 NS_LOG_COMPONENT_DEFINE ("UdpSocketImpl");
46 
47 NS_OBJECT_ENSURE_REGISTERED (UdpSocketImpl);
48 
49 // The correct maximum UDP message size is 65507, as determined by the following formula:
50 // 0xffff - (sizeof(IP Header) + sizeof(UDP Header)) = 65535-(20+8) = 65507
51 // \todo MAX_IPV4_UDP_DATAGRAM_SIZE is correct only for IPv4
52 static const uint32_t MAX_IPV4_UDP_DATAGRAM_SIZE = 65507;
53 
54 // Add attributes generic to all UdpSockets to base class UdpSocket
55 TypeId
57 {
58  static TypeId tid = TypeId ("ns3::UdpSocketImpl")
59  .SetParent<UdpSocket> ()
60  .SetGroupName ("Internet")
61  .AddConstructor<UdpSocketImpl> ()
62  .AddTraceSource ("Drop",
63  "Drop UDP packet due to receive buffer overflow",
65  "ns3::Packet::TracedCallback")
66  .AddAttribute ("IcmpCallback", "Callback invoked whenever an icmp error is received on this socket.",
67  CallbackValue (),
70  .AddAttribute ("IcmpCallback6", "Callback invoked whenever an icmpv6 error is received on this socket.",
71  CallbackValue (),
74  ;
75  return tid;
76 }
77 
79  : m_endPoint (0),
80  m_endPoint6 (0),
81  m_node (0),
82  m_udp (0),
83  m_errno (ERROR_NOTERROR),
84  m_shutdownSend (false),
85  m_shutdownRecv (false),
86  m_connected (false),
87  m_rxAvailable (0)
88 {
90  m_allowBroadcast = false;
91 }
92 
94 {
96 
98  m_node = 0;
104  if (m_endPoint != 0)
105  {
106  NS_ASSERT (m_udp != 0);
115  NS_ASSERT (m_endPoint != 0);
116  m_udp->DeAllocate (m_endPoint);
117  NS_ASSERT (m_endPoint == 0);
118  }
119  if (m_endPoint6 != 0)
120  {
121  NS_ASSERT (m_udp != 0);
130  NS_ASSERT (m_endPoint6 != 0);
131  m_udp->DeAllocate (m_endPoint6);
132  NS_ASSERT (m_endPoint6 == 0);
133  }
134  m_udp = 0;
135 }
136 
137 void
139 {
141  m_node = node;
142 
143 }
144 void
146 {
148  m_udp = udp;
149 }
150 
151 
154 {
156  return m_errno;
157 }
158 
161 {
162  return NS3_SOCK_DGRAM;
163 }
164 
165 Ptr<Node>
167 {
169  return m_node;
170 }
171 
172 void
174 {
176  m_endPoint = 0;
177 }
178 
179 void
181 {
183  m_endPoint6 = 0;
184 }
185 
186 /* Deallocate the end point and cancel all the timers */
187 void
189 {
190  if (m_endPoint != 0)
191  {
192  m_endPoint->SetDestroyCallback (MakeNullCallback<void> ());
193  m_udp->DeAllocate (m_endPoint);
194  m_endPoint = 0;
195  }
196  if (m_endPoint6 != 0)
197  {
198  m_endPoint6->SetDestroyCallback (MakeNullCallback<void> ());
199  m_udp->DeAllocate (m_endPoint6);
200  m_endPoint6 = 0;
201  }
202 }
203 
204 
205 int
207 {
209  bool done = false;
210  if (m_endPoint != 0)
211  {
215  done = true;
216  }
217  if (m_endPoint6 != 0)
218  {
222  done = true;
223  }
224  if (done)
225  {
226  return 0;
227  }
228  return -1;
229 }
230 
231 int
233 {
235  m_endPoint = m_udp->Allocate ();
236  return FinishBind ();
237 }
238 
239 int
241 {
243  m_endPoint6 = m_udp->Allocate6 ();
244  return FinishBind ();
245 }
246 
247 int
249 {
250  NS_LOG_FUNCTION (this << address);
251 
252  if (InetSocketAddress::IsMatchingType (address))
253  {
254  NS_ASSERT_MSG (m_endPoint == 0, "Endpoint already allocated (maybe you used BindToNetDevice before Bind).");
255 
257  Ipv4Address ipv4 = transport.GetIpv4 ();
258  uint16_t port = transport.GetPort ();
259  SetIpTos (transport.GetTos ());
260  if (ipv4 == Ipv4Address::GetAny () && port == 0)
261  {
262  m_endPoint = m_udp->Allocate ();
263  }
264  else if (ipv4 == Ipv4Address::GetAny () && port != 0)
265  {
266  m_endPoint = m_udp->Allocate (port);
267  }
268  else if (ipv4 != Ipv4Address::GetAny () && port == 0)
269  {
270  m_endPoint = m_udp->Allocate (ipv4);
271  }
272  else if (ipv4 != Ipv4Address::GetAny () && port != 0)
273  {
274  m_endPoint = m_udp->Allocate (ipv4, port);
275  }
276  if (0 == m_endPoint)
277  {
279  return -1;
280  }
281  }
282  else if (Inet6SocketAddress::IsMatchingType (address))
283  {
284  NS_ASSERT_MSG (m_endPoint == 0, "Endpoint already allocated (maybe you used BindToNetDevice before Bind).");
285 
287  Ipv6Address ipv6 = transport.GetIpv6 ();
288  uint16_t port = transport.GetPort ();
289  if (ipv6 == Ipv6Address::GetAny () && port == 0)
290  {
291  m_endPoint6 = m_udp->Allocate6 ();
292  }
293  else if (ipv6 == Ipv6Address::GetAny () && port != 0)
294  {
295  m_endPoint6 = m_udp->Allocate6 (port);
296  }
297  else if (ipv6 != Ipv6Address::GetAny () && port == 0)
298  {
299  m_endPoint6 = m_udp->Allocate6 (ipv6);
300  }
301  else if (ipv6 != Ipv6Address::GetAny () && port != 0)
302  {
303  m_endPoint6 = m_udp->Allocate6 (ipv6, port);
304  }
305  if (0 == m_endPoint6)
306  {
308  return -1;
309  }
310  if (ipv6.IsMulticast ())
311  {
313  if (ipv6l3)
314  {
315  ipv6l3->AddMulticastAddress (ipv6);
316  }
317  }
318  }
319  else
320  {
321  NS_LOG_ERROR ("Not IsMatchingType");
323  return -1;
324  }
325 
326  return FinishBind ();
327 }
328 
329 int
331 {
333  m_shutdownSend = true;
334  return 0;
335 }
336 
337 int
339 {
341  m_shutdownRecv = true;
342  if (m_endPoint)
343  {
344  m_endPoint->SetRxEnabled (false);
345  }
346  if (m_endPoint6)
347  {
348  m_endPoint6->SetRxEnabled (false);
349  }
350  return 0;
351 }
352 
353 int
355 {
357  if (m_shutdownRecv == true && m_shutdownSend == true)
358  {
360  return -1;
361  }
362  Ipv6LeaveGroup ();
363  m_shutdownRecv = true;
364  m_shutdownSend = true;
366  return 0;
367 }
368 
369 int
371 {
372  NS_LOG_FUNCTION (this << address);
373  if (InetSocketAddress::IsMatchingType(address) == true)
374  {
376  m_defaultAddress = Address(transport.GetIpv4 ());
377  m_defaultPort = transport.GetPort ();
378  SetIpTos (transport.GetTos ());
379  m_connected = true;
381  }
382  else if (Inet6SocketAddress::IsMatchingType(address) == true)
383  {
385  m_defaultAddress = Address(transport.GetIpv6 ());
386  m_defaultPort = transport.GetPort ();
387  m_connected = true;
389  }
390  else
391  {
393  return -1;
394  }
395 
396  return 0;
397 }
398 
399 int
401 {
403  return -1;
404 }
405 
406 int
407 UdpSocketImpl::Send (Ptr<Packet> p, uint32_t flags)
408 {
409  NS_LOG_FUNCTION (this << p << flags);
410 
411  if (!m_connected)
412  {
414  return -1;
415  }
416 
417  return DoSend (p);
418 }
419 
420 int
422 {
423  NS_LOG_FUNCTION (this << p);
425  {
426  if (Bind () == -1)
427  {
428  NS_ASSERT (m_endPoint == 0);
429  return -1;
430  }
431  NS_ASSERT (m_endPoint != 0);
432  }
433  else if ((m_endPoint6 == 0) && (Ipv6Address::IsMatchingType(m_defaultAddress) == true))
434  {
435  if (Bind6 () == -1)
436  {
437  NS_ASSERT (m_endPoint6 == 0);
438  return -1;
439  }
440  NS_ASSERT (m_endPoint6 != 0);
441  }
442  if (m_shutdownSend)
443  {
445  return -1;
446  }
447 
449  {
451  }
453  {
455  }
456 
458  return(-1);
459 }
460 
461 int
462 UdpSocketImpl::DoSendTo (Ptr<Packet> p, Ipv4Address dest, uint16_t port, uint8_t tos)
463 {
464  NS_LOG_FUNCTION (this << p << dest << port << (uint16_t) tos);
465  if (m_boundnetdevice)
466  {
467  NS_LOG_LOGIC ("Bound interface number " << m_boundnetdevice->GetIfIndex ());
468  }
469  if (m_endPoint == 0)
470  {
471  if (Bind () == -1)
472  {
473  NS_ASSERT (m_endPoint == 0);
474  return -1;
475  }
476  NS_ASSERT (m_endPoint != 0);
477  }
478  if (m_shutdownSend)
479  {
481  return -1;
482  }
483 
484  if (p->GetSize () > GetTxAvailable () )
485  {
487  return -1;
488  }
489 
490  uint8_t priority = GetPriority ();
491  if (tos)
492  {
493  SocketIpTosTag ipTosTag;
494  ipTosTag.SetTos (tos);
495  // This packet may already have a SocketIpTosTag (see BUG 2440)
496  p->ReplacePacketTag (ipTosTag);
497  priority = IpTos2Priority (tos);
498  }
499 
500  if (priority)
501  {
502  SocketPriorityTag priorityTag;
503  priorityTag.SetPriority (priority);
504  p->ReplacePacketTag (priorityTag);
505  }
506 
507  Ptr<Ipv4> ipv4 = m_node->GetObject<Ipv4> ();
508 
509  // Locally override the IP TTL for this socket
510  // We cannot directly modify the TTL at this stage, so we set a Packet tag
511  // The destination can be either multicast, unicast/anycast, or
512  // either all-hosts broadcast or limited (subnet-directed) broadcast.
513  // For the latter two broadcast types, the TTL will later be set to one
514  // irrespective of what is set in these socket options. So, this tagging
515  // may end up setting the TTL of a limited broadcast packet to be
516  // the same as a unicast, but it will be fixed further down the stack
517  if (m_ipMulticastTtl != 0 && dest.IsMulticast ())
518  {
519  SocketIpTtlTag tag;
520  tag.SetTtl (m_ipMulticastTtl);
521  p->AddPacketTag (tag);
522  }
523  else if (IsManualIpTtl () && GetIpTtl () != 0 && !dest.IsMulticast () && !dest.IsBroadcast ())
524  {
525  SocketIpTtlTag tag;
526  tag.SetTtl (GetIpTtl ());
527  p->AddPacketTag (tag);
528  }
529  {
531  bool found = p->RemovePacketTag (tag);
532  if (!found)
533  {
534  if (m_mtuDiscover)
535  {
536  tag.Enable ();
537  }
538  else
539  {
540  tag.Disable ();
541  }
542  p->AddPacketTag (tag);
543  }
544  }
545  //
546  // If dest is set to the limited broadcast address (all ones),
547  // convert it to send a copy of the packet out of every
548  // interface as a subnet-directed broadcast.
549  // Exception: if the interface has a /32 address, there is no
550  // valid subnet-directed broadcast, so send it as limited broadcast
551  // Note also that some systems will only send limited broadcast packets
552  // out of the "default" interface; here we send it out all interfaces
553  //
554  if (dest.IsBroadcast ())
555  {
556  if (!m_allowBroadcast)
557  {
559  return -1;
560  }
561  NS_LOG_LOGIC ("Limited broadcast start.");
562  for (uint32_t i = 0; i < ipv4->GetNInterfaces (); i++ )
563  {
564  // Get the primary address
565  Ipv4InterfaceAddress iaddr = ipv4->GetAddress (i, 0);
566  Ipv4Address addri = iaddr.GetLocal ();
567  if (addri == Ipv4Address ("127.0.0.1"))
568  continue;
569  // Check if interface-bound socket
570  if (m_boundnetdevice)
571  {
572  if (ipv4->GetNetDevice (i) != m_boundnetdevice)
573  continue;
574  }
575  Ipv4Mask maski = iaddr.GetMask ();
576  if (maski == Ipv4Mask::GetOnes ())
577  {
578  // if the network mask is 255.255.255.255, do not convert dest
579  NS_LOG_LOGIC ("Sending one copy from " << addri << " to " << dest
580  << " (mask is " << maski << ")");
581  m_udp->Send (p->Copy (), addri, dest,
583  NotifyDataSent (p->GetSize ());
585  }
586  else
587  {
588  // Convert to subnet-directed broadcast
589  Ipv4Address bcast = addri.GetSubnetDirectedBroadcast (maski);
590  NS_LOG_LOGIC ("Sending one copy from " << addri << " to " << bcast
591  << " (mask is " << maski << ")");
592  m_udp->Send (p->Copy (), addri, bcast,
594  NotifyDataSent (p->GetSize ());
596  }
597  }
598  NS_LOG_LOGIC ("Limited broadcast end.");
599  return p->GetSize ();
600  }
602  {
603  m_udp->Send (p->Copy (), m_endPoint->GetLocalAddress (), dest,
604  m_endPoint->GetLocalPort (), port, 0);
605  NotifyDataSent (p->GetSize ());
607  return p->GetSize ();
608  }
609  else if (ipv4->GetRoutingProtocol () != 0)
610  {
611  Ipv4Header header;
612  header.SetDestination (dest);
614  Socket::SocketErrno errno_;
615  Ptr<Ipv4Route> route;
616  Ptr<NetDevice> oif = m_boundnetdevice; //specify non-zero if bound to a specific device
617  // TBD-- we could cache the route and just check its validity
618  route = ipv4->GetRoutingProtocol ()->RouteOutput (p, header, oif, errno_);
619  if (route != 0)
620  {
621  NS_LOG_LOGIC ("Route exists");
622  if (!m_allowBroadcast)
623  {
624  uint32_t outputIfIndex = ipv4->GetInterfaceForDevice (route->GetOutputDevice ());
625  uint32_t ifNAddr = ipv4->GetNAddresses (outputIfIndex);
626  for (uint32_t addrI = 0; addrI < ifNAddr; ++addrI)
627  {
628  Ipv4InterfaceAddress ifAddr = ipv4->GetAddress (outputIfIndex, addrI);
629  if (dest == ifAddr.GetBroadcast ())
630  {
632  return -1;
633  }
634  }
635  }
636 
637  header.SetSource (route->GetSource ());
638  m_udp->Send (p->Copy (), header.GetSource (), header.GetDestination (),
639  m_endPoint->GetLocalPort (), port, route);
640  NotifyDataSent (p->GetSize ());
641  return p->GetSize ();
642  }
643  else
644  {
645  NS_LOG_LOGIC ("No route to destination");
646  NS_LOG_ERROR (errno_);
647  m_errno = errno_;
648  return -1;
649  }
650  }
651  else
652  {
653  NS_LOG_ERROR ("ERROR_NOROUTETOHOST");
655  return -1;
656  }
657 
658  return 0;
659 }
660 
661 int
663 {
664  NS_LOG_FUNCTION (this << p << dest << port);
665 
666  if (dest.IsIpv4MappedAddress ())
667  {
668  return (DoSendTo(p, dest.GetIpv4MappedAddress (), port, 0));
669  }
670  if (m_boundnetdevice)
671  {
672  NS_LOG_LOGIC ("Bound interface number " << m_boundnetdevice->GetIfIndex ());
673  }
674  if (m_endPoint6 == 0)
675  {
676  if (Bind6 () == -1)
677  {
678  NS_ASSERT (m_endPoint6 == 0);
679  return -1;
680  }
681  NS_ASSERT (m_endPoint6 != 0);
682  }
683  if (m_shutdownSend)
684  {
686  return -1;
687  }
688 
689  if (p->GetSize () > GetTxAvailable () )
690  {
692  return -1;
693  }
694 
695  if (IsManualIpv6Tclass ())
696  {
697  SocketIpv6TclassTag ipTclassTag;
698  ipTclassTag.SetTclass (GetIpv6Tclass ());
699  p->AddPacketTag (ipTclassTag);
700  }
701 
702  uint8_t priority = GetPriority ();
703  if (priority)
704  {
705  SocketPriorityTag priorityTag;
706  priorityTag.SetPriority (priority);
707  p->ReplacePacketTag (priorityTag);
708  }
709 
710  Ptr<Ipv6> ipv6 = m_node->GetObject<Ipv6> ();
711 
712  // Locally override the IP TTL for this socket
713  // We cannot directly modify the TTL at this stage, so we set a Packet tag
714  // The destination can be either multicast, unicast/anycast, or
715  // either all-hosts broadcast or limited (subnet-directed) broadcast.
716  // For the latter two broadcast types, the TTL will later be set to one
717  // irrespective of what is set in these socket options. So, this tagging
718  // may end up setting the TTL of a limited broadcast packet to be
719  // the same as a unicast, but it will be fixed further down the stack
720  if (m_ipMulticastTtl != 0 && dest.IsMulticast ())
721  {
724  p->AddPacketTag (tag);
725  }
726  else if (IsManualIpv6HopLimit () && GetIpv6HopLimit () != 0 && !dest.IsMulticast ())
727  {
729  tag.SetHopLimit (GetIpv6HopLimit ());
730  p->AddPacketTag (tag);
731  }
732  // There is no analgous to an IPv4 broadcast address in IPv6.
733  // Instead, we use a set of link-local, site-local, and global
734  // multicast addresses. The Ipv6 routing layers should all
735  // provide an interface-specific route to these addresses such
736  // that we can treat these multicast addresses as "not broadcast"
737 
739  {
740  m_udp->Send (p->Copy (), m_endPoint6->GetLocalAddress (), dest,
741  m_endPoint6->GetLocalPort (), port, 0);
742  NotifyDataSent (p->GetSize ());
744  return p->GetSize ();
745  }
746  else if (ipv6->GetRoutingProtocol () != 0)
747  {
748  Ipv6Header header;
749  header.SetDestinationAddress (dest);
751  Socket::SocketErrno errno_;
752  Ptr<Ipv6Route> route;
753  Ptr<NetDevice> oif = m_boundnetdevice; //specify non-zero if bound to a specific device
754  // TBD-- we could cache the route and just check its validity
755  route = ipv6->GetRoutingProtocol ()->RouteOutput (p, header, oif, errno_);
756  if (route != 0)
757  {
758  NS_LOG_LOGIC ("Route exists");
759  header.SetSourceAddress (route->GetSource ());
760  m_udp->Send (p->Copy (), header.GetSourceAddress (), header.GetDestinationAddress (),
761  m_endPoint6->GetLocalPort (), port, route);
762  NotifyDataSent (p->GetSize ());
763  return p->GetSize ();
764  }
765  else
766  {
767  NS_LOG_LOGIC ("No route to destination");
768  NS_LOG_ERROR (errno_);
769  m_errno = errno_;
770  return -1;
771  }
772  }
773  else
774  {
775  NS_LOG_ERROR ("ERROR_NOROUTETOHOST");
777  return -1;
778  }
779 
780  return 0;
781 }
782 
783 
784 // maximum message size for UDP broadcast is limited by MTU
785 // size of underlying link; we are not checking that now.
786 // \todo Check MTU size of underlying link
787 uint32_t
789 {
791  // No finite send buffer is modelled, but we must respect
792  // the maximum size of an IP datagram (65535 bytes - headers).
794 }
795 
796 int
798 {
799  NS_LOG_FUNCTION (this << p << flags << address);
800  if (InetSocketAddress::IsMatchingType (address))
801  {
803  Ipv4Address ipv4 = transport.GetIpv4 ();
804  uint16_t port = transport.GetPort ();
805  uint8_t tos = transport.GetTos ();
806  return DoSendTo (p, ipv4, port, tos);
807  }
808  else if (Inet6SocketAddress::IsMatchingType (address))
809  {
811  Ipv6Address ipv6 = transport.GetIpv6 ();
812  uint16_t port = transport.GetPort ();
813  return DoSendTo (p, ipv6, port);
814  }
815  return -1;
816 }
817 
818 uint32_t
820 {
822  // We separately maintain this state to avoid walking the queue
823  // every time this might be called
824  return m_rxAvailable;
825 }
826 
828 UdpSocketImpl::Recv (uint32_t maxSize, uint32_t flags)
829 {
830  NS_LOG_FUNCTION (this << maxSize << flags);
831 
832  Address fromAddress;
833  Ptr<Packet> packet = RecvFrom (maxSize, flags, fromAddress);
834  return packet;
835 }
836 
838 UdpSocketImpl::RecvFrom (uint32_t maxSize, uint32_t flags,
839  Address &fromAddress)
840 {
841  NS_LOG_FUNCTION (this << maxSize << flags);
842 
843  if (m_deliveryQueue.empty () )
844  {
846  return 0;
847  }
848  Ptr<Packet> p = m_deliveryQueue.front ().first;
849  fromAddress = m_deliveryQueue.front ().second;
850 
851  if (p->GetSize () <= maxSize)
852  {
853  m_deliveryQueue.pop ();
854  m_rxAvailable -= p->GetSize ();
855  }
856  else
857  {
858  p = 0;
859  }
860  return p;
861 }
862 
863 int
865 {
867  if (m_endPoint != 0)
868  {
870  }
871  else if (m_endPoint6 != 0)
872  {
874  }
875  else
876  { // It is possible to call this method on a socket without a name
877  // in which case, behavior is unspecified
878  // Should this return an InetSocketAddress or an Inet6SocketAddress?
879  address = InetSocketAddress (Ipv4Address::GetZero (), 0);
880  }
881  return 0;
882 }
883 
884 int
886 {
887  NS_LOG_FUNCTION (this << address);
888 
889  if (!m_connected)
890  {
892  return -1;
893  }
894 
896  {
898  InetSocketAddress inet (addr, m_defaultPort);
899  inet.SetTos (GetIpTos ());
900  address = inet;
901  }
903  {
905  address = Inet6SocketAddress (addr, m_defaultPort);
906  }
907  else
908  {
909  NS_ASSERT_MSG (false, "unexpected address type");
910  }
911 
912  return 0;
913 }
914 
915 int
916 UdpSocketImpl::MulticastJoinGroup (uint32_t interface, const Address &groupAddress)
917 {
918  NS_LOG_FUNCTION (interface << groupAddress);
919  /*
920  1) sanity check interface
921  2) sanity check that it has not been called yet on this interface/group
922  3) determine address family of groupAddress
923  4) locally store a list of (interface, groupAddress)
924  5) call ipv4->MulticastJoinGroup () or Ipv6->MulticastJoinGroup ()
925  */
926  return 0;
927 }
928 
929 int
930 UdpSocketImpl::MulticastLeaveGroup (uint32_t interface, const Address &groupAddress)
931 {
932  NS_LOG_FUNCTION (interface << groupAddress);
933  /*
934  1) sanity check interface
935  2) determine address family of groupAddress
936  3) delete from local list of (interface, groupAddress); raise a LOG_WARN
937  if not already present (but return 0)
938  5) call ipv4->MulticastLeaveGroup () or Ipv6->MulticastLeaveGroup ()
939  */
940  return 0;
941 }
942 
943 void
945 {
946  NS_LOG_FUNCTION (netdevice);
947 
948  Socket::BindToNetDevice (netdevice); // Includes sanity check
949  if (m_endPoint == 0)
950  {
951  if (Bind () == -1)
952  {
953  NS_ASSERT (m_endPoint == 0);
954  return;
955  }
956  NS_ASSERT (m_endPoint != 0);
957  }
958  m_endPoint->BindToNetDevice (netdevice);
959 
960  if (m_endPoint6 == 0)
961  {
962  if (Bind6 () == -1)
963  {
964  NS_ASSERT (m_endPoint6 == 0);
965  return;
966  }
967  NS_ASSERT (m_endPoint6 != 0);
968  }
969  m_endPoint6->BindToNetDevice (netdevice);
970 
972  {
974  if (ipv6l3)
975  {
976  uint32_t index = ipv6l3->GetInterfaceForDevice (netdevice);
977  ipv6l3->RemoveMulticastAddress (m_endPoint6->GetLocalAddress ());
978  ipv6l3->AddMulticastAddress (m_endPoint6->GetLocalAddress (), index);
979  }
980  }
981 
982  return;
983 }
984 
985 void
987  Ptr<Ipv4Interface> incomingInterface)
988 {
989  NS_LOG_FUNCTION (this << packet << header << port);
990 
991  if (m_shutdownRecv)
992  {
993  return;
994  }
995 
996  // Should check via getsockopt ()..
997  if (IsRecvPktInfo ())
998  {
999  Ipv4PacketInfoTag tag;
1000  packet->RemovePacketTag (tag);
1001  tag.SetRecvIf (incomingInterface->GetDevice ()->GetIfIndex ());
1002  packet->AddPacketTag (tag);
1003  }
1004 
1005  //Check only version 4 options
1006  if (IsIpRecvTos ())
1007  {
1008  SocketIpTosTag ipTosTag;
1009  ipTosTag.SetTos (header.GetTos ());
1010  packet->AddPacketTag (ipTosTag);
1011  }
1012 
1013  if (IsIpRecvTtl ())
1014  {
1015  SocketIpTtlTag ipTtlTag;
1016  ipTtlTag.SetTtl (header.GetTtl ());
1017  packet->AddPacketTag (ipTtlTag);
1018  }
1019 
1020  // in case the packet still has a priority tag attached, remove it
1021  SocketPriorityTag priorityTag;
1022  packet->RemovePacketTag (priorityTag);
1023 
1024  if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
1025  {
1027  m_deliveryQueue.push (std::make_pair (packet, address));
1028  m_rxAvailable += packet->GetSize ();
1029  NotifyDataRecv ();
1030  }
1031  else
1032  {
1033  // In general, this case should not occur unless the
1034  // receiving application reads data from this socket slowly
1035  // in comparison to the arrival rate
1036  //
1037  // drop and trace packet
1038  NS_LOG_WARN ("No receive buffer space available. Drop.");
1039  m_dropTrace (packet);
1040  }
1041 }
1042 
1043 void
1044 UdpSocketImpl::ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface)
1045 {
1046  NS_LOG_FUNCTION (this << packet << header.GetSourceAddress () << port);
1047 
1048  if (m_shutdownRecv)
1049  {
1050  return;
1051  }
1052 
1053  // Should check via getsockopt ().
1054  if (IsRecvPktInfo ())
1055  {
1056  Ipv6PacketInfoTag tag;
1057  packet->RemovePacketTag (tag);
1058  tag.SetRecvIf (incomingInterface->GetDevice ()->GetIfIndex ());
1059  packet->AddPacketTag (tag);
1060  }
1061 
1062  // Check only version 6 options
1063  if (IsIpv6RecvTclass ())
1064  {
1065  SocketIpv6TclassTag ipTclassTag;
1066  ipTclassTag.SetTclass (header.GetTrafficClass ());
1067  packet->AddPacketTag (ipTclassTag);
1068  }
1069 
1070  if (IsIpv6RecvHopLimit ())
1071  {
1072  SocketIpv6HopLimitTag ipHopLimitTag;
1073  ipHopLimitTag.SetHopLimit (header.GetHopLimit ());
1074  packet->AddPacketTag (ipHopLimitTag);
1075  }
1076 
1077  // in case the packet still has a priority tag attached, remove it
1078  SocketPriorityTag priorityTag;
1079  packet->RemovePacketTag (priorityTag);
1080 
1081  if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
1082  {
1084  m_deliveryQueue.push (std::make_pair (packet, address));
1085  m_rxAvailable += packet->GetSize ();
1086  NotifyDataRecv ();
1087  }
1088  else
1089  {
1090  // In general, this case should not occur unless the
1091  // receiving application reads data from this socket slowly
1092  // in comparison to the arrival rate
1093  //
1094  // drop and trace packet
1095  NS_LOG_WARN ("No receive buffer space available. Drop.");
1096  m_dropTrace (packet);
1097  }
1098 }
1099 
1100 void
1101 UdpSocketImpl::ForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl,
1102  uint8_t icmpType, uint8_t icmpCode,
1103  uint32_t icmpInfo)
1104 {
1105  NS_LOG_FUNCTION (this << icmpSource << (uint32_t)icmpTtl << (uint32_t)icmpType <<
1106  (uint32_t)icmpCode << icmpInfo);
1107  if (!m_icmpCallback.IsNull ())
1108  {
1109  m_icmpCallback (icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
1110  }
1111 }
1112 
1113 void
1114 UdpSocketImpl::ForwardIcmp6 (Ipv6Address icmpSource, uint8_t icmpTtl,
1115  uint8_t icmpType, uint8_t icmpCode,
1116  uint32_t icmpInfo)
1117 {
1118  NS_LOG_FUNCTION (this << icmpSource << (uint32_t)icmpTtl << (uint32_t)icmpType <<
1119  (uint32_t)icmpCode << icmpInfo);
1120  if (!m_icmpCallback6.IsNull ())
1121  {
1122  m_icmpCallback6 (icmpSource, icmpTtl, icmpType, icmpCode, icmpInfo);
1123  }
1124 }
1125 
1126 void
1128 {
1129  m_rcvBufSize = size;
1130 }
1131 
1132 uint32_t
1134 {
1135  return m_rcvBufSize;
1136 }
1137 
1138 void
1140 {
1141  m_ipMulticastTtl = ipTtl;
1142 }
1143 
1144 uint8_t
1146 {
1147  return m_ipMulticastTtl;
1148 }
1149 
1150 void
1152 {
1153  m_ipMulticastIf = ipIf;
1154 }
1155 
1156 int32_t
1158 {
1159  return m_ipMulticastIf;
1160 }
1161 
1162 void
1164 {
1165  m_ipMulticastLoop = loop;
1166 }
1167 
1168 bool
1170 {
1171  return m_ipMulticastLoop;
1172 }
1173 
1174 void
1176 {
1177  m_mtuDiscover = discover;
1178 }
1179 bool
1181 {
1182  return m_mtuDiscover;
1183 }
1184 
1185 bool
1187 {
1188  m_allowBroadcast = allowBroadcast;
1189  return true;
1190 }
1191 
1192 bool
1194 {
1195  return m_allowBroadcast;
1196 }
1197 
1198 void
1199 UdpSocketImpl::Ipv6JoinGroup (Ipv6Address address, Socket::Ipv6MulticastFilterMode filterMode, std::vector<Ipv6Address> sourceAddresses)
1200 {
1201  NS_LOG_FUNCTION (this << address << &filterMode << &sourceAddresses);
1202 
1203  // We can join only one multicast group (or change its params)
1204  NS_ASSERT_MSG ((m_ipv6MulticastGroupAddress == address || m_ipv6MulticastGroupAddress.IsAny ()), "Can join only one IPv6 multicast group.");
1205 
1207 
1209  if (ipv6l3)
1210  {
1211  if (filterMode == INCLUDE && sourceAddresses.empty ())
1212  {
1213  // it is a leave
1214  if (m_boundnetdevice)
1215  {
1216  int32_t index = ipv6l3->GetInterfaceForDevice (m_boundnetdevice);
1217  NS_ASSERT_MSG (index >= 0, "Interface without a valid index");
1218  ipv6l3->RemoveMulticastAddress (address, index);
1219  }
1220  else
1221  {
1222  ipv6l3->RemoveMulticastAddress (address);
1223  }
1224  }
1225  else
1226  {
1227  // it is a join or a modification
1228  if (m_boundnetdevice)
1229  {
1230  int32_t index = ipv6l3->GetInterfaceForDevice (m_boundnetdevice);
1231  NS_ASSERT_MSG (index >= 0, "Interface without a valid index");
1232  ipv6l3->AddMulticastAddress (address, index);
1233  }
1234  else
1235  {
1236  ipv6l3->AddMulticastAddress (address);
1237  }
1238  }
1239  }
1240 }
1241 
1242 } // namespace ns3
static bool IsMatchingType(const Address &address)
If the Address matches the type.
bool IsAny() const
If the IPv6 address is the "Any" address.
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:47
uint8_t GetTrafficClass(void) const
Get the "Traffic class" field.
Definition: ipv6-header.cc:50
bool m_shutdownSend
Send no longer allowed.
void SetTclass(uint8_t tclass)
Set the tag's Tclass.
Definition: socket.cc:906
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:377
Packet header for IPv6.
Definition: ipv6-header.h:34
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:563
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:526
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:459
This class implements a tag that carries the socket-specific HOPLIMIT of a packet to the IPv6 layer...
Definition: socket.h:1160
#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.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Definition: object.h:462
Access to the IPv6 forwarding table, interfaces, and configuration.
Definition: ipv6.h:81
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:257
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
IPv6 layer implementation.
void SetDestroyCallback(Callback< void > callback)
Set the default destroy callback.
void AddPacketTag(const Tag &tag) const
Add a packet tag.
Definition: packet.cc:824
void NotifyConnectionFailed(void)
Notify through the callback (if set) that the connection has not been established due to an error...
Definition: socket.cc:227
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:792
void SetNextHeader(uint8_t next)
Set the "Next header" field.
Definition: ipv6-header.cc:75
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:551
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:791
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
static uint8_t IpTos2Priority(uint8_t ipTos)
Return the priority corresponding to a given TOS value.
Definition: socket.cc:408
This class implements a tag that carries the socket-specific TTL of a packet to the IP layer...
Definition: socket.h:1112
virtual void SetRcvBufSize(uint32_t size)
Set the receiving buffer size.
Ipv6Address m_ipv6MulticastGroupAddress
IPv6 multicast group address.
Definition: socket.h:1075
virtual void Ipv6JoinGroup(Ipv6Address address, Socket::Ipv6MulticastFilterMode filterMode, std::vector< Ipv6Address > sourceAddresses)
Joins a IPv6 multicast group.
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:1880
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:471
Packet header for IPv4.
Definition: ipv4-header.h:33
virtual int ShutdownRecv(void)
virtual int GetSockName(Address &address) const
Get socket address.
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.
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:610
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.
bool ReplacePacketTag(Tag &tag)
Replace the value of a packet tag.
Definition: packet.cc:838
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:1922
Ipv4Address GetLocalAddress(void)
Get the local address.
bool IsBroadcast(void) const
uint8_t m_ipMulticastTtl
Multicast TTL.
indicates whether the socket has a priority set.
Definition: socket.h:1304
Address m_defaultAddress
Default address.
virtual enum SocketType GetSocketType(void) const
An Inet6 address class.
virtual void SetMtuDiscover(bool discover)
Set the MTU discover capability.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Definition: callback.h:1489
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:371
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)
uint8_t GetTos(void) const
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:671
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:383
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:90
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:1351
uint8_t GetIpv6Tclass(void) const
Query the value of IPv6 Traffic Class field of this socket.
Definition: socket.cc:501
bool IsMulticast() const
If the IPv6 address is multicast (ff00::/8).
virtual void Ipv6LeaveGroup(void)
Leaves IPv6 multicast group this socket is joined to.
Definition: socket.cc:586
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:513
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:95
bool IsIpRecvTtl(void) const
Ask if the socket is currently passing information about IP_TTL up the stack.
Definition: socket.cc:538
void Disable(void)
Disables the DF (Don't Fragment) flag.
Definition: socket.cc:732
Describes an IPv6 address.
Definition: ipv6-address.h:48
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:1073
virtual bool SetAllowBroadcast(bool allowBroadcast)
Configure whether broadcast datagram transmissions are allowed.
a class to store IPv4 address information on an interface
virtual int GetPeerName(Address &address) const
Get the peer address of a connected socket.
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
void SetRxEnabled(bool enabled)
Enable or Disable the endpoint Rx capability.
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:831
Ipv6Address GetSourceAddress(void) const
Get the "Source address" field.
Definition: ipv6-header.cc:100
indicates whether packets should be sent out with the DF (Don't Fragment) flag set.
Definition: socket.h:1208
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:726
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.
Ipv6MulticastFilterMode
Enumeration of the possible filter of a socket.
Definition: socket.h:138
#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)
void SetRxEnabled(bool enabled)
Enable or Disable the endpoint Rx capability.
tuple address
Definition: first.py:37
std::queue< std::pair< Ptr< Packet >, Address > > m_deliveryQueue
Queue for incoming packets.
TracedCallback< Ptr< const Packet > > m_dropTrace
Trace for dropped packets.
void SetPriority(uint8_t priority)
Set the tag's priority.
Definition: socket.cc:848
uint8_t GetPriority(void) const
Query the priority value of this socket.
Definition: socket.cc:402
indicates whether the socket has IP_TOS set.
Definition: socket.h:1258
void SetIcmpCallback(Callback< void, Ipv4Address, uint8_t, uint8_t, uint8_t, uint32_t > callback)
Set the ICMP callback.
void SetIpTos(uint8_t ipTos)
Manually set IP Type of Service field.
Definition: socket.cc:443
bool IsIpv4MappedAddress() const
If the address is an IPv4-mapped address.
a unique identifier for an interface.
Definition: type-id.h:58
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:105
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)
Set the parent TypeId.
Definition: type-id.cc:904
void SetRecvIf(uint32_t ifindex)
Set the tag's receiving interface.
static bool IsMatchingType(const Address &address)
int DoSendTo(Ptr< Packet > p, Ipv4Address daddr, uint16_t dport, uint8_t tos)
Send a packet to a specific destination and port (IPv4)
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:110
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.