avoid repeating packets to the same wired interface

This commit is contained in:
booty-bumping 2019-04-18 03:35:31 -06:00
parent 67c5790bd4
commit b624918e88
2 changed files with 19 additions and 10 deletions

View File

@ -19,10 +19,11 @@ local event = require "event"
local component = require "component" local component = require "component"
local computer = require "computer" local computer = require "computer"
local serial = require "serialization" local serial = require "serialization"
local hostname = computer.address():sub(1,8) local hostname = computer.address():sub(1,8)
local listener = false
cfg.debug = false
local modems = {} local modems = {}
cfg.debug = false
cfg.port = 4096 cfg.port = 4096
cfg.retry = 10 cfg.retry = 10
cfg.retrycount = 64 cfg.retrycount = 64
@ -91,7 +92,9 @@ function start()
f:close() f:close()
end end
print("Hostname: "..hostname) print("Hostname: "..hostname)
if listener then return end
if next(listeners) ~= nil then return end
modems={} modems={}
for a,t in component.list("modem") do for a,t in component.list("modem") do
modems[#modems+1] = component.proxy(a) modems[#modems+1] = component.proxy(a)
@ -112,7 +115,7 @@ function start()
return npID return npID
end end
local function sendPacket(packetID,packetType,dest,sender,vPort,data) local function sendPacket(packetID,packetType,dest,sender,vPort,data,repeatingFrom)
if rcache[dest] then if rcache[dest] then
dprint("Cached", rcache[dest][1],"send",rcache[dest][2],cfg.port,packetID,packetType,dest,sender,vPort,data) dprint("Cached", rcache[dest][1],"send",rcache[dest][2],cfg.port,packetID,packetType,dest,sender,vPort,data)
if component.type(rcache[dest][1]) == "modem" then if component.type(rcache[dest][1]) == "modem" then
@ -123,10 +126,14 @@ function start()
else else
dprint("Not cached", cfg.port,packetID,packetType,dest,sender,vPort,data) dprint("Not cached", cfg.port,packetID,packetType,dest,sender,vPort,data)
for k,v in pairs(modems) do for k,v in pairs(modems) do
if v.type == "modem" then -- do not send message back to the wired or linked modem it came from
v.broadcast(cfg.port,packetID,packetType,dest,sender,vPort,data) -- the check for tunnels is for short circuiting `v.isWireless()`, which does not exist for tunnels
elseif v.type == "tunnel" then if v.address ~= repeatingFrom or (v.type ~= "tunnel" and v.isWireless()) then
v.send(packetID,packetType,dest,sender,vPort,data) if v.type == "modem" then
v.broadcast(cfg.port,packetID,packetType,dest,sender,vPort,data)
elseif v.type == "tunnel" then
v.send(packetID,packetType,dest,sender,vPort,data)
end
end end
end end
end end
@ -177,7 +184,7 @@ function start()
elseif dest:sub(1,1) == "~" then -- broadcasts start with ~ elseif dest:sub(1,1) == "~" then -- broadcasts start with ~
computer.pushSignal("net_broadcast",sender,vPort,data) computer.pushSignal("net_broadcast",sender,vPort,data)
elseif cfg.route then -- repeat packets if route is enabled elseif cfg.route then -- repeat packets if route is enabled
sendPacket(packetID,packetType,dest,sender,vPort,data) sendPacket(packetID,packetType,dest,sender,vPort,data,localModem)
end end
if not rcache[sender] then -- add the sender to the rcache if not rcache[sender] then -- add the sender to the rcache
dprint("rcache: "..sender..":", localModem,from,computer.uptime()) dprint("rcache: "..sender..":", localModem,from,computer.uptime())
@ -233,10 +240,12 @@ end
function stop() function stop()
for k,v in pairs(listeners) do for k,v in pairs(listeners) do
event.ignore(k,v) event.ignore(k,v)
listeners[k] = nil
print("Stopped listener: "..tostring(v)) print("Stopped listener: "..tostring(v))
end end
for k,v in pairs(timers) do for k,v in pairs(timers) do
event.cancel(v) event.cancel(v)
timers[k] = nil
print("Stopped timer: "..tostring(v)) print("Stopped timer: "..tostring(v))
end end
end end

View File

@ -12,7 +12,7 @@ Upon a node receiving a message addressed to itself, it should:
2. Check if the packet is addressed to the node, and if so, queue it as a net_msg event 2. Check if the packet is addressed to the node, and if so, queue it as a net_msg event
3. If the packet is indeed addressed to this node, and the packet type is 1 (reliable), send an acknowledgement packet. 3. If the packet is indeed addressed to this node, and the packet type is 1 (reliable), send an acknowledgement packet.
4. Optional: Add the sender to the address cache if it isn't already in the cache 4. Optional: Add the sender to the address cache if it isn't already in the cache
5. Optional: If the packet is addressed to a different node, repeat the packet, preferably respecting the address cache 5. Optional: If the packet is addressed to a different node, repeat the packet via all wireless modems and all wired/linked modems except the one receiving the packet, preferably respecting the address cache
If the packet is, for some reason invalid, simply drop the packet. If the packet is, for some reason invalid, simply drop the packet.