#ifndef _NET_OFP_H_
#define _NET_OFP_H_
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#define OFP_IFNAMSIZ 16
#define OFP_ALIGNMENT 8
#define OFP_ALIGN(_x) (((_x) + (OFP_ALIGNMENT - 1)) & ~(OFP_ALIGNMENT - 1))
struct ofp_header {
uint8_t oh_version;
uint8_t oh_type;
uint16_t oh_length;
uint32_t oh_xid;
} __packed;
#define OFP_V_0 0x00
#define OFP_V_1_0 0x01
#define OFP_V_1_1 0x02
#define OFP_V_1_2 0x03
#define OFP_V_1_3 0x04
#define OFP_V_1_4 0x05
#define OFP_V_1_5 0x06
#define OFP_T_HELLO 0
#define OFP_T_ERROR 1
#define OFP_T_ECHO_REQUEST 2
#define OFP_T_ECHO_REPLY 3
#define OFP_T_EXPERIMENTER 4
#define OFP_T_FEATURES_REQUEST 5
#define OFP_T_FEATURES_REPLY 6
#define OFP_T_GET_CONFIG_REQUEST 7
#define OFP_T_GET_CONFIG_REPLY 8
#define OFP_T_SET_CONFIG 9
#define OFP_T_PACKET_IN 10
#define OFP_T_FLOW_REMOVED 11
#define OFP_T_PORT_STATUS 12
#define OFP_T_PACKET_OUT 13
#define OFP_T_FLOW_MOD 14
#define OFP_T_GROUP_MOD 15
#define OFP_T_PORT_MOD 16
#define OFP_T_TABLE_MOD 17
#define OFP_T_MULTIPART_REQUEST 18
#define OFP_T_MULTIPART_REPLY 19
#define OFP_T_BARRIER_REQUEST 20
#define OFP_T_BARRIER_REPLY 21
#define OFP_T_QUEUE_GET_CONFIG_REQUEST 22
#define OFP_T_QUEUE_GET_CONFIG_REPLY 23
#define OFP_T_ROLE_REQUEST 24
#define OFP_T_ROLE_REPLY 25
#define OFP_T_GET_ASYNC_REQUEST 26
#define OFP_T_GET_ASYNC_REPLY 27
#define OFP_T_SET_ASYNC 28
#define OFP_T_METER_MOD 29
#define OFP_T_TYPE_MAX 30
struct ofp_hello_element_header {
uint16_t he_type;
uint16_t he_length;
} __packed;
#define OFP_HELLO_T_VERSION_BITMAP 1
struct ofp_hello_element_versionbitmap {
uint16_t hev_type;
uint16_t hev_length;
} __packed;
#define OFP_PORT_MAX 0xffffff00
#define OFP_PORT_INPUT 0xfffffff8
#define OFP_PORT_FLOWTABLE 0xfffffff9
#define OFP_PORT_NORMAL 0xfffffffa
#define OFP_PORT_FLOOD 0xfffffffb
#define OFP_PORT_ALL 0xfffffffc
#define OFP_PORT_CONTROLLER 0xfffffffd
#define OFP_PORT_LOCAL 0xfffffffe
#define OFP_PORT_ANY 0xffffffff
struct ofp_switch_config {
struct ofp_header cfg_oh;
uint16_t cfg_flags;
uint16_t cfg_miss_send_len;
} __packed;
#define OFP_CONFIG_FRAG_NORMAL 0x0000
#define OFP_CONFIG_FRAG_DROP 0x0001
#define OFP_CONFIG_FRAG_REASM 0x0002
#define OFP_CONFIG_FRAG_MASK 0x0003
struct ofp_switch_port {
uint32_t swp_number;
uint8_t swp_pad[4];
uint8_t swp_macaddr[ETHER_ADDR_LEN];
uint8_t swp_pad2[2];
char swp_name[OFP_IFNAMSIZ];
uint32_t swp_config;
uint32_t swp_state;
uint32_t swp_cur;
uint32_t swp_advertised;
uint32_t swp_supported;
uint32_t swp_peer;
uint32_t swp_cur_speed;
uint32_t swp_max_speed;
} __packed;
#define OFP_PORTCONFIG_PORT_DOWN 0x1
#define OFP_PORTCONFIG_NO_STP 0x2
#define OFP_PORTCONFIG_NO_RECV 0x4
#define OFP_PORTCONFIG_NO_RECV_STP 0x8
#define OFP_PORTCONFIG_NO_FLOOD 0x10
#define OFP_PORTCONFIG_NO_FWD 0x20
#define OFP_PORTCONFIG_NO_PACKET_IN 0x40
#define OFP_PORTSTATE_LINK_DOWN 0x1
#define OFP_PORTSTATE_STP_LISTEN 0x000
#define OFP_PORTSTATE_STP_LEARN 0x100
#define OFP_PORTSTATE_STP_FORWARD 0x200
#define OFP_PORTSTATE_STP_BLOCK 0x300
#define OFP_PORTSTATE_STP_MASK 0x300
#define OFP_PORTMEDIA_10MB_HD 0x1
#define OFP_PORTMEDIA_10MB_FD 0x2
#define OFP_PORTMEDIA_100MB_HD 0x4
#define OFP_PORTMEDIA_100MB_FD 0x8
#define OFP_PORTMEDIA_1GB_HD 0x10
#define OFP_PORTMEDIA_1GB_FD 0x20
#define OFP_PORTMEDIA_10GB_FD 0x40
#define OFP_PORTMEDIA_COPPER 0x80
#define OFP_PORTMEDIA_FIBER 0x100
#define OFP_PORTMEDIA_AUTONEG 0x200
#define OFP_PORTMEDIA_PAUSE 0x400
#define OFP_PORTMEDIA_PAUSE_ASYM 0x800
struct ofp_switch_features {
struct ofp_header swf_oh;
uint64_t swf_datapath_id;
uint32_t swf_nbuffers;
uint8_t swf_ntables;
uint8_t swf_aux_id;
uint8_t swf_pad[2];
uint32_t swf_capabilities;
uint32_t swf_actions;
} __packed;
#define OFP_SWCAP_FLOW_STATS 0x1
#define OFP_SWCAP_TABLE_STATS 0x2
#define OFP_SWCAP_PORT_STATS 0x4
#define OFP_SWCAP_GROUP_STATS 0x8
#define OFP_SWCAP_IP_REASM 0x20
#define OFP_SWCAP_QUEUE_STATS 0x40
#define OFP_SWCAP_ARP_MATCH_IP 0x80
#define OFP_SWCAP_PORT_BLOCKED 0x100
struct ofp_match {
uint16_t om_type;
uint16_t om_length;
} __packed;
#define OFP_MATCH_STANDARD 0
#define OFP_MATCH_OXM 1
struct ofp_packet_in {
struct ofp_header pin_oh;
uint32_t pin_buffer_id;
uint16_t pin_total_len;
uint8_t pin_reason;
uint8_t pin_table_id;
uint64_t pin_cookie;
struct ofp_match pin_match;
} __packed;
#define OFP_PKTIN_REASON_NO_MATCH 0
#define OFP_PKTIN_REASON_ACTION 1
#define OFP_PKTIN_REASON_TTL 2
struct ofp_instruction {
uint16_t i_type;
uint16_t i_len;
} __packed;
#define OFP_INSTRUCTION_T_GOTO_TABLE 1
#define OFP_INSTRUCTION_T_WRITE_META 2
#define OFP_INSTRUCTION_T_WRITE_ACTIONS 3
#define OFP_INSTRUCTION_T_APPLY_ACTIONS 4
#define OFP_INSTRUCTION_T_CLEAR_ACTIONS 5
#define OFP_INSTRUCTION_T_METER 6
#define OFP_INSTRUCTION_T_EXPERIMENTER 0xffff
struct ofp_instruction_write_metadata {
uint16_t iwm_type;
uint16_t iwm_len;
uint8_t iwm_pad[4];
uint64_t iwm_metadata;
uint64_t iwm_metadata_mask;
} __packed;
struct ofp_instruction_goto_table {
uint16_t igt_type;
uint16_t igt_len;
uint8_t igt_table_id;
uint8_t igt_pad[3];
} __packed;
struct ofp_instruction_actions {
uint16_t ia_type;
uint16_t ia_len;
uint8_t ia_pad[4];
} __packed;
struct ofp_instruction_meter {
uint16_t im_type;
uint16_t im_len;
uint32_t im_meter_id;
} __packed;
struct ofp_instruction_experimenter {
uint16_t ie_type;
uint16_t ie_len;
uint32_t ie_experimenter;
} __packed;
#define OFP_ACTION_OUTPUT 0
#define OFP_ACTION_COPY_TTL_OUT 11
#define OFP_ACTION_COPY_TTL_IN 12
#define OFP_ACTION_SET_MPLS_TTL 15
#define OFP_ACTION_DEC_MPLS_TTL 16
#define OFP_ACTION_PUSH_VLAN 17
#define OFP_ACTION_POP_VLAN 18
#define OFP_ACTION_PUSH_MPLS 19
#define OFP_ACTION_POP_MPLS 20
#define OFP_ACTION_SET_QUEUE 21
#define OFP_ACTION_GROUP 22
#define OFP_ACTION_SET_NW_TTL 23
#define OFP_ACTION_DEC_NW_TTL 24
#define OFP_ACTION_SET_FIELD 25
#define OFP_ACTION_PUSH_PBB 26
#define OFP_ACTION_POP_PBB 27
#define OFP_ACTION_EXPERIMENTER 0xffff
struct ofp_action_header {
uint16_t ah_type;
uint16_t ah_len;
uint32_t ah_pad;
} __packed;
struct ofp_action_output {
uint16_t ao_type;
uint16_t ao_len;
uint32_t ao_port;
uint16_t ao_max_len;
uint8_t ao_pad[6];
} __packed;
#define OFP_CONTROLLER_MAXLEN_MAX 0xffe5
#define OFP_CONTROLLER_MAXLEN_NO_BUFFER 0xffff
struct ofp_action_mpls_ttl {
uint16_t amt_type;
uint16_t amt_len;
uint8_t amt_ttl;
uint8_t amt_pad[3];
} __packed;
struct ofp_action_push {
uint16_t ap_type;
uint16_t ap_len;
uint16_t ap_ethertype;
uint8_t ap_pad[2];
} __packed;
struct ofp_action_pop_mpls {
uint16_t apm_type;
uint16_t apm_len;
uint16_t apm_ethertype;
uint8_t apm_pad[2];
} __packed;
struct ofp_action_group {
uint16_t ag_type;
uint16_t ag_len;
uint32_t ag_group_id;
} __packed;
struct ofp_action_nw_ttl {
uint16_t ant_type;
uint16_t ant_len;
uint8_t ant_ttl;
uint8_t ant_pad[3];
} __packed;
struct ofp_action_set_field {
uint16_t asf_type;
uint16_t asf_len;
uint8_t asf_field[4];
} __packed;
struct ofp_action_set_queue {
uint16_t asq_type;
uint16_t asq_len;
uint32_t asq_queue_id;
} __packed;
struct ofp_packet_out {
struct ofp_header pout_oh;
uint32_t pout_buffer_id;
uint32_t pout_in_port;
uint16_t pout_actions_len;
uint8_t pout_pad[6];
struct ofp_action_header pout_actions[0];
} __packed;
#define OFP_PKTOUT_NO_BUFFER 0xffffffff
#define OFP_XM_T_IN_PORT 0
#define OFP_XM_T_IN_PHY_PORT 1
#define OFP_XM_T_META 2
#define OFP_XM_T_ETH_DST 3
#define OFP_XM_T_ETH_SRC 4
#define OFP_XM_T_ETH_TYPE 5
#define OFP_XM_T_VLAN_VID 6
#define OFP_XM_T_VLAN_PCP 7
#define OFP_XM_T_IP_DSCP 8
#define OFP_XM_T_IP_ECN 9
#define OFP_XM_T_IP_PROTO 10
#define OFP_XM_T_IPV4_SRC 11
#define OFP_XM_T_IPV4_DST 12
#define OFP_XM_T_TCP_SRC 13
#define OFP_XM_T_TCP_DST 14
#define OFP_XM_T_UDP_SRC 15
#define OFP_XM_T_UDP_DST 16
#define OFP_XM_T_SCTP_SRC 17
#define OFP_XM_T_SCTP_DST 18
#define OFP_XM_T_ICMPV4_TYPE 19
#define OFP_XM_T_ICMPV4_CODE 20
#define OFP_XM_T_ARP_OP 21
#define OFP_XM_T_ARP_SPA 22
#define OFP_XM_T_ARP_TPA 23
#define OFP_XM_T_ARP_SHA 24
#define OFP_XM_T_ARP_THA 25
#define OFP_XM_T_IPV6_SRC 26
#define OFP_XM_T_IPV6_DST 27
#define OFP_XM_T_IPV6_FLABEL 28
#define OFP_XM_T_ICMPV6_TYPE 29
#define OFP_XM_T_ICMPV6_CODE 30
#define OFP_XM_T_IPV6_ND_TARGET 31
#define OFP_XM_T_IPV6_ND_SLL 32
#define OFP_XM_T_IPV6_ND_TLL 33
#define OFP_XM_T_MPLS_LABEL 34
#define OFP_XM_T_MPLS_TC 35
#define OFP_XM_T_MPLS_BOS 36
#define OFP_XM_T_PBB_ISID 37
#define OFP_XM_T_TUNNEL_ID 38
#define OFP_XM_T_IPV6_EXTHDR 39
#define OFP_XM_T_MAX 40
#define OFP_XM_NXMT_TUNNEL_ID 38
#define OFP_XM_NXMT_TUNNEL_IPV4_SRC 31
#define OFP_XM_NXMT_TUNNEL_IPV4_DST 32
#define OFP_XM_NXMT_TUNNEL_IPV6_SRC 109
#define OFP_XM_NXMT_TUNNEL_IPV6_DST 110
#define OFP_OXM_C_NXM_0 0x0000
#define OFP_OXM_C_NXM_1 0x0001
#define OFP_OXM_C_OPENFLOW_BASIC 0x8000
#define OFP_OXM_C_OPENFLOW_EXPERIMENTER 0xffff
#define OFP_XM_VID_PRESENT 0x1000
#define OFP_XM_VID_NONE 0x0000
#define OFP_XM_IPV6_EXTHDR_NONEXT 0x0001
#define OFP_XM_IPV6_EXTHDR_ESP 0x0002
#define OFP_XM_IPV6_EXTHDR_AUTH 0x0004
#define OFP_XM_IPV6_EXTHDR_DEST 0x0008
#define OFP_XM_IPV6_EXTHDR_FRAG 0x0010
#define OFP_XM_IPV6_EXTHDR_ROUTER 0x0020
#define OFP_XM_IPV6_EXTHDR_HOP 0x0040
#define OFP_XM_IPV6_EXTHDR_UNREP 0x0080
#define OFP_XM_IPV6_EXTHDR_UNSEQ 0x0100
struct ofp_ox_match {
uint16_t oxm_class;
uint8_t oxm_fh;
uint8_t oxm_length;
uint8_t oxm_value[0];
} __packed;
#define OFP_OXM_GET_FIELD(o) (((o)->oxm_fh) >> 1)
#define OFP_OXM_GET_HASMASK(o) (((o)->oxm_fh) & 0x1)
#define OFP_OXM_SET_FIELD(o, t) (((o)->oxm_fh) = ((t) << 1))
#define OFP_OXM_SET_HASMASK(o) (((o)->oxm_fh) |= 0x1)
#define OFP_FLOWCMD_ADD 0
#define OFP_FLOWCMD_MODIFY 1
#define OFP_FLOWCMD_MODIFY_STRICT 2
#define OFP_FLOWCMD_DELETE 3
#define OFP_FLOWCMD_DELETE_STRICT 4
#define OFP_FLOWFLAG_SEND_FLOW_REMOVED 0x0001
#define OFP_FLOWFLAG_CHECK_OVERLAP 0x0002
#define OFP_FLOWFLAG_RESET_COUNTS 0x0004
#define OFP_FLOWFLAG_NO_PACKET_COUNTS 0x0008
#define OFP_FLOWFLAG_NO_BYTE_COUNTS 0x0010
struct ofp_flow_mod {
struct ofp_header fm_oh;
uint64_t fm_cookie;
uint64_t fm_cookie_mask;
uint8_t fm_table_id;
uint8_t fm_command;
uint16_t fm_idle_timeout;
uint16_t fm_hard_timeout;
uint16_t fm_priority;
uint32_t fm_buffer_id;
uint32_t fm_out_port;
uint32_t fm_out_group;
uint16_t fm_flags;
uint8_t fm_pad[2];
struct ofp_match fm_match;
} __packed;
#define OFP_FLOWREM_REASON_IDLE_TIMEOUT 0
#define OFP_FLOWREM_REASON_HARD_TIMEOUT 1
#define OFP_FLOWREM_REASON_DELETE 2
#define OFP_FLOWREM_REASON_GROUP_DELETE 3
struct ofp_flow_removed {
struct ofp_header fr_oh;
uint64_t fr_cookie;
uint16_t fr_priority;
uint8_t fr_reason;
uint8_t fr_table_id;
uint32_t fr_duration_sec;
uint32_t fr_duration_nsec;
uint16_t fr_idle_timeout;
uint16_t fr_hard_timeout;
uint64_t fr_packet_count;
uint64_t fr_byte_count;
struct ofp_match fr_match;
} __packed;
struct ofp_error {
struct ofp_header err_oh;
uint16_t err_type;
uint16_t err_code;
uint8_t err_data[0];
} __packed;
#define OFP_ERRDATA_MAX 64
#define OFP_ERRTYPE_HELLO_FAILED 0
#define OFP_ERRTYPE_BAD_REQUEST 1
#define OFP_ERRTYPE_BAD_ACTION 2
#define OFP_ERRTYPE_BAD_INSTRUCTION 3
#define OFP_ERRTYPE_BAD_MATCH 4
#define OFP_ERRTYPE_FLOW_MOD_FAILED 5
#define OFP_ERRTYPE_GROUP_MOD_FAILED 6
#define OFP_ERRTYPE_PORT_MOD_FAILED 7
#define OFP_ERRTYPE_TABLE_MOD_FAILED 8
#define OFP_ERRTYPE_QUEUE_OP_FAILED 9
#define OFP_ERRTYPE_SWITCH_CFG_FAILED 10
#define OFP_ERRTYPE_ROLE_REQUEST_FAILED 11
#define OFP_ERRTYPE_METER_MOD_FAILED 12
#define OFP_ERRTYPE_TABLE_FEATURES_FAILED 13
#define OFP_ERRTYPE_EXPERIMENTER 0xffff
#define OFP_ERRHELLO_INCOMPATIBLE 0
#define OFP_ERRHELLO_EPERM 1
#define OFP_ERRREQ_VERSION 0
#define OFP_ERRREQ_TYPE 1
#define OFP_ERRREQ_MULTIPART 2
#define OFP_ERRREQ_EXPERIMENTER 3
#define OFP_ERRREQ_EXP_TYPE 4
#define OFP_ERRREQ_EPERM 5
#define OFP_ERRREQ_BAD_LEN 6
#define OFP_ERRREQ_BUFFER_EMPTY 7
#define OFP_ERRREQ_BUFFER_UNKNOWN 8
#define OFP_ERRREQ_TABLE_ID 9
#define OFP_ERRREQ_IS_SLAVE 10
#define OFP_ERRREQ_PORT 11
#define OFP_ERRREQ_PACKET 12
#define OFP_ERRREQ_MULTIPART_OVERFLOW 13
#define OFP_ERRACTION_TYPE 0
#define OFP_ERRACTION_LEN 1
#define OFP_ERRACTION_EXPERIMENTER 2
#define OFP_ERRACTION_EXP_TYPE 3
#define OFP_ERRACTION_OUT_PORT 4
#define OFP_ERRACTION_ARGUMENT 5
#define OFP_ERRACTION_EPERM 6
#define OFP_ERRACTION_TOO_MANY 7
#define OFP_ERRACTION_BAD_QUEUE 8
#define OFP_ERRACTION_BAD_OUT_GROUP 9
#define OFP_ERRACTION_MATCH_INCONSISTENT 10
#define OFP_ERRACTION_UNSUPPORTED_ORDER 11
#define OFP_ERRACTION_TAG 12
#define OFP_ERRACTION_SET_TYPE 13
#define OFP_ERRACTION_SET_LEN 14
#define OFP_ERRACTION_SET_ARGUMENT 15
#define OFP_ERRINST_UNKNOWN_INST 0
#define OFP_ERRINST_UNSUPPORTED_INST 1
#define OFP_ERRINST_TABLE_ID 2
#define OFP_ERRINST_UNSUPP_META 3
#define OFP_ERRINST_UNSUPP_META_MASK 4
#define OFP_ERRINST_BAD_EXPERIMENTER 5
#define OFP_ERRINST_BAD_EXPERIMENTER_TYPE 6
#define OFP_ERRINST_BAD_LEN 7
#define OFP_ERRINST_EPERM 8
#define OFP_ERRMATCH_BAD_TYPE 0
#define OFP_ERRMATCH_BAD_LEN 1
#define OFP_ERRMATCH_BAD_TAG 2
#define OFP_ERRMATCH_BAD_DL_ADDR_MASK 3
#define OFP_ERRMATCH_BAD_NW_ADDR_MASK 4
#define OFP_ERRMATCH_BAD_WILDCARDS 5
#define OFP_ERRMATCH_BAD_FIELD 6
#define OFP_ERRMATCH_BAD_VALUE 7
#define OFP_ERRMATCH_BAD_MASK 8
#define OFP_ERRMATCH_BAD_PREREQ 9
#define OFP_ERRMATCH_DUP_FIELD 10
#define OFP_ERRMATCH_EPERM 11
#define OFP_ERRFLOWMOD_UNKNOWN 0
#define OFP_ERRFLOWMOD_TABLE_FULL 1
#define OFP_ERRFLOWMOD_TABLE_ID 2
#define OFP_ERRFLOWMOD_OVERLAP 3
#define OFP_ERRFLOWMOD_EPERM 4
#define OFP_ERRFLOWMOD_BAD_TIMEOUT 5
#define OFP_ERRFLOWMOD_BAD_COMMAND 6
#define OFP_ERRFLOWMOD_BAD_FLAGS 7
#define OFP_ERRGROUPMOD_GROUP_EXISTS 0
#define OFP_ERRGROUPMOD_INVALID_GROUP 1
#define OFP_ERRGROUPMOD_WEIGHT_UNSUPP 2
#define OFP_ERRGROUPMOD_OUT_OF_GROUPS 3
#define OFP_ERRGROUPMOD_OUT_OF_BUCKETS 4
#define OFP_ERRGROUPMOD_CHAINING_UNSUPP 5
#define OFP_ERRGROUPMOD_WATCH_UNSUPP 6
#define OFP_ERRGROUPMOD_LOOP 7
#define OFP_ERRGROUPMOD_UNKNOWN_GROUP 8
#define OFP_ERRGROUPMOD_CHAINED_GROUP 9
#define OFP_ERRGROUPMOD_BAD_TYPE 10
#define OFP_ERRGROUPMOD_BAD_COMMAND 11
#define OFP_ERRGROUPMOD_BAD_BUCKET 12
#define OFP_ERRGROUPMOD_BAD_WATCH 13
#define OFP_ERRGROUPMOD_EPERM 14
#define OFP_GROUPCMD_ADD 0
#define OFP_GROUPCMD_MODIFY 1
#define OFP_GROUPCMD_DELETE 2
#define OFP_GROUP_T_ALL 0
#define OFP_GROUP_T_SELECT 1
#define OFP_GROUP_T_INDIRECT 2
#define OFP_GROUP_T_FAST_FAILOVER 3
#define OFP_GROUP_ID_MAX 0xffffff00
#define OFP_GROUP_ID_ALL 0xfffffffc
#define OFP_GROUP_ID_ANY 0xffffffff
struct ofp_bucket {
uint16_t b_len;
uint16_t b_weight;
uint32_t b_watch_port;
uint32_t b_watch_group;
uint8_t b_pad[4];
struct ofp_action_header b_actions[0];
} __packed;
struct ofp_group_mod {
struct ofp_header gm_oh;
uint16_t gm_command;
uint8_t gm_type;
uint8_t gm_pad;
uint32_t gm_group_id;
struct ofp_bucket gm_buckets[0];
} __packed;
struct ofp_multipart {
struct ofp_header mp_oh;
uint16_t mp_type;
uint16_t mp_flags;
uint8_t mp_pad[4];
} __packed;
#define OFP_MP_FLAG_REQ_MORE 1
#define OFP_MP_FLAG_REPLY_MORE 1
#define OFP_MP_T_DESC 0
#define OFP_MP_T_FLOW 1
#define OFP_MP_T_AGGREGATE 2
#define OFP_MP_T_TABLE 3
#define OFP_MP_T_PORT_STATS 4
#define OFP_MP_T_QUEUE 5
#define OFP_MP_T_GROUP 6
#define OFP_MP_T_GROUP_DESC 7
#define OFP_MP_T_GROUP_FEATURES 8
#define OFP_MP_T_METER 9
#define OFP_MP_T_METER_CONFIG 10
#define OFP_MP_T_METER_FEATURES 11
#define OFP_MP_T_TABLE_FEATURES 12
#define OFP_MP_T_PORT_DESC 13
#define OFP_MP_T_EXPERIMENTER 0xffff
#define OFP_DESC_STR_LEN 256
#define OFP_SERIAL_NUM_LEN 32
struct ofp_desc {
char d_mfr_desc[OFP_DESC_STR_LEN];
char d_hw_desc[OFP_DESC_STR_LEN];
char d_sw_desc[OFP_DESC_STR_LEN];
char d_serial_num[OFP_SERIAL_NUM_LEN];
char d_dp_desc[OFP_DESC_STR_LEN];
} __packed;
struct ofp_flow_stats_request {
uint8_t fsr_table_id;
uint8_t fsr_pad[3];
uint32_t fsr_out_port;
uint32_t fsr_out_group;
uint8_t fsr_pad2[4];
uint64_t fsr_cookie;
uint64_t fsr_cookie_mask;
struct ofp_match fsr_match;
} __packed;
struct ofp_flow_stats {
uint16_t fs_length;
uint8_t fs_table_id;
uint8_t fs_pad;
uint32_t fs_duration_sec;
uint32_t fs_duration_nsec;
uint16_t fs_priority;
uint16_t fs_idle_timeout;
uint16_t fs_hard_timeout;
uint16_t fs_flags;
uint8_t fs_pad2[4];
uint64_t fs_cookie;
uint64_t fs_packet_count;
uint64_t fs_byte_count;
struct ofp_match fs_match;
} __packed;
struct ofp_aggregate_stats_request {
uint8_t asr_table_id;
uint8_t asr_pad[3];
uint32_t asr_out_port;
uint32_t asr_out_group;
uint8_t asr_pad2[4];
uint64_t asr_cookie;
uint64_t asr_cookie_mask;
struct ofp_match asr_match;
} __packed;
struct ofp_aggregate_stats {
uint64_t as_packet_count;
uint64_t as_byte_count;
uint32_t as_flow_count;
uint8_t as_pad[4];
} __packed;
#define OFP_TABLE_ID_MAX 0xfe
#define OFP_TABLE_ID_ALL 0xff
struct ofp_table_stats {
uint8_t ts_table_id;
uint8_t ts_pad[3];
uint32_t ts_active_count;
uint64_t ts_lookup_count;
uint64_t ts_matched_count;
} __packed;
#define OFP_TABLE_FEATPROP_INSTRUCTION 0
#define OFP_TABLE_FEATPROP_INSTRUCTION_MISS 1
#define OFP_TABLE_FEATPROP_NEXT_TABLES 2
#define OFP_TABLE_FEATPROP_NEXT_TABLES_MISS 3
#define OFP_TABLE_FEATPROP_WRITE_ACTIONS 4
#define OFP_TABLE_FEATPROP_WRITE_ACTIONS_MISS 5
#define OFP_TABLE_FEATPROP_APPLY_ACTIONS 6
#define OFP_TABLE_FEATPROP_APPLY_ACTIONS_MISS 7
#define OFP_TABLE_FEATPROP_MATCH 8
#define OFP_TABLE_FEATPROP_WILDCARDS 10
#define OFP_TABLE_FEATPROP_WRITE_SETFIELD 12
#define OFP_TABLE_FEATPROP_WRITE_SETFIELD_MISS 13
#define OFP_TABLE_FEATPROP_APPLY_SETFIELD 14
#define OFP_TABLE_FEATPROP_APPLY_SETFIELD_MISS 15
#define OFP_TABLE_FEATPROP_EXPERIMENTER 0xfffe
#define OFP_TABLE_FEATPROP_EXPERIMENTER_MISS 0xffff
#define OFP_TABLE_MAX_NAME_LEN 32
struct ofp_table_features {
uint16_t tf_length;
uint8_t tf_tableid;
uint8_t tf_pad[5];
char tf_name[OFP_TABLE_MAX_NAME_LEN];
uint64_t tf_metadata_match;
uint64_t tf_metadata_write;
uint32_t tf_config;
uint32_t tf_max_entries;
} __packed;
struct ofp_table_feature_property {
uint16_t tp_type;
uint16_t tp_length;
} __packed;
struct ofp_table_feature_property_instruction {
uint16_t tpi_type;
uint16_t tpi_length;
struct ofp_instruction tpi_instructions[0];
} __packed;
struct ofp_table_feature_property_next_tables {
uint16_t tpnt_type;
uint16_t tpnt_length;
uint8_t tpnt_tables[0];
} __packed;
struct ofp_table_feature_property_actions {
uint16_t tpa_type;
uint16_t tpa_length;
struct ofp_action_header tpa_actions[0];
} __packed;
struct ofp_table_feature_property_oxm {
uint16_t tpoxm_type;
uint16_t tpoxm_length;
uint32_t tpoxm_oxm[0];
} __packed;
struct ofp_table_feature_property_experimenter {
uint16_t tfpexp_type;
uint16_t tfpexp_length;
uint32_t tfpexp_experimenter;
uint32_t tfpexp_exp_type;
uint32_t tfpexp_experimenter_data[0];
} __packed;
struct ofp_port_stats {
uint32_t pt_port_no;
uint8_t pt_pad[4];
uint64_t pt_rx_packets;
uint64_t pt_tx_packets;
uint64_t pt_rx_bytes;
uint64_t pt_tx_bytes;
uint64_t pt_rx_dropped;
uint64_t pt_tx_dropped;
uint64_t pt_rx_errors;
uint64_t pt_tx_errors;
uint64_t pt_rx_frame_err;
uint64_t pt_rx_over_err;
uint64_t pt_rx_crc_err;
uint64_t pt_collision;
uint32_t pt_duration_sec;
uint32_t pt_duration_nsec;
} __packed;
struct ofp_group_stats_request {
uint32_t gsr_group_id;
uint8_t gsr_pad[4];
} __packed;
struct ofp_bucket_counter {
uint64_t gs_packet_count;
uint64_t gs_byte_count;
} __packed;
struct ofp_group_stats {
uint16_t gs_length;
uint8_t gs_pad[2];
uint32_t gs_group_id;
uint32_t gs_ref_count;
uint8_t gs_pad2[4];
uint64_t gs_packet_count;
uint64_t gs_byte_count;
uint32_t gs_duration_sec;
uint32_t gs_duration_nsec;
struct ofp_bucket_counter gs_bucket_stats[0];
} __packed;
struct ofp_group_desc {
uint16_t gd_length;
uint8_t gd_type;
uint8_t gd_pad;
uint32_t gd_group_id;
struct ofp_bucket gd_buckets[0];
} __packed;
enum ofp_state {
OFP_STATE_CLOSED,
OFP_STATE_HELLO_WAIT,
OFP_STATE_FEATURE_WAIT,
OFP_STATE_ESTABLISHED
};
struct dlt_openflow_hdr {
uint32_t of_direction;
uint64_t of_datapath_id;
} __packed;
#define DLT_OPENFLOW_TO_SWITCH 1
#define DLT_OPENFLOW_TO_CONTROLLER 2
#endif