From 855fb71b4efe95c3cd4cb01faf9c192fb8ca6d58 Mon Sep 17 00:00:00 2001 From: ionut Date: Wed, 6 May 2026 01:39:11 +0300 Subject: [PATCH] tunnel config --- src/main.c | 3 ++- src/neonucleus.c | 34 ++++++++++++++++++++++++++++------ src/neonucleus.h | 7 +++++++ 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/main.c b/src/main.c index f1b11b0..2cf7210 100644 --- a/src/main.c +++ b/src/main.c @@ -134,6 +134,7 @@ static nn_Exit ne_modemBullshit(nn_ModemRequest *req) { return NN_OK; } if(req->action == NN_MODEM_SEND) { + req->send.strengthSent = req->modem->maxRange; printf("Transmission from %s to %s (port %zu) of %zu bytes (%zu values)\n", req->localAddress, req->send.address == NULL ? "*" : req->send.address, req->send.port, req->send.contents->buflen, req->send.contents->valueCount); return nn_pushModemMessage(C, req->localAddress, nn_getComputerAddress(C), req->send.port, 0, req->send.contents); } @@ -488,7 +489,7 @@ int main(int argc, char **argv) { nn_setComponentHandler(ocelotCard, sandbox_handler); nn_Component *dataCard = nn_createDataCard(u, NULL, &nn_defaultDataCards[2], NULL, ne_dataBullshit); - nn_Component *modem = nn_createModem(u, NULL, &nn_defaultWiredModem, NULL, ne_modemBullshit); + nn_Component *modem = nn_createModem(u, NULL, &nn_defaultWirelessModems[1], NULL, ne_modemBullshit); char *eepromCode = (char *)minBIOS; size_t eepromSize = strlen(minBIOS); diff --git a/src/neonucleus.c b/src/neonucleus.c index 1235b1a..b55b800 100644 --- a/src/neonucleus.c +++ b/src/neonucleus.c @@ -6195,6 +6195,7 @@ static nn_Exit nn_dataHandler(nn_ComponentRequest *req) { dreq.action = NN_DATA_ENCODE64; dreq.data = nn_tolstring(C, 0, &dreq.datalen); if(dreq.datalen > dataCard.limit) return NN_ELIMIT; + nn_removeEnergy(C, dataCard.trivialCost + dataCard.trivialCostByte * dreq.datalen); e = state->handler(&dreq); if(e) return e; req->returnCount = 1; @@ -6206,6 +6207,7 @@ static nn_Exit nn_dataHandler(nn_ComponentRequest *req) { dreq.action = NN_DATA_DECODE64; dreq.data = nn_tolstring(C, 0, &dreq.datalen); if(dreq.datalen > dataCard.limit) return NN_ELIMIT; + nn_removeEnergy(C, dataCard.trivialCost + dataCard.trivialCostByte * dreq.datalen); e = state->handler(&dreq); if(e) return e; req->returnCount = 1; @@ -6217,6 +6219,7 @@ static nn_Exit nn_dataHandler(nn_ComponentRequest *req) { dreq.action = NN_DATA_DEFLATE; dreq.data = nn_tolstring(C, 0, &dreq.datalen); if(dreq.datalen > dataCard.limit) return NN_ELIMIT; + nn_removeEnergy(C, dataCard.complexCost + dataCard.complexCostByte * dreq.datalen); e = state->handler(&dreq); if(e) return e; req->returnCount = 1; @@ -6228,6 +6231,7 @@ static nn_Exit nn_dataHandler(nn_ComponentRequest *req) { dreq.action = NN_DATA_INFLATE; dreq.data = nn_tolstring(C, 0, &dreq.datalen); if(dreq.datalen > dataCard.limit) return NN_ELIMIT; + nn_removeEnergy(C, dataCard.complexCost + dataCard.complexCostByte * dreq.datalen); e = state->handler(&dreq); if(e) return e; req->returnCount = 1; @@ -6239,6 +6243,7 @@ static nn_Exit nn_dataHandler(nn_ComponentRequest *req) { dreq.action = NN_DATA_CRC32; dreq.crc32.data = nn_tolstring(C, 0, &dreq.crc32.datalen); if(dreq.crc32.datalen > dataCard.limit) return NN_ELIMIT; + nn_removeEnergy(C, dataCard.trivialCost + dataCard.trivialCostByte * dreq.crc32.datalen); e = state->handler(&dreq); if(e) return e; req->returnCount = 1; @@ -6250,6 +6255,7 @@ static nn_Exit nn_dataHandler(nn_ComponentRequest *req) { dreq.action = NN_DATA_MD5; dreq.md5.data = nn_tolstring(C, 0, &dreq.md5.datalen); if(dreq.md5.datalen > dataCard.limit) return NN_ELIMIT; + nn_removeEnergy(C, dataCard.simpleCost + dataCard.simpleCostByte * dreq.md5.datalen); e = state->handler(&dreq); if(e) return e; req->returnCount = 1; @@ -6261,6 +6267,7 @@ static nn_Exit nn_dataHandler(nn_ComponentRequest *req) { dreq.action = NN_DATA_SHA256; dreq.sha256.data = nn_tolstring(C, 0, &dreq.sha256.datalen); if(dreq.sha256.datalen > dataCard.limit) return NN_ELIMIT; + nn_removeEnergy(C, dataCard.complexCost + dataCard.complexCostByte * dreq.sha256.datalen); e = state->handler(&dreq); if(e) return e; req->returnCount = 1; @@ -6274,6 +6281,7 @@ static nn_Exit nn_dataHandler(nn_ComponentRequest *req) { n = 1; } if(n > dataCard.maxRandom) return NN_ELIMIT; + nn_removeEnergy(C, dataCard.complexCost + dataCard.complexCostByte * n); char *buf = nn_alloc(ctx, n); dreq.action = NN_DATA_RANDOM; dreq.randbuf.buf = buf; @@ -6296,6 +6304,7 @@ static nn_Exit nn_dataHandler(nn_ComponentRequest *req) { dreq.action = NN_DATA_ENCRYPT; dreq.encrypt.data = nn_tolstring(C, 0, &dreq.encrypt.datalen); if(dreq.encrypt.datalen > dataCard.limit) return NN_ELIMIT; + nn_removeEnergy(C, dataCard.simpleCost + dataCard.simpleCostByte * dreq.encrypt.datalen); size_t len; dreq.encrypt.key = nn_tolstring(C, 1, &len); if(len != 16) { @@ -6320,6 +6329,7 @@ static nn_Exit nn_dataHandler(nn_ComponentRequest *req) { dreq.action = NN_DATA_ENCRYPT; dreq.encrypt.data = nn_tolstring(C, 0, &dreq.encrypt.datalen); if(dreq.encrypt.datalen > dataCard.limit) return NN_ELIMIT; + nn_removeEnergy(C, dataCard.simpleCost + dataCard.simpleCostByte * dreq.encrypt.datalen); size_t len; dreq.encrypt.key = nn_tolstring(C, 1, &len); if(len != 16) { @@ -6502,9 +6512,11 @@ static nn_Exit nn_modemHandler(nn_ComponentRequest *req) { mreq.send.address = NULL; mreq.send.port = port; mreq.send.contents = &data; + mreq.send.strengthSent = 0; e = state->handler(&mreq); nn_dropNetworkContents(&data); if(!e) { + nn_removeEnergy(C, state->modem.basePacketCost + state->modem.fullPacketCost * cost / state->modem.maxPacketSize + state->modem.costPerStrength * mreq.send.strengthSent); req->returnCount = 1; e = nn_pushbool(C, true); } @@ -6534,9 +6546,11 @@ static nn_Exit nn_modemHandler(nn_ComponentRequest *req) { mreq.send.address = addr; mreq.send.port = port; mreq.send.contents = &data; + mreq.send.strengthSent = 0; e = state->handler(&mreq); nn_dropNetworkContents(&data); if(!e) { + nn_removeEnergy(C, state->modem.basePacketCost + state->modem.fullPacketCost * cost / state->modem.maxPacketSize + state->modem.costPerStrength * mreq.send.strengthSent); req->returnCount = 1; e = nn_pushbool(C, true); } @@ -6599,10 +6613,11 @@ nn_Modem nn_defaultWiredModem = { .maxPacketSize = 8192, .maxOpenPorts = 16, .isWired = true, - .basePacketCost = 0.5, - .fullPacketCost = 1, + .basePacketCost = 0.05, + .fullPacketCost = 0.1, .costPerStrength = 0, }; + nn_Modem nn_defaultWirelessModems[2] = { NN_INIT(nn_Modem) { .maxRange = 16, @@ -6610,8 +6625,8 @@ nn_Modem nn_defaultWirelessModems[2] = { .maxPacketSize = 8192, .maxOpenPorts = 16, .isWired = true, - .basePacketCost = 1, - .fullPacketCost = 5, + .basePacketCost = 0.1, + .fullPacketCost = 0.5, .costPerStrength = 0.05, }, NN_INIT(nn_Modem) { @@ -6620,8 +6635,15 @@ nn_Modem nn_defaultWirelessModems[2] = { .maxPacketSize = 8192, .maxOpenPorts = 16, .isWired = true, - .basePacketCost = 2, - .fullPacketCost = 10, + .basePacketCost = 0.2, + .fullPacketCost = 1, .costPerStrength = 0.05, }, }; + +nn_Tunnel nn_defaultTunnel = { + .maxValues = 8, + .maxPacketSize = 8192, + .basePacketCost = 100, + .fullPacketCost = 256, +}; diff --git a/src/neonucleus.h b/src/neonucleus.h index 2336e31..fc34100 100644 --- a/src/neonucleus.h +++ b/src/neonucleus.h @@ -1902,6 +1902,9 @@ typedef struct nn_ModemRequest { // NULL for broadcast const char *address; size_t port; + // The signal strength it was sent at + // This is an *OUT* field, it is assumed the handler keeps track of the correct strength + size_t strengthSent; } send; // for getStrength, setStrength. size_t strength; @@ -1927,6 +1930,10 @@ typedef struct nn_Tunnel { size_t maxValues; // maximum logical packet size. Note that the encoding is more efficient than the packet size algorithm estimates size_t maxPacketSize; + // minimum energy cost of 1 transmission + double basePacketCost; + // extra energy cost of 1 full transmission + double fullPacketCost; } nn_Tunnel; extern nn_Tunnel nn_defaultTunnel;