openflow: Add bundle message generator and parser
This commit is contained in:
parent
283f487c6b
commit
b6eabba9d0
4 changed files with 94 additions and 22 deletions
|
|
@ -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
|
|
||||||
50
lib/openflow/onf_bundle_add.ex
Normal file
50
lib/openflow/onf_bundle_add.ex
Normal file
|
|
@ -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
|
||||||
44
lib/openflow/onf_bundle_control.ex
Normal file
44
lib/openflow/onf_bundle_control.ex
Normal file
|
|
@ -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
|
||||||
BIN
test/packet_data/onf_bundle_control.raw
Normal file
BIN
test/packet_data/onf_bundle_control.raw
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue