mirror of
https://github.com/MikaylaFischler/cc-mek-scada.git
synced 2024-08-30 18:22:34 +00:00
#225 pocket properly handle disconnects and address validation
This commit is contained in:
parent
c536b823e7
commit
cdff7af431
@ -135,6 +135,8 @@ function pocket.comms(version, modem, pkt_channel, svr_channel, crd_channel, ran
|
|||||||
function public.close_sv()
|
function public.close_sv()
|
||||||
sv_watchdog.cancel()
|
sv_watchdog.cancel()
|
||||||
self.sv.linked = false
|
self.sv.linked = false
|
||||||
|
self.sv.r_seq_num = nil
|
||||||
|
self.sv.addr = comms.BROADCAST
|
||||||
_send_sv(SCADA_MGMT_TYPE.CLOSE, {})
|
_send_sv(SCADA_MGMT_TYPE.CLOSE, {})
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -142,6 +144,8 @@ function pocket.comms(version, modem, pkt_channel, svr_channel, crd_channel, ran
|
|||||||
function public.close_api()
|
function public.close_api()
|
||||||
api_watchdog.cancel()
|
api_watchdog.cancel()
|
||||||
self.api.linked = false
|
self.api.linked = false
|
||||||
|
self.api.r_seq_num = nil
|
||||||
|
self.api.addr = comms.BROADCAST
|
||||||
_send_crd(SCADA_MGMT_TYPE.CLOSE, {})
|
_send_crd(SCADA_MGMT_TYPE.CLOSE, {})
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -216,9 +220,10 @@ function pocket.comms(version, modem, pkt_channel, svr_channel, crd_channel, ran
|
|||||||
---@param packet mgmt_frame|capi_frame|nil
|
---@param packet mgmt_frame|capi_frame|nil
|
||||||
function public.handle_packet(packet)
|
function public.handle_packet(packet)
|
||||||
if packet ~= nil then
|
if packet ~= nil then
|
||||||
local l_chan = packet.scada_frame.local_channel()
|
local l_chan = packet.scada_frame.local_channel()
|
||||||
local r_chan = packet.scada_frame.remote_channel()
|
local r_chan = packet.scada_frame.remote_channel()
|
||||||
local protocol = packet.scada_frame.protocol()
|
local protocol = packet.scada_frame.protocol()
|
||||||
|
local src_addr = packet.scada_frame.src_addr()
|
||||||
|
|
||||||
if l_chan ~= pkt_channel then
|
if l_chan ~= pkt_channel then
|
||||||
log.debug("received packet on unconfigured channel " .. l_chan, true)
|
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
|
if self.api.r_seq_num == nil then
|
||||||
self.api.r_seq_num = packet.scada_frame.seq_num()
|
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
|
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
|
return
|
||||||
else
|
else
|
||||||
self.api.r_seq_num = packet.scada_frame.seq_num()
|
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")
|
log.info("coordinator connection established")
|
||||||
self.establish_delay_counter = 0
|
self.establish_delay_counter = 0
|
||||||
self.api.linked = true
|
self.api.linked = true
|
||||||
|
self.api.addr = src_addr
|
||||||
|
|
||||||
if self.sv.linked then
|
if self.sv.linked then
|
||||||
coreio.report_link_state(LINK_STATE.LINKED)
|
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
|
-- handle session close
|
||||||
api_watchdog.cancel()
|
api_watchdog.cancel()
|
||||||
self.api.linked = false
|
self.api.linked = false
|
||||||
|
self.api.r_seq_num = nil
|
||||||
|
self.api.addr = comms.BROADCAST
|
||||||
log.info("coordinator server connection closed by remote host")
|
log.info("coordinator server connection closed by remote host")
|
||||||
else
|
else
|
||||||
log.debug("received unknown SCADA_MGMT packet type " .. packet.type .. " from coordinator")
|
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
|
if self.sv.r_seq_num == nil then
|
||||||
self.sv.r_seq_num = packet.scada_frame.seq_num()
|
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
|
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
|
return
|
||||||
else
|
else
|
||||||
self.sv.r_seq_num = packet.scada_frame.seq_num()
|
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")
|
log.info("supervisor connection established")
|
||||||
self.establish_delay_counter = 0
|
self.establish_delay_counter = 0
|
||||||
self.sv.linked = true
|
self.sv.linked = true
|
||||||
|
self.sv.addr = src_addr
|
||||||
|
|
||||||
if self.api.linked then
|
if self.api.linked then
|
||||||
coreio.report_link_state(LINK_STATE.LINKED)
|
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
|
-- handle session close
|
||||||
sv_watchdog.cancel()
|
sv_watchdog.cancel()
|
||||||
self.sv.linked = false
|
self.sv.linked = false
|
||||||
|
self.sv.r_seq_num = nil
|
||||||
|
self.sv.addr = comms.BROADCAST
|
||||||
log.info("supervisor server connection closed by remote host")
|
log.info("supervisor server connection closed by remote host")
|
||||||
else
|
else
|
||||||
log.debug("received unknown SCADA_MGMT packet type " .. packet.type .. " from supervisor")
|
log.debug("received unknown SCADA_MGMT packet type " .. packet.type .. " from supervisor")
|
||||||
|
@ -17,7 +17,7 @@ local coreio = require("pocket.coreio")
|
|||||||
local pocket = require("pocket.pocket")
|
local pocket = require("pocket.pocket")
|
||||||
local renderer = require("pocket.renderer")
|
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 = util.println
|
||||||
local println_ts = util.println_ts
|
local println_ts = util.println_ts
|
||||||
|
Loading…
x
Reference in New Issue
Block a user