14 #include "../endian_conversion.h"
18 #include "rofl/common/croflexception.h"
19 #include "rofl/common/cmemory.h"
20 #include "rofl/common/caddress.h"
21 #include "rofl/common/openflow/openflow_rofl_exceptions.h"
22 #include "rofl/common/openflow/coxmatch.h"
23 #include "rofl/common/openflow/coxmatch_output.h"
24 #include "rofl/common/logging.h"
25 #include "rofl/common/cindex.h"
46 std::ostream& os,
const cofaction& action);
54 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
56 ofp_version(ofp_version),
70 const cofaction& action) { *
this = action; };
80 ofp_version = action.ofp_version;
90 check_prerequisites()
const {};
98 get_version()
const {
return ofp_version; };
104 set_version(uint8_t ofp_version) { this->ofp_version = ofp_version; };
110 get_type()
const {
return type; };
116 set_type(uint16_t type) { this->type = type; };
122 get_length()
const {
return len; };
128 set_length(uint16_t len) { this->len = len; };
143 uint8_t* buf,
size_t buflen);
150 uint8_t* buf,
size_t buflen);
155 operator<< (std::ostream& os,
cofaction const& action) {
157 os <<
"ofp-version:" << (int)action.get_version() <<
" ";
158 os <<
"type:0x" << std::hex << (int)action.get_type() << std::dec <<
" ";
159 os <<
"length:" << (int)action.get_length() <<
" ";
160 os <<
" >" << std::endl;
169 bool operator() (
const cofaction& action) {
170 return (action.get_type() == type);
172 bool operator() (
const cofaction* action) {
173 return (action->get_type() == type);
175 bool operator() (
const std::pair<cindex, cofaction*>& p) {
176 return (p.second->get_type() == type);
197 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
198 uint32_t port_no = 0,
199 uint16_t max_len = 128) :
200 cofaction(ofp_version, rofl::openflow::OFPAT_OUTPUT),
224 cofaction::operator= (action);
225 port_no = action.port_no;
226 max_len = action.max_len;
234 check_prerequisites()
const;
242 set_port_no(uint32_t port_no) { this->port_no = port_no; };
248 get_port_no()
const {
return port_no; };
254 set_max_len(uint16_t max_len) { this->max_len = max_len; };
260 get_max_len()
const {
return max_len; };
275 uint8_t* buf,
size_t buflen);
282 uint8_t* buf,
size_t buflen);
290 os <<
"port-no: 0x" << (
unsigned int)action.get_port_no() <<
" ";
291 os <<
"max-len: 0x" << (
unsigned int)action.get_max_len() <<
" ";
293 os <<
">" << std::endl;
295 os << dynamic_cast<cofaction const&>( action );
320 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
321 uint16_t vlan_vid = 0) :
322 cofaction(ofp_version, rofl::openflow::OFPAT_SET_VLAN_VID),
323 vlan_vid(vlan_vid) {};
345 cofaction::operator= (action);
346 vlan_vid = action.vlan_vid;
357 set_vlan_vid(uint16_t vlan_vid) { this->vlan_vid = vlan_vid; };
363 get_vlan_vid()
const {
return vlan_vid; };
378 uint8_t* buf,
size_t buflen);
385 uint8_t* buf,
size_t buflen);
392 os <<
"vid:0x" << std::hex << (
unsigned int)action.get_vlan_vid() << std::dec <<
" >" << std::endl;
394 os << dynamic_cast<cofaction const&>( action );
415 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
416 uint8_t vlan_pcp = 0) :
417 cofaction(ofp_version, rofl::openflow::OFPAT_SET_VLAN_PCP),
418 vlan_pcp(vlan_pcp) {};
440 cofaction::operator= (action);
441 vlan_pcp = action.vlan_pcp;
451 set_vlan_pcp(uint8_t vlan_pcp) { this->vlan_pcp = vlan_pcp; };
457 get_vlan_pcp()
const {
return vlan_pcp; };
472 uint8_t* buf,
size_t buflen);
479 uint8_t* buf,
size_t buflen);
486 os <<
"pcp:ox" << std::hex << (
unsigned int)action.get_vlan_pcp() << std::dec <<
" >" << std::endl;
488 os << dynamic_cast<cofaction const&>( action );
509 cofaction(ofp_version, rofl::openflow::OFPAT_STRIP_VLAN) {};
531 cofaction::operator= (action);
548 uint8_t* buf,
size_t buflen);
555 uint8_t* buf,
size_t buflen);
561 os <<
rofl::indent(0) <<
"<cofaction_strip_vlan >" << std::endl;
563 os << dynamic_cast<const cofaction&>( action );
577 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
579 cofaction(ofp_version, rofl::openflow::OFPAT_SET_DL_SRC),
602 cofaction::operator= (action);
603 macaddr = action.macaddr;
613 get_dl_src()
const {
return macaddr; };
619 set_dl_src() {
return macaddr; };
625 set_dl_src(
const cmacaddr& macaddr) { this->macaddr = macaddr; };
640 uint8_t* buf,
size_t buflen);
647 uint8_t* buf,
size_t buflen);
653 os <<
rofl::indent(0) <<
"<cofaction_set_dl_src macaddr:";
654 os << action.get_dl_src() <<
" >" << std::endl;
656 os << dynamic_cast<cofaction const&>( action );
674 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
676 cofaction(ofp_version, rofl::openflow::OFPAT_SET_DL_DST),
699 cofaction::operator= (action);
700 macaddr = action.macaddr;
710 get_dl_dst()
const {
return macaddr; };
716 set_dl_dst() {
return macaddr; };
722 set_dl_dst(
const cmacaddr& macaddr) { this->macaddr = macaddr; };
737 uint8_t* buf,
size_t buflen);
744 uint8_t* buf,
size_t buflen);
750 os <<
rofl::indent(0) <<
"<cofaction_set_dl_dst macaddr:";
751 os << action.get_dl_dst() <<
" >" << std::endl;
753 os << dynamic_cast<cofaction const&>( action );
771 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
773 cofaction(ofp_version, rofl::openflow::OFPAT_SET_NW_SRC),
796 cofaction::operator= (action);
808 get_nw_src()
const {
return addr; };
814 set_nw_src() {
return addr; };
820 set_nw_src(
const caddress_in4& addr) { this->addr = addr; };
835 uint8_t* buf,
size_t buflen);
842 uint8_t* buf,
size_t buflen);
849 os <<
"nw-src:" << action.get_nw_src() <<
" >" << std::endl;
851 os << dynamic_cast<cofaction const&>( action );
869 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
871 cofaction(ofp_version, rofl::openflow::OFPAT_SET_NW_DST),
894 cofaction::operator= (action);
906 get_nw_dst()
const {
return addr; };
912 set_nw_dst() {
return addr; };
918 set_nw_dst(
const caddress_in4& addr) { this->addr = addr; };
933 uint8_t* buf,
size_t buflen);
940 uint8_t* buf,
size_t buflen);
947 os <<
"nw-dst:" << action.get_nw_dst() <<
" >" << std::endl;
949 os << dynamic_cast<cofaction const&>( action );
968 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
969 uint8_t nw_tos = 0) :
970 cofaction(ofp_version, rofl::openflow::OFPAT_SET_NW_TOS),
993 cofaction::operator= (action);
994 nw_tos = action.nw_tos;
1004 set_nw_tos(uint8_t nw_tos) { this->nw_tos = nw_tos; };
1010 get_nw_tos()
const {
return nw_tos; };
1025 uint8_t* buf,
size_t buflen);
1032 uint8_t* buf,
size_t buflen);
1036 friend std::ostream&
1039 os <<
"nw-tos:0x" << std::hex << (
unsigned int)action.get_nw_tos() << std::dec <<
" >" << std::endl;
1041 os << dynamic_cast<cofaction const&>( action );
1059 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
1060 uint16_t tp_src = 0) :
1061 cofaction(ofp_version, rofl::openflow::OFPAT_SET_TP_SRC),
1082 if (
this == &action)
1084 cofaction::operator= (action);
1085 tp_src = action.tp_src;
1095 set_tp_src(uint16_t tp_src) { this->tp_src = tp_src; };
1101 get_tp_src()
const {
return tp_src; };
1116 uint8_t* buf,
size_t buflen);
1123 uint8_t* buf,
size_t buflen);
1127 friend std::ostream&
1130 os <<
"tp-src:" << (
unsigned int)action.get_tp_src() <<
" >" << std::endl;
1132 os << dynamic_cast<cofaction const&>( action );
1150 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
1151 uint16_t tp_dst = 0) :
1152 cofaction(ofp_version, rofl::openflow::OFPAT_SET_TP_DST),
1173 if (
this == &action)
1175 cofaction::operator= (action);
1176 tp_dst = action.tp_dst;
1186 set_tp_dst(uint16_t tp_dst) { this->tp_dst = tp_dst; };
1192 get_tp_dst()
const {
return tp_dst; };
1207 uint8_t* buf,
size_t buflen);
1214 uint8_t* buf,
size_t buflen);
1218 friend std::ostream&
1221 os <<
"tp-dst:" << (
unsigned int)action.get_tp_dst() <<
" >" << std::endl;
1223 os << dynamic_cast<cofaction const&>( action );
1241 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
1242 uint16_t port_no = 0,
1243 uint32_t queue_id = 0) :
1244 cofaction(ofp_version, rofl::openflow10::OFPAT_ENQUEUE),
1246 queue_id(queue_id) {};
1266 if (
this == &action)
1268 cofaction::operator= (action);
1269 port_no = action.port_no;
1270 queue_id = action.queue_id;
1280 set_port_no(uint16_t port_no) { this->port_no = port_no; };
1286 get_port_no()
const {
return port_no; };
1292 set_queue_id(uint32_t queue_id) { this->queue_id = queue_id; };
1298 get_queue_id()
const {
return queue_id; };
1313 uint8_t* buf,
size_t buflen);
1320 uint8_t* buf,
size_t buflen);
1324 friend std::ostream&
1328 os <<
"port-no:0x" << (
unsigned int)action.get_port_no() <<
" ";
1329 os <<
"queue-id:0x" << (
unsigned int)action.get_queue_id() <<
" >" << std::endl;
1332 os << dynamic_cast<cofaction const&>( action );
1351 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
1352 uint32_t exp_id = 0,
1354 cofaction(ofp_version, rofl::openflow::OFPAT_EXPERIMENTER),
1356 exp_body(exp_body) {};
1376 if (
this == &action)
1378 cofaction::operator= (action);
1379 exp_id = action.exp_id;
1380 exp_body = action.exp_body;
1390 set_exp_id(uint32_t exp_id) { this->exp_id = exp_id; };
1396 get_exp_id()
const {
return exp_id; };
1402 get_exp_body()
const {
return exp_body; };
1408 set_exp_body() {
return exp_body; };
1423 uint8_t* buf,
size_t buflen);
1430 uint8_t* buf,
size_t buflen);
1434 friend std::ostream&
1437 os <<
"exp-id:0x" << std::hex << (
unsigned int)action.get_exp_id() << std::dec <<
" >" << std::endl;
1439 os << dynamic_cast<cofaction const&>( action );
1440 os << action.get_exp_body();
1459 cofaction(ofp_version, rofl::openflow::OFPAT_COPY_TTL_OUT) {};
1479 if (
this == &action)
1481 cofaction::operator= (action);
1498 uint8_t* buf,
size_t buflen);
1505 uint8_t* buf,
size_t buflen);
1509 friend std::ostream&
1511 os <<
rofl::indent(0) <<
"<cofaction_copy_ttl_out >" << std::endl;
1513 os << dynamic_cast<cofaction const&>( action );
1527 cofaction(ofp_version, rofl::openflow::OFPAT_COPY_TTL_IN) {};
1547 if (
this == &action)
1549 cofaction::operator= (action);
1566 uint8_t* buf,
size_t buflen);
1573 uint8_t* buf,
size_t buflen);
1577 friend std::ostream&
1579 os <<
rofl::indent(0) <<
"<cofaction_copy_ttl_in >" << std::endl;
1581 os << dynamic_cast<cofaction const&>( action );
1595 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
1596 uint8_t mpls_ttl = 0) :
1597 cofaction(ofp_version, rofl::openflow::OFPAT_SET_MPLS_TTL),
1598 mpls_ttl(mpls_ttl) {};
1618 if (
this == &action)
1620 cofaction::operator= (action);
1621 mpls_ttl = action.mpls_ttl;
1631 set_mpls_ttl(uint8_t mpls_ttl) { this->mpls_ttl = mpls_ttl; };
1637 get_mpls_ttl()
const {
return mpls_ttl; };
1652 uint8_t* buf,
size_t buflen);
1659 uint8_t* buf,
size_t buflen);
1663 friend std::ostream&
1666 os <<
"mpls-ttl:0x" << std::hex << (
unsigned int)action.get_mpls_ttl() << std::dec <<
" >" << std::endl;
1668 os << dynamic_cast<cofaction const&>( action );
1686 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN) :
1687 cofaction(ofp_version, rofl::openflow::OFPAT_DEC_MPLS_TTL) {};
1707 if (
this == &action)
1709 cofaction::operator= (action);
1726 uint8_t* buf,
size_t buflen);
1733 uint8_t* buf,
size_t buflen);
1737 friend std::ostream&
1739 os <<
rofl::indent(0) <<
"<cofaction_dec_mpls_ttl >" << std::endl;
1741 os << dynamic_cast<cofaction const&>( action );
1755 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
1756 uint16_t eth_type = 0) :
1757 cofaction(ofp_version, rofl::openflow::OFPAT_PUSH_VLAN),
1758 eth_type(eth_type) {};
1778 if (
this == &action)
1780 cofaction::operator= (action);
1781 eth_type = action.eth_type;
1798 uint8_t* buf,
size_t buflen);
1805 uint8_t* buf,
size_t buflen);
1813 set_eth_type(uint16_t eth_type) { this->eth_type = eth_type; };
1819 get_eth_type()
const {
return eth_type; };
1823 friend std::ostream&
1826 os <<
"eth-type:0x" << std::hex << (
unsigned int)action.get_eth_type() << std::dec <<
" >" << std::endl;
1828 os << dynamic_cast<cofaction const&>( action );
1846 cofaction(ofp_version, rofl::openflow::OFPAT_POP_VLAN) {};
1866 if (
this == &action)
1868 cofaction::operator= (action);
1885 uint8_t* buf,
size_t buflen);
1892 uint8_t* buf,
size_t buflen);
1896 friend std::ostream&
1898 os <<
rofl::indent(0) <<
"<cofaction_pop_vlan >" << std::endl;
1900 os << dynamic_cast<cofaction const&>( action );
1914 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
1915 uint16_t eth_type = 0) :
1916 cofaction(ofp_version, rofl::openflow::OFPAT_PUSH_MPLS),
1917 eth_type(eth_type) {};
1937 if (
this == &action)
1939 cofaction::operator= (action);
1940 eth_type = action.eth_type;
1957 uint8_t* buf,
size_t buflen);
1964 uint8_t* buf,
size_t buflen);
1972 set_eth_type(uint16_t eth_type) { this->eth_type = eth_type; };
1978 get_eth_type()
const {
return eth_type; };
1982 friend std::ostream&
1985 os <<
"eth-type:0x" << std::hex << (
unsigned int)action.get_eth_type() << std::dec <<
" >" << std::endl;
1987 os << dynamic_cast<cofaction const&>( action );
2005 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
2006 uint16_t eth_type = 0) :
2007 cofaction(ofp_version, rofl::openflow::OFPAT_POP_MPLS),
2008 eth_type(eth_type) {};
2028 if (
this == &action)
2030 cofaction::operator= (action);
2031 eth_type = action.eth_type;
2048 uint8_t* buf,
size_t buflen);
2055 uint8_t* buf,
size_t buflen);
2063 set_eth_type(uint16_t eth_type) { this->eth_type = eth_type; };
2069 get_eth_type()
const {
return eth_type; };
2073 friend std::ostream&
2076 os <<
"eth-type:0x" << std::hex << (
unsigned int)action.get_eth_type() << std::dec <<
" >" << std::endl;
2078 os << dynamic_cast<cofaction const&>( action );
2096 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
2097 uint32_t group_id = 0) :
2098 cofaction(ofp_version, rofl::openflow::OFPAT_GROUP),
2099 group_id(group_id) {};
2119 if (
this == &action)
2121 cofaction::operator= (action);
2122 group_id = action.group_id;
2131 set_group_id(uint32_t group_id) { this->group_id = group_id; };
2137 get_group_id()
const {
return group_id; };
2152 uint8_t* buf,
size_t buflen);
2159 uint8_t* buf,
size_t buflen);
2163 friend std::ostream&
2166 os <<
"group-id:0x" << std::hex << (int)action.get_group_id() << std::dec <<
" >" << std::endl;
2168 os << dynamic_cast<cofaction const&>( action );
2186 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
2187 uint8_t nw_ttl = 0) :
2188 cofaction(ofp_version, rofl::openflow::OFPAT_SET_NW_TTL),
2209 if (
this == &action)
2211 cofaction::operator= (action);
2212 nw_ttl = action.nw_ttl;
2222 set_nw_ttl(uint8_t nw_ttl) { this->nw_ttl = nw_ttl; };
2228 get_nw_ttl()
const {
return nw_ttl; };
2243 uint8_t* buf,
size_t buflen);
2250 uint8_t* buf,
size_t buflen);
2254 friend std::ostream&
2257 os <<
"nw-ttl:" << (
unsigned int)action.get_nw_ttl() <<
" >" << std::endl;
2259 os << dynamic_cast<cofaction const&>( action );
2277 cofaction(ofp_version, rofl::openflow::OFPAT_DEC_NW_TTL) {};
2297 if (
this == &action)
2299 cofaction::operator= (action);
2316 uint8_t* buf,
size_t buflen);
2323 uint8_t* buf,
size_t buflen);
2327 friend std::ostream&
2329 os <<
rofl::indent(0) <<
"<cofaction_dec_nw_ttl >" << std::endl;
2331 os << dynamic_cast<cofaction const&>( action );
2345 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
2346 uint32_t queue_id = 0) :
2347 cofaction(ofp_version, rofl::openflow::OFPAT_SET_QUEUE),
2348 queue_id(queue_id) {};
2368 if (
this == &action)
2370 cofaction::operator= (action);
2371 queue_id = action.queue_id;
2381 set_queue_id(uint32_t queue_id) { this->queue_id = queue_id; };
2387 get_queue_id()
const {
return queue_id; };
2402 uint8_t* buf,
size_t buflen);
2409 uint8_t* buf,
size_t buflen);
2413 friend std::ostream&
2416 os <<
"queue-id:" << (
unsigned int)action.get_queue_id() <<
" >" << std::endl;
2418 os << dynamic_cast<cofaction const&>( action );
2436 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
2438 cofaction(ofp_version, rofl::openflow::OFPAT_SET_FIELD),
2459 if (
this == &action)
2461 cofaction::operator= (action);
2472 set_oxm() {
return oxm; };
2484 get_oxm()
const {
return oxm; };
2499 uint8_t* buf,
size_t buflen);
2506 uint8_t* buf,
size_t buflen);
2510 friend std::ostream&
2512 os <<
rofl::indent(0) <<
"<cofaction_set_field >" << std::endl;
2514 os << dynamic_cast<cofaction const&>( action );
2534 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
2535 uint32_t exp_id = 0,
2537 cofaction(ofp_version, rofl::openflow::OFPAT_EXPERIMENTER),
2539 exp_body(exp_body) {};
2559 if (
this == &action)
2561 cofaction::operator= (action);
2562 exp_id = action.exp_id;
2563 exp_body = action.exp_body;
2573 set_exp_id(uint32_t exp_id) { this->exp_id = exp_id; };
2579 get_exp_id()
const {
return exp_id; };
2585 set_exp_body() {
return exp_body; };
2591 set_exp_body(
const rofl::cmemory& exp_body) { this->exp_body = exp_body; };
2597 get_exp_body()
const {
return exp_body; };
2612 uint8_t* buf,
size_t buflen);
2619 uint8_t* buf,
size_t buflen);
2623 friend std::ostream&
2627 os <<
"exp-id:0x" << (
unsigned int)action.get_exp_id() <<
" ";
2629 os <<
">" << std::endl;
2631 os << dynamic_cast<cofaction const&>( action );
2632 os << action.get_exp_body();
2651 uint8_t ofp_version = rofl::openflow::OFP_VERSION_UNKNOWN,
2652 uint16_t eth_type = 0) :
2653 cofaction(ofp_version, rofl::openflow::OFPAT_PUSH_PBB),
2654 eth_type(eth_type) {};
2674 if (
this == &action)
2676 cofaction::operator= (action);
2677 eth_type = action.eth_type;
2694 uint8_t* buf,
size_t buflen);
2701 uint8_t* buf,
size_t buflen);
2709 set_eth_type(uint16_t eth_type) { this->eth_type = eth_type; };
2715 get_eth_type()
const {
return eth_type; };
2719 friend std::ostream&
2722 os <<
"eth-type:0x" << std::hex << (
unsigned int)action.get_eth_type() << std::dec <<
" >" << std::endl;
2724 os << dynamic_cast<cofaction const&>( action );
2742 cofaction(ofp_version, rofl::openflow::OFPAT_POP_PBB) {};
2762 if (
this == &action)
2764 cofaction::operator= (action);
2781 uint8_t* buf,
size_t buflen);
2788 uint8_t* buf,
size_t buflen);
2792 friend std::ostream&
2794 os <<
rofl::indent(0) <<
"<cofaction_pop_pbb >" << std::endl;
2796 os << dynamic_cast<cofaction const&>( action );
2805 #endif // COFACTION_H
Definition: cofaction.h:1839
Definition: cofaction.h:2089
Definition: cofaction.h:570
Definition: cofaction.h:2644
Definition: caddress.h:152
Definition: cofaction.h:34
Definition: cofaction.h:190
Definition: cofaction.h:1679
Definition: cofaction.h:961
Definition: cofaction.h:1344
Definition: cofaction.h:2527
Definition: cofaction.h:408
Definition: cofaction.h:2179
Definition: cofaction.h:1520
Definition: cofaction.h:502
Definition: cofaction.h:2338
Definition: cofaction.h:764
Definition: cofaction.h:35
Definition: cofaction.h:1052
Definition: cofaction.h:667
Definition: cofaction.h:1452
Definition: cofaction.h:313
Definition: coxmatch.h:49
Definition: cofaction.h:164
Definition: cofaction.h:1588
Definition: cofaction.h:862
Definition: cofaction.h:1143
Definition: cofaction.h:38
Definition: caddress.h:415
C++ abstraction for malloc'ed memory areas.
Definition: cmemory.h:44
Definition: cofaction.h:2429
Definition: openflow_common.h:186
Definition: coxmatch_output.h:25
Definition: cofaction.h:1998
Definition: cofaction.h:33
Definition: cofaction.h:1907
Definition: cofaction.h:2735
Definition: cofaction.h:32
Definition: cofaction.h:1748
Definition: cofaction.h:2270
Definition: croflexception.h:27
Definition: cofaction.h:1234