ATM_Acceptor.cpp

Go to the documentation of this file.
00001 // ATM_Acceptor.cpp,v 4.13 2005/10/28 16:14:51 ossama Exp
00002 
00003 #include "ace/ATM_Acceptor.h"
00004 
00005 ACE_RCSID(ace, ATM_Acceptor, "ATM_Acceptor.cpp,v 4.13 2005/10/28 16:14:51 ossama Exp")
00006 
00007 #if defined (ACE_HAS_ATM)
00008 
00009 #if defined (ACE_HAS_LINUX_ATM)
00010 #include /**/ "linux/atmdev.h"
00011 #endif /* ACE_HAS_LINUX_ATM */
00012 
00013 #if !defined (__ACE_INLINE__)
00014 #include "ace/ATM_Acceptor.inl"
00015 #endif /* __ACE_INLINE__ */
00016 
00017 
00018 // Open versioned namespace, if enabled by the user.
00019 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00020 
00021 // Put the actual definitions of the ACE_ATM_Request and
00022 // ACE_ATM_Request_Queue classes here to hide them from clients...
00023 
00024 ACE_ALLOC_HOOK_DEFINE(ACE_ATM_Acceptor)
00025 
00026 ACE_ATM_Acceptor::ACE_ATM_Acceptor (void)
00027 {
00028   ACE_TRACE ("ACE_ATM_Acceptor::ACE_ATM_Acceptor");
00029 }
00030 
00031 ACE_ATM_Acceptor::~ACE_ATM_Acceptor (void)
00032 {
00033   ACE_TRACE ("ACE_ATM_Acceptor::~ACE_ATM_Acceptor");
00034 }
00035 
00036 int
00037 ACE_ATM_Acceptor::get_local_addr (ACE_ATM_Addr &local_addr)
00038 {
00039   ACE_TRACE ("ACE_ATM_Acceptor::get_local_addr");
00040 
00041 #if defined (ACE_HAS_FORE_ATM_WS2)
00042   unsigned long ret = 0;
00043   DWORD deviceID = 0;
00044   ATM_ADDRESS addr;
00045   struct sockaddr_atm *laddr;
00046 
00047   if (::WSAIoctl ((int) ((ACE_SOCK_Acceptor *)this) -> get_handle (),
00048                 SIO_GET_ATM_ADDRESS,
00049  (LPVOID) &deviceID,
00050                 sizeof (DWORD),
00051  (LPVOID)&addr,
00052                 sizeof (ATM_ADDRESS),
00053                 &ret,
00054                 0,
00055                 0) == SOCKET_ERROR) {
00056     ACE_OS::printf ("ATM_Acceptor (get_local_addr): WSIoctl: %d\n",
00057                     ::WSAGetLastError ());
00058     return -1;
00059   }
00060 
00061   laddr = (struct sockaddr_atm *)local_addr.get_addr ();
00062   ACE_OS::memcpy ((void *)& (laddr -> satm_number),
00063  (void *)&addr,
00064                  ATM_ADDR_SIZE - 1);
00065 
00066   return 0;
00067 #elif defined (ACE_HAS_FORE_ATM_XTI)
00068   ACE_UNUSED_ARG (local_addr);
00069 
00070   return 0;
00071 #elif defined (ACE_HAS_LINUX_ATM)
00072   ATM_Addr *myaddr = (ATM_Addr *)local_addr.get_addr ();
00073   int addrlen = sizeof (myaddr->sockaddratmsvc);
00074 
00075   if (ACE_OS::getsockname (acceptor_.get_handle (),
00076  (struct sockaddr *) & (myaddr->sockaddratmsvc),
00077                           &addrlen) < 0) {
00078     ACE_DEBUG ((LM_DEBUG,
00079                ACE_LIB_TEXT ("ATM_Acceptor (get_local_addr): ioctl: %d\n"),
00080                errno));
00081     return -1;
00082   }
00083 
00084   return (0);
00085 #else
00086   ACE_UNUSED_ARG (local_addr);
00087 
00088   return 0;
00089 #endif /* ACE_HAS_FORE_ATM_WS2 && ACE_HAS_FORE_ATM_XTI */
00090 }
00091 
00092 ACE_HANDLE
00093 ACE_ATM_Acceptor::open (const ACE_Addr &remote_sap,
00094                         int backlog,
00095                         ACE_ATM_Params params)
00096 {
00097   ACE_TRACE ("ACE_ATM_Acceptor::open");
00098 #if defined (ACE_HAS_FORE_ATM_XTI)
00099   ACE_HANDLE handle = acceptor_.open (remote_sap,
00100                                       params.get_reuse_addr (),
00101                                       params.get_oflag (),
00102                                       params.get_info (),
00103                                       backlog,
00104                                       params.get_device ());
00105   return (handle == ACE_INVALID_HANDLE ? -1 : 0);
00106 #elif defined (ACE_HAS_FORE_ATM_WS2)
00107   struct sockaddr_atm local_atm_addr;
00108   ACE_HANDLE ret;
00109   DWORD flags = 0;
00110 
00111   /* Create a local endpoint of communication */
00112 
00113   // Only leaves can listen.
00114   flags = ACE_FLAG_MULTIPOINT_C_LEAF | ACE_FLAG_MULTIPOINT_D_LEAF;
00115 
00116   if ((ret = ACE_OS::socket (AF_ATM,
00117                              SOCK_RAW,
00118                              ATMPROTO_AAL5,
00119                              0,
00120                              0,
00121                              flags))
00122       == ACE_INVALID_HANDLE) {
00123     ACE_OS::printf ("Acceptor (open): socket %d\n",
00124                     ::WSAGetLastError ());
00125     return (ret);
00126   }
00127 
00128  ((ACE_SOCK_Acceptor *)this) -> set_handle (ret);
00129 
00130   /* Set up the address information to become a server */
00131   ACE_OS::memset ((void *) &local_atm_addr, 0, sizeof local_atm_addr);
00132   local_atm_addr.satm_family = AF_ATM;
00133   local_atm_addr.satm_number.AddressType = SAP_FIELD_ANY_AESA_REST;
00134   local_atm_addr.satm_number.Addr[ ATM_ADDR_SIZE - 1 ]
00135     = ((ACE_ATM_Addr *)&remote_sap) -> get_selector ();
00136   local_atm_addr.satm_blli.Layer2Protocol = SAP_FIELD_ANY;
00137   local_atm_addr.satm_blli.Layer3Protocol = SAP_FIELD_ABSENT;
00138   local_atm_addr.satm_bhli.HighLayerInfoType = SAP_FIELD_ABSENT;
00139 
00140   /* Associate address with endpoint */
00141   if (ACE_OS::bind (((ACE_SOCK_Acceptor *)this) -> get_handle (),
00142                     reinterpret_cast<struct sockaddr *> (&local_atm_addr),
00143                     sizeof local_atm_addr) == -1) {
00144     ACE_OS::printf ("Acceptor (open): bind %d\n", ::WSAGetLastError ());
00145     return (ACE_INVALID_HANDLE);
00146   }
00147 
00148   /* Make endpoint listen for service requests */
00149   if (ACE_OS::listen (( (ACE_SOCK_Acceptor *)this) -> get_handle (),
00150                       backlog)
00151                     == -1) {
00152     ACE_OS::printf ("Acceptor (open): listen %d\n", ::WSAGetLastError ());
00153     return (ACE_INVALID_HANDLE);
00154   }
00155 
00156   return 0;
00157 #elif defined (ACE_HAS_LINUX_ATM)
00158   //we need to set the qos before binding to the socket
00159   //use remote_sap as local_sap
00160 
00161   ACE_ATM_Addr local_sap;
00162   ATM_Addr *local_sap_addr = (ATM_Addr*)local_sap.get_addr ();
00163   ACE_ATM_QoS def_qos;
00164   ATM_QoS qos = def_qos.get_qos ();
00165 
00166   ACE_HANDLE handle;
00167   if ((handle = ACE_OS::socket (params.get_protocol_family (),
00168                                 params.get_type (),
00169                                 params.get_protocol (),
00170                                 params.get_protocol_info (),
00171                                 params.get_sock_group (),
00172                                 params.get_flags ()
00173                                ))
00174       == ACE_INVALID_HANDLE) {
00175     ACE_DEBUG (LM_DEBUG,
00176               ACE_LIB_TEXT ("Acceptor (socket): socket %d\n"),
00177               errno);
00178     return (ACE_INVALID_HANDLE);
00179   }
00180 
00181  ((ACE_SOCK_Acceptor *)this) -> set_handle (handle);
00182   if (ACE_OS::setsockopt (handle,
00183                          SOL_ATM,
00184                          SO_ATMQOS,
00185                          reinterpret_cast<char*> (&qos),
00186                          sizeof (qos)) < 0) {
00187     ACE_OS::printf ("Acceptor (setsockopt): setsockopt:%d\n",
00188                    errno);
00189   }
00190 
00191   struct atmif_sioc req;
00192   struct sockaddr_atmsvc aux_addr[1024];
00193 
00194   req.number = 0;
00195   req.arg = aux_addr;
00196   req.length = sizeof (aux_addr);
00197   if (ACE_OS::ioctl (handle,
00198                     ATM_GETADDR,
00199                     &req) < 0) {
00200     ACE_OS::perror ("Acceptor (setsockopt): ioctl:");
00201   }
00202   else {
00203     local_sap_addr->sockaddratmsvc = aux_addr[0];
00204   }
00205   local_sap.set_selector (( (ACE_ATM_Addr*)&remote_sap)->get_selector ());
00206 
00207   if (ACE_OS::bind (handle,
00208                     reinterpret_cast<struct sockaddr *> (
00209                       &(local_sap_addr->sockaddratmsvc)),
00210                     sizeof (local_sap_addr->sockaddratmsvc)
00211                    ) == -1) {
00212     ACE_DEBUG (LM_DEBUG,
00213               ACE_LIB_TEXT ("Acceptor (open): bind %d\n"),
00214               errno);
00215     return -1;
00216   }
00217   // Make endpoint listen for service requests
00218   if (ACE_OS::listen (handle,
00219                       backlog)
00220       == -1) {
00221     ACE_DEBUG (LM_DEBUG,
00222               ACE_LIB_TEXT ("Acceptor (listen): listen %d\n"),
00223               errno);
00224     return -1;
00225   }
00226 
00227   return 0;
00228 #else
00229   ACE_UNUSED_ARG (remote_sap);
00230   ACE_UNUSED_ARG (backlog);
00231   ACE_UNUSED_ARG (params);
00232 #endif /* ACE_HAS_FORE_ATM_XTI/ACE_HAS_FORE_ATM_WS2/ACE_HAS_LINUX_ATM */
00233 }
00234 
00235 int
00236 ACE_ATM_Acceptor::accept (ACE_ATM_Stream &new_sap,
00237                           ACE_Addr *remote_addr,
00238                           ACE_Time_Value *timeout,
00239                           int restart,
00240                           int reset_new_handle,
00241                           ACE_ATM_Params params,
00242                           ACE_ATM_QoS qos)
00243 {
00244   ACE_TRACE ("ACE_ATM_Acceptor::accept");
00245 #if defined (ACE_HAS_FORE_ATM_XTI)
00246   ATM_QoS optbuf = qos.get_qos ();
00247 
00248   return (acceptor_.accept (new_sap.get_stream (),
00249                            remote_addr,
00250                            timeout,
00251                            restart,
00252                            reset_new_handle,
00253                            params.get_rw_flag (),
00254                            params.get_user_data (),
00255                            &optbuf));
00256 #elif defined (ACE_HAS_FORE_ATM_WS2)
00257   ACE_HANDLE n_handle;
00258   ACE_HANDLE s_handle = ((ACE_SOCK_Acceptor *) this) -> get_handle ();
00259   struct sockaddr_atm *cli_addr
00260     = (struct sockaddr_atm *)remote_addr -> get_addr ();
00261   int caddr_len = sizeof (struct sockaddr_atm);
00262 
00263   do {
00264     n_handle = ACE_OS::accept (s_handle,
00265                                reinterpret_cast<struct sockaddr *> (cli_addr),
00266                               &caddr_len);
00267   } while (n_handle == ACE_INVALID_HANDLE && errno == EINTR);
00268 
00269  ((ACE_ATM_Addr *)remote_addr) -> set (cli_addr,
00270  ((ACE_ATM_Addr *)remote_addr) -> get_selector ());
00271  ((ACE_IPC_SAP *)&new_sap) -> set_handle (n_handle);
00272 
00273   return 0;
00274 #elif defined (ACE_HAS_LINUX_ATM)
00275   ACE_UNUSED_ARG (params);
00276 
00277   ACE_HANDLE s_handle = ((ACE_SOCK_Acceptor *) this) -> get_handle ();
00278   struct atm_qos accept_qos = qos.get_qos ();
00279 
00280   if (ACE_OS::setsockopt (s_handle,
00281                          SOL_ATM,
00282                          SO_ATMQOS,
00283                          reinterpret_cast<char*> (&accept_qos),
00284                          sizeof (accept_qos)) < 0) {
00285     ACE_OS::printf ("Acceptor (accept): error setting Qos");
00286   }
00287 
00288   return (acceptor_.accept (new_sap.get_stream (),
00289                           remote_addr,
00290                           timeout,
00291                           restart,
00292                           reset_new_handle));
00293 #else
00294   ACE_UNUSED_ARG (new_sap);
00295   ACE_UNUSED_ARG (remote_addr);
00296   ACE_UNUSED_ARG (timeout);
00297   ACE_UNUSED_ARG (restart);
00298   ACE_UNUSED_ARG (reset_new_handle);
00299   ACE_UNUSED_ARG (params);
00300   ACE_UNUSED_ARG (qos);
00301   return (0);
00302 #endif /* ACE_HAS_FORE_ATM_XTI */
00303 }
00304 
00305 // Close versioned namespace, if enabled by the user.
00306 ACE_END_VERSIONED_NAMESPACE_DECL
00307 
00308 
00309 #endif /* ACE_HAS_ATM */

Generated on Thu Nov 9 09:41:46 2006 for ACE by doxygen 1.3.6