#225 pocket properly handle disconnects and address validation

This commit is contained in:
Mikayla Fischler 2023-06-05 20:59:28 -04:00
parent c536b823e7
commit cdff7af431
2 changed files with 22 additions and 5 deletions

View File

@ -135,6 +135,8 @@ function pocket.comms(version, modem, pkt_channel, svr_channel, crd_channel, ran
function public.close_sv()
sv_watchdog.cancel()
self.sv.linked = false
self.sv.r_seq_num = nil
self.sv.addr = comms.BROADCAST
_send_sv(SCADA_MGMT_TYPE.CLOSE, {})
end
@ -142,6 +144,8 @@ function pocket.comms(version, modem, pkt_channel, svr_channel, crd_channel, ran
function public.close_api()
api_watchdog.cancel()
self.api.linked = false
self.api.r_seq_num = nil
self.api.addr = comms.BROADCAST
_send_crd(SCADA_MGMT_TYPE.CLOSE, {})
end
@ -216,9 +220,10 @@ function pocket.comms(version, modem, pkt_channel, svr_channel, crd_channel, ran
---@param packet mgmt_frame|capi_frame|nil
function public.handle_packet(packet)
if packet ~= nil then
local l_chan = packet.scada_frame.local_channel()
local r_chan = packet.scada_frame.remote_channel()
local l_chan = packet.scada_frame.local_channel()
local r_chan = packet.scada_frame.remote_channel()
local protocol = packet.scada_frame.protocol()
local src_addr = packet.scada_frame.src_addr()
if l_chan ~= pkt_channel then
log.debug("received packet on unconfigured channel " .. l_chan, true)
@ -227,7 +232,10 @@ function pocket.comms(version, modem, pkt_channel, svr_channel, crd_channel, ran
if self.api.r_seq_num == nil then
self.api.r_seq_num = packet.scada_frame.seq_num()
elseif self.connected and ((self.api.r_seq_num + 1) ~= packet.scada_frame.seq_num()) then
log.warning("sequence out-of-order: last = " .. self.api.r_seq_num .. ", new = " .. packet.scada_frame.seq_num())
log.warning("sequence out-of-order (API): last = " .. self.api.r_seq_num .. ", new = " .. packet.scada_frame.seq_num())
return
elseif self.api.linked and self.api.addr ~= src_addr then
log.debug("received API packet from unknown computer " .. src_addr .. " while linked; channel in use by another system?")
return
else
self.api.r_seq_num = packet.scada_frame.seq_num()
@ -249,6 +257,7 @@ function pocket.comms(version, modem, pkt_channel, svr_channel, crd_channel, ran
log.info("coordinator connection established")
self.establish_delay_counter = 0
self.api.linked = true
self.api.addr = src_addr
if self.sv.linked then
coreio.report_link_state(LINK_STATE.LINKED)
@ -296,6 +305,8 @@ function pocket.comms(version, modem, pkt_channel, svr_channel, crd_channel, ran
-- handle session close
api_watchdog.cancel()
self.api.linked = false
self.api.r_seq_num = nil
self.api.addr = comms.BROADCAST
log.info("coordinator server connection closed by remote host")
else
log.debug("received unknown SCADA_MGMT packet type " .. packet.type .. " from coordinator")
@ -311,7 +322,10 @@ function pocket.comms(version, modem, pkt_channel, svr_channel, crd_channel, ran
if self.sv.r_seq_num == nil then
self.sv.r_seq_num = packet.scada_frame.seq_num()
elseif self.connected and ((self.sv.r_seq_num + 1) ~= packet.scada_frame.seq_num()) then
log.warning("sequence out-of-order: last = " .. self.sv.r_seq_num .. ", new = " .. packet.scada_frame.seq_num())
log.warning("sequence out-of-order (SVR): last = " .. self.sv.r_seq_num .. ", new = " .. packet.scada_frame.seq_num())
return
elseif self.sv.linked and self.sv.addr ~= src_addr then
log.debug("received SVR packet from unknown computer " .. src_addr .. " while linked; channel in use by another system?")
return
else
self.sv.r_seq_num = packet.scada_frame.seq_num()
@ -332,6 +346,7 @@ function pocket.comms(version, modem, pkt_channel, svr_channel, crd_channel, ran
log.info("supervisor connection established")
self.establish_delay_counter = 0
self.sv.linked = true
self.sv.addr = src_addr
if self.api.linked then
coreio.report_link_state(LINK_STATE.LINKED)
@ -379,6 +394,8 @@ function pocket.comms(version, modem, pkt_channel, svr_channel, crd_channel, ran
-- handle session close
sv_watchdog.cancel()
self.sv.linked = false
self.sv.r_seq_num = nil
self.sv.addr = comms.BROADCAST
log.info("supervisor server connection closed by remote host")
else
log.debug("received unknown SCADA_MGMT packet type " .. packet.type .. " from supervisor")

View File

@ -17,7 +17,7 @@ local coreio = require("pocket.coreio")
local pocket = require("pocket.pocket")
local renderer = require("pocket.renderer")
local POCKET_VERSION = "alpha-v0.4.0"
local POCKET_VERSION = "alpha-v0.4.1"
local println = util.println
local println_ts = util.println_ts