diff --git a/lib/openflow/group_mod.ex b/lib/openflow/group_mod.ex index 4cff99d..bb3c217 100644 --- a/lib/openflow/group_mod.ex +++ b/lib/openflow/group_mod.ex @@ -19,7 +19,7 @@ defmodule Openflow.GroupMod do @type t :: %GroupMod{ version: 4, datapath_id: String.t() | nil, - aux_id: 0..0xF | nil, + aux_id: 0..0xFF | nil, xid: 0..0xFFFFFFFF, command: command(), type: type(), diff --git a/lib/openflow/multipart/group/reply.ex b/lib/openflow/multipart/group/reply.ex index 5e4b86f..499973d 100644 --- a/lib/openflow/multipart/group/reply.ex +++ b/lib/openflow/multipart/group/reply.ex @@ -11,14 +11,21 @@ defmodule Openflow.Multipart.Group.Reply do alias __MODULE__ + @type t :: %Reply{ + version: 4, + xid: 0..0xFFFFFFFF, + datapath_id: String.t() | nil, + aux_id: 0..0xFF | nil, + flags: [:more], + groups: [Openflow.Multipart.GroupStats.t()] + } + + @spec ofp_type() :: 18 def ofp_type, do: 18 - def new(groups \\ []) do - %Reply{groups: groups} - end - + @spec read(binary()) :: t() def read(<>) do - groups = Openflow.Multipart.Group.read(groups_bin) + groups = Openflow.Multipart.GroupStats.read(groups_bin) %Reply{groups: groups} end @@ -36,7 +43,7 @@ defmodule Openflow.Multipart.Group.Reply do end end -defmodule Openflow.Multipart.Group do +defmodule Openflow.Multipart.GroupStats do defstruct( group_id: 0, ref_count: 0, @@ -51,6 +58,15 @@ defmodule Openflow.Multipart.Group do alias __MODULE__ + @type t :: %GroupStats{ + group_id: 0..0xFFFFFFFF, + ref_count: 0..0xFFFFFFFF, + packet_count: 0..0xFFFFFFFFFFFFFFFF, + byte_count: 0..0xFFFFFFFFFFFFFFFF, + duration_sec: 0..0xFFFFFFFF, + duration_nsec: 0..0xFFFFFFFF + } + def read(binary) do do_read([], binary) end @@ -72,11 +88,10 @@ defmodule Openflow.Multipart.Group do <> = tail bucket_stats = - for <> do - %{packet_count: packet_count, byte_count: byte_count} - end + for <>, + do: %{packet_count: packet_count, byte_count: byte_count} - %Group{ + %GroupStats{ group_id: group_id, ref_count: ref_count, packet_count: packet_count, diff --git a/lib/openflow/multipart/group/request.ex b/lib/openflow/multipart/group/request.ex index 30103d8..523467f 100644 --- a/lib/openflow/multipart/group/request.ex +++ b/lib/openflow/multipart/group/request.ex @@ -4,34 +4,43 @@ defmodule Openflow.Multipart.Group.Request do xid: 0, # virtual field datapath_id: nil, + aux_id: nil, flags: [], group_id: :all ) alias __MODULE__ + @type t :: %Request{ + version: 4, + xid: 0..0xFFFFFFFF, + datapath_id: String.t() | nil, + aux_id: 0..0xFF | nil, + flags: [], + group_id: Openflow.GroupMod.id() + } + + @spec ofp_type() :: 18 def ofp_type, do: 18 - def new(options) when is_list(options) do + @spec new(xid: 0..0xFFFFFFFF, group_id: Openflow.GroupMod.id()) :: t() + def new(options \\ []) do %Request{ xid: options[:xid] || 0, group_id: options[:group_id] || :all } end - def new(group_id) when is_integer(group_id) or is_atom(group_id) do - %Request{group_id: group_id} - end - + @spec read(<<_::32, _::_*8>>) :: t() def read(<>) do group_id = Openflow.Utils.get_enum(group_id_int, :group_id) %Request{group_id: group_id} end + @spec to_binary(t()) :: binary() def to_binary(%Request{group_id: group_id} = msg) do group_id_int = Openflow.Utils.get_enum(group_id, :group_id) - body_bin = <> header_bin = Openflow.Multipart.Request.header(msg) - <> + <> end end diff --git a/test/lib/openflow/ofp_group_stats_test.exs b/test/lib/openflow/ofp_group_stats_test.exs new file mode 100644 index 0000000..a02496f --- /dev/null +++ b/test/lib/openflow/ofp_group_stats_test.exs @@ -0,0 +1,47 @@ +defmodule OfpGroupStatsTest do + use ExUnit.Case + + describe "Openflow.Multipart.Group.Request" do + test "with default values" do + group_stats = + %Openflow.Multipart.Group.Request{} + |> Map.to_list() + |> Openflow.Multipart.Group.Request.new() + |> Openflow.to_binary() + |> Openflow.read() + |> Kernel.elem(1) + + assert group_stats.xid == 0 + assert group_stats.group_id == :all + end + end + + describe "Openflow.Multipart.Group.Reply" do + test "with test packet_data" do + group_stats = + "test/packet_data/4-58-ofp_group_stats_reply.packet" + |> File.read!() + |> Openflow.read() + |> Kernel.elem(1) + + %Openflow.Multipart.Group.Reply{ + aux_id: nil, + datapath_id: nil, + flags: [], + groups: [ + %Openflow.Multipart.GroupStats{ + bucket_stats: [%{byte_count: 2345, packet_count: 234}], + byte_count: 12345, + duration_nsec: 609_036_000, + duration_sec: 9, + group_id: 1, + packet_count: 123, + ref_count: 2 + } + ], + version: 4, + xid: 0 + } = group_stats + end + end +end