13 #include "rofl/common/croflexception.h"
14 #include "rofl/common/crofsock.h"
15 #include "rofl/common/csocket.h"
16 #include "rofl/common/caddress.h"
17 #include "rofl/common/ctspaddress.h"
48 clear_active_rofsockets_in4();
49 clear_active_rofsockets_in6();
50 clear_listening_sockets_in4();
51 clear_listening_sockets_in6();
60 connect(
enum rofl::csocket::socket_type_t socket_type,
cparams const& socket_params) {
61 (
new crofsock(
this))->connect(socket_type, socket_params);
70 clear_active_rofsockets_in4() {
71 for (std::map<rofl::common::ctspaddress_in4, crofsock*>::iterator
72 it = rofsockets_in4.begin(); it != rofsockets_in4.end(); ++it) {
82 if (rofsockets_in4.find(addr) == rofsockets_in4.end()) {
85 return *(rofsockets_in4[addr]);
93 if (rofsockets_in4.find(addr) == rofsockets_in4.end()) {
96 return *(rofsockets_in4.at(addr));
104 if (rofsockets_in4.find(addr) == rofsockets_in4.end()) {
107 delete rofsockets_in4[addr];
108 rofsockets_in4.erase(addr);
116 return (not (rofsockets_in4.find(addr) == rofsockets_in4.end()));
125 clear_active_rofsockets_in6() {
126 for (std::map<rofl::common::ctspaddress_in6, crofsock*>::iterator
127 it = rofsockets_in6.begin(); it != rofsockets_in6.end(); ++it) {
137 if (rofsockets_in6.find(addr) == rofsockets_in6.end()) {
140 return *(rofsockets_in6[addr]);
148 if (rofsockets_in6.find(addr) == rofsockets_in6.end()) {
151 return *(rofsockets_in6.at(addr));
159 if (rofsockets_in6.find(addr) == rofsockets_in6.end()) {
162 delete rofsockets_in6[addr];
163 rofsockets_in6.erase(addr);
171 return (not (rofsockets_in6.find(addr) == rofsockets_in6.end()));
180 clear_listening_sockets_in4() {
181 for (std::map<rofl::common::ctspaddress_in4, csocket*>::iterator
182 it = sockets_in4.begin(); it != sockets_in4.end(); ++it) {
191 add_listening_socket_in4(
192 enum rofl::csocket::socket_type_t socket_type,
196 rofl::caddress_in4(socket_params.get_param(rofl::csocket::PARAM_KEY_LOCAL_HOSTNAME).get_string()),
197 atoi(socket_params.get_param(rofl::csocket::PARAM_KEY_LOCAL_PORT).get_string().c_str()));
199 if (sockets_in4.find(addr) != sockets_in4.end()) {
200 delete sockets_in4[addr];
202 (sockets_in4[addr] = csocket::csocket_factory(socket_type,
this))->listen(socket_params);
203 return *(sockets_in4[addr]);
210 set_listening_socket_in4(
211 enum rofl::csocket::socket_type_t socket_type,
215 rofl::caddress_in4(socket_params.get_param(rofl::csocket::PARAM_KEY_LOCAL_HOSTNAME).get_string()),
216 atoi(socket_params.get_param(rofl::csocket::PARAM_KEY_LOCAL_PORT).get_string().c_str()));
218 if (sockets_in4.find(addr) == sockets_in4.end()) {
219 (sockets_in4[addr] = csocket::csocket_factory(socket_type,
this))->listen(socket_params);
221 return *(sockets_in4[addr]);
228 set_listening_socket_in4(
230 if (sockets_in4.find(addr) == sockets_in4.end()) {
233 return *(sockets_in4[addr]);
240 get_listening_socket_in4(
242 if (sockets_in4.find(addr) == sockets_in4.end()) {
245 return *(sockets_in4.at(addr));
253 if (sockets_in4.find(addr) == sockets_in4.end()) {
256 delete sockets_in4[addr];
257 sockets_in4.erase(addr);
265 return (not (sockets_in4.find(addr) == sockets_in4.end()));
274 clear_listening_sockets_in6() {
275 for (std::map<rofl::common::ctspaddress_in6, csocket*>::iterator
276 it = sockets_in6.begin(); it != sockets_in6.end(); ++it) {
285 add_listening_socket_in6(
286 enum rofl::csocket::socket_type_t socket_type,
290 rofl::caddress_in6(socket_params.get_param(rofl::csocket::PARAM_KEY_LOCAL_HOSTNAME).get_string()),
291 atoi(socket_params.get_param(rofl::csocket::PARAM_KEY_LOCAL_PORT).get_string().c_str()));
293 if (sockets_in6.find(addr) != sockets_in6.end()) {
294 delete sockets_in6[addr];
296 (sockets_in6[addr] = csocket::csocket_factory(socket_type,
this))->listen(socket_params);
297 return *(sockets_in6[addr]);
304 set_listening_socket_in6(
306 enum rofl::csocket::socket_type_t socket_type,
308 if (sockets_in6.find(addr) == sockets_in6.end()) {
309 (sockets_in6[addr] = csocket::csocket_factory(socket_type,
this))->listen(socket_params);
311 return *(sockets_in6[addr]);
318 set_listening_socket_in6(
320 if (sockets_in6.find(addr) == sockets_in6.end()) {
323 return *(sockets_in6[addr]);
330 get_listening_socket_in6(
332 if (sockets_in6.find(addr) == sockets_in6.end()) {
335 return *(sockets_in6.at(addr));
343 if (sockets_in6.find(addr) == sockets_in6.end()) {
346 delete sockets_in6[addr];
347 sockets_in6.erase(addr);
355 return (not (sockets_in6.find(addr) == sockets_in6.end()));
385 rofsock->send_message(msg);
405 handle_connect_refused(
crofsock& rofsock) {
413 handle_connect_failed(
crofsock& rofsock) {
421 handle_connected(
crofsock& rofsock) {
422 std::cerr <<
"RADDR:" << rofsock.get_socket().get_raddr();
423 switch (rofsock.get_socket().get_domain()) {
427 rofsock.get_socket().get_raddr().ca_s4addr, rofsock.get_socket().get_raddr().salen),
428 be16toh(rofsock.get_socket().get_raddr().ca_s4addr->sin_port));
429 if (rofsockets_in4.find(addr) != rofsockets_in4.end()) {
430 delete rofsockets_in4[addr];
432 rofsockets_in4[addr] = &rofsock;
437 rofsock.get_socket().get_raddr().ca_s6addr, rofsock.get_socket().get_raddr().salen),
438 be16toh(rofsock.get_socket().get_raddr().ca_s6addr->sin6_port));
439 if (rofsockets_in6.find(addr) != rofsockets_in6.end()) {
440 delete rofsockets_in6[addr];
442 rofsockets_in6[addr] = &rofsock;
452 switch (rofsock.get_socket().get_domain()) {
456 rofsock.get_socket().get_raddr().ca_s4addr, rofsock.get_socket().get_raddr().salen),
457 be16toh(rofsock.get_socket().get_raddr().ca_s4addr->sin_port));
458 rofsockets_in4.erase(addr);
463 rofsock.get_socket().get_raddr().ca_s6addr, rofsock.get_socket().get_raddr().salen),
464 be16toh(rofsock.get_socket().get_raddr().ca_s6addr->sin6_port));
465 rofsockets_in6.erase(addr);
480 switch (rofsock.get_socket().get_domain()) {
484 rofsock.get_socket().get_raddr().ca_s4addr, rofsock.get_socket().get_raddr().salen),
485 be16toh(rofsock.get_socket().get_raddr().ca_s4addr->sin_port));
486 handle_message(addr, msg);
491 rofsock.get_socket().get_raddr().ca_s6addr, rofsock.get_socket().get_raddr().salen),
492 be16toh(rofsock.get_socket().get_raddr().ca_s6addr->sin6_port));
493 handle_message(addr, msg);
506 handle_listen(
csocket& socket,
int newsd) {
507 (
new crofsock(
this))->accept(socket.get_socket_type(), socket.get_socket_params(), newsd);
511 handle_accepted(
csocket& socket) {};
514 handle_accept_refused(
csocket& socket) {};
517 handle_connected(
csocket& socket) {};
520 handle_connect_refused(
csocket& socket) {};
523 handle_connect_failed(
csocket& socket) {};
526 handle_read(
csocket& socket) {};
529 handle_write(
csocket& socket) {};
532 handle_closed(
csocket& socket) {};
536 std::map<rofl::common::ctspaddress_in4, csocket*> sockets_in4;
537 std::map<rofl::common::ctspaddress_in6, csocket*> sockets_in6;
538 std::map<rofl::common::ctspaddress_in4, crofsock*> rofsockets_in4;
539 std::map<rofl::common::ctspaddress_in6, crofsock*> rofsockets_in6;
Definition: crofshim.h:22
A single socket.
Definition: csocket.h:182
Definition: caddress.h:589
A socket capable of talking OpenFlow via TCP and vice versa.
Definition: crofsock.h:111
Definition: ctspaddress.h:169
Definition: crofshim.h:32
Definition: caddress.h:415
An abstract interface defining the consumer side of a csocket.
Definition: csocket.h:58
Definition: crofshim.h:26
Definition: ctspaddress.h:88
Environment expected by a rofl::crofsock instance.
Definition: crofsock.h:76
Definition: croflexception.h:27