Fix to secure_channel send_message more safer

This commit is contained in:
Eishun Kondoh 2017-11-22 12:26:40 +09:00
parent 2974723807
commit 5762231816
3 changed files with 29 additions and 45 deletions

View file

@ -4,6 +4,7 @@ defmodule Tres.SecureChannel do
import Logger import Logger
alias :tres_xact_kv, as: XACT_KV alias :tres_xact_kv, as: XACT_KV
alias :queue, as: Queue
alias Tres.SecureChannelState alias Tres.SecureChannelState
alias Tres.SwitchRegistry alias Tres.SwitchRegistry
alias Tres.MessageHandlerSup alias Tres.MessageHandlerSup
@ -171,7 +172,14 @@ defmodule Tres.SecureChannel do
XACT_KV.delete(state_data.xact_kv_ref, message.xid) XACT_KV.delete(state_data.xact_kv_ref, message.xid)
end end
end end
:keep_state_and_data {next_actions, action_queue} =
case Queue.out(state_data.action_queue) do
{:empty, action_queue} ->
{[], action_queue}
{{:value, next_action}, action_queue} ->
{[{:next_event, :internal, next_action}], action_queue}
end
{:keep_state, %{state_data|action_queue: action_queue}, next_actions}
end end
defp handle_CONNECTED(:internal, {:openflow, message}, state_data) do defp handle_CONNECTED(:internal, {:openflow, message}, state_data) do
%SecureChannelState{datapath_id: dpid, aux_id: aux_id} = state_data %SecureChannelState{datapath_id: dpid, aux_id: aux_id} = state_data
@ -181,7 +189,7 @@ defmodule Tres.SecureChannel do
|> handle_message(new_message, state_data) |> handle_message(new_message, state_data)
:keep_state_and_data :keep_state_and_data
end end
defp handle_CONNECTED(:cast, {:send_message, message}, state_data) do defp handle_CONNECTED(:internal, {:send_message, message}, state_data) do
xid = SecureChannelState.increment_transaction_id(state_data.xid) xid = SecureChannelState.increment_transaction_id(state_data.xid)
messages = [ messages = [
%{message|xid: xid}, %{message|xid: xid},
@ -191,6 +199,19 @@ defmodule Tres.SecureChannel do
send_message(messages, state_data) send_message(messages, state_data)
:keep_state_and_data :keep_state_and_data
end end
defp handle_CONNECTED(:cast, {:send_message, message} = action, state_data) do
if Queue.is_empty(state_data.action_queue) do
xid = SecureChannelState.increment_transaction_id(state_data.xid)
messages = [
%{message|xid: xid},
%{Openflow.Barrier.Request.new|xid: xid}
]
XACT_KV.insert(state_data.xact_kv_ref, xid, message)
send_message(messages, state_data)
end
action_queue = Queue.in(action, state_data.action_queue)
{:keep_state, %{state_data|action_queue: action_queue}}
end
defp handle_message(_in_xact = true, message, state_data) do defp handle_message(_in_xact = true, message, state_data) do
case XACT_KV.get(state_data.xact_kv_ref, message.xid) do case XACT_KV.get(state_data.xact_kv_ref, message.xid) do

View file

@ -17,7 +17,8 @@ defmodule Tres.SecureChannelState do
ping_timer_ref: nil, ping_timer_ref: nil,
ping_fail_count: 0, ping_fail_count: 0,
last_received: 0, last_received: 0,
xact_kv_ref: nil xact_kv_ref: nil,
action_queue: :queue.new
) )
alias __MODULE__ alias __MODULE__

View file

@ -132,48 +132,10 @@ defmodule Flay do
tables = [ tables = [
TableFeatures.Body.new( TableFeatures.Body.new(
table_id: 0, table_id: 0,
max_entries: 2000, name: "Custom L2 Src",
instructions: [ max_entries: 8192,
Openflow.Instruction.ApplyActions, config: [:table_miss_mask]
Openflow.Instruction.GotoTable )
],
next_tables: [1],
apply_actions: [
Openflow.Action.Output,
Openflow.Action.PushVlan,
Openflow.Action.PopVlan,
Openflow.Action.SetField
],
match: [
:in_port, :eth_src, :eth_dst, :eth_type, :vlan_vid,
:ip_proto, :ipv4_src, :ipv4_dst, :tcp_dst,:udp_dst
],
apply_setfield: [
:eth_src, :eth_dst, :vlan_vid
]
),
TableFeatures.Body.new(
table_id: 0,
max_entries: 2000,
instructions: [
Openflow.Instruction.ApplyActions
],
next_tables: [],
apply_actions: [
Openflow.Action.Output,
Openflow.Action.PushVlan,
Openflow.Action.PopVlan,
Openflow.Action.SetField
],
match: [
:in_port, :eth_src, :eth_dst, :eth_type, :vlan_vid,
:ip_proto, :ipv4_src, :ipv4_dst, :tcp_dst,:udp_dst
],
apply_setfield: [
:eth_src, :eth_dst, :vlan_vid, :ipv4_src, :ipv4_dst,
:arp_spa, :arp_tpa, :arp_tha
]
),
] ]
TableFeatures.Request.new(tables) TableFeatures.Request.new(tables)
|> send_message(datapath_id) |> send_message(datapath_id)