tres/lib/openflow/match/field.ex
Eishun Kondoh 7635272fbd Formatted
2018-01-30 22:47:31 +09:00

673 lines
28 KiB
Elixir

defmodule Openflow.Match.Field do
def codec(value0, field) when is_binary(value0) do
{type, format} = format_of(field)
n_bits = n_bits_of(field)
bit_size = bit_size(value0)
value =
if bit_size < n_bits do
head_pad_len = n_bits - bit_size
<<0::size(head_pad_len), value0::bytes>>
else
if bit_size > n_bits and type != :mac do
head_pad_len = bit_size - n_bits
<<_::size(head_pad_len), value::size(n_bits)-bits>> = value0
value
else
value0
end
end
formatting(value, type, format)
end
def codec(value, type) do
{type, format} = format_of(type)
formatting(value, type, format)
end
def n_bits_of(field) do
field
|> format_of
|> bit_size_of
end
def bit_size_of({:u8, _}), do: 8
def bit_size_of({:u24, _}), do: 24
def bit_size_of({:be16, _}), do: 16
def bit_size_of({:be32, _}), do: 32
def bit_size_of({:be64, _}), do: 64
def bit_size_of({:be128, _}), do: 128
def bit_size_of({:mac, _}), do: 48
# NXM0
def vendor_of(:nx_in_port), do: :nxm_0
def vendor_of(:nx_eth_dst), do: :nxm_0
def vendor_of(:nx_eth_src), do: :nxm_0
def vendor_of(:nx_eth_type), do: :nxm_0
def vendor_of(:nx_vlan_tci), do: :nxm_0
def vendor_of(:nx_ip_tos), do: :nxm_0
def vendor_of(:nx_ip_proto), do: :nxm_0
def vendor_of(:nx_ipv4_src), do: :nxm_0
def vendor_of(:nx_ipv4_dst), do: :nxm_0
def vendor_of(:nx_tcp_src), do: :nxm_0
def vendor_of(:nx_tcp_dst), do: :nxm_0
def vendor_of(:nx_udp_src), do: :nxm_0
def vendor_of(:nx_udp_dst), do: :nxm_0
def vendor_of(:nx_icmpv4_type), do: :nxm_0
def vendor_of(:nx_icmpv4_code), do: :nxm_0
def vendor_of(:nx_arp_op), do: :nxm_0
def vendor_of(:nx_arp_spa), do: :nxm_0
def vendor_of(:nx_arp_tpa), do: :nxm_0
def vendor_of(:nx_tcp_flags), do: :nxm_0
# NXM1
def vendor_of(:reg0), do: :nxm_1
def vendor_of(:reg1), do: :nxm_1
def vendor_of(:reg2), do: :nxm_1
def vendor_of(:reg3), do: :nxm_1
def vendor_of(:reg4), do: :nxm_1
def vendor_of(:reg5), do: :nxm_1
def vendor_of(:reg6), do: :nxm_1
def vendor_of(:reg7), do: :nxm_1
def vendor_of(:reg8), do: :nxm_1
def vendor_of(:reg9), do: :nxm_1
def vendor_of(:reg10), do: :nxm_1
def vendor_of(:reg11), do: :nxm_1
def vendor_of(:reg12), do: :nxm_1
def vendor_of(:reg13), do: :nxm_1
def vendor_of(:reg14), do: :nxm_1
def vendor_of(:reg15), do: :nxm_1
def vendor_of(:tun_id), do: :nxm_1
def vendor_of(:nx_arp_sha), do: :nxm_1
def vendor_of(:nx_arp_tha), do: :nxm_1
def vendor_of(:nx_ipv6_src), do: :nxm_1
def vendor_of(:nx_ipv6_dst), do: :nxm_1
def vendor_of(:nx_icmpv6_type), do: :nxm_1
def vendor_of(:nx_icmpv6_code), do: :nxm_1
def vendor_of(:nx_ipv6_nd_target), do: :nxm_1
def vendor_of(:nx_ipv6_nd_sll), do: :nxm_1
def vendor_of(:nx_ipv6_nd_tll), do: :nxm_1
def vendor_of(:nx_ip_frag), do: :nxm_1
def vendor_of(:nx_ipv6_label), do: :nxm_1
def vendor_of(:nx_ip_ecn), do: :nxm_1
def vendor_of(:nx_ip_ttl), do: :nxm_1
def vendor_of(:nx_mpls_ttl), do: :nxm_1
def vendor_of(:tun_src), do: :nxm_1
def vendor_of(:tun_dst), do: :nxm_1
def vendor_of(:pkt_mark), do: :nxm_1
def vendor_of(:dp_hash), do: :nxm_1
def vendor_of(:recirc_id), do: :nxm_1
def vendor_of(:conj_id), do: :nxm_1
def vendor_of(:nx_tun_gbp_id), do: :nxm_1
def vendor_of(:nx_tun_gbp_flags), do: :nxm_1
def vendor_of(:tun_metadata0), do: :nxm_1
def vendor_of(:tun_metadata1), do: :nxm_1
def vendor_of(:tun_metadata2), do: :nxm_1
def vendor_of(:tun_metadata3), do: :nxm_1
def vendor_of(:tun_metadata4), do: :nxm_1
def vendor_of(:tun_metadata5), do: :nxm_1
def vendor_of(:tun_metadata6), do: :nxm_1
def vendor_of(:tun_metadata7), do: :nxm_1
def vendor_of(:tun_metadata8), do: :nxm_1
def vendor_of(:tun_metadata9), do: :nxm_1
def vendor_of(:tun_metadata10), do: :nxm_1
def vendor_of(:tun_metadata11), do: :nxm_1
def vendor_of(:tun_metadata12), do: :nxm_1
def vendor_of(:tun_metadata13), do: :nxm_1
def vendor_of(:tun_metadata14), do: :nxm_1
def vendor_of(:tun_metadata15), do: :nxm_1
def vendor_of(:tun_metadata16), do: :nxm_1
def vendor_of(:tun_metadata17), do: :nxm_1
def vendor_of(:tun_metadata18), do: :nxm_1
def vendor_of(:tun_metadata19), do: :nxm_1
def vendor_of(:tun_metadata20), do: :nxm_1
def vendor_of(:tun_metadata21), do: :nxm_1
def vendor_of(:tun_metadata22), do: :nxm_1
def vendor_of(:tun_metadata23), do: :nxm_1
def vendor_of(:tun_metadata24), do: :nxm_1
def vendor_of(:tun_metadata25), do: :nxm_1
def vendor_of(:tun_metadata26), do: :nxm_1
def vendor_of(:tun_metadata27), do: :nxm_1
def vendor_of(:tun_metadata28), do: :nxm_1
def vendor_of(:tun_metadata29), do: :nxm_1
def vendor_of(:tun_metadata30), do: :nxm_1
def vendor_of(:tun_metadata31), do: :nxm_1
def vendor_of(:tun_metadata32), do: :nxm_1
def vendor_of(:tun_metadata33), do: :nxm_1
def vendor_of(:tun_metadata34), do: :nxm_1
def vendor_of(:tun_metadata35), do: :nxm_1
def vendor_of(:tun_metadata36), do: :nxm_1
def vendor_of(:tun_metadata37), do: :nxm_1
def vendor_of(:tun_metadata38), do: :nxm_1
def vendor_of(:tun_metadata39), do: :nxm_1
def vendor_of(:tun_metadata40), do: :nxm_1
def vendor_of(:tun_metadata41), do: :nxm_1
def vendor_of(:tun_metadata42), do: :nxm_1
def vendor_of(:tun_metadata43), do: :nxm_1
def vendor_of(:tun_metadata44), do: :nxm_1
def vendor_of(:tun_metadata45), do: :nxm_1
def vendor_of(:tun_metadata46), do: :nxm_1
def vendor_of(:tun_metadata47), do: :nxm_1
def vendor_of(:tun_metadata48), do: :nxm_1
def vendor_of(:tun_metadata49), do: :nxm_1
def vendor_of(:tun_metadata50), do: :nxm_1
def vendor_of(:tun_metadata51), do: :nxm_1
def vendor_of(:tun_metadata52), do: :nxm_1
def vendor_of(:tun_metadata53), do: :nxm_1
def vendor_of(:tun_metadata54), do: :nxm_1
def vendor_of(:tun_metadata55), do: :nxm_1
def vendor_of(:tun_metadata56), do: :nxm_1
def vendor_of(:tun_metadata57), do: :nxm_1
def vendor_of(:tun_metadata58), do: :nxm_1
def vendor_of(:tun_metadata59), do: :nxm_1
def vendor_of(:tun_metadata60), do: :nxm_1
def vendor_of(:tun_metadata61), do: :nxm_1
def vendor_of(:tun_metadata62), do: :nxm_1
def vendor_of(:tun_metadata63), do: :nxm_1
def vendor_of(:tun_flags), do: :nxm_1
def vendor_of(:ct_state), do: :nxm_1
def vendor_of(:ct_zone), do: :nxm_1
def vendor_of(:ct_mark), do: :nxm_1
def vendor_of(:ct_label), do: :nxm_1
def vendor_of(:tun_ipv6_src), do: :nxm_1
def vendor_of(:tun_ipv6_dst), do: :nxm_1
def vendor_of(:xxreg0), do: :nxm_1
def vendor_of(:xxreg1), do: :nxm_1
def vendor_of(:xxreg2), do: :nxm_1
def vendor_of(:xxreg3), do: :nxm_1
def vendor_of(:xxreg4), do: :nxm_1
def vendor_of(:xxreg5), do: :nxm_1
def vendor_of(:xxreg6), do: :nxm_1
def vendor_of(:xxreg7), do: :nxm_1
def vendor_of(:ct_ip_proto), do: :nxm_1
def vendor_of(:ct_ipv4_src), do: :nxm_1
def vendor_of(:ct_ipv4_dst), do: :nxm_1
def vendor_of(:ct_ipv6_src), do: :nxm_1
def vendor_of(:ct_ipv6_dst), do: :nxm_1
def vendor_of(:ct_tp_src), do: :nxm_1
def vendor_of(:ct_tp_dst), do: :nxm_1
# OpenFlow Basic
def vendor_of(:in_port), do: :openflow_basic
def vendor_of(:in_phy_port), do: :openflow_basic
def vendor_of(:metadata), do: :openflow_basic
def vendor_of(:eth_dst), do: :openflow_basic
def vendor_of(:eth_src), do: :openflow_basic
def vendor_of(:eth_type), do: :openflow_basic
def vendor_of(:vlan_vid), do: :openflow_basic
def vendor_of(:vlan_pcp), do: :openflow_basic
def vendor_of(:ip_dscp), do: :openflow_basic
def vendor_of(:ip_ecn), do: :openflow_basic
def vendor_of(:ip_proto), do: :openflow_basic
def vendor_of(:ipv4_src), do: :openflow_basic
def vendor_of(:ipv4_dst), do: :openflow_basic
def vendor_of(:tcp_src), do: :openflow_basic
def vendor_of(:tcp_dst), do: :openflow_basic
def vendor_of(:udp_src), do: :openflow_basic
def vendor_of(:udp_dst), do: :openflow_basic
def vendor_of(:sctp_src), do: :openflow_basic
def vendor_of(:sctp_dst), do: :openflow_basic
def vendor_of(:icmpv4_type), do: :openflow_basic
def vendor_of(:icmpv4_code), do: :openflow_basic
def vendor_of(:arp_op), do: :openflow_basic
def vendor_of(:arp_spa), do: :openflow_basic
def vendor_of(:arp_tpa), do: :openflow_basic
def vendor_of(:arp_sha), do: :openflow_basic
def vendor_of(:arp_tha), do: :openflow_basic
def vendor_of(:ipv6_src), do: :openflow_basic
def vendor_of(:ipv6_dst), do: :openflow_basic
def vendor_of(:ipv6_flabel), do: :openflow_basic
def vendor_of(:icmpv6_type), do: :openflow_basic
def vendor_of(:icmpv6_code), do: :openflow_basic
def vendor_of(:ipv6_nd_target), do: :openflow_basic
def vendor_of(:ipv6_nd_sll), do: :openflow_basic
def vendor_of(:ipv6_nd_tll), do: :openflow_basic
def vendor_of(:mpls_label), do: :openflow_basic
def vendor_of(:mpls_tc), do: :openflow_basic
def vendor_of(:mpls_bos), do: :openflow_basic
def vendor_of(:pbb_isid), do: :openflow_basic
def vendor_of(:tunnel_id), do: :openflow_basic
def vendor_of(:ipv6_exthdr), do: :openflow_basic
def vendor_of(:pbb_uca), do: :openflow_basic
def vendor_of(:packet_type), do: :openflow_basic
def vendor_of(:gre_flags), do: :openflow_basic
def vendor_of(:gre_ver), do: :openflow_basic
def vendor_of(:gre_protocol), do: :openflow_basic
def vendor_of(:gre_key), do: :openflow_basic
def vendor_of(:gre_seqnum), do: :openflow_basic
def vendor_of(:lisp_flags), do: :openflow_basic
def vendor_of(:lisp_nonce), do: :openflow_basic
def vendor_of(:lisp_id), do: :openflow_basic
def vendor_of(:vxlan_flags), do: :openflow_basic
def vendor_of(:vxlan_vni), do: :openflow_basic
def vendor_of(:mpls_data_first_nibble), do: :openflow_basic
def vendor_of(:mpls_ach_version), do: :openflow_basic
def vendor_of(:mpls_ach_channel), do: :openflow_basic
def vendor_of(:mpls_pw_metadata), do: :openflow_basic
def vendor_of(:mpls_cw_flags), do: :openflow_basic
def vendor_of(:mpls_cw_fragment), do: :openflow_basic
def vendor_of(:mpls_cw_len), do: :openflow_basic
def vendor_of(:mpls_cw_seq_num), do: :openflow_basic
def vendor_of(:gtpu_flags), do: :openflow_basic
def vendor_of(:gtpu_ver), do: :openflow_basic
def vendor_of(:gtpu_msg_type), do: :openflow_basic
def vendor_of(:gtpu_teid), do: :openflow_basic
def vendor_of(:gtpu_extn_hdr), do: :openflow_basic
def vendor_of(:gtpu_extn_udp_port), do: :openflow_basic
def vendor_of(:gtpu_extn_sci), do: :openflow_basic
# Packet Register
def vendor_of(:xreg0), do: :packet_register
def vendor_of(:xreg1), do: :packet_register
def vendor_of(:xreg2), do: :packet_register
def vendor_of(:xreg3), do: :packet_register
def vendor_of(:xreg4), do: :packet_register
def vendor_of(:xreg5), do: :packet_register
def vendor_of(:xreg6), do: :packet_register
def vendor_of(:xreg7), do: :packet_register
# Nicira Ext Match
def vendor_of(:nsh_flags), do: :nicira_ext_match
def vendor_of(:nsh_mdtype), do: :nicira_ext_match
def vendor_of(:nsh_np), do: :nicira_ext_match
def vendor_of(:nsh_spi), do: :nicira_ext_match
def vendor_of(:nsh_si), do: :nicira_ext_match
def vendor_of(:nsh_c1), do: :nicira_ext_match
def vendor_of(:nsh_c2), do: :nicira_ext_match
def vendor_of(:nsh_c3), do: :nicira_ext_match
def vendor_of(:nsh_c4), do: :nicira_ext_match
# HP Ext Match
def vendor_of(:hp_udp_src_port_range), do: :hp_ext_match
def vendor_of(:hp_udp_dst_port_range), do: :hp_ext_match
def vendor_of(:hp_tcp_src_port_range), do: :hp_ext_match
def vendor_of(:hp_tcp_dst_port_range), do: :hp_ext_match
def vendor_of(:hp_tcp_flags), do: :hp_ext_match
def vendor_of(:hp_custom_1), do: :hp_ext_match
def vendor_of(:hp_custom_2), do: :hp_ext_match
def vendor_of(:hp_custom_3), do: :hp_ext_match
def vendor_of(:hp_custom_4), do: :hp_ext_match
# ONF Ext Match
def vendor_of(:onf_tcp_flags), do: :onf_ext_match
def vendor_of(:onf_actset_output), do: :onf_ext_match
def vendor_of(:onf_pbb_uca), do: :onf_ext_match
# NXM0
def format_of(:nx_in_port), do: {:be16, :openflow10_port}
def format_of(:nx_eth_dst), do: {:mac, :ethernet}
def format_of(:nx_eth_src), do: {:mac, :ethernet}
def format_of(:nx_eth_type), do: {:be16, :hexadecimal}
def format_of(:nx_vlan_tci), do: {:be16, :hexadecimal}
def format_of(:nx_ip_tos), do: {:u8, :decimal}
def format_of(:nx_ip_proto), do: {:u8, :decimal}
def format_of(:nx_ipv4_src), do: {:be32, :ipv4}
def format_of(:nx_ipv4_dst), do: {:be32, :ipv4}
def format_of(:nx_tcp_src), do: {:be16, :decimal}
def format_of(:nx_tcp_dst), do: {:be16, :decimal}
def format_of(:nx_udp_src), do: {:be16, :decimal}
def format_of(:nx_udp_dst), do: {:be16, :decimal}
def format_of(:nx_icmpv4_type), do: {:u8, :decimal}
def format_of(:nx_icmpv4_code), do: {:u8, :decimal}
def format_of(:nx_arp_op), do: {:be16, :decimal}
def format_of(:nx_arp_spa), do: {:be32, :ipv4}
def format_of(:nx_arp_tpa), do: {:be32, :ipv4}
def format_of(:nx_tcp_flags), do: {:be16, :tcp_flags}
# NXM1
def format_of(:reg0), do: {:be32, :hexadecimal}
def format_of(:reg1), do: {:be32, :hexadecimal}
def format_of(:reg2), do: {:be32, :hexadecimal}
def format_of(:reg3), do: {:be32, :hexadecimal}
def format_of(:reg4), do: {:be32, :hexadecimal}
def format_of(:reg5), do: {:be32, :hexadecimal}
def format_of(:reg6), do: {:be32, :hexadecimal}
def format_of(:reg7), do: {:be32, :hexadecimal}
def format_of(:reg8), do: {:be32, :hexadecimal}
def format_of(:reg9), do: {:be32, :hexadecimal}
def format_of(:reg10), do: {:be32, :hexadecimal}
def format_of(:reg11), do: {:be32, :hexadecimal}
def format_of(:reg12), do: {:be32, :hexadecimal}
def format_of(:reg13), do: {:be32, :hexadecimal}
def format_of(:reg14), do: {:be32, :hexadecimal}
def format_of(:reg15), do: {:be32, :hexadecimal}
def format_of(:tun_id), do: {:be64, :hexadecimal}
def format_of(:nx_arp_sha), do: {:mac, :ethernet}
def format_of(:nx_arp_tha), do: {:mac, :ethernet}
def format_of(:nx_ipv6_src), do: {:be128, :ipv6}
def format_of(:nx_ipv6_dst), do: {:be128, :ipv6}
def format_of(:nx_icmpv6_type), do: {:u8, :decimal}
def format_of(:nx_icmpv6_code), do: {:u8, :decimal}
def format_of(:nx_ipv6_nd_target), do: {:be128, :ipv6}
def format_of(:nx_ipv6_nd_sll), do: {:mac, :ethernet}
def format_of(:nx_ipv6_nd_tll), do: {:mac, :ethernet}
def format_of(:nx_ip_frag), do: {:u8, :decimal}
def format_of(:nx_ipv6_label), do: {:be32, :hexadecimal}
def format_of(:nx_ip_ecn), do: {:u8, :decimal}
def format_of(:nx_ip_ttl), do: {:u8, :decimal}
def format_of(:nx_mpls_ttl), do: {:u8, :decimal}
def format_of(:tun_src), do: {:be32, :ipv4}
def format_of(:tun_dst), do: {:be32, :ipv4}
def format_of(:pkt_mark), do: {:be32, :hexadecimal}
def format_of(:dp_hash), do: {:be32, :hexadecimal}
def format_of(:recirc_id), do: {:be32, :hexadecimal}
def format_of(:conj_id), do: {:be32, :hexadecimal}
def format_of(:nx_tun_gbp_id), do: {:be16, :decimal}
def format_of(:nx_tun_gbp_flags), do: {:u8, :decimal}
def format_of(:tun_metadata0), do: {:dynamic, :bytes}
def format_of(:tun_metadata1), do: {:dynamic, :bytes}
def format_of(:tun_metadata2), do: {:dynamic, :bytes}
def format_of(:tun_metadata3), do: {:dynamic, :bytes}
def format_of(:tun_metadata4), do: {:dynamic, :bytes}
def format_of(:tun_metadata5), do: {:dynamic, :bytes}
def format_of(:tun_metadata6), do: {:dynamic, :bytes}
def format_of(:tun_metadata7), do: {:dynamic, :bytes}
def format_of(:tun_metadata8), do: {:dynamic, :bytes}
def format_of(:tun_metadata9), do: {:dynamic, :bytes}
def format_of(:tun_metadata10), do: {:dynamic, :bytes}
def format_of(:tun_metadata11), do: {:dynamic, :bytes}
def format_of(:tun_metadata12), do: {:dynamic, :bytes}
def format_of(:tun_metadata13), do: {:dynamic, :bytes}
def format_of(:tun_metadata14), do: {:dynamic, :bytes}
def format_of(:tun_metadata15), do: {:dynamic, :bytes}
def format_of(:tun_metadata16), do: {:dynamic, :bytes}
def format_of(:tun_metadata17), do: {:dynamic, :bytes}
def format_of(:tun_metadata18), do: {:dynamic, :bytes}
def format_of(:tun_metadata19), do: {:dynamic, :bytes}
def format_of(:tun_metadata20), do: {:dynamic, :bytes}
def format_of(:tun_metadata21), do: {:dynamic, :bytes}
def format_of(:tun_metadata22), do: {:dynamic, :bytes}
def format_of(:tun_metadata23), do: {:dynamic, :bytes}
def format_of(:tun_metadata24), do: {:dynamic, :bytes}
def format_of(:tun_metadata25), do: {:dynamic, :bytes}
def format_of(:tun_metadata26), do: {:dynamic, :bytes}
def format_of(:tun_metadata27), do: {:dynamic, :bytes}
def format_of(:tun_metadata28), do: {:dynamic, :bytes}
def format_of(:tun_metadata29), do: {:dynamic, :bytes}
def format_of(:tun_metadata30), do: {:dynamic, :bytes}
def format_of(:tun_metadata31), do: {:dynamic, :bytes}
def format_of(:tun_metadata32), do: {:dynamic, :bytes}
def format_of(:tun_metadata33), do: {:dynamic, :bytes}
def format_of(:tun_metadata34), do: {:dynamic, :bytes}
def format_of(:tun_metadata35), do: {:dynamic, :bytes}
def format_of(:tun_metadata36), do: {:dynamic, :bytes}
def format_of(:tun_metadata37), do: {:dynamic, :bytes}
def format_of(:tun_metadata38), do: {:dynamic, :bytes}
def format_of(:tun_metadata39), do: {:dynamic, :bytes}
def format_of(:tun_metadata40), do: {:dynamic, :bytes}
def format_of(:tun_metadata41), do: {:dynamic, :bytes}
def format_of(:tun_metadata42), do: {:dynamic, :bytes}
def format_of(:tun_metadata43), do: {:dynamic, :bytes}
def format_of(:tun_metadata44), do: {:dynamic, :bytes}
def format_of(:tun_metadata45), do: {:dynamic, :bytes}
def format_of(:tun_metadata46), do: {:dynamic, :bytes}
def format_of(:tun_metadata47), do: {:dynamic, :bytes}
def format_of(:tun_metadata48), do: {:dynamic, :bytes}
def format_of(:tun_metadata49), do: {:dynamic, :bytes}
def format_of(:tun_metadata50), do: {:dynamic, :bytes}
def format_of(:tun_metadata51), do: {:dynamic, :bytes}
def format_of(:tun_metadata52), do: {:dynamic, :bytes}
def format_of(:tun_metadata53), do: {:dynamic, :bytes}
def format_of(:tun_metadata54), do: {:dynamic, :bytes}
def format_of(:tun_metadata55), do: {:dynamic, :bytes}
def format_of(:tun_metadata56), do: {:dynamic, :bytes}
def format_of(:tun_metadata57), do: {:dynamic, :bytes}
def format_of(:tun_metadata58), do: {:dynamic, :bytes}
def format_of(:tun_metadata59), do: {:dynamic, :bytes}
def format_of(:tun_metadata60), do: {:dynamic, :bytes}
def format_of(:tun_metadata61), do: {:dynamic, :bytes}
def format_of(:tun_metadata62), do: {:dynamic, :bytes}
def format_of(:tun_metadata63), do: {:dynamic, :bytes}
def format_of(:tun_flags), do: {:be16, :decimal}
def format_of(:ct_state), do: {:be32, :ct_state}
def format_of(:ct_zone), do: {:be16, :hexadecimal}
def format_of(:ct_mark), do: {:be32, :hexadecimal}
def format_of(:ct_label), do: {:be128, :hexadecimal}
def format_of(:tun_ipv6_src), do: {:be128, :ipv6}
def format_of(:tun_ipv6_dst), do: {:be128, :ipv6}
def format_of(:xxreg0), do: {:be128, :hexadecimal}
def format_of(:xxreg1), do: {:be128, :hexadecimal}
def format_of(:xxreg2), do: {:be128, :hexadecimal}
def format_of(:xxreg3), do: {:be128, :hexadecimal}
def format_of(:xxreg4), do: {:be128, :hexadecimal}
def format_of(:xxreg5), do: {:be128, :hexadecimal}
def format_of(:xxreg6), do: {:be128, :hexadecimal}
def format_of(:xxreg7), do: {:be128, :hexadecimal}
def format_of(:ct_ip_proto), do: {:u8, :decimal}
def format_of(:ct_ipv4_src), do: {:be32, :ipv4}
def format_of(:ct_ipv4_dst), do: {:be32, :ipv4}
def format_of(:ct_ipv6_src), do: {:be128, :ipv6}
def format_of(:ct_ipv6_dst), do: {:be128, :ipv6}
def format_of(:ct_tp_src), do: {:be16, :decimal}
def format_of(:ct_tp_dst), do: {:be16, :decimal}
# OpenFlow Basic
def format_of(:in_port), do: {:be32, :openflow13_port}
def format_of(:in_phy_port), do: {:be32, :openflow13_port}
def format_of(:metadata), do: {:be64, :hexadecimal}
def format_of(:eth_dst), do: {:mac, :ethernet}
def format_of(:eth_src), do: {:mac, :ethernet}
def format_of(:eth_type), do: {:be16, :hexadecimal}
def format_of(:vlan_vid), do: {:be16, :hexadecimal}
def format_of(:vlan_pcp), do: {:u8, :decimal}
def format_of(:ip_dscp), do: {:u8, :decimal}
def format_of(:ip_ecn), do: {:u8, :decimal}
def format_of(:ip_proto), do: {:u8, :decimal}
def format_of(:ipv4_src), do: {:be32, :ipv4}
def format_of(:ipv4_dst), do: {:be32, :ipv4}
def format_of(:tcp_src), do: {:be16, :decimal}
def format_of(:tcp_dst), do: {:be16, :decimal}
def format_of(:udp_src), do: {:be16, :decimal}
def format_of(:udp_dst), do: {:be16, :decimal}
def format_of(:sctp_src), do: {:be16, :decimal}
def format_of(:sctp_dst), do: {:be16, :decimal}
def format_of(:icmpv4_type), do: {:u8, :decimal}
def format_of(:icmpv4_code), do: {:u8, :decimal}
def format_of(:arp_op), do: {:be16, :decimal}
def format_of(:arp_spa), do: {:be32, :ipv4}
def format_of(:arp_tpa), do: {:be32, :ipv4}
def format_of(:arp_sha), do: {:mac, :ethernet}
def format_of(:arp_tha), do: {:mac, :ethernet}
def format_of(:ipv6_src), do: {:be128, :ipv6}
def format_of(:ipv6_dst), do: {:be128, :ipv6}
def format_of(:ipv6_flabel), do: {:be32, :hexadecimal}
def format_of(:icmpv6_type), do: {:u8, :decimal}
def format_of(:icmpv6_code), do: {:u8, :decimal}
def format_of(:ipv6_nd_target), do: {:be128, :ipv6}
def format_of(:ipv6_nd_sll), do: {:mac, :ethernet}
def format_of(:ipv6_nd_tll), do: {:mac, :ethernet}
def format_of(:mpls_label), do: {:be32, :decimal}
def format_of(:mpls_tc), do: {:u8, :decimal}
def format_of(:mpls_bos), do: {:u8, :decimal}
def format_of(:pbb_isid), do: {:u24, :decimal}
def format_of(:tunnel_id), do: {:be64, :hexadecimal}
def format_of(:ipv6_exthdr), do: {:be16, :ipv6exthdr_flags}
def format_of(:pbb_uca), do: {:u8, :decimal}
def format_of(:packet_type), do: {:be32, :decimal}
def format_of(:gre_flags), do: {:be16, :decimal}
def format_of(:gre_ver), do: {:u8, :decimal}
def format_of(:gre_protocol), do: {:be16, :decimal}
def format_of(:gre_key), do: {:be32, :decimal}
def format_of(:gre_seqnum), do: {:be32, :decimal}
def format_of(:lisp_flags), do: {:u8, :decimal}
def format_of(:lisp_nonce), do: {:u24, :decimal}
def format_of(:lisp_id), do: {:be32, :decimal}
def format_of(:vxlan_flags), do: {:u8, :decimal}
def format_of(:vxlan_vni), do: {:u24, :decimal}
def format_of(:mpls_data_first_nibble), do: {:u8, :decimal}
def format_of(:mpls_ach_version), do: {:u8, :decimal}
def format_of(:mpls_ach_channel), do: {:be16, :decimal}
def format_of(:mpls_pw_metadata), do: {:u8, :decimal}
def format_of(:mpls_cw_flags), do: {:u8, :decimal}
def format_of(:mpls_cw_fragment), do: {:u8, :decimal}
def format_of(:mpls_cw_len), do: {:u8, :decimal}
def format_of(:mpls_cw_seq_num), do: {:be16, :decimal}
def format_of(:gtpu_flags), do: {:u8, :decimal}
def format_of(:gtpu_ver), do: {:u8, :decimal}
def format_of(:gtpu_msg_type), do: {:u8, :decimal}
def format_of(:gtpu_teid), do: {:be32, :decimal}
def format_of(:gtpu_extn_hdr), do: {:u8, :decimal}
def format_of(:gtpu_extn_udp_port), do: {:be16, :decimal}
def format_of(:gtpu_extn_sci), do: {:be16, :decimal}
# Packet Register
def format_of(:xreg0), do: {:be64, :hexadecimal}
def format_of(:xreg1), do: {:be64, :hexadecimal}
def format_of(:xreg2), do: {:be64, :hexadecimal}
def format_of(:xreg3), do: {:be64, :hexadecimal}
def format_of(:xreg4), do: {:be64, :hexadecimal}
def format_of(:xreg5), do: {:be64, :hexadecimal}
def format_of(:xreg6), do: {:be64, :hexadecimal}
def format_of(:xreg7), do: {:be64, :hexadecimal}
# Nicira Ext Match
def format_of(:nsh_flags), do: {:u8, :decimal}
def format_of(:nsh_mdtype), do: {:u8, :decimal}
def format_of(:nsh_np), do: {:u8, :decimal}
def format_of(:nsh_spi), do: {:be32, :decimal}
def format_of(:nsh_si), do: {:be32, :decimal}
def format_of(:nsh_c1), do: {:be32, :decimal}
def format_of(:nsh_c2), do: {:be32, :decimal}
def format_of(:nsh_c3), do: {:be32, :decimal}
def format_of(:nsh_c4), do: {:be32, :decimal}
# HP Ext Match
def format_of(:hp_udp_src_port_range), do: {:be32, :decimal}
def format_of(:hp_udp_dst_port_range), do: {:be32, :decimal}
def format_of(:hp_tcp_src_port_range), do: {:be32, :decimal}
def format_of(:hp_tcp_dst_port_range), do: {:be32, :decimal}
def format_of(:hp_tcp_flags), do: {:be16, :tcp_flags}
def format_of(:hp_custom_1), do: {:dynamic, :bytes}
def format_of(:hp_custom_2), do: {:dynamic, :bytes}
def format_of(:hp_custom_3), do: {:dynamic, :bytes}
def format_of(:hp_custom_4), do: {:dynamic, :bytes}
# ONF Ext Match
def format_of(:onf_tcp_flags), do: {:be16, :tcp_flags}
def format_of(:onf_actset_output), do: {:be32, :openflow13_port}
def format_of(:onf_pbb_uca), do: {:u8, :decimal}
# Formatting = decimal
def formatting(<<value::8>>, :u8, :decimal), do: value
def formatting(value, :u8, :decimal) when is_integer(value), do: <<value::8>>
def formatting(<<value::16>>, :be16, :decimal), do: value
def formatting(value, :be16, :decimal) when is_integer(value), do: <<value::16>>
def formatting(<<value::24>>, :u24, :decimal), do: value
def formatting(value, :u24, :decimal) when is_integer(value), do: <<value::24>>
def formatting(<<value::32>>, :be32, :decimal), do: value
def formatting(value, :be32, :decimal) when is_integer(value), do: <<value::32>>
def formatting(<<value::64>>, :be64, :decimal), do: value
def formatting(value, :be64, :decimal) when is_integer(value), do: <<value::64>>
def formatting(<<value::128>>, :be128, :decimal), do: value
def formatting(value, :be128, :decimal) when is_integer(value), do: <<value::128>>
# Formatting = hexadecimal
def formatting(<<value::16>>, :be16, :hexadecimal), do: value
def formatting(value, :be16, :hexadecimal) when is_integer(value), do: <<value::16>>
def formatting(<<value::24>>, :u24, :hexadecimal), do: value
def formatting(value, :u24, :hexadecimal) when is_integer(value), do: <<value::24>>
def formatting(<<value::32>>, :be32, :hexadecimal), do: value
def formatting(value, :be32, :hexadecimal) when is_integer(value), do: <<value::32>>
def formatting(<<value::64>>, :be64, :hexadecimal), do: value
def formatting(value, :be64, :hexadecimal) when is_integer(value), do: <<value::64>>
def formatting(<<value::128>>, :be128, :hexadecimal), do: value
def formatting(value, :be128, :hexadecimal) when is_integer(value), do: <<value::128>>
# Formatting = ethernet
def formatting(<<value::48-bits>>, :mac, :ethernet), do: Openflow.Utils.to_hex_string(value)
def formatting(value, :mac, :ethernet), do: <<String.to_integer(value, 16)::48>>
# Formatting = IPv4
def formatting(<<a1, a2, a3, a4>>, :be32, :ipv4), do: {a1, a2, a3, a4}
def formatting({a1, a2, a3, a4}, :be32, :ipv4), do: <<a1, a2, a3, a4>>
# Formatting = IPv6
def formatting(
<<a1::16, a2::16, a3::16, a4::16, a5::16, a6::16, a7::16, a8::16>>,
:be128,
:ipv6
) do
{a1, a2, a3, a4, a5, a6, a7, a8}
end
def formatting({a1, a2, a3, a4, a5, a6, a7, a8}, :be128, :ipv6) do
<<a1::16, a2::16, a3::16, a4::16, a5::16, a6::16, a7::16, a8::16>>
end
# Formatting = OpenFlow 1.0 port
def formatting(<<value::16>>, :be16, :openflow10_port) do
try do
Openflow.Enums.to_atom(value, :openflow10_port_no)
catch
:bad_enum -> value
end
end
def formatting(value, :be16, :openflow10_port) do
port_no =
try do
Openflow.Enums.to_int(value, :openflow10_port_no)
catch
:bad_enum -> value
end
<<port_no::16>>
end
# Formatting = OpenFlow 1.3 port
def formatting(<<value::32>>, :be32, :openflow13_port) do
try do
Openflow.Enums.to_atom(value, :openflow13_port_no)
catch
:bad_enum -> value
end
end
def formatting(value, :be32, :openflow13_port) do
port_no =
try do
Openflow.Enums.to_int(value, :openflow13_port_no)
catch
:bad_enum -> value
end
<<port_no::32>>
end
# TCP flags
def formatting(<<value::16>>, :be16, :tcp_flags) do
Openflow.Enums.int_to_flags(value, :tcp_flags)
end
def formatting(value, :be16, :tcp_flags) do
<<Openflow.Enums.flags_to_int(value, :tcp_flags)::16>>
end
# CT State
def formatting(<<value::32>>, :be32, :ct_state) do
Openflow.Enums.int_to_flags(value, :ct_state_flags)
end
def formatting(value, :be32, :ct_state) do
<<Openflow.Enums.flags_to_int(value, :ct_state_flags)::32>>
end
# CT State
def formatting(<<value::16>>, :be16, :ipv6exthdr_flags) do
Openflow.Enums.int_to_flags(value, :ipv6exthdr_flags)
end
def formatting(value, :be16, :ipv6exthdr_flags) do
<<Openflow.Enums.flags_to_int(value, :ipv6exthdr_flags)::16>>
end
# Other
def formatting(value, _, _) do
value
end
end