1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313
|
//=============================================================================
/**
* @file BPR_Drivers_T.cpp
*
* $Id: BPR_Drivers_T.cpp 93639 2011-03-24 13:32:13Z johnnyw $
*
* This code builds an abstraction to factor out common code for
* the different implementations of the Timer_Queue.
*
*
* @author Chris Gill <cdgill@cs.wustl.edu> and Douglas C. Schmidt <schmidt@cs.wustl.edu> Based on the Timer Queue Test example written by Carlos O'Ryan <coryan@cs.wustl.edu> and Douglas C. Schmidt <schmidt@cs.wustl.edu> and Sergio Flores-Gaitan <sergio@cs.wustl.edu>
*/
//=============================================================================
#ifndef _BPR_DRIVER_T_CPP_
#define _BPR_DRIVER_T_CPP_
// #include BPR_Drivers.h instead of BPR_Drivers_T.h
// to avoid problems with circular includes
#include "BPR_Drivers.h"
#include "ace/OS_NS_string.h"
#include "ace/OS_NS_unistd.h"
// Constructor.
template <class TQ>
Bounded_Packet_Relay_Driver<TQ>::Bounded_Packet_Relay_Driver (void)
: packet_count_cmd_ (0),
arrival_period_cmd_ (0),
transmit_period_cmd_ (0),
duration_limit_cmd_ (0),
logging_level_cmd_ (0),
run_transmission_cmd_ (0),
cancel_transmission_cmd_ (0),
report_stats_cmd_ (0),
shutdown_cmd_ (0),
packet_count_ (1000),
arrival_period_ (10000),
send_period_ (10000),
duration_limit_ (20000000),
logging_level_ (0)
{
}
// Destructor.
template <class TQ>
Bounded_Packet_Relay_Driver<TQ>::~Bounded_Packet_Relay_Driver (void)
{
// delete all instantiated command objects
delete packet_count_cmd_;
delete arrival_period_cmd_;
delete transmit_period_cmd_;
delete duration_limit_cmd_;
delete logging_level_cmd_;
delete run_transmission_cmd_;
delete cancel_transmission_cmd_;
delete report_stats_cmd_;
delete shutdown_cmd_;
}
// Parse the input and execute the corresponding command.
template <class TQ> int
Bounded_Packet_Relay_Driver<TQ>::parse_commands (const char *buf)
{
int option;
if (::sscanf (buf, "%d", &option) <= 0)
// If there was an error reading the option simply try on the next
// line.
return 0;
switch (option)
{
case 1: // set packet count
{
u_long count;
// We just reread the option, this simplies parsing (since
// sscanf can do it for us).
if (::sscanf (buf, "%d %lu", &option, &count) < 2)
// If there was not enough information on the line, ignore
// option and try the next line.
return 0;
if (packet_count_cmd_->execute ((void *) &count) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
"%t %p\n",
"set packet count failed"),
-1);
break;
}
case 2: // Set the arrival period.
{
u_long usec;
// We just reread the option, this simplies parsing (since
// sscanf can do it for us).
if (::sscanf (buf, "%d %lu", &option, &usec) < 2)
// If there was not enough information on the line, ignore
// option and try the next line.
return 0;
if (arrival_period_cmd_->execute ((void *) &usec) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
"%t %p\n",
"set arrival period failed"),
-1);
break;
}
case 3: // Set transmit period.
{
u_long usec;
// We just reread the option, this simplies parsing (since
// sscanf can do it for us).
if (::sscanf (buf, "%d %lu", &option, &usec) < 2)
// If there was not enough information on the line, ignore
// option and try the next line.
return 0;
if (transmit_period_cmd_->execute ((void *) &usec) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
"%t %p\n",
"set transmit period failed"),
-1);
break;
}
case 4: // Set duration limit.
{
u_long usec;
// We just reread the option, this simplies parsing (since
// sscanf can do it for us).
if (::sscanf (buf, "%d %lu", &option, &usec) < 2)
// If there was not enough information on the line, ignore
// option and try the next line.
return 0;
if (duration_limit_cmd_->execute ((void *) &usec) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
"%t %p\n",
"\nSet duration limit failed."),
-1);
break;
}
case 5: // Set logging level.
{
int level;
// We just reread the option, this simplies parsing (since
// sscanf can do it for us).
if ((::sscanf (buf, "%d %d", &option, &level) < 2) ||
(level < 0) || (level > 7))
{
// If there was not enough information on the line, or the
// passed value was invalid, ignore and try again.
return 0;
}
if (logging_level_cmd_->execute ((void *) &level) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
"%t %p\n",
"set logging level failed"),
-1);
break;
}
case 6: // Run one transmission.
return run_transmission_cmd_->execute (0);
/* NOTREACHED */
case 7: // Cancel current transmission.
return cancel_transmission_cmd_->execute (0);
/* NOTREACHED */
case 8: // Report statistics.
return report_stats_cmd_->execute (0);
/* NOTREACHED */
case 9: // Shut down the driver.
return shutdown_cmd_->execute (0);
/* NOTREACHED */
default:
// Display an error message.
ACE_ERROR_RETURN ((LM_ERROR, "invalid input %s\n", buf), 0);
ACE_NOTREACHED (break);
/* NOTREACHED */
} /* ENDSWITCH */
return 0;
}
// Runs the test.
template <class TQ> int
Bounded_Packet_Relay_Driver<TQ>::run (void)
{
this->init ();
// Process all the incoming events.
for (;;)
if (this->get_next_request () == -1)
return -1;
ACE_NOTREACHED (return 0);
}
// Gets the next request from the user input.
template <class TQ> int
Bounded_Packet_Relay_Driver<TQ>::get_next_request (void)
{
char buf[BUFSIZ];
this->display_menu ();
// Reads input from the user.
if (this->read_input (buf, sizeof buf) <= 0)
return -1;
// Parse and run the command.
return this->parse_commands (buf);
}
// Reads input from the user from ACE_STDIN into the buffer specified.
template <class TQ> ssize_t
Bounded_Packet_Relay_Driver<TQ>::read_input (char *buf, size_t bufsiz)
{
ACE_OS::memset (buf, 0, bufsiz);
// Wait for user to type commands. This call is automatically
// restarted when SIGINT or SIGALRM signals occur.
return ACE_OS::read (ACE_STDIN, buf, bufsiz);
}
// Get count of packets to send in a transmission.
template <class TQ> u_long
Bounded_Packet_Relay_Driver<TQ>::packet_count (void)
{
return packet_count_;
}
// Set count of packets to send in a transmission.
template <class TQ> void
Bounded_Packet_Relay_Driver<TQ>::packet_count (u_long pc)
{
packet_count_ = pc;
}
// Get rate at which input packets are to arrive.
template <class TQ> u_long
Bounded_Packet_Relay_Driver<TQ>::arrival_period (void)
{
return arrival_period_;
}
// Set rate at which input packets are to arrive.
template <class TQ> void
Bounded_Packet_Relay_Driver<TQ>::arrival_period (u_long ap)
{
arrival_period_ = ap;
}
// Get rate at which packets are to be relayed (usec).
template <class TQ> u_long
Bounded_Packet_Relay_Driver<TQ>::send_period (void)
{
return send_period_;
}
// Set rate at which packets are to be relayed (usec).
template <class TQ> void
Bounded_Packet_Relay_Driver<TQ>::send_period (u_long sp)
{
send_period_ = sp;
}
// Get limit on the duration of the transmission (usec).
template <class TQ> u_long
Bounded_Packet_Relay_Driver<TQ>::duration_limit (void)
{
return duration_limit_;
}
// Set limit on the duration of the transmission (usec).
template <class TQ> void
Bounded_Packet_Relay_Driver<TQ>::duration_limit (u_long dl)
{
duration_limit_ = dl;
}
// Get logging level.
template <class TQ> int
Bounded_Packet_Relay_Driver<TQ>::logging_level (void)
{
return logging_level_;
}
// Set logging level.
template <class TQ> void
Bounded_Packet_Relay_Driver<TQ>::logging_level (int ll)
{
logging_level_ = ll;
}
#endif /* _BPR_DRIVER_T_CPP_ */
|