diff options
-rw-r--r-- | ace/ATM_Connector.cpp | 29 | ||||
-rw-r--r-- | ace/ATM_Connector.h | 19 | ||||
-rw-r--r-- | ace/ATM_Connector.i | 124 | ||||
-rw-r--r-- | ace/ATM_QoS.cpp | 406 | ||||
-rw-r--r-- | ace/ATM_QoS.h | 2 | ||||
-rw-r--r-- | ace/ATM_Stream.cpp | 111 | ||||
-rw-r--r-- | ace/ATM_Stream.i | 47 |
7 files changed, 358 insertions, 380 deletions
diff --git a/ace/ATM_Connector.cpp b/ace/ATM_Connector.cpp index 496b2ff5a27..14061626fbc 100644 --- a/ace/ATM_Connector.cpp +++ b/ace/ATM_Connector.cpp @@ -13,9 +13,9 @@ ACE_RCSID(ace, ATM_Connector, "$Id$") #include "ace/ATM_Connector.i" #endif /* __ACE_INLINE__ */ -ACE_ALLOC_HOOK_DEFINE(ACE_ATM_Connector) + ACE_ALLOC_HOOK_DEFINE(ACE_ATM_Connector) -void + void ACE_ATM_Connector::dump (void) const { ACE_TRACE ("ACE_ATM_Connector::dump"); @@ -32,14 +32,14 @@ ACE_ATM_Connector::ACE_ATM_Connector (void) int ACE_ATM_Connector::connect (ACE_ATM_Stream &new_stream, - const ACE_ATM_Addr &remote_sap, + 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_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) @@ -58,19 +58,6 @@ ACE_ATM_Connector::connect (ACE_ATM_Stream &new_stream, #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(); diff --git a/ace/ATM_Connector.h b/ace/ATM_Connector.h index 5a405d1b79f..0202bb1def1 100644 --- a/ace/ATM_Connector.h +++ b/ace/ATM_Connector.h @@ -109,19 +109,16 @@ public: // the connected ACE_SOCK_Stream. If <remote_sap> is non-NULL then it // will contain the address of the connected peer. + //int add_leaf (ACE_ATM_Stream ¤t_stream, + // const ACE_Addr &remote_sap, + // ACE_INT32 leaf_id, + // ACE_Time_Value *timeout = 0); int add_leaf (ACE_ATM_Stream ¤t_stream, const ACE_Addr &remote_sap, - ACE_INT32 leaf_id, - ACE_Time_Value *timeout = 0); - // Actively add a leaf to the currently connected stream (i.e., - // multicast). The <remote_sap> is the address of the leaf that we - // are trying to add. The <timeout> is the amount of time to wait to - // connect. If it's 0 then we block indefinitely. If *timeout == - // {0, 0} then the connection is done using non-blocking mode. In - // this case, if the connection can't be made immediately the value - // of -1 is returned with <errno == EWOULDBLOCK>. If *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>. + ACE_ATM_QoS &qos); + // Actively add a leaf to the root (i.e., point-to-multipoint). The + // <remote_sap> is the address of the leaf that we + // are trying to add. int reset_new_handle (ACE_HANDLE handle); // Resets any event associations on this handle diff --git a/ace/ATM_Connector.i b/ace/ATM_Connector.i index f67ca3414ca..8f9187f8ac4 100644 --- a/ace/ATM_Connector.i +++ b/ace/ATM_Connector.i @@ -5,14 +5,14 @@ ACE_INLINE ACE_ATM_Connector::ACE_ATM_Connector (ACE_ATM_Stream &new_stream, - const ACE_ATM_Addr &remote_sap, + 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_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 ((ACE_HANDLE)this->connect (new_stream, @@ -22,71 +22,13 @@ ACE_ATM_Connector::ACE_ATM_Connector (ACE_ATM_Stream &new_stream, timeout, local_sap, reuse_addr, - flags, + 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"))); + 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_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 @@ -112,8 +54,7 @@ ACE_INLINE int ACE_ATM_Connector::add_leaf (ACE_ATM_Stream ¤t_stream, const ACE_Addr &remote_sap, - ACE_INT32 leaf_id, - ACE_Time_Value *timeout) + ACE_ATM_QoS &qos) { ACE_TRACE ("ACE_ATM_Connector::add_leaf"); #if defined (ACE_HAS_FORE_ATM_XTI) @@ -122,37 +63,28 @@ 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); + struct sockaddr_atm *saddr = (struct sockaddr_atm *)remote_sap.get_addr(); + ACE_QoS cqos = qos.get_qos(); + int addr_len = sizeof( struct sockaddr_atm ); - SOCKET ns; - int len = sizeof( struct sockaddr_atm ); - struct sockaddr_atm *laddr; - laddr = ( struct sockaddr_atm *)remote_sap.get_addr(); + ACE_QoS_Params qos_params(0, + 0, + &cqos, + 0, + (JL_SENDER_ONLY)); + + ACE_OS::printf( "ATM_Connector::add_leaf: connecting...\n" ); - 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", + ACE_HANDLE result = ACE_OS::join_leaf(current_stream.get_handle(), + (struct sockaddr *)saddr, + addr_len, + qos_params); + + if ( result == ACE_INVALID_HANDLE ) + ACE_OS::printf( "ATM_Connector(add_leaf): connection failed, %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; + + return (result != ACE_INVALID_HANDLE); #else ACE_UNUSED_ARG(current_stream); ACE_UNUSED_ARG(remote_sap); diff --git a/ace/ATM_QoS.cpp b/ace/ATM_QoS.cpp index 747098034ab..6c794e29d31 100644 --- a/ace/ATM_QoS.cpp +++ b/ace/ATM_QoS.cpp @@ -13,8 +13,8 @@ ACE_RCSID(ace, ATM_QoS, "$Id$") #if defined (ACE_HAS_FORE_ATM_XTI) || defined (ACE_HAS_FORE_ATM_WS2) #define BHLI_MAGIC "FORE_ATM" -// This is line rate in cells/s for an OC-3 MM interface. -const long ACE_ATM_QoS::LINE_RATE = 353207; + // This is line rate in cells/s for an OC-3 MM interface. + const long ACE_ATM_QoS::LINE_RATE = 353207; const int ACE_ATM_QoS::OPT_FLAGS_CPID = 0x1; const int ACE_ATM_QoS::OPT_FLAGS_PMP = 0x2; const int ACE_ATM_QoS::DEFAULT_SELECTOR = 0x99; @@ -27,7 +27,7 @@ const int ACE_ATM_QoS::DEFAULT_SELECTOR = 0x0; ACE_ALLOC_HOOK_DEFINE(ACE_ATM_QoS) -ACE_ATM_QoS::ACE_ATM_QoS( int rate ) + ACE_ATM_QoS::ACE_ATM_QoS( int rate ) { ACE_TRACE( "ACE_ATM_QoS::ACE_ATM_QoS" ); #if defined (ACE_HAS_FORE_ATM_WS2) @@ -39,107 +39,107 @@ ACE_ATM_QoS::ACE_ATM_QoS( int rate ) int size; // Setting up cbr parameters ... - ie_aalparams.AALType = AALTYPE_5; - ie_aalparams.AALSpecificParameters.AAL5Parameters.ForwardMaxCPCSSDUSize + ie_aalparams.AALType = AALTYPE_5; + ie_aalparams.AALSpecificParameters.AAL5Parameters.ForwardMaxCPCSSDUSize = 1516; //8096; - ie_aalparams.AALSpecificParameters.AAL5Parameters.BackwardMaxCPCSSDUSize + ie_aalparams.AALSpecificParameters.AAL5Parameters.BackwardMaxCPCSSDUSize = 1516; //8096; - ie_aalparams.AALSpecificParameters.AAL5Parameters.Mode = AAL5_MODE_MESSAGE; - ie_aalparams.AALSpecificParameters.AAL5Parameters.SSCSType = AAL5_SSCS_NULL; + 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); + 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.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_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; + 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 ); + 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. + 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); + size += sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(ATM_QOS_CLASS_IE); qos_.ProviderSpecific.buf = (char *) ACE_OS::malloc(size); - qos_.ProviderSpecific.len = 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 ); + 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 ); + 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 ); + 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 ); + 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; + // 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, @@ -152,19 +152,19 @@ ACE_ATM_QoS::ACE_ATM_QoS( int rate ) 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 ); + 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); @@ -178,145 +178,169 @@ ACE_ATM_QoS::set_cbr_rate (int rate) { ACE_TRACE ("ACE_ATM_QoS::set_cbr_rate"); #if defined (ACE_HAS_FORE_ATM_WS2) + /* 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; + */ ACE_OS::printf( "ATM_QoS(set_cbr_rate): set rate to %d c/s\n", rate ); // Setting up cbr parameters ... - ie_aalparams.AALType = AALTYPE_5; - ie_aalparams.AALSpecificParameters.AAL5Parameters.ForwardMaxCPCSSDUSize + /* + FORE has changed this - we no longer specify QoS this way + ie_aalparams.AALType = AALTYPE_5; + ie_aalparams.AALSpecificParameters.AAL5Parameters.ForwardMaxCPCSSDUSize = 1516; //8096; - ie_aalparams.AALSpecificParameters.AAL5Parameters.BackwardMaxCPCSSDUSize + ie_aalparams.AALSpecificParameters.AAL5Parameters.BackwardMaxCPCSSDUSize = 1516; //8096; - ie_aalparams.AALSpecificParameters.AAL5Parameters.Mode = AAL5_MODE_MESSAGE; - ie_aalparams.AALSpecificParameters.AAL5Parameters.SSCSType = AAL5_SSCS_NULL; + 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); + 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.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.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.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. + 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 ); + 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; + 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); + 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. + 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); + size += sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(ATM_QOS_CLASS_IE); qos_.ProviderSpecific.buf = (char *) ACE_OS::malloc(size); - qos_.ProviderSpecific.len = 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 ); + 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 ); + 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 ); + 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); + 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; - + */ + + const int BYTES_PER_ATM_CELL = 53; + ACE_OS::memset(&qos_, 0, sizeof(ATM_QoS)); + // Setting the token rate sets the minimum rate. 3 Mbits/sec seems too high. + // Certainly for Vaudeville audio, we only need about 1000 c/s which is + // 424000 bits/sec which is 53000 bytes/sec. + //qos_.SendingFlowspec.TokenRate = 3*(1024*128); // 3Mbits/sec + qos_.SendingFlowspec.TokenRate = 53000; // 1000 cells/sec + qos_.SendingFlowspec.TokenBucketSize = 32*1024; // our block size + //ourQos.SendingFlowspec.PeakBandwidth = ourQos.SendingFlowspec.TokenRate; + qos_.SendingFlowspec.ServiceType = SERVICETYPE_GUARANTEED; + // Peak bandwidth is in bytes/sec. The rate is specified in cells/sec so + // we need to convert from cells/sec to bytes/sec (i.e., multiply by 53). + qos_.SendingFlowspec.PeakBandwidth = rate * BYTES_PER_ATM_CELL; + qos_.SendingFlowspec.Latency = -1; // we don't care too much + qos_.SendingFlowspec.DelayVariation = -1; // we don't care too much + // no provider-specific data allowed on ATM + qos_.ProviderSpecific.buf=NULL; + qos_.ProviderSpecific.len=0; + // unidirectional P2MP; we don't need to setup the Receiving flowspec + + //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, + 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 ); + 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 @@ -377,12 +401,12 @@ ACE_ATM_QoS::construct_options (ACE_HANDLE fd, return 0; } - buf = (char *) ACE_OS::malloc (info.options); + buf = (char *) ACE_OS::malloc (info.options); - if (buf == 0) + 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; diff --git a/ace/ATM_QoS.h b/ace/ATM_QoS.h index 84c183221fb..d4d7189bda4 100644 --- a/ace/ATM_QoS.h +++ b/ace/ATM_QoS.h @@ -65,7 +65,7 @@ public: // Set the rate. void set_cbr_rate (int); - // Set CBR rate. + // Set CBR rate in cells per second. ATM_QoS get_qos (void); // Get ATM_QoS struct. diff --git a/ace/ATM_Stream.cpp b/ace/ATM_Stream.cpp index 9564c98a875..c0dcdfc8f6f 100644 --- a/ace/ATM_Stream.cpp +++ b/ace/ATM_Stream.cpp @@ -14,9 +14,9 @@ ACE_RCSID(ace, ATM_Stream, "$Id$") #include "ace/ATM_Stream.i" #endif /* __ACE_INLINE__ */ -ACE_ALLOC_HOOK_DEFINE(ACE_ATM_Stream) + ACE_ALLOC_HOOK_DEFINE(ACE_ATM_Stream) -void + void ACE_ATM_Stream::dump (void) const { ACE_TRACE ("ACE_ATM_Stream::dump"); @@ -27,27 +27,27 @@ 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); -// ::t_getprotaddr(get_handle (), -// localaddr, -// peeraddr); - -// char* connected_name = (char*) ACE_OS::malloc(peeraddr->addr.len + 1); -// ACE_OS::strcpy(connected_name, -// peeraddr->addr.buf); -// ACE_OS::t_free ((char *) localaddr, -// T_BIND); -// ACE_OS::t_free ((char *) peeraddr, -// T_BIND); -// return (connected_name); + // // 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); + // ::t_getprotaddr(get_handle (), + // localaddr, + // peeraddr); + + // char* connected_name = (char*) ACE_OS::malloc(peeraddr->addr.len + 1); + // ACE_OS::strcpy(connected_name, + // peeraddr->addr.buf); + // ACE_OS::t_free ((char *) localaddr, + // T_BIND); + // ACE_OS::t_free ((char *) peeraddr, + // T_BIND); + // return (connected_name); #error "This doesn't seem to work. May need to jimmy-rig something with the" #error "/etc/xti_hosts file - Ugh!" @@ -64,9 +64,9 @@ ACE_ATM_Stream::get_peer_name (void) const #elif defined (ACE_HAS_FORE_ATM_WS2) // Use getpeername for WinSock2. - struct sockaddr_in name; + struct sockaddr_atm name; + ACE_OS::memset(&name, 0, sizeof(name)); int nameSize = sizeof(name); - struct hostent *peerhost; if (ACE_OS::getpeername(this->get_handle (), (struct sockaddr *) &name, @@ -74,11 +74,41 @@ ACE_ATM_Stream::get_peer_name (void) const { return 0; } - peerhost = ACE_OS::gethostbyaddr(( char *)name.sin_addr.S_un.S_addr, - sizeof( unsigned long ), - PF_INET ); - return peerhost -> h_name; + char buffer[256]; + for (unsigned int index = 0; index < ATM_ADDR_SIZE - 1; index++ ) { + buffer[ index * 3 ] = '\0'; + sprintf(buffer, "%s%02x.", buffer, name.satm_number.Addr[ index ]); + } + buffer[ (ATM_ADDR_SIZE - 1) * 3 ] = '\0'; + sprintf(buffer, "%s%02x.", buffer, 0); + buffer[ ATM_ADDR_SIZE * 3 - 1 ] = '\0'; + for (index = 0; index < ACE_OS::strlen(buffer); ++index) + buffer[index] = tolower(buffer[index]); + + ifstream atm_hosts("C:/WINNT/atmhosts"); + assert(atm_hosts.is_open()); + + // Find the host address in the ATM hosts file and return the + // host name + char line[256]; + char *host_ptr, *host_name = new char[256]; + while (!atm_hosts.eof()) { + atm_hosts.getline(line, 256); + // Convert the line to lower case to ease comparison + for (index = 0; index < ACE_OS::strlen(line); ++index) + line[index] = tolower(line[index]); + if (strstr(line, buffer) != 0) + { + // Grab the second token which is the host name + strtok(line, " \t"); + host_ptr = strtok(0, " \t"); + strcpy(host_name, host_ptr); + break; + } + } + + return host_name; #else return 0; #endif /* ACE_HAS_FORE_ATM_XTI */ @@ -178,19 +208,19 @@ ACE_ATM_Stream::get_vpi_vci (ACE_UINT16 &vpi, 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) { + 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; + vpi = ( ACE_UINT16 )connID.VPI; vci = ( ACE_UINT16 )connID.VCI; return 0; @@ -200,4 +230,3 @@ ACE_ATM_Stream::get_vpi_vci (ACE_UINT16 &vpi, } #endif /* ACE_HAS_ATM */ - diff --git a/ace/ATM_Stream.i b/ace/ATM_Stream.i index f0f42d47b6b..904934e75a5 100644 --- a/ace/ATM_Stream.i +++ b/ace/ATM_Stream.i @@ -23,13 +23,34 @@ ACE_ATM_Stream::open (ACE_ATM_Params params) #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()); + int retval = 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()); + if (retval == -1) + return -1; + + struct sockaddr_atm sock_addr; + + ACE_OS::memset(&sock_addr, 0, sizeof(struct sockaddr_atm)); + sock_addr.satm_family = AF_ATM; + sock_addr.satm_number.AddressType=ADDR_ANY; + sock_addr.satm_number.NumofDigits = ATM_ADDR_SIZE; + sock_addr.satm_blli.Layer2Protocol = SAP_FIELD_ABSENT; + sock_addr.satm_blli.Layer3Protocol = SAP_FIELD_ABSENT; + sock_addr.satm_bhli.HighLayerInfoType = SAP_FIELD_ABSENT; + if (ACE_OS::bind(get_handle(), + (struct sockaddr FAR *)&sock_addr, + sizeof(struct sockaddr_atm)) < 0) + { + ACE_OS::printf("Error binding local address: %d",WSAGetLastError()); + return -1; + } + + return 0; #else ACE_UNUSED_ARG(params); return 0; @@ -48,18 +69,6 @@ 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 ((ACE_SOCK_Stream)stream_).get_handle (); -//#else -// return 0; -//#endif /* ACE_HAS_FORE_ATM_XTI || ACE_HAS_FORE_ATM_WS2 */ -//} - ACE_INLINE ATM_Stream& ACE_ATM_Stream::get_stream (void) |