diff --git a/src/internet-stack/nsc-tcp-socket-impl.cc b/src/internet-stack/nsc-tcp-socket-impl.cc index e3020d630..3e76d66c8 100644 --- a/src/internet-stack/nsc-tcp-socket-impl.cc +++ b/src/internet-stack/nsc-tcp-socket-impl.cc @@ -64,6 +64,8 @@ NscTcpSocketImpl::GetTypeId () : m_endPoint (0), m_node (0), m_tcp (0), + m_localAddress (Ipv4Address::GetZero ()), + m_localPort (0), m_peerAddress ("0.0.0.0", 0), m_errno (ERROR_NOTERROR), m_shutdownSend (false), @@ -466,6 +468,14 @@ NscTcpSocketImpl::RecvFrom (uint32_t maxSize, uint32_t flags, return packet; } +int +NscTcpSocketImpl::GetSockName (Address &address) const +{ + NS_LOG_FUNCTION_NOARGS (); + address = InetSocketAddress(m_localAddress, m_localPort); + return 0; +} + uint32_t NscTcpSocketImpl::GetRxAvailable (void) const { diff --git a/src/internet-stack/nsc-tcp-socket-impl.h b/src/internet-stack/nsc-tcp-socket-impl.h index cc0c8e684..fa142615c 100644 --- a/src/internet-stack/nsc-tcp-socket-impl.h +++ b/src/internet-stack/nsc-tcp-socket-impl.h @@ -81,6 +81,7 @@ public: virtual Ptr Recv (uint32_t maxSize, uint32_t flags); virtual Ptr RecvFrom (uint32_t maxSize, uint32_t flags, Address &fromAddress); + virtual int GetSockName (Address &address) const; private: void NSCWakeup(void); diff --git a/src/internet-stack/tcp-socket-impl.cc b/src/internet-stack/tcp-socket-impl.cc index 35184ff00..bf058bc3f 100644 --- a/src/internet-stack/tcp-socket-impl.cc +++ b/src/internet-stack/tcp-socket-impl.cc @@ -62,6 +62,8 @@ TcpSocketImpl::GetTypeId () m_endPoint (0), m_node (0), m_tcp (0), + m_localAddress (Ipv4Address::GetZero ()), + m_localPort (0), m_errno (ERROR_NOTERROR), m_shutdownSend (false), m_shutdownRecv (false), @@ -553,6 +555,14 @@ TcpSocketImpl::RecvFrom (uint32_t maxSize, uint32_t flags, return packet; } +int +TcpSocketImpl::GetSockName (Address &address) const +{ + NS_LOG_FUNCTION_NOARGS (); + address = InetSocketAddress(m_localAddress, m_localPort); + return 0; +} + void TcpSocketImpl::ForwardUp (Ptr packet, Ipv4Address ipv4, uint16_t port) { diff --git a/src/internet-stack/tcp-socket-impl.h b/src/internet-stack/tcp-socket-impl.h index 8298cc84a..81d75fce6 100644 --- a/src/internet-stack/tcp-socket-impl.h +++ b/src/internet-stack/tcp-socket-impl.h @@ -94,6 +94,7 @@ public: virtual Ptr Recv (uint32_t maxSize, uint32_t flags); virtual Ptr RecvFrom (uint32_t maxSize, uint32_t flags, Address &fromAddress); + virtual int GetSockName (Address &address) const; private: friend class Tcp; diff --git a/src/internet-stack/udp-socket-impl.cc b/src/internet-stack/udp-socket-impl.cc index c0fb33256..3feb6b3f5 100644 --- a/src/internet-stack/udp-socket-impl.cc +++ b/src/internet-stack/udp-socket-impl.cc @@ -437,6 +437,21 @@ UdpSocketImpl::RecvFrom (uint32_t maxSize, uint32_t flags, return packet; } +int +UdpSocketImpl::GetSockName (Address &address) const +{ + NS_LOG_FUNCTION_NOARGS (); + if (m_endPoint != 0) + { + address = InetSocketAddress (m_endPoint->GetLocalAddress (), m_endPoint->GetLocalPort()); + } + else + { + address = InetSocketAddress(Ipv4Address::GetZero(), 0); + } + return 0; +} + void UdpSocketImpl::ForwardUp (Ptr packet, Ipv4Address ipv4, uint16_t port) { diff --git a/src/internet-stack/udp-socket-impl.h b/src/internet-stack/udp-socket-impl.h index 0a20a384f..03fae2e56 100644 --- a/src/internet-stack/udp-socket-impl.h +++ b/src/internet-stack/udp-socket-impl.h @@ -73,6 +73,7 @@ public: virtual Ptr Recv (uint32_t maxSize, uint32_t flags); virtual Ptr RecvFrom (uint32_t maxSize, uint32_t flags, Address &fromAddress); + virtual int GetSockName (Address &address) const; private: // Attributes set through UdpSocket base class diff --git a/src/node/packet-socket.cc b/src/node/packet-socket.cc index 43b23be38..6aef802e6 100644 --- a/src/node/packet-socket.cc +++ b/src/node/packet-socket.cc @@ -57,6 +57,8 @@ PacketSocket::PacketSocket () : m_rxAvailable (0) m_shutdownSend = false; m_shutdownRecv = false; m_errno = ERROR_NOTERROR; + m_isSingleDevice = false; + m_device = 0; } void @@ -429,4 +431,27 @@ PacketSocket::RecvFrom (uint32_t maxSize, uint32_t flags, Address &fromAddress) return packet; } +int +PacketSocket::GetSockName (Address &address) const +{ + NS_LOG_FUNCTION_NOARGS (); + PacketSocketAddress ad = PacketSocketAddress::ConvertFrom(address); + + ad.SetProtocol (m_protocol); + if (m_isSingleDevice) + { + Ptr device = m_node->GetDevice (ad.GetSingleDevice ()); + ad.SetPhysicalAddress(device->GetAddress()); + ad.SetSingleDevice (m_device); + } + else + { + ad.SetPhysicalAddress(Address()); + ad.SetAllDevices (); + } + address = ad; + + return 0; +} + }//namespace ns3 diff --git a/src/node/packet-socket.h b/src/node/packet-socket.h index a0db81040..3835a7132 100644 --- a/src/node/packet-socket.h +++ b/src/node/packet-socket.h @@ -101,6 +101,7 @@ public: virtual Ptr Recv (uint32_t maxSize, uint32_t flags); virtual Ptr RecvFrom (uint32_t maxSize, uint32_t flags, Address &fromAddress); + virtual int GetSockName (Address &address) const; private: void ForwardUp (Ptr device, Ptr packet, diff --git a/src/node/socket.h b/src/node/socket.h index 1c4a20ddf..6287895a4 100644 --- a/src/node/socket.h +++ b/src/node/socket.h @@ -487,6 +487,10 @@ public: */ int RecvFrom (uint8_t* buf, uint32_t size, uint32_t flags, Address &fromAddress); + /** + * \returns the address name this socket is associated with. + */ + virtual int GetSockName (Address &address) const = 0; protected: void NotifyConnectionSucceeded (void);