diff options
-rw-r--r-- | ace/ATM_Acceptor.cpp | 186 | ||||
-rw-r--r-- | ace/ATM_Acceptor.h | 15 | ||||
-rw-r--r-- | ace/ATM_Acceptor.i | 70 | ||||
-rw-r--r-- | ace/ATM_Addr.cpp | 73 | ||||
-rw-r--r-- | ace/ATM_Addr.h | 13 | ||||
-rw-r--r-- | ace/ATM_Addr.i | 4 | ||||
-rw-r--r-- | ace/ATM_Connector.cpp | 78 | ||||
-rw-r--r-- | ace/ATM_Connector.h | 15 | ||||
-rw-r--r-- | ace/ATM_Connector.i | 177 | ||||
-rw-r--r-- | ace/ATM_Params.cpp | 1 | ||||
-rw-r--r-- | ace/ATM_Params.h | 51 | ||||
-rw-r--r-- | ace/ATM_Params.i | 56 | ||||
-rw-r--r-- | ace/ATM_QoS.cpp | 428 | ||||
-rw-r--r-- | ace/ATM_QoS.h | 24 | ||||
-rw-r--r-- | ace/ATM_QoS.i | 10 | ||||
-rw-r--r-- | ace/ATM_Stream.cpp | 63 | ||||
-rw-r--r-- | ace/ATM_Stream.h | 14 | ||||
-rw-r--r-- | ace/ATM_Stream.i | 31 |
18 files changed, 950 insertions, 359 deletions
diff --git a/ace/ATM_Acceptor.cpp b/ace/ATM_Acceptor.cpp index 0990c5a9df1..414f4a0712e 100644 --- a/ace/ATM_Acceptor.cpp +++ b/ace/ATM_Acceptor.cpp @@ -11,6 +11,9 @@ ACE_RCSID(ace, ATM_Acceptor, "$Id$") #include "ace/ATM_Acceptor.i" #endif /* __ACE_INLINE__ */ +// Put the actual definitions of the ACE_ATM_Request and +// ACE_ATM_Request_Queue classes here to hide them from clients... + ACE_ALLOC_HOOK_DEFINE(ACE_ATM_Acceptor) void @@ -29,4 +32,187 @@ ACE_ATM_Acceptor::~ACE_ATM_Acceptor (void) ACE_TRACE ("ACE_ATM_Acceptor::~ACE_ATM_Acceptor"); } +int +ACE_ATM_Acceptor::get_local_addr( ACE_ATM_Addr &local_addr ) +{ + ACE_TRACE( "ACE_ATM_Acceptor::get_local_addr" ); + +#if defined (ACE_HAS_FORE_ATM_WS2) + unsigned long ret = 0; + DWORD deviceID = 0; + ATM_ADDRESS addr; + struct sockaddr_atm *laddr; + + if ( ::WSAIoctl(( int )(( ACE_SOCK_Acceptor *)this ) -> get_handle(), + SIO_GET_ATM_ADDRESS, + (LPVOID) &deviceID, + sizeof(DWORD), + ( LPVOID )&addr, + sizeof( ATM_ADDRESS ), + &ret, + NULL, + NULL ) == SOCKET_ERROR ) { + ACE_OS::printf( "ATM_Acceptor(get_local_addr): WSIoctl: %d\n", + ::WSAGetLastError()); + return -1; + } + + laddr = ( struct sockaddr_atm *)local_addr.get_addr(); + ACE_OS::memcpy(( void *)&( laddr -> satm_number ), + ( void *)&addr, + ATM_ADDR_SIZE - 1 ); + + return 0; +#elif defined (ACE_HAS_FORE_ATM_XTI) + ACE_UNUSED_ARG( local_addr ); + + return 0; +#else + ACE_UNUSED_ARG( local_addr ); + + return 0; +#endif /* ACE_HAS_FORE_ATM_WS2 && ACE_HAS_FORE_ATM_XTI */ +} + +ACE_HANDLE +ACE_ATM_Acceptor::open (const ACE_Addr &remote_sap, + int backlog, + ACE_ATM_Params params) +{ + ACE_TRACE ("ACE_ATM_Acceptor::open"); +#if defined (ACE_HAS_FORE_ATM_XTI) + ACE_HANDLE handle = acceptor_.open (remote_sap, + params.get_reuse_addr(), + params.get_oflag(), + params.get_info(), + backlog, + params.get_device()); + return (handle == ACE_INVALID_HANDLE ? -1 : 0); +#elif defined (ACE_HAS_FORE_ATM_WS2) + //Unable to use ACE_SOCK_Acceptor.open + //because of its assumption of using SOCK_STREAM + //return (ACE_HANDLE)(acceptor_.open (remote_sap, //ACE_Addr + // protocol_info, //ACE_Protocol_Info + // 0, //ACE_SOCK_Group + // 0, //u_long flags + // params.get_reuse_addr(), + // params.get_protocol_family(), + // backlog, + // params.get_protocol())); + + struct sockaddr_atm local_atm_addr; + ACE_HANDLE ret; + DWORD flags = 0; + + /* Create a local endpoint of communication */ + + // Only leaves can listen. + flags = ACE_FLAG_MULTIPOINT_C_LEAF | ACE_FLAG_MULTIPOINT_D_LEAF; + + + if ((ret = ACE_OS::socket (AF_ATM, + SOCK_RAW, + ATMPROTO_AAL5, + NULL, + 0, + flags )) + == ACE_INVALID_HANDLE) { + ACE_OS::printf( "Acceptor(open): socket %d\n", ::WSAGetLastError()), + ACE_OS::exit (1); + } + + ((ACE_SOCK_Acceptor *)this) -> set_handle( ret ); + + /* Set up the address information to become a server */ + ACE_OS::memset ((void *) &local_atm_addr, 0, sizeof local_atm_addr); + local_atm_addr.satm_family = AF_ATM; + local_atm_addr.satm_number.AddressType = SAP_FIELD_ANY_AESA_REST; + local_atm_addr.satm_number.Addr[ ATM_ADDR_SIZE - 1 ] + = (( ACE_ATM_Addr *)&remote_sap ) -> get_selector(); + local_atm_addr.satm_blli.Layer2Protocol = SAP_FIELD_ANY; + local_atm_addr.satm_blli.Layer3Protocol = SAP_FIELD_ABSENT; + local_atm_addr.satm_bhli.HighLayerInfoType = SAP_FIELD_ABSENT; + + /* Associate address with endpoint */ + if (ACE_OS::bind ((( ACE_SOCK_Acceptor *)this ) -> get_handle(), + ACE_reinterpret_cast(struct sockaddr *, &local_atm_addr), + sizeof local_atm_addr) == -1) { + ACE_OS::printf( "Acceptor(open): bind %d\n", ::WSAGetLastError()); + ACE_OS::exit (1); + } + + /* Make endpoint listen for service requests */ + if (ACE_OS::listen ((( ACE_SOCK_Acceptor *)this ) -> get_handle(), + backlog) + == -1) { + ACE_OS::printf( "Acceptor(open): listen %d\n", ::WSAGetLastError()); + ACE_OS::exit (1); + } + + return 0; +#else + ACE_UNUSED_ARG (remote_sap); + ACE_UNUSED_ARG (backlog); + ACE_UNUSED_ARG (params); +#endif /* ACE_HAS_FORE_ATM_XTI/ACE_HAS_FORE_ATM_WS2 */ +} + +int +ACE_ATM_Acceptor::accept (ACE_ATM_Stream &new_sap, + ACE_Addr *remote_addr, + ACE_Time_Value *timeout, + int restart, + int reset_new_handle, + ACE_ATM_Params params, + ACE_ATM_QoS qos) +{ + ACE_TRACE ("ACE_ATM_Acceptor::accept"); +#if defined (ACE_HAS_FORE_ATM_XTI) + ATM_QoS optbuf = qos.get_qos(); + + return (acceptor_.accept(new_sap.get_stream(), + remote_addr, + timeout, + restart, + reset_new_handle, + params.get_rw_flag(), + params.get_user_data(), + &optbuf)); +#elif defined (ACE_HAS_FORE_ATM_WS2) +// return (acceptor_.accept(new_sap.get_stream(), +// remote_addr, +// timeout, +// restart, +// reset_new_handle)); + ACE_HANDLE n_handle; + ACE_HANDLE s_handle = (( ACE_SOCK_Acceptor *) this ) -> get_handle(); + struct sockaddr_atm *cli_addr + = ( struct sockaddr_atm *)remote_addr -> get_addr(); + int caddr_len = sizeof( struct sockaddr_atm ); + + do { + n_handle = ACE_OS::accept( s_handle, + ACE_reinterpret_cast( struct sockaddr *, + cli_addr ), + &caddr_len ); + } while ( n_handle == ACE_INVALID_HANDLE && errno == EINTR ); + + (( ACE_ATM_Addr *)remote_addr ) -> set( cli_addr, + (( ACE_ATM_Addr *)remote_addr ) -> get_selector()); + (( ACE_IPC_SAP *)&new_sap ) -> set_handle( n_handle ); + + return 0; +#else + ACE_UNUSED_ARG(new_sap); + ACE_UNUSED_ARG(remote_addr); + ACE_UNUSED_ARG(timeout); + ACE_UNUSED_ARG(restart); + ACE_UNUSED_ARG(reset_new_handle); + ACE_UNUSED_ARG(params); + ACE_UNUSED_ARG(qos); + return (0); +#endif /* ACE_HAS_FORE_ATM_XTI */ +} + #endif /* ACE_HAS_ATM */ + diff --git a/ace/ATM_Acceptor.h b/ace/ATM_Acceptor.h index 6b8158d7a01..3b4eb010a64 100644 --- a/ace/ATM_Acceptor.h +++ b/ace/ATM_Acceptor.h @@ -1,7 +1,6 @@ /* -*- C++ -*- */ // $Id$ - // ============================================================================ // // = LIBRARY @@ -18,15 +17,15 @@ #ifndef ACE_ATM_ACCEPTOR_H #define ACE_ATM_ACCEPTOR_H +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + #include "ace/Time_Value.h" #include "ace/ATM_Stream.h" #include "ace/ATM_Params.h" #include "ace/ATM_QoS.h" -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - #if defined (ACE_HAS_ATM) #if defined (ACE_HAS_FORE_ATM_WS2) @@ -45,6 +44,7 @@ class ACE_Export ACE_ATM_Acceptor // = DESCRIPTION // This class wraps up the ACE_SOCK_Acceptor and ACE_TLI_Acceptor // to make the mechanism for the ATM protocol transparent. + public: // = Initialization and termination methods. ACE_ATM_Acceptor (void); @@ -74,10 +74,14 @@ public: int reset_new_handle = 0, ACE_ATM_Params params = ACE_ATM_Params(), ACE_ATM_QoS qos = ACE_ATM_QoS()); + // Accept a new data transfer connection. A <timeout> of 0 means // block forever, a <timeout> of {0, 0} means poll. <restart> == 1 // means "restart if interrupted." + int get_local_addr( ACE_ATM_Addr &local_addr ); + // Get the local address currently listening on + // = Meta-type info typedef ACE_ATM_Addr PEER_ADDR; typedef ACE_ATM_Stream PEER_STREAM; @@ -98,3 +102,4 @@ private: #endif /* ACE_HAS_ATM */ #endif /* ACE_ATM_ACCEPTOR_H */ + diff --git a/ace/ATM_Acceptor.i b/ace/ATM_Acceptor.i index 64cd5c562e5..55aa1568d05 100644 --- a/ace/ATM_Acceptor.i +++ b/ace/ATM_Acceptor.i @@ -1,37 +1,7 @@ -/* -*- C++ -*- */ // $Id$ // ATM_Acceptor.i - -ACE_INLINE -ACE_HANDLE -ACE_ATM_Acceptor::open (const ACE_Addr &remote_sap, - int backlog, - ACE_ATM_Params params) -{ - ACE_TRACE ("ACE_ATM_Acceptor::open"); -#if defined (ACE_HAS_FORE_ATM_XTI) - ACE_HANDLE handle = acceptor_.open (remote_sap, - params.get_reuse_addr(), - params.get_oflag(), - params.get_info(), - backlog, - params.get_device()); - return (handle == ACE_INVALID_HANDLE ? -1 : 0); -#elif defined (ACE_HAS_FORE_ATM_WS2) - return (acceptor_.open (remote_sap, - params.get_reuse_addr(), - params.get_protocol_family(), - backlog, - params.get_protocol())); -#else - ACE_UNUSED_ARG (remote_sap); - ACE_UNUSED_ARG (backlog); - ACE_UNUSED_ARG (params); -#endif /* ACE_HAS_FORE_ATM_XTI/ACE_HAS_FORE_ATM_WS2 */ -} - ACE_INLINE ACE_ATM_Acceptor::ACE_ATM_Acceptor (const ACE_Addr &remote_sap, int backlog, @@ -54,42 +24,4 @@ ACE_ATM_Acceptor::close (void) #endif /* ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 */ } -ACE_INLINE -int -ACE_ATM_Acceptor::accept (ACE_ATM_Stream &new_sap, - ACE_Addr *remote_addr, - ACE_Time_Value *timeout, - int restart, - int reset_new_handle, - ACE_ATM_Params params, - ACE_ATM_QoS qos) -{ - ACE_TRACE ("ACE_ATM_Acceptor::accept"); -#if defined (ACE_HAS_FORE_ATM_XTI) - ATM_QoS optbuf = qos.get_qos(); - - return (acceptor_.accept(new_sap.get_stream(), - remote_addr, - timeout, - restart, - reset_new_handle, - params.get_rw_flag(), - params.get_user_data(), - &optbuf)); -#elif defined (ACE_HAS_FORE_ATM_WS2) - return (acceptor_.accept(new_sap.get_stream(), - remote_addr, - timeoutm - restart, - reset_new_handle)); -#else - ACE_UNUSED_ARG(new_sap); - ACE_UNUSED_ARG(remote_addr); - ACE_UNUSED_ARG(timeout); - ACE_UNUSED_ARG(restart); - ACE_UNUSED_ARG(reset_new_handle); - ACE_UNUSED_ARG(params); - ACE_UNUSED_ARG(qos); - return (0); -#endif /* ACE_HAS_FORE_ATM_XTI */ -} + diff --git a/ace/ATM_Addr.cpp b/ace/ATM_Addr.cpp index 372eb573d0a..bd91e880bd0 100644 --- a/ace/ATM_Addr.cpp +++ b/ace/ATM_Addr.cpp @@ -5,6 +5,10 @@ #define ACE_BUILD_DLL #include "ace/ATM_Addr.h" +#if defined (ACE_HAS_FORE_ATM_WS2) +#include "forews2.h" +#endif /* ACE_HAS_FORE_ATM_WS2 */ + #if !defined (__ACE_INLINE__) #include "ace/ATM_Addr.i" #endif /* __ACE_INLINE__ */ @@ -72,6 +76,7 @@ ACE_ATM_Addr::ACE_ATM_Addr (const ATM_Addr *sap, this->set (sap, selector); } + ACE_ATM_Addr::ACE_ATM_Addr (const ASYS_TCHAR sap[], unsigned char selector) #if defined (ACE_HAS_FORE_ATM_XTI) || defined (ACE_HAS_FORE_ATM_WS2) @@ -114,6 +119,7 @@ ACE_ATM_Addr::init (unsigned char selector) BHLI_MAGIC, sizeof atm_addr_.sap.t_atm_sap_appl.ID); #elif defined (ACE_HAS_FORE_ATM_WS2) + ACE_OS::memset(( void *)&atm_addr_, 0, sizeof atm_addr_ ); atm_addr_.satm_number.Addr[ ATM_ADDR_SIZE - 1 ] = ( char )selector; atm_addr_.satm_family = AF_ATM; atm_addr_.satm_number.AddressType = ATM_NSAP; @@ -122,7 +128,7 @@ ACE_ATM_Addr::init (unsigned char selector) atm_addr_.satm_blli.Layer3Protocol = SAP_FIELD_ABSENT; atm_addr_.satm_bhli.HighLayerInfoType = SAP_FIELD_ABSENT; - // N2K the correspondence (Ruibiao) + // Need to know the correspondence. //atm_addr_.sap.t_atm_sap_appl.SVE_tag = (int8_t) T_ATM_PRESENT; //atm_addr_.sap.t_atm_sap_appl.ID_type = (u_int8_t) T_ATM_USER_APP_ID; //ACE_OS::memcpy (atm_addr_.sap.t_atm_sap_appl.ID.user_defined_ID, @@ -180,6 +186,7 @@ ACE_ATM_Addr::set (const ASYS_TCHAR address[], unsigned char selector) { ACE_TRACE ("ACE_ATM_Addr::set"); + int ret; this->init (selector); @@ -187,7 +194,10 @@ ACE_ATM_Addr::set (const ASYS_TCHAR address[], atm_addr_.sap.t_atm_sap_addr.SVE_tag_addr = (int8_t) T_ATM_PRESENT; #endif /* ACE_HAS_FORE_ATM_XTI */ - return this->string_to_addr (address); + + ret = this -> string_to_addr( address ); + this -> set_selector( selector ); + return ret; } // Transform the string into the current addressing format. @@ -225,9 +235,11 @@ ACE_ATM_Addr::string_to_addr (const ASYS_TCHAR sap[]) nsap->atmnsap, ATMNSAP_ADDR_LEN); } - else + else { + errno = EINVAL; + return -1; + } #elif defined (ACE_HAS_FORE_ATM_WS2) - // WinSock2 part (Ruibiao) DWORD dwValue; HANDLE hLookup; WSAQUERYSETW qsRestrictions; @@ -235,11 +247,11 @@ ACE_ATM_Addr::string_to_addr (const ASYS_TCHAR sap[]) WCHAR tmpWStr[100]; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, sap, -1, tmpWStr, 100); - + csaBuffer.LocalAddr.iSockaddrLength = sizeof (struct sockaddr_atm); - csaBuffer.LocalAddr.lpSockaddr = (struct sockaddr *)atm_addr_; + csaBuffer.LocalAddr.lpSockaddr = (struct sockaddr *)&atm_addr_; csaBuffer.RemoteAddr.iSockaddrLength = sizeof (struct sockaddr_atm); - csaBuffer.RemoteAddr.lpSockaddr = (struct sockaddr *) atm_addr; + csaBuffer.RemoteAddr.lpSockaddr = (struct sockaddr *)&atm_addr_; qsRestrictions.dwSize = sizeof (WSAQUERYSETW); qsRestrictions.lpszServiceInstanceName = NULL; @@ -256,27 +268,35 @@ ACE_ATM_Addr::string_to_addr (const ASYS_TCHAR sap[]) qsRestrictions.lpcsaBuffer = &csaBuffer; qsRestrictions.lpBlob = NULL; //&blob; - if (WSALookupServiceBeginW(&qsRestrictions, LUP_RETURN_ALL, &hLookup) == SOCKET_ERROR) { - ACE_OS::printf("Error: WSALookupServiceBeginW failed! %d\n",WSAGetLastError()); + if ( ::WSALookupServiceBeginW(&qsRestrictions, LUP_RETURN_ALL, &hLookup) + == SOCKET_ERROR) { + ACE_OS::printf( "Error: WSALookupServiceBeginW failed! %d\n", + ::WSAGetLastError()); return -1; } dwValue = sizeof (WSAQUERYSETW); - if (WSALookupServiceNextW ( hLookup, 0, &dwValue, &qsRestrictions) == SOCKET_ERROR) { - ACE_OS::printf ("Error: WSALookupServiceNextW failed! %d\n", WSAGetLastError()); - return -1; + if ( ::WSALookupServiceNextW( hLookup, 0, &dwValue, &qsRestrictions) + == SOCKET_ERROR) { + if ( WSAGetLastError() != WSA_E_NO_MORE ) { + ACE_OS::printf( "Error: WSALookupServiceNextW failed! %d\n", + ::WSAGetLastError()); + return -1; + } } if (WSALookupServiceEnd (hLookup) == SOCKET_ERROR) { - ACE_OS::printf("Error : WSALookupServiceEnd failed! %d \n", WSAGetLastError()); + ACE_OS::printf( "Error : WSALookupServiceEnd failed! %d \n", + ::WSAGetLastError()); + errno = EINVAL; + return -1; + } #else ACE_UNUSED_ARG (sap); + + return 0; #endif /* ACE_HAS_FORE_ATM_XTI && ACE_HAS_FORE_ATM_WS2 */ - { - errno = EINVAL; - return -1; - } #if defined (ACE_HAS_FORE_ATM_XTI) || defined (ACE_HAS_FORE_ATM_WS2) return 0; @@ -311,16 +331,20 @@ ACE_ATM_Addr::addr_to_string (ASYS_TCHAR addr[], return 0; #elif defined (ACE_HAS_FORE_ATM_WS2) - //WinSock2 part ASYS_TCHAR buffer[MAXNAMELEN + 1]; int i; if ( addrlen < ATM_ADDR_SIZE + 1 ) - return -1; + return -1; + + for ( i = 0; i < ATM_ADDR_SIZE; i++ ) { + buffer[ i * 3 ] = '\0'; + ACE_OS::sprintf( buffer, ASYS_TEXT( "%s%02x." ), + buffer, + atm_addr_.satm_number.Addr[ i ]); + } - for ( i = 0; i < ATM_ADDR_SIZE; i++ ) - ACE_OS::sprintf( buffer, ASYS_TEXT( "%02x." ), atm_addr_.satm_number.Addr[ i ]); - buffer[ ATM_ADDR_SIZE ] = '\0'; + buffer[ ATM_ADDR_SIZE * 3 - 1 ] = '\0'; ACE_OS::strcpy( addr, buffer ); return 0; @@ -410,8 +434,8 @@ ACE_ATM_Addr::dump (void) const // { // ACE_OS::t_error ("t_getinfo"); // return 0; -// } - +// } + // buf = (char *) ACE_OS::malloc (info.options); // if (buf == 0) @@ -563,3 +587,4 @@ ACE_ATM_Addr::dump (void) const // return 0; // #endif /* ACE_HAS_FORE_ATM_XTI && ACE_HAS_FORE_ATM_WS2 */ // } + diff --git a/ace/ATM_Addr.h b/ace/ATM_Addr.h index 360ef6eaa07..9ec40ed4347 100644 --- a/ace/ATM_Addr.h +++ b/ace/ATM_Addr.h @@ -1,4 +1,3 @@ -/* -*- C++ -*- */ // $Id$ // ============================================================================ @@ -18,18 +17,16 @@ #define ACE_ATM_ADDR_H #include "ace/ACE.h" +#include "ace/Addr.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ -#include "ace/Addr.h" - #if defined (ACE_HAS_FORE_ATM_XTI) typedef ATMSAPAddress ATM_Addr; #elif defined (ACE_HAS_FORE_ATM_WS2) -#include <winsock2.h> -#include <ws2atm.h> +#define FORE_NAME_SPACE NS_ALL typedef struct sockaddr_atm ATM_Addr; #else typedef int ATM_Addr; @@ -81,7 +78,7 @@ public: int set (const ATM_Addr *, unsigned char selector = DEFAULT_SELECTOR); - // Initializes an <ACE_ATM_Addr> from an ATMSAPAddress + // Initializes an <ACE_ATM_Addr> from an ATMSAPAddress/sockaddr_atm // structure. This is vendor specific (FORE systems). May need to // change when other vendors are supported. @@ -136,8 +133,9 @@ public: void dump (void) const; // Dump the state of an object. + ACE_ALLOC_HOOK_DECLARE; - // Declare the dynamic allocation hooks. + // Declare the dynamic allocation hooks. // char *construct_options (ACE_HANDLE fd, // int qos_kb, @@ -156,3 +154,4 @@ private: #endif /* __ACE_INLINE__ */ #endif /* ACE_ATM_ADDR_H */ + diff --git a/ace/ATM_Addr.i b/ace/ATM_Addr.i index bb0a215ddc6..3b133b1a5aa 100644 --- a/ace/ATM_Addr.i +++ b/ace/ATM_Addr.i @@ -1,4 +1,3 @@ -/* -*- C++ -*- */ // $Id$ // ATM_Addr.i @@ -37,9 +36,10 @@ ACE_ATM_Addr::set_selector (unsigned char selector) ACE_TRACE ("ACE_ATM_Addr::set_selector"); #if defined (ACE_HAS_FORE_ATM_XTI) atm_addr_.sap.t_atm_sap_addr.address[ATMNSAP_ADDR_LEN - 1] = selector; -#elif defined (ACE_FORE_ATM_WS2) +#elif defined (ACE_HAS_FORE_ATM_WS2) atm_addr_.satm_number.Addr[ ATM_ADDR_SIZE - 1 ] = selector; #else ACE_UNUSED_ARG (selector); #endif /* ACE_HAS_FORE_ATM_XTI && ACE_HAS_FORE_ATM_WS2 */ } + diff --git a/ace/ATM_Connector.cpp b/ace/ATM_Connector.cpp index 2d4f03be550..496b2ff5a27 100644 --- a/ace/ATM_Connector.cpp +++ b/ace/ATM_Connector.cpp @@ -26,4 +26,82 @@ ACE_ATM_Connector::ACE_ATM_Connector (void) ACE_TRACE ("ACE_ATM_Connector::ACE_ATM_Connector"); } +// Actively connect and produce a new ACE_ATM_Stream if things go well... +// Connect the <new_stream> to the <remote_sap>, waiting up to +// <timeout> amount of time if necessary. + +int +ACE_ATM_Connector::connect (ACE_ATM_Stream &new_stream, + const ACE_ATM_Addr &remote_sap, + ACE_ATM_Params params, + ACE_ATM_QoS options, + ACE_Time_Value *timeout, + const ACE_ATM_Addr &local_sap, + int reuse_addr, + int flags, + int perms) +{ + ACE_TRACE ("ACE_ATM_Connector::connect"); +#if defined (ACE_HAS_FORE_ATM_XTI) + return connector_.connect(new_stream.get_stream(), + remote_sap, + timeout, + local_sap, + reuse_addr, + flags, + perms, + params.get_device(), + params.get_info(), + params.get_rw_flag(), + params.get_user_data(), + &options.get_qos()); +#elif defined (ACE_HAS_FORE_ATM_WS2) + ACE_OS::printf( "ATM_Connector(connect): set QoS parameters\n" ); + +// return connector_.connect(new_stream.get_stream(), +// remote_sap, +// options.get_option_params(), +// timeout, +// local_sap, +// 0, +// 0, +// flags, +// reuse_addr, +// perms, +// params.get_protocol_family(), +// params.get_protocol()); + + ACE_HANDLE s = new_stream.get_handle(); + struct sockaddr_atm *saddr = ( struct sockaddr_atm *)remote_sap.get_addr(); + ACE_QoS cqos = options.get_qos(); + + ACE_QoS_Params qos_params = ACE_QoS_Params( 0, 0, &cqos, 0, 0 ); + + ACE_OS::printf( "ATM_Connector(connect): connecting...\n" ); + + int result = ACE_OS::connect( s, + ( struct sockaddr *)saddr, + sizeof( struct sockaddr_atm ), + qos_params ); + + if ( result != 0 ) + ACE_OS::printf( "ATM_Connector(connect): connection failed, %d\n", + ::WSAGetLastError()); + + return result; +#else + ACE_UNUSED_ARG (new_stream); + ACE_UNUSED_ARG (remote_sap); + ACE_UNUSED_ARG (params); + ACE_UNUSED_ARG (options); + ACE_UNUSED_ARG (timeout); + ACE_UNUSED_ARG (local_sap); + ACE_UNUSED_ARG (reuse_addr); + ACE_UNUSED_ARG (flags); + ACE_UNUSED_ARG (perms); + return 0; +#endif /* ACE_HAS_FORE_ATM_XTI/ACE_HAS_FORE_ATM_WS2 */ +} + #endif /* ACE_HAS_ATM */ + diff --git a/ace/ATM_Connector.h b/ace/ATM_Connector.h index b67b1bde63f..5a405d1b79f 100644 --- a/ace/ATM_Connector.h +++ b/ace/ATM_Connector.h @@ -46,11 +46,11 @@ public: // Default constructor. ACE_ATM_Connector (ACE_ATM_Stream &new_stream, - const ACE_Addr &remote_sap, + const ACE_ATM_Addr &remote_sap, ACE_ATM_Params params = ACE_ATM_Params(), ACE_ATM_QoS options = ACE_ATM_QoS(), ACE_Time_Value *timeout = 0, - const ACE_Addr &local_sap = ACE_Addr::sap_any, + const ACE_ATM_Addr &local_sap = ACE_ATM_Addr( "", 0 ), int reuse_addr = 0, #if defined (ACE_WIN32) int flags = 0, @@ -69,16 +69,16 @@ public: // *timeout > {0, 0} then this is the amount of time to wait before // timing out. If the time expires before the connection is made // <errno == ETIME>. The <local_sap> is the value of local address - // to bind to. If it's the default value of <ACE_Addr::sap_any> then + // to bind to. If it's the default value of <ACE_ATM_Addr::sap_any> then // the user is letting the OS do the binding. If <reuse_addr> == 1 // then the <local_addr> is reused, even if it hasn't been cleanedup yet. connect (ACE_ATM_Stream &new_stream, - const ACE_Addr &remote_sap, + const ACE_ATM_Addr &remote_sap, ACE_ATM_Params params = ACE_ATM_Params(), ACE_ATM_QoS options = ACE_ATM_QoS(), ACE_Time_Value *timeout = 0, - const ACE_Addr &local_sap = ACE_Addr::sap_any, + const ACE_ATM_Addr &local_sap = ACE_ATM_Addr( "", 0 ), int reuse_addr = 0, #if defined (ACE_WIN32) int flags = 0, @@ -97,12 +97,12 @@ public: // *timeout > {0, 0} then this is the amount of time to wait before // timing out. If the time expires before the connection is made // <errno == ETIME>. The <local_sap> is the value of local address - // to bind to. If it's the default value of <ACE_Addr::sap_any> then + // to bind to. If it's the default value of <ACE_ATM_Addr::sap_any> then // the user is letting the OS do the binding. If <reuse_addr> == 1 // then the <local_addr> is reused, even if it hasn't been cleanedup yet. int complete (ACE_ATM_Stream &new_stream, - ACE_Addr *remote_sap, + ACE_ATM_Addr *remote_sap, ACE_Time_Value *tv); // Try to complete a non-blocking connection. // If connection completion is successful then <new_stream> contains @@ -142,3 +142,4 @@ private: #endif /* ACE_HAS_ATM */ #endif /* ACE_ATM_CONNECTOR_H */ + diff --git a/ace/ATM_Connector.i b/ace/ATM_Connector.i index 54718b9b822..f67ca3414ca 100644 --- a/ace/ATM_Connector.i +++ b/ace/ATM_Connector.i @@ -5,91 +5,94 @@ ACE_INLINE ACE_ATM_Connector::ACE_ATM_Connector (ACE_ATM_Stream &new_stream, - const ACE_Addr &remote_sap, + const ACE_ATM_Addr &remote_sap, ACE_ATM_Params params, ACE_ATM_QoS options, - ACE_Time_Value *timeout, - const ACE_Addr &local_sap, - int reuse_addr, - int flags, - int perms) + ACE_Time_Value *timeout, + const ACE_ATM_Addr &local_sap, + int reuse_addr, + int flags, + int perms) { ACE_TRACE ("ACE_ATM_Connector::ACE_ATM_Connector"); - if (this->connect (new_stream, - remote_sap, - params, - options, - timeout, - local_sap, - reuse_addr, - flags, - perms) == ACE_INVALID_HANDLE + if ((ACE_HANDLE)this->connect (new_stream, + remote_sap, + params, + options, + timeout, + local_sap, + reuse_addr, + flags, + perms) == ACE_INVALID_HANDLE && timeout != 0 && !(errno == EWOULDBLOCK || errno == ETIME)) - ACE_ERROR ((LM_ERROR, ASYS_TEXT ("%p\n"), ASYS_TEXT ("ACE_ATM_Stream::ACE_ATM_Stream"))); + ACE_ERROR ((LM_ERROR, ASYS_TEXT ("%p\n"), + ASYS_TEXT ("ACE_ATM_Stream::ACE_ATM_Stream"))); } // Connect the <new_stream> to the <remote_sap>, waiting up to // <timeout> amount of time if necessary. -ACE_INLINE -int -ACE_ATM_Connector::connect (ACE_ATM_Stream &new_stream, - const ACE_Addr &remote_sap, - ACE_ATM_Params params, - ACE_ATM_QoS options, - ACE_Time_Value *timeout, - const ACE_Addr &local_sap, - int reuse_addr, - int flags, - int perms) -{ - ACE_TRACE ("ACE_ATM_Connector::connect"); -#if defined (ACE_HAS_FORE_ATM_XTI) - return connector_.connect(new_stream.get_stream(), - remote_sap, - timeout, - local_sap, - reuse_addr, - flags, - perms, - params.get_device(), - params.get_info(), - params.get_rw_flag(), - params.get_user_data(), - &options.get_qos()); -#elif defined (ACE_HAS_FORE_ATM_WS2) - return connector_.connect(new_stream, - remote_sap, - options.get_option_params(), - timeout, - local_sap, - 0 ??, - 0 ??, - flags, - reuse_addr, - perms, - params.get_protocol_family(), - params.get_protocol()); -#else - ACE_UNUSED_ARG (new_stream); - ACE_UNUSED_ARG (remote_sap); - ACE_UNUSED_ARG (params); - ACE_UNUSED_ARG (options); - ACE_UNUSED_ARG (timeout); - ACE_UNUSED_ARG (local_sap); - ACE_UNUSED_ARG (reuse_addr); - ACE_UNUSED_ARG (flags); - ACE_UNUSED_ARG (perms); - return 0; -#endif /* ACE_HAS_FORE_ATM_XTI/ACE_HAS_FORE_ATM_WS2 */ -} +//ACE_INLINE +//int +//ACE_ATM_Connector::connect (ACE_ATM_Stream &new_stream, +// const ACE_ATM_Addr &remote_sap, +// ACE_ATM_Params params, +// ACE_ATM_QoS options, +// ACE_Time_Value *timeout, +// const ACE_ATM_Addr &local_sap, +// int reuse_addr, +// int flags, +// int perms) +//{ +// ACE_TRACE ("ACE_ATM_Connector::connect"); +//#if defined (ACE_HAS_FORE_ATM_XTI) +// return connector_.connect(new_stream.get_stream(), +// remote_sap, +// timeout, +// local_sap, +// reuse_addr, +// flags, +// perms, +// params.get_device(), +// params.get_info(), +// params.get_rw_flag(), +// params.get_user_data(), +// &options.get_qos()); +//#elif defined (ACE_HAS_FORE_ATM_WS2) +// ACE_OS::printf( "ATM_Connector(connect): to connect\n" ); +// +// return connector_.connect(new_stream.get_stream(), +// remote_sap, +// options.get_option_params(), +// timeout, +// local_sap, +// 0, +// 0, +// flags, +// reuse_addr, +// perms, +// params.get_protocol_family(), +// params.get_protocol()); +//#else +// ACE_UNUSED_ARG (new_stream); +// ACE_UNUSED_ARG (remote_sap); +// ACE_UNUSED_ARG (params); +// ACE_UNUSED_ARG (options); +// ACE_UNUSED_ARG (timeout); +// ACE_UNUSED_ARG (local_sap); +// ACE_UNUSED_ARG (reuse_addr); +// ACE_UNUSED_ARG (flags); +// ACE_UNUSED_ARG (perms); +// return 0; +//#endif /* ACE_HAS_FORE_ATM_XTI/ACE_HAS_FORE_ATM_WS2 */ +//} // Try to complete a non-blocking connection. ACE_INLINE int ACE_ATM_Connector::complete (ACE_ATM_Stream &new_stream, - ACE_Addr *remote_sap, + ACE_ATM_Addr *remote_sap, ACE_Time_Value *tv) { ACE_TRACE ("ACE_ATM_Connector::complete"); @@ -119,10 +122,42 @@ ACE_ATM_Connector::add_leaf (ACE_ATM_Stream ¤t_stream, leaf_id, timeout); #elif defined (ACE_HAS_FORE_ATM_WS2) + ACE_UNUSED_ARG(leaf_id); + ACE_UNUSED_ARG(timeout); + + SOCKET ns; + int len = sizeof( struct sockaddr_atm ); + struct sockaddr_atm *laddr; + laddr = ( struct sockaddr_atm *)remote_sap.get_addr(); + + ns = ::WSAJoinLeaf(( SOCKET )current_stream.get_handle(), + ( struct sockaddr FAR *)laddr, + //( struct sockaddr *)remote_sap.get_addr(), + len, + NULL, // caller data + NULL, // callee data + NULL, // SQos + NULL, // GQos + JL_SENDER_ONLY ); + + if ( ns == INVALID_SOCKET ) { + ACE_OS::printf( "Connector(add_leaf): WSAJoinLeaf %d\n", + ::WSAGetLastError()); + return -1; + } + +// ACE_HANDLE nah; + +// nah = ACE_OS::join_leaf( current_stream.get_handle(), +// ( struct sockaddr *)remote_sap.get_addr(), +// NULL ); + + return 0; #else - ACE_UNUSED_ARG(new_stream); + ACE_UNUSED_ARG(current_stream); ACE_UNUSED_ARG(remote_sap); - ACE_UNUSED_ARG(tv); + ACE_UNUSED_ARG(leaf_id); + ACE_UNUSED_ARG(timeout); return 0; #endif } diff --git a/ace/ATM_Params.cpp b/ace/ATM_Params.cpp index 54a53ef03a1..b7e4c708888 100644 --- a/ace/ATM_Params.cpp +++ b/ace/ATM_Params.cpp @@ -20,3 +20,4 @@ ACE_ATM_Params::dump (void) const } #endif /* ACE_HAS_ATM */ + diff --git a/ace/ATM_Params.h b/ace/ATM_Params.h index 6f563db94ae..e6a6b0d3b11 100644 --- a/ace/ATM_Params.h +++ b/ace/ATM_Params.h @@ -1,4 +1,3 @@ -/* -*- C++ -*- */ // $Id$ // ============================================================================ @@ -29,10 +28,16 @@ #include "ace/TLI.h" typedef struct t_info Param_Info; typedef struct netbuf Param_Udata; +#elif defined (ACE_HAS_FORE_ATM_WS2) +#include "ace/SOCK.h" +#define ACE_XTI_ATM_DEVICE "" +typedef int Param_Info; +typedef int Param_Udata; #else +#define ACE_XTI_ATM_DEVICE "" typedef int Param_Info; typedef int Param_Udata; -#endif +#endif /* ACE_HAS_FORE_ATM_XTI && ACE_HAS_FORE_ATM_WS2 */ class ACE_Export ACE_ATM_Params { @@ -45,14 +50,20 @@ public: Param_Info *info = 0, Param_Udata *udata = 0, int oflag = O_RDWR, - int protocol_family = PF_INET, - int protocol = 0, - int type = 0, + int protocol_family = AF_ATM, + int protocol = ATMPROTO_AAL5, + int type = SOCK_RAW, + ACE_Protocol_Info *protocol_info = 0, + ACE_SOCK_GROUP g = 0, + u_long flags + = ACE_FLAG_MULTIPOINT_C_ROOT + | ACE_FLAG_MULTIPOINT_D_ROOT, // connector by default int reuse_addr = 0); // Initialize the data members. This class combines options from - // ACE_SOCK_Connector (<protocol_family> and <protocol>) and - // ACE_TLI_Connector (<device>, <info>, <rw_flag>, <oflag>, and <udata>) - // so that either mechanism can be used transparently for ATM. + // ACE_SOCK_Connector (<protocol_family>, <protocol>, <type>, + // <protocol_info>, <group>, and <flags>) and + // ACE_TLI_Connector (<device>, <info>, <rw_flag>, <oflag>, and <udata>) + // so that either mechanism can be used transparently for ATM. ~ACE_ATM_Params (); @@ -68,6 +79,18 @@ public: void set_type (int); // Get/set type. + ACE_Protocol_Info *get_protocol_info( void ); + void set_protocol_info( ACE_Protocol_Info *); + // Get/set protocol info. + + ACE_SOCK_GROUP get_sock_group( void ); + void set_sock_group( ACE_SOCK_GROUP ); + // Get/set socket group. + + u_long get_flags( void ); + void set_flags( u_long ); + // Get/set socket flags. + int get_reuse_addr (void) const; void set_reuse_addr (int); // Get/set reuse_addr flag. @@ -107,10 +130,18 @@ private: int type_; // Type for opening sockets. + ACE_Protocol_Info *protocol_info_; + // Information about the protocol. + + ACE_SOCK_GROUP group_; + // Socket group used (for sockets only). + + u_long flags_; + // Flags for sockets (for sockets only). + int reuse_addr_; // Flag for reusing address for opening sockets. - const char *device_; // Device name for XTI/ATM connections. @@ -132,5 +163,5 @@ private: #endif /* __ACE_INLINE__ */ #endif /* ACE_HAS_ATM */ - #endif /* ACE_ATM_PARAMS_H */ + diff --git a/ace/ATM_Params.i b/ace/ATM_Params.i index 2c6ecea2f8a..43bce9f0a42 100644 --- a/ace/ATM_Params.i +++ b/ace/ATM_Params.i @@ -1,4 +1,3 @@ -/* -*- C++ -*- */ // $Id$ // ATM_Params.i @@ -12,10 +11,16 @@ ACE_ATM_Params::ACE_ATM_Params (int rw_flag, int protocol_family, int protocol, int type, + ACE_Protocol_Info *protocol_info, + ACE_SOCK_GROUP g, + u_long flags, int reuse_addr) : protocol_family_(protocol_family), protocol_(protocol), type_(type), + protocol_info_(protocol_info), + group_(g), + flags_(flags), reuse_addr_(reuse_addr), device_(device), info_(info), @@ -82,6 +87,54 @@ ACE_ATM_Params::set_type (int type) } ACE_INLINE +ACE_Protocol_Info* +ACE_ATM_Params::get_protocol_info( void ) +{ + ACE_TRACE ("ACE_ATM_Params::get_protocol_info"); + return protocol_info_; +} + +ACE_INLINE +void +ACE_ATM_Params::set_protocol_info( ACE_Protocol_Info *protocol_info ) +{ + ACE_TRACE ("ACE_ATM_Params::set_protocol_info"); + protocol_info_ = protocol_info; +} + +ACE_INLINE +ACE_SOCK_GROUP +ACE_ATM_Params::get_sock_group( void ) +{ + ACE_TRACE ("ACE_ATM_Params::get_sock_group"); + return group_; +} + +ACE_INLINE +void +ACE_ATM_Params::set_sock_group( ACE_SOCK_GROUP g ) +{ + ACE_TRACE ("ACE_ATM_Params::set_sock_group"); + group_ = g; +} + +ACE_INLINE +u_long +ACE_ATM_Params::get_flags( void ) +{ + ACE_TRACE ("ACE_ATM_Params::get_flags"); + return flags_; +} + +ACE_INLINE +void +ACE_ATM_Params::set_flags( u_long flags) +{ + ACE_TRACE ("ACE_ATM_Params::set_flags"); + flags_ = flags; +} + +ACE_INLINE int ACE_ATM_Params::get_reuse_addr (void) const { @@ -168,3 +221,4 @@ ACE_ATM_Params::set_oflag (int oflag) ACE_TRACE ("ACE_ATM_Params::set_oflag"); oflag_ = oflag; } + diff --git a/ace/ATM_QoS.cpp b/ace/ATM_QoS.cpp index c86c661b2d8..747098034ab 100644 --- a/ace/ATM_QoS.cpp +++ b/ace/ATM_QoS.cpp @@ -27,27 +27,147 @@ const int ACE_ATM_QoS::DEFAULT_SELECTOR = 0x0; ACE_ALLOC_HOOK_DEFINE(ACE_ATM_QoS) -void -ACE_ATM_QoS::dump (void) const -{ - ACE_TRACE ("ACE_ATM_QoS::dump"); -} - -void -ACE_ATM_QoS::set_rate (ACE_HANDLE fd, - int rate, - int flags) +ACE_ATM_QoS::ACE_ATM_QoS( int rate ) { - ACE_TRACE ("ACE_ATM_QoS::set_rate"); + ACE_TRACE( "ACE_ATM_QoS::ACE_ATM_QoS" ); #if defined (ACE_HAS_FORE_ATM_WS2) - ACE_UNUSED_ARG (rate); + AAL_PARAMETERS_IE ie_aalparams; + ATM_TRAFFIC_DESCRIPTOR_IE ie_td; + ATM_BROADBAND_BEARER_CAPABILITY_IE ie_bbc; + ATM_QOS_CLASS_IE ie_qos; + Q2931_IE *ie_ptr; + int size; + + // Setting up cbr parameters ... + ie_aalparams.AALType = AALTYPE_5; + ie_aalparams.AALSpecificParameters.AAL5Parameters.ForwardMaxCPCSSDUSize + = 1516; //8096; + ie_aalparams.AALSpecificParameters.AAL5Parameters.BackwardMaxCPCSSDUSize + = 1516; //8096; + ie_aalparams.AALSpecificParameters.AAL5Parameters.Mode = AAL5_MODE_MESSAGE; + ie_aalparams.AALSpecificParameters.AAL5Parameters.SSCSType = AAL5_SSCS_NULL; + + size = sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(AAL_PARAMETERS_IE); + + ie_td.Forward.PeakCellRate_CLP0 = SAP_FIELD_ABSENT; + ie_td.Forward.PeakCellRate_CLP01 = rate; + ie_td.Forward.SustainableCellRate_CLP0 = SAP_FIELD_ABSENT; + ie_td.Forward.SustainableCellRate_CLP01 = SAP_FIELD_ABSENT; + ie_td.Forward.MaxBurstSize_CLP0 = SAP_FIELD_ABSENT; + ie_td.Forward.MaxBurstSize_CLP01 = SAP_FIELD_ABSENT; + ie_td.Forward.Tagging = SAP_FIELD_ABSENT; + + ie_td.Backward.PeakCellRate_CLP0 = SAP_FIELD_ABSENT; + ie_td.Backward.PeakCellRate_CLP01 = rate; + ie_td.Backward.SustainableCellRate_CLP0 = SAP_FIELD_ABSENT; + ie_td.Backward.SustainableCellRate_CLP01 = SAP_FIELD_ABSENT; + ie_td.Backward.MaxBurstSize_CLP0 = SAP_FIELD_ABSENT; + ie_td.Backward.MaxBurstSize_CLP01 = SAP_FIELD_ABSENT; + ie_td.Backward.Tagging = SAP_FIELD_ABSENT; + + ie_td.BestEffort = 0; // Note: this must be set to zero for CBR. + + size += sizeof( Q2931_IE_TYPE ) + + sizeof( ULONG ) + + sizeof( ATM_TRAFFIC_DESCRIPTOR_IE ); + + ie_bbc.BearerClass = BCOB_X; + ie_bbc.TrafficType = TT_CBR; + ie_bbc.TimingRequirements = TR_END_TO_END; + ie_bbc.ClippingSusceptability = CLIP_NOT; + ie_bbc.UserPlaneConnectionConfig = UP_P2P; + + size += sizeof( Q2931_IE_TYPE ) + + sizeof( ULONG ) + + sizeof( ATM_BROADBAND_BEARER_CAPABILITY_IE ); + + ie_qos.QOSClassForward = QOS_CLASS1; + ie_qos.QOSClassBackward = QOS_CLASS1; // This may not be really used + // since we do only simplex data xfer. + + size += sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(ATM_QOS_CLASS_IE); + + qos_.ProviderSpecific.buf = (char *) ACE_OS::malloc(size); + qos_.ProviderSpecific.len = size; + ACE_OS::memset(qos_.ProviderSpecific.buf, 0, size); + + ie_ptr = (Q2931_IE *) qos_.ProviderSpecific.buf; + ie_ptr->IEType = IE_AALParameters; + ie_ptr->IELength = sizeof( Q2931_IE_TYPE ) + + sizeof( ULONG ) + + sizeof( AAL_PARAMETERS_IE ); + ACE_OS::memcpy(ie_ptr->IE, &ie_aalparams, sizeof(AAL_PARAMETERS_IE)); + + ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength); + ie_ptr->IEType = IE_TrafficDescriptor; + ie_ptr->IELength = sizeof( Q2931_IE_TYPE ) + + sizeof( ULONG ) + + sizeof( ATM_TRAFFIC_DESCRIPTOR_IE ); + ACE_OS::memcpy(ie_ptr->IE, &ie_td, sizeof(ATM_TRAFFIC_DESCRIPTOR_IE)); + + ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength); + ie_ptr->IEType = IE_BroadbandBearerCapability; + ie_ptr->IELength = sizeof( Q2931_IE_TYPE ) + + sizeof( ULONG ) + + sizeof( ATM_BROADBAND_BEARER_CAPABILITY_IE ); + ACE_OS::memcpy(ie_ptr->IE, + &ie_bbc, + sizeof(ATM_BROADBAND_BEARER_CAPABILITY_IE)); + + ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength); + ie_ptr->IEType = IE_QOSClass; + ie_ptr->IELength = sizeof( Q2931_IE_TYPE ) + + sizeof( ULONG ) + + sizeof( ATM_QOS_CLASS_IE ); + ACE_OS::memcpy(ie_ptr->IE, &ie_qos, sizeof(ATM_QOS_CLASS_IE)); + +// qos_.SendingFlowspec.TokenRate = 0xffffffff; +// qos_.SendingFlowspec.TokenBucketSize = 0xffffffff; +// qos_.SendingFlowspec.PeakBandwidth = 0xffffffff; +// qos_.SendingFlowspec.Latency = 0xffffffff; +// qos_.SendingFlowspec.DelayVariation = 0xffffffff; +// qos_.SendingFlowspec.ServiceType = SERVICETYPE_BESTEFFORT; + // This will most probably be ignored by the service provider. +// qos_.SendingFlowspec.MaxSduSize = 0xffffffff; +// qos_.SendingFlowspec.MinimumPolicedSize = 0xffffffff; + +// qos_.ReceivingFlowspec.TokenRate = 0xffffffff; +// qos_.ReceivingFlowspec.TokenBucketSize = 0xffffffff; +// qos_.ReceivingFlowspec.PeakBandwidth = 0xffffffff; +// qos_.ReceivingFlowspec.Latency = 0xffffffff; +// qos_.ReceivingFlowspec.DelayVariation = 0xffffffff; +// qos_.ReceivingFlowspec.ServiceType = SERVICETYPE_BESTEFFORT; + // This will most probably be ignored by the service provider. +// qos_.ReceivingFlowspec.MaxSduSize = 0xffffffff; +// qos_.ReceivingFlowspec.MinimumPolicedSize = 0; + + ACE_Flow_Spec send_fspec( 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + SERVICETYPE_BESTEFFORT, + // This will most probably ignored by SP. + 0xffffffff, + 0xffffffff, + 15, + ACE_DEFAULT_THREAD_PRIORITY ), + recv_fspec( 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + SERVICETYPE_BESTEFFORT, + // This will most probably ignored by SP. + 0xffffffff, + 0, + 15, + ACE_DEFAULT_THREAD_PRIORITY ); + + qos_.sending_flowspec( send_fspec ); + qos_.receiving_flowspec( recv_fspec ); #elif defined (ACE_HAS_FORE_ATM_XTI) - long optlen = 0; - qos_.buf = construct_options(fd, - rate, - flags, - &optlen); - qos_.len = optlen; + ACE_UNUSED_ARG (rate); #else ACE_UNUSED_ARG (rate); #endif /* ACE_HAS_FORE_ATM_WS2 */ @@ -60,111 +180,143 @@ ACE_ATM_QoS::set_cbr_rate (int rate) #if defined (ACE_HAS_FORE_ATM_WS2) AAL_PARAMETERS_IE ie_aalparams; ATM_TRAFFIC_DESCRIPTOR_IE ie_td; - ATM_BROADBAND_BEARER_CAPBILITY_IE ie_bbc; + ATM_BROADBAND_BEARER_CAPABILITY_IE ie_bbc; ATM_QOS_CLASS_IE ie_qos; Q2931_IE *ie_ptr; int size; - ie_aalparams.AALType = AALTYPE_5; - ie_aalparams.AALSpecificParameters.AAL5Parameters.ForwardMaxCPCSSDUSize = - 1516; - ie_aalparams.AALSpecificParameters.AAL5Parameters.BackwardMaxCPCSSDUSize = - 1516; - ie_aalparams.AALSpecificParameters.AAL5Parameters.Mode = AAL5_MODE_MESSAGE; - ie_aalparams.AALSpecificParameters.AAL5Parameters.SSCSType = AAL5_SSCS_NULL; + ACE_OS::printf( "ATM_QoS(set_cbr_rate): set rate to %d c/s\n", rate ); - size = sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(AAL_PARAMETERS_IE); + // Setting up cbr parameters ... + ie_aalparams.AALType = AALTYPE_5; + ie_aalparams.AALSpecificParameters.AAL5Parameters.ForwardMaxCPCSSDUSize + = 1516; //8096; + ie_aalparams.AALSpecificParameters.AAL5Parameters.BackwardMaxCPCSSDUSize + = 1516; //8096; + ie_aalparams.AALSpecificParameters.AAL5Parameters.Mode = AAL5_MODE_MESSAGE; + ie_aalparams.AALSpecificParameters.AAL5Parameters.SSCSType = AAL5_SSCS_NULL; - ie_td.Forward.PeakCellRate_CLP0 = SAP_FIELD_ABSENT; - ie_td.Forward.PeakCellRate_CLP01 = cellRate; - ie_td.Forward.SustainableCellRate_CLP0 = SAP_FIELD_ABSENT; - ie_td.Forward.SustainableCellRate_CLP01 = SAP_FIELD_ABSENT; - ie_td.Forward.MaxBurstSize_CLP0 = SAP_FIELD_ABSENT; - ie_td.Forward.MaxBurstSize_CLP01 = SAP_FIELD_ABSENT; - ie_td.Forward.Tagging = SAP_FIELD_ABSENT; - - ie_td.Backward.PeakCellRate_CLP0 = SAP_FIELD_ABSENT; - ie_td.Backward.PeakCellRate_CLP01 = cellRate; - ie_td.Backward.SustainableCellRate_CLP0 = SAP_FIELD_ABSENT; - ie_td.Backward.SustainableCellRate_CLP01 = SAP_FIELD_ABSENT; - ie_td.Backward.MaxBurstSize_CLP0 = SAP_FIELD_ABSENT; - ie_td.Backward.MaxBurstSize_CLP01 = SAP_FIELD_ABSENT; - ie_td.Backward.Tagging = SAP_FIELD_ABSENT; - - ie_td.BestEffort = 0; // Note: this must be set to zero for CBR - - size += - sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(ATM_TRAFFIC_DESCRIPTOR_IE); - - ie_bbc.BearerClass = BCOB_X; - ie_bbc.TrafficType = TT_CBR; - ie_bbc.TimingRequirements = TR_END_TO_END; - ie_bbc.ClippingSusceptability = CLIP_NOT; - ie_bbc.UserPlaneConnectionConfig = UP_P2P; - - size += sizeof(Q2931_IE_TYPE) + sizeof(ULONG) - + sizeof(ATM_BROADBAND_BEARER_CAPABILITY_IE); - - ie_qos.QOSClassForward = QOS_CLASS1; - ie_qos.QOSClassBackward = QOS_CLASS1; - - size += sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(ATM_QOS_CLASS_IE); - - qos_.ProviderSpecific.buf = (char *) malloc(size); - qos_.ProviderSpecific.len = size; - ACE_OS::memset(qos_.ProviderSpecific.buf, - 0, - size); - - ie_ptr = (Q2931_IE *) qos_.ProviderSpecific.buf; - ie_ptr->IEType = IE_AALParameters; - ie_ptr->IELength = sizeof(Q2931_IE_TYPE) + sizeof(ULONG) - + sizeof(AAL_PARAMETERS_IE); - ACE_OS::memcpy(ie_ptr->IE, - &ie_aalparams, - sizeof(AAL_PARAMETERS_IE)); - - ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength); - ie_ptr->IEType = IE_TrafficDescriptor; - ie_ptr->IELength = - sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(ATM_TRAFFIC_DESCRIPTOR_IE); - ACE_OS::memcpy(ie_ptr->IE, - &ie_td, - sizeof(ATM_TRAFFIC_DESCRIPTOR_IE)); - - ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength); - ie_ptr->IEType = IE_BroadbandBearerCapability; - ie_ptr->IELength = sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + - sizeof(ATM_BROADBAND_BEARER_CAPABILITY_IE); - ACE_OS::memcpy(ie_ptr->IE, - &ie_bbc, - sizeof(ATM_BROADBAND_BEARER_CAPABILITY_IE)); + size = sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(AAL_PARAMETERS_IE); - ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength); - ie_ptr->IEType = IE_QOSClass; - ie_ptr->IELength = - sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(ATM_QOS_CLASS_IE); - ACE_OS::memcpy(ie_ptr->IE, - &ie_qos, - sizeof(ATM_QOS_CLASS_IE)); - - qos_.SendingFlowspec.TokenRate = -1; - qos_.SendingFlowspec.TokenBucketSize = -1; - qos_.SendingFlowspec.PeakBandwidth = -1; - qos_.SendingFlowspec.Latency = -1; - qos_.SendingFlowspec.DelayVariation = -1; - qos_.SendingFlowspec.LevelOfGuarantee = BestEffortService; - // will most probably be ignored by the service provider - qos_.SendingFlowspec.CostOfCall = 0; - - qos_.ReceivingFlowspec.TokenRate = -1; - qos_.ReceivingFlowspec.TokenBucketSize = -1; - qos_.ReceivingFlowspec.PeakBandwidth = -1; - qos_.ReceivingFlowspec.Latency = -1; - qos_.ReceivingFlowspec.DelayVariation = -1; - qos_.ReceivingFlowspec.LevelOfGuarantee = BestEffortService; - // will most probably be ignored by the service provider - qos_.ReceivingFlowspec.CostOfCall = 0; + ie_td.Forward.PeakCellRate_CLP0 = SAP_FIELD_ABSENT; + ie_td.Forward.PeakCellRate_CLP01 = rate; + ie_td.Forward.SustainableCellRate_CLP0 = SAP_FIELD_ABSENT; + ie_td.Forward.SustainableCellRate_CLP01 = SAP_FIELD_ABSENT; + ie_td.Forward.MaxBurstSize_CLP0 = SAP_FIELD_ABSENT; + ie_td.Forward.MaxBurstSize_CLP01 = SAP_FIELD_ABSENT; + ie_td.Forward.Tagging = SAP_FIELD_ABSENT; + + ie_td.Backward.PeakCellRate_CLP0 = SAP_FIELD_ABSENT; + ie_td.Backward.PeakCellRate_CLP01 = rate; + ie_td.Backward.SustainableCellRate_CLP0 = SAP_FIELD_ABSENT; + ie_td.Backward.SustainableCellRate_CLP01 = SAP_FIELD_ABSENT; + ie_td.Backward.MaxBurstSize_CLP0 = SAP_FIELD_ABSENT; + ie_td.Backward.MaxBurstSize_CLP01 = SAP_FIELD_ABSENT; + ie_td.Backward.Tagging = SAP_FIELD_ABSENT; + + ie_td.BestEffort = 0; // Note: this must be set to zero for CBR. + + size += sizeof( Q2931_IE_TYPE ) + + sizeof( ULONG ) + + sizeof( ATM_TRAFFIC_DESCRIPTOR_IE ); + + ie_bbc.BearerClass = BCOB_X; + ie_bbc.TrafficType = TT_CBR; + ie_bbc.TimingRequirements = TR_END_TO_END; + ie_bbc.ClippingSusceptability = CLIP_NOT; + ie_bbc.UserPlaneConnectionConfig = UP_P2P; + + size += sizeof(Q2931_IE_TYPE) + + sizeof(ULONG) + + sizeof(ATM_BROADBAND_BEARER_CAPABILITY_IE); + + ie_qos.QOSClassForward = QOS_CLASS1; + ie_qos.QOSClassBackward = QOS_CLASS1; // This may not be really used + // since we only simplex data xfer. + + size += sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(ATM_QOS_CLASS_IE); + + qos_.ProviderSpecific.buf = (char *) ACE_OS::malloc(size); + qos_.ProviderSpecific.len = size; + ACE_OS::memset(qos_.ProviderSpecific.buf, 0, size); + + ie_ptr = (Q2931_IE *) qos_.ProviderSpecific.buf; + ie_ptr->IEType = IE_AALParameters; + ie_ptr->IELength + = sizeof( Q2931_IE_TYPE ) + + sizeof( ULONG ) + + sizeof( AAL_PARAMETERS_IE ); + ACE_OS::memcpy(ie_ptr->IE, &ie_aalparams, sizeof(AAL_PARAMETERS_IE)); + + ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength); + ie_ptr->IEType = IE_TrafficDescriptor; + ie_ptr->IELength + = sizeof( Q2931_IE_TYPE ) + + sizeof( ULONG ) + + sizeof( ATM_TRAFFIC_DESCRIPTOR_IE ); + ACE_OS::memcpy(ie_ptr->IE, &ie_td, sizeof(ATM_TRAFFIC_DESCRIPTOR_IE)); + + ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength); + ie_ptr->IEType = IE_BroadbandBearerCapability; + ie_ptr->IELength + = sizeof( Q2931_IE_TYPE ) + + sizeof( ULONG ) + + sizeof( ATM_BROADBAND_BEARER_CAPABILITY_IE ); + ACE_OS::memcpy( ie_ptr->IE, + &ie_bbc, + sizeof( ATM_BROADBAND_BEARER_CAPABILITY_IE )); + + ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength); + ie_ptr->IEType = IE_QOSClass; + ie_ptr->IELength + = sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(ATM_QOS_CLASS_IE); + ACE_OS::memcpy(ie_ptr->IE, &ie_qos, sizeof(ATM_QOS_CLASS_IE)); + +// qos_.SendingFlowspec.TokenRate = 0xffffffff; +// qos_.SendingFlowspec.TokenBucketSize = 0xffffffff; +// qos_.SendingFlowspec.PeakBandwidth = 0xffffffff; +// qos_.SendingFlowspec.Latency = 0xffffffff; +// qos_.SendingFlowspec.DelayVariation = 0xffffffff; +// qos_.SendingFlowspec.ServiceType = SERVICETYPE_BESTEFFORT; + // This will most probably be ignored by the service provider. +// qos_.SendingFlowspec.MaxSduSize = 0xffffffff; +// qos_.SendingFlowspec.MinimumPolicedSize = 0xffffffff; + +// qos_.ReceivingFlowspec.TokenRate = 0xffffffff; +// qos_.ReceivingFlowspec.TokenBucketSize = 0xffffffff; +// qos_.ReceivingFlowspec.PeakBandwidth = 0xffffffff; +// qos_.ReceivingFlowspec.Latency = 0xffffffff; +// qos_.ReceivingFlowspec.DelayVariation = 0xffffffff; +// qos_.ReceivingFlowspec.ServiceType = SERVICETYPE_BESTEFFORT; + // This will most probably be ignored by the service provider. +// qos_.ReceivingFlowspec.MaxSduSize = 0xffffffff; +// qos_.ReceivingFlowspec.MinimumPolicedSize = 0; + + ACE_Flow_Spec send_fspec( 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + SERVICETYPE_BESTEFFORT, + // This will most probably ignored by SP. + 0xffffffff, + 0xffffffff, + 15, + ACE_DEFAULT_THREAD_PRIORITY ), + recv_fspec( 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + SERVICETYPE_BESTEFFORT, + // This will most probably ignored by SP. + 0xffffffff, + 0, + 15, + ACE_DEFAULT_THREAD_PRIORITY ); + + qos_.sending_flowspec( send_fspec ); + qos_.receiving_flowspec( recv_fspec ); #elif defined (ACE_HAS_FORE_ATM_XTI) ACE_UNUSED_ARG (rate); #else @@ -172,6 +324,35 @@ ACE_ATM_QoS::set_cbr_rate (int rate) #endif /* ACE_HAS_FORE_ATM_WS2 */ } +void +ACE_ATM_QoS::dump (void) const +{ + ACE_TRACE ("ACE_ATM_QoS::dump"); +} + +void +ACE_ATM_QoS::set_rate (ACE_HANDLE fd, + int rate, + int flags) +{ + ACE_TRACE ("ACE_ATM_QoS::set_rate"); +#if defined (ACE_HAS_FORE_ATM_WS2) + set_cbr_rate( rate ); + + ACE_UNUSED_ARG( fd ); + ACE_UNUSED_ARG( flags ); +#elif defined (ACE_HAS_FORE_ATM_XTI) + long optlen = 0; + qos_.buf = construct_options(fd, + rate, + flags, + &optlen); + qos_.len = optlen; +#else + ACE_UNUSED_ARG (rate); +#endif /* ACE_HAS_FORE_ATM_WS2 */ +} + char* ACE_ATM_QoS::construct_options (ACE_HANDLE fd, int rate, @@ -181,7 +362,7 @@ ACE_ATM_QoS::construct_options (ACE_HANDLE fd, #if defined (ACE_HAS_FORE_ATM_WS2) ACE_UNUSED_ARG (fd); ACE_UNUSED_ARG (rate); - ACE_UNUSED_ARG (flag); + ACE_UNUSED_ARG (flags); ACE_UNUSED_ARG (len); return (0); #elif defined (ACE_HAS_FORE_ATM_XTI) @@ -195,13 +376,13 @@ ACE_ATM_QoS::construct_options (ACE_HANDLE fd, ACE_OS::t_error ("t_getinfo"); return 0; } - - buf = (char *) ACE_OS::malloc (info.options); - if (buf == 0) + buf = (char *) ACE_OS::malloc (info.options); + + if (buf == 0) ACE_ERROR_RETURN ((LM_ERROR, - ASYS_TEXT ("Unable to allocate %ld bytes for options\n"), - info.options), + ASYS_TEXT ("Unable to allocate %ld bytes for options\n"), + info.options), 0); popt = (struct t_opthdr *) buf; @@ -344,7 +525,7 @@ ACE_ATM_QoS::construct_options (ACE_HANDLE fd, popt = T_OPT_NEXTHDR (buf, info.options, popt); } - // return actual size of options and option buffer to user + // Return actual size of options and option buffer to user. *len = (char *) popt - buf; return buf; @@ -358,3 +539,4 @@ ACE_ATM_QoS::construct_options (ACE_HANDLE fd, } #endif /* ACE_HAS_ATM */ + diff --git a/ace/ATM_QoS.h b/ace/ATM_QoS.h index 57f3b257c6d..92f7007c554 100644 --- a/ace/ATM_QoS.h +++ b/ace/ATM_QoS.h @@ -1,7 +1,6 @@ /* -*- C++ -*- */ // $Id$ - // ============================================================================ // // = LIBRARY @@ -28,7 +27,7 @@ #if defined (ACE_HAS_FORE_ATM_WS2) // just map to WS2 GQOS struct -typedef QOS ATM_QoS; +typedef ACE_QoS ATM_QoS; #elif defined (ACE_HAS_FORE_ATM_XTI) // typedef enum { // BEST_EFFORT, @@ -80,23 +79,29 @@ public: // = Initializattion and termination methods. ACE_ATM_QoS (); - // Default constructor + // Default constructor. + + ACE_ATM_QoS( int ); + // Constructor with a CBR rate. ~ACE_ATM_QoS (); void set_rate (ACE_HANDLE, int, int); - // set the rate + // Set the rate. void set_cbr_rate (int); - // set CBR rate + // Set CBR rate. ATM_QoS get_qos (void); - // get ATM_QoS struct + // Get ATM_QoS struct. + + ACE_QoS_Params get_option_params( void ); + // Get ACE QoS option parameters. - void dump (void) const; - // Dump the state of an object. + void dump (void) const; + // Dump the state of an object. ACE_ALLOC_HOOK_DECLARE; // Declare the dynamic allocation hooks. @@ -106,7 +111,7 @@ protected: int, int, long*); - // Construct QoS options + // Construct QoS options. private: ATM_QoS qos_; @@ -118,3 +123,4 @@ private: #endif /* ACE_HAS_ATM */ #endif /* ACE_ATM_QoS_H */ + diff --git a/ace/ATM_QoS.i b/ace/ATM_QoS.i index ed6dff5d803..dddfca2665e 100644 --- a/ace/ATM_QoS.i +++ b/ace/ATM_QoS.i @@ -1,4 +1,3 @@ -/* -*- C++ -*- */ // $Id$ // ATM_QoS.i @@ -22,3 +21,12 @@ ACE_ATM_QoS::get_qos (void) ACE_TRACE ("ACE_ATM_QoS::get_qos"); return qos_; } + +ACE_INLINE +ACE_QoS_Params +ACE_ATM_QoS::get_option_params(void) +{ + ACE_TRACE( "ACE_ATM_QoS::get_option_params" ); + return ACE_QoS_Params( 0, 0, &qos_, 0, 0 ); +} + diff --git a/ace/ATM_Stream.cpp b/ace/ATM_Stream.cpp index f00e1aafc6a..9564c98a875 100644 --- a/ace/ATM_Stream.cpp +++ b/ace/ATM_Stream.cpp @@ -28,12 +28,14 @@ ACE_ATM_Stream::get_peer_name (void) const ACE_TRACE ("ACE_ATM_Stream::get_peer_name"); #if defined (ACE_HAS_FORE_ATM_XTI) // // Use t_getprotaddr for XTI/ATM -// struct t_bind *localaddr = (struct t_bind *) ACE_OS::t_alloc (get_handle (), -// T_BIND, -// T_ADDR); -// struct t_bind *peeraddr = (struct t_bind *) ACE_OS::t_alloc (get_handle (), -// T_BIND, -// T_ADDR); +// struct t_bind *localaddr +// = (struct t_bind *) ACE_OS::t_alloc (get_handle (), +// T_BIND, +// T_ADDR); +// struct t_bind *peeraddr +// = (struct t_bind *) ACE_OS::t_alloc (get_handle (), +// T_BIND, +// T_ADDR); // ::t_getprotaddr(get_handle (), // localaddr, // peeraddr); @@ -49,6 +51,7 @@ ACE_ATM_Stream::get_peer_name (void) const #error "This doesn't seem to work. May need to jimmy-rig something with the" #error "/etc/xti_hosts file - Ugh!" + ACE_ATM_Addr sa; struct netbuf name; name.maxlen = sa.get_size (); @@ -60,21 +63,38 @@ ACE_ATM_Stream::get_peer_name (void) const return (name.buf); #elif defined (ACE_HAS_FORE_ATM_WS2) - // Use getpeername for WinSock2 - struct sockaddr name; - socklen_t nameSize = sizeof(name); + // Use getpeername for WinSock2. + struct sockaddr_in name; + int nameSize = sizeof(name); + struct hostent *peerhost; + if (ACE_OS::getpeername(this->get_handle (), - &name, + (struct sockaddr *) &name, &nameSize) != 0) { return 0; } - return ?? + peerhost = ACE_OS::gethostbyaddr(( char *)name.sin_addr.S_un.S_addr, + sizeof( unsigned long ), + PF_INET ); + + return peerhost -> h_name; #else return 0; #endif /* ACE_HAS_FORE_ATM_XTI */ } +ACE_HANDLE +ACE_ATM_Stream::get_handle (void) const +{ + ACE_TRACE ("ACE_ATM_Stream::get_handle"); +#if defined (ACE_HAS_FORE_ATM_XTI) || defined (ACE_HAS_FORE_ATM_WS2) + return stream_.get_handle (); +#else + return 0; +#endif /* ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 */ +} + int ACE_ATM_Stream::get_vpi_vci (ACE_UINT16 &vpi, ACE_UINT16 &vci) const @@ -154,9 +174,30 @@ ACE_ATM_Stream::get_vpi_vci (ACE_UINT16 &vpi, vci = conn_prop.vci; return (0); #elif defined (ACE_HAS_FORE_ATM_WS2) + ATM_CONNECTION_ID connID; + DWORD bytes = 0; + + if ( ::WSAIoctl(( int )this -> get_handle(), + SIO_GET_ATM_CONNECTION_ID, + NULL, + 0, + (LPVOID) &connID, + sizeof(ATM_CONNECTION_ID), + &bytes, + NULL, + NULL) + == SOCKET_ERROR) { + ACE_OS::printf("Error: WSAIoctl %d\n", WSAGetLastError()); + } + + vpi = ( ACE_UINT16 )connID.VPI; + vci = ( ACE_UINT16 )connID.VCI; + + return 0; #else return (-1); #endif /* ACE_HAS_FORE_ATM_XTI */ } #endif /* ACE_HAS_ATM */ + diff --git a/ace/ATM_Stream.h b/ace/ATM_Stream.h index 2e48f4b6b42..58b7913acf2 100644 --- a/ace/ATM_Stream.h +++ b/ace/ATM_Stream.h @@ -1,7 +1,6 @@ /* -*- C++ -*- */ // $Id$ - // ============================================================================ // // = LIBRARY @@ -18,13 +17,13 @@ #ifndef ACE_ATM_STREAM_H #define ACE_ATM_STREAM_H -#include "ace/ATM_Addr.h" -#include "ace/ATM_Params.h" - #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ +#include "ace/ATM_Addr.h" +#include "ace/ATM_Params.h" + #if defined (ACE_HAS_ATM) #if defined (ACE_WIN32) @@ -66,12 +65,12 @@ public: ssize_t recv (void *buf, size_t n, int *flags = 0) const; - // Recv an n byte buffer from the connected transport mechanism + // Recv an n byte buffer from the connected transport mechanism. ssize_t send_n (const void *buf, size_t n, int flags) const; - // Send exactly n bytes to the connected transport mechanism + // Send exactly n bytes to the connected transport mechanism. // = Meta-type info typedef ACE_ATM_Addr PEER_ADDR; @@ -84,7 +83,7 @@ public: private: ATM_Stream stream_; - // Typedef'd to the appropriate stream mechanism above + // Typedef'd to the appropriate stream mechanism above. }; #if defined (__ACE_INLINE__) @@ -93,3 +92,4 @@ private: #endif /* ACE_HAS_ATM */ #endif /* ACE_ATM_STREAM_H */ + diff --git a/ace/ATM_Stream.i b/ace/ATM_Stream.i index ab7c8804f68..f0f42d47b6b 100644 --- a/ace/ATM_Stream.i +++ b/ace/ATM_Stream.i @@ -1,8 +1,9 @@ -/* -*- C++ -*- */ // $Id$ // ATM_Stream.i +#include "ace/ATM_Stream.h" + ACE_INLINE ACE_ATM_Stream::ACE_ATM_Stream (void) { @@ -20,9 +21,14 @@ ACE_ATM_Stream::open (ACE_ATM_Params params) params.get_info()); return (handle == ACE_INVALID_HANDLE ? -1 : 0); #elif defined (ACE_HAS_FORE_ATM_WS2) + params.set_flags( ACE_FLAG_MULTIPOINT_C_ROOT | ACE_FLAG_MULTIPOINT_D_ROOT ); + return stream_.open (params.get_type(), params.get_protocol_family(), params.get_protocol(), + params.get_protocol_info(), + params.get_sock_group(), + params.get_flags(), params.get_reuse_addr()); #else ACE_UNUSED_ARG(params); @@ -42,17 +48,17 @@ ACE_ATM_Stream::close (void) #endif /* ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 */ } -ACE_INLINE -ACE_HANDLE -ACE_ATM_Stream::get_handle (void) const -{ - ACE_TRACE ("ACE_ATM_Stream::get_handle"); -#if defined (ACE_HAS_FORE_ATM_XTI) || defined (ACE_HAS_FORE_ATM_WS2) - return stream_.get_handle (); -#else - return 0; -#endif /* ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 */ -} +//ACE_INLINE +//ACE_HANDLE +//ACE_ATM_Stream::get_handle (void) const +//{ +// ACE_TRACE ("ACE_ATM_Stream::get_handle"); +//#if defined (ACE_HAS_FORE_ATM_XTI) || defined (ACE_HAS_FORE_ATM_WS2) +// return ((ACE_SOCK_Stream)stream_).get_handle (); +//#else +// return 0; +//#endif /* ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 */ +//} ACE_INLINE ATM_Stream& @@ -106,3 +112,4 @@ ACE_ATM_Stream::send_n (const void *buf, return (0); #endif /* ACE_HAS_FORE_ATM_XTI */ } + |