Revised OpenFlow Library  v0.6.0dev
 All Classes Files Functions Variables Friends Groups Pages
crofbase.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 /*
6  * crofbase.h
7  *
8  * Created on: 25.10.2012
9  * Author: andreas
10  */
11 
12 #ifndef CROFBASE_H
13 #define CROFBASE_H 1
14 
15 #include <map>
16 #include <set>
17 #include <list>
18 #include <vector>
19 #include <bitset>
20 #include <algorithm>
21 #include <endian.h>
22 #include <string.h>
23 #include <time.h>
24 #ifndef htobe16
25  #include "endian_conversion.h"
26 #endif
27 
28 #include "rofl/common/ciosrv.h"
29 #include "rofl/common/croflexception.h"
30 #include "rofl/common/csocket.h"
31 #include "rofl/common/thread_helper.h"
32 #include "rofl/common/logging.h"
33 #include "rofl/common/crofdpt.h"
34 #include "rofl/common/crofctl.h"
35 #include "rofl/common/openflow/openflow.h"
36 #include "rofl/common/openflow/cofhelloelemversionbitmap.h"
37 #include "rofl/common/crandom.h"
38 
39 namespace rofl {
40 
41 
42 /* error classes */
43 class eRofBase : public RoflException {}; // base error class crofbase
44 class eRofBaseIsBusy : public eRofBase {}; // this FwdElem is already controlled
45 class eRofBaseNotConnected : public eRofBase {}; // this instance is not connected to the specified cofdpt/cofctl instance
46 class eRofBaseNotImpl : public eRofBase {}; // this FwdElem's method is not implemented
47 class eRofBaseNoCtrl : public eRofBase {}; // no controlling entity attached to this FwdElem
48 class eRofBaseNotFound : public eRofBase {}; // internal entity not found
49 class eRofBaseInval : public eRofBase {}; // invalid parameter (e.g. invalid packet type)
50 class eRofBaseNotAttached : public eRofBase {}; // received command from entity being not attached
51 class eRofBaseNoRequest : public eRofBase {}; // no request packet found for session
52 class eRofBaseXidInval : public eRofBase {}; // invalid xid in session exchange
53 class eRofBaseExists : public eRofBase {}; // fwdelem with either this dpid or dpname already exists
54 class eRofBaseOFportNotFound : public eRofBase {}; // cofport instance not found
55 class eRofBaseTableNotFound : public eRofBase {}; // flow-table not found (e.g. unknown table_id in flow_mod)
56 class eRofBaseGotoTableNotFound : public eRofBase {}; // table-id specified in OFPIT_GOTO_TABLE invalid
58 class eRofBaseCongested : public eRofBase {}; // control channel is congested, dropping messages
59 
60 
61 
100 class crofbase :
101  public ciosrv,
102  public csocket_env,
103  public crofconn_env,
104  public ctransactions_env,
105  public crofctl_env,
106  public crofdpt_env
107 {
108 public:
109 
119  crofbase(
120  const rofl::openflow::cofhello_elem_versionbitmap& versionbitmap =
122 
129  virtual
130  ~crofbase();
131 
132 public:
133 
143  void
145  while (not dpt_sockets.empty()) {
146  unsigned int sockid = dpt_sockets.begin()->first;
147  drop_dpt_listening(sockid);
148  }
149  };
150 
160  unsigned int sockid,
161  enum rofl::csocket::socket_type_t socket_type,
162  const rofl::cparams& params) {
163  if (dpt_sockets.find(sockid) != dpt_sockets.end()) {
164  delete dpt_sockets[sockid];
165  dpt_sockets.erase(sockid);
166  }
167  dpt_sockets[sockid] = csocket::csocket_factory(socket_type, this);
168  dpt_sockets[sockid]->listen(params);
169  return *(dpt_sockets[sockid]);
170  };
171 
182  unsigned int sockid,
183  enum rofl::csocket::socket_type_t socket_type,
184  const rofl::cparams& params) {
185  if (dpt_sockets.find(sockid) == dpt_sockets.end()) {
186  dpt_sockets[sockid] = csocket::csocket_factory(socket_type, this);
187  dpt_sockets[sockid]->listen(params);
188  }
189  return *(dpt_sockets[sockid]);
190  };
191 
198  const rofl::csocket&
200  unsigned int sockid) const {
201  if (dpt_sockets.find(sockid) == dpt_sockets.end()) {
202  throw eRofBaseNotFound();
203  }
204  return *(dpt_sockets.at(sockid));
205  };
206 
212  void
214  unsigned int sockid) {
215  if (dpt_sockets.find(sockid) == dpt_sockets.end()) {
216  return;
217  }
218  delete dpt_sockets[sockid];
219  dpt_sockets.erase(sockid);
220  };
221 
227  bool
229  unsigned int sockid) {
230  return (not (dpt_sockets.find(sockid) == dpt_sockets.end()));
231  };
232 
235 public:
236 
246  void
248  while (not ctl_sockets.empty()) {
249  unsigned int sockid = ctl_sockets.begin()->first;
250  drop_ctl_listening(sockid);
251  }
252  };
253 
263  unsigned int sockid,
264  enum rofl::csocket::socket_type_t socket_type,
265  const rofl::cparams& params) {
266  if (ctl_sockets.find(sockid) != ctl_sockets.end()) {
267  delete ctl_sockets[sockid];
268  ctl_sockets.erase(sockid);
269  }
270  ctl_sockets[sockid] = csocket::csocket_factory(socket_type, this);
271  ctl_sockets[sockid]->listen(params);
272  return *(ctl_sockets[sockid]);
273  };
274 
285  unsigned int sockid,
286  enum rofl::csocket::socket_type_t socket_type,
287  const rofl::cparams& params) {
288  if (ctl_sockets.find(sockid) == ctl_sockets.end()) {
289  ctl_sockets[sockid] = csocket::csocket_factory(socket_type, this);
290  ctl_sockets[sockid]->listen(params);
291  }
292  return *(ctl_sockets[sockid]);
293  };
294 
301  const rofl::csocket&
303  unsigned int sockid) const {
304  if (ctl_sockets.find(sockid) == ctl_sockets.end()) {
305  throw eRofBaseNotFound();
306  }
307  return *(ctl_sockets.at(sockid));
308  };
309 
315  void
317  unsigned int sockid) {
318  if (ctl_sockets.find(sockid) == ctl_sockets.end()) {
319  return;
320  }
321  delete ctl_sockets[sockid];
322  ctl_sockets.erase(sockid);
323  };
324 
330  bool
332  unsigned int sockid) {
333  return (not (ctl_sockets.find(sockid) == ctl_sockets.end()));
334  };
335 
338 public:
339 
354  get_idle_dptid() const {
355  uint64_t id = 0;
356  while (has_dpt(rofl::cdptid(id))) {
357  id++;
358  }
359  return rofl::cdptid(id);
360  };
361 
365  void
367  for (std::map<rofl::cdptid, crofdpt*>::iterator
368  it = rofdpts.begin(); it != rofdpts.end(); ++it) {
369  delete it->second;
370  }
371  rofdpts.clear();
372  };
373 
395  const rofl::cdptid& dptid,
396  const rofl::openflow::cofhello_elem_versionbitmap& versionbitmap,
397  bool remove_on_channel_close = false,
398  const rofl::cdpid& dpid = rofl::cdpid(0)) {
399  if (rofdpts.find(dptid) != rofdpts.end()) {
400  delete rofdpts[dptid];
401  rofdpts.erase(dptid);
402  }
403  rofdpts[dptid] = new crofdpt(this, dptid, remove_on_channel_close, versionbitmap, dpid);
404  return *(rofdpts[dptid]);
405  };
406 
425  const rofl::cdptid& dptid,
426  const rofl::openflow::cofhello_elem_versionbitmap& versionbitmap,
427  bool remove_on_channel_close = false,
428  const rofl::cdpid& dpid = rofl::cdpid(0)) {
429  if (rofdpts.find(dptid) == rofdpts.end()) {
430  rofdpts[dptid] = new crofdpt(this, dptid, remove_on_channel_close, versionbitmap, dpid);
431  }
432  return *(rofdpts[dptid]);
433  };
434 
447  const rofl::cdptid& dptid) {
448  if (rofdpts.find(dptid) == rofdpts.end()) {
449  throw eRofBaseNotFound();
450  }
451  return *(rofdpts[dptid]);
452  };
453 
464  const rofl::crofdpt&
466  const rofl::cdptid& dptid) const {
467  if (rofdpts.find(dptid) == rofdpts.end()) {
468  throw eRofBaseNotFound();
469  }
470  return *(rofdpts.at(dptid));
471  };
472 
478  void
480  rofl::cdptid dptid) { // make a copy here, do not use a const reference
481  if (rofdpts.find(dptid) == rofdpts.end()) {
482  return;
483  }
484  delete rofdpts[dptid];
485  rofdpts.erase(dptid);
486  };
487 
494  bool
496  const rofl::cdptid& dptid) const {
497  return (not (rofdpts.find(dptid) == rofdpts.end()));
498  };
499 
502 public:
503 
518  get_idle_ctlid() const {
519  uint64_t id = 0;
520  while (has_ctl(rofl::cctlid(id))) {
521  id++;
522  }
523  return rofl::cctlid(id);
524  };
525 
529  void
531  for (std::map<rofl::cctlid, crofctl*>::iterator
532  it = rofctls.begin(); it != rofctls.end(); ++it) {
533  delete it->second;
534  }
535  rofctls.clear();
536  };
537 
558  const rofl::cctlid& ctlid,
559  const rofl::openflow::cofhello_elem_versionbitmap& versionbitmap,
560  bool remove_on_channel_close = false) {
561  if (rofctls.find(ctlid) != rofctls.end()) {
562  delete rofctls[ctlid];
563  rofctls.erase(ctlid);
564  }
565  rofctls[ctlid] = new crofctl(this, ctlid, remove_on_channel_close, versionbitmap);
566  return *(rofctls[ctlid]);
567  };
568 
586  const rofl::cctlid& ctlid,
587  const rofl::openflow::cofhello_elem_versionbitmap& versionbitmap,
588  bool remove_on_channel_close = false) {
589  if (rofctls.find(ctlid) == rofctls.end()) {
590  rofctls[ctlid] = new crofctl(this, ctlid, remove_on_channel_close, versionbitmap);
591  }
592  return *(rofctls[ctlid]);
593  };
594 
607  const rofl::cctlid& ctlid) {
608  if (rofctls.find(ctlid) == rofctls.end()) {
609  throw eRofBaseNotFound();
610  }
611  return *(rofctls[ctlid]);
612  };
613 
624  const rofl::crofctl&
626  const rofl::cctlid& ctlid) const {
627  if (rofctls.find(ctlid) == rofctls.end()) {
628  throw eRofBaseNotFound();
629  }
630  return *(rofctls.at(ctlid));
631  };
632 
638  void
640  rofl::cctlid ctlid) { // make a copy here, do not use a const reference
641  if (rofctls.find(ctlid) == rofctls.end()) {
642  return;
643  }
644  delete rofctls[ctlid];
645  rofctls.erase(ctlid);
646  };
647 
654  bool
656  const rofl::cctlid& ctlid) const {
657  return (not (rofctls.find(ctlid) == rofctls.end()));
658  };
659 
662 public:
663 
673  static uint32_t
675  uint8_t ofp_version);
676 
680  static uint32_t
682  uint8_t ofp_version);
683 
687  static uint32_t
689  uint8_t ofp_version);
690 
694  static uint8_t
696  uint8_t ofp_version,
697  const enum openflow::ofp_flow_mod_command& cmd);
698 
704  { return versionbitmap; };
705 
711  { return versionbitmap; };
712 
716  uint8_t
718  { return versionbitmap.get_highest_ofp_version(); };
719 
723  bool
725  uint8_t ofp_version) const
726  { return versionbitmap.has_ofp_version(ofp_version); };
727 
730 protected:
731 
748  virtual void
750  rofl::crofdpt& dpt) {
751  rofl::logging::info << "[rofl-common][crofbase] "
752  << "dptid: " << dpt.get_dptid().str() << " "
753  << "control channel established " << std::endl;
754  };
755 
767  virtual void
769  rofl::crofdpt& dpt) {
770  rofl::logging::info << "[rofl-common][crofbase] "
771  << "dptid: " << dpt.get_dptid().str() << " "
772  << "control channel terminated " << std::endl;
773  };
774 
781  virtual void
783  rofl::crofdpt& dpt,
784  const rofl::cauxid& auxid) {
785  rofl::logging::info << "[rofl-common][crofbase] "
786  << "dptid: " << dpt.get_dptid().str() << " "
787  << "control connection established, "
788  << "auxid: " << auxid.str() << std::endl;
789  };
790 
797  virtual void
799  rofl::crofdpt& dpt,
800  const rofl::cauxid& auxid) {
801  rofl::logging::info << "[rofl-common][crofbase] "
802  << "dptid: " << dpt.get_dptid().str() << " "
803  << "control connection terminated, "
804  << "auxid: " << auxid.str() << std::endl;
805  };
806 
817  virtual void
819  rofl::crofdpt& dpt,
820  const rofl::cauxid& auxid) {
821  rofl::logging::info << "[rofl-common][crofbase] connection refused, "
822  << "dptid: " << dpt.get_dptid().str() << " auxid: " << auxid.str() << std::endl;
823  };
824 
835  virtual void
837  rofl::crofdpt& dpt,
838  const rofl::cauxid& auxid) {
839  rofl::logging::info << "[rofl-common][crofbase] connection failed, "
840  << "dptid: " << dpt.get_dptid().str() << " auxid: " << auxid.str() << std::endl;
841  };
842 
859  virtual void
861  rofl::crofdpt& dpt,
862  const rofl::cauxid& auxid) {
863  rofl::logging::info << "[rofl-common][crofbase] connection is writable, "
864  << "dptid: " << dpt.get_dptid().str() << " auxid: " << auxid.str() << std::endl;
865  };
866 
869 protected:
870 
887  virtual void
889  rofl::crofctl& ctl) {
890  rofl::logging::info << "[rofl-common][crofbase] "
891  << "ctlid: " << ctl.get_ctlid().str() << " "
892  << "control channel established " << std::endl;
893  };
894 
906  virtual void
908  rofl::crofctl& ctl) {
909  rofl::logging::info << "[rofl-common][crofbase] "
910  << "ctlid: " << ctl.get_ctlid().str() << " "
911  << "control channel terminated " << std::endl;
912  };
913 
920  virtual void
922  rofl::crofctl& ctl,
923  const rofl::cauxid& auxid) {
924  rofl::logging::info << "[rofl-common][crofbase] "
925  << "ctlid: " << ctl.get_ctlid().str() << " "
926  << "control connection established, "
927  << "auxid: " << auxid.str() << std::endl;
928  };
929 
936  virtual void
938  rofl::crofctl& ctl,
939  const rofl::cauxid& auxid) {
940  rofl::logging::info << "[rofl-common][crofbase] "
941  << "ctlid: " << ctl.get_ctlid().str() << " "
942  << "control connection terminated, "
943  << "auxid: " << auxid.str() << std::endl;
944  };
945 
956  virtual void
958  rofl::crofctl& ctl,
959  const rofl::cauxid& auxid) {
960  rofl::logging::info << "[rofl-common][crofbase] connection refused, "
961  << "ctlid: " << ctl.get_ctlid().str() << " auxid: " << auxid.str() << std::endl;
962  };
963 
974  virtual void
976  rofl::crofctl& ctl,
977  const rofl::cauxid& auxid) {
978  rofl::logging::info << "[rofl-common][crofbase] connection failed, "
979  << "ctlid: " << ctl.get_ctlid().str() << " auxid: " << auxid.str() << std::endl;
980  };
981 
998  virtual void
1000  rofl::crofctl& ctl,
1001  const rofl::cauxid& auxid) {
1002  rofl::logging::info << "[rofl-common][crofbase] connection is writable, "
1003  << "ctlid: " << ctl.get_ctlid().str() << " auxid: " << auxid.str() << std::endl;
1004  };
1005 
1008 protected:
1009 
1029  virtual void
1031  rofl::crofdpt& dpt,
1032  const rofl::cauxid& auxid,
1034  {};
1035 
1045  virtual void
1047  rofl::crofdpt& dpt,
1048  uint32_t xid)
1049  {};
1050 
1058  virtual void
1060  rofl::crofdpt& dpt,
1061  const rofl::cauxid& auxid,
1063  {};
1064 
1074  virtual void
1076  rofl::crofdpt& dpt,
1077  uint32_t xid)
1078  {};
1079 
1087  virtual void
1089  rofl::crofdpt& dpt,
1090  const rofl::cauxid& auxid,
1092  {};
1093 
1104  virtual void
1106  rofl::crofdpt& dpt,
1107  uint32_t xid,
1108  uint8_t stats_type)
1109  {};
1110 
1118  virtual void
1120  rofl::crofdpt& dpt,
1121  const rofl::cauxid& auxid,
1123  {};
1124 
1134  virtual void
1136  rofl::crofdpt& dpt,
1137  uint32_t xid)
1138  {};
1139 
1147  virtual void
1149  rofl::crofdpt& dpt,
1150  const rofl::cauxid& auxid,
1152  {};
1153 
1163  virtual void
1165  rofl::crofdpt& dpt,
1166  uint32_t xid)
1167  {};
1168 
1176  virtual void
1178  rofl::crofdpt& dpt,
1179  const rofl::cauxid& auxid,
1181  {};
1182 
1192  virtual void
1194  rofl::crofdpt& dpt,
1195  uint32_t xid)
1196  {};
1197 
1205  virtual void
1207  rofl::crofdpt& dpt,
1208  const rofl::cauxid& auxid,
1210  {};
1211 
1221  virtual void
1223  rofl::crofdpt& dpt,
1224  uint32_t xid)
1225  {};
1226 
1234  virtual void
1236  rofl::crofdpt& dpt,
1237  const rofl::cauxid& auxid,
1239  {};
1240 
1250  virtual void
1252  rofl::crofdpt& dpt,
1253  uint32_t xid)
1254  {};
1255 
1263  virtual void
1265  rofl::crofdpt& dpt,
1266  const rofl::cauxid& auxid,
1268  {};
1269 
1279  virtual void
1281  rofl::crofdpt& dpt,
1282  uint32_t xid)
1283  {};
1284 
1292  virtual void
1294  rofl::crofdpt& dpt,
1295  const rofl::cauxid& auxid,
1297  {};
1298 
1308  virtual void
1310  rofl::crofdpt& dpt,
1311  uint32_t xid)
1312  {};
1313 
1321  virtual void
1323  rofl::crofdpt& dpt,
1324  const rofl::cauxid& auxid,
1326  {};
1327 
1337  virtual void
1339  rofl::crofdpt& dpt,
1340  uint32_t xid)
1341  {};
1342 
1350  virtual void
1352  rofl::crofdpt& dpt,
1353  const rofl::cauxid& auxid,
1355  {};
1356 
1366  virtual void
1368  rofl::crofdpt& dpt,
1369  uint32_t xid)
1370  {};
1371 
1379  virtual void
1381  rofl::crofdpt& dpt,
1382  const rofl::cauxid& auxid,
1384  {};
1385 
1395  virtual void
1397  rofl::crofdpt& dpt,
1398  uint32_t xid)
1399  {};
1400 
1408  virtual void
1410  rofl::crofdpt& dpt,
1411  const rofl::cauxid& auxid,
1413  {};
1414 
1424  virtual void
1426  rofl::crofdpt& dpt,
1427  uint32_t xid)
1428  {};
1429 
1437  virtual void
1439  rofl::crofdpt& dpt,
1440  const rofl::cauxid& auxid,
1442  {};
1443 
1453  virtual void
1455  rofl::crofdpt& dpt,
1456  uint32_t xid)
1457  {};
1458 
1466  virtual void
1468  rofl::crofdpt& dpt,
1469  const rofl::cauxid& auxid,
1471  {};
1472 
1482  virtual void
1484  rofl::crofdpt& dpt,
1485  uint32_t xid)
1486  {};
1487 
1495  virtual void
1497  rofl::crofdpt& dpt,
1498  const rofl::cauxid& auxid,
1500  {};
1501 
1511  virtual void
1513  rofl::crofdpt& dpt,
1514  uint32_t xid)
1515  {};
1516 
1524  virtual void
1526  rofl::crofdpt& dpt,
1527  const rofl::cauxid& auxid,
1529  {};
1530 
1540  virtual void
1542  rofl::crofdpt& dpt,
1543  uint32_t xid)
1544  {};
1545 
1553  virtual void
1555  rofl::crofdpt& dpt,
1556  const rofl::cauxid& auxid,
1558  {};
1559 
1567  virtual void
1569  rofl::crofdpt& dpt,
1570  const rofl::cauxid& auxid,
1572  {};
1573 
1583  virtual void
1585  rofl::crofdpt& dpt,
1586  uint32_t xid)
1587  {};
1588 
1596  virtual void
1598  rofl::crofdpt& dpt,
1599  const rofl::cauxid& auxid,
1601  {};
1602 
1610  virtual void
1612  rofl::crofdpt& dpt,
1613  const rofl::cauxid& auxid,
1615  {};
1616 
1624  virtual void
1626  rofl::crofdpt& dpt,
1627  const rofl::cauxid& auxid,
1629  {};
1630 
1640  virtual void
1642  rofl::crofdpt& dpt,
1643  uint32_t xid)
1644  {};
1645 
1653  virtual void
1655  rofl::crofdpt& dpt,
1656  const rofl::cauxid& auxid,
1658  {};
1659 
1667  virtual void
1669  rofl::crofdpt& dpt,
1670  const rofl::cauxid& auxid,
1672  {};
1673 
1683  virtual void
1685  rofl::crofdpt& dpt,
1686  uint32_t xid)
1687  {};
1688 
1696  virtual void
1698  rofl::crofdpt& dpt,
1699  const rofl::cauxid& auxid,
1701  {};
1702 
1712  virtual void
1714  rofl::crofdpt& dpt,
1715  uint32_t xid)
1716  {};
1717 
1725  virtual void
1727  rofl::crofdpt& dpt,
1728  const rofl::cauxid& auxid,
1730  {};
1731 
1741  virtual void
1743  rofl::crofdpt& dpt,
1744  uint32_t xid)
1745  {};
1746 
1749 protected:
1750 
1776  virtual void
1778  rofl::crofctl& ctl,
1779  const rofl::cauxid& auxid,
1781  {};
1782 
1790  virtual void
1792  rofl::crofctl& ctl,
1793  const rofl::cauxid& auxid,
1795  {};
1796 
1804  virtual void
1806  rofl::crofctl& ctl,
1807  const rofl::cauxid& auxid,
1809  {};
1810 
1818  virtual void
1820  rofl::crofctl& ctl,
1821  const rofl::cauxid& auxid,
1823  {};
1824 
1832  virtual void
1834  rofl::crofctl& ctl,
1835  const rofl::cauxid& auxid,
1837  {};
1838 
1846  virtual void
1848  rofl::crofctl& ctl,
1849  const rofl::cauxid& auxid,
1851  {};
1852 
1860  virtual void
1862  rofl::crofctl& ctl,
1863  const rofl::cauxid& auxid,
1865  {};
1866 
1874  virtual void
1876  rofl::crofctl& ctl,
1877  const rofl::cauxid& auxid,
1879  {};
1880 
1888  virtual void
1890  rofl::crofctl& ctl,
1891  const rofl::cauxid& auxid,
1893  {};
1894 
1902  virtual void
1904  rofl::crofctl& ctl,
1905  const rofl::cauxid& auxid,
1907  {};
1908 
1916  virtual void
1918  rofl::crofctl& ctl,
1919  const rofl::cauxid& auxid,
1921  {};
1922 
1930  virtual void
1932  rofl::crofctl& ctl,
1933  const rofl::cauxid& auxid,
1935  {};
1936 
1944  virtual void
1946  rofl::crofctl& ctl,
1947  const rofl::cauxid& auxid,
1949  {};
1950 
1958  virtual void
1960  rofl::crofctl& ctl,
1961  const rofl::cauxid& auxid,
1963  {};
1964 
1972  virtual void
1974  rofl::crofctl& ctl,
1975  const rofl::cauxid& auxid,
1977  {};
1978 
1986  virtual void
1988  rofl::crofctl& ctl,
1989  const rofl::cauxid& auxid,
1991  {};
1992 
2000  virtual void
2002  rofl::crofctl& ctl,
2003  const rofl::cauxid& auxid,
2005  {};
2006 
2014  virtual void
2016  rofl::crofctl& ctl,
2017  const rofl::cauxid& auxid,
2019  {};
2020 
2028  virtual void
2030  rofl::crofctl& ctl,
2031  const rofl::cauxid& auxid,
2033  {};
2034 
2042  virtual void
2044  rofl::crofctl& ctl,
2045  const rofl::cauxid& auxid,
2047  {};
2048 
2056  virtual void
2058  rofl::crofctl& ctl,
2059  const rofl::cauxid& auxid,
2061  {};
2062 
2070  virtual void
2072  rofl::crofctl& ctl,
2073  const rofl::cauxid& auxid,
2075  {};
2076 
2084  virtual void
2086  rofl::crofctl& ctl,
2087  const rofl::cauxid& auxid,
2089  {};
2090 
2098  virtual void
2100  rofl::crofctl& ctl,
2101  const rofl::cauxid& auxid,
2103  {};
2104 
2112  virtual void
2114  rofl::crofctl& ctl,
2115  const rofl::cauxid& auxid,
2117  {};
2118 
2126  virtual void
2128  rofl::crofctl& ctl,
2129  const rofl::cauxid& auxid,
2131  {};
2132 
2140  virtual void
2142  rofl::crofctl& ctl,
2143  const rofl::cauxid& auxid,
2145  {};
2146 
2154  virtual void
2156  rofl::crofctl& ctl,
2157  const rofl::cauxid& auxid,
2159  {};
2160 
2168  virtual void
2170  rofl::crofctl& ctl,
2171  const rofl::cauxid& auxid,
2173  {};
2174 
2182  virtual void
2184  rofl::crofctl& ctl,
2185  const rofl::cauxid& auxid,
2187  {};
2188 
2196  virtual void
2198  rofl::crofctl& ctl,
2199  const rofl::cauxid& auxid,
2201  {};
2202 
2210  virtual void
2212  rofl::crofctl& ctl,
2213  const rofl::cauxid& auxid,
2215  {};
2216 
2219 protected:
2220 
2251  void
2253  const rofl::cauxid& auxid,
2254  uint32_t buffer_id,
2255  uint16_t total_len,
2256  uint8_t reason,
2257  uint8_t table_id,
2258  uint64_t cookie,
2259  uint16_t in_port, // for OF1.0
2260  rofl::openflow::cofmatch &match,
2261  uint8_t *data,
2262  size_t datalen);
2263 
2280  void
2282  const rofl::cauxid& auxid,
2283  rofl::openflow::cofmatch& match,
2284  uint64_t cookie,
2285  uint16_t priority,
2286  uint8_t reason,
2287  uint8_t table_id,
2288  uint32_t duration_sec,
2289  uint32_t duration_nsec,
2290  uint16_t idle_timeout,
2291  uint16_t hard_timeout,
2292  uint64_t packet_count,
2293  uint64_t byte_count);
2294 
2302  void
2304  const rofl::cauxid& auxid,
2305  uint8_t reason,
2306  const rofl::openflow::cofport& port);
2307 
2310 public:
2311 
2312  friend std::ostream&
2313  operator<< (std::ostream& os, crofbase const& rofbase) {
2314  os << "<crofbase >" << std::endl;
2315  for (std::map<cctlid, crofctl*>::const_iterator
2316  it = rofbase.rofctls.begin(); it != rofbase.rofctls.end(); ++it) {
2317  rofl::indent i(2);
2318  os << it->first;
2319  }
2320  for (std::map<cdptid, crofdpt*>::const_iterator
2321  it = rofbase.rofdpts.begin(); it != rofbase.rofdpts.end(); ++it) {
2322  rofl::indent i(2);
2323  os << it->first;
2324  }
2325  return os;
2326  };
2327 
2328 private:
2329 
2330  virtual void
2331  role_request_rcvd(
2332  rofl::crofctl& ctl,
2333  uint32_t role,
2334  uint64_t rcvd_generation_id);
2335 
2336 private:
2337 
2338  virtual void
2339  handle_connect_refused(
2340  crofconn& conn);
2341 
2342  virtual void
2343  handle_connect_failed(
2344  crofconn& conn);
2345 
2346  virtual void
2347  handle_connected(
2348  crofconn& conn,
2349  uint8_t ofp_version);
2350 
2351  virtual void
2352  handle_closed(
2353  crofconn& conn)
2354  {};
2355 
2356  virtual void
2357  handle_write(
2358  crofconn& conn)
2359  {};
2360 
2361  virtual void
2362  recv_message(
2363  crofconn& conn,
2365  { delete msg; };
2366 
2367  virtual uint32_t
2368  get_async_xid(
2369  crofconn& conn)
2370  { return transactions.get_async_xid(); };
2371 
2372  virtual uint32_t
2373  get_sync_xid(
2374  crofconn& conn,
2375  uint8_t msg_type = 0,
2376  uint16_t msg_sub_type = 0)
2377  { return transactions.add_ta(cclock(5, 0), msg_type, msg_sub_type); };
2378 
2379  virtual void
2380  release_sync_xid(
2381  crofconn& conn,
2382  uint32_t xid)
2383  { transactions.drop_ta(xid); };
2384 
2385 private:
2386 
2387  virtual void
2388  ta_expired(ctransactions& tas, ctransaction& ta)
2389  {};
2390 
2391 private:
2392 
2393  virtual void
2394  handle_listen(
2395  csocket& socket,
2396  int newsd);
2397 
2398  virtual void
2399  handle_accepted(
2400  csocket& socket)
2401  { /* do nothing here */ };
2402 
2403  virtual void
2404  handle_accept_refused(
2405  csocket& socket)
2406  { /* do nothing here */ };
2407 
2408  virtual void
2409  handle_connected(
2410  csocket& socket)
2411  { /* do nothing here */ };
2412 
2413  virtual void
2414  handle_connect_refused(
2415  csocket& socket)
2416  { /* do nothing here */ };
2417 
2418  virtual void
2419  handle_connect_failed(
2420  csocket& socket)
2421  { /* do nothing here */ };
2422 
2423  virtual void
2424  handle_read(
2425  csocket& socket)
2426  { /* do nothing here */ };
2427 
2428  virtual void
2429  handle_write(
2430  csocket& socket)
2431  { /* do nothing here */ };
2432 
2433  virtual void
2434  handle_closed(
2435  csocket& socket);
2436 
2437 private:
2438 
2439  enum crofbase_event_t {
2440  EVENT_NONE = 0,
2441  EVENT_CTL_DETACHED = 1,
2442  EVENT_DPT_DETACHED = 2,
2443  };
2444 
2445  enum crofbase_timer_t {
2446  TIMER_NONE = 0,
2447  TIMER_RUN_ENGINE = 1,
2448  };
2449 
2450 private:
2451 
2452  bool
2453  is_dpt_listening(
2454  csocket& socket) const {
2455  for (std::map<unsigned int, csocket*>::const_iterator
2456  it = dpt_sockets.begin(); it != dpt_sockets.end(); ++it) {
2457  if (it->second == &socket) {
2458  return true;
2459  }
2460  }
2461  return false;
2462  };
2463 
2464  bool
2465  is_ctl_listening(
2466  csocket& socket) const {
2467  for (std::map<unsigned int, csocket*>::const_iterator
2468  it = ctl_sockets.begin(); it != ctl_sockets.end(); ++it) {
2469  if (it->second == &socket) {
2470  return true;
2471  }
2472  }
2473  return false;
2474  };
2475 
2476  void
2478  csocket& socket) {
2479  for (std::map<unsigned int, csocket*>::const_iterator
2480  it = dpt_sockets.begin(); it != dpt_sockets.end(); ++it) {
2481  if (it->second == &socket) {
2482  drop_dpt_listening(it->first); return;
2483  }
2484  }
2485  };
2486 
2487  void
2489  csocket& socket) {
2490  for (std::map<unsigned int, csocket*>::const_iterator
2491  it = ctl_sockets.begin(); it != ctl_sockets.end(); ++it) {
2492  if (it->second == &socket) {
2493  drop_ctl_listening(it->first); return;
2494  }
2495  }
2496  };
2497 
2498  virtual void
2499  handle_chan_established(
2500  crofdpt& dpt) {
2501  handle_dpt_open(dpt);
2502  };
2503 
2504  virtual void
2505  handle_chan_terminated(
2506  crofdpt& dpt) {
2507  // destroy crofdpt object, when is was created upon an incoming connection from a peer entity
2508  if (dpt.remove_on_channel_termination()) {
2509  dpts_detached.insert(dpt.get_dptid());
2510  push_on_eventqueue(EVENT_DPT_DETACHED);
2511  } else {
2512  handle_dpt_close(dpt);
2513  }
2514  };
2515 
2516  virtual void
2517  handle_chan_established(
2518  crofctl& ctl) {
2519  handle_ctl_open(ctl);
2520  };
2521 
2522  virtual void
2523  handle_chan_terminated(
2524  crofctl& ctl) {
2525  // destroy crofctl object, when is was created upon an incoming connection from a peer entity
2526  if (ctl.remove_on_channel_termination()) {
2527  ctls_detached.insert(ctl.get_ctlid());
2528  push_on_eventqueue(EVENT_CTL_DETACHED);
2529  } else {
2530  handle_ctl_close(ctl);
2531  }
2532  };
2533 
2534  virtual void
2535  handle_timeout(
2536  int opaque,
2537  void* data = (void*)0) {
2538  switch (opaque) {
2539  case TIMER_RUN_ENGINE: {
2540  work_on_eventqueue();
2541  } break;
2542  default: {
2543  // do nothing
2544  };
2545  }
2546  };
2547 
2548  void
2549  push_on_eventqueue(
2550  enum crofbase_event_t event = EVENT_NONE) {
2551  if (EVENT_NONE != event) {
2552  eventqueue.push_back(event);
2553  }
2554  register_timer(TIMER_RUN_ENGINE, rofl::ctimespec(/*second(s)=*/0));
2555  };
2556 
2557  void
2558  work_on_eventqueue() {
2559  while (not eventqueue.empty()) {
2560  crofbase_event_t event = eventqueue.front();
2561  eventqueue.pop_front();
2562  switch (event) {
2563  case EVENT_CTL_DETACHED: {
2564  event_ctls_detached();
2565  } break;
2566  case EVENT_DPT_DETACHED: {
2567  event_dpts_detached();
2568  } break;
2569  default: {
2570  // do nothing for unknown event types
2571  };
2572  }
2573  }
2574  };
2575 
2576  void
2577  event_ctls_detached() {
2578  for (std::set<rofl::cctlid>::iterator
2579  it = ctls_detached.begin(); it != ctls_detached.end(); ++it) {
2581  rofl::logging::info << "[rofl-common][crofbase] "
2582  << "dropping crofctl instance, ctlid:" << it->str() << std::endl;
2583  drop_ctl(*it);
2584  }
2585  ctls_detached.clear();
2586  };
2587 
2588  void
2589  event_dpts_detached() {
2590  for (std::set<rofl::cdptid>::iterator
2591  it = dpts_detached.begin(); it != dpts_detached.end(); ++it) {
2593  rofl::logging::info << "[rofl-common][crofbase] "
2594  << "dropping crofdpt instance, dptid:" << it->str() << std::endl;
2595  drop_dpt(*it);
2596  }
2597  dpts_detached.clear();
2598  };
2599 
2600 private:
2601 
2603  static std::set<crofbase*> rofbases;
2604 
2606  std::map<cctlid, crofctl*> rofctls;
2608  std::map<cdptid, crofdpt*> rofdpts;
2610  std::map<unsigned int, csocket*>
2611  dpt_sockets;
2613  std::map<unsigned int, csocket*>
2614  ctl_sockets;
2615  // supported OpenFlow versions
2617  versionbitmap;
2618  // pending OpenFlow transactions
2619  ctransactions transactions;
2620  // generation_id used for roles initially defined?
2621  bool generation_is_defined;
2622  // cached generation_id as defined by OpenFlow
2623  uint64_t cached_generation_id;
2624  // event-queue
2625  std::list<enum crofbase_event_t>
2626  eventqueue;
2627  // ephemeral set of crofdpt instances in detached state
2628  std::set<rofl::cdptid> dpts_detached;
2629  // ephemeral set of crofctl instances in detached state
2630  std::set<rofl::cctlid> ctls_detached;
2631 };
2632 
2633 }; // end of namespace
2634 
2635 #endif
2636 
2637 
Definition: cofmsg_barrier.h:125
virtual void handle_port_status(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_port_status &msg)
OpenFlow Port-Status-Reply message received.
Definition: crofbase.h:1611
rofl::csocket & set_ctl_listening(unsigned int sockid, enum rofl::csocket::socket_type_t socket_type, const rofl::cparams &params)
Returns a reference to the listening csocket object specified by identifier sockid.
Definition: crofbase.h:284
virtual void handle_table_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_table_stats_request &msg)
OpenFlow Table-Stats-Request message received.
Definition: crofbase.h:1833
Definition: cauxid.h:30
bool has_ctl(const rofl::cctlid &ctlid) const
Checks for existence of rofl::crofctl instance with given identifier.
Definition: crofbase.h:655
Definition: cofmsg_meter_stats.h:146
Definition: cofmsg_config.h:115
rofl::crofctl & add_ctl(const rofl::cctlid &ctlid, const rofl::openflow::cofhello_elem_versionbitmap &versionbitmap, bool remove_on_channel_close=false)
Creates new rofl::crofctl instance for given identifier.
Definition: crofbase.h:557
virtual void handle_barrier_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Barrier-Reply message.
Definition: crofbase.h:1584
bool has_dpt_listening(unsigned int sockid)
Checks for existence of a listening socket identified by sockid.
Definition: crofbase.h:228
virtual void handle_group_desc_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_group_desc_stats_reply &msg)
OpenFlow Group-Desc-Stats-Reply message received.
Definition: crofbase.h:1322
Definition: cparams.h:20
Definition: cofmsg_role.h:131
virtual void handle_get_async_config_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_get_async_config_reply &msg)
OpenFlow Get-Async-Config-Reply message received.
Definition: crofbase.h:1726
virtual void handle_conn_terminated(rofl::crofdpt &dpt, const rofl::cauxid &auxid)
Called when a control connection (main or auxiliary) has been terminated by the peer entity...
Definition: crofbase.h:798
Definition: cofmsg_group_mod.h:21
virtual void handle_port_desc_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_port_desc_stats_request &msg)
OpenFlow Port-Desc-Stats-Request message received.
Definition: crofbase.h:2001
rofl::cctlid get_idle_ctlid() const
Returns the next idle identifier for a new rofl::crofctl instance.
Definition: crofbase.h:518
Definition: cofmsg_queue_get_config.h:22
virtual void handle_table_mod(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_table_mod &msg)
OpenFlow Table-Mod message received.
Definition: crofbase.h:2085
virtual void handle_port_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_port_stats_reply &msg)
OpenFlow Port-Stats-Reply message received.
Definition: crofbase.h:1177
virtual void handle_error_message(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_error &msg)
OpenFlow Error message received.
Definition: crofbase.h:1654
void drop_dpt(rofl::cdptid dptid)
Deletes a rofl::crofdpt instance given by identifier.
Definition: crofbase.h:479
Environment expected by a rofl::crofctl instance.
Definition: crofctl.h:77
Definition: cofmsg_flow_stats.h:164
const rofl::cdptid & get_dptid() const
Returns rofl-common's internal rofl::cdptid identifier for this instance.
Definition: crofdpt.h:1092
void send_packet_in_message(const rofl::cauxid &auxid, uint32_t buffer_id, uint16_t total_len, uint8_t reason, uint8_t table_id, uint64_t cookie, uint16_t in_port, rofl::openflow::cofmatch &match, uint8_t *data, size_t datalen)
Sends OpenFlow Packet-In message to controller entity.
Definition: crofbase.cc:287
virtual void handle_features_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Features-Reply message.
Definition: crofbase.h:1046
Definition: cofmsg_table_mod.h:19
Definition: cofmsg_experimenter.h:19
Definition: cofmsg_port_stats.h:156
void send_flow_removed_message(const rofl::cauxid &auxid, rofl::openflow::cofmatch &match, uint64_t cookie, uint16_t priority, uint8_t reason, uint8_t table_id, uint32_t duration_sec, uint32_t duration_nsec, uint16_t idle_timeout, uint16_t hard_timeout, uint64_t packet_count, uint64_t byte_count)
Sends OpenFlow Flow-Removed message to controller entity.
Definition: crofbase.cc:375
virtual void handle_desc_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_desc_stats_reply &msg)
OpenFlow Desc-Stats-Reply message received.
Definition: crofbase.h:1119
virtual void handle_group_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_group_stats_reply &msg)
OpenFlow Group-Stats-Reply message received.
Definition: crofbase.h:1293
virtual void handle_group_features_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_group_features_stats_reply &msg)
OpenFlow Group-Features-Stats-Reply message received.
Definition: crofbase.h:1351
virtual void handle_role_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_role_reply &msg)
OpenFlow Role-Reply message received.
Definition: crofbase.h:1697
Definition: cofmsg_stats.h:264
Definition: cdpid.h:20
Definition: cofmsg_meter_mod.h:20
virtual void handle_table_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Table-Stats-Reply message.
Definition: crofbase.h:1164
virtual void handle_flow_mod(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_flow_mod &msg)
OpenFlow Flow-Mod message received.
Definition: crofbase.h:2057
virtual void handle_get_async_config_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_get_async_config_request &msg)
OpenFlow Get-Async-Config-Request message received.
Definition: crofbase.h:2183
A single socket.
Definition: csocket.h:182
Definition: crofbase.h:56
Definition: cofhelloelemversionbitmap.h:22
Definition: cofmsg_port_desc_stats.h:22
rofl-common's internal remote datapath handle.
Definition: cdptid.h:24
virtual void handle_flow_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Flow-Stats-Reply message.
Definition: crofbase.h:1222
virtual void handle_experimenter_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_experimenter_stats_request &msg)
OpenFlow Experimenter-Stats-Request message received.
Definition: crofbase.h:2015
void drop_dpt_listening(unsigned int sockid)
Removes a listening socket identified by sockid.
Definition: crofbase.h:213
virtual void handle_dpt_open(rofl::crofdpt &dpt)
Called after establishing the associated OpenFlow control channel.
Definition: crofbase.h:749
virtual void handle_packet_in(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_packet_in &msg)
OpenFlow Packet-In message received.
Definition: crofbase.h:1554
virtual void handle_role_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_role_request &msg)
OpenFlow Role-Request message received.
Definition: crofbase.h:2169
Definition: cofmsg_desc_stats.h:121
static uint32_t get_ofp_no_buffer(uint8_t ofp_version)
Returns OpenFlow's NO_BUFFER constant for various OpenFlow versions.
Definition: crofbase.cc:201
virtual void handle_flow_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_flow_stats_request &msg)
OpenFlow Flow-Stats-Request message received.
Definition: crofbase.h:1861
virtual void handle_conn_established(rofl::crofctl &ctl, const rofl::cauxid &auxid)
Called when a control connection (main or auxiliary) has been established.
Definition: crofbase.h:921
Definition: crofbase.h:47
virtual void handle_set_config(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_set_config &msg)
OpenFlow Set-Config message received.
Definition: crofbase.h:2127
Definition: crofbase.h:58
virtual void handle_experimenter_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Experimenter message.
Definition: crofbase.h:1684
rofl::cdptid get_idle_dptid() const
Returns the next idle identifier for a new rofl::crofdpt instance.
Definition: crofbase.h:354
virtual void handle_meter_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_meter_stats_reply &msg)
OpenFlow Meter-Stats-Reply message received.
Definition: crofbase.h:1380
virtual void handle_conn_refused(rofl::crofdpt &dpt, const rofl::cauxid &auxid)
Called when an attempt to establish a control connection has been refused.
Definition: crofbase.h:818
static uint32_t get_ofp_controller_port(uint8_t ofp_version)
Returns OpenFlow's OFPP_CONTROLLER constant for various OpenFlow versions.
Definition: crofbase.cc:215
Definition: crofbase.h:45
Definition: cofmsg_async_config.h:20
virtual void handle_conn_established(rofl::crofdpt &dpt, const rofl::cauxid &auxid)
Called when a control connection (main or auxiliary) has been established.
Definition: crofbase.h:782
static uint8_t get_ofp_command(uint8_t ofp_version, const enum openflow::ofp_flow_mod_command &cmd)
Returns OpenFlow's OFPFC constants for various OpenFlow versions.
Definition: crofbase.cc:243
virtual void handle_role_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Role-Reply message.
Definition: crofbase.h:1713
Definition: cofmsg_desc_stats.h:21
virtual void handle_dpt_close(rofl::crofdpt &dpt)
Called after termination of associated OpenFlow control channel.
Definition: crofbase.h:768
Definition: cofmsg_meter_features_stats.h:23
virtual void handle_conn_failed(rofl::crofdpt &dpt, const rofl::cauxid &auxid)
Called when an attempt to establish a control connection has been failed.
Definition: crofbase.h:836
virtual void handle_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_stats_reply &msg)
OpenFlow Stats-Reply message received.
Definition: crofbase.h:1088
Definition: cofmsg_port_mod.h:20
virtual void handle_ctl_close(rofl::crofctl &ctl)
Called after termination of associated OpenFlow control channel.
Definition: crofbase.h:907
Definition: cofmsg_error.h:21
void drop_ctls()
Deletes all existing rofl::crofctl instances.
Definition: crofbase.h:530
virtual void handle_get_config_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_get_config_reply &msg)
OpenFlow Get-Config-Reply message received.
Definition: crofbase.h:1059
virtual void handle_experimenter_message(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_experimenter &msg)
OpenFlow Experimenter message received.
Definition: crofbase.h:2141
crofbase(const rofl::openflow::cofhello_elem_versionbitmap &versionbitmap=rofl::openflow::cofhello_elem_versionbitmap())
crofbase constructor
Definition: crofbase.cc:13
virtual void handle_group_desc_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Group-Desc-Stats-Reply message.
Definition: crofbase.h:1338
virtual void handle_port_mod(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_port_mod &msg)
OpenFlow Port-Mod message received.
Definition: crofbase.h:2099
virtual void handle_experimenter_message(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_experimenter &msg)
OpenFlow Experimenter message received.
Definition: crofbase.h:1668
rofl::openflow::cofhello_elem_versionbitmap & set_versionbitmap()
Returns reference to OpenFlow version bitmap used for incoming connections.
Definition: crofbase.h:703
Definition: cofmsg_packet_in.h:21
virtual void handle_experimenter_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Experimenter-Stats-Reply message.
Definition: crofbase.h:1541
virtual void handle_get_config_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Get-Config-Reply message.
Definition: crofbase.h:1075
Definition: cofmsg_table_features_stats.h:22
virtual void handle_desc_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Desc-Stats-Reply message.
Definition: crofbase.h:1135
rofl::crofdpt & add_dpt(const rofl::cdptid &dptid, const rofl::openflow::cofhello_elem_versionbitmap &versionbitmap, bool remove_on_channel_close=false, const rofl::cdpid &dpid=rofl::cdpid(0))
Creates new rofl::crofdpt instance for given identifier.
Definition: crofbase.h:394
rofl::crofctl & set_ctl(const rofl::cctlid &ctlid, const rofl::openflow::cofhello_elem_versionbitmap &versionbitmap, bool remove_on_channel_close=false)
Returns existing or creates new rofl::crofctl instance for given identifier.
Definition: crofbase.h:585
Definition: cofmsg_stats.h:187
virtual void handle_meter_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Meter-Stats-Reply message.
Definition: crofbase.h:1396
virtual void handle_get_async_config_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Get-Async-Config-Reply message.
Definition: crofbase.h:1742
Definition: cofmsg_table_features_stats.h:161
virtual void handle_meter_features_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_meter_features_stats_reply &msg)
OpenFlow Meter-Features-Stats-Reply message received.
Definition: crofbase.h:1438
Definition: crofbase.h:57
Definition: cofmsg_queue_stats.h:144
Definition: cofmsg_group_desc_stats.h:22
Definition: cofmatch.h:35
Definition: cofmsg_group_stats.h:152
virtual void handle_port_desc_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_port_desc_stats_reply &msg)
OpenFlow Port-Desc-Stats-Reply message received.
Definition: crofbase.h:1496
virtual void handle_queue_get_config_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Table-Stats-Reply message.
Definition: crofbase.h:1641
Definition: cofmsg_port_desc_stats.h:123
bool has_ctl_listening(unsigned int sockid)
Checks for existence of a listening socket identified by sockid.
Definition: crofbase.h:331
rofl::csocket & add_ctl_listening(unsigned int sockid, enum rofl::csocket::socket_type_t socket_type, const rofl::cparams &params)
Creates a new listening rofl::csocket instance for accepting incoming OpenFlow connections.
Definition: crofbase.h:262
Definition: cofmsg_group_features_stats.h:120
Definition: cofmsg_port_status.h:20
virtual void handle_meter_mod(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_meter_mod &msg)
OpenFlow Meter-Mod message received.
Definition: crofbase.h:2211
virtual void handle_barrier_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_barrier_reply &msg)
OpenFlow Barrier-Reply message received.
Definition: crofbase.h:1568
virtual void handle_conn_refused(rofl::crofctl &ctl, const rofl::cauxid &auxid)
Called when an attempt to establish a control connection has been refused.
Definition: crofbase.h:957
void drop_ctl_listening(unsigned int sockid)
Removes a listening socket identified by sockid.
Definition: crofbase.h:316
virtual void handle_port_desc_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Port-Desc-Stats-Reply message.
Definition: crofbase.h:1512
Definition: cofmsg_aggr_stats.h:147
Definition: cofmsg_barrier.h:19
Definition: crofbase.h:50
Definition: crofbase.h:43
Definition: cofmsg_table_stats.h:23
virtual void handle_set_async_config(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_set_async_config &msg)
OpenFlow Set-Async-Config message received.
Definition: crofbase.h:2197
virtual void handle_desc_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_desc_stats_request &msg)
OpenFlow Desc-Stats-Request message received.
Definition: crofbase.h:1819
Environment expected by a rofl::crofconn instance.
Definition: crofconn.h:40
Definition: cofmsg_meter_config_stats.h:23
Definition: cofmsg_async_config.h:115
Definition: cofmsg_queue_get_config.h:152
virtual void handle_group_desc_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_group_desc_stats_request &msg)
OpenFlow Group-Desc-Stats-Request message received.
Definition: crofbase.h:1917
rofl::csocket & set_dpt_listening(unsigned int sockid, enum rofl::csocket::socket_type_t socket_type, const rofl::cparams &params)
Returns a reference to the listening csocket object specified by identifier sockid.
Definition: crofbase.h:181
Definition: cofmsg_config.h:19
const rofl::ctimerid & register_timer(int opaque, const rofl::ctimespec &timespec)
Installs a new timer to fire in t seconds.
Definition: ciosrv.h:698
virtual void handle_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid, uint8_t stats_type)
Timer expired while waiting for OpenFlow Stats-Reply message.
Definition: crofbase.h:1105
Definition: cofmsg_port_stats.h:23
static rofl::crofctl & get_ctl(const rofl::cctlid &ctlid)
Returns reference to rofl::crofctl instance identified by rofl-common's internal identifier.
Definition: crofctl.cc:17
Definition: crofbase.h:51
virtual void handle_port_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_port_stats_request &msg)
OpenFlow Port-Stats-Request message received.
Definition: crofbase.h:1847
static uint32_t get_ofp_flood_port(uint8_t ofp_version)
Returns OpenFlow's OFPP_FLOOD constant for various OpenFlow versions.
Definition: crofbase.cc:229
virtual void handle_aggregate_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Aggregate-Stats-Reply message.
Definition: crofbase.h:1251
Definition: cofmsg_group_features_stats.h:20
Definition: cofmsg_packet_out.h:21
const rofl::crofctl & get_ctl(const rofl::cctlid &ctlid) const
Returns const reference to existing rofl::crofctl instance.
Definition: crofbase.h:625
virtual void handle_conn_failed(rofl::crofctl &ctl, const rofl::cauxid &auxid)
Called when an attempt to establish a control connection has been failed.
Definition: crofbase.h:975
virtual void handle_group_mod(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_group_mod &msg)
OpenFlow Group-Mod message received.
Definition: crofbase.h:2071
rofl::crofctl & set_ctl(const rofl::cctlid &ctlid)
Returns reference to existing rofl::crofctl instance.
Definition: crofbase.h:606
Definition: cofmsg_role.h:20
virtual void handle_experimenter_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_experimenter_stats_reply &msg)
OpenFlow Experimenter-Stats-Reply message received.
Definition: crofbase.h:1525
virtual void handle_packet_out(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_packet_out &msg)
OpenFlow Packet-Out message received.
Definition: crofbase.h:2029
Definition: cofmsg_features.h:118
virtual void handle_conn_writable(rofl::crofctl &ctl, const rofl::cauxid &auxid)
Called when a congestion situation on the control connection has been solved.
Definition: crofbase.h:999
rofl::crofdpt & set_dpt(const rofl::cdptid &dptid, const rofl::openflow::cofhello_elem_versionbitmap &versionbitmap, bool remove_on_channel_close=false, const rofl::cdpid &dpid=rofl::cdpid(0))
Returns existing or creates new rofl::crofdpt instance for given identifier.
Definition: crofbase.h:424
virtual void handle_queue_get_config_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_queue_get_config_reply &msg)
OpenFlow Queue-Get-Config-Reply message received.
Definition: crofbase.h:1625
Definition: cofmsg_aggr_stats.h:20
uint8_t get_highest_supported_ofp_version() const
Returns highest OpenFlow version supported for incoming connections.
Definition: crofbase.h:717
Definition: cofmsg_queue_stats.h:23
An abstract interface defining the consumer side of a csocket.
Definition: csocket.h:58
void drop_ctl(rofl::cctlid ctlid)
Deletes a rofl::crofctl instance given by identifier.
Definition: crofbase.h:639
virtual void handle_meter_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_meter_stats_request &msg)
OpenFlow Meter-Stats-Request message received.
Definition: crofbase.h:1945
virtual ~crofbase()
crofbase destructor
Definition: crofbase.cc:25
virtual void handle_meter_config_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_meter_config_stats_reply &msg)
OpenFlow Meter-Config-Stats-Reply message received.
Definition: crofbase.h:1409
const rofl::csocket & get_dpt_listening(unsigned int sockid) const
Returns a const reference to the listening csocket object specified by identifier sockid...
Definition: crofbase.h:199
virtual void handle_aggregate_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_aggr_stats_reply &msg)
OpenFlow Aggregate-Stats-Reply message received.
Definition: crofbase.h:1235
Definition: cofmsg_flow_mod.h:20
Definition: cofmsg_flow_stats.h:29
rofl-common's internal remote controller handle.
Definition: cctlid.h:24
Definition: crofbase.h:44
const rofl::cctlid & get_ctlid() const
Returns rofl-common's internal rofl::cctlid identifier for this instance.
Definition: crofctl.h:794
void drop_dpts()
Deletes all existing rofl::crofdpt instances.
Definition: crofbase.h:366
virtual void handle_queue_get_config_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_queue_get_config_request &msg)
OpenFlow Queue-Get-Config-Request message received.
Definition: crofbase.h:2113
bool is_ofp_version_supported(uint8_t ofp_version) const
Returns true, when the given OpenFlow version is supported by this crofbase instance.
Definition: crofbase.h:724
virtual void handle_flow_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_flow_stats_reply &msg)
OpenFlow Flow-Stats-Reply message received.
Definition: crofbase.h:1206
virtual void handle_queue_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_queue_stats_request &msg)
OpenFlow Queue-Stats-Request message received.
Definition: crofbase.h:1889
Definition: crofbase.h:49
virtual void handle_table_features_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_table_features_stats_request &msg)
OpenFlow Table-Features-Stats-Request message received.
Definition: crofbase.h:1987
virtual void handle_port_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Port-Stats-Reply message.
Definition: crofbase.h:1193
Definition: cofmsg_meter_features_stats.h:88
virtual void handle_queue_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Queue-Stats-Reply message.
Definition: crofbase.h:1280
virtual void handle_group_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Group-Stats-Reply message.
Definition: crofbase.h:1309
const rofl::crofdpt & get_dpt(const rofl::cdptid &dptid) const
Returns const reference to existing rofl::crofdpt instance.
Definition: crofbase.h:465
Base class for IO services.
Definition: ciosrv.h:491
Definition: logging.h:76
virtual void handle_table_features_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_table_features_stats_reply &msg)
OpenFlow Table-Features-Stats-Reply message received.
Definition: crofbase.h:1467
virtual void handle_meter_config_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Meter-Config-Stats-Reply message.
Definition: crofbase.h:1425
virtual void handle_meter_features_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Meter-Features-Stats-Reply message.
Definition: crofbase.h:1454
Definition: cofmsg_group_desc_stats.h:123
Time specification used by class rofl::ctimer object.
Definition: ctimespec.h:25
virtual void handle_features_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_features_request &msg)
OpenFlow Features-Request message received.
Definition: crofbase.h:1777
Definition: cofport.h:52
Definition: cofmsg_table_stats.h:132
virtual void handle_error_message(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_error &msg)
OpenFlow error message received.
Definition: crofbase.h:2155
virtual void handle_flow_removed(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_flow_removed &msg)
OpenFlow Flow-Removed message received.
Definition: crofbase.h:1597
Definition: ctransactions.h:27
Definition: cofmsg_group_stats.h:21
Definition: cofmsg_features.h:22
Class representing a remote datapath element.
Definition: crofdpt.h:973
Definition: cofmsg_meter_stats.h:23
Definition: cofmsg_flow_removed.h:20
Definition: crofbase.h:53
virtual void handle_aggregate_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_aggr_stats_request &msg)
OpenFlow Aggregate-Stats-Request message received.
Definition: crofbase.h:1875
virtual void handle_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_stats_request &msg)
OpenFlow Stats-Request message received.
Definition: crofbase.h:1805
virtual void handle_ctl_open(rofl::crofctl &ctl)
Called after establishing the associated OpenFlow control channel.
Definition: crofbase.h:888
Definition: crofbase.h:52
virtual void handle_group_features_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Group-Features-Stats-Reply message.
Definition: crofbase.h:1367
Definition: crofbase.h:54
Definition: cofmsg_meter_config_stats.h:147
Definition: cofmsg_async_config.h:226
virtual void handle_queue_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_queue_stats_reply &msg)
OpenFlow Queue-Stats-Reply message received.
Definition: crofbase.h:1264
virtual void handle_group_features_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_group_features_stats_request &msg)
OpenFlow Group-Features-Stats-Request message received.
Definition: crofbase.h:1931
const rofl::openflow::cofhello_elem_versionbitmap & get_versionbitmap() const
Returns const reference to OpenFlow version bitmap used for incoming connections. ...
Definition: crofbase.h:710
virtual void handle_conn_writable(rofl::crofdpt &dpt, const rofl::cauxid &auxid)
Called when a congestion situation on the control connection has been solved.
Definition: crofbase.h:860
virtual void handle_get_config_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_get_config_request &msg)
OpenFlow Get-Config-Request message received.
Definition: crofbase.h:1791
Environment expected by a rofl::crofdpt instance.
Definition: crofdpt.h:75
virtual void handle_conn_terminated(rofl::crofctl &ctl, const rofl::cauxid &auxid)
Called when a control connection (main or auxiliary) has been terminated by the peer entity...
Definition: crofbase.h:937
virtual void handle_table_stats_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_table_stats_reply &msg)
OpenFlow Table-Stats-Reply message received.
Definition: crofbase.h:1148
virtual void handle_table_features_stats_reply_timeout(rofl::crofdpt &dpt, uint32_t xid)
Timer expired while waiting for OpenFlow Table-Features-Stats-Reply message.
Definition: crofbase.h:1483
void close_ctl_listening()
Closes all listening csocket instances.
Definition: crofbase.h:247
Definition: cofmsg_experimenter_stats.h:21
virtual void handle_barrier_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_barrier_request &msg)
OpenFlow Barrier-Request message received.
Definition: crofbase.h:2043
virtual void handle_group_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_group_stats_request &msg)
OpenFlow Group-Stats-Request message received.
Definition: crofbase.h:1903
virtual void handle_meter_config_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_meter_config_stats_request &msg)
OpenFlow Meter-Config-Stats-Request message received.
Definition: crofbase.h:1959
Definition: cofmsg_config.h:332
rofl::csocket & add_dpt_listening(unsigned int sockid, enum rofl::csocket::socket_type_t socket_type, const rofl::cparams &params)
Creates a new listening rofl::csocket instance for accepting incoming OpenFlow connections.
Definition: crofbase.h:159
static rofl::crofdpt & get_dpt(const rofl::cdptid &dptid)
Returns reference to rofl::crofdpt instance identified by rofl-common's internal identifier.
Definition: crofdpt.cc:17
void close_dpt_listening()
Closes all listening csocket instances.
Definition: crofbase.h:144
Base class for revised OpenFlow library.
Definition: crofbase.h:100
void send_port_status_message(const rofl::cauxid &auxid, uint8_t reason, const rofl::openflow::cofport &port)
Sends OpenFlow Port-Status message to controller entity.
Definition: crofbase.cc:467
Definition: crofbase.h:48
bool has_dpt(const rofl::cdptid &dptid) const
Checks for existence of rofl::crofdpt instance with given identifier.
Definition: crofbase.h:495
virtual void handle_meter_features_stats_request(rofl::crofctl &ctl, const rofl::cauxid &auxid, rofl::openflow::cofmsg_meter_features_stats_request &msg)
OpenFlow Meter-Features-Stats-Request message received.
Definition: crofbase.h:1973
const rofl::csocket & get_ctl_listening(unsigned int sockid) const
Returns a const reference to the listening csocket object specified by identifier sockid...
Definition: crofbase.h:302
virtual void handle_features_reply(rofl::crofdpt &dpt, const rofl::cauxid &auxid, rofl::openflow::cofmsg_features_reply &msg)
OpenFlow Features-Reply message received.
Definition: crofbase.h:1030
Definition: crofbase.h:46
Definition: croflexception.h:27
Definition: cofmsg_experimenter_stats.h:184
Class representing a remote controller entity.
Definition: crofctl.h:715
Definition: crofbase.h:55
rofl::crofdpt & set_dpt(const rofl::cdptid &dptid)
Returns reference to existing rofl::crofdpt instance.
Definition: crofbase.h:446
Definition: cofmsg.h:62