#include <ATM_QoS.h>
Public Member Functions | |
| ACE_ATM_QoS (int=DEFAULT_PKT_SIZE) | |
| Default constructor. | |
| ACE_ATM_QoS (int, int=DEFAULT_PKT_SIZE) | |
| Constructor with a CBR rate. | |
| ~ACE_ATM_QoS () | |
| void | set_rate (ACE_HANDLE, int, int) |
| Set the rate. | |
| void | set_cbr_rate (int, int=DEFAULT_PKT_SIZE) |
| Set CBR rate in cells per second. | |
| ATM_QoS | get_qos (void) |
| Get ATM_QoS struct. | |
| void | dump (void) const |
| Dump the state of an object. | |
Public Attributes | |
| ACE_ALLOC_HOOK_DECLARE | |
| Declare the dynamic allocation hooks. | |
Static Public Attributes | |
| const long | LINE_RATE = 0L |
| const int | OPT_FLAGS_CPID = 0 |
| const int | OPT_FLAGS_PMP = 0 |
| const int | DEFAULT_SELECTOR = 0x0 |
| const int | DEFAULT_PKT_SIZE = 0 |
Protected Member Functions | |
| char * | construct_options (ACE_HANDLE, int, int, long *) |
| Construct QoS options. | |
Private Attributes | |
| ATM_QoS | qos_ |
This class wraps up QoS parameters for both ATM/XTI and ATM/WinSock2 to make the mechanism for the ATM protocol transparent.
Definition at line 58 of file ATM_QoS.h.
|
|
Default constructor.
Definition at line 42 of file ATM_QoS.cpp. References ACE_TRACE, ACE_OS::memset(), and qos_.
00043 {
00044 ACE_TRACE ("ACE_ATM_QoS::ACE_ATM_QoS");
00045 #if defined (ACE_HAS_LINUX_ATM)
00046 ACE_OS::memset(&qos_, 0, sizeof(qos_));
00047 qos_.aal = ATM_PROTOCOL_DEFAULT;
00048 qos_.rxtp.traffic_class = ATM_ANYCLASS;
00049 qos_.rxtp.max_sdu = pktSize;
00050 qos_.txtp.traffic_class = ATM_ANYCLASS;
00051 qos_.txtp.max_sdu = pktSize;
00052 #else
00053 ACE_UNUSED_ARG (pktSize);
00054 #endif /* ACE_HAS_LINUX_ATM */
00055 }
|
|
||||||||||||
|
Constructor with a CBR rate.
Definition at line 57 of file ATM_QoS.cpp. References ACE_DEFAULT_THREAD_PRIORITY, ACE_ERROR, ACE_LIB_TEXT, ACE_TRACE, LM_ERROR, ACE_OS::malloc(), ACE_OS::memcpy(), ACE_OS::memset(), and qos_.
00059 {
00060 ACE_TRACE( "ACE_ATM_QoS::ACE_ATM_QoS" );
00061 #if defined (ACE_HAS_FORE_ATM_WS2)
00062 AAL_PARAMETERS_IE ie_aalparams;
00063 ATM_TRAFFIC_DESCRIPTOR_IE ie_td;
00064 ATM_BROADBAND_BEARER_CAPABILITY_IE ie_bbc;
00065 ATM_QOS_CLASS_IE ie_qos;
00066 Q2931_IE *ie_ptr;
00067 int size;
00068
00069 // Setting up cbr parameters ...
00070 ie_aalparams.AALType = AALTYPE_5;
00071 ie_aalparams.AALSpecificParameters.AAL5Parameters.ForwardMaxCPCSSDUSize
00072 = pktSize; // was 1516;
00073 ie_aalparams.AALSpecificParameters.AAL5Parameters.BackwardMaxCPCSSDUSize
00074 = pktSize; // was 1516;
00075 ie_aalparams.AALSpecificParameters.AAL5Parameters.Mode = AAL5_MODE_MESSAGE;
00076 ie_aalparams.AALSpecificParameters.AAL5Parameters.SSCSType = AAL5_SSCS_NULL;
00077
00078 size = sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(AAL_PARAMETERS_IE);
00079
00080 ie_td.Forward.PeakCellRate_CLP0 = SAP_FIELD_ABSENT;
00081 ie_td.Forward.PeakCellRate_CLP01 = rate;
00082 ie_td.Forward.SustainableCellRate_CLP0 = SAP_FIELD_ABSENT;
00083 ie_td.Forward.SustainableCellRate_CLP01 = SAP_FIELD_ABSENT;
00084 ie_td.Forward.MaxBurstSize_CLP0 = SAP_FIELD_ABSENT;
00085 ie_td.Forward.MaxBurstSize_CLP01 = SAP_FIELD_ABSENT;
00086 ie_td.Forward.Tagging = SAP_FIELD_ABSENT;
00087
00088 ie_td.Backward.PeakCellRate_CLP0 = SAP_FIELD_ABSENT;
00089 ie_td.Backward.PeakCellRate_CLP01 = rate;
00090 ie_td.Backward.SustainableCellRate_CLP0 = SAP_FIELD_ABSENT;
00091 ie_td.Backward.SustainableCellRate_CLP01 = SAP_FIELD_ABSENT;
00092 ie_td.Backward.MaxBurstSize_CLP0 = SAP_FIELD_ABSENT;
00093 ie_td.Backward.MaxBurstSize_CLP01 = SAP_FIELD_ABSENT;
00094 ie_td.Backward.Tagging = SAP_FIELD_ABSENT;
00095
00096 ie_td.BestEffort = 0; // Note: this must be set to zero for CBR.
00097
00098 size += sizeof( Q2931_IE_TYPE )
00099 + sizeof( ULONG )
00100 + sizeof( ATM_TRAFFIC_DESCRIPTOR_IE );
00101
00102 ie_bbc.BearerClass = BCOB_X;
00103 ie_bbc.TrafficType = TT_CBR;
00104 ie_bbc.TimingRequirements = TR_END_TO_END;
00105 ie_bbc.ClippingSusceptability = CLIP_NOT;
00106 ie_bbc.UserPlaneConnectionConfig = UP_P2P;
00107
00108 size += sizeof( Q2931_IE_TYPE )
00109 + sizeof( ULONG )
00110 + sizeof( ATM_BROADBAND_BEARER_CAPABILITY_IE );
00111
00112 ie_qos.QOSClassForward = QOS_CLASS1;
00113 ie_qos.QOSClassBackward = QOS_CLASS1; // This may not be really used
00114 // since we do only simplex data xfer.
00115
00116 size += sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(ATM_QOS_CLASS_IE);
00117
00118 qos_.ProviderSpecific.buf = (char *) ACE_OS::malloc(size);
00119 if (qos_.ProviderSpecific.buf == 0) {
00120 ACE_ERROR((LM_ERROR,
00121 ACE_LIB_TEXT ("ACE_ATM_QoS::ACE_ATM_QoS: Unable to allocate %d bytes for qos_.ProviderSpecific.buf\n"),
00122 size));
00123 return;
00124 }
00125 qos_.ProviderSpecific.len = size;
00126 ACE_OS::memset(qos_.ProviderSpecific.buf, 0, size);
00127
00128 ie_ptr = (Q2931_IE *) qos_.ProviderSpecific.buf;
00129 ie_ptr->IEType = IE_AALParameters;
00130 ie_ptr->IELength = sizeof( Q2931_IE_TYPE )
00131 + sizeof( ULONG )
00132 + sizeof( AAL_PARAMETERS_IE );
00133 ACE_OS::memcpy(ie_ptr->IE, &ie_aalparams, sizeof(AAL_PARAMETERS_IE));
00134
00135 ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength);
00136 ie_ptr->IEType = IE_TrafficDescriptor;
00137 ie_ptr->IELength = sizeof( Q2931_IE_TYPE )
00138 + sizeof( ULONG )
00139 + sizeof( ATM_TRAFFIC_DESCRIPTOR_IE );
00140 ACE_OS::memcpy(ie_ptr->IE, &ie_td, sizeof(ATM_TRAFFIC_DESCRIPTOR_IE));
00141
00142 ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength);
00143 ie_ptr->IEType = IE_BroadbandBearerCapability;
00144 ie_ptr->IELength = sizeof( Q2931_IE_TYPE )
00145 + sizeof( ULONG )
00146 + sizeof( ATM_BROADBAND_BEARER_CAPABILITY_IE );
00147 ACE_OS::memcpy(ie_ptr->IE,
00148 &ie_bbc,
00149 sizeof(ATM_BROADBAND_BEARER_CAPABILITY_IE));
00150
00151 ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength);
00152 ie_ptr->IEType = IE_QOSClass;
00153 ie_ptr->IELength = sizeof( Q2931_IE_TYPE )
00154 + sizeof( ULONG )
00155 + sizeof( ATM_QOS_CLASS_IE );
00156 ACE_OS::memcpy(ie_ptr->IE, &ie_qos, sizeof(ATM_QOS_CLASS_IE));
00157
00158 // qos_.SendingFlowspec.TokenRate = 0xffffffff;
00159 // qos_.SendingFlowspec.TokenBucketSize = 0xffffffff;
00160 // qos_.SendingFlowspec.PeakBandwidth = 0xffffffff;
00161 // qos_.SendingFlowspec.Latency = 0xffffffff;
00162 // qos_.SendingFlowspec.DelayVariation = 0xffffffff;
00163 // qos_.SendingFlowspec.ServiceType = SERVICETYPE_BESTEFFORT;
00164 // This will most probably be ignored by the service provider.
00165 // qos_.SendingFlowspec.MaxSduSize = 0xffffffff;
00166 // qos_.SendingFlowspec.MinimumPolicedSize = 0xffffffff;
00167
00168 // qos_.ReceivingFlowspec.TokenRate = 0xffffffff;
00169 // qos_.ReceivingFlowspec.TokenBucketSize = 0xffffffff;
00170 // qos_.ReceivingFlowspec.PeakBandwidth = 0xffffffff;
00171 // qos_.ReceivingFlowspec.Latency = 0xffffffff;
00172 // qos_.ReceivingFlowspec.DelayVariation = 0xffffffff;
00173 // qos_.ReceivingFlowspec.ServiceType = SERVICETYPE_BESTEFFORT;
00174 // This will most probably be ignored by the service provider.
00175 // qos_.ReceivingFlowspec.MaxSduSize = 0xffffffff;
00176 // qos_.ReceivingFlowspec.MinimumPolicedSize = 0;
00177
00178 ACE_Flow_Spec send_fspec( 0xffffffff,
00179 0xffffffff,
00180 0xffffffff,
00181 0xffffffff,
00182 0xffffffff,
00183 SERVICETYPE_BESTEFFORT,
00184 // This will most probably ignored by SP.
00185 0xffffffff,
00186 0xffffffff,
00187 15,
00188 ACE_DEFAULT_THREAD_PRIORITY ),
00189 recv_fspec( 0xffffffff,
00190 0xffffffff,
00191 0xffffffff,
00192 0xffffffff,
00193 0xffffffff,
00194 SERVICETYPE_BESTEFFORT,
00195 // This will most probably ignored by SP.
00196 0xffffffff,
00197 0,
00198 15,
00199 ACE_DEFAULT_THREAD_PRIORITY );
00200
00201 qos_.sending_flowspec (send_fspec);
00202 qos_.receiving_flowspec (recv_fspec);
00203 #elif defined (ACE_HAS_FORE_ATM_XTI)
00204 ACE_UNUSED_ARG (rate);
00205 ACE_UNUSED_ARG (pktSize);
00206 #elif defined (ACE_HAS_LINUX_ATM)
00207 ACE_OS::memset(&qos_,
00208 0,
00209 sizeof(qos_));
00210 qos_.aal = ATM_PROTOCOL_DEFAULT;
00211 qos_.rxtp.max_sdu = pktSize;
00212
00213 if (rate > 0) {
00214 qos_.rxtp.pcr = rate;
00215 qos_.rxtp.traffic_class = ATM_CBR;
00216 qos_.txtp.traffic_class = ATM_CBR;
00217 qos_.txtp.pcr = rate;
00218 }
00219 else {
00220 qos_.rxtp.traffic_class = ATM_UBR;
00221 qos_.txtp.traffic_class = ATM_UBR;
00222 }
00223
00224 qos_.txtp.max_sdu = pktSize;
00225 #else
00226 ACE_UNUSED_ARG (rate);
00227 #endif /* ACE_HAS_FORE_ATM_WS2 || ACE_HAS_FORE_ATM_XTI || ACE_HAS_LINUX_ATM */
00228 }
|
|
|
Definition at line 16 of file ATM_QoS.inl. References ACE_TRACE.
00017 {
00018 ACE_TRACE ("ACE_ATM_QoS::~ACE_ATM_QoS");
00019 }
|
|
||||||||||||||||||||
|
Construct QoS options.
Definition at line 444 of file ATM_QoS.cpp. References ACE_BIT_ENABLED, ACE_ERROR, ACE_ERROR_RETURN, ACE_LIB_TEXT, ACE_OS::free(), LINE_RATE, LM_ERROR, ACE_OS::malloc(), ACE_OS::memcpy(), OPT_FLAGS_CPID, OPT_FLAGS_PMP, t_bind(), ACE_OS::t_error(), ACE_OS::t_getinfo(), and ACE_OS::t_getname(). Referenced by set_rate().
00448 {
00449 #if defined (ACE_HAS_FORE_ATM_WS2) || defined (ACE_HAS_LINUX_ATM)
00450 ACE_UNUSED_ARG (fd);
00451 ACE_UNUSED_ARG (rate);
00452 ACE_UNUSED_ARG (flags);
00453 ACE_UNUSED_ARG (len);
00454 return (0);
00455 #elif defined (ACE_HAS_FORE_ATM_XTI)
00456 struct t_opthdr *popt;
00457 char *buf;
00458 int qos_cells;
00459 struct t_info info;
00460
00461 if (ACE_OS::t_getinfo (fd, &info) == -1)
00462 {
00463 ACE_OS::t_error ("t_getinfo");
00464 return 0;
00465 }
00466
00467 buf = (char *) ACE_OS::malloc (info.options);
00468
00469 if (buf == 0)
00470 ACE_ERROR_RETURN ((LM_ERROR,
00471 ACE_LIB_TEXT ("Unable to allocate %d bytes for options\n"),
00472 info.options),
00473 0);
00474
00475 popt = (struct t_opthdr *) buf;
00476
00477 if (flags & OPT_FLAGS_CPID)
00478 {
00479 // This constructs the T_ATM_ORIG_ADDR option, which is used to
00480 // signal the UNI 3.1 Calling Party ID Information Element.
00481 t_atm_addr *source_addr;
00482
00483 popt->len = sizeof (struct t_opthdr) + sizeof (t_atm_addr);
00484 popt->level = T_ATM_SIGNALING;
00485 popt->name = T_ATM_ORIG_ADDR;
00486 popt->status = 0;
00487
00488 source_addr =
00489 (t_atm_addr *)((char *) popt + sizeof (struct t_opthdr));
00490
00491 source_addr->address_format = T_ATM_ENDSYS_ADDR;
00492 source_addr->address_length = ATMNSAP_ADDR_LEN;
00493
00494 ATMSAPAddress local_addr;
00495 struct t_bind boundaddr;
00496
00497 boundaddr.addr.maxlen = sizeof(local_addr);
00498 boundaddr.addr.buf = (char *) &local_addr;
00499
00500 //if (ACE_OS::t_getprotaddr(fd, &boundaddr, 0) < 0) {
00501 if (ACE_OS::t_getname(fd,
00502 &boundaddr.addr,
00503 LOCALNAME) < 0)
00504 {
00505 ACE_OS::t_error("t_getname (local_address)");
00506 ACE_ERROR ((LM_ERROR,
00507 ACE_LIB_TEXT ("Can't get local address!\n")));
00508 ACE_OS::free (buf);
00509 return 0;
00510 }
00511
00512 ACE_OS::memcpy(source_addr->address,
00513 local_addr.sap.t_atm_sap_addr.address,
00514 ATMNSAP_ADDR_LEN);
00515
00516 popt = T_OPT_NEXTHDR (buf, info.options , popt);
00517 }
00518
00519 // This constructs all options necessary (bearer cap., QoS, and
00520 // Traffic Descriptor) to signal for a CBR connection with the
00521 // specified QoS in kbit/sec., and/or specify a PMP connection.
00522
00523 // For FORE 200e cards, the adapter shapes traffic to CBR with rate
00524 // equal to PCR CLP=0+1 (traffic.forward.PCR_all_traffic)
00525
00526 qos_cells = (rate * 1000) / (48*8);
00527
00528 if ((qos_cells > 0 && qos_cells < LINE_RATE)
00529 || (ACE_BIT_ENABLED (flags, OPT_FLAGS_PMP)))
00530 {
00531 struct t_atm_bearer *bearer;
00532 struct t_atm_traffic *traffic;
00533
00534 // T_ATM_BEARER_CAP: Broadband bearer capability
00535 popt->len = sizeof (struct t_opthdr) + sizeof (struct t_atm_bearer);
00536 popt->level = T_ATM_SIGNALING;
00537 popt->name = T_ATM_BEARER_CAP;
00538 popt->status = 0;
00539
00540 bearer = (struct t_atm_bearer *)((char *) popt +
00541 sizeof (struct t_opthdr));
00542 bearer->bearer_class = T_ATM_CLASS_X;
00543
00544 if (qos_cells)
00545 {
00546 bearer->traffic_type = T_ATM_CBR;
00547 bearer->timing_requirements = T_ATM_END_TO_END;
00548 }
00549 else
00550 {
00551 bearer->traffic_type = 0; // UBR
00552 bearer->timing_requirements = 0;
00553 }
00554 bearer->clipping_susceptibility = T_ATM_NULL;
00555
00556 if (ACE_BIT_ENABLED (flags, OPT_FLAGS_PMP))
00557 bearer->connection_configuration = T_ATM_1_TO_MANY;
00558 else
00559 bearer->connection_configuration = T_ATM_1_TO_1;
00560
00561 popt = T_OPT_NEXTHDR (buf, info.options, popt);
00562
00563 // T_ATM_TRAFFIC: traffic descriptor
00564 popt->len = sizeof (struct t_opthdr) + sizeof (struct t_atm_traffic);
00565 popt->level = T_ATM_SIGNALING;
00566 popt->name = T_ATM_TRAFFIC;
00567 popt->status = 0;
00568
00569 traffic = (struct t_atm_traffic *)((char *) popt +
00570 sizeof (struct t_opthdr));
00571
00572 traffic->forward.PCR_high_priority = T_ATM_ABSENT;
00573 traffic->forward.PCR_all_traffic = qos_cells ? qos_cells : LINE_RATE;
00574 traffic->forward.SCR_high_priority = T_ATM_ABSENT;
00575 traffic->forward.SCR_all_traffic = T_ATM_ABSENT;
00576 traffic->forward.MBS_high_priority = T_ATM_ABSENT;
00577 traffic->forward.MBS_all_traffic = T_ATM_ABSENT;
00578 traffic->forward.tagging = T_NO;
00579
00580 traffic->backward.PCR_high_priority = T_ATM_ABSENT;
00581 traffic->backward.PCR_all_traffic =
00582 (ACE_BIT_ENABLED (flags, OPT_FLAGS_PMP))
00583 ? 0 : qos_cells ? qos_cells : LINE_RATE;
00584 traffic->backward.SCR_high_priority = T_ATM_ABSENT;
00585 traffic->backward.SCR_all_traffic = T_ATM_ABSENT;
00586 traffic->backward.MBS_high_priority = T_ATM_ABSENT;
00587 traffic->backward.MBS_all_traffic = T_ATM_ABSENT;
00588 traffic->backward.tagging = T_NO;
00589
00590 traffic->best_effort = qos_cells ? T_NO : T_YES;
00591
00592 popt = T_OPT_NEXTHDR (buf,
00593 info.options,
00594 popt);
00595 }
00596
00597 if (qos_cells > 0 && qos_cells < LINE_RATE)
00598 {
00599 struct t_atm_qos *qos;
00600
00601 // T_ATM_QOS: Quality of Service
00602 popt->len = sizeof (struct t_opthdr) + sizeof (struct t_atm_qos);
00603 popt->level = T_ATM_SIGNALING;
00604 popt->name = T_ATM_QOS;
00605 popt->status = 0;
00606
00607 qos = (struct t_atm_qos *)((char *) popt + sizeof (struct t_opthdr));
00608 qos->coding_standard = T_ATM_ITU_CODING;
00609 qos->forward.qos_class = T_ATM_QOS_CLASS_1;
00610 qos->backward.qos_class = T_ATM_QOS_CLASS_1;
00611
00612 popt = T_OPT_NEXTHDR (buf, info.options, popt);
00613 }
00614
00615 // Return actual size of options and option buffer to user.
00616 *len = (char *) popt - buf;
00617
00618 return buf;
00619 #else
00620 ACE_UNUSED_ARG (fd);
00621 ACE_UNUSED_ARG (rate);
00622 ACE_UNUSED_ARG (flag);
00623 ACE_UNUSED_ARG (len);
00624 return (0);
00625 #endif /* ACE_HAS_FORE_ATM_WS2 */
00626 }
|
|
|
Dump the state of an object.
Definition at line 8 of file ATM_QoS.inl. References ACE_TRACE.
00009 {
00010 #if defined (ACE_HAS_DUMP)
00011 ACE_TRACE ("ACE_ATM_QoS::dump");
00012 #endif /* ACE_HAS_DUMP */
00013 }
|
|
|
Get ATM_QoS struct.
Definition at line 23 of file ATM_QoS.inl. References ACE_TRACE, and qos_. Referenced by ACE_ATM_Acceptor::accept(), ACE_ATM_Connector::add_leaf(), ACE_ATM_Connector::connect(), and ACE_ATM_Acceptor::open().
|
|
||||||||||||
|
Set CBR rate in cells per second.
Definition at line 231 of file ATM_QoS.cpp. References ACE_TRACE, ATM_QoS, ACE_OS::memset(), ACE_OS::printf(), and qos_. Referenced by set_rate().
00233 {
00234 ACE_TRACE ("ACE_ATM_QoS::set_cbr_rate");
00235 #if defined (ACE_HAS_FORE_ATM_WS2)
00236 /*
00237 AAL_PARAMETERS_IE ie_aalparams;
00238 ATM_TRAFFIC_DESCRIPTOR_IE ie_td;
00239 ATM_BROADBAND_BEARER_CAPABILITY_IE ie_bbc;
00240 ATM_QOS_CLASS_IE ie_qos;
00241 Q2931_IE *ie_ptr;
00242 int size;
00243 */
00244
00245 ACE_OS::printf( "ATM_QoS(set_cbr_rate): set rate to %d c/s\n", rate );
00246
00247 // Setting up cbr parameters ...
00248 /*
00249 FORE has changed this - we no longer specify QoS this way
00250 ie_aalparams.AALType = AALTYPE_5;
00251 ie_aalparams.AALSpecificParameters.AAL5Parameters.ForwardMaxCPCSSDUSize
00252 = pktSize; // was 1516;
00253 ie_aalparams.AALSpecificParameters.AAL5Parameters.BackwardMaxCPCSSDUSize
00254 = pktSize; // was 1516;
00255 ie_aalparams.AALSpecificParameters.AAL5Parameters.Mode = AAL5_MODE_MESSAGE;
00256 ie_aalparams.AALSpecificParameters.AAL5Parameters.SSCSType = AAL5_SSCS_NULL;
00257
00258 size = sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(AAL_PARAMETERS_IE);
00259
00260 ie_td.Forward.PeakCellRate_CLP0 = SAP_FIELD_ABSENT;
00261 ie_td.Forward.PeakCellRate_CLP01 = rate;
00262 ie_td.Forward.SustainableCellRate_CLP0 = SAP_FIELD_ABSENT;
00263 ie_td.Forward.SustainableCellRate_CLP01 = SAP_FIELD_ABSENT;
00264 ie_td.Forward.MaxBurstSize_CLP0 = SAP_FIELD_ABSENT;
00265 ie_td.Forward.MaxBurstSize_CLP01 = SAP_FIELD_ABSENT;
00266 ie_td.Forward.Tagging = SAP_FIELD_ABSENT;
00267
00268 ie_td.Backward.PeakCellRate_CLP0 = SAP_FIELD_ABSENT;
00269 ie_td.Backward.PeakCellRate_CLP01 = rate;
00270 ie_td.Backward.SustainableCellRate_CLP0 = SAP_FIELD_ABSENT;
00271 ie_td.Backward.SustainableCellRate_CLP01 = SAP_FIELD_ABSENT;
00272 ie_td.Backward.MaxBurstSize_CLP0 = SAP_FIELD_ABSENT;
00273 ie_td.Backward.MaxBurstSize_CLP01 = SAP_FIELD_ABSENT;
00274 ie_td.Backward.Tagging = SAP_FIELD_ABSENT;
00275
00276 ie_td.BestEffort = 0; // Note: this must be set to zero for CBR.
00277
00278 size += sizeof( Q2931_IE_TYPE ) +
00279 sizeof( ULONG ) +
00280 sizeof( ATM_TRAFFIC_DESCRIPTOR_IE );
00281
00282 ie_bbc.BearerClass = BCOB_X;
00283 ie_bbc.TrafficType = TT_CBR;
00284 ie_bbc.TimingRequirements = TR_END_TO_END;
00285 ie_bbc.ClippingSusceptability = CLIP_NOT;
00286 ie_bbc.UserPlaneConnectionConfig = UP_P2P;
00287
00288 size += sizeof(Q2931_IE_TYPE) +
00289 sizeof(ULONG) +
00290 sizeof(ATM_BROADBAND_BEARER_CAPABILITY_IE);
00291
00292 ie_qos.QOSClassForward = QOS_CLASS1;
00293 ie_qos.QOSClassBackward = QOS_CLASS1; // This may not be really used
00294 // since we only simplex data xfer.
00295
00296 size += sizeof(Q2931_IE_TYPE) + sizeof(ULONG) + sizeof(ATM_QOS_CLASS_IE);
00297
00298 qos_.ProviderSpecific.buf = (char *) ACE_OS::malloc(size);
00299 if (qos_.ProviderSpecific.buf == 0) {
00300 ACE_ERROR((LM_ERROR,
00301 ACE_LIB_TEXT ("ACE_ATM_QoS::ACE_ATM_QoS: Unable to allocate %d bytes for qos_.ProviderSpecific.buf\n"),
00302 size));
00303 return;
00304 }
00305 qos_.ProviderSpecific.len = size;
00306 ACE_OS::memset(qos_.ProviderSpecific.buf, 0, size);
00307
00308 ie_ptr = (Q2931_IE *) qos_.ProviderSpecific.buf;
00309 ie_ptr->IEType = IE_AALParameters;
00310 ie_ptr->IELength = sizeof( Q2931_IE_TYPE ) +
00311 sizeof( ULONG ) +
00312 sizeof( AAL_PARAMETERS_IE );
00313 ACE_OS::memcpy(ie_ptr->IE, &ie_aalparams, sizeof(AAL_PARAMETERS_IE));
00314
00315 ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength);
00316 ie_ptr->IEType = IE_TrafficDescriptor;
00317 ie_ptr->IELength = sizeof( Q2931_IE_TYPE ) +
00318 sizeof( ULONG ) +
00319 sizeof( ATM_TRAFFIC_DESCRIPTOR_IE );
00320 ACE_OS::memcpy(ie_ptr->IE, &ie_td, sizeof(ATM_TRAFFIC_DESCRIPTOR_IE));
00321
00322 ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength);
00323 ie_ptr->IEType = IE_BroadbandBearerCapability;
00324 ie_ptr->IELength = sizeof( Q2931_IE_TYPE ) +
00325 sizeof( ULONG ) +
00326 sizeof( ATM_BROADBAND_BEARER_CAPABILITY_IE );
00327 ACE_OS::memcpy( ie_ptr->IE,
00328 &ie_bbc,
00329 sizeof( ATM_BROADBAND_BEARER_CAPABILITY_IE ));
00330
00331 ie_ptr = (Q2931_IE *) ((char *)ie_ptr + ie_ptr->IELength);
00332 ie_ptr->IEType = IE_QOSClass;
00333 ie_ptr->IELength = sizeof(Q2931_IE_TYPE) + sizeof(ULONG) +
00334 sizeof(ATM_QOS_CLASS_IE);
00335 ACE_OS::memcpy(ie_ptr->IE, &ie_qos, sizeof(ATM_QOS_CLASS_IE));
00336 */
00337
00338 const int BYTES_PER_ATM_CELL = 53;
00339 ACE_OS::memset(&qos_, 0, sizeof(ATM_QoS));
00340 // Setting the token rate sets the minimum rate. 3 Mbits/sec seems too high.
00341 // Certainly for Vaudeville audio, we only need about 1000 c/s which is
00342 // 424000 bits/sec which is 53000 bytes/sec.
00343 //qos_.SendingFlowspec.TokenRate = 3*(1024*128); // 3Mbits/sec
00344 qos_.SendingFlowspec.TokenRate = 53000; // 1000 cells/sec
00345 qos_.SendingFlowspec.TokenBucketSize = 32*1024; // our block size
00346 //ourQos.SendingFlowspec.PeakBandwidth = ourQos.SendingFlowspec.TokenRate;
00347 qos_.SendingFlowspec.ServiceType = SERVICETYPE_GUARANTEED;
00348 // Peak bandwidth is in bytes/sec. The rate is specified in cells/sec so
00349 // we need to convert from cells/sec to bytes/sec (i.e., multiply by 53).
00350 qos_.SendingFlowspec.PeakBandwidth = rate * BYTES_PER_ATM_CELL;
00351 qos_.SendingFlowspec.Latency = -1; // we don't care too much
00352 qos_.SendingFlowspec.DelayVariation = -1; // we don't care too much
00353 // no provider-specific data allowed on ATM
00354 qos_.ProviderSpecific.buf=0;
00355 qos_.ProviderSpecific.len=0;
00356 // unidirectional P2MP; we don't need to setup the Receiving flowspec
00357
00358 //qos_.SendingFlowspec.TokenRate = 0xffffffff;
00359 //qos_.SendingFlowspec.TokenBucketSize = 0xffffffff;
00360 //qos_.SendingFlowspec.PeakBandwidth = 0xffffffff;
00361 //qos_.SendingFlowspec.Latency = 0xffffffff;
00362 //qos_.SendingFlowspec.DelayVariation = 0xffffffff;
00363 //qos_.SendingFlowspec.ServiceType = SERVICETYPE_BESTEFFORT;
00364 // This will most probably be ignored by the service provider.
00365 //qos_.SendingFlowspec.MaxSduSize = 0xffffffff;
00366 //qos_.SendingFlowspec.MinimumPolicedSize = 0xffffffff;
00367
00368 //qos_.ReceivingFlowspec.TokenRate = 0xffffffff;
00369 //qos_.ReceivingFlowspec.TokenBucketSize = 0xffffffff;
00370 //qos_.ReceivingFlowspec.PeakBandwidth = 0xffffffff;
00371 //qos_.ReceivingFlowspec.Latency = 0xffffffff;
00372 //qos_.ReceivingFlowspec.DelayVariation = 0xffffffff;
00373 //qos_.ReceivingFlowspec.ServiceType = SERVICETYPE_BESTEFFORT;
00374 // This will most probably be ignored by the service provider.
00375 //qos_.ReceivingFlowspec.MaxSduSize = 0xffffffff;
00376 //qos_.ReceivingFlowspec.MinimumPolicedSize = 0;
00377
00378 /*
00379 ACE_Flow_Spec send_fspec( 0xffffffff,
00380 0xffffffff,
00381 0xffffffff,
00382 0xffffffff,
00383 0xffffffff,
00384 SERVICETYPE_BESTEFFORT,
00385 // This will most probably ignored by SP.
00386 0xffffffff,
00387 0xffffffff,
00388 15,
00389 ACE_DEFAULT_THREAD_PRIORITY ),
00390 recv_fspec( 0xffffffff,
00391 0xffffffff,
00392 0xffffffff,
00393 0xffffffff,
00394 0xffffffff,
00395 SERVICETYPE_BESTEFFORT,
00396 // This will most probably ignored by SP.
00397 0xffffffff,
00398 0,
00399 15,
00400 ACE_DEFAULT_THREAD_PRIORITY );
00401
00402 qos_.sending_flowspec( send_fspec );
00403 qos_.receiving_flowspec( recv_fspec );
00404 */
00405 #elif defined (ACE_HAS_FORE_ATM_XTI)
00406 ACE_UNUSED_ARG (rate);
00407 ACE_UNUSED_ARG (pktSize);
00408 #elif defined (ACE_HAS_LINUX_ATM)
00409 ACE_UNUSED_ARG (pktSize);
00410
00411 qos_.rxtp.traffic_class = ATM_CBR;
00412 qos_.rxtp.pcr = rate;
00413 qos_.txtp.traffic_class = ATM_CBR;
00414 qos_.txtp.pcr = rate;
00415 #else
00416 ACE_UNUSED_ARG (rate);
00417 #endif /* ACE_HAS_FORE_ATM_WS2 || ACE_HAS_FORE_ATM_XTI || ACE_HAS_LINUX_ATM */
00418 }
|
|
||||||||||||||||
|
Set the rate.
Definition at line 421 of file ATM_QoS.cpp. References ACE_TRACE, construct_options(), qos_, and set_cbr_rate().
00424 {
00425 ACE_TRACE ("ACE_ATM_QoS::set_rate");
00426 #if defined (ACE_HAS_FORE_ATM_WS2) || defined (ACE_HAS_LINUX_ATM)
00427 set_cbr_rate( rate );
00428
00429 ACE_UNUSED_ARG( fd );
00430 ACE_UNUSED_ARG( flags );
00431 #elif defined (ACE_HAS_FORE_ATM_XTI)
00432 long optlen = 0;
00433 qos_.buf = construct_options(fd,
00434 rate,
00435 flags,
00436 &optlen);
00437 qos_.len = optlen;
00438 #else
00439 ACE_UNUSED_ARG (rate);
00440 #endif /* ACE_HAS_FORE_ATM_WS2 || ACE_HAS_LINUX_ATM || ACE_HAS_FORE_ATM_XTI */
00441 }
|
|
|
Declare the dynamic allocation hooks.
|
|
|
Definition at line 37 of file ATM_QoS.cpp. |
|
|
Definition at line 36 of file ATM_QoS.cpp. |
|
|
Definition at line 33 of file ATM_QoS.cpp. Referenced by construct_options(). |
|
|
Definition at line 34 of file ATM_QoS.cpp. Referenced by construct_options(). |
|
|
Definition at line 35 of file ATM_QoS.cpp. Referenced by construct_options(). |
|
|
Definition at line 104 of file ATM_QoS.h. Referenced by ACE_ATM_QoS(), get_qos(), set_cbr_rate(), and set_rate(). |
1.3.6