model/ns3-socket-fd-factory.cc
changeset 66 2fe1f3e576c9
parent 63 e89dca438df6
equal deleted inserted replaced
65:227f6347e4e1 66:2fe1f3e576c9
     1 #include "ns3-socket-fd-factory.h"
     1 #include "ns3-socket-fd-factory.h"
     2 #include "unix-fd.h"
     2 #include "unix-fd.h"
     3 #include "unix-socket-fd.h"
     3 #include "unix-socket-fd.h"
     4 #include "unix-datagram-socket-fd.h"
     4 #include "unix-datagram-socket-fd.h"
     5 #include "unix-stream-socket-fd.h"
     5 #include "unix-stream-socket-fd.h"
     6 #include "netlink-socket-factory.h"
     6 #include "ns3/netlink-socket-factory.h"
     7 #include "ns3/socket-factory.h"
     7 #include "ns3/socket-factory.h"
     8 #include "ns3/socket.h"
     8 #include "ns3/socket.h"
     9 #include "ns3/uinteger.h"
     9 #include "ns3/uinteger.h"
    10 
    10 
    11 namespace ns3 {
    11 namespace ns3 {
    27   m_netlink = CreateObject<NetlinkSocketFactory> ();
    27   m_netlink = CreateObject<NetlinkSocketFactory> ();
    28 }
    28 }
    29 UnixFd *
    29 UnixFd *
    30 Ns3SocketFdFactory::CreateSocket (int domain, int type, int protocol)
    30 Ns3SocketFdFactory::CreateSocket (int domain, int type, int protocol)
    31 {
    31 {
    32   NS_ASSERT (domain == PF_INET || domain == PF_NETLINK || domain == PF_INET6);
       
    33 
       
    34   UnixSocketFd *socket = 0;
    32   UnixSocketFd *socket = 0;
    35   Ptr<Socket> sock;
    33   Ptr<Socket> sock;
    36 
    34 
    37   switch (type) {
    35   if (domain == PF_INET)
    38   case SOCK_DGRAM: {
    36     {
    39     TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
    37       switch (type) {
    40     Ptr<SocketFactory> factory = GetObject<SocketFactory> (tid);
    38       case SOCK_DGRAM: {
    41     sock = factory->CreateSocket ();
    39 	TypeId tid = TypeId::LookupByName ("ns3::UdpSocketFactory");
    42     socket = new UnixDatagramSocketFd (sock);
    40 	Ptr<SocketFactory> factory = GetObject<SocketFactory> (tid);
    43   } break;
    41 	sock = factory->CreateSocket ();
    44   case SOCK_RAW: {
    42 	socket = new UnixDatagramSocketFd (sock);
    45     TypeId tid = TypeId::LookupByName ("ns3::Ipv4RawSocketFactory");
    43       } break;
    46     Ptr<SocketFactory> factory = GetObject<SocketFactory> (tid);
    44       case SOCK_RAW: {
    47     sock = factory->CreateSocket ();
    45 	TypeId tid = TypeId::LookupByName ("ns3::Ipv4RawSocketFactory");
    48     sock->SetAttribute ("Protocol", UintegerValue (protocol));
    46 	Ptr<SocketFactory> factory = GetObject<SocketFactory> (tid);
    49     socket = new UnixDatagramSocketFd (sock);
    47 	sock = factory->CreateSocket ();
    50   } break;
    48 	sock->SetAttribute ("Protocol", UintegerValue (protocol));
    51   case SOCK_STREAM: {
    49 	socket = new UnixDatagramSocketFd (sock);
    52     TypeId tid = TypeId::LookupByName ("ns3::TcpSocketFactory");
    50       } break;
    53     Ptr<SocketFactory> factory = GetObject<SocketFactory> (tid);
    51       case SOCK_STREAM: {
    54     sock = factory->CreateSocket ();
    52 	TypeId tid = TypeId::LookupByName ("ns3::TcpSocketFactory");
    55     socket = new UnixStreamSocketFd (sock);
    53 	Ptr<SocketFactory> factory = GetObject<SocketFactory> (tid);
    56   } break;
    54 	sock = factory->CreateSocket ();
    57     default:
    55 	socket = new UnixStreamSocketFd (sock);
    58       // XXX insert netlink creation here.
    56       } break;
    59       NS_FATAL_ERROR ("missing socket type");
    57       default:
    60       break;
    58 	NS_FATAL_ERROR ("missing socket type");
    61   }
    59 	break;
       
    60       }
       
    61     }
       
    62   else if (domain == PF_NETLINK)
       
    63     {
       
    64       switch (type) {
       
    65       case SOCK_DGRAM: {
       
    66 	sock = m_netlink->CreateSocket ();
       
    67 	socket = new UnixDatagramSocketFd (sock);
       
    68       } break;
       
    69       default:
       
    70 	NS_FATAL_ERROR ("missing socket type");
       
    71 	break;
       
    72       }
       
    73     }
       
    74   else
       
    75     {
       
    76       NS_FATAL_ERROR ("unsupported domain");
       
    77     }
    62 
    78 
    63   return socket;
    79   return socket;
    64 }
    80 }
    65 
    81 
    66 } // namespace ns3
    82 } // namespace ns3