diff --git a/pocket/pocket.lua b/pocket/pocket.lua index a7482fd..7f770a1 100644 --- a/pocket/pocket.lua +++ b/pocket/pocket.lua @@ -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") diff --git a/pocket/startup.lua b/pocket/startup.lua index 9e55501..4455105 100644 --- a/pocket/startup.lua +++ b/pocket/startup.lua @@ -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