Merge lp:~eday/scalestack/network-review into lp:~registry/scalestack/old-trunk

Proposed by Eric Day
Status: Merged
Merged at revision: 55
Proposed branch: lp:~eday/scalestack/network-review
Merge into: lp:~registry/scalestack/old-trunk
Diff against target: 1791 lines (+472/-487)
32 files modified
ScaleStack/Echo/Flood/Datagram.cc (+16/-23)
ScaleStack/Echo/Flood/Datagram.h (+14/-13)
ScaleStack/Echo/Flood/Flood.h (+2/-8)
ScaleStack/Echo/Flood/Stream.cc (+8/-12)
ScaleStack/Echo/Flood/Stream.h (+11/-10)
ScaleStack/Echo/Flood/TCP/TCP.cc (+2/-1)
ScaleStack/Echo/Flood/UDP/Service.cc (+2/-7)
ScaleStack/Echo/Flood/UDP/Service.h (+1/-3)
ScaleStack/Echo/Flood/UDP/UDP.cc (+4/-8)
ScaleStack/Echo/Flood/UnixStream/UnixStream.cc (+2/-1)
ScaleStack/Echo/Flood/plugin.ini (+2/-2)
ScaleStack/Echo/Server/Datagram.cc (+3/-10)
ScaleStack/Echo/Server/Datagram.h (+8/-6)
ScaleStack/Echo/Server/Stream.h (+3/-2)
ScaleStack/Echo/Server/TCP/TCP.cc (+10/-0)
ScaleStack/Echo/Server/UDP/Service.h (+1/-1)
ScaleStack/Echo/Server/UDP/Test/Run.cc (+24/-9)
ScaleStack/Echo/Server/UDP/UDP.cc (+2/-2)
ScaleStack/Echo/Server/plugin.ini (+2/-2)
ScaleStack/Network/Datagram.cc (+69/-51)
ScaleStack/Network/Datagram.h (+88/-56)
ScaleStack/Network/IP/Common.cc (+32/-45)
ScaleStack/Network/IP/Common.h (+19/-22)
ScaleStack/Network/IP/TCP/ConnectionService.cc (+5/-5)
ScaleStack/Network/IP/TCP/ConnectionService.h (+2/-2)
ScaleStack/Network/IP/UDP/Socket.cc (+1/-10)
ScaleStack/Network/IP/UDP/SocketService.cc (+102/-112)
ScaleStack/Network/IP/UDP/SocketService.h (+29/-55)
ScaleStack/Network/StreamService.h (+4/-4)
ScaleStack/Network/Unix/Stream/Connection.h (+1/-2)
ScaleStack/Network/Unix/Stream/ConnectionService.h (+2/-2)
ScaleStack/Network/Unix/Stream/Listener.h (+1/-1)
To merge this branch: bzr merge lp:~eday/scalestack/network-review
Reviewer Review Type Date Requested Status
Christopher Mooney (community) Approve
Review via email: mp+25390@code.launchpad.net

Description of the change

Network/UDP cleanup.

To post a comment you must log in.
Revision history for this message
Christopher Mooney (cmooney) wrote :

Reviewed the diff and it looks sane to me. Ship it!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'ScaleStack/Echo/Flood/Datagram.cc'
2--- ScaleStack/Echo/Flood/Datagram.cc 2010-05-04 08:58:05 +0000
3+++ ScaleStack/Echo/Flood/Datagram.cc 2010-05-16 06:24:29 +0000
4@@ -16,9 +16,9 @@
5 #include "config.h"
6
7 #include <cstring>
8-#include <netdb.h>
9
10 #include <ScaleStack/Echo/Flood/Datagram.h>
11+#include <ScaleStack/Echo/Flood/Flood.h>
12 #include <ScaleStack/Kernel/Core.h>
13 #include <ScaleStack/Kernel/Module.h>
14 #include <ScaleStack/Kernel/Option.h>
15@@ -28,25 +28,19 @@
16 namespace Flood {
17
18 /*
19- * Public functions.
20+ * Public methods.
21 */
22
23-void DatagramOptions(Kernel::Module& module)
24+void Datagram::Options(Kernel::Module& module)
25 {
26 module.addOption("iterations", "Number of iterations to run per datagram, 0 means forever.", "COUNT", "1");
27- module.addOption("count", "Number of concurrent datagrams to open.", "COUNT", "1");
28- module.addOption("send_size", "Size of packets to send.", "SEND_SIZE", "4096");
29+ module.addOption("packet_size", "Size of packets to send.", "SIZE", "4096");
30 }
31
32-/*
33- * Public methods.
34- */
35-
36-Datagram::Datagram(Network::DatagramService& service, struct addrinfo* send_addr):
37+Datagram::Datagram(Network::DatagramService& service):
38 Network::Datagram(service),
39- _send_addr(send_addr),
40- _send_size(_module.getOption("send_size").getSizeValue()),
41 _iterations(_module.getOption("iterations").getSizeValue()),
42+ _packet_size(_module.getOption("packet_size").getSizeValue()),
43 _read_offset(),
44 _write_offset()
45 {
46@@ -61,10 +55,10 @@
47 flushSend();
48 }
49
50-size_t Datagram::recv(uint8_t* buffer, size_t size, struct sockaddr*, socklen_t)
51+size_t Datagram::receive(uint8_t* buffer, size_t size, struct sockaddr&, socklen_t)
52 {
53 if (memcmp(random_buffer + _read_offset, buffer, size))
54- _module.logFatal("Read data did not match what was sent");
55+ _module.logFatal("Received data did not match what was sent");
56
57 _read_offset += size;
58
59@@ -88,15 +82,14 @@
60
61 void Datagram::flushSend(void)
62 {
63- size_t send_size = _send_size;
64-
65- if (random_buffer_size - _write_offset < send_size)
66- send_size = random_buffer_size - _write_offset;
67-
68- _write_offset += send(random_buffer + _write_offset,
69- send_size,
70- _send_addr->ai_addr,
71- _send_addr->ai_addrlen);
72+ size_t packet_size;
73+
74+ if (random_buffer_size - _write_offset < _packet_size)
75+ packet_size = random_buffer_size - _write_offset;
76+ else
77+ packet_size = _packet_size;
78+
79+ _write_offset += send(random_buffer + _write_offset, packet_size);
80 }
81
82 void Datagram::error(void)
83
84=== modified file 'ScaleStack/Echo/Flood/Datagram.h'
85--- ScaleStack/Echo/Flood/Datagram.h 2010-05-03 00:23:08 +0000
86+++ ScaleStack/Echo/Flood/Datagram.h 2010-05-16 06:24:29 +0000
87@@ -16,11 +16,8 @@
88 #ifndef SCALESTACK_ECHO_FLOOD_DATAGRAM_H
89 #define SCALESTACK_ECHO_FLOOD_DATAGRAM_H
90
91-#include <sys/types.h>
92-#include <sys/socket.h>
93 #include <ScaleStack/Common/Macros.h>
94 #include <ScaleStack/Network/Datagram.h>
95-#include <ScaleStack/Echo/Flood/Flood.h>
96
97 namespace ScaleStack {
98 namespace Kernel {
99@@ -33,16 +30,18 @@
100 namespace Flood {
101
102 /**
103- * Add common options for stream services.
104+ * Class for handling datagram requests.
105 */
106-SCALESTACK_API
107-void DatagramOptions(Kernel::Module& module);
108-
109 class SCALESTACK_API Datagram: public Network::Datagram
110 {
111 public:
112
113- Datagram(Network::DatagramService& service, struct addrinfo *send_addr);
114+ /**
115+ * Add common options for datagrams.
116+ */
117+ static void Options(Kernel::Module& module);
118+
119+ Datagram(Network::DatagramService& service);
120
121 ~Datagram();
122
123@@ -52,12 +51,15 @@
124 void ready(void);
125
126 /**
127- * See Network::Datagram::read().
128+ * See Network::Datagram::receive().
129 */
130- size_t recv(uint8_t* buffer, size_t size, struct sockaddr *, socklen_t socklen);
131+ size_t receive(uint8_t* buffer,
132+ size_t size,
133+ struct sockaddr& peer,
134+ socklen_t peer_size);
135
136 /**
137- * See Network::Datagram::flushWrite().
138+ * See Network::Datagram::flushSend().
139 */
140 void flushSend(void);
141
142@@ -78,9 +80,8 @@
143 */
144 Datagram& operator=(const Datagram&);
145
146- struct addrinfo* _send_addr;
147- size_t _send_size;
148 size_t _iterations;
149+ size_t _packet_size;
150 size_t _read_offset;
151 size_t _write_offset;
152 };
153
154=== modified file 'ScaleStack/Echo/Flood/Flood.h'
155--- ScaleStack/Echo/Flood/Flood.h 2010-05-02 23:02:34 +0000
156+++ ScaleStack/Echo/Flood/Flood.h 2010-05-16 06:24:29 +0000
157@@ -10,7 +10,7 @@
158
159 /**
160 * @file
161- * @brief Echo Flood Declarations
162+ * @brief Echo Flood Module Declarations
163 */
164
165 #ifndef SCALESTACK_ECHO_FLOOD_FLOOD_H
166@@ -20,16 +20,10 @@
167 #include <sys/types.h>
168
169 namespace ScaleStack {
170-namespace Kernel {
171-
172-class Module;
173-
174-} /* namespace Kernel */
175-
176 namespace Echo {
177 namespace Flood {
178
179-const size_t random_buffer_size = 8385637;
180+const size_t random_buffer_size = 385637;
181 extern uint8_t random_buffer[random_buffer_size];
182
183 } /* namespace Flood */
184
185=== modified file 'ScaleStack/Echo/Flood/Stream.cc'
186--- ScaleStack/Echo/Flood/Stream.cc 2010-05-02 23:02:34 +0000
187+++ ScaleStack/Echo/Flood/Stream.cc 2010-05-16 06:24:29 +0000
188@@ -17,6 +17,7 @@
189
190 #include <cstring>
191
192+#include <ScaleStack/Echo/Flood/Flood.h>
193 #include <ScaleStack/Echo/Flood/Stream.h>
194 #include <ScaleStack/Kernel/Core.h>
195 #include <ScaleStack/Kernel/Module.h>
196@@ -27,20 +28,15 @@
197 namespace Flood {
198
199 /*
200- * Public functions.
201+ * Public methods.
202 */
203
204-void StreamOptions(Kernel::Module& module)
205+void Stream::Options(Kernel::Module& module)
206 {
207 module.addOption("iterations", "Number of iterations to run per stream, 0 means forever.", "COUNT", "1");
208- module.addOption("count", "Number of concurrent streams to open.", "COUNT", "1");
209 module.addOption("reconnect", "Whether to reconnect between iterations.", "BOOLEAN", "False");
210 }
211
212-/*
213- * Public methods.
214- */
215-
216 Stream::Stream(Network::StreamService& service):
217 Network::Stream(service),
218 _iterations(_module.getOption("iterations").getSizeValue()),
219@@ -53,6 +49,11 @@
220 {
221 }
222
223+void Stream::connected(void)
224+{
225+ flushWrite();
226+}
227+
228 size_t Stream::read(uint8_t* buffer, size_t size)
229 {
230 if (memcmp(random_buffer + _read_offset, buffer, size))
231@@ -86,11 +87,6 @@
232 true);
233 }
234
235-void Stream::connected(void)
236-{
237- flushWrite();
238-}
239-
240 void Stream::error(void)
241 {
242 _module.getCore().shutdown();
243
244=== modified file 'ScaleStack/Echo/Flood/Stream.h'
245--- ScaleStack/Echo/Flood/Stream.h 2010-05-02 23:02:34 +0000
246+++ ScaleStack/Echo/Flood/Stream.h 2010-05-16 06:24:29 +0000
247@@ -18,7 +18,6 @@
248
249 #include <ScaleStack/Common/Macros.h>
250 #include <ScaleStack/Network/Stream.h>
251-#include <ScaleStack/Echo/Flood/Flood.h>
252
253 namespace ScaleStack {
254 namespace Kernel {
255@@ -31,20 +30,27 @@
256 namespace Flood {
257
258 /**
259- * Add common options for stream services.
260+ * Class for handling stream requests.
261 */
262-SCALESTACK_API
263-void StreamOptions(Kernel::Module& module);
264-
265 class SCALESTACK_API Stream: public Network::Stream
266 {
267 public:
268
269+ /**
270+ * Add common options for streams.
271+ */
272+ static void Options(Kernel::Module& module);
273+
274 Stream(Network::StreamService& service);
275
276 ~Stream();
277
278 /**
279+ * See Network::Stream::connected().
280+ */
281+ void connected(void);
282+
283+ /**
284 * See Network::Stream::read().
285 */
286 size_t read(uint8_t* buffer, size_t size);
287@@ -55,11 +61,6 @@
288 void flushWrite(void);
289
290 /**
291- * See Network::Stream::connected().
292- */
293- void connected(void);
294-
295- /**
296 * See Network::Stream::error().
297 */
298 void error(void);
299
300=== modified file 'ScaleStack/Echo/Flood/TCP/TCP.cc'
301--- ScaleStack/Echo/Flood/TCP/TCP.cc 2010-05-01 05:23:39 +0000
302+++ ScaleStack/Echo/Flood/TCP/TCP.cc 2010-05-16 06:24:29 +0000
303@@ -28,7 +28,8 @@
304 {
305 module.addOption("host", "Host to connect to.", "HOST", "localhost");
306 module.addOption("port", "Port to connect to.", "PORT", "7");
307- Echo::Flood::StreamOptions(module);
308+ module.addOption("count", "Number of concurrent connections to open.", "COUNT", "1");
309+ Echo::Flood::Stream::Options(module);
310 }
311
312 static void start(Kernel::Module& module)
313
314=== modified file 'ScaleStack/Echo/Flood/UDP/Service.cc'
315--- ScaleStack/Echo/Flood/UDP/Service.cc 2010-05-02 23:02:34 +0000
316+++ ScaleStack/Echo/Flood/UDP/Service.cc 2010-05-16 06:24:29 +0000
317@@ -15,8 +15,6 @@
318
319 #include "config.h"
320
321-#include <ScaleStack/Kernel/Module.h>
322-#include <ScaleStack/Kernel/Option.h>
323 #include <ScaleStack/Echo/Flood/Datagram.h>
324 #include <ScaleStack/Echo/Flood/UDP/Service.h>
325
326@@ -30,21 +28,18 @@
327 */
328
329 Service::Service(Kernel::Module& module):
330- Network::IP::UDP::SocketService(module),
331- _send_addr(getaddrinfo(module.getOption("host").getValue(),
332- module.getOption("port").getValue()))
333+ Network::IP::UDP::SocketService(module)
334 {
335 }
336
337 Service::~Service()
338 {
339- freeaddrinfo(_send_addr);
340 shutdown();
341 }
342
343 Network::Datagram* Service::addDatagram(void)
344 {
345- return new Datagram(*this, _send_addr);
346+ return new Datagram(*this);
347 }
348
349 void Service::removeDatagram(Network::Datagram* datagram)
350
351=== modified file 'ScaleStack/Echo/Flood/UDP/Service.h'
352--- ScaleStack/Echo/Flood/UDP/Service.h 2010-05-02 23:02:34 +0000
353+++ ScaleStack/Echo/Flood/UDP/Service.h 2010-05-16 06:24:29 +0000
354@@ -39,7 +39,7 @@
355 /**
356 * See Network::DatagramService::removeDatagram().
357 */
358- void removeDatagram(Network::Datagram* stream);
359+ void removeDatagram(Network::Datagram* datagram);
360
361 private:
362
363@@ -52,8 +52,6 @@
364 * Don't allow assignment of objects.
365 */
366 Service& operator=(const Service&);
367-
368- struct addrinfo* _send_addr;
369 };
370
371 } /* namespace UDP */
372
373=== modified file 'ScaleStack/Echo/Flood/UDP/UDP.cc'
374--- ScaleStack/Echo/Flood/UDP/UDP.cc 2010-05-04 01:00:14 +0000
375+++ ScaleStack/Echo/Flood/UDP/UDP.cc 2010-05-16 06:24:29 +0000
376@@ -26,9 +26,9 @@
377
378 static void options(Kernel::Module& module)
379 {
380- module.addOption("host", "Host to send to.", "HOST", "localhost");
381- module.addOption("port", "Port to send to.", "PORT", "7");
382- Echo::Flood::DatagramOptions(module);
383+ Network::IP::UDP::SocketService::Options(module, ":7");
384+ module.addOption("count", "Number of concurrent sockets to open.", "COUNT", "1");
385+ Echo::Flood::Datagram::Options(module);
386 }
387
388 static void start(Kernel::Module& module)
389@@ -53,17 +53,13 @@
390 static void run(Kernel::Module& module)
391 {
392 Echo::Flood::UDP::Service& service = static_cast<Echo::Flood::UDP::Service&>(module.getCore().getService("Echo::Flood::UDP"));
393- struct addrinfo *addrinfo = service.getaddrinfo("0.0.0.0", "0"); /* random port */
394
395 for (int count = module.getOption("count").getIntValue();
396 count != 0;
397 --count)
398 {
399- /* bind to random local port */
400- service.addSocket(addrinfo);
401+ service.addSocketWithPeer();
402 }
403-
404- service.freeaddrinfo(addrinfo);
405 }
406
407 SCALESTACK_KERNEL_MODULE(options, start, stop, run, NULL);
408
409=== modified file 'ScaleStack/Echo/Flood/UnixStream/UnixStream.cc'
410--- ScaleStack/Echo/Flood/UnixStream/UnixStream.cc 2010-05-01 05:23:39 +0000
411+++ ScaleStack/Echo/Flood/UnixStream/UnixStream.cc 2010-05-16 06:24:29 +0000
412@@ -27,7 +27,8 @@
413 static void options(Kernel::Module& module)
414 {
415 module.addOption("unix_socket", "Unix socket to connect to.", "SOCKET", "/tmp/echoserver.socket");
416- Echo::Flood::StreamOptions(module);
417+ module.addOption("count", "Number of concurrent connections to open.", "COUNT", "1");
418+ Echo::Flood::Stream::Options(module);
419 }
420
421 static void start(Kernel::Module& module)
422
423=== modified file 'ScaleStack/Echo/Flood/plugin.ini'
424--- ScaleStack/Echo/Flood/plugin.ini 2010-05-02 23:02:34 +0000
425+++ ScaleStack/Echo/Flood/plugin.ini 2010-05-16 06:24:29 +0000
426@@ -4,6 +4,6 @@
427 version=0.1
428 author=Eric Day <eday@oddments.org>
429 license=BSD
430-sources=Flood.cc Stream.cc Datagram.cc
431-headers=Stream.h Datagram.h
432+sources=Datagram.cc Flood.cc Stream.cc
433+headers=Datagram.h Flood.h Stream.h
434 dependencies=Network
435
436=== modified file 'ScaleStack/Echo/Server/Datagram.cc'
437--- ScaleStack/Echo/Server/Datagram.cc 2010-05-03 04:56:24 +0000
438+++ ScaleStack/Echo/Server/Datagram.cc 2010-05-16 06:24:29 +0000
439@@ -15,8 +15,6 @@
440
441 #include "config.h"
442
443-#include <string.h>
444-#include <ScaleStack/Kernel/Module.h>
445 #include <ScaleStack/Echo/Server/Datagram.h>
446
447 namespace ScaleStack {
448@@ -30,9 +28,7 @@
449 Datagram::Datagram(Network::DatagramService& service):
450 Network::Datagram(service),
451 _size(),
452- _buffer(),
453- _sockaddr(),
454- _socklen(0)
455+ _buffer()
456 {
457 }
458
459@@ -40,13 +36,10 @@
460 {
461 }
462
463-size_t Datagram::recv(uint8_t* buffer, size_t size, struct sockaddr *sockaddr, socklen_t socklen)
464+size_t Datagram::receive(uint8_t* buffer, size_t size, struct sockaddr&, socklen_t)
465 {
466 _size = size;
467 _buffer = buffer;
468- _sockaddr = sockaddr;
469- _socklen = socklen;
470-
471 return _echo();
472 }
473
474@@ -61,7 +54,7 @@
475
476 size_t Datagram::_echo(void)
477 {
478- return send(_buffer, _size, _sockaddr, _socklen);
479+ return send(_buffer, _size);
480 }
481
482 } /* namespace Server */
483
484=== modified file 'ScaleStack/Echo/Server/Datagram.h'
485--- ScaleStack/Echo/Server/Datagram.h 2010-05-03 04:56:24 +0000
486+++ ScaleStack/Echo/Server/Datagram.h 2010-05-16 06:24:29 +0000
487@@ -32,9 +32,12 @@
488 ~Datagram();
489
490 /**
491- * See Network::Datagram::recv().
492+ * See Network::Datagram::receive().
493 */
494- size_t recv(uint8_t* buffer, size_t size, struct sockaddr *sockaddr, socklen_t socklen);
495+ size_t receive(uint8_t* buffer,
496+ size_t size,
497+ struct sockaddr& peer,
498+ socklen_t peer_size);
499
500 /**
501 * See Network::Datagram::flushSend().
502@@ -54,15 +57,14 @@
503 Datagram& operator=(const Datagram&);
504
505 /**
506- * Echo the data back to the stream by writing any data that was
507- * read. This is used by both the read() and flushWrite() methods.
508+ * Echo the data received back to the sender. This is used by both the
509+ * receive() and flushSend() methods.
510 */
511+ SCALESTACK_LOCAL
512 size_t _echo(void);
513
514 size_t _size;
515 uint8_t* _buffer;
516- struct sockaddr* _sockaddr;
517- socklen_t _socklen;
518 };
519
520 } /* namespace Server */
521
522=== modified file 'ScaleStack/Echo/Server/Stream.h'
523--- ScaleStack/Echo/Server/Stream.h 2010-05-01 05:23:39 +0000
524+++ ScaleStack/Echo/Server/Stream.h 2010-05-16 06:24:29 +0000
525@@ -54,9 +54,10 @@
526 Stream& operator=(const Stream&);
527
528 /**
529- * Echo the data back to the stream by writing any data that was
530- * read. This is used by both the read() and flushWrite() methods.
531+ * Echo the data read back to the client. This is used by both the read()
532+ * and flushWrite() methods.
533 */
534+ SCALESTACK_LOCAL
535 size_t _echo(void);
536
537 size_t _size;
538
539=== modified file 'ScaleStack/Echo/Server/TCP/TCP.cc'
540--- ScaleStack/Echo/Server/TCP/TCP.cc 2010-04-29 07:39:49 +0000
541+++ ScaleStack/Echo/Server/TCP/TCP.cc 2010-05-16 06:24:29 +0000
542@@ -33,6 +33,16 @@
543 try
544 {
545 module.getCore().addService("Echo::Server::TCP", service);
546+
547+ try
548+ {
549+ //service->addListeners();
550+ }
551+ catch (exception&)
552+ {
553+ module.getCore().removeService("Echo::Server::TCP");
554+ throw;
555+ }
556 }
557 catch (exception&)
558 {
559
560=== modified file 'ScaleStack/Echo/Server/UDP/Service.h'
561--- ScaleStack/Echo/Server/UDP/Service.h 2010-05-02 23:02:34 +0000
562+++ ScaleStack/Echo/Server/UDP/Service.h 2010-05-16 06:24:29 +0000
563@@ -39,7 +39,7 @@
564 /**
565 * See Network::DatagramService::removeDatagram().
566 */
567- void removeDatagram(Network::Datagram* stream);
568+ void removeDatagram(Network::Datagram* datagram);
569
570 private:
571
572
573=== modified file 'ScaleStack/Echo/Server/UDP/Test/Run.cc'
574--- ScaleStack/Echo/Server/UDP/Test/Run.cc 2010-05-04 01:00:14 +0000
575+++ ScaleStack/Echo/Server/UDP/Test/Run.cc 2010-05-16 06:24:29 +0000
576@@ -15,17 +15,32 @@
577
578 #include <ScaleStack/Common/Test.h>
579
580+static const char* test_hosts = "127.0.0.1:32123";
581+
582 TEST_SUITE_BEGIN
583
584-TEST_BEGIN(TestEchoServer)
585- const char* test_port = "32123";
586- const char* test_host = "127.0.0.1";
587- const char* test_hostport = "127.0.0.1:32123";
588-
589- core.addModuleOptionValue("Event::Service", "", TEST_EVENT_SERVICE);
590- core.addModuleOptionValue("Echo::Server::UDP", "udp_hosts", test_hostport);
591- core.addModuleOptionValue("Echo::Flood::UDP", "port", test_port);
592- core.addModuleOptionValue("Echo::Flood::UDP", "host", test_host);
593+TEST_BEGIN(default)
594+ core.addModuleOptionValue("Event::Service", "", TEST_EVENT_SERVICE);
595+ core.addModuleOptionValue("Echo::Server::UDP", "hosts", test_hosts);
596+ core.addModuleOptionValue("Echo::Flood::UDP", "hosts", test_hosts);
597+ core.setSignalHandlers();
598+ core.run();
599+TEST_END
600+
601+TEST_BEGIN(iterations)
602+ core.addModuleOptionValue("Event::Service", "", TEST_EVENT_SERVICE);
603+ core.addModuleOptionValue("Echo::Server::UDP", "hosts", test_hosts);
604+ core.addModuleOptionValue("Echo::Flood::UDP", "hosts", test_hosts);
605+ core.addModuleOptionValue("Echo::Flood::UDP", "iterations", "5");
606+ core.setSignalHandlers();
607+ core.run();
608+TEST_END
609+
610+TEST_BEGIN(packet_size)
611+ core.addModuleOptionValue("Event::Service", "", TEST_EVENT_SERVICE);
612+ core.addModuleOptionValue("Echo::Server::UDP", "hosts", test_hosts);
613+ core.addModuleOptionValue("Echo::Flood::UDP", "hosts", test_hosts);
614+ core.addModuleOptionValue("Echo::Flood::UDP", "packet_size", "16384");
615 core.setSignalHandlers();
616 core.run();
617 TEST_END
618
619=== modified file 'ScaleStack/Echo/Server/UDP/UDP.cc'
620--- ScaleStack/Echo/Server/UDP/UDP.cc 2010-05-04 08:58:05 +0000
621+++ ScaleStack/Echo/Server/UDP/UDP.cc 2010-05-16 06:24:29 +0000
622@@ -25,7 +25,7 @@
623
624 static void options(Kernel::Module& module)
625 {
626- Network::IP::UDP::SocketOptions(module, "7");
627+ Network::IP::UDP::SocketService::Options(module, ":7");
628 }
629
630 static void start(Kernel::Module& module)
631@@ -37,7 +37,7 @@
632
633 try
634 {
635- service->processSocketOptions();
636+ service->addSockets();
637 }
638 catch (exception&)
639 {
640
641=== modified file 'ScaleStack/Echo/Server/plugin.ini'
642--- ScaleStack/Echo/Server/plugin.ini 2010-05-02 23:02:34 +0000
643+++ ScaleStack/Echo/Server/plugin.ini 2010-05-16 06:24:29 +0000
644@@ -4,6 +4,6 @@
645 version=0.1
646 author=Eric Day <eday@oddments.org>
647 license=BSD
648-sources=Server.cc Stream.cc Datagram.cc
649-headers=Stream.h Datagram.h
650+sources=Datagram.cc Server.cc Stream.cc
651+headers=Datagram.h Stream.h
652 dependencies=Network
653
654=== modified file 'ScaleStack/Network/Datagram.cc'
655--- ScaleStack/Network/Datagram.cc 2010-05-04 08:58:05 +0000
656+++ ScaleStack/Network/Datagram.cc 2010-05-16 06:24:29 +0000
657@@ -36,11 +36,11 @@
658 DatagramProvider::DatagramProvider(Event::Service& service):
659 Event::Handler(service),
660 _file_descriptor(-1),
661- _peer_address_size(),
662- _recv_buffer_size(),
663+ _peer_size(),
664+ _receive_buffer_size(),
665 _datagram(NULL),
666- _peer_address(reinterpret_cast<struct sockaddr*>(&_peer_address_storage)),
667- _peer_address_storage()
668+ _peer(reinterpret_cast<struct sockaddr*>(&_peer_storage)),
669+ _peer_storage()
670 {
671 }
672
673@@ -63,51 +63,60 @@
674 watchRead();
675 }
676
677-void DatagramProvider::consume(size_t size)
678-{
679- _consume(size);
680-}
681-
682-void DatagramProvider::bind(const struct addrinfo& address)
683-{
684- int file_descriptor = socket(address.ai_family,
685- address.ai_socktype,
686- address.ai_protocol);
687+void DatagramProvider::create(int family)
688+{
689+ int file_descriptor = socket(family, SOCK_DGRAM, 0);
690 if (file_descriptor == -1)
691 _module.logFatal("Error creating datagram socket: %d", errno);
692
693- int return_code = ::bind(file_descriptor,
694- address.ai_addr,
695- address.ai_addrlen);
696+ setFileDescriptor(file_descriptor);
697+}
698+
699+void DatagramProvider::bind(const struct sockaddr& address,
700+ socklen_t address_size)
701+{
702+ create(address.sa_family);
703+
704+ int return_code = ::bind(_file_descriptor, &address, address_size);
705 if (return_code == -1)
706 {
707- close(file_descriptor);
708-
709 if (errno == EADDRINUSE)
710 _module.logFatal("Bind failed, address already in use");
711
712 _module.logFatal("Error binding datagram socket, bind: %d", errno);
713 }
714-
715- setFileDescriptor(file_descriptor);
716+}
717+
718+void DatagramProvider::setPeer(const struct sockaddr& peer, socklen_t peer_size)
719+{
720+ memcpy(_peer, &peer, peer_size);
721+ _peer_size = peer_size;
722+}
723+
724+void DatagramProvider::consume(size_t size)
725+{
726+ _consume(size);
727 }
728
729 size_t DatagramProvider::send(uint8_t* buffer,
730 size_t size,
731- const sockaddr* peer_address,
732- socklen_t peer_address_size)
733+ const struct sockaddr& peer,
734+ socklen_t peer_size)
735 {
736 if (size == 0)
737 return 0;
738
739- ssize_t written = ::sendto(_file_descriptor, buffer, size, 0,
740- peer_address, peer_address_size);
741-
742+ ssize_t written = ::sendto(_file_descriptor,
743+ buffer,
744+ size,
745+ 0,
746+ &peer,
747+ peer_size);
748 if (written > 0)
749 {
750 if (written != static_cast<ssize_t>(size))
751 {
752- _module.logFatal("Datagram sendto() returned %d, but tried to send %d",
753+ _module.logError("Datagram sendto() returned %d, but tried to send %d",
754 written, size);
755 error();
756 return 0;
757@@ -121,9 +130,7 @@
758 }
759
760 if (written == 0)
761- {
762 return 0;
763- }
764
765 if (errno == EAGAIN)
766 {
767@@ -134,7 +141,15 @@
768 _module.logError("Datagram sendto() returned %d", errno);
769 error();
770 return 0;
771-}
772+}
773+
774+size_t DatagramProvider::send(uint8_t* buffer, size_t size)
775+{
776+ if (_peer_size == 0)
777+ _module.logFatal("No peer address was set.");
778+
779+ return send(buffer, size, *_peer, _peer_size);
780+}
781
782 void DatagramProvider::run(void)
783 {
784@@ -143,36 +158,36 @@
785
786 void DatagramProvider::readReady(int)
787 {
788- if (_recv_buffer_size > 0)
789+ if (_receive_buffer_size > 0)
790 {
791- /* Can only buffer a single packet, and we alrecvy have one */
792+ /* Can only buffer a single packet, and we already have one */
793 return;
794 }
795
796- _peer_address_size = sizeof(_peer_address_storage);
797+ _peer_size = sizeof(_peer_storage);
798
799 ssize_t return_size = ::recvfrom(_file_descriptor,
800- _recv_buffer, _recv_buffer_max_size, 0,
801- _peer_address, &_peer_address_size);
802+ _receive_buffer, _receive_buffer_max_size, 0,
803+ _peer, &_peer_size);
804
805 if (return_size > 0)
806 {
807 _module.logDebug("Recved %d bytes", return_size);
808
809- _recv_buffer_size = static_cast<size_t>(return_size);
810-
811- _consume(recv(_recv_buffer, _recv_buffer_size, _peer_address, _peer_address_size));
812-
813- if (_recv_buffer_size == 0)
814+ _receive_buffer_size = static_cast<size_t>(return_size);
815+
816+ _consume(receive(_receive_buffer, _receive_buffer_size, *_peer, _peer_size));
817+
818+ if (_receive_buffer_size == 0)
819 {
820 return;
821 }
822
823- if (_recv_buffer_size != static_cast<size_t>(return_size))
824+ if (_receive_buffer_size != static_cast<size_t>(return_size))
825 {
826- /* caller must consume all or none of the recv buffer */
827+ /* caller must consume all or none of the receive buffer */
828
829- _module.logFatal("Caller consumed partial datagram recv buffer");
830+ _module.logFatal("Caller consumed partial datagram receive buffer");
831 return;
832 }
833
834@@ -212,16 +227,19 @@
835 if (size == 0)
836 return;
837
838- if (size != _recv_buffer_size)
839+ if (size > _receive_buffer_size)
840 {
841- _module.logFatal("Tried to consume incorrect size on recv buffer for datagram socket");
842+ _module.logError("Consumed more data than is in buffer: %u > %u",
843+ size, _receive_buffer_size);
844 error();
845- return;
846- }
847-
848- _recv_buffer_size = 0;
849-
850- watchRead();
851+ }
852+ else if (size == _receive_buffer_size)
853+ {
854+ _receive_buffer_size = 0;
855+ watchRead();
856+ }
857+ else
858+ _receive_buffer_size -= size;
859 }
860
861 } /* namespace Network */
862
863=== modified file 'ScaleStack/Network/Datagram.h'
864--- ScaleStack/Network/Datagram.h 2010-05-04 08:58:05 +0000
865+++ ScaleStack/Network/Datagram.h 2010-05-16 06:24:29 +0000
866@@ -24,8 +24,6 @@
867 #include <ScaleStack/Event/Handler.h>
868 #include <ScaleStack/Network/DatagramService.h>
869
870-struct addrinfo;
871-
872 namespace ScaleStack {
873 namespace Kernel {
874
875@@ -62,20 +60,20 @@
876 *
877 * @param[in] buffer Data that was read.
878 * @param[in] size Size of data available in buffer.
879- * @param[in] peer_address Socket address received from.
880- * @param[in] peer_address_size Socket address length.
881+ * @param[in] peer Socket address the packet was received from.
882+ * @param[in] peer_size Socket address length.
883 * @return Amount of data that was consumed.
884 */
885- virtual size_t recv(uint8_t* buffer,
886- size_t size,
887- struct sockaddr* peer_address,
888- socklen_t peer_address_size) = 0;
889+ virtual size_t receive(uint8_t* buffer,
890+ size_t size,
891+ struct sockaddr& peer,
892+ socklen_t peer_size) = 0;
893
894 /**
895- * Notify the connection that the recv buffer has been consumed.
896- * This is required after a recv() call was not able to consume
897+ * Notify the connection that the receive buffer has been consumed.
898+ * This is required after a receive() call was not able to consume
899 * all the data. This can be called at a later time to remove the data
900- * from the read buffer, such as in flushSend(). After the recv buffer
901+ * from the read buffer, such as in flushSend(). After the receive buffer
902 * has been flushed, the connection will start watching for new data.
903 *
904 * @param[in] size The amount of data to consume.
905@@ -88,14 +86,24 @@
906 *
907 * @param[in] buffer Buffer to write.
908 * @param[in] size Size of buffer.
909- * @param[in] peer_address Socket address to send to.
910- * @param[in] peer_address_size Socket address length.
911+ * @param[in] peer Socket address to send to.
912+ * @param[in] peer_size Socket address length.
913 * @return Amount of data sent.
914 */
915 size_t send(uint8_t* buffer,
916 size_t size,
917- const struct sockaddr* peer_address,
918- socklen_t peer_address_size);
919+ const struct sockaddr& peer,
920+ socklen_t peer_size);
921+
922+ /**
923+ * Same as send(), but use the default peer address this datagram was
924+ * created with.
925+ *
926+ * @param[in] buffer Buffer to write.
927+ * @param[in] size Size of buffer.
928+ * @return Amount of data sent.
929+ */
930+ size_t send(uint8_t* buffer, size_t size);
931
932 /**
933 * This is called to notify derived classes that they should trying sending
934@@ -192,37 +200,56 @@
935 virtual void setFileDescriptor(int file_descriptor);
936
937 /**
938+ * Create the socket using a random local address.
939+ */
940+ void create(int family);
941+
942+ /**
943+ * Create the socket and bind to a specific local address.
944+ *
945+ * @param[in] address Address to bind to.
946+ * @param[in] address_size Size of the address structure.
947+ */
948+ void bind(const struct sockaddr& address, socklen_t address_size);
949+
950+ /**
951+ * Set the initial peer address for sending packets.
952+ *
953+ * @param[in] peer Peer address to set.
954+ * @param[in] peer_size Size of peer address structure.
955+ */
956+ void setPeer(const struct sockaddr& peer, socklen_t peer_size);
957+
958+ /**
959 * See Datagram::ready().
960 */
961 void ready(void);
962
963 /**
964- * See Datagram::recv().
965- */
966- size_t recv(uint8_t* buffer,
967- size_t size,
968- struct sockaddr *peer_address,
969- socklen_t peer_address_size);
970-
971- /**
972- * Create and bind a datagram socket.
973- *
974- * @param[in] address Address to bind.
975- */
976- void bind(const struct addrinfo& addrinfo);
977+ * See Datagram::receive().
978+ */
979+ size_t receive(uint8_t* buffer,
980+ size_t size,
981+ struct sockaddr& peer,
982+ socklen_t peer_size);
983
984 /**
985 * See Datagram::consume().
986 */
987- virtual void consume(size_t size);
988-
989- /**
990- * See Datagram::send().
991- */
992- virtual size_t send(uint8_t* buffer,
993- size_t size,
994- const struct sockaddr* peer_address,
995- socklen_t peer_address_size);
996+ void consume(size_t size);
997+
998+ /**
999+ * See Datagram::send().
1000+ */
1001+ size_t send(uint8_t* buffer,
1002+ size_t size,
1003+ const struct sockaddr& peer,
1004+ socklen_t peer_size);
1005+
1006+ /**
1007+ * See Datagram::send().
1008+ */
1009+ size_t send(uint8_t* buffer, size_t size);
1010
1011 /**
1012 * See Datagram::flushSend().
1013@@ -263,8 +290,8 @@
1014 DatagramProvider& operator=(const DatagramProvider&);
1015
1016 /**
1017- * This will recv data from the connection into the buffer and call
1018- * recv(). This implements a method in the base class so does not have
1019+ * This will receive data from the connection into the buffer and call
1020+ * receive(). This implements a method in the base class so does not have
1021 * the _ prefix.
1022 *
1023 * @param[in] file_descriptor File descriptor to read data on.
1024@@ -280,23 +307,23 @@
1025 void writeReady(int file_descriptor);
1026
1027 /**
1028- * Perform the recv buffer consumption, used by both readReady() and
1029- * consume().
1030+ * Perform the receive buffer consumption, used by both readReady()
1031+ * and consume().
1032 *
1033 * @param[in] size Amount of buffer to consume.
1034 */
1035 SCALESTACK_LOCAL
1036 void _consume(size_t size);
1037
1038- static const size_t _recv_buffer_max_size = 64 * 1024; /* max Datagram size */
1039+ static const size_t _receive_buffer_max_size = 64 * 1024; /* max datagram size */
1040
1041 int _file_descriptor;
1042- socklen_t _peer_address_size;
1043- size_t _recv_buffer_size;
1044+ socklen_t _peer_size;
1045+ size_t _receive_buffer_size;
1046 Datagram* _datagram;
1047- struct sockaddr* _peer_address;
1048- struct sockaddr_storage _peer_address_storage;
1049- uint8_t _recv_buffer[_recv_buffer_max_size];
1050+ struct sockaddr* _peer;
1051+ struct sockaddr_storage _peer_storage;
1052+ uint8_t _receive_buffer[_receive_buffer_max_size];
1053 };
1054
1055 /*
1056@@ -325,10 +352,15 @@
1057
1058 inline size_t Datagram::send(uint8_t* buffer,
1059 size_t size,
1060- const struct sockaddr* peer_address,
1061- socklen_t peer_address_size)
1062-{
1063- return _datagram_provider->send(buffer, size, peer_address, peer_address_size);
1064+ const struct sockaddr& peer,
1065+ socklen_t peer_size)
1066+{
1067+ return _datagram_provider->send(buffer, size, peer, peer_size);
1068+}
1069+
1070+inline size_t Datagram::send(uint8_t* buffer, size_t size)
1071+{
1072+ return _datagram_provider->send(buffer, size);
1073 }
1074
1075 inline void Datagram::remove(void)
1076@@ -379,12 +411,12 @@
1077 _datagram->ready();
1078 }
1079
1080-inline size_t DatagramProvider::recv(uint8_t* buffer,
1081- size_t size,
1082- struct sockaddr* peer_address,
1083- socklen_t peer_address_size)
1084+inline size_t DatagramProvider::receive(uint8_t* buffer,
1085+ size_t size,
1086+ struct sockaddr& peer,
1087+ socklen_t peer_size)
1088 {
1089- return _datagram->recv(buffer, size, peer_address, peer_address_size);
1090+ return _datagram->receive(buffer, size, peer, peer_size);
1091 }
1092
1093 inline void DatagramProvider::flushSend(void)
1094
1095=== modified file 'ScaleStack/Network/IP/Common.cc'
1096--- ScaleStack/Network/IP/Common.cc 2010-05-04 08:58:05 +0000
1097+++ ScaleStack/Network/IP/Common.cc 2010-05-16 06:24:29 +0000
1098@@ -15,13 +15,10 @@
1099
1100 #include "config.h"
1101
1102-#include <vector>
1103-#include <cerrno>
1104-#include <cstring>
1105-#include <sys/types.h> /* Must be before socket headers for FreeBSD. */
1106+#include <exception>
1107+#include <netdb.h>
1108 #include <sys/socket.h>
1109-#include <netdb.h>
1110-#include <unistd.h>
1111+#include <sys/types.h>
1112
1113 #include <ScaleStack/Kernel/Module.h>
1114 #include <ScaleStack/Network/IP/Common.h>
1115@@ -44,49 +41,39 @@
1116 {
1117 }
1118
1119-void Common::processHostsandPorts(vector<pair<string,string>> hosts,
1120- vector<string> ports,
1121- const struct addrinfo* addrinfo_options)
1122+void Common::parseHosts(Kernel::Module& module,
1123+ const std::vector<std::pair<std::string,std::string> >& hosts,
1124+ const struct addrinfo& address_options,
1125+ bool local_only)
1126 {
1127- for (vector<pair<string,string> >::iterator host = hosts.begin();
1128+ for (vector<pair<string,string> >::const_iterator host = hosts.begin();
1129 host != hosts.end();
1130 ++host)
1131 {
1132- if (host->second == "")
1133- {
1134- for (vector<string>::iterator port = ports.begin();
1135- port != ports.end();
1136- ++port)
1137- {
1138- _processAddrinfo(host->first, *port, addrinfo_options);
1139- }
1140- }
1141- else
1142- _processAddrinfo(host->first, host->second, addrinfo_options);
1143- }
1144-}
1145-
1146-/*
1147- * Private methods.
1148- */
1149-
1150-void Common::_processAddrinfo(string host, string port,
1151- const struct addrinfo* addrinfo_options)
1152-{
1153- struct addrinfo* addrinfo;
1154-
1155- int return_code = ::getaddrinfo(host == "" ? NULL : host.c_str(),
1156- port.c_str(),
1157- addrinfo_options,
1158- &addrinfo);
1159- if (return_code != 0)
1160- {
1161- ScaleStack::Common::Exception("Error doing getaddrinfo: %s", gai_strerror(return_code));
1162- }
1163-
1164- processAddrinfo(addrinfo);
1165-
1166- freeaddrinfo(addrinfo);
1167+ struct addrinfo* address_list;
1168+
1169+ int return_code = ::getaddrinfo(host->first == "" ? NULL : host->first.c_str(),
1170+ host->second == "" ? NULL : host->second.c_str(),
1171+ &address_options,
1172+ &address_list);
1173+ if (return_code != 0)
1174+ module.logFatal("Failed getaddrinfo: %s", gai_strerror(return_code));
1175+
1176+ try
1177+ {
1178+ if (local_only)
1179+ addAddressList(address_list, NULL);
1180+ else
1181+ addAddressList(NULL, address_list);
1182+ }
1183+ catch (exception&)
1184+ {
1185+ freeaddrinfo(address_list);
1186+ throw;
1187+ }
1188+
1189+ freeaddrinfo(address_list);
1190+ }
1191 }
1192
1193 } /* namespace IP */
1194
1195=== modified file 'ScaleStack/Network/IP/Common.h'
1196--- ScaleStack/Network/IP/Common.h 2010-05-04 08:58:05 +0000
1197+++ ScaleStack/Network/IP/Common.h 2010-05-16 06:24:29 +0000
1198@@ -16,24 +16,23 @@
1199 #ifndef SCALESTACK_NETWORK_IP_COMMON_H
1200 #define SCALESTACK_NETWORK_IP_COMMON_H
1201
1202+#include <string>
1203 #include <vector>
1204-#include <stdint.h>
1205-#include <string>
1206-#include <sys/types.h>
1207-#include <sys/socket.h>
1208-#include <netdb.h>
1209
1210 #include <ScaleStack/Common/Macros.h>
1211 #include <ScaleStack/Event/Handler.h>
1212
1213+struct addrinfo;
1214+
1215 namespace ScaleStack {
1216 namespace Network {
1217+
1218+class Module;
1219+
1220+} /* namespace Module */
1221+namespace Network {
1222 namespace IP {
1223
1224-/**
1225- * Public functions
1226- */
1227-
1228 class SCALESTACK_API Common
1229 {
1230 public:
1231@@ -42,11 +41,13 @@
1232
1233 virtual ~Common();
1234
1235- void processHostsandPorts(std::vector<std::pair<std::string,std::string>> hosts,
1236- std::vector<std::string> ports,
1237- const struct addrinfo* addrinfo_options);
1238+ void parseHosts(Kernel::Module& module,
1239+ const std::vector<std::pair<std::string,std::string> >& hosts,
1240+ const struct addrinfo& address_options,
1241+ bool local_only);
1242
1243- virtual void processAddrinfo(struct addrinfo* addrinfo);
1244+ virtual void addAddressList(const struct addrinfo* local,
1245+ const struct addrinfo* peer);
1246
1247 private:
1248
1249@@ -61,17 +62,13 @@
1250 */
1251 SCALESTACK_LOCAL
1252 Common& operator=(const Common&);
1253-
1254- /**
1255- * Add a struct addrinfo* for a host:port to addrinfos vector
1256- */
1257- SCALESTACK_LOCAL
1258- void _processAddrinfo(std::string host, std::string port,
1259- const struct addrinfo* addrinfo_options);
1260-
1261 };
1262
1263-inline void Common::processAddrinfo(struct addrinfo*)
1264+/*
1265+ * Public methods.
1266+ */
1267+
1268+inline void Common::addAddressList(const struct addrinfo*, const struct addrinfo*)
1269 {
1270 }
1271
1272
1273=== modified file 'ScaleStack/Network/IP/TCP/ConnectionService.cc'
1274--- ScaleStack/Network/IP/TCP/ConnectionService.cc 2010-05-04 08:58:05 +0000
1275+++ ScaleStack/Network/IP/TCP/ConnectionService.cc 2010-05-16 06:24:29 +0000
1276@@ -42,14 +42,14 @@
1277 }
1278
1279 Network::Stream* ConnectionService::addAccepted(int file_descriptor,
1280- struct sockaddr& peer_address,
1281- socklen_t)
1282+ struct sockaddr& peer,
1283+ socklen_t peer_size)
1284 {
1285 char host_name[NI_MAXHOST];
1286 char port_name[NI_MAXSERV];
1287
1288- int return_code = getnameinfo(&peer_address,
1289- sizeof(struct sockaddr),
1290+ int return_code = getnameinfo(&peer,
1291+ peer_size,
1292 host_name, NI_MAXHOST,
1293 port_name, NI_MAXSERV,
1294 NI_NUMERICHOST | NI_NUMERICSERV);
1295@@ -70,7 +70,7 @@
1296 }
1297
1298 Network::Stream* ConnectionService::addConnect(const std::string& host,
1299- const std::string& port)
1300+ const std::string& port)
1301 {
1302 Connection* connection;
1303 Network::Stream* stream = _addConnection(&connection);
1304
1305=== modified file 'ScaleStack/Network/IP/TCP/ConnectionService.h'
1306--- ScaleStack/Network/IP/TCP/ConnectionService.h 2010-05-03 08:30:52 +0000
1307+++ ScaleStack/Network/IP/TCP/ConnectionService.h 2010-05-16 06:24:29 +0000
1308@@ -41,8 +41,8 @@
1309 * See StreamService::addAccepted().
1310 */
1311 Network::Stream* addAccepted(int file_descriptor,
1312- struct sockaddr& peer_address,
1313- socklen_t peer_address_size);
1314+ struct sockaddr& peer,
1315+ socklen_t peer_size);
1316
1317 /**
1318 * Add a new connection and connect to the given host:port.
1319
1320=== modified file 'ScaleStack/Network/IP/UDP/Socket.cc'
1321--- ScaleStack/Network/IP/UDP/Socket.cc 2010-05-03 00:23:08 +0000
1322+++ ScaleStack/Network/IP/UDP/Socket.cc 2010-05-16 06:24:29 +0000
1323@@ -15,15 +15,6 @@
1324
1325 #include "config.h"
1326
1327-#include <cerrno>
1328-#include <cstring>
1329-#include <sys/types.h> /* Must be before socket headers for FreeBSD. */
1330-#include <netinet/in.h>
1331-#include <netinet/tcp.h>
1332-#include <sys/socket.h>
1333-#include <unistd.h>
1334-
1335-#include <ScaleStack/Kernel/Module.h>
1336 #include <ScaleStack/Network/IP/UDP/Socket.h>
1337 #include <ScaleStack/Network/IP/UDP/SocketService.h>
1338
1339@@ -49,7 +40,7 @@
1340
1341 void Socket::setFileDescriptor(int file_descriptor)
1342 {
1343- /* any setsockopts go here */
1344+ /* Any setsockopts go here. */
1345
1346 Network::DatagramProvider::setFileDescriptor(file_descriptor);
1347 }
1348
1349=== modified file 'ScaleStack/Network/IP/UDP/SocketService.cc'
1350--- ScaleStack/Network/IP/UDP/SocketService.cc 2010-05-04 08:58:05 +0000
1351+++ ScaleStack/Network/IP/UDP/SocketService.cc 2010-05-16 06:24:29 +0000
1352@@ -30,26 +30,18 @@
1353 namespace IP {
1354 namespace UDP {
1355
1356-#define UDP_OPTION_HOSTS_NONE ":NONE"
1357-#define UDP_OPTION_PORTS_NONE ":NONE"
1358-
1359-/*
1360- * Public Functions.
1361- */
1362-
1363-void SocketOptions(Kernel::Module& module, const char* port)
1364-{
1365- module.addOption("udp_hosts", "List of host/port pairs to bind.",
1366- "HOST[:PORT][,HOST[:PORT]]...",
1367- UDP_OPTION_HOSTS_NONE);
1368- module.addOption("udp_ports", "List of ports to bind.", "PORT[,PORT]...",
1369- port);
1370-}
1371-
1372 /*
1373 * Public methods.
1374 */
1375
1376+void SocketService::Options(Kernel::Module& module, const char* hosts)
1377+{
1378+ module.addOption("hosts",
1379+ "List of host/port pairs.",
1380+ "[HOST][:PORT][,[HOST][:PORT]]...",
1381+ hosts);
1382+}
1383+
1384 SocketService::SocketService(Kernel::Module& module):
1385 DatagramService(module)
1386 {
1387@@ -59,106 +51,81 @@
1388 {
1389 }
1390
1391-struct addrinfo* SocketService::getaddrinfo(string host, string port)
1392-{
1393- struct addrinfo *addrinfo_list;
1394- struct addrinfo addrinfo_options;
1395-
1396- memset(&addrinfo_options, 0, sizeof(struct addrinfo));
1397- addrinfo_options.ai_flags = AI_PASSIVE;
1398- addrinfo_options.ai_family = AF_UNSPEC;
1399- addrinfo_options.ai_socktype = SOCK_DGRAM;
1400- addrinfo_options.ai_protocol = IPPROTO_UDP;
1401-
1402- int return_code = ::getaddrinfo(host == "" ? NULL : host.c_str(),
1403- port.c_str(),
1404- &addrinfo_options,
1405- &addrinfo_list);
1406- if (return_code != 0)
1407- {
1408- _module.logFatal("Couldn't getaddrinfo for %s:%s", host.c_str(), port.c_str());
1409- }
1410-
1411- return addrinfo_list;
1412-}
1413-
1414-void SocketService::freeaddrinfo(struct addrinfo *addrinfo)
1415-{
1416- ::freeaddrinfo(addrinfo);
1417-}
1418-
1419-void SocketService::addSocket(struct addrinfo *addrinfo)
1420-{
1421- /* We only require one host:port pair from the list to succeed. */
1422- bool added = false;
1423- for (; addrinfo != NULL; addrinfo = addrinfo->ai_next)
1424- {
1425- try
1426- {
1427- _addSocket(addrinfo);
1428- added = true;
1429- }
1430- catch (exception&)
1431- {
1432- }
1433- }
1434-
1435- if (!added)
1436- {
1437- _module.logFatal("Could not add any UDP sockets");
1438- }
1439-}
1440-
1441-void SocketService::processSocketOptions(void)
1442-{
1443- Kernel::Option& hosts_opt = _module.getOption("udp_hosts");
1444- Kernel::Option& ports_opt = _module.getOption("udp_ports");
1445- vector<pair<string,string> > hosts_list;
1446- vector<string> ports_list;
1447-
1448- if (strcmp(hosts_opt.getValue().c_str(), UDP_OPTION_HOSTS_NONE))
1449- hosts_list = hosts_opt.getHostListValue();
1450-
1451- if (strcmp(ports_opt.getValue().c_str(), UDP_OPTION_PORTS_NONE))
1452- ports_list = ports_opt.getListValue();
1453-
1454- struct addrinfo addrinfo_options;
1455-
1456- memset(&addrinfo_options, 0, sizeof(struct addrinfo));
1457- addrinfo_options.ai_flags = AI_PASSIVE;
1458- addrinfo_options.ai_family = AF_UNSPEC;
1459- addrinfo_options.ai_socktype = SOCK_DGRAM;
1460- addrinfo_options.ai_protocol = IPPROTO_UDP;
1461-
1462- processHostsandPorts(hosts_list, ports_list, &addrinfo_options);
1463+void SocketService::addSockets(void)
1464+{
1465+ struct addrinfo address_options;
1466+
1467+ memset(&address_options, 0, sizeof(struct addrinfo));
1468+ address_options.ai_flags = AI_PASSIVE;
1469+ address_options.ai_family = AF_UNSPEC;
1470+ address_options.ai_socktype = SOCK_DGRAM;
1471+ address_options.ai_protocol = IPPROTO_UDP;
1472+
1473+ parseHosts(_module,
1474+ _module.getOption("hosts").getHostListValue(),
1475+ address_options,
1476+ true);
1477+}
1478+
1479+void SocketService::addSocketWithPeer(void)
1480+{
1481+ struct addrinfo address_options;
1482+
1483+ memset(&address_options, 0, sizeof(struct addrinfo));
1484+ address_options.ai_flags = AI_PASSIVE;
1485+ address_options.ai_family = AF_UNSPEC;
1486+ address_options.ai_socktype = SOCK_DGRAM;
1487+ address_options.ai_protocol = IPPROTO_UDP;
1488+
1489+ parseHosts(_module,
1490+ _module.getOption("hosts").getHostListValue(),
1491+ address_options,
1492+ false);
1493 }
1494
1495 /*
1496 * Private methods.
1497 */
1498
1499-Network::Datagram* SocketService::_addSocket(struct addrinfo *addrinfo)
1500+void SocketService::removeHandler(Event::Handler* handler)
1501+{
1502+ removeDatagram(reinterpret_cast<Socket*>(handler)->getDatagram());
1503+ delete handler;
1504+}
1505+
1506+Network::Datagram* SocketService::_addSocket(const struct addrinfo *local,
1507+ const struct addrinfo *peer)
1508 {
1509 Network::Datagram* datagram = NULL;
1510 Socket* socket = NULL;
1511-
1512 char host_name[NI_MAXHOST];
1513 char port_name[NI_MAXSERV];
1514 int return_code;
1515
1516- return_code = getnameinfo(addrinfo->ai_addr,
1517- addrinfo->ai_addrlen,
1518- host_name, NI_MAXHOST,
1519- port_name, NI_MAXSERV,
1520- NI_NUMERICHOST | NI_NUMERICSERV);
1521+ if (local != NULL)
1522+ {
1523+ return_code = getnameinfo(local->ai_addr,
1524+ local->ai_addrlen,
1525+ host_name, NI_MAXHOST,
1526+ port_name, NI_MAXSERV,
1527+ NI_NUMERICHOST | NI_NUMERICSERV);
1528+ if (return_code == 0)
1529+ _module.logInfo("UDP socket bound to %s:%s", host_name, port_name);
1530+ else
1531+ _module.logInfo("Failed getnameinfo: %s", gai_strerror(return_code));
1532+ }
1533
1534- if (return_code == 0)
1535- {
1536- _module.logInfo("Adding UDP socket bound to %s:%s", host_name, port_name);
1537- }
1538- else
1539- {
1540- _module.logInfo("Adding UDP socket bound to <unknown>");
1541+ if (peer != NULL)
1542+ {
1543+ return_code = getnameinfo(peer->ai_addr,
1544+ peer->ai_addrlen,
1545+ host_name, NI_MAXHOST,
1546+ port_name, NI_MAXSERV,
1547+ NI_NUMERICHOST | NI_NUMERICSERV);
1548+ if (return_code == 0)
1549+ _module.logInfo("UDP socket with peer %s:%s", host_name, port_name);
1550+ else
1551+ _module.logInfo("Failed getnameinfo: %s", gai_strerror(return_code));
1552 }
1553
1554 try
1555@@ -176,21 +143,44 @@
1556 throw;
1557 }
1558
1559- socket->bind(*addrinfo);
1560+ if (local == NULL)
1561+ {
1562+ socket->create(peer->ai_family);
1563+ socket->setPeer(*(peer->ai_addr), peer->ai_addrlen);
1564+ }
1565+ else
1566+ socket->bind(*(local->ai_addr), local->ai_addrlen);
1567+
1568 socket->ready();
1569
1570 return datagram;
1571 }
1572
1573-void SocketService::removeHandler(Event::Handler* handler)
1574-{
1575- removeDatagram(reinterpret_cast<Socket*>(handler)->getDatagram());
1576- delete handler;
1577-}
1578-
1579-void SocketService::processAddrinfo(struct addrinfo *addrinfo)
1580-{
1581- addSocket(addrinfo);
1582+void SocketService::addAddressList(const struct addrinfo* local,
1583+ const struct addrinfo* peer)
1584+{
1585+ if (local == NULL)
1586+ {
1587+ _addSocket(NULL, peer);
1588+ return;
1589+ }
1590+
1591+ /* We only require one local address from the list to succeed. */
1592+ bool added = false;
1593+ for (; local != NULL; local = local->ai_next)
1594+ {
1595+ try
1596+ {
1597+ _addSocket(local, peer);
1598+ added = true;
1599+ }
1600+ catch (exception&)
1601+ {
1602+ }
1603+ }
1604+
1605+ if (!added)
1606+ _module.logFatal("Could not add any UDP sockets");
1607 }
1608
1609 } /* namespace UDP */
1610
1611=== modified file 'ScaleStack/Network/IP/UDP/SocketService.h'
1612--- ScaleStack/Network/IP/UDP/SocketService.h 2010-05-04 01:00:14 +0000
1613+++ ScaleStack/Network/IP/UDP/SocketService.h 2010-05-16 06:24:29 +0000
1614@@ -34,58 +34,33 @@
1615
1616 class Socket;
1617
1618-
1619-/**
1620- * Add common options for binding UDP sockets.
1621- *
1622- * @param[in] module Module that the service is associated with.
1623- * @param[in] port Default port to use.
1624- */
1625-SCALESTACK_API
1626-void SocketOptions(Kernel::Module& module, const char* port);
1627-
1628-
1629 class SCALESTACK_API SocketService: public DatagramService, public Common
1630 {
1631 public:
1632
1633+ /**
1634+ * Add common options for binding UDP sockets.
1635+ *
1636+ * @param[in] module Module that the service is associated with.
1637+ * @param[in] hosts Default hosts to use.
1638+ */
1639+ static void Options(Kernel::Module& module, const char* hosts);
1640+
1641 SocketService(Kernel::Module& module);
1642
1643 virtual ~SocketService();
1644
1645 /**
1646- * Free the addrinfos vector
1647- * @param[in] addrinfos The vector to free.
1648- */
1649- void freeaddrinfos(std::vector<struct addrinfo*> addrinfos);
1650-
1651- /**
1652- * Return a struct addrinfo* from a single host and port
1653- *
1654- * @param[in] host Host part of the address
1655- * @param[in] port Port part of the address
1656- * @return The full address
1657- */
1658- struct addrinfo* getaddrinfo(std::string host, std::string port);
1659-
1660- /**
1661- * Free a struct addrinfo*
1662- */
1663- void freeaddrinfo(struct addrinfo* addrinfo);
1664-
1665- /**
1666- * Create a new UDP socket and bind it.
1667- *
1668- * @param[in] addrinfos A list of addresses to try to to bind
1669- * @param[in] watch_write True if we need to write data immediately
1670- */
1671- void addSocket(struct addrinfo *addrinfo);
1672-
1673- /**
1674- * Process the socket options previously added via
1675- * 'SocketService::SocketOptions'
1676- */
1677- void processSocketOptions(void);
1678+ * Add sockets specified by the 'hosts' variable in the module options
1679+ * and bind to those addresses.
1680+ */
1681+ void addSockets(void);
1682+
1683+ /**
1684+ * Add sockets specified by the 'hosts' variable in the module options
1685+ * and use those addresses as peers.
1686+ */
1687+ void addSocketWithPeer(void);
1688
1689 private:
1690
1691@@ -102,25 +77,24 @@
1692 SocketService& operator=(const SocketService&);
1693
1694 /**
1695- * Create a new UDP socket and bind to the given address.
1696- *
1697- * @param[in] addrinfo Address to bind.
1698- */
1699- SCALESTACK_LOCAL
1700- Network::Datagram* _addSocket(struct addrinfo *addrinfo);
1701-
1702- /**
1703 * See Event::Service::removeHandler().
1704 */
1705 void removeHandler(Event::Handler* handler);
1706
1707 /**
1708- * See Network::IP::Common::processAddrinfo()
1709- * This implements a method from a base class, so it has no leading
1710- * underscore.
1711+ * Create a new UDP socket and bind to the given address.
1712+ *
1713+ * @param[in] local Local address to bind to.
1714+ * @param[in] peer Default peer address to send to.
1715 */
1716- void processAddrinfo(struct addrinfo* addrinfo);
1717+ SCALESTACK_LOCAL
1718+ Network::Datagram* _addSocket(const struct addrinfo *local,
1719+ const struct addrinfo *peer);
1720
1721+ /**
1722+ * See Network::IP::Common::addAddressList().
1723+ */
1724+ void addAddressList(const struct addrinfo* local, const struct addrinfo* peer);
1725 };
1726
1727 } /* namespace UDP */
1728
1729=== modified file 'ScaleStack/Network/StreamService.h'
1730--- ScaleStack/Network/StreamService.h 2010-05-03 08:30:52 +0000
1731+++ ScaleStack/Network/StreamService.h 2010-05-16 06:24:29 +0000
1732@@ -53,13 +53,13 @@
1733 * Add a new stream that has been accepted.
1734 *
1735 * @param[in] file_descriptor File descriptor for the new stream.
1736- * @param[in] peer_address Address information for the remote peer.
1737- * @param[in] peer_address_size Size of peer_address structure.
1738+ * @param[in] peer Address information for the remote peer.
1739+ * @param[in] peer_size Size of peer structure.
1740 * @return Stream that was added.
1741 */
1742 virtual Network::Stream* addAccepted(int file_descriptor,
1743- struct sockaddr& peer_address,
1744- socklen_t peer_address_size) = 0;
1745+ struct sockaddr& peer,
1746+ socklen_t peer_size) = 0;
1747
1748 private:
1749
1750
1751=== modified file 'ScaleStack/Network/Unix/Stream/Connection.h'
1752--- ScaleStack/Network/Unix/Stream/Connection.h 2010-04-30 03:54:30 +0000
1753+++ ScaleStack/Network/Unix/Stream/Connection.h 2010-05-16 06:24:29 +0000
1754@@ -61,8 +61,7 @@
1755 /**
1756 * Connect to a remote host.
1757 *
1758- * @param[in] host Host to connect to.
1759- * @param[in] port Port to connect to.
1760+ * @param[in] socket_name Socket to connect to.
1761 */
1762 void connect(const std::string& socket_name);
1763
1764
1765=== modified file 'ScaleStack/Network/Unix/Stream/ConnectionService.h'
1766--- ScaleStack/Network/Unix/Stream/ConnectionService.h 2010-05-03 08:30:52 +0000
1767+++ ScaleStack/Network/Unix/Stream/ConnectionService.h 2010-05-16 06:24:29 +0000
1768@@ -41,8 +41,8 @@
1769 * See StreamService::addAccepted().
1770 */
1771 Network::Stream* addAccepted(int file_descriptor,
1772- struct sockaddr& peer_address,
1773- socklen_t peer_address_size);
1774+ struct sockaddr& peer,
1775+ socklen_t peer_size);
1776
1777 /**
1778 * Add a new connection and connect to the given Unix Domain Socket.
1779
1780=== modified file 'ScaleStack/Network/Unix/Stream/Listener.h'
1781--- ScaleStack/Network/Unix/Stream/Listener.h 2010-04-30 00:03:45 +0000
1782+++ ScaleStack/Network/Unix/Stream/Listener.h 2010-05-16 06:24:29 +0000
1783@@ -40,7 +40,7 @@
1784 * @param[in] service Service this Listener is associated with.
1785 * @param[in] connection_service Service this Listener should add
1786 * connections to when accepted.
1787- * @param[in] addrinfo Address information to use for socket.
1788+ * @param[in] unix_socket Address information to use for socket.
1789 */
1790 Listener(ListenerService& service,
1791 ConnectionService& connection_service,

Subscribers

People subscribed via source and target branches

to all changes: