1199 lines
27 KiB
Elixir
1199 lines
27 KiB
Elixir
import Bitwise
|
|
|
|
enums = [
|
|
openflow_codec: [
|
|
{Openflow.Hello, 0},
|
|
{Openflow.ErrorMsg, 1},
|
|
{Openflow.Echo.Request, 2},
|
|
{Openflow.Echo.Reply, 3},
|
|
{Openflow.Experimenter, 4},
|
|
{Openflow.Features.Request, 5},
|
|
{Openflow.Features.Reply, 6},
|
|
{Openflow.GetConfig.Request, 7},
|
|
{Openflow.GetConfig.Reply, 8},
|
|
{Openflow.SetConfig, 9},
|
|
{Openflow.PacketIn, 10},
|
|
{Openflow.FlowRemoved, 11},
|
|
{Openflow.PortStatus, 12},
|
|
{Openflow.PacketOut, 13},
|
|
{Openflow.FlowMod, 14},
|
|
{Openflow.GroupMod, 15},
|
|
{Openflow.PortMod, 16},
|
|
{Openflow.TableMod, 17},
|
|
{Openflow.Multipart.Request, 18},
|
|
{Openflow.Multipart.Reply, 19},
|
|
{Openflow.Barrier.Request, 20},
|
|
{Openflow.Barrier.Reply, 21},
|
|
{Openflow.Role.Request, 24},
|
|
{Openflow.Role.Reply, 25},
|
|
{Openflow.GetAsync.Request, 26},
|
|
{Openflow.GetAsync.Reply, 27},
|
|
{Openflow.SetAsync, 28},
|
|
{Openflow.MeterMod, 29}
|
|
],
|
|
experimenter_id: [
|
|
nicira_ext_message: 0x00002320,
|
|
onf_ext_message: 0x4F4E4600
|
|
],
|
|
nicira_ext_message: [
|
|
# {Openflow.NxRole.Request, 10}, /* Openflow 1.3 support role request/reply */
|
|
# {Openflow.NxRole.Reply, 11},
|
|
# {Openflow.NxSetFlowFormat, 12}, /* No special reason for implement this struct codec. */
|
|
# {Openflow.NxFlowMod, 13}, /* Prefer use ofp_flow_mod to nx_flow_mod */
|
|
# {Openflow.NxFlowRemoved, 14}, /* Prefer use ofp_flow_removed to nx_flow_removed */
|
|
# {Openflow.NxSetFlowModTableId, 15}, /* OpenFlow 1.3 support multiple flow table. */
|
|
{Openflow.NxSetPacketInFormat, 16},
|
|
# {Openflow.NxPacketIn, 17}, /* No special reason for implement this struct codec. */
|
|
# {Openflow.NxFlowAge, 18}, /* No special reason for implement this struct codec. */
|
|
# {Openflow.NxSetAsyncConfig, 19}, /* Openflow 1.3 support async config. */
|
|
{Openflow.NxSetControllerId, 20},
|
|
{Openflow.NxFlowMonitor.Cancel, 21},
|
|
{Openflow.NxFlowMonitor.Paused, 22},
|
|
{Openflow.NxFlowMonitor.Resumed, 23},
|
|
{Openflow.NxTLVTableMod, 24},
|
|
{Openflow.NxTLVTable.Request, 25},
|
|
{Openflow.NxTLVTable.Reply, 26},
|
|
{Openflow.NxSetAsyncConfig2, 27},
|
|
{Openflow.NxResume, 28},
|
|
{Openflow.NxCtFlushZone, 29},
|
|
{Openflow.NxPacketIn2, 30}
|
|
],
|
|
onf_ext_message: [
|
|
{Openflow.OnfBundleControl, 2300},
|
|
{Openflow.OnfBundleAddMessage, 2301}
|
|
],
|
|
multipart_request_flags: [
|
|
more: 1 <<< 0
|
|
],
|
|
multipart_reply_flags: [
|
|
more: 1 <<< 0
|
|
],
|
|
multipart_request_codec: [
|
|
{Openflow.Multipart.Desc.Request, 0},
|
|
{Openflow.Multipart.Flow.Request, 1},
|
|
{Openflow.Multipart.Aggregate.Request, 2},
|
|
{Openflow.Multipart.Table.Request, 3},
|
|
{Openflow.Multipart.PortStats.Request, 4},
|
|
{Openflow.Multipart.Queue.Request, 5},
|
|
{Openflow.Multipart.Group.Request, 6},
|
|
{Openflow.Multipart.GroupDesc.Request, 7},
|
|
{Openflow.Multipart.GroupFeatures.Request, 8},
|
|
{Openflow.Multipart.Meter.Request, 9},
|
|
{Openflow.Multipart.MeterConfig.Request, 10},
|
|
{Openflow.Multipart.MeterFeatures.Request, 11},
|
|
{Openflow.Multipart.TableFeatures.Request, 12},
|
|
{Openflow.Multipart.PortDesc.Request, 13},
|
|
{Openflow.Multipart.Experimenter.Request, 0xFFFF}
|
|
],
|
|
multipart_reply_codec: [
|
|
{Openflow.Multipart.Desc.Reply, 0},
|
|
{Openflow.Multipart.Flow.Reply, 1},
|
|
{Openflow.Multipart.Aggregate.Reply, 2},
|
|
{Openflow.Multipart.Table.Reply, 3},
|
|
{Openflow.Multipart.PortStats.Reply, 4},
|
|
{Openflow.Multipart.Queue.Reply, 5},
|
|
{Openflow.Multipart.Group.Reply, 6},
|
|
{Openflow.Multipart.GroupDesc.Reply, 7},
|
|
{Openflow.Multipart.GroupFeatures.Reply, 8},
|
|
{Openflow.Multipart.Meter.Reply, 9},
|
|
{Openflow.Multipart.MeterConfig.Reply, 10},
|
|
{Openflow.Multipart.MeterFeatures.Reply, 11},
|
|
{Openflow.Multipart.TableFeatures.Reply, 12},
|
|
{Openflow.Multipart.PortDesc.Reply, 13},
|
|
{Openflow.Multipart.Experimenter.Reply, 0xFFFF}
|
|
],
|
|
nicira_ext_stats: [
|
|
{Openflow.Multipart.NxFlow, 0},
|
|
{Openflow.Multipart.NxAggregate, 1},
|
|
{Openflow.Multipart.NxFlowMonitor, 2},
|
|
{Openflow.Multipart.NxIPFIXBridge, 3},
|
|
{Openflow.Multipart.NxIPFIXFlow, 4}
|
|
],
|
|
hello_elem: [
|
|
versionbitmap: 1
|
|
],
|
|
error_type: [
|
|
hello_failed: 0,
|
|
bad_request: 1,
|
|
bad_action: 2,
|
|
bad_instruction: 3,
|
|
bad_match: 4,
|
|
flow_mod_failed: 5,
|
|
group_mod_failed: 6,
|
|
port_mod_failed: 7,
|
|
table_mod_failed: 8,
|
|
queue_op_failed: 9,
|
|
switch_config_failed: 10,
|
|
role_request_failed: 11,
|
|
meter_mod_failed: 12,
|
|
table_features_failed: 13,
|
|
experimenter: 0xFFFF
|
|
],
|
|
hello_failed: [
|
|
inconpatible: 0,
|
|
eperm: 1
|
|
],
|
|
bad_request: [
|
|
bad_version: 0,
|
|
bad_type: 1,
|
|
bad_multipart: 2,
|
|
bad_experimeter: 3,
|
|
bad_exp_type: 4,
|
|
eperm: 5,
|
|
bad_len: 6,
|
|
buffer_empty: 7,
|
|
buffer_unknown: 8,
|
|
bad_table_id: 9,
|
|
is_slave: 10,
|
|
bad_port: 11,
|
|
bad_packet: 12,
|
|
multipart_buffer_overflow: 13,
|
|
multipart_request_timeout: 14,
|
|
multipart_reply_timeout: 15,
|
|
nxm_invalid: 256,
|
|
nxm_bad_type: 257,
|
|
must_be_zero: 515,
|
|
bad_reason: 516,
|
|
flow_monitor_bad_event: 520,
|
|
undecodable_error: 521,
|
|
resume_not_supported: 533,
|
|
resume_stale: 534
|
|
],
|
|
bad_action: [
|
|
bad_type: 0,
|
|
bad_len: 1,
|
|
bad_experimeter: 2,
|
|
bad_exp_type: 3,
|
|
bad_out_port: 4,
|
|
bad_argument: 5,
|
|
eperm: 6,
|
|
too_many: 7,
|
|
bad_queue: 8,
|
|
bad_out_group: 9,
|
|
match_inconsistent: 10,
|
|
unsupported_order: 11,
|
|
bad_tag: 12,
|
|
bad_set_type: 13,
|
|
bad_set_len: 14,
|
|
bad_set_argument: 15,
|
|
must_be_zero: 256,
|
|
conntrack_datapath_support: 265,
|
|
bad_conjunction: 526
|
|
],
|
|
bad_instruction: [
|
|
unknown_instruction: 0,
|
|
unsupported_instruction: 1,
|
|
bad_table_id: 2,
|
|
unsupported_metadata: 3,
|
|
unsupported_metadata_mask: 4,
|
|
bad_experimeter: 5,
|
|
bad_exp_type: 6,
|
|
bad_len: 7,
|
|
eperm: 8,
|
|
dup_inst: 256
|
|
],
|
|
bad_match: [
|
|
bad_type: 0,
|
|
bad_len: 1,
|
|
bad_tag: 2,
|
|
bad_dl_addr_mask: 3,
|
|
bad_nw_addr_mask: 4,
|
|
bad_wildcards: 5,
|
|
bad_field: 6,
|
|
bad_value: 7,
|
|
bad_mask: 8,
|
|
bad_prereq: 9,
|
|
dup_field: 10,
|
|
eperm: 11,
|
|
conntrack_datapath_support: 264
|
|
],
|
|
flow_mod_failed: [
|
|
unknown: 0,
|
|
table_full: 1,
|
|
bad_table_id: 2,
|
|
overlap: 3,
|
|
eperm: 4,
|
|
bad_timeout: 5,
|
|
bad_command: 6,
|
|
bad_flags: 7
|
|
],
|
|
group_mod_failed: [
|
|
group_exists: 0,
|
|
invalid_group: 1,
|
|
weight_unsupported: 2,
|
|
out_of_groups: 3,
|
|
ouf_of_buckets: 4,
|
|
chaining_unsupported: 5,
|
|
watch_unsupported: 6,
|
|
loop: 7,
|
|
unknown_group: 8,
|
|
chained_group: 9,
|
|
bad_type: 10,
|
|
bad_command: 11,
|
|
bad_bucket: 12,
|
|
bad_watch: 13,
|
|
eperm: 14,
|
|
unknown_bucket: 15,
|
|
bucket_exists: 16
|
|
],
|
|
port_mod_failed: [
|
|
bad_port: 0,
|
|
bad_hw_addr: 1,
|
|
bad_config: 2,
|
|
bad_advertise: 3,
|
|
eperm: 4
|
|
],
|
|
table_mod_failed: [
|
|
bad_table: 0,
|
|
bad_config: 1,
|
|
eperm: 2
|
|
],
|
|
queue_op_failed: [
|
|
bad_port: 0,
|
|
bad_queue: 1,
|
|
eperm: 2
|
|
],
|
|
switch_config_failed: [
|
|
bad_flags: 0,
|
|
bad_len: 1,
|
|
eperm: 2
|
|
],
|
|
role_request_failed: [
|
|
stale: 0,
|
|
unsup: 1,
|
|
bad_role: 2
|
|
],
|
|
meter_mod_failed: [
|
|
unknown: 0,
|
|
meter_exists: 1,
|
|
invalid_meter: 2,
|
|
unknown_meter: 3,
|
|
bad_command: 4,
|
|
bad_flags: 5,
|
|
bad_rate: 6,
|
|
bad_burst: 7,
|
|
bad_band: 8,
|
|
bad_band_value: 9,
|
|
out_of_meters: 10,
|
|
out_of_bands: 11
|
|
],
|
|
table_features_failed: [
|
|
bad_table: 0,
|
|
bad_metadata: 1,
|
|
bad_type: 2,
|
|
bad_len: 3,
|
|
bad_argument: 4,
|
|
eperm: 5
|
|
],
|
|
switch_capabilities: [
|
|
flow_stats: 1 <<< 0,
|
|
table_stats: 1 <<< 1,
|
|
port_stats: 1 <<< 2,
|
|
group_stats: 1 <<< 3,
|
|
ip_reasm: 1 <<< 5,
|
|
queue_stats: 1 <<< 6,
|
|
arp_match_ip: 1 <<< 7,
|
|
port_blocked: 1 <<< 8
|
|
],
|
|
config_flags: [
|
|
drop: 1 <<< 0,
|
|
reasm: 1 <<< 1
|
|
],
|
|
controller_max_len: [
|
|
max: 0xFFE5,
|
|
no_buffer: 0xFFFF
|
|
],
|
|
experimenter_oxm_vendors: [
|
|
nicira_ext_match: 0x00002320,
|
|
hp_ext_match: 0x00002428,
|
|
onf_ext_match: 0x4F4E4600
|
|
],
|
|
match_type: [
|
|
standard: 0,
|
|
oxm: 1
|
|
],
|
|
oxm_class: [
|
|
nxm_0: 0x0000,
|
|
nxm_1: 0x0001,
|
|
openflow_basic: 0x8000,
|
|
packet_register: 0x8001,
|
|
experimenter: 0xFFFF
|
|
],
|
|
nxm_0: [
|
|
nx_in_port: 0,
|
|
nx_eth_dst: 1,
|
|
nx_eth_src: 2,
|
|
nx_eth_type: 3,
|
|
nx_vlan_tci: 4,
|
|
nx_ip_tos: 5,
|
|
nx_ip_proto: 6,
|
|
nx_ipv4_src: 7,
|
|
nx_ipv4_dst: 8,
|
|
nx_tcp_src: 9,
|
|
nx_tcp_dst: 10,
|
|
nx_udp_src: 11,
|
|
nx_udp_dst: 12,
|
|
nx_icmpv4_type: 13,
|
|
nx_icmpv4_code: 14,
|
|
nx_arp_op: 15,
|
|
nx_arp_spa: 16,
|
|
nx_arp_tpa: 17,
|
|
nx_tcp_flags: 34
|
|
],
|
|
nxm_1: [
|
|
reg0: 0,
|
|
reg1: 1,
|
|
reg2: 2,
|
|
reg3: 3,
|
|
reg4: 4,
|
|
reg5: 5,
|
|
reg6: 6,
|
|
reg7: 7,
|
|
reg8: 8,
|
|
reg9: 9,
|
|
reg10: 10,
|
|
reg11: 11,
|
|
reg12: 12,
|
|
reg13: 13,
|
|
reg14: 14,
|
|
reg15: 15,
|
|
tun_id: 16,
|
|
nx_arp_sha: 17,
|
|
nx_arp_tha: 18,
|
|
nx_ipv6_src: 19,
|
|
nx_ipv6_dst: 20,
|
|
nx_icmpv6_type: 21,
|
|
nx_icmpv6_code: 22,
|
|
nx_ipv6_nd_target: 23,
|
|
nx_ipv6_nd_sll: 24,
|
|
nx_ipv6_nd_tll: 25,
|
|
nx_ip_frag: 26,
|
|
nx_ipv6_label: 27,
|
|
nx_ip_ecn: 28,
|
|
nx_ip_ttl: 29,
|
|
nx_mpls_ttl: 30,
|
|
tun_src: 31,
|
|
tun_dst: 32,
|
|
pkt_mark: 33,
|
|
dp_hash: 35,
|
|
recirc_id: 36,
|
|
conj_id: 37,
|
|
tun_gbp_id: 38,
|
|
tun_gbp_flags: 39,
|
|
tun_metadata0: 40,
|
|
tun_metadata1: 41,
|
|
tun_metadata2: 42,
|
|
tun_metadata3: 43,
|
|
tun_metadata4: 44,
|
|
tun_metadata5: 45,
|
|
tun_metadata6: 46,
|
|
tun_metadata7: 47,
|
|
tun_metadata8: 48,
|
|
tun_metadata9: 49,
|
|
tun_metadata10: 50,
|
|
tun_metadata11: 51,
|
|
tun_metadata12: 52,
|
|
tun_metadata13: 53,
|
|
tun_metadata14: 54,
|
|
tun_metadata15: 55,
|
|
tun_metadata16: 56,
|
|
tun_metadata17: 57,
|
|
tun_metadata18: 58,
|
|
tun_metadata19: 59,
|
|
tun_metadata20: 60,
|
|
tun_metadata21: 61,
|
|
tun_metadata22: 62,
|
|
tun_metadata23: 63,
|
|
tun_metadata24: 64,
|
|
tun_metadata25: 65,
|
|
tun_metadata26: 66,
|
|
tun_metadata27: 67,
|
|
tun_metadata28: 68,
|
|
tun_metadata29: 69,
|
|
tun_metadata30: 70,
|
|
tun_metadata31: 71,
|
|
tun_metadata32: 72,
|
|
tun_metadata33: 73,
|
|
tun_metadata34: 74,
|
|
tun_metadata35: 75,
|
|
tun_metadata36: 76,
|
|
tun_metadata37: 77,
|
|
tun_metadata38: 78,
|
|
tun_metadata39: 79,
|
|
tun_metadata40: 80,
|
|
tun_metadata41: 81,
|
|
tun_metadata42: 82,
|
|
tun_metadata43: 83,
|
|
tun_metadata44: 84,
|
|
tun_metadata45: 85,
|
|
tun_metadata46: 86,
|
|
tun_metadata47: 87,
|
|
tun_metadata48: 88,
|
|
tun_metadata49: 89,
|
|
tun_metadata50: 90,
|
|
tun_metadata51: 91,
|
|
tun_metadata52: 92,
|
|
tun_metadata53: 93,
|
|
tun_metadata54: 94,
|
|
tun_metadata55: 95,
|
|
tun_metadata56: 96,
|
|
tun_metadata57: 97,
|
|
tun_metadata58: 98,
|
|
tun_metadata59: 99,
|
|
tun_metadata60: 100,
|
|
tun_metadata61: 101,
|
|
tun_metadata62: 102,
|
|
tun_metadata63: 103,
|
|
tun_flags: 104,
|
|
ct_state: 105,
|
|
ct_zone: 106,
|
|
ct_mark: 107,
|
|
ct_label: 108,
|
|
tun_ipv6_src: 109,
|
|
tun_ipv6_dst: 110,
|
|
xxreg0: 111,
|
|
xxreg1: 112,
|
|
xxreg2: 113,
|
|
xxreg3: 114,
|
|
xxreg4: 115,
|
|
xxreg5: 116,
|
|
xxreg6: 117,
|
|
xxreg7: 118,
|
|
ct_nw_proto: 119,
|
|
ct_nw_src: 120,
|
|
ct_nw_dst: 121,
|
|
ct_ipv6_src: 122,
|
|
ct_ipv6_dst: 123,
|
|
ct_tp_src: 124,
|
|
ct_tp_dst: 125
|
|
],
|
|
openflow_basic: [
|
|
in_port: 0,
|
|
in_phy_port: 1,
|
|
metadata: 2,
|
|
eth_dst: 3,
|
|
eth_src: 4,
|
|
eth_type: 5,
|
|
vlan_vid: 6,
|
|
vlan_pcp: 7,
|
|
ip_dscp: 8,
|
|
ip_ecn: 9,
|
|
ip_proto: 10,
|
|
ipv4_src: 11,
|
|
ipv4_dst: 12,
|
|
tcp_src: 13,
|
|
tcp_dst: 14,
|
|
udp_src: 15,
|
|
udp_dst: 16,
|
|
sctp_src: 17,
|
|
sctp_dst: 18,
|
|
icmpv4_type: 19,
|
|
icmpv4_code: 20,
|
|
arp_op: 21,
|
|
arp_spa: 22,
|
|
arp_tpa: 23,
|
|
arp_sha: 24,
|
|
arp_tha: 25,
|
|
ipv6_src: 26,
|
|
ipv6_dst: 27,
|
|
ipv6_flabel: 28,
|
|
icmpv6_type: 29,
|
|
icmpv6_code: 30,
|
|
ipv6_nd_target: 31,
|
|
ipv6_nd_sll: 32,
|
|
ipv6_nd_tll: 33,
|
|
mpls_label: 34,
|
|
mpls_tc: 35,
|
|
mpls_bos: 36,
|
|
pbb_isid: 37,
|
|
tunnel_id: 38,
|
|
ipv6_exthdr: 39,
|
|
|
|
# Lagopus extended match fields
|
|
pbb_uca: 41,
|
|
packet_type: 42,
|
|
gre_flags: 43,
|
|
gre_ver: 44,
|
|
gre_protocol: 45,
|
|
gre_key: 46,
|
|
gre_seqnum: 47,
|
|
lisp_flags: 48,
|
|
lisp_nonce: 49,
|
|
lisp_id: 50,
|
|
vxlan_flags: 51,
|
|
vxlan_vni: 52,
|
|
mpls_data_first_nibble: 53,
|
|
mpls_ach_version: 54,
|
|
mpls_ach_channel: 55,
|
|
mpls_pw_metadata: 56,
|
|
mpls_cw_flags: 57,
|
|
mpls_cw_fragment: 58,
|
|
mpls_cw_len: 59,
|
|
mpls_cw_seq_num: 60,
|
|
gtpu_flags: 61,
|
|
gtpu_ver: 62,
|
|
gtpu_msg_type: 63,
|
|
gtpu_teid: 64,
|
|
gtpu_extn_hdr: 65,
|
|
gtpu_extn_udp_port: 66,
|
|
gtpu_extn_sci: 67
|
|
],
|
|
vlan_id: [
|
|
present: 0x1000,
|
|
none: 0x0000
|
|
],
|
|
ipv6exthdr_flags: [
|
|
nonext: 1 <<< 0,
|
|
esp: 1 <<< 1,
|
|
auth: 1 <<< 2,
|
|
dest: 1 <<< 3,
|
|
frag: 1 <<< 4,
|
|
router: 1 <<< 5,
|
|
hop: 1 <<< 6,
|
|
unrep: 1 <<< 7,
|
|
unseq: 1 <<< 8
|
|
],
|
|
tcp_flags: [
|
|
fin: 1 <<< 0,
|
|
syn: 1 <<< 1,
|
|
rst: 1 <<< 2,
|
|
psh: 1 <<< 3,
|
|
ack: 1 <<< 4,
|
|
urg: 1 <<< 5,
|
|
ece: 1 <<< 6,
|
|
cwr: 1 <<< 7,
|
|
ns: 1 <<< 8
|
|
],
|
|
ct_state_flags: [
|
|
# Beginning of a new connection.
|
|
new: 1 <<< 0,
|
|
# Part of an existing connection.
|
|
est: 1 <<< 1,
|
|
# Related to an established connection.
|
|
rel: 1 <<< 2,
|
|
# Flow is in the reply direction.
|
|
rep: 1 <<< 3,
|
|
# Could not track connection.
|
|
inv: 1 <<< 4,
|
|
# Conntrack has occurred.
|
|
trk: 1 <<< 5,
|
|
# Packet's source address/port was mangled by NAT.
|
|
snat: 1 <<< 6,
|
|
# Packet's destination address/port was mangled by NAT.
|
|
dnat: 1 <<< 7
|
|
],
|
|
packet_register: [
|
|
xreg0: 0,
|
|
xreg1: 1,
|
|
xreg2: 2,
|
|
xreg3: 3,
|
|
xreg4: 4,
|
|
xreg5: 5,
|
|
xreg6: 6,
|
|
xreg7: 7
|
|
],
|
|
nicira_ext_match: [
|
|
nsh_flags: 1,
|
|
nsh_mdtype: 2,
|
|
nsh_np: 3,
|
|
nsh_spi: 4,
|
|
nsh_si: 5,
|
|
nsh_c1: 6,
|
|
nsh_c2: 7,
|
|
nsh_c3: 8,
|
|
nsh_c4: 9
|
|
],
|
|
hp_ext_match: [
|
|
hp_udp_src_port_range: 0,
|
|
hp_udp_dst_port_range: 1,
|
|
hp_tcp_src_port_range: 2,
|
|
hp_tcp_dst_port_range: 3,
|
|
hp_tcp_flags: 4,
|
|
hp_custom_1: 5,
|
|
hp_custom_2: 6,
|
|
hp_custom_3: 7,
|
|
hp_custom_4: 8
|
|
],
|
|
hp_custom_match_type: [
|
|
l2_start: 1,
|
|
l3_start: 2,
|
|
l4_start: 3
|
|
],
|
|
onf_ext_match: [
|
|
onf_tcp_flags: 42,
|
|
onf_actset_output: 43,
|
|
onf_pbb_uca: 2560
|
|
],
|
|
buffer_id: [
|
|
no_buffer: 0xFFFFFFFF
|
|
],
|
|
port_config: [
|
|
port_down: 1 <<< 0,
|
|
no_receive: 1 <<< 2,
|
|
no_forward: 1 <<< 5,
|
|
no_packet_in: 1 <<< 6
|
|
],
|
|
port_state: [
|
|
link_down: 1 <<< 0,
|
|
blocked: 1 <<< 1,
|
|
live: 1 <<< 2
|
|
],
|
|
port_features: [
|
|
{:"10mb_hd", 1 <<< 0},
|
|
{:"10mb_fd", 1 <<< 1},
|
|
{:"100mb_hd", 1 <<< 2},
|
|
{:"100mb_fd", 1 <<< 3},
|
|
{:"1gb_hd", 1 <<< 4},
|
|
{:"1gb_fd", 1 <<< 5},
|
|
{:"10gb_fd", 1 <<< 6},
|
|
{:"40gb_fd", 1 <<< 7},
|
|
{:"100gb_fd", 1 <<< 8},
|
|
{:"1tb_fd", 1 <<< 9},
|
|
{:other, 1 <<< 10},
|
|
{:copper, 1 <<< 11},
|
|
{:fiber, 1 <<< 12},
|
|
{:autoneg, 1 <<< 13},
|
|
{:pause, 1 <<< 14},
|
|
{:pause_asym, 1 <<< 15}
|
|
],
|
|
openflow10_port_no: [
|
|
max: 0xFF00,
|
|
in_port: 0xFFF8,
|
|
table: 0xFFF9,
|
|
normal: 0xFFFA,
|
|
flood: 0xFFFB,
|
|
all: 0xFFFC,
|
|
controller: 0xFFFD,
|
|
local: 0xFFFE,
|
|
none: 0xFFFF
|
|
],
|
|
openflow13_port_no: [
|
|
max: 0xFFFFFF00,
|
|
in_port: 0xFFFFFFF8,
|
|
table: 0xFFFFFFF9,
|
|
normal: 0xFFFFFFFA,
|
|
flood: 0xFFFFFFFB,
|
|
all: 0xFFFFFFFC,
|
|
controller: 0xFFFFFFFD,
|
|
local: 0xFFFFFFFE,
|
|
any: 0xFFFFFFFF
|
|
],
|
|
packet_in_reason: [
|
|
no_match: 0,
|
|
action: 1,
|
|
invalid_ttl: 2,
|
|
action_set: 3,
|
|
group: 4,
|
|
packet_out: 5
|
|
],
|
|
packet_in_reason_mask: [
|
|
no_match: 1 <<< 0,
|
|
action: 1 <<< 1,
|
|
invalid_ttl: 1 <<< 2,
|
|
action_set: 1 <<< 3,
|
|
group: 1 <<< 4,
|
|
packet_out: 1 <<< 5
|
|
],
|
|
flow_mod_command: [
|
|
add: 0,
|
|
modify: 1,
|
|
modify_strict: 2,
|
|
delete: 3,
|
|
delete_strict: 4
|
|
],
|
|
flow_mod_flags: [
|
|
send_flow_rem: 1 <<< 0,
|
|
check_overlap: 1 <<< 1,
|
|
reset_counts: 1 <<< 2,
|
|
no_packet_counts: 1 <<< 3,
|
|
no_byte_counts: 1 <<< 4
|
|
],
|
|
flow_removed_reason: [
|
|
idle_timeout: 0,
|
|
hard_timeout: 1,
|
|
delete: 2,
|
|
group_delete: 3,
|
|
meter_delete: 4,
|
|
eviction: 5
|
|
],
|
|
flow_removed_reason_mask: [
|
|
idle_timeout: 1 <<< 0,
|
|
hard_timeout: 1 <<< 1,
|
|
delete: 1 <<< 2,
|
|
group_delete: 1 <<< 3,
|
|
meter_delete: 1 <<< 4,
|
|
eviction: 1 <<< 5
|
|
],
|
|
port_reason: [
|
|
add: 0,
|
|
delete: 1,
|
|
modify: 2
|
|
],
|
|
port_reason_mask: [
|
|
add: 1 <<< 0,
|
|
delete: 1 <<< 1,
|
|
modify: 1 <<< 2
|
|
],
|
|
group_mod_command: [
|
|
add: 0,
|
|
modify: 1,
|
|
delete: 2
|
|
],
|
|
group_type: [
|
|
all: 0,
|
|
select: 1,
|
|
indirect: 2,
|
|
fast_failover: 3
|
|
],
|
|
group_type_flags: [
|
|
all: 1 <<< 0,
|
|
select: 1 <<< 1,
|
|
indirect: 1 <<< 2,
|
|
fast_failover: 1 <<< 3
|
|
],
|
|
group_id: [
|
|
max: 0xFFFFFF00,
|
|
all: 0xFFFFFFFC,
|
|
any: 0xFFFFFFFF
|
|
],
|
|
group_capabilities: [
|
|
select_weight: 1 <<< 0,
|
|
select_liveness: 1 <<< 1,
|
|
chaining: 1 <<< 2,
|
|
chaining_checks: 1 <<< 3
|
|
],
|
|
table_id: [
|
|
max: 0xFE,
|
|
all: 0xFF
|
|
],
|
|
queue_id: [
|
|
all: 0xFFFFFFFF
|
|
],
|
|
meter_mod_command: [
|
|
add: 0,
|
|
modify: 1,
|
|
delete: 2
|
|
],
|
|
meter_id: [
|
|
max: 0xFFFF0000,
|
|
slowpath: 0xFFFFFFFD,
|
|
controller: 0xFFFFFFFE,
|
|
all: 0xFFFFFFFF
|
|
],
|
|
meter_flags: [
|
|
kbps: 1 <<< 0,
|
|
pktps: 1 <<< 1,
|
|
burst: 1 <<< 2,
|
|
stats: 1 <<< 3
|
|
],
|
|
meter_band_type: [
|
|
{Openflow.MeterBand.Drop, 1},
|
|
{Openflow.MeterBand.Remark, 2},
|
|
{Openflow.MeterBand.Experimenter, 0xFFFF}
|
|
],
|
|
table_config: [
|
|
table_miss_controller: 0 <<< 0,
|
|
table_miss_continue: 1 <<< 0,
|
|
table_miss_drop: 2 <<< 0,
|
|
table_miss_mask: 3 <<< 0,
|
|
eviction: 1 <<< 2,
|
|
vacancy_events: 1 <<< 3
|
|
],
|
|
action_type: [
|
|
{Openflow.Action.Output, 0},
|
|
{Openflow.Action.CopyTtlOut, 11},
|
|
{Openflow.Action.CopyTtlIn, 12},
|
|
{Openflow.Action.SetMplsTtl, 15},
|
|
{Openflow.Action.DecMplsTtl, 16},
|
|
{Openflow.Action.PushVlan, 17},
|
|
{Openflow.Action.PopVlan, 18},
|
|
{Openflow.Action.PushMpls, 19},
|
|
{Openflow.Action.PopMpls, 20},
|
|
{Openflow.Action.SetQueue, 21},
|
|
{Openflow.Action.Group, 22},
|
|
{Openflow.Action.SetNwTtl, 23},
|
|
{Openflow.Action.DecNwTtl, 24},
|
|
{Openflow.Action.SetField, 25},
|
|
{Openflow.Action.PushPbb, 26},
|
|
{Openflow.Action.PopPbb, 27},
|
|
{Openflow.Action.Encap, 28},
|
|
{Openflow.Action.Decap, 29},
|
|
{Openflow.Action.SetSequence, 30},
|
|
{Openflow.Action.ValidateSequence, 31},
|
|
{Openflow.Action.Experimenter, 0xFFFF}
|
|
],
|
|
action_flags: [
|
|
{Openflow.Action.Output, 1 <<< 0},
|
|
{Openflow.Action.CopyTtlOut, 1 <<< 11},
|
|
{Openflow.Action.CopyTtlIn, 1 <<< 12},
|
|
{Openflow.Action.SetMplsTtl, 1 <<< 15},
|
|
{Openflow.Action.DecMplsTtl, 1 <<< 16},
|
|
{Openflow.Action.PushVlan, 1 <<< 17},
|
|
{Openflow.Action.PopVlan, 1 <<< 18},
|
|
{Openflow.Action.PushMpls, 1 <<< 19},
|
|
{Openflow.Action.PopMpls, 1 <<< 20},
|
|
{Openflow.Action.SetQueue, 1 <<< 21},
|
|
{Openflow.Action.Group, 1 <<< 22},
|
|
{Openflow.Action.SetNwTtl, 1 <<< 23},
|
|
{Openflow.Action.DecNwTtl, 1 <<< 24},
|
|
{Openflow.Action.SetField, 1 <<< 25},
|
|
{Openflow.Action.PushPbb, 1 <<< 26},
|
|
{Openflow.Action.PopPbb, 1 <<< 27},
|
|
{Openflow.Action.Encap, 1 <<< 28},
|
|
{Openflow.Action.Decap, 1 <<< 29},
|
|
{Openflow.Action.SetSequence, 1 <<< 30},
|
|
{Openflow.Action.ValidateSequence, 1 <<< 31},
|
|
{Openflow.Action.Experimenter, 0xFFFF}
|
|
],
|
|
action_vendor: [
|
|
nicira_ext_action: 0x00002320,
|
|
onf_ext_action: 0x4F4E4600
|
|
],
|
|
onf_ext_action: [
|
|
{Openflow.Action.OnfCopyField, 3200}
|
|
],
|
|
nicira_ext_action: [
|
|
{Openflow.Action.NxResubmit, 1},
|
|
{Openflow.Action.NxSetTunnel, 2},
|
|
# {Openflow.Action.NxSetQueue, 4}, Deprecated
|
|
# {Openflow.Action.NxPopQueue, 5}, Deprecated
|
|
{Openflow.Action.NxRegMove, 6},
|
|
{Openflow.Action.NxRegLoad, 7},
|
|
{Openflow.Action.NxNote, 8},
|
|
{Openflow.Action.NxSetTunnel64, 9},
|
|
{Openflow.Action.NxMultipath, 10},
|
|
{Openflow.Action.NxBundle, 12},
|
|
{Openflow.Action.NxBundleLoad, 13},
|
|
{Openflow.Action.NxResubmitTable, 14},
|
|
{Openflow.Action.NxOutputReg, 15},
|
|
{Openflow.Action.NxLearn, 16},
|
|
{Openflow.Action.NxExit, 17},
|
|
{Openflow.Action.NxDecTtl, 18},
|
|
{Openflow.Action.NxFinTimeout, 19},
|
|
{Openflow.Action.NxController, 20},
|
|
{Openflow.Action.NxDecTtlCntIds, 21},
|
|
{Openflow.Action.NxWriteMetadata, 22},
|
|
# {Openflow.Action.NxPushMpls, 23}, # Deprecated
|
|
# {Openflow.Action.NxPopMpls, 24}, # Deprecated
|
|
# {Openflow.Action.NxSetMplsTtl, 25}, Deprecated
|
|
# {Openflow.Action.NxDecMplsTtl, 26}, Deprecated
|
|
{Openflow.Action.NxStackPush, 27},
|
|
{Openflow.Action.NxStackPop, 28},
|
|
{Openflow.Action.NxSample, 29},
|
|
# {Openflow.Action.NxSetMplsLabel, 30}, Deprecated
|
|
# {Openflow.Action.NxSetMplsTc, 31}, Deprecated
|
|
{Openflow.Action.NxOutputReg2, 32},
|
|
{Openflow.Action.NxRegLoad2, 33},
|
|
{Openflow.Action.NxConjunction, 34},
|
|
{Openflow.Action.NxConntrack, 35},
|
|
{Openflow.Action.NxNat, 36},
|
|
{Openflow.Action.NxController2, 37},
|
|
{Openflow.Action.NxSample2, 38},
|
|
{Openflow.Action.NxOutputTrunc, 39},
|
|
{Openflow.Action.NxGroup, 40},
|
|
{Openflow.Action.NxSample3, 41},
|
|
{Openflow.Action.NxClone, 42},
|
|
{Openflow.Action.NxCtClear, 43},
|
|
{Openflow.Action.NxResubmitTableCt, 44},
|
|
{Openflow.Action.NxLearn2, 45},
|
|
{Openflow.Action.NxEncap, 46},
|
|
{Openflow.Action.NxDecap, 47},
|
|
{Openflow.Action.NxDebugRecirc, 0xFF}
|
|
],
|
|
nx_mp_algorithm: [
|
|
modulo_n: 0,
|
|
hash_threshold: 1,
|
|
highest_random_weight: 2,
|
|
iterative_hash: 3
|
|
],
|
|
nx_hash_fields: [
|
|
eth_src: 0,
|
|
symmetric_l4: 1,
|
|
symmetric_l3l4: 2,
|
|
symmetric_l3l4_udp: 3,
|
|
nw_src: 4,
|
|
nw_dst: 5
|
|
],
|
|
nx_bd_algorithm: [
|
|
active_backup: 0,
|
|
highest_random_weight: 1
|
|
],
|
|
nx_learn_flag: [
|
|
send_flow_rem: 1 <<< 0,
|
|
delete_learned: 1 <<< 1,
|
|
write_result: 1 <<< 2
|
|
],
|
|
nx_conntrack_flags: [
|
|
commit: 1 <<< 0,
|
|
force: 1 <<< 1
|
|
],
|
|
nx_nat_flags: [
|
|
src: 1 <<< 0,
|
|
dst: 1 <<< 1,
|
|
persistent: 1 <<< 2,
|
|
protocol_hash: 1 <<< 3,
|
|
protocol_random: 1 <<< 4
|
|
],
|
|
nx_nat_range: [
|
|
ipv4_min: 1 <<< 0,
|
|
ipv4_max: 1 <<< 1,
|
|
ipv6_min: 1 <<< 2,
|
|
ipv6_max: 1 <<< 3,
|
|
proto_min: 1 <<< 4,
|
|
proto_max: 1 <<< 5
|
|
],
|
|
nx_action_controller2_prop_type: [
|
|
max_len: 0,
|
|
controller_id: 1,
|
|
reason: 2,
|
|
userdata: 3,
|
|
pause: 4
|
|
],
|
|
nx_action_sample_direction: [
|
|
default: 0,
|
|
ingress: 1,
|
|
egress: 2
|
|
],
|
|
nx_flow_spec_type: [
|
|
{Openflow.Action.NxFlowSpecMatch, 0},
|
|
{Openflow.Action.NxFlowSpecLoad, 1},
|
|
{Openflow.Action.NxFlowSpecOutput, 2}
|
|
],
|
|
instruction_type: [
|
|
{Openflow.Instruction.GotoTable, 1},
|
|
{Openflow.Instruction.WriteMetadata, 2},
|
|
{Openflow.Instruction.WriteActions, 3},
|
|
{Openflow.Instruction.ApplyActions, 4},
|
|
{Openflow.Instruction.ClearActions, 5},
|
|
{Openflow.Instruction.Meter, 6},
|
|
{Openflow.Instruction.Experimenter, 0xFFFF}
|
|
],
|
|
controller_role: [
|
|
nochange: 0,
|
|
equal: 1,
|
|
master: 2,
|
|
slave: 3
|
|
],
|
|
nx_role: [
|
|
other: 0,
|
|
master: 1,
|
|
slave: 2
|
|
],
|
|
packet_in_format: [
|
|
standard: 0,
|
|
nxt_packet_in: 1,
|
|
nxt_packet_in2: 2
|
|
],
|
|
flow_format: [
|
|
openflow10: 0,
|
|
nxm: 1
|
|
],
|
|
packet_in2_prop_type: [
|
|
packet: 0,
|
|
full_len: 1,
|
|
buffer_id: 2,
|
|
table_id: 3,
|
|
cookie: 4,
|
|
reason: 5,
|
|
metadata: 6,
|
|
userdata: 7,
|
|
continuation: 8
|
|
],
|
|
continuation_prop_type: [
|
|
bridge: 0x8000,
|
|
stack: 0x8001,
|
|
mirrors: 0x8002,
|
|
conntracked: 0x8003,
|
|
table_id: 0x8004,
|
|
cookie: 0x8005,
|
|
actions: 0x8006,
|
|
action_set: 0x8007
|
|
],
|
|
flow_monitor_flag: [
|
|
initial: 1 <<< 0,
|
|
add: 1 <<< 1,
|
|
delete: 1 <<< 2,
|
|
modify: 1 <<< 3,
|
|
actions: 1 <<< 4,
|
|
own: 1 <<< 5
|
|
],
|
|
flow_update_event: [
|
|
added: 0,
|
|
deleted: 1,
|
|
modified: 2,
|
|
abbrev: 3
|
|
],
|
|
tlv_table_mod_command: [
|
|
add: 0,
|
|
delete: 1,
|
|
clear: 2
|
|
],
|
|
table_feature_prop_type: [
|
|
instructions: 0,
|
|
instructions_miss: 1,
|
|
next_tables: 2,
|
|
next_tables_miss: 3,
|
|
write_actions: 4,
|
|
write_actions_miss: 5,
|
|
apply_actions: 6,
|
|
apply_actions_miss: 7,
|
|
match: 8,
|
|
wildcards: 10,
|
|
write_setfield: 12,
|
|
write_setfield_miss: 13,
|
|
apply_setfield: 14,
|
|
apply_setfield_miss: 15,
|
|
experimenter: 0xFFFE,
|
|
experimenter_miss: 0xFFFF
|
|
],
|
|
bundle_ctrl_type: [
|
|
open_request: 0,
|
|
open_reply: 1,
|
|
close_request: 2,
|
|
close_reply: 3,
|
|
commit_request: 4,
|
|
commit_reply: 5,
|
|
discard_request: 6,
|
|
discard_reply: 7
|
|
],
|
|
bundle_flags: [
|
|
atomic: 1 <<< 0,
|
|
ordered: 1 <<< 1
|
|
]
|
|
]
|
|
|
|
File.write(
|
|
"lib/openflow/enums.ex",
|
|
"""
|
|
defmodule Openflow.Enums do
|
|
@moduledoc "auto generated code"\n
|
|
""",
|
|
[:binary]
|
|
)
|
|
|
|
for {enum_name, enum_def} <- enums do
|
|
to_int_fn_name = :"#{enum_name}_to_int"
|
|
|
|
for {key, _value} <- enum_def do
|
|
File.write(
|
|
"lib/openflow/enums.ex",
|
|
"""
|
|
def to_int(#{inspect(key)}, :#{enum_name}) do
|
|
#{to_int_fn_name}(#{inspect(key)})
|
|
catch
|
|
_class, _reason -> #{inspect(key)}
|
|
end\n
|
|
""",
|
|
[:append, :binary]
|
|
)
|
|
end
|
|
|
|
File.write(
|
|
"lib/openflow/enums.ex",
|
|
"""
|
|
def to_int(_int, :#{enum_name}) do
|
|
throw(:bad_enum)
|
|
end\n
|
|
""",
|
|
[:append, :binary]
|
|
)
|
|
end
|
|
|
|
for {enum_name, enum_def} <- enums do
|
|
to_atom_fn_name = :"#{enum_name}_to_atom"
|
|
|
|
for {_key, value} <- enum_def do
|
|
File.write(
|
|
"lib/openflow/enums.ex",
|
|
"""
|
|
def to_atom(#{inspect(value, base: :hex)}, :#{enum_name}) do
|
|
#{to_atom_fn_name}(#{inspect(value, base: :hex)})
|
|
catch
|
|
_class, _reason -> #{value}
|
|
end\n
|
|
""",
|
|
[:append, :binary]
|
|
)
|
|
end
|
|
|
|
File.write(
|
|
"lib/openflow/enums.ex",
|
|
"""
|
|
def to_atom(_, :#{enum_name}) do
|
|
throw(:bad_enum)
|
|
end\n
|
|
""",
|
|
[:append, :binary]
|
|
)
|
|
end
|
|
|
|
for {enum_name, enum_def} <- enums do
|
|
to_int_fn_name = :"#{enum_name}_to_int"
|
|
to_atom_fn_name = :"#{enum_name}_to_atom"
|
|
|
|
for {key, value} <- enum_def do
|
|
File.write(
|
|
"lib/openflow/enums.ex",
|
|
" def #{to_int_fn_name}(#{inspect(key)}), do: #{inspect(value, base: :hex)}\n",
|
|
[
|
|
:append,
|
|
:binary
|
|
]
|
|
)
|
|
end
|
|
|
|
File.write("lib/openflow/enums.ex", " def #{to_int_fn_name}(_), do: throw(:bad_enum)\n", [
|
|
:append,
|
|
:binary
|
|
])
|
|
|
|
for {key, value} <- enum_def do
|
|
File.write(
|
|
"lib/openflow/enums.ex",
|
|
" def #{to_atom_fn_name}(#{inspect(value, base: :hex)}), do: #{inspect(key)}\n",
|
|
[
|
|
:append,
|
|
:binary
|
|
]
|
|
)
|
|
end
|
|
|
|
File.write("lib/openflow/enums.ex", " def #{to_atom_fn_name}(_), do: throw(:bad_enum)\n", [
|
|
:append,
|
|
:binary
|
|
])
|
|
end
|
|
|
|
for {enum_name, _enum_def} <- enums do
|
|
File.write(
|
|
"lib/openflow/enums.ex",
|
|
"""
|
|
def int_to_flags(int, :#{enum_name}) do
|
|
Openflow.Utils.int_to_flags([], int, enum_of(:#{enum_name}))
|
|
end\n
|
|
""",
|
|
[:append, :binary]
|
|
)
|
|
end
|
|
|
|
for {enum_name, _enum_def} <- enums do
|
|
File.write(
|
|
"lib/openflow/enums.ex",
|
|
"""
|
|
def flags_to_int(flags, :#{enum_name}) do
|
|
Openflow.Utils.flags_to_int(0, flags, enum_of(:#{enum_name}))
|
|
end\n
|
|
""",
|
|
[:append, :binary]
|
|
)
|
|
end
|
|
|
|
for {enum_name, enum_def} <- enums do
|
|
File.write(
|
|
"lib/openflow/enums.ex",
|
|
" defp enum_of(:#{enum_name}), do: #{inspect(enum_def, pretty: true, limit: 100_000)}\n",
|
|
[:append, :binary]
|
|
)
|
|
end
|
|
|
|
File.write("lib/openflow/enums.ex", "end", [:append, :binary])
|