diff --git a/examples/learning_switch/lib/learning_switch/ofctl.ex b/examples/learning_switch/lib/learning_switch/ofctl.ex index 0abaef1..8c42401 100644 --- a/examples/learning_switch/lib/learning_switch/ofctl.ex +++ b/examples/learning_switch/lib/learning_switch/ofctl.ex @@ -63,14 +63,18 @@ defmodule LearningSwitch.Ofctl do end defp init_flow_tables(datapath_id) do + :ok = onf_bundle_open(datapath_id, bundle_id: 1, flags: [:atomic, :ordered]) + for flow_options <- [ add_default_broadcast_flow_entry(), add_default_flooding_flow_entry(), add_multicast_mac_drop_flow_entry(), add_ipv6_multicast_mac_drop_flow_entry(), add_default_forwarding_flow_entry()] do - send_flow_mod_add(datapath_id, flow_options) + send_flow_mod_add(datapath_id, Keyword.merge(flow_options, [bundle_id: 1, bundle_flags: [:atomic, :ordered]])) end + + :ok = onf_bundle_commit(datapath_id, bundle_id: 1, flags: [:atomic, :ordered]) end defp add_forwarding_flow_and_packet_out(packet_in, state) do diff --git a/examples/learning_switch/mix.lock b/examples/learning_switch/mix.lock index cbc80d1..d1071b3 100644 --- a/examples/learning_switch/mix.lock +++ b/examples/learning_switch/mix.lock @@ -1,7 +1,7 @@ %{ "binpp": {:git, "https://github.com/jtendo/binpp.git", "64bd68d215d1a6cd35871e7c134d7fe2e46214ea", [branch: "master"]}, "eovsdb": {:git, "https://github.com/shun159/eovsdb.git", "1ff1572708d72fd25631c681f2102407903252a3", [branch: "master"]}, - "jsone": {:git, "https://github.com/sile/jsone.git", "eecc9666c7165e1870b78a7a762549ae8d1c391b", [tag: "1.2.1"]}, - "ranch": {:hex, :ranch, "1.4.0", "10272f95da79340fa7e8774ba7930b901713d272905d0012b06ca6d994f8826b", [], [], "hexpm"}, + "jsone": {:git, "https://github.com/sile/jsone.git", "b23d312a5ed051ea7ad0989a9f2cb1a9c3f9a502", [tag: "1.4.6"]}, + "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm"}, "uuid": {:git, "https://github.com/avtobiff/erlang-uuid.git", "585c2474afb4a597ae8c8bf6d21e5a9c73f18e0b", [tag: "v0.5.0"]}, } diff --git a/lib/tres/message_helper.ex b/lib/tres/message_helper.ex index e91e088..136fe04 100644 --- a/lib/tres/message_helper.ex +++ b/lib/tres/message_helper.ex @@ -17,7 +17,14 @@ defmodule Tres.MessageHelper do instructions: options[:instructions] || [] } - send_message(flow_mod, datapath_id, Keyword.get(options, :blocking, false)) + case options[:bundle_id] do + nil -> + send_message(flow_mod, datapath_id, Keyword.get(options, :blocking, false)) + + bundle_id when is_integer(bundle_id) -> + bundle = Openflow.OnfBundleAdd.new(bundle_id: bundle_id, flags: options[:bundle_flags] || [], message: flow_mod) + send_message(bundle, datapath_id, Keyword.get(options, :blocking, false)) + end end defp send_flow_mod_modify(datapath_id, options \\ []) do @@ -36,7 +43,14 @@ defmodule Tres.MessageHelper do instructions: options[:instructions] || [] } - send_message(flow_mod, datapath_id, Keyword.get(options, :blocking, false)) + case options[:bundle_id] do + nil -> + send_message(flow_mod, datapath_id, Keyword.get(options, :blocking, false)) + + bundle_id when is_integer(bundle_id) -> + bundle = Openflow.OnfBundleAdd.new(bundle_id: bundle_id, flags: options[:bundle_flags] || [], message: flow_mod) + send_message(bundle, datapath_id, Keyword.get(options, :blocking, false)) + end end defp send_flow_mod_delete(datapath_id, options \\ []) do @@ -53,7 +67,14 @@ defmodule Tres.MessageHelper do match: options[:match] || Openflow.Match.new() } - send_message(flow_mod, datapath_id, Keyword.get(options, :blocking, false)) + case options[:bundle_id] do + nil -> + send_message(flow_mod, datapath_id, Keyword.get(options, :blocking, false)) + + bundle_id when is_integer(bundle_id) -> + bundle = Openflow.OnfBundleAdd.new(bundle_id: bundle_id, flags: options[:bundle_flags] || [], message: flow_mod) + send_message(bundle, datapath_id, Keyword.get(options, :blocking, false)) + end end defp send_packet_out(options \\ []) do @@ -101,7 +122,14 @@ defmodule Tres.MessageHelper do data: options[:data] || "" } - send_message(packet_out, datapath_id, Keyword.get(options, :blocking, false)) + case options[:bundle_id] do + nil -> + send_message(packet_out, datapath_id, Keyword.get(options, :blocking, false)) + + bundle_id when is_integer(bundle_id) -> + bundle = Openflow.OnfBundleAdd.new(bundle_id: bundle_id, flags: options[:bundle_flags], message: packet_out) + send_message(bundle, datapath_id, Keyword.get(options, :blocking, false)) + end end defp send_group_mod_add(datapath_id, options \\ []) do @@ -114,7 +142,14 @@ defmodule Tres.MessageHelper do buckets: options[:buckets] || [] ) - send_message(group_mod, datapath_id, Keyword.get(options, :blocking, false)) + case options[:bundle_id] do + nil -> + send_message(group_mod, datapath_id, Keyword.get(options, :blocking, false)) + + bundle_id when is_integer(bundle_id) -> + bundle = Openflow.OnfBundleAdd.new(bundle_id: bundle_id, flags: options[:bundle_flags] || [], message: group_mod) + send_message(bundle, datapath_id, Keyword.get(options, :blocking, false)) + end end defp send_group_mod_delete(datapath_id, options \\ []) do @@ -125,7 +160,14 @@ defmodule Tres.MessageHelper do group_id: options[:group_id] || :all ) - send_message(group_mod, datapath_id, Keyword.get(options, :blocking, false)) + case options[:bundle_id] do + nil -> + send_message(group_mod, datapath_id, Keyword.get(options, :blocking, false)) + + bundle_id when is_integer(bundle_id) -> + bundle = Openflow.OnfBundleAdd.new(bundle_id: bundle_id, flags: options[:bundle_flags] || [], message: group_mod) + send_message(bundle, datapath_id, Keyword.get(options, :blocking, false)) + end end defp send_group_mod_modify(datapath_id, options \\ []) do @@ -138,7 +180,14 @@ defmodule Tres.MessageHelper do buckets: options[:buckets] || [] ) - send_message(group_mod, datapath_id, Keyword.get(options, :blocking, false)) + case options[:bundle_id] do + nil -> + send_message(group_mod, datapath_id, Keyword.get(options, :blocking, false)) + + bundle_id when is_integer(bundle_id) -> + bundle = Openflow.OnfBundleAdd.new(bundle_id: bundle_id, flags: options[:bundle_flags] || [], message: group_mod) + send_message(bundle, datapath_id, Keyword.get(options, :blocking, false)) + end end defp send_role_request(datapath_id, options) do @@ -193,6 +242,32 @@ defmodule Tres.MessageHelper do resume = Openflow.NxResume.new(options) send_message(resume, datapath_id, options[:blocking] || false) end + + # ONF Bundle Control + + defp onf_bundle_open(datapath_id, options \\ []) do + options2 = Keyword.merge(options, [type: :open_request]) + bundle = Openflow.OnfBundleControl.new(options2) + send_message(bundle, datapath_id) + end + + defp onf_bundle_close(datapath_id, options) do + options2 = Keyword.merge(options, [type: :close_request]) + bundle = Openflow.OnfBundleControl.new(options2) + send_message(bundle, datapath_id) + end + + defp onf_bundle_commit(datapath_id, options) do + options2 = Keyword.merge(options, [type: :commit_request]) + bundle = Openflow.OnfBundleControl.new(options2) + send_message(bundle, datapath_id) + end + + defp onf_bundle_discard(datapath_id, options) do + options2 = Keyword.merge(options, [type: :discard_request]) + bundle = Openflow.OnfBundleControl.new(options2) + send_message(bundle, datapath_id) + end end end end