A Discrete-Event Network Simulator
API
udp-socket-impl.h
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 #ifndef UDP_SOCKET_IMPL_H
21 #define UDP_SOCKET_IMPL_H
22 
23 #include <stdint.h>
24 #include <queue>
25 #include "ns3/callback.h"
26 #include "ns3/traced-callback.h"
27 #include "ns3/socket.h"
28 #include "ns3/ptr.h"
29 #include "ns3/ipv4-address.h"
30 #include "ns3/udp-socket.h"
31 #include "ns3/ipv4-interface.h"
32 #include "icmpv4.h"
33 
34 namespace ns3 {
35 
36 class Ipv4EndPoint;
37 class Ipv6EndPoint;
38 class Node;
39 class Packet;
40 class UdpL4Protocol;
41 class Ipv6Header;
42 class Ipv6Interface;
43 
69 class UdpSocketImpl : public UdpSocket
70 {
71 public:
76  static TypeId GetTypeId (void);
80  UdpSocketImpl ();
81  virtual ~UdpSocketImpl ();
82 
87  void SetNode (Ptr<Node> node);
92  void SetUdp (Ptr<UdpL4Protocol> udp);
93 
94  virtual enum SocketErrno GetErrno (void) const;
95  virtual enum SocketType GetSocketType (void) const;
96  virtual Ptr<Node> GetNode (void) const;
97  virtual int Bind (void);
98  virtual int Bind6 (void);
99  virtual int Bind (const Address &address);
100  virtual int Close (void);
101  virtual int ShutdownSend (void);
102  virtual int ShutdownRecv (void);
103  virtual int Connect (const Address &address);
104  virtual int Listen (void);
105  virtual uint32_t GetTxAvailable (void) const;
106  virtual int Send (Ptr<Packet> p, uint32_t flags);
107  virtual int SendTo (Ptr<Packet> p, uint32_t flags, const Address &address);
108  virtual uint32_t GetRxAvailable (void) const;
109  virtual Ptr<Packet> Recv (uint32_t maxSize, uint32_t flags);
110  virtual Ptr<Packet> RecvFrom (uint32_t maxSize, uint32_t flags,
111  Address &fromAddress);
112  virtual int GetSockName (Address &address) const;
113  virtual int GetPeerName (Address &address) const;
114  virtual int MulticastJoinGroup (uint32_t interfaceIndex, const Address &groupAddress);
115  virtual int MulticastLeaveGroup (uint32_t interfaceIndex, const Address &groupAddress);
116  virtual void BindToNetDevice (Ptr<NetDevice> netdevice);
117  virtual bool SetAllowBroadcast (bool allowBroadcast);
118  virtual bool GetAllowBroadcast () const;
119  virtual void Ipv6JoinGroup (Ipv6Address address, Socket::Ipv6MulticastFilterMode filterMode, std::vector<Ipv6Address> sourceAddresses);
120 
121 private:
122  // Attributes set through UdpSocket base class
123  virtual void SetRcvBufSize (uint32_t size);
124  virtual uint32_t GetRcvBufSize (void) const;
125  virtual void SetIpMulticastTtl (uint8_t ipTtl);
126  virtual uint8_t GetIpMulticastTtl (void) const;
127  virtual void SetIpMulticastIf (int32_t ipIf);
128  virtual int32_t GetIpMulticastIf (void) const;
129  virtual void SetIpMulticastLoop (bool loop);
130  virtual bool GetIpMulticastLoop (void) const;
131  virtual void SetMtuDiscover (bool discover);
132  virtual bool GetMtuDiscover (void) const;
133 
134 
139  friend class UdpSocketFactory;
140  // invoked by Udp class
141 
146  int FinishBind (void);
147 
156  void ForwardUp (Ptr<Packet> packet, Ipv4Header header, uint16_t port, Ptr<Ipv4Interface> incomingInterface);
157 
166  void ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface);
167 
174  void Destroy (void);
175 
182  void Destroy6 (void);
183 
187  void DeallocateEndPoint (void);
188 
194  int DoSend (Ptr<Packet> p);
203  int DoSendTo (Ptr<Packet> p, Ipv4Address daddr, uint16_t dport, uint8_t tos);
211  int DoSendTo (Ptr<Packet> p, Ipv6Address daddr, uint16_t dport);
212 
222  void ForwardIcmp (Ipv4Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo);
223 
233  void ForwardIcmp6 (Ipv6Address icmpSource, uint8_t icmpTtl, uint8_t icmpType, uint8_t icmpCode, uint32_t icmpInfo);
234 
235  // Connections to other layers of TCP/IP
242 
244  uint16_t m_defaultPort;
246 
247  mutable enum SocketErrno m_errno;
250  bool m_connected;
252 
253  std::queue<std::pair<Ptr<Packet>, Address> > m_deliveryQueue;
254  uint32_t m_rxAvailable;
255 
256  // Socket attributes
257  uint32_t m_rcvBufSize;
259  int32_t m_ipMulticastIf;
262 };
263 
264 } // namespace ns3
265 
266 #endif /* UDP_SOCKET_IMPL_H */
(abstract) base class of all UdpSockets
Definition: udp-socket.h:47
bool m_shutdownSend
Send no longer allowed.
Packet header for IPv6.
Definition: ipv6-header.h:34
void Destroy(void)
Kill this socket by zeroing its attributes (IPv4)
Ptr< UdpL4Protocol > m_udp
the associated UDP L4 protocol
Ipv4EndPoint * m_endPoint
the IPv4 endpoint
Callback template class.
Definition: callback.h:1176
enum SocketErrno m_errno
Socket error code.
virtual int GetSockName(Address &address) const
Get socket address.
virtual void SetIpMulticastIf(int32_t ipIf)
Set the IP multicast interface.
bool m_allowBroadcast
Allow send broadcast packets.
Ptr< Packet > Recv(void)
Read a single packet from the socket.
Definition: socket.cc:175
Forward calls to a chain of Callback.
virtual bool GetAllowBroadcast() const
Query whether broadcast datagram transmissions are allowed.
virtual int Close(void)
Close a socket.
uint32_t m_rxAvailable
Number of available bytes to be received.
virtual uint8_t GetIpMulticastTtl(void) const
Get the IP multicast TTL.
virtual enum SocketType GetSocketType(void) const
virtual uint32_t GetTxAvailable(void) const
Returns the number of bytes which can be sent in a single call to Send.
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
SocketErrno
Enumeration of the possible errors returned by a socket.
Definition: socket.h:82
virtual void SetRcvBufSize(uint32_t size)
Set the receiving buffer size.
virtual void Ipv6JoinGroup(Ipv6Address address, Socket::Ipv6MulticastFilterMode filterMode, std::vector< Ipv6Address > sourceAddresses)
Joins a IPv6 multicast group.
A sockets interface to UDP.
bool m_connected
Connection established.
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:45
a polymophic address class
Definition: address.h:90
virtual int Bind(void)
Allocate a local IPv4 endpoint for this socket.
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.
Packet header for IPv4.
Definition: ipv4-header.h:33
virtual int ShutdownRecv(void)
virtual int MulticastLeaveGroup(uint32_t interfaceIndex, const Address &groupAddress)
Corresponds to socket option MCAST_LEAVE_GROUP.
Ipv6MulticastFilterMode
Enumeration of the possible filter of a socket.
Definition: socket.h:138
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.
virtual Ptr< Node > GetNode(void) const
Return the node this socket is associated with.
int DoSend(Ptr< Packet > p)
Send a packet.
void SetNode(Ptr< Node > node)
Set the associated node.
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.
uint8_t m_ipMulticastTtl
Multicast TTL.
Address m_defaultAddress
Default address.
virtual void SetMtuDiscover(bool discover)
Set the MTU discover capability.
void Destroy6(void)
Kill this socket by zeroing its attributes (IPv6)
int FinishBind(void)
Finish the binding process.
virtual int GetPeerName(Address &address) const
Get the peer address of a connected socket.
static TypeId GetTypeId(void)
Get the type ID.
virtual void SetIpMulticastLoop(bool loop)
Set the IP multicast loop capability.
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.
address
Definition: first.py:37
Ptr< Node > m_node
the associated node
virtual int32_t GetIpMulticastIf(void) const
Get the IP multicast interface.
virtual int ShutdownSend(void)
Describes an IPv6 address.
Definition: ipv6-address.h:49
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 bool GetMtuDiscover(void) const
Get the MTU discover capability.
virtual bool SetAllowBroadcast(bool allowBroadcast)
Configure whether broadcast datagram transmissions are allowed.
virtual bool GetIpMulticastLoop(void) const
Get the IP multicast loop capability.
uint32_t m_rcvBufSize
Receive buffer size.
virtual uint32_t GetRcvBufSize(void) const
Get the receiving buffer size.
virtual enum SocketErrno GetErrno(void) const
Get last error number.
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.
uint16_t m_defaultPort
Default port.
A representation of an IPv6 endpoint/connection.
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 DeallocateEndPoint(void)
Deallocate m_endPoint and m_endPoint6.
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.
API to create UDP socket instances.
std::queue< std::pair< Ptr< Packet >, Address > > m_deliveryQueue
Queue for incoming packets.
TracedCallback< Ptr< const Packet > > m_dropTrace
Trace for dropped packets.
SocketType
Enumeration of the possible socket types.
Definition: socket.h:104
a unique identifier for an interface.
Definition: type-id.h:58
bool m_mtuDiscover
Allow MTU discovery.
int DoSendTo(Ptr< Packet > p, Ipv4Address daddr, uint16_t dport, uint8_t tos)
Send a packet to a specific destination and port (IPv4)
virtual uint32_t GetRxAvailable(void) const
Return number of bytes which can be returned from one or multiple calls to Recv.
Callback< void, Ipv4Address, uint8_t, uint8_t, uint8_t, uint32_t > m_icmpCallback
ICMP callback.
A representation of an internet endpoint/connection.
virtual void SetIpMulticastTtl(uint8_t ipTtl)
Set the IP multicast TTL.