Fold the two patches for bu6 69 together, building on the bug 65 patch
authorTom Henderson <tomh@tomh.org>
Mon, 03 Sep 2007 23:32:23 -0700
changeset 1317 82629189efff
parent 1316 f357c6a2bb37
child 1318 89b78e2d521e
Fold the two patches for bu6 69 together, building on the bug 65 patch
src/internet-node/ipv4-end-point.cc
src/internet-node/ipv4-end-point.h
src/internet-node/udp-socket.cc
src/internet-node/udp-socket.h
src/node/ipv4.cc
src/node/socket.h
--- 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
   };