tres/lib/openflow/onf_bundle_add.ex
Eishun Kondoh f3d2ab1fb7 Feature/bundle support (#15)
* openflow: Add bundle support

* openflow: Add bundle message generator and parser

* openflow: Add bundle API
2019-05-05 23:39:45 +09:00

50 lines
1.3 KiB
Elixir

defmodule Openflow.OnfBundleAdd do
defstruct(
version: 4,
xid: 0,
datapath_id: "",
aux_id: 0,
# bundle header
bundle_id: 0,
flags: [],
message: nil
)
alias __MODULE__
# ONF Experimenter
@experimenter 0x4F4E4600
# BUNDLE_ADD
@onf_type 2301
@onf_bundle_add_message_size 24
# experimenter
def ofp_type, do: 4
def new(options \\ []) do
%OnfBundleAdd{
xid: options[:xid] || 0,
bundle_id: options[:bundle_id] || 0,
flags: options[:flags] || [],
message: options[:message]
}
end
def to_binary(%OnfBundleAdd{} = bundle_add) do
bundle_id = bundle_add.bundle_id
message_bin = Openflow.to_binary(%{bundle_add.message | xid: bundle_add.xid})
length = @onf_bundle_add_message_size + byte_size(message_bin)
pad_length = Openflow.Utils.pad_length(length, 8)
flags_int = Openflow.Enums.flags_to_int(bundle_add.flags, :bundle_flags)
<<@experimenter::32, @onf_type::32, bundle_id::32, 0::2-unit(8),
flags_int::16, message_bin::bytes, 0::size(pad_length)-unit(8)>>
end
def read(<<@experimenter::32, @onf_type::32, bundle_id::32, _pad::16, flags_int::16, message_bin::bytes>>) do
message = Openflow.read(message_bin)
flags = Openflow.Enums.int_to_flags(flags_int, :bundle_flags)
%OnfBundleAdd{bundle_id: bundle_id, flags: flags, message: message}
end
end