1 // $Id: ATM_Acceptor.cpp 80826 2008-03-04 14:51:23Z wotte $
3 #include "ace/ATM_Acceptor.h"
5 ACE_RCSID(ace
, ATM_Acceptor
, "$Id: ATM_Acceptor.cpp 80826 2008-03-04 14:51:23Z wotte $")
7 #if defined (ACE_HAS_ATM)
9 #if defined (ACE_HAS_LINUX_ATM)
10 #include /**/ "linux/atmdev.h"
11 #endif /* ACE_HAS_LINUX_ATM */
13 #if !defined (__ACE_INLINE__)
14 #include "ace/ATM_Acceptor.inl"
15 #endif /* __ACE_INLINE__ */
18 // Open versioned namespace, if enabled by the user.
19 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
21 // Put the actual definitions of the ACE_ATM_Request and
22 // ACE_ATM_Request_Queue classes here to hide them from clients...
24 ACE_ALLOC_HOOK_DEFINE(ACE_ATM_Acceptor
)
26 ACE_ATM_Acceptor::ACE_ATM_Acceptor (void)
28 ACE_TRACE ("ACE_ATM_Acceptor::ACE_ATM_Acceptor");
31 ACE_ATM_Acceptor::~ACE_ATM_Acceptor (void)
33 ACE_TRACE ("ACE_ATM_Acceptor::~ACE_ATM_Acceptor");
37 ACE_ATM_Acceptor::get_local_addr (ACE_ATM_Addr
&local_addr
)
39 ACE_TRACE ("ACE_ATM_Acceptor::get_local_addr");
41 #if defined (ACE_HAS_FORE_ATM_WS2)
42 unsigned long ret
= 0;
45 struct sockaddr_atm
*laddr
;
47 if (::WSAIoctl ((int) ((ACE_SOCK_Acceptor
*)this) -> get_handle (),
56 ACE_OS::printf ("ATM_Acceptor (get_local_addr): WSIoctl: %d\n",
57 ::WSAGetLastError ());
61 laddr
= (struct sockaddr_atm
*)local_addr
.get_addr ();
62 ACE_OS::memcpy ((void *)& (laddr
-> satm_number
),
67 #elif defined (ACE_HAS_FORE_ATM_XTI)
68 ACE_UNUSED_ARG (local_addr
);
71 #elif defined (ACE_HAS_LINUX_ATM)
72 ATM_Addr
*myaddr
= (ATM_Addr
*)local_addr
.get_addr ();
73 int addrlen
= sizeof (myaddr
->sockaddratmsvc
);
75 if (ACE_OS::getsockname (acceptor_
.get_handle (),
76 (struct sockaddr
*) & (myaddr
->sockaddratmsvc
),
79 ACE_TEXT ("ATM_Acceptor (get_local_addr): ioctl: %d\n"),
86 ACE_UNUSED_ARG (local_addr
);
89 #endif /* ACE_HAS_FORE_ATM_WS2 && ACE_HAS_FORE_ATM_XTI */
93 ACE_ATM_Acceptor::open (const ACE_Addr
&remote_sap
,
95 ACE_ATM_Params params
)
97 ACE_TRACE ("ACE_ATM_Acceptor::open");
98 #if defined (ACE_HAS_FORE_ATM_XTI)
99 ACE_HANDLE handle
= acceptor_
.open (remote_sap
,
100 params
.get_reuse_addr (),
104 params
.get_device ());
105 return (handle
== ACE_INVALID_HANDLE
? -1 : 0);
106 #elif defined (ACE_HAS_FORE_ATM_WS2)
107 struct sockaddr_atm local_atm_addr
;
111 /* Create a local endpoint of communication */
113 // Only leaves can listen.
114 flags
= ACE_FLAG_MULTIPOINT_C_LEAF
| ACE_FLAG_MULTIPOINT_D_LEAF
;
116 if ((ret
= ACE_OS::socket (AF_ATM
,
122 == ACE_INVALID_HANDLE
) {
123 ACE_OS::printf ("Acceptor (open): socket %d\n",
124 ::WSAGetLastError ());
128 ((ACE_SOCK_Acceptor
*)this) -> set_handle (ret
);
130 /* Set up the address information to become a server */
131 ACE_OS::memset ((void *) &local_atm_addr
, 0, sizeof local_atm_addr
);
132 local_atm_addr
.satm_family
= AF_ATM
;
133 local_atm_addr
.satm_number
.AddressType
= SAP_FIELD_ANY_AESA_REST
;
134 local_atm_addr
.satm_number
.Addr
[ ATM_ADDR_SIZE
- 1 ]
135 = ((ACE_ATM_Addr
*)&remote_sap
) -> get_selector ();
136 local_atm_addr
.satm_blli
.Layer2Protocol
= SAP_FIELD_ANY
;
137 local_atm_addr
.satm_blli
.Layer3Protocol
= SAP_FIELD_ABSENT
;
138 local_atm_addr
.satm_bhli
.HighLayerInfoType
= SAP_FIELD_ABSENT
;
140 /* Associate address with endpoint */
141 if (ACE_OS::bind (((ACE_SOCK_Acceptor
*)this) -> get_handle (),
142 reinterpret_cast<struct sockaddr
*> (&local_atm_addr
),
143 sizeof local_atm_addr
) == -1) {
144 ACE_OS::printf ("Acceptor (open): bind %d\n", ::WSAGetLastError ());
145 return (ACE_INVALID_HANDLE
);
148 /* Make endpoint listen for service requests */
149 if (ACE_OS::listen (( (ACE_SOCK_Acceptor
*)this) -> get_handle (),
152 ACE_OS::printf ("Acceptor (open): listen %d\n", ::WSAGetLastError ());
153 return (ACE_INVALID_HANDLE
);
157 #elif defined (ACE_HAS_LINUX_ATM)
158 //we need to set the qos before binding to the socket
159 //use remote_sap as local_sap
161 ACE_ATM_Addr local_sap
;
162 ATM_Addr
*local_sap_addr
= (ATM_Addr
*)local_sap
.get_addr ();
164 ATM_QoS qos
= def_qos
.get_qos ();
167 if ((handle
= ACE_OS::socket (params
.get_protocol_family (),
169 params
.get_protocol (),
170 params
.get_protocol_info (),
171 params
.get_sock_group (),
174 == ACE_INVALID_HANDLE
) {
176 ACE_TEXT ("Acceptor (socket): socket %d\n"),
178 return (ACE_INVALID_HANDLE
);
181 ((ACE_SOCK_Acceptor
*)this) -> set_handle (handle
);
182 if (ACE_OS::setsockopt (handle
,
185 reinterpret_cast<char*> (&qos
),
187 ACE_OS::printf ("Acceptor (setsockopt): setsockopt:%d\n",
191 struct atmif_sioc req
;
192 struct sockaddr_atmsvc aux_addr
[1024];
196 req
.length
= sizeof (aux_addr
);
197 if (ACE_OS::ioctl (handle
,
200 ACE_OS::perror ("Acceptor (setsockopt): ioctl:");
203 local_sap_addr
->sockaddratmsvc
= aux_addr
[0];
205 local_sap
.set_selector (( (ACE_ATM_Addr
*)&remote_sap
)->get_selector ());
207 if (ACE_OS::bind (handle
,
208 reinterpret_cast<struct sockaddr
*> (
209 &(local_sap_addr
->sockaddratmsvc
)),
210 sizeof (local_sap_addr
->sockaddratmsvc
)
213 ACE_TEXT ("Acceptor (open): bind %d\n"),
217 // Make endpoint listen for service requests
218 if (ACE_OS::listen (handle
,
222 ACE_TEXT ("Acceptor (listen): listen %d\n"),
229 ACE_UNUSED_ARG (remote_sap
);
230 ACE_UNUSED_ARG (backlog
);
231 ACE_UNUSED_ARG (params
);
232 #endif /* ACE_HAS_FORE_ATM_XTI/ACE_HAS_FORE_ATM_WS2/ACE_HAS_LINUX_ATM */
236 ACE_ATM_Acceptor::accept (ACE_ATM_Stream
&new_sap
,
237 ACE_Addr
*remote_addr
,
238 ACE_Time_Value
*timeout
,
240 int reset_new_handle
,
241 ACE_ATM_Params params
,
244 ACE_TRACE ("ACE_ATM_Acceptor::accept");
245 #if defined (ACE_HAS_FORE_ATM_XTI)
246 ATM_QoS optbuf
= qos
.get_qos ();
248 return (acceptor_
.accept (new_sap
.get_stream (),
253 params
.get_rw_flag (),
254 params
.get_user_data (),
256 #elif defined (ACE_HAS_FORE_ATM_WS2)
258 ACE_HANDLE s_handle
= ((ACE_SOCK_Acceptor
*) this) -> get_handle ();
259 struct sockaddr_atm
*cli_addr
260 = (struct sockaddr_atm
*)remote_addr
-> get_addr ();
261 int caddr_len
= sizeof (struct sockaddr_atm
);
264 n_handle
= ACE_OS::accept (s_handle
,
265 reinterpret_cast<struct sockaddr
*> (cli_addr
),
267 } while (n_handle
== ACE_INVALID_HANDLE
&& errno
== EINTR
);
269 ((ACE_ATM_Addr
*)remote_addr
) -> set (cli_addr
,
270 ((ACE_ATM_Addr
*)remote_addr
) -> get_selector ());
271 ((ACE_IPC_SAP
*)&new_sap
) -> set_handle (n_handle
);
274 #elif defined (ACE_HAS_LINUX_ATM)
275 ACE_UNUSED_ARG (params
);
277 ACE_HANDLE s_handle
= ((ACE_SOCK_Acceptor
*) this) -> get_handle ();
278 struct atm_qos accept_qos
= qos
.get_qos ();
280 if (ACE_OS::setsockopt (s_handle
,
283 reinterpret_cast<char*> (&accept_qos
),
284 sizeof (accept_qos
)) < 0) {
285 ACE_OS::printf ("Acceptor (accept): error setting Qos");
288 return (acceptor_
.accept (new_sap
.get_stream (),
294 ACE_UNUSED_ARG (new_sap
);
295 ACE_UNUSED_ARG (remote_addr
);
296 ACE_UNUSED_ARG (timeout
);
297 ACE_UNUSED_ARG (restart
);
298 ACE_UNUSED_ARG (reset_new_handle
);
299 ACE_UNUSED_ARG (params
);
300 ACE_UNUSED_ARG (qos
);
302 #endif /* ACE_HAS_FORE_ATM_XTI */
305 // Close versioned namespace, if enabled by the user.
306 ACE_END_VERSIONED_NAMESPACE_DECL
309 #endif /* ACE_HAS_ATM */