Fix to secure_channel send_message more safer
This commit is contained in:
parent
2974723807
commit
5762231816
3 changed files with 29 additions and 45 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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__
|
||||||
|
|
|
||||||
46
test/flay.ex
46
test/flay.ex
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue