20 #include "rofl/common/ciosrv.h"
21 #include "rofl/common/cmemory.h"
22 #include "rofl/common/csocket.h"
23 #include "rofl/common/logging.h"
24 #include "rofl/common/crofqueue.h"
25 #include "rofl/common/thread_helper.h"
26 #include "rofl/common/croflexception.h"
28 #include "rofl/common/openflow/messages/cofmsg.h"
29 #include "rofl/common/openflow/messages/cofmsg_hello.h"
30 #include "rofl/common/openflow/messages/cofmsg_echo.h"
31 #include "rofl/common/openflow/messages/cofmsg_error.h"
32 #include "rofl/common/openflow/messages/cofmsg_features.h"
33 #include "rofl/common/openflow/messages/cofmsg_config.h"
34 #include "rofl/common/openflow/messages/cofmsg_packet_out.h"
35 #include "rofl/common/openflow/messages/cofmsg_packet_in.h"
36 #include "rofl/common/openflow/messages/cofmsg_flow_mod.h"
37 #include "rofl/common/openflow/messages/cofmsg_flow_removed.h"
38 #include "rofl/common/openflow/messages/cofmsg_group_mod.h"
39 #include "rofl/common/openflow/messages/cofmsg_table_mod.h"
40 #include "rofl/common/openflow/messages/cofmsg_port_mod.h"
41 #include "rofl/common/openflow/messages/cofmsg_port_status.h"
42 #include "rofl/common/openflow/messages/cofmsg_stats.h"
43 #include "rofl/common/openflow/messages/cofmsg_desc_stats.h"
44 #include "rofl/common/openflow/messages/cofmsg_flow_stats.h"
45 #include "rofl/common/openflow/messages/cofmsg_aggr_stats.h"
46 #include "rofl/common/openflow/messages/cofmsg_table_stats.h"
47 #include "rofl/common/openflow/messages/cofmsg_port_stats.h"
48 #include "rofl/common/openflow/messages/cofmsg_queue_stats.h"
49 #include "rofl/common/openflow/messages/cofmsg_group_stats.h"
50 #include "rofl/common/openflow/messages/cofmsg_group_desc_stats.h"
51 #include "rofl/common/openflow/messages/cofmsg_group_features_stats.h"
52 #include "rofl/common/openflow/messages/cofmsg_port_desc_stats.h"
53 #include "rofl/common/openflow/messages/cofmsg_experimenter_stats.h"
54 #include "rofl/common/openflow/messages/cofmsg_barrier.h"
55 #include "rofl/common/openflow/messages/cofmsg_queue_get_config.h"
56 #include "rofl/common/openflow/messages/cofmsg_role.h"
57 #include "rofl/common/openflow/messages/cofmsg_experimenter.h"
58 #include "rofl/common/openflow/messages/cofmsg_experimenter_stats.h"
59 #include "rofl/common/openflow/messages/cofmsg_async_config.h"
60 #include "rofl/common/openflow/messages/cofmsg_table_features_stats.h"
61 #include "rofl/common/openflow/messages/cofmsg_meter_mod.h"
62 #include "rofl/common/openflow/messages/cofmsg_meter_stats.h"
63 #include "rofl/common/openflow/messages/cofmsg_meter_config_stats.h"
64 #include "rofl/common/openflow/messages/cofmsg_meter_features_stats.h"
85 handle_connect_refused(
crofsock& endpnt) = 0;
88 handle_connect_failed(
crofsock& endpnt) = 0;
91 handle_connected(
crofsock& endpnt) = 0;
115 enum outqueue_type_t {
123 enum crofsock_event_t {
126 EVENT_CONNECT_FAILED = 2,
127 EVENT_CONNECT_REFUSED = 3,
130 EVENT_ACCEPT_REFUSED = 6,
132 EVENT_PEER_DISCONNECTED = 8,
133 EVENT_LOCAL_DISCONNECT = 9,
134 EVENT_CONGESTION_SOLVED = 10,
137 enum crofsock_flag_t {
141 enum crofsock_state_t {
144 STATE_CONNECTING = 2,
169 enum rofl::csocket::socket_type_t socket_type,
172 RwLock rwlock(rofsock_lock, RwLock::RWLOCK_WRITE);
173 this->socket_type = socket_type;
174 this->socket_params = socket_params;
176 run_engine(EVENT_ACCEPT);
184 enum rofl::csocket::socket_type_t socket_type,
185 const cparams& socket_params) {
186 RwLock rwlock(rofsock_lock, RwLock::RWLOCK_WRITE);
187 this->socket_type = socket_type;
188 this->socket_params = socket_params;
189 run_engine(EVENT_CONNECT);
197 RwLock rwlock(rofsock_lock, RwLock::RWLOCK_WRITE);
198 run_engine(EVENT_CONNECT);
206 RwLock rwlock(rofsock_lock, RwLock::RWLOCK_WRITE);
207 run_engine(EVENT_LOCAL_DISCONNECT);
228 is_established()
const
229 {
return socket->is_established(); };
244 max_pkts_rcvd_per_round(DEFAULT_MAX_PKTS_RVCD_PER_ROUND),
245 socket_type(rofl::csocket::SOCKET_TYPE_UNKNOWN),
282 handle_accept_refused(
284 run_engine(EVENT_ACCEPT_REFUSED);
293 run_engine(EVENT_ACCEPTED);
300 handle_connect_refused(
302 run_engine(EVENT_CONNECT_REFUSED);
309 handle_connect_failed(
311 run_engine(EVENT_CONNECT_FAILED);
320 run_engine(EVENT_CONNECTED);
329 run_engine(EVENT_CONGESTION_SOLVED);
338 run_engine(EVENT_PEER_DISCONNECTED);
354 run_engine(crofsock_event_t event = EVENT_NONE) {
355 if (EVENT_NONE != event) {
356 events.push_back(event);
359 while (not events.empty()) {
360 enum crofsock_event_t
event = events.front();
364 case EVENT_CONNECT: event_connect();
break;
365 case EVENT_CONNECT_FAILED: event_connect_failed();
break;
366 case EVENT_CONNECT_REFUSED: event_connect_refused();
break;
367 case EVENT_CONNECTED: event_connected();
break;
368 case EVENT_ACCEPT: event_accept();
break;
369 case EVENT_ACCEPT_REFUSED: event_accept_refused();
break;
370 case EVENT_ACCEPTED: event_accepted();
break;
371 case EVENT_PEER_DISCONNECTED: event_peer_disconnected();
return;
372 case EVENT_LOCAL_DISCONNECT: event_local_disconnect();
return;
373 case EVENT_CONGESTION_SOLVED: event_congestion_solved();
break;
376 rofl::logging::error <<
"[rofl-common][crofsock] unknown event seen, internal error" << std::endl << *
this;
390 rofl::logging::debug2 <<
"[rofl-common][crofsock] EVENT-CONNECT => entering state -connecting-" << std::endl;
391 state = STATE_CONNECTING;
396 (socket = csocket::csocket_factory(socket_type,
this))->connect(socket_params);
398 case STATE_CONNECTING: {
401 case STATE_CONNECTED: {
402 run_engine(EVENT_LOCAL_DISCONNECT);
403 run_engine(EVENT_CONNECT);
415 event_connect_failed() {
416 rofl::logging::debug2 <<
"[rofl-common][crofsock] EVENT-CONNECT-FAILED => entering state -closed-" << std::endl;
417 state = STATE_CLOSED;
418 if (env) env->handle_connect_failed(*
this);
425 event_connect_refused() {
426 rofl::logging::debug2 <<
"[rofl-common][crofsock] EVENT-CONNECT-REFUSED => entering state -closed-" << std::endl;
427 state = STATE_CLOSED;
428 if (env) env->handle_connect_refused(*
this);
436 rofl::logging::debug2 <<
"[rofl-common][crofsock] EVENT-CONNECTED => entering state -connected-" << std::endl;
437 state = STATE_CONNECTED;
438 if (env) env->handle_connected(*
this);
449 rofl::logging::debug2 <<
"[rofl-common][crofsock] EVENT-ACCEPT => entering state -connected-" << std::endl;
450 state = STATE_CONNECTED;
454 (socket = csocket::csocket_factory(socket_type,
this))->accept(socket_params, sd);
466 event_accept_refused() {
467 rofl::logging::debug2 <<
"[rofl-common][crofsock] EVENT-ACCEPT-REFUSED => entering state -closed-" << std::endl;
468 state = STATE_CLOSED;
476 rofl::logging::debug2 <<
"[rofl-common][crofsock] EVENT-ACCEPTED => entering state -connected-" << std::endl;
477 state = STATE_CONNECTED;
485 event_peer_disconnected() {
486 rofl::logging::debug2 <<
"[rofl-common][crofsock] EVENT-PEER-DISCONNECTED => entering state -closed-" << std::endl;
488 if (env) env->handle_closed(*
this);
495 event_local_disconnect() {
496 rofl::logging::debug2 <<
"[rofl-common][crofsock] EVENT-LOCAL-DISCONNECT => entering state -closed-" << std::endl;
498 if (socket) socket->
close();
505 event_congestion_solved() {
506 flags.reset(FLAGS_CONGESTED);
517 state = STATE_CLOSED;
519 delete fragment; fragment = NULL;
521 for (std::vector<crofqueue>::iterator
522 it = txqueues.begin(); it != txqueues.end(); ++it) {
595 operator<< (std::ostream& os,
crofsock const& rofsock) {
596 os <<
indent(0) <<
"<crofsock: transport-connection-established: " << rofsock.get_socket().is_established() <<
">" << std::endl;
602 std::stringstream ss;
603 if (STATE_INIT == state) {
604 ss <<
"state: -INIT- ";
606 if (STATE_CLOSED == state) {
607 ss <<
"state: -CLOSED- ";
609 if (STATE_CONNECTING == state) {
610 ss <<
"state: -CONNECTING- ";
612 if (STATE_CONNECTED == state) {
613 ss <<
"state: -CONNECTED- ";
625 std::bitset<32> flags;
627 enum crofsock_state_t state;
636 unsigned int msg_bytes_read;
638 unsigned int max_pkts_rcvd_per_round;
640 static unsigned int const DEFAULT_MAX_PKTS_RVCD_PER_ROUND = 16;
647 std::vector<crofqueue> txqueues;
649 std::vector<unsigned int> txweights;
651 enum rofl::csocket::socket_type_t
658 std::deque<enum crofsock_event_t>
A single socket.
Definition: csocket.h:182
A socket capable of talking OpenFlow via TCP and vice versa.
Definition: crofsock.h:111
void notify(const cevent &event)
Sends a notification to this ciosrv instance.
Definition: ciosrv.h:529
void cancel_all_events()
Cancels all pending events of this instance.
Definition: ciosrv.h:780
void cancel_all_timers()
Cancels all pending timers of this instance.
Definition: ciosrv.h:770
virtual void close()=0
Closes this socket.
Definition: thread_helper.h:25
Definition: crofsock.h:103
Definition: thread_helper.h:88
C++ abstraction for malloc'ed memory areas.
Definition: cmemory.h:44
Single event used internally by class crofl::cioloop.
Definition: cevent.h:20
Definition: crofsock.h:104
An abstract interface defining the consumer side of a csocket.
Definition: csocket.h:58
Base class for IO services.
Definition: ciosrv.h:491
Environment expected by a rofl::crofsock instance.
Definition: crofsock.h:76
Definition: croflexception.h:27
void clear()
Clears the allocated memory area by setting all bytes to 0.
Definition: cmemory.cc:281