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/datagram.h>
00029 #include <scalestack/echo/flood/datagram_service.h>
00030 #include <scalestack/echo/flood/flood.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 datagram::datagram(datagram_service& datagram_service):
00046 network::datagram(datagram_service.get_module()),
00047 _iterations(_module.get_option("iterations").get_size_value()),
00048 _packet_size(_module.get_option("packet_size").get_size_value()),
00049 _read_offset(),
00050 _write_offset(),
00051 _datagram_service(datagram_service)
00052 {
00053 }
00054
00055 datagram::~datagram()
00056 {
00057 _datagram_service.remove_datagram();
00058 }
00059
00060 void datagram::started(void)
00061 {
00062 flush_send();
00063 }
00064
00065 size_t datagram::receive(uint8_t* buffer, size_t size, struct sockaddr&,
00066 socklen_t)
00067 {
00068 if (memcmp(random_buffer + _read_offset, buffer, size))
00069 _module.log_fatal(_("Received 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 flush_send();
00080 }
00081 else
00082 stop();
00083 }
00084 else
00085 flush_send();
00086
00087 return size;
00088 }
00089
00090 void datagram::flush_send(void)
00091 {
00092 size_t packet_size;
00093
00094 if (random_buffer_size - _write_offset < _packet_size)
00095 packet_size = random_buffer_size - _write_offset;
00096 else
00097 packet_size = _packet_size;
00098
00099 _write_offset += send(random_buffer + _write_offset, packet_size);
00100 }
00101
00102 }
00103 }
00104 }