OMNET++ OPENFLOW is currently the most prominent approach which implements the SDN concept and offers a high flexibility in the routing of network flows. OpenFlow standard is managed by the Open Networking Foundation (ONF).
Basic principle of openflow:
- Added as feature to commercial switches.
- It’s an open standard.
- Separation of control and data-plane layers.
OPENFLOW versions with their features:
- OpenFlow version 1.1.
- Group actions.
- Multiple flow tables.
- OpenFlow version 1.2.
- Extensible match support.
- OpenFlow version 1.3.
- Per flow meters.
Message types in OpneFlow:
- Asynchronous messages.
- Establishment of OpenFlow channel.
- Modify-state and packet-out messages.
Sample code for OpenFlow:
#ifndef FLOW_TABLE_H_ #define FLOW_TABLE_H_ #include <list> #include <map> #include <openflow.h> using namespace __gnu_cxx; struct flow_table_counters { }; struct flow_table_instructions { ofp_action_output actions[1]; }; struct entry_data { flow_table_counters *counters; flow_table_instructions *instruc; }; struct ltmatch { bool operator() (const oxm_basic_match m1, const oxm_basic_match m2) const { if(m1.OFB_IN_PORT == m2.OFB_IN_PORT){ return false; }else if(m1.OFB_ETH_TYPE == m2.OFB_ETH_TYPE){ return false; }else if(m1.OFB_ETH_SRC == m2.OFB_ETH_SRC){ return false; }else if(m1.OFB_ETH_DST == m2.OFB_ETH_DST){ return false; }else if (m1.wildcards != m2.wildcards){ return false; } else return true; } }; class Flow_Table : public cSimpleModule { public: Flow_Table(); void addEntry(oxm_basic_match *match, entry_data* entry); bool deleteEntry(oxm_basic_match *match); bool lookup(oxm_basic_match *match); ofp_action_output *returnAction(oxm_basic_match *match); protected: virtual void initialize(); virtual void handleMessage(cMessage *msg); private: std::multimap<oxm_basic_match, entry_data, ltmatch> entry_map; int size; }; #endif