model/ns3-socket-fd-factory.cc
changeset 66 2fe1f3e576c9
parent 63 e89dca438df6
--- a/model/ns3-socket-fd-factory.cc	Tue Apr 19 23:13:50 2011 +0200
+++ b/model/ns3-socket-fd-factory.cc	Thu May 05 09:28:21 2011 +0200
@@ -3,7 +3,7 @@
 #include "unix-socket-fd.h"
 #include "unix-datagram-socket-fd.h"
 #include "unix-stream-socket-fd.h"
-#include "netlink-socket-factory.h"
+#include "ns3/netlink-socket-factory.h"
 #include "ns3/socket-factory.h"
 #include "ns3/socket.h"
 #include "ns3/uinteger.h"
@@ -29,36 +29,52 @@
 UnixFd *
 Ns3SocketFdFactory::CreateSocket (int domain, int type, int protocol)
 {
-  NS_ASSERT (domain == PF_INET || domain == PF_NETLINK || domain == PF_INET6);
-
   UnixSocketFd *socket = 0;
   Ptr<Socket> sock;
 
-  switch (type) {
-  case SOCK_DGRAM: {
-    TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
-    Ptr<SocketFactory> factory = GetObject<SocketFactory> (tid);
-    sock = factory->CreateSocket ();
-    socket = new UnixDatagramSocketFd (sock);
-  } break;
-  case SOCK_RAW: {
-    TypeId tid = TypeId::LookupByName ("ns3::Ipv4RawSocketFactory");
-    Ptr<SocketFactory> factory = GetObject<SocketFactory> (tid);
-    sock = factory->CreateSocket ();
-    sock->SetAttribute ("Protocol", UintegerValue (protocol));
-    socket = new UnixDatagramSocketFd (sock);
-  } break;
-  case SOCK_STREAM: {
-    TypeId tid = TypeId::LookupByName ("ns3::TcpSocketFactory");
-    Ptr<SocketFactory> factory = GetObject<SocketFactory> (tid);
-    sock = factory->CreateSocket ();
-    socket = new UnixStreamSocketFd (sock);
-  } break;
-    default:
-      // XXX insert netlink creation here.
-      NS_FATAL_ERROR ("missing socket type");
-      break;
-  }
+  if (domain == PF_INET)
+    {
+      switch (type) {
+      case SOCK_DGRAM: {
+	TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
+	Ptr<SocketFactory> factory = GetObject<SocketFactory> (tid);
+	sock = factory->CreateSocket ();
+	socket = new UnixDatagramSocketFd (sock);
+      } break;
+      case SOCK_RAW: {
+	TypeId tid = TypeId::LookupByName ("ns3::Ipv4RawSocketFactory");
+	Ptr<SocketFactory> factory = GetObject<SocketFactory> (tid);
+	sock = factory->CreateSocket ();
+	sock->SetAttribute ("Protocol", UintegerValue (protocol));
+	socket = new UnixDatagramSocketFd (sock);
+      } break;
+      case SOCK_STREAM: {
+	TypeId tid = TypeId::LookupByName ("ns3::TcpSocketFactory");
+	Ptr<SocketFactory> factory = GetObject<SocketFactory> (tid);
+	sock = factory->CreateSocket ();
+	socket = new UnixStreamSocketFd (sock);
+      } break;
+      default:
+	NS_FATAL_ERROR ("missing socket type");
+	break;
+      }
+    }
+  else if (domain == PF_NETLINK)
+    {
+      switch (type) {
+      case SOCK_DGRAM: {
+	sock = m_netlink->CreateSocket ();
+	socket = new UnixDatagramSocketFd (sock);
+      } break;
+      default:
+	NS_FATAL_ERROR ("missing socket type");
+	break;
+      }
+    }
+  else
+    {
+      NS_FATAL_ERROR ("unsupported domain");
+    }
 
   return socket;
 }