diff --git a/lib/openflow/bundle/add.ex b/lib/openflow/bundle/add.ex deleted file mode 100644 index 3b9d7e5..0000000 --- a/lib/openflow/bundle/add.ex +++ /dev/null @@ -1,22 +0,0 @@ -defmodule Openflow.Bundle.Add 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 - - # experimenter - def ofp_type, do: 4 -end diff --git a/lib/openflow/onf_bundle_add.ex b/lib/openflow/onf_bundle_add.ex new file mode 100644 index 0000000..7b87c55 --- /dev/null +++ b/lib/openflow/onf_bundle_add.ex @@ -0,0 +1,50 @@ +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 diff --git a/lib/openflow/onf_bundle_control.ex b/lib/openflow/onf_bundle_control.ex new file mode 100644 index 0000000..8f32987 --- /dev/null +++ b/lib/openflow/onf_bundle_control.ex @@ -0,0 +1,44 @@ +defmodule Openflow.OnfBundleControl do + defstruct( + version: 4, + xid: 0, + datapath_id: "", + aux_id: 0, + # bundle header + bundle_id: 0, + type: :open_request, + flags: [] + ) + + alias __MODULE__ + + # ONF Experimenter + @experimenter 0x4F4E4600 + # BUNDLE_CONTROL + @onf_type 2300 + + # experimenter + def ofp_type, do: 4 + + def new(options \\ []) do + %OnfBundleControl{ + xid: options[:xid] || 0, + bundle_id: options[:bundle_id] || 0, + type: options[:type] || :open_request, + flags: options[:flags] || [] + } + end + + def to_binary(%OnfBundleControl{} = ctrl) do + bundle_id = ctrl.bundle_id + type_int = Openflow.Utils.get_enum(ctrl.type, :bundle_ctrl_type) + flags_int = Openflow.Enums.flags_to_int(ctrl.flags, :bundle_flags) + <<@experimenter::32, @onf_type::32, bundle_id::32, type_int::16, flags_int::16>> + end + + def read(<<@experimenter::32, @onf_type::32, bundle_id::32, type_int::16, flags_int::16>>) do + type = Openflow.Utils.get_enum(type_int, :bundle_ctrl_type) + flags = Openflow.Enums.int_to_flags(flags_int, :bundle_flags) + %OnfBundleControl{bundle_id: bundle_id, type: type, flags: flags} + end +end diff --git a/test/packet_data/onf_bundle_control.raw b/test/packet_data/onf_bundle_control.raw new file mode 100644 index 0000000..1d97178 Binary files /dev/null and b/test/packet_data/onf_bundle_control.raw differ