00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024 #include "config.h"
00025
00026 #include <cstring>
00027
00028 #include <scalestack/echo/flood/flood.h>
00029 #include <scalestack/echo/flood/stream.h>
00030 #include <scalestack/echo/flood/stream_service.h>
00031 #include <scalestack/kernel/module.h>
00032 #include <scalestack/kernel/option.h>
00033
00034 namespace scalestack
00035 {
00036 namespace echo
00037 {
00038 namespace flood
00039 {
00040
00041
00042
00043
00044
00045 stream::stream(stream_service& stream_service):
00046 network::stream(stream_service.get_module()),
00047 _flush(_module.get_option("flush").get_bool_value()),
00048 _iterations(_module.get_option("iterations").get_size_value()),
00049 _write_size(_module.get_option("write_size").get_size_value()),
00050 _read_offset(),
00051 _write_offset(),
00052 _stream_service(stream_service)
00053 {
00054 }
00055
00056 stream::~stream()
00057 {
00058 _stream_service.remove_stream();
00059 }
00060
00061 void stream::connected(void)
00062 {
00063 flush_write();
00064 }
00065
00066 size_t stream::read(uint8_t* buffer, size_t size)
00067 {
00068 if (memcmp(random_buffer + _read_offset, buffer, size))
00069 _module.log_fatal(_("Read data did not match what was sent"));
00070
00071 _read_offset += size;
00072
00073 if (_read_offset == random_buffer_size)
00074 {
00075 if (_iterations == 0 || --_iterations > 0)
00076 {
00077 _read_offset = 0;
00078 _write_offset = 0;
00079
00080 if (_module.get_option("reconnect").get_bool_value())
00081 reconnect();
00082 else
00083 flush_write();
00084 }
00085 else
00086 stop();
00087 }
00088
00089 return size;
00090 }
00091
00092 void stream::flush_write(void)
00093 {
00094 size_t write_size;
00095 size_t written;
00096 bool flush;
00097
00098 do
00099 {
00100 write_size = random_buffer_size - _write_offset;
00101 if (write_size == 0)
00102 break;
00103 if (_write_size > 0 && _write_size < write_size)
00104 {
00105 write_size = _write_size;
00106 flush = _flush;
00107 }
00108 else
00109 flush = true;
00110
00111 written = write(random_buffer + _write_offset, write_size, flush);
00112 _write_offset += written;
00113 }
00114 while (write_size == written);
00115 }
00116
00117 }
00118 }
00119 }