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 |