NTNet Relay upgrades

- NTNet Quantum Relays now have simple UI that allows users to manually toggle them on/off.
- Implements simplified Denial of Service handling for relays. This will be used by next commit that will add antagonist software.
- Relays can buffer and dissipate certain amount of DoS traffic. If this traffic exceeds certain level (configurable via varedit) the relay crashes temporarily.
- Relays may be manually reset by using specific button in the UI
- Relays are now buildable. They are relatively cheap (circuit board and some cables), but the board requires Data Theory 4 research.
This commit is contained in:
Atlantis
2015-12-15 16:13:17 +01:00
parent 008e122e1c
commit 326922cd8d
5 changed files with 138 additions and 3 deletions
@@ -62,3 +62,11 @@ obj/item/weapon/circuitboard/rdserver
"/obj/item/weapon/stock_parts/manipulator" = 1,
"/obj/item/weapon/stock_parts/micro_laser" = 1,
"/obj/item/weapon/stock_parts/console_screen" = 1)
obj/item/weapon/circuitboard/ntnet_relay
name = "Circuit board (NTNet Quantum Relay)"
build_path = "/obj/machinery/ntnet_relay"
board_type = "machine"
origin_tech = list(TECH_DATA = 4)
req_components = list(
"/obj/item/stack/cable_coil" = 15)
@@ -2,20 +2,94 @@
/obj/machinery/ntnet_relay
name = "NTNet Quantum Relay"
desc = "A very complex router and transmitter capable of connecting electronic devices together. Looks fragile."
use_power = 1
idle_power_usage = 20000 //20kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational.
use_power = 2
active_power_usage = 20000 //20kW, apropriate for machine that keeps massive cross-Zlevel wireless network operational.
idle_power_usage = 100
icon_state = "bus"
anchored = 1
density = 1
var/datum/ntnet/NTNet = null // This is mostly for backwards reference and to allow varedit modifications from ingame.
var/enabled = 1 // Set to 0 if the relay was turned off
var/dos_failure = 0 // Set to 1 if the relay failed due to (D)DoS attack
// Denial of Service attack variables
var/dos_overload = 0 // Amount of DoS "packets" in this relay's buffer
var/dos_capacity = 500 // Amount of DoS "packets" in buffer required to crash the relay
var/dos_dissipate = 1 // Amount of DoS "packets" dissipated over time.
// TODO: Implement more logic here. For now it's only a placeholder.
/obj/machinery/ntnet_relay/proc/is_operational()
if(stat & (BROKEN | NOPOWER | EMPED))
return 0
if(dos_failure)
return 0
if(!enabled)
return 0
return 1
/obj/machinery/ntnet_relay/update_icon()
if(is_operational())
icon_state = "bus"
else
icon_state = "bus_off"
/obj/machinery/ntnet_relay/process()
if(is_operational())
use_power = 2
else
use_power = 1
if(dos_overload)
dos_overload = max(0, dos_overload - dos_dissipate)
// If DoS traffic exceeded capacity, crash.
if((dos_overload > dos_capacity) && !dos_failure)
dos_failure = 1
update_icon()
ntnet_global.add_log("Quantum relay switched from normal operation mode to overload recovery mode.")
// If the DoS buffer reaches 0 again, restart.
if((dos_overload == 0) && dos_failure)
dos_failure = 0
update_icon()
ntnet_global.add_log("Quantum relay switched from overload recovery mode to normal operation mode.")
..()
/obj/machinery/ntnet_relay/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
var/list/data = list()
data["enabled"] = enabled
data["dos_capacity"] = dos_capacity
data["dos_overload"] = dos_overload
data["dos_crashed"] = dos_failure
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
ui = new(user, src, ui_key, "ntnet_relay.tmpl", "NTNet Quantum Relay", 500, 300, state = state)
ui.set_initial_data(data)
ui.open()
ui.set_auto_update(1)
/obj/machinery/ntnet_relay/attack_hand(var/mob/living/user)
ui_interact(user)
/obj/machinery/ntnet_relay/Topic(href, href_list)
if(..())
return 1
if(href_list["restart"])
dos_overload = 0
dos_failure = 0
update_icon()
ntnet_global.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.")
else if(href_list["toggle"])
enabled = !enabled
ntnet_global.add_log("Quantum relay manually [enabled ? "enabled" : "disabled"].")
update_icon()
/obj/machinery/ntnet_relay/New()
component_parts = list()
component_parts += new /obj/item/stack/cable_coil(src,15)
component_parts += new /obj/item/weapon/circuitboard/ntnet_relay(src)
if(ntnet_global)
ntnet_global.relays.Add(src)
NTNet = ntnet_global
@@ -27,4 +101,24 @@
ntnet_global.relays.Remove(src)
ntnet_global.add_log("Quantum relay connection severed. Current amount of linked relays: [NTNet.relays.len]")
NTNet = null
..()
/obj/machinery/ntnet_relay/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if(istype(W, /obj/item/weapon/screwdriver))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
panel_open = !panel_open
user << "You [panel_open ? "open" : "close"] the maintenance hatch"
return
if(istype(W, /obj/item/weapon/crowbar))
if(!panel_open)
user << "Open the maintenance panel first."
return
playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
user << "You disassemble \the [src]!"
for(var/atom/movable/A in component_parts)
A.forceMove(src.loc)
new/obj/machinery/constructable_frame/machine_frame(src.loc)
qdel(src)
return
..()
@@ -4,7 +4,7 @@ var/global/nttransfer_uid = 0
filename = "nttransfer"
filedesc = "NTNet P2P Transfer Client"
program_icon_state = "generic"
size = 1
size = 5
requires_ntnet = 1
requires_ntnet_feature = NTNET_PEERTOPEER
network_destination = "other device via P2P tunnel"
+7
View File
@@ -1434,6 +1434,13 @@ CIRCUITS BELOW
build_path = /obj/item/weapon/circuitboard/shield_cap
sort_string = "VAAAC"
/datum/design/circuit/ntnet_relay
name = "NTNet Quantum Relay"
id = "ntnet_relay"
req_tech = list(TECH_DATA = 4)
build_path = /obj/item/weapon/circuitboard/ntnet_relay
sort_string = "WAAAA"
/datum/design/circuit/aicore
name = "AI core"
id = "aicore"
+26
View File
@@ -0,0 +1,26 @@
{{if data.dos_crashed}}
<h2>NETWORK BUFFERS OVERLOADED</h2>
<h3>Overload Recovery Mode</h3>
<i>This system is suffering temporary outage due to overflow of traffic buffers. Until buffered traffic is processed, all further requests will be dropped. Frequent occurences of this error may indicate insufficient hardware capacity of your network. Please contact your network planning department for instructions on how to resolve this issue.</i>
<h3>ADMINISTRATIVE OVERRIDE</h3>
<b> CAUTION - Data loss may occur </b>
{{:helper.link('Purge buffered traffic', null, { 'restart' : 1 })}}
{{else}}
<div class="itemLabel">
Relay status:
</div>
<div class="itemContent">
{{if data.enabled}}
{{:helper.link('ENABLED', null, { 'toggle' : 1 })}}
{{else}}
{{:helper.link('DISABLED', null, { 'toggle' : 1 })}}
{{/if}}
</div>
<div class="itemLabel">
Network buffer status:
</div>
<div class="itemContent">
{{:data.dos_overload}} / {{:data.dos_capacity}} GQ
</div>
{{/if}}