From 4bd8ba994fd57fa2c1381277308dae1c0a29a22d Mon Sep 17 00:00:00 2001 From: Eishun Kondoh Date: Wed, 29 Aug 2018 07:16:41 +0900 Subject: [PATCH] Revert "Add support NXT_RESUME (#7)" (#8) This reverts commit 95d2f2e87c23aded8b2362957859897ca6493d63. --- bin/enum_gen | Bin 1466453 -> 1460249 bytes config/config.exs | 2 +- lib/openflow.ex | 23 +- lib/openflow/hello.ex | 4 +- lib/openflow/nx_packet_in2.ex | 220 +--------------- lib/openflow/nx_resume.ex | 436 -------------------------------- lib/ovsdb/open_vswitch.ex | 54 ++-- lib/tres/controller.ex | 1 - lib/tres/message_handler_sup.ex | 1 - lib/tres/message_helper.ex | 7 +- lib/tres/secure_channel.ex | 31 ++- lib/tres/switch_registry.ex | 1 - lib/tres/utils.ex | 8 +- test/ofp_action_test.exs | 14 +- test/ofp_packet_in2_test.exs | 4 +- 15 files changed, 71 insertions(+), 735 deletions(-) delete mode 100644 lib/openflow/nx_resume.ex diff --git a/bin/enum_gen b/bin/enum_gen index 9d4df7913b95a2767c168bb59fcf4a7ece36506a..bf594917a60fbde2273419b8eb90aaceaa19a407 100755 GIT binary patch delta 48413 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 delta 54212 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 do - try do - body_len = len - @ofp_header_size - <> = binary2 + try do + body_len = len - @ofp_header_size + <> = binary2 - result = - type + result = type |> Openflow.Enums.to_atom(:openflow_codec) |> do_read(body_bin) - case result do - {:ok, struct} -> {:ok, %{struct | version: ver, xid: xid}, rest} - {:error, reason} -> {:error, reason} + case result do + {:ok, struct} -> {:ok, %{struct | version: ver, xid: xid}, rest} + {:error, reason} -> {:error, reason} + end + catch + _c, _e -> + {:error, :malformed_packet} end - catch - _c, reason -> - {:error, {:malformed_packet, {reason, __STACKTRACE__}}} - end end def to_binary(messages) when is_list(messages) do diff --git a/lib/openflow/hello.ex b/lib/openflow/hello.ex index 415ccc9..aa3da17 100644 --- a/lib/openflow/hello.ex +++ b/lib/openflow/hello.ex @@ -24,8 +24,8 @@ defmodule Openflow.Hello do def supported_version?(%Hello{elements: elements}) do elements - |> Enum.reduce([], fn {:versionbitmap, versions}, acc -> acc ++ versions end) - |> Enum.any?(fn version -> version == 4 end) + |> Enum.reduce([], fn({:versionbitmap, versions}, acc) -> acc ++ versions end) + |> Enum.any?(fn(version) -> version == 4 end) end def read(binary), do: %Hello{elements: decode([], binary)} diff --git a/lib/openflow/nx_packet_in2.ex b/lib/openflow/nx_packet_in2.ex index 02e2572..77955be 100644 --- a/lib/openflow/nx_packet_in2.ex +++ b/lib/openflow/nx_packet_in2.ex @@ -14,40 +14,17 @@ defmodule Openflow.NxPacketIn2 do metadata: nil, userdata: nil, # continuation properties: - continuation_bridge: nil, - continuation_stack: nil, - continuation_conntracked: nil, - continuation_mirrors: nil, + continuation_bridge: "", + continuation_stack: [], + continuation_conntracked: false, continuation_table_id: nil, continuation_cookie: nil, - continuation_actions: nil, + continuation_actions: [], continuation_action_set: nil ) alias __MODULE__ - @encode_keys ~w( - packet - full_len - buffer_id - table_id - cookie - reason - metadata - userdata - )a - - @continuation_keys ~w( - continuation_bridge - continuation_stack - continuation_conntracked - continuation_table_id - continuation_cookie - continuation_actions - continuation_mirrors - continuation_action_set - )a - @experimenter 0x00002320 @nx_type 30 @@ -74,12 +51,6 @@ defmodule Openflow.NxPacketIn2 do def ofp_type, do: 4 - def to_binary(%NxPacketIn2{} = pin) do - props_bin = encode_props("", pin, @encode_keys) - continuations_bin = encode_continuations("", pin, @continuation_keys) - <<@experimenter::32, @nx_type::32, props_bin::bytes, continuations_bin::bytes>> - end - def read(<<@experimenter::32, @nx_type::32, props_bin::bytes>>) do %NxPacketIn2{} |> decode_props(props_bin) @@ -87,189 +58,6 @@ defmodule Openflow.NxPacketIn2 do ## private functions - defp encode_props(acc, _pin, []), do: acc - - defp encode_props(acc, %NxPacketIn2{packet: packet} = pin, [:packet | rest]) - when not is_nil(packet) and is_binary(packet) do - length = @prop_header_length + byte_size(packet) - pad_length = Openflow.Utils.pad_length(length, 8) - binary = <<@packet::16, length::16, packet::bytes, 0::size(pad_length)-unit(8)>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, %NxPacketIn2{full_len: full_len} = pin, [:full_len | rest]) - when not is_nil(full_len) and is_integer(full_len) do - length = @prop_header_length + 4 - binary = <<@full_len::16, length::16, full_len::32>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, %NxPacketIn2{buffer_id: buffer_id} = pin, [:buffer_id | rest]) - when not is_nil(buffer_id) and is_integer(buffer_id) do - length = @prop_header_length + 4 - binary = <<@buffer_id::16, length::16, buffer_id::32>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, %NxPacketIn2{table_id: table_id} = pin, [:table_id | rest]) - when not is_nil(table_id) and is_integer(table_id) do - length = @prop_header_length + 4 - binary = <<@table_id::16, length::16, table_id::8, 0::24>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, %NxPacketIn2{cookie: cookie} = pin, [:cookie | rest]) - when not is_nil(cookie) and is_integer(cookie) do - length = @prop_header_length + 4 - binary = <<@cookie::16, length::16, 0::32, cookie::64>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, %NxPacketIn2{metadata: metadata} = pin, [:metadata | rest]) - when not is_nil(metadata) and is_list(metadata) do - pad_match_bin = - metadata - |> Openflow.Match.new() - |> Openflow.Match.to_binary() - - <<1::16, match_len_with_header::16, padded_match_bin::bytes>> = pad_match_bin - match_len = match_len_with_header - 4 - <> = padded_match_bin - length = @prop_header_length + match_len - pad_length = Openflow.Utils.pad_length(length, 8) - binary = <<@metadata::16, length::16, match_bin::bytes, 0::size(pad_length)-unit(8)>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, %NxPacketIn2{userdata: userdata} = pin, [:userdata | rest]) - when not is_nil(userdata) and is_binary(userdata) do - length = @prop_header_length + byte_size(userdata) - pad_length = Openflow.Utils.pad_length(length, 8) - binary = <<@userdata::16, length::16, userdata::bytes, 0::size(pad_length)-unit(8)>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, pin, [_ | rest]) do - encode_props(acc, pin, rest) - end - - defp encode_continuations(acc, _pin, []) do - if byte_size(acc) > 0 do - length = @prop_header_length + byte_size(acc) - pad_length = Openflow.Utils.pad_length(length, 8) - <<@continuation::16, acc::bytes, 0::size(pad_length)-unit(8)>> - else - <<>> - end - end - - defp encode_continuations( - acc, - %NxPacketIn2{continuation_bridge: br} = pin, - [:continuation_bridge | rest] - ) - when not is_nil(br) do - length = @prop_header_length + byte_size(br) - pad_length = Openflow.Utils.pad_length(length, 8) - bridge_bin = <> - binary = <<@nxcpt_bridge::16, length::16, bridge_bin::bytes, acc::bytes>> - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxPacketIn2{continuation_stack: stack} = pin, - [:continuation_stack | rest] - ) - when not is_nil(stack) do - length = @prop_header_length + byte_size(stack) - pad_length = Openflow.Utils.pad_length(length, 8) - stack_bin = <> - binary = <<@nxcpt_stack::16, length::16, stack_bin::bytes, acc::bytes>> - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxPacketIn2{continuation_mirrors: mirrors} = pin, - [:continuation_mirrors | rest] - ) - when not is_nil(mirrors) do - length = @prop_header_length + byte_size(mirrors) - pad_length = Openflow.Utils.pad_length(length, 8) - mirrors_bin = <> - binary = <<@nxcpt_mirrors::16, length::16, mirrors_bin::bytes, acc::bytes>> - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxPacketIn2{continuation_conntracked: true} = pin, - [:continuation_conntracked | rest] - ) do - length = @prop_header_length + 1 - pad_length = Openflow.Utils.pad_length(length, 8) - conntracked_bin = <<1::size(1)-unit(8), 0::size(pad_length)-unit(8), acc::bytes>> - binary = <<@nxcpt_conntracked::16, length::16, conntracked_bin::bytes, acc::bytes>> - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxPacketIn2{continuation_table_id: table_id} = pin, - [:continuation_table_id | rest] - ) - when not is_nil(table_id) do - length = @prop_header_length + 1 - pad_length = Openflow.Utils.pad_length(length, 8) - table_id_bin = <> - binary = <<@nxcpt_table_id::16, length::16, table_id_bin::bytes, acc::bytes>> - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxPacketIn2{continuation_cookie: cookie} = pin, - [:continuation_cookie | rest] - ) - when not is_nil(cookie) do - length = @prop_header_length + 8 - pad_length = Openflow.Utils.pad_length(length, 8) - cookie_bin = <> - binary = <<@nxcpt_cookie::16, length::16, cookie_bin::bytes, acc::bytes>> - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxPacketIn2{continuation_actions: actions} = pin, - [:continuation_actions | rest] - ) do - actions_bin = Openflow.Action.to_binary(actions) - length = @prop_header_length + byte_size(actions_bin) - pad_length = Openflow.Utils.pad_length(length, 8) - actions_bin = <> - binary = <<@nxcpt_actions::16, length::16, actions_bin::bytes, acc::bytes>> - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxPacketIn2{continuation_action_set: action_set} = pin, - [:continuation_action_set | rest] - ) - when not is_nil(action_set) do - length = @prop_header_length + byte_size(action_set) - pad_length = Openflow.Utils.pad_length(length, 8) - action_set_bin = <> - binary = <<@nxcpt_action_set::16, length::16, action_set_bin::bytes, acc::bytes>> - encode_continuations(binary, pin, rest) - end - - defp encode_continuations(acc, pin, [_ | rest]) do - encode_continuations(acc, pin, rest) - end - defp decode_props(pktin, ""), do: pktin defp decode_props(pktin, <<@packet::16, length::16, tail::bytes>>) do diff --git a/lib/openflow/nx_resume.ex b/lib/openflow/nx_resume.ex deleted file mode 100644 index d6a805b..0000000 --- a/lib/openflow/nx_resume.ex +++ /dev/null @@ -1,436 +0,0 @@ -defmodule Openflow.NxResume do - defstruct( - version: 4, - xid: 0, - datapath_id: "", - aux_id: 0, - # packet_in properties: - packet: nil, - full_len: nil, - buffer_id: nil, - table_id: nil, - cookie: nil, - reason: nil, - metadata: nil, - userdata: nil, - # continuation properties: - continuation_bridge: nil, - continuation_stack: nil, - continuation_conntracked: nil, - continuation_mirrors: nil, - continuation_table_id: nil, - continuation_cookie: nil, - continuation_actions: nil, - continuation_action_set: nil - ) - - alias __MODULE__ - - @encode_keys ~w( - packet - full_len - buffer_id - table_id - cookie - reason - metadata - userdata - )a - - @continuation_keys ~w( - continuation_bridge - continuation_stack - continuation_conntracked - continuation_table_id - continuation_cookie - continuation_actions - continuation_mirrors - continuation_action_set - )a - - @experimenter 0x00002320 - @nx_type 28 - - @packet 0 - @full_len 1 - @buffer_id 2 - @table_id 3 - @cookie 4 - @reason 5 - @metadata 6 - @userdata 7 - @continuation 8 - - @nxcpt_bridge 0x8000 - @nxcpt_stack 0x8001 - @nxcpt_mirrors 0x8002 - @nxcpt_conntracked 0x8003 - @nxcpt_table_id 0x8004 - @nxcpt_cookie 0x8005 - @nxcpt_actions 0x8006 - @nxcpt_action_set 0x8007 - - @prop_header_length 4 - - def ofp_type, do: 4 - - def new(options \\ []) do - packet_in = options[:packet_in] - packet = options[:packet] || packet_in.packet - - %NxResume{ - packet: options[:packet] || packet_in.packet, - full_len: byte_size(packet), - buffer_id: packet_in.buffer_id || :no_buffer, - table_id: packet_in.table_id, - cookie: packet_in.cookie, - reason: packet_in.reason, - metadata: packet_in.metadata, - userdata: packet_in.userdata, - continuation_bridge: packet_in.continuation_bridge, - continuation_stack: packet_in.continuation_stack, - continuation_conntracked: packet_in.continuation_conntracked, - continuation_table_id: packet_in.continuation_table_id, - continuation_cookie: packet_in.continuation_cookie, - continuation_actions: packet_in.continuation_actions, - continuation_action_set: packet_in.continuation_action_set, - continuation_mirrors: packet_in.continuation_mirrors - } - end - - def to_binary(%NxResume{} = pin) do - props_bin = encode_props("", pin, @encode_keys) - continuations_bin = encode_continuations("", pin, @continuation_keys) - bin0 = <<@experimenter::32, @nx_type::32, props_bin::bytes, continuations_bin::bytes>> - pad_length = Openflow.Utils.pad_length(byte_size(bin0) + 8, 8) - <> - end - - def read(<<@experimenter::32, @nx_type::32, props_bin::bytes>>) do - %NxResume{} - |> decode_props(props_bin) - end - - ## private functions - - defp encode_props(acc, _pin, []), do: acc - - defp encode_props(acc, %NxResume{packet: packet} = pin, [:packet | rest]) - when not is_nil(packet) and is_binary(packet) do - length = @prop_header_length + byte_size(packet) - pad_length = Openflow.Utils.pad_length(length, 8) - binary = <<@packet::16, length::16, packet::bytes, 0::size(pad_length)-unit(8)>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, %NxResume{full_len: full_len} = pin, [:full_len | rest]) - when not is_nil(full_len) and is_integer(full_len) do - length = @prop_header_length + 4 - binary = <<@full_len::16, length::16, full_len::32>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, %NxResume{buffer_id: buffer_id} = pin, [:buffer_id | rest]) - when not is_nil(buffer_id) do - length = @prop_header_length + 4 - buffer_id_int = Openflow.Utils.get_enum(buffer_id, :buffer_id) - binary = <<@buffer_id::16, length::16, buffer_id_int::32>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, %NxResume{table_id: table_id} = pin, [:table_id | rest]) - when not is_nil(table_id) and is_integer(table_id) do - length = @prop_header_length + 4 - binary = <<@table_id::16, length::16, table_id::8, 0::24>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, %NxResume{cookie: cookie} = pin, [:cookie | rest]) - when not is_nil(cookie) and is_integer(cookie) do - length = @prop_header_length + 4 - binary = <<@cookie::16, length::16, 0::32, cookie::64>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, %NxResume{metadata: metadata} = pin, [:metadata | rest]) - when not is_nil(metadata) and is_list(metadata) do - pad_match_bin = - metadata - |> Openflow.Match.new() - |> Openflow.Match.to_binary() - - <<1::16, match_len_with_header::16, padded_match_bin::bytes>> = pad_match_bin - match_len = match_len_with_header - 4 - <> = padded_match_bin - length = @prop_header_length + match_len - pad_length = Openflow.Utils.pad_length(length, 8) - binary = <<@metadata::16, length::16, match_bin::bytes, 0::size(pad_length)-unit(8)>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, %NxResume{userdata: userdata} = pin, [:userdata | rest]) - when not is_nil(userdata) and is_binary(userdata) do - length = @prop_header_length + byte_size(userdata) - pad_length = Openflow.Utils.pad_length(length, 8) - binary = <<@userdata::16, length::16, userdata::bytes, 0::size(pad_length)-unit(8)>> - encode_props(<>, pin, rest) - end - - defp encode_props(acc, pin, [_ | rest]) do - encode_props(acc, pin, rest) - end - - defp encode_continuations(acc, _pin, []) do - if byte_size(acc) > 0 do - length = @prop_header_length + byte_size(acc) - pad_length = Openflow.Utils.pad_length(length, 8) - binary = <<@continuation::16, length::16, acc::bytes, 0::size(pad_length)-unit(8)>> - binary - else - <<>> - end - end - - defp encode_continuations( - acc, - %NxResume{continuation_bridge: br} = pin, - [:continuation_bridge | rest] - ) - when not is_nil(br) do - length = @prop_header_length + byte_size(br) - bridge_bin = <> - binary = <<@nxcpt_bridge::16, length::16, bridge_bin::bytes, 0::size(4)-unit(8), acc::bytes>> - - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxResume{continuation_stack: stack} = pin, - [:continuation_stack | rest] - ) - when not is_nil(stack) do - length = @prop_header_length + byte_size(stack) - pad_length = Openflow.Utils.pad_length(length, 8) - stack_bin = <> - binary = <<@nxcpt_stack::16, length::16, stack_bin::bytes, acc::bytes>> - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxResume{continuation_mirrors: mirrors} = pin, - [:continuation_mirrors | rest] - ) - when not is_nil(mirrors) do - length = @prop_header_length + byte_size(mirrors) - pad_length = Openflow.Utils.pad_length(length, 8) - mirrors_bin = <> - binary = <<@nxcpt_mirrors::16, length::16, mirrors_bin::bytes, acc::bytes>> - - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxResume{continuation_conntracked: true} = pin, - [:continuation_conntracked | rest] - ) do - length = @prop_header_length + 1 - pad_length = Openflow.Utils.pad_length(length, 8) - conntracked_bin = <<1::size(1)-unit(8), 0::size(pad_length)-unit(8), acc::bytes>> - binary = <<@nxcpt_conntracked::16, length::16, conntracked_bin::bytes, acc::bytes>> - - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxResume{continuation_table_id: table_id} = pin, - [:continuation_table_id | rest] - ) - when not is_nil(table_id) do - length = @prop_header_length + 1 - pad_length = Openflow.Utils.pad_length(length, 8) - table_id_bin = <> - binary = <<@nxcpt_table_id::16, length::16, table_id_bin::bytes, acc::bytes>> - - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxResume{continuation_cookie: cookie} = pin, - [:continuation_cookie | rest] - ) - when not is_nil(cookie) do - length = @prop_header_length + 8 - pad_length = Openflow.Utils.pad_length(length, 8) - cookie_bin = <> - binary = <<@nxcpt_cookie::16, length::16, cookie_bin::bytes, acc::bytes>> - - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxResume{continuation_actions: actions} = pin, - [:continuation_actions | rest] - ) - when not is_nil(actions) do - actions_bin = Openflow.Action.to_binary(actions) - length = @prop_header_length + byte_size(actions_bin) - pad_length = Openflow.Utils.pad_length(length, 8) - actions_bin = <> - binary = <<@nxcpt_actions::16, length::16, actions_bin::bytes, acc::bytes>> - encode_continuations(binary, pin, rest) - end - - defp encode_continuations( - acc, - %NxResume{continuation_action_set: action_set} = pin, - [:continuation_action_set | rest] - ) - when not is_nil(action_set) do - length = @prop_header_length + byte_size(action_set) - pad_length = Openflow.Utils.pad_length(length, 8) - action_set_bin = <> - binary = <<@nxcpt_action_set::16, length::16, action_set_bin::bytes, acc::bytes>> - encode_continuations(binary, pin, rest) - end - - defp encode_continuations(acc, pin, [other | rest]) do - encode_continuations(acc, pin, rest) - end - - defp decode_props(pktin, ""), do: pktin - - defp decode_props(pktin, <<@packet::16, length::16, tail::bytes>>) do - pad_length = Openflow.Utils.pad_length(length, 8) - packet_length = length - @prop_header_length - <> = tail - decode_props(%{pktin | packet: packet}, rest) - end - - defp decode_props(pktin, <<@full_len::16, _length::16, full_len::32, rest::bytes>>) do - decode_props(%{pktin | full_len: full_len}, rest) - end - - defp decode_props(pktin, <<@buffer_id::16, _length::16, buffer_id::32, rest::bytes>>) do - decode_props(%{pktin | buffer_id: buffer_id}, rest) - end - - defp decode_props(pktin, <<@table_id::16, _length::16, table_id::8, _::24, rest::bytes>>) do - decode_props(%{pktin | table_id: table_id}, rest) - end - - defp decode_props(pktin, <<@cookie::16, _length::16, _::32, cookie::64, rest::bytes>>) do - decode_props(%{pktin | cookie: cookie}, rest) - end - - defp decode_props(pktin, <<@reason::16, _length::16, reason_int::8, _::24, rest::bytes>>) do - reason = Openflow.Enums.to_atom(reason_int, :packet_in_reason) - decode_props(%{pktin | reason: reason}, rest) - end - - defp decode_props(pktin, <<@metadata::16, length::16, tail::bytes>>) do - pad_length = Openflow.Utils.pad_length(length, 8) - match_field_length = length - @prop_header_length - - <> = - tail - - match_len = 4 + byte_size(match_fields_bin) - padding = Openflow.Utils.pad_length(match_len, 8) - match_bin = <<1::16, match_len::16, match_fields_bin::bytes, 0::size(padding)-unit(8)>> - {fields, _rest} = Openflow.Match.read(match_bin) - decode_props(%{pktin | metadata: fields}, rest) - end - - defp decode_props(pktin, <<@userdata::16, length::16, tail::bytes>>) do - pad_length = Openflow.Utils.pad_length(length, 8) - userdata_length = length - @prop_header_length - <> = tail - decode_props(%{pktin | userdata: userdata}, rest) - end - - defp decode_props(pktin, <<@continuation::16, length::16, tail::bytes>>) do - pad_length = Openflow.Utils.pad_length(length, 8) - data_length = length - @prop_header_length - 4 - <<_pad::32, data::size(data_length)-bytes, _::size(pad_length)-unit(8), rest::bytes>> = tail - - pktin - |> decode_continuations(data) - |> decode_props(rest) - end - - defp decode_props(pktin, <<_::16, length::16, tail::bytes>>) do - pad_length = Openflow.Utils.pad_length(length, 8) - data_length = length - @prop_header_length - <<_data::size(data_length)-bytes, _::size(pad_length)-unit(8), rest::bytes>> = tail - decode_props(pktin, rest) - end - - defp decode_continuations(pktin, ""), do: pktin - - defp decode_continuations(pktin, <<@nxcpt_bridge::16, length::16, tail::bytes>>) do - pad_length = Openflow.Utils.pad_length(length, 8) - data_length = length - @prop_header_length - <> = tail - decode_continuations(%{pktin | continuation_bridge: bridge}, rest) - end - - defp decode_continuations(pktin, <<@nxcpt_stack::16, length::16, tail::bytes>>) do - pad_length = Openflow.Utils.pad_length(length, 8) - data_length = (length - @prop_header_length) * 8 - <> = tail - decode_continuations(%{pktin | continuation_stack: pktin.continuation_stack ++ [stack]}, rest) - end - - defp decode_continuations(pktin, <<@nxcpt_mirrors::16, length::16, tail::bytes>>) do - pad_length = Openflow.Utils.pad_length(length, 8) - data_length = length - @prop_header_length - <> = tail - decode_continuations(%{pktin | continuation_mirrors: mirrors}, rest) - end - - defp decode_continuations(pktin, <<@nxcpt_conntracked::16, length::16, tail::bytes>>) do - pad_length = Openflow.Utils.pad_length(length, 8) - data_length = length - @prop_header_length - <<_::size(data_length)-bytes, _::size(pad_length)-unit(8), rest::bytes>> = tail - decode_continuations(%{pktin | continuation_conntracked: true}, rest) - end - - defp decode_continuations(pktin, <<@nxcpt_table_id::16, length::16, tail::bytes>>) do - pad_length = Openflow.Utils.pad_length(length, 8) - <> = tail - decode_continuations(%{pktin | continuation_table_id: table_id}, rest) - end - - defp decode_continuations(pktin, <<@nxcpt_cookie::16, length::16, tail::bytes>>) do - pad_length = Openflow.Utils.pad_length(length, 8) - <> = tail - decode_continuations(%{pktin | continuation_cookie: cookie}, rest) - end - - defp decode_continuations(pktin, <<@nxcpt_actions::16, length::16, tail::bytes>>) do - pad_length = Openflow.Utils.pad_length(length, 8) - data_length = length - @prop_header_length - 4 - - <<_pad::32, actions::size(data_length)-bytes, _::size(pad_length)-unit(8), rest::bytes>> = - tail - - decode_continuations(%{pktin | continuation_actions: Openflow.Action.read(actions)}, rest) - end - - defp decode_continuations(pktin, <<@nxcpt_action_set::16, length::16, tail::bytes>>) do - pad_length = Openflow.Utils.pad_length(length, 8) - data_length = length - @prop_header_length - <> = tail - decode_continuations(%{pktin | continuation_action_set: action_set}, rest) - end - - defp decode_continuations(pktin, _) do - decode_continuations(pktin, "") - end -end diff --git a/lib/ovsdb/open_vswitch.ex b/lib/ovsdb/open_vswitch.ex index 530c670..3c7dbdf 100644 --- a/lib/ovsdb/open_vswitch.ex +++ b/lib/ovsdb/open_vswitch.ex @@ -34,12 +34,12 @@ defmodule OVSDB.OpenvSwitch do disable_in_band: "true" ) """ - def add_br(pid, [_ | _] = options) do + def add_br(pid, [_|_] = options) do br_uuids = GenServer.call(pid, {:sync_get, @open_vswitch, "bridges"}) add_br_options = [ bridge: options[:name], - fail_mode: options[:fail_mode] || "standalone", + fail_mode: options[:fail_mode] || "standalone", datapath_id: options[:datapath_id], disable_in_band: options[:disable_in_band], br_uuids: br_uuids @@ -83,11 +83,10 @@ defmodule OVSDB.OpenvSwitch do protocol: "OpenFlow13" ) """ - def set_controller(pid, [_ | _] = options) do + def set_controller(pid, [_|_] = options) do case find_by_name(pid, @bridge, options[:bridge]) do :not_found -> {:error, :not_found} - %{"_uuid" => _uuid} -> set_ctl_opts = [ bridge: options[:bridge], @@ -95,7 +94,7 @@ defmodule OVSDB.OpenvSwitch do connection_mode: options[:connection_mode] || "out-of-band", controller_rate_limit: options[:controller_rate_limit] || 1000, controller_burst_limit: options[:controller_burst_limit] || 100, - protocol: options[:protocol] || "OpenFlow13" + protocol: options[:protocol] || "OpenFlow13", ] GenServer.call(pid, {:set_controller, set_ctl_opts}) @@ -112,11 +111,10 @@ defmodule OVSDB.OpenvSwitch do ofport_request: 99 ) """ - def add_port(pid, [_ | _] = options) do + def add_port(pid, [_|_] = options) do case find_by_name(pid, @bridge, options[:bridge]) do :not_found -> {:error, :not_found} - %{"_uuid" => _uuid, "ports" => ports} -> port_opts = [ bridge: options[:bridge], @@ -148,16 +146,14 @@ defmodule OVSDB.OpenvSwitch do @doc """ iex> OpenvSwitch.del_port(client_pid, bridge: "br0", port: "vxlan5") """ - def del_port(pid, [_ | _] = options) do + def del_port(pid, [_|_] = options) do case find_by_name(pid, @bridge, options[:bridge]) do :not_found -> {:error, :not_found} - %{"_uuid" => _uuid, "ports" => ports} -> case find_by_name(pid, @port, options[:port]) do :not_found -> {:error, :not_found} - %{"_uuid" => port_uuid} -> new_ports = del_elem_from_set(ports, port_uuid) @@ -261,41 +257,34 @@ defmodule OVSDB.OpenvSwitch do bridge = %{ports: options[:ports]} replies = - xact( - [ - :eovsdb_op.update(@bridge, eq_br_name, bridge), - :eovsdb_op.mutate(@open_vswitch, eq_ovs_uuid, next_config) - ], - pid - ) + xact([ + :eovsdb_op.update(@bridge, eq_br_name, bridge), + :eovsdb_op.mutate(@open_vswitch, eq_ovs_uuid, next_config) + ], pid) {:reply, replies, state} end def handle_call({:set_controller, options}, _from, state) do %State{client_pid: pid, ovs_uuid: ovs} = state - controller = %{ target: options[:target], connection_mode: options[:connection_mode], controller_rate_limit: options[:controller_rate_limit], - controller_burst_limit: options[:controller_burst_limit] + controller_burst_limit: options[:controller_burst_limit], } bridge = %{ protocols: options[:protocol], - controller: ["named-uuid", "controller"] + controller: ["named-uuid", "controller"], } replies = - xact( - [ - :eovsdb_op.insert(@controller, controller, "controller"), - :eovsdb_op.update(@bridge, [{"name", "==", options[:bridge]}], bridge), - :eovsdb_op.mutate(@open_vswitch, [{"_uuid", "==", ovs}], [{"next_cfg", "+=", 1}]) - ], - pid - ) + xact([ + :eovsdb_op.insert(@controller, controller, "controller"), + :eovsdb_op.update(@bridge, [{"name", "==", options[:bridge]}], bridge), + :eovsdb_op.mutate(@open_vswitch, [{"_uuid", "==", ovs}], [{"next_cfg", "+=", 1}]) + ], pid) {:reply, replies, state} end @@ -305,7 +294,7 @@ defmodule OVSDB.OpenvSwitch do port = %{ name: options[:name], - interfaces: ["named-uuid", "interface"] + interfaces: ["named-uuid", "interface"], } iface_options = [ @@ -388,7 +377,6 @@ defmodule OVSDB.OpenvSwitch do defp do_find_by_name(pid, table, name) do query = :eovsdb_op.select('*', table, [{"name", "==", name}]) - case xact(query, pid) do [%{"rows" => []}] -> :not_found [%{"rows" => [row]}] -> row @@ -398,11 +386,11 @@ defmodule OVSDB.OpenvSwitch do defp make_ovsdb_map(map), do: make_ovsdb_map([], map) defp make_ovsdb_map(acc, []), do: ["map", Enum.reverse(acc)] - defp make_ovsdb_map(acc, [[_key, nil] | rest]), do: make_ovsdb_map(acc, rest) - defp make_ovsdb_map(acc, [attr | rest]), do: make_ovsdb_map([attr | acc], rest) + defp make_ovsdb_map(acc, [[_key, nil]|rest]), do: make_ovsdb_map(acc, rest) + defp make_ovsdb_map(acc, [attr|rest]), do: make_ovsdb_map([attr|acc], rest) defp make_ovsdb_set(nil), do: ["set", []] - defp make_ovsdb_set([_ | _] = list), do: ["set", list] + defp make_ovsdb_set([_|_] = list), do: ["set", list] defp make_ovsdb_set(value), do: value defp add_elem_to_set(["set", []], value), do: value diff --git a/lib/tres/controller.ex b/lib/tres/controller.ex index 19abd7f..62cd4ed 100644 --- a/lib/tres/controller.ex +++ b/lib/tres/controller.ex @@ -14,7 +14,6 @@ defmodule Tres.Controller do def handler_spec(dpid) do {cb_mod, cb_args} = Tres.Utils.get_callback_module() - %{ id: {__MODULE__, dpid}, start: {cb_mod, :start_link, [[dpid, cb_args]]}, diff --git a/lib/tres/message_handler_sup.ex b/lib/tres/message_handler_sup.ex index 24bb2f2..562b476 100644 --- a/lib/tres/message_handler_sup.ex +++ b/lib/tres/message_handler_sup.ex @@ -7,7 +7,6 @@ defmodule Tres.MessageHandlerSup do def init(_init_args) do children = [] - Supervisor.init( children, strategy: :one_for_one, diff --git a/lib/tres/message_helper.ex b/lib/tres/message_helper.ex index f9f8786..70d911b 100644 --- a/lib/tres/message_helper.ex +++ b/lib/tres/message_helper.ex @@ -147,16 +147,11 @@ defmodule Tres.MessageHelper do Openflow.MeterMod.new( xid: options[:xid] || 0, command: :delete, - meter_id: options[:meter_id] || 0 + meter_id: options[:meter_id] || 0, ) send_message(meter_mod, datapath_id, options[:blocking] || false) end - - defp send_resume(datapath_id, options) do - resume = Openflow.NxResume.new(options) - send_message(resume, datapath_id, options[:blocking] || false) - end end end end diff --git a/lib/tres/secure_channel.ex b/lib/tres/secure_channel.ex index 69a3cd3..05e723d 100644 --- a/lib/tres/secure_channel.ex +++ b/lib/tres/secure_channel.ex @@ -50,7 +50,7 @@ defmodule Tres.SecureChannel do {:tcp, socket, packet}, state, %State{socket: socket, transport: transport} = state_data - ) do + ) do transport.setopts(socket, active: :once) handle_packet(packet, state_data, state, []) end @@ -137,7 +137,9 @@ defmodule Tres.SecureChannel do # INIT state defp handle_INIT(:enter, _old_state, state_data) do - debug("Initiate HELLO handshake: " <> "#{state_data.ip_addr}:#{state_data.port}") + debug( + "Initiate HELLO handshake: " <> "#{state_data.ip_addr}:#{state_data.port}" + ) initiate_hello_handshake(state_data) end @@ -151,14 +153,19 @@ defmodule Tres.SecureChannel do end defp handle_INIT(:internal, message, _state_data) do - debug("Hello handshake in progress, " <> "dropping message: #{inspect(message)}") + debug( + "Hello handshake in progress, " <> "dropping message: #{inspect(message)}" + ) :keep_state_and_data end # CONNECTING state defp handle_CONNECTING(:enter, :INIT, state_data) do - debug("Initiate FEATURES handshake:" <> " #{state_data.ip_addr}:#{state_data.port}") + debug( + "Initiate FEATURES handshake:" <> + " #{state_data.ip_addr}:#{state_data.port}" + ) initiate_features_handshake(state_data) end @@ -188,7 +195,8 @@ defmodule Tres.SecureChannel do defp handle_CONNECTING(:internal, {:openflow, message}, _state_data) do debug( - "Features handshake in progress," <> " dropping message: #{inspect(message.__struct__)}" + "Features handshake in progress," <> + " dropping message: #{inspect(message.__struct__)}" ) :keep_state_and_data @@ -201,7 +209,6 @@ defmodule Tres.SecureChannel do # CONNECTED state defp handle_CONNECTED(:enter, :CONNECTING, state_data) do _tref = schedule_xactdb_ageout() - case init_handler(state_data) do %State{} = new_state_data -> start_periodic_idle_check() @@ -333,12 +340,10 @@ defmodule Tres.SecureChannel do action = {:next_event, :internal, {:openflow, message}} new_state_data = %{state_data | buffer: "", last_received: :os.timestamp()} handle_packet(leftovers, new_state_data, state, [action | actions]) - {:error, :binary_too_small} -> handle_packet("", %{state_data | buffer: binary}, state, actions) - - {:error, {:malformed_packet, {_reason, st}}} -> - :ok = debug("malformed packet received from #{state_data.datapath_id} stack_trace: #{st}") + {:error, :malformed_packet} -> + :ok = debug("malformed packet received from #{state_data.datapath_id}") handle_packet("", %{state_data | buffer: ""}, state, actions) end end @@ -370,9 +375,8 @@ defmodule Tres.SecureChannel do unless is_nil(message), do: send(state_data.handler_pid, message) XACT_KV.delete(state_data.xact_kv_ref, xid) end - defp process_xact_entry({:xact_entry, xid, message, _orig, from, _inserted_at}, state_data) - when is_tuple(from) do + when is_tuple(from) do reply = if is_nil(message), do: :noreply, else: message :ok = :gen_statem.reply(from, {:ok, reply}) XACT_KV.delete(state_data.xact_kv_ref, xid) @@ -554,7 +558,8 @@ defmodule Tres.SecureChannel do defp send_message(message, %State{socket: socket, transport: transport}) do if is_list(message) do for message <- message, - do: debug("Sending: #{inspect(message.__struct__)}(xid: #{message.xid})") + do: + debug("Sending: #{inspect(message.__struct__)}(xid: #{message.xid})") else debug("Sending: #{inspect(message.__struct__)}(xid: #{message.xid})") end diff --git a/lib/tres/switch_registry.ex b/lib/tres/switch_registry.ex index 30fb857..cad2612 100644 --- a/lib/tres/switch_registry.ex +++ b/lib/tres/switch_registry.ex @@ -25,7 +25,6 @@ defmodule Tres.SwitchRegistry do def send_message(message, dpid, _blocking = true) do blocking_send_message(message, dpid) end - def send_message(message, dpid, _blocking) do send_message(message, dpid) end diff --git a/lib/tres/utils.ex b/lib/tres/utils.ex index 75af3b9..21ed74e 100644 --- a/lib/tres/utils.ex +++ b/lib/tres/utils.ex @@ -14,11 +14,11 @@ defmodule Tres.Utils do def start_openflow_listener do :ranch.start_listener( - _ref = Tres, - _trasport = :ranch_tcp, + _ref = Tres, + _trasport = :ranch_tcp, _transport_opts = transport_options(), - _protocol = @connection_manager, - _protocol_opts = [] + _protocol = @connection_manager, + _protocol_opts = [] ) end diff --git a/test/ofp_action_test.exs b/test/ofp_action_test.exs index 5580700..616cfc8 100644 --- a/test/ofp_action_test.exs +++ b/test/ofp_action_test.exs @@ -631,14 +631,14 @@ defmodule OfpActionTest do test_file = "test/packet_data/nx_clone.raw" packet = File.read!(test_file) actions = Openflow.Action.read(packet) - clone = - Openflow.Action.NxClone.new([ - Openflow.Action.PushVlan.new(), - Openflow.Action.SetField.new({:vlan_vid, 5}), - Openflow.Action.Output.new(10) - ]) - + Openflow.Action.NxClone.new( + [ + Openflow.Action.PushVlan.new(), + Openflow.Action.SetField.new({:vlan_vid, 5}), + Openflow.Action.Output.new(10) + ] + ) actions_bin = Openflow.Action.to_binary(clone) assert actions_bin == packet assert actions == [clone] diff --git a/test/ofp_packet_in2_test.exs b/test/ofp_packet_in2_test.exs index 45eff9c..e9b7ef7 100644 --- a/test/ofp_packet_in2_test.exs +++ b/test/ofp_packet_in2_test.exs @@ -14,9 +14,9 @@ defmodule OfpPacketIn2Test do assert pktin.full_len == 64 assert pktin.table_id == 7 assert pktin.buffer_id == 0x114 - assert pktin.cookie == 0xFEDCBA9876543210 + assert pktin.cookie == 0xfedcba9876543210 assert pktin.reason == :action - assert pktin.metadata == [metadata: 0x5A5A5A5A5A5A5A5A] + assert pktin.metadata == [metadata: 0x5a5a5a5a5a5a5a5a] assert pktin.userdata == <<1, 2, 3, 4, 5>> end end