--- a/src/internet-node/ipv4-end-point.cc Mon Sep 03 14:55:51 2007 -0700
+++ b/src/internet-node/ipv4-end-point.cc Mon Sep 03 23:32:23 2007 -0700
@@ -42,6 +42,13 @@
{
return m_localAddr;
}
+
+void
+Ipv4EndPoint::SetLocalAddress (Ipv4Address address)
+{
+ m_localAddr = address;
+}
+
uint16_t
Ipv4EndPoint::GetLocalPort (void)
{
--- a/src/internet-node/ipv4-end-point.h Mon Sep 03 14:55:51 2007 -0700
+++ b/src/internet-node/ipv4-end-point.h Mon Sep 03 23:32:23 2007 -0700
@@ -37,6 +37,7 @@
~Ipv4EndPoint ();
Ipv4Address GetLocalAddress (void);
+ void SetLocalAddress (Ipv4Address address);
uint16_t GetLocalPort (void);
Ipv4Address GetPeerAddress (void);
uint16_t GetPeerPort (void);
--- a/src/internet-node/udp-socket.cc Mon Sep 03 14:55:51 2007 -0700
+++ b/src/internet-node/udp-socket.cc Mon Sep 03 23:32:23 2007 -0700
@@ -20,6 +20,8 @@
*/
#include "ns3/node.h"
#include "ns3/inet-socket-address.h"
+#include "ns3/ipv4-route.h"
+#include "ns3/ipv4.h"
#include "udp-socket.h"
#include "udp-l4-protocol.h"
#include "ipv4-end-point.h"
@@ -147,13 +149,25 @@
int
UdpSocket::Connect(const Address & address)
{
+ Ipv4Route routeToDest;
InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
m_defaultAddress = transport.GetIpv4 ();
m_defaultPort = transport.GetPort ();
+ if (m_defaultAddress.IsBroadcast () )
+ {
+ NS_ASSERT_MSG(false, "UdpSocket::Connect, can't connect to broadcast");
+ }
NotifyConnectionSucceeded ();
m_connected = true;
+ if (GetIpv4RouteToDestination (m_node, routeToDest, m_defaultAddress) )
+ {
+ uint32_t localIfIndex = routeToDest.GetInterface ();
+ Ptr<Ipv4> ipv4 = m_node->QueryInterface<Ipv4> (Ipv4::iid);
+ m_endPoint->SetLocalAddress (ipv4->GetAddress(localIfIndex) );
+ }
return 0;
}
+
int
UdpSocket::Send (const Packet &p)
{
@@ -162,8 +176,33 @@
m_errno = ERROR_NOTCONN;
return -1;
}
- return DoSendTo (p, m_defaultAddress, m_defaultPort);
+ return DoSend (p);
}
+
+int
+UdpSocket::DoSend (const Packet &p)
+{
+ if (m_endPoint == 0)
+ {
+ if (Bind () == -1)
+ {
+ NS_ASSERT (m_endPoint == 0);
+ return -1;
+ }
+ NS_ASSERT (m_endPoint != 0);
+ }
+ if (m_shutdownSend)
+ {
+ m_errno = ERROR_SHUTDOWN;
+ return -1;
+ }
+ m_udp->Send (p, m_endPoint->GetLocalAddress (), m_defaultAddress,
+ m_endPoint->GetLocalPort (), m_defaultPort);
+ NotifyDataSent (p.GetSize ());
+ return 0;
+}
+
+
int
UdpSocket::DoSendTo (const Packet &p, const Address &address)
{
@@ -173,7 +212,7 @@
return DoSendTo (p, ipv4, port);
}
int
-UdpSocket::DoSendTo (const Packet &p, Ipv4Address ipv4, uint16_t port)
+UdpSocket::DoSendTo (const Packet &p, Ipv4Address dest, uint16_t port)
{
if (m_endPoint == 0)
{
@@ -189,19 +228,27 @@
m_errno = ERROR_SHUTDOWN;
return -1;
}
- m_udp->Send (p, m_endPoint->GetLocalAddress (), ipv4,
+ Ipv4Route routeToDest;
+ if (GetIpv4RouteToDestination (m_node, routeToDest, dest) )
+ {
+ uint32_t localIfIndex = routeToDest.GetInterface ();
+ Ptr<Ipv4> ipv4 = m_node->QueryInterface<Ipv4> (Ipv4::iid);
+ m_udp->Send (p, ipv4->GetAddress (localIfIndex), dest,
m_endPoint->GetLocalPort (), port);
- NotifyDataSent (p.GetSize ());
+ NotifyDataSent (p.GetSize ());
+ return 0;
+ }
+ else
+ {
+ m_errno = ERROR_NOROUTETOHOST;
+ return -1;
+ }
return 0;
}
+
int
UdpSocket::SendTo(const Address &address, const Packet &p)
{
- if (m_connected)
- {
- m_errno = ERROR_ISCONN;
- return -1;
- }
InetSocketAddress transport = InetSocketAddress::ConvertFrom (address);
Ipv4Address ipv4 = transport.GetIpv4 ();
uint16_t port = transport.GetPort ();
--- a/src/internet-node/udp-socket.h Mon Sep 03 14:55:51 2007 -0700
+++ b/src/internet-node/udp-socket.h Mon Sep 03 23:32:23 2007 -0700
@@ -62,6 +62,7 @@
int FinishBind (void);
void ForwardUp (const Packet &p, Ipv4Address ipv4, uint16_t port);
void Destroy (void);
+ int DoSend (const Packet &p);
int DoSendTo (const Packet &p, const Address &daddr);
int DoSendTo (const Packet &p, Ipv4Address daddr, uint16_t dport);
--- a/src/node/ipv4.cc Mon Sep 03 14:55:51 2007 -0700
+++ b/src/node/ipv4.cc Mon Sep 03 23:32:23 2007 -0700
@@ -74,6 +74,11 @@
route = tempRoute;
return true;
}
+ else if ( tempRoute.IsDefault () )
+ {
+ route = tempRoute;
+ return true;
+ }
}
return false;
}
--- a/src/node/socket.h Mon Sep 03 14:55:51 2007 -0700
+++ b/src/node/socket.h Mon Sep 03 23:32:23 2007 -0700
@@ -58,6 +58,7 @@
ERROR_AFNOSUPPORT,
ERROR_INVAL,
ERROR_BADF,
+ ERROR_NOROUTETOHOST,
SOCKET_ERRNO_LAST
};