File transfer nonsense fixed!

This commit is contained in:
Scott Duensing 2022-02-26 17:56:59 -06:00
parent b8e2178775
commit 41df0f0e54
16 changed files with 86 additions and 78 deletions

View file

@ -21,7 +21,7 @@
TEMPLATE = app TEMPLATE = app
CONFIG -= qt CONFIG -= qt
#CONFIG += ASAN CONFIG += ASAN
DESTDIR = $$OUT_PWD/bin DESTDIR = $$OUT_PWD/bin
SHARED = $$PWD/../shared SHARED = $$PWD/../shared

View file

@ -558,7 +558,7 @@ int16_t vbeInfoShow(void) {
_vbeModeInfo.redMaskSize, _vbeModeInfo.redMaskSize,
_vbeModeInfo.greenMaskSize, _vbeModeInfo.greenMaskSize,
_vbeModeInfo.blueMaskSize, _vbeModeInfo.blueMaskSize,
(_vbeModeInfo.memoryModel / 2) - 2 ? "DCOLOR" : "PACKED"); ((_vbeModeInfo.memoryModel / 2) - 2) ? "DCOLOR" : "PACKED");
} }
} }

View file

@ -109,7 +109,6 @@ static void fileCheckNext(void) {
if (_current == NULL) { if (_current == NULL) {
// End of queue? // End of queue?
if (arrlen(_fileList) == 0) { if (arrlen(_fileList) == 0) {
logWrite("End of queue.\n");
arrfree(_fileList); arrfree(_fileList);
if (_dialogVisible) guiDelete(D(_winFile)); if (_dialogVisible) guiDelete(D(_winFile));
netChannelRelease(_channel); netChannelRelease(_channel);
@ -117,7 +116,6 @@ static void fileCheckNext(void) {
} }
// Get next queue entry. // Get next queue entry.
logWrite("Next queue entry.\n");
_currentLength = 0; _currentLength = 0;
_current = _fileList[0]; _current = _fileList[0];
arrdel(_fileList, 0); arrdel(_fileList, 0);
@ -127,7 +125,6 @@ static void fileCheckNext(void) {
// End of current queue file list? // End of current queue file list?
if (arrlen(_current->files) == 0) { if (arrlen(_current->files) == 0) {
logWrite("End of files.\n");
// End of list! // End of list!
arrfree(_current->files); arrfree(_current->files);
_current->callback(); _current->callback();
@ -136,7 +133,6 @@ static void fileCheckNext(void) {
doRecheck = 1; doRecheck = 1;
} else { } else {
// No. Get next file. // No. Get next file.
logWrite("Next file.\n");
_file = _current->files[0]; _file = _current->files[0];
arrdel(_current->files, 0); arrdel(_current->files, 0);
} }
@ -147,7 +143,6 @@ static void fileCheckNext(void) {
shaPointer = cacheSha256Get(_file); shaPointer = cacheSha256Get(_file);
if (!shaPointer) shaPointer = badSHA; if (!shaPointer) shaPointer = badSHA;
packetData = packetContentPack(&length, "iss", temp, shaPointer, _file); packetData = packetContentPack(&length, "iss", temp, shaPointer, _file);
logWrite("Checking [%d] [%s] [%s]\n", temp, shaPointer, _file);
encoded.control = PACKET_CONTROL_DAT; encoded.control = PACKET_CONTROL_DAT;
encoded.packetType = PACKET_TYPE_FILE_REQUEST; encoded.packetType = PACKET_TYPE_FILE_REQUEST;
encoded.channel = _channel; encoded.channel = _channel;
@ -204,29 +199,24 @@ static void packetHandler(PacketDecodeDataT *packet) {
packetContentUnpack(packet->data, "i", &response); packetContentUnpack(packet->data, "i", &response);
switch (response) { switch (response) {
case FILE_RESPONSE_UNKNOWN: case FILE_RESPONSE_UNKNOWN:
logWrite("Unknown file transfer response.\n");
fileShowError("Unknown file transfer response."); fileShowError("Unknown file transfer response.");
break; break;
case FILE_RESPONSE_OKAY: case FILE_RESPONSE_OKAY:
// This file is already up-to-date, move on to next. // This file is already up-to-date, move on to next.
logWrite("Got FILE_RESPONSE_OKAY\n");
fileCheckNext(); fileCheckNext();
break; break;
case FILE_RESPONSE_SEND: case FILE_RESPONSE_SEND:
// Start of new file. Get SHA and length. // Start of new file. Get SHA and length.
logWrite("Got FILE_RESPONSE_SEND\n");
packetContentUnpack(packet->data, "iis", &response, &_currentLength, &_currentSha256); packetContentUnpack(packet->data, "iis", &response, &_currentLength, &_currentSha256);
break; break;
case FILE_RESPONSE_DATA: case FILE_RESPONSE_DATA:
logWrite("Got FILE_RESPONSE_DATA\n");
// Receive new file data. // Receive new file data.
if (!_dialogVisible) fileShowDialog(); if (!_dialogVisible) fileShowDialog();
// Are we starting a new file? // Are we starting a new file?
if (_handle == NULL) { if (_handle == NULL) {
logWrite("Opening [%s]\n", _file);
_handle = cacheFOpen(_file, "wb"); _handle = cacheFOpen(_file, "wb");
if (!_handle) { if (!_handle) {
fileShowError("Unable to write to cache."); fileShowError("Unable to write to cache.");
@ -234,11 +224,9 @@ static void packetHandler(PacketDecodeDataT *packet) {
} }
} }
// Write data to file, skipping first integer stored in packet. // Write data to file, skipping first integer stored in packet.
logWrite("Writing %d bytes to [%s]\n", packet->length - 4, _file);
fwrite(&packet->data[4], packet->length - 4, 1, _handle); fwrite(&packet->data[4], packet->length - 4, 1, _handle);
// Is this file complete? // Is this file complete?
if (ftell(_handle) >= _currentLength) { if (ftell(_handle) >= _currentLength) {
logWrite("Closing [%s]\n", _file);
// Close this file. // Close this file.
cacheFClose(_handle); cacheFClose(_handle);
_handle = NULL; _handle = NULL;
@ -248,7 +236,6 @@ static void packetHandler(PacketDecodeDataT *packet) {
// Next file! // Next file!
fileCheckNext(); fileCheckNext();
} else { } else {
logWrite("Sending FILE_REQUEST_NEXT\n");
// Tell the server we got this bit of data, send the next. // Tell the server we got this bit of data, send the next.
temp = FILE_REQUEST_NEXT; temp = FILE_REQUEST_NEXT;
packetData = packetContentPack(&length, "i", temp); packetData = packetContentPack(&length, "i", temp);

View file

@ -123,15 +123,15 @@ void fontRender(FontT *font, char *string, ColorT foreground, ColorT background,
offset += (font->span / 2); offset += (font->span / 2);
if (odd) { if (odd) {
surfacePutPixel(x, yp, data & 0x08 ? foreground : background); surfacePutPixel(x, yp, (data & 0x08) ? foreground : background);
surfacePutPixel(x + 1, yp, data & 0x04 ? foreground : background); surfacePutPixel(x + 1, yp, (data & 0x04) ? foreground : background);
surfacePutPixel(x + 2, yp, data & 0x02 ? foreground : background); surfacePutPixel(x + 2, yp, (data & 0x02) ? foreground : background);
surfacePutPixel(x + 3, yp, data & 0x01 ? foreground : background); surfacePutPixel(x + 3, yp, (data & 0x01) ? foreground : background);
} else { } else {
surfacePutPixel(x, yp, data & 0x80 ? foreground : background); surfacePutPixel(x, yp, (data & 0x80) ? foreground : background);
surfacePutPixel(x + 1, yp, data & 0x40 ? foreground : background); surfacePutPixel(x + 1, yp, (data & 0x40) ? foreground : background);
surfacePutPixel(x + 2, yp, data & 0x20 ? foreground : background); surfacePutPixel(x + 2, yp, (data & 0x20) ? foreground : background);
surfacePutPixel(x + 3, yp, data & 0x10 ? foreground : background); surfacePutPixel(x + 3, yp, (data & 0x10) ? foreground : background);
} }
yp++; yp++;
@ -149,14 +149,14 @@ void fontRender(FontT *font, char *string, ColorT foreground, ColorT background,
data = font->bits[offset]; data = font->bits[offset];
offset += font->span; offset += font->span;
surfacePutPixel(x, yp, data & 0x80 ? foreground : background); surfacePutPixel(x, yp, (data & 0x80) ? foreground : background);
surfacePutPixel(x + 1, yp, data & 0x40 ? foreground : background); surfacePutPixel(x + 1, yp, (data & 0x40) ? foreground : background);
surfacePutPixel(x + 2, yp, data & 0x20 ? foreground : background); surfacePutPixel(x + 2, yp, (data & 0x20) ? foreground : background);
surfacePutPixel(x + 3, yp, data & 0x10 ? foreground : background); surfacePutPixel(x + 3, yp, (data & 0x10) ? foreground : background);
surfacePutPixel(x + 4, yp, data & 0x08 ? foreground : background); surfacePutPixel(x + 4, yp, (data & 0x08) ? foreground : background);
surfacePutPixel(x + 5, yp, data & 0x04 ? foreground : background); surfacePutPixel(x + 5, yp, (data & 0x04) ? foreground : background);
surfacePutPixel(x + 6, yp, data & 0x02 ? foreground : background); surfacePutPixel(x + 6, yp, (data & 0x02) ? foreground : background);
surfacePutPixel(x + 7, yp, data & 0x01 ? foreground : background); surfacePutPixel(x + 7, yp, (data & 0x01) ? foreground : background);
yp++; yp++;
} }

View file

@ -815,10 +815,14 @@ void guiWidgetPositionOnScreenGet(WidgetT *widget, RectT *pos) {
*pos = widget->pos; *pos = widget->pos;
} else { } else {
*pos = p->clip; *pos = p->clip;
pos->x += widget->pos.x + widget->window->base.pos.x; pos->x += widget->pos.x;
pos->y += widget->pos.y + widget->window->base.pos.y; pos->y += widget->pos.y;
pos->w = widget->pos.w; pos->w = widget->pos.w;
pos->h = widget->pos.h; pos->h = widget->pos.h;
if (widget->window) {
pos->x += widget->window->base.pos.x;
pos->y += widget->window->base.pos.y;
}
} }
} }

View file

@ -706,6 +706,8 @@ void terminalScreenClear(TerminalT *terminal) {
static void terminalSequenceReset(TerminalT *terminal) { static void terminalSequenceReset(TerminalT *terminal) {
char *parms = NULL;
terminal->escFound = 0; terminal->escFound = 0;
terminal->inEscape = 0; terminal->inEscape = 0;
terminal->number[0] = 0; terminal->number[0] = 0;
@ -713,7 +715,8 @@ static void terminalSequenceReset(TerminalT *terminal) {
if (terminal->parameters != NULL) { if (terminal->parameters != NULL) {
while (arrlen(terminal->parameters) > 0) { while (arrlen(terminal->parameters) > 0) {
free(arrpop(terminal->parameters)); parms = arrpop(terminal->parameters);
free(parms);
} }
terminal->parameters = NULL; terminal->parameters = NULL;
} }

View file

@ -34,7 +34,7 @@
#define TIMER_INTERVAL (1000 / TICKS_PER_SECOND) #define TIMER_INTERVAL (1000 / TICKS_PER_SECOND)
#define COM_BUFFER_SIZE 2048 #define COM_BUFFER_SIZE (32 * 1024)
#define MODEM_RESULT_OK 1 #define MODEM_RESULT_OK 1
#define MODEM_RESULT_ERROR 2 #define MODEM_RESULT_ERROR 2
#define MODEM_RESULT_NOTHING 3 #define MODEM_RESULT_NOTHING 3
@ -142,7 +142,7 @@ static void comModem(uint8_t c) {
x = strlen(_command); x = strlen(_command);
// Room in buffer? // Room in buffer?
if (x > COM_BUFFER_SIZE - 1) { if (x > COM_BUFFER_SIZE - 2) {
// No. Clear buffer. // No. Clear buffer.
_command[0] = 0; _command[0] = 0;
} else { } else {
@ -496,6 +496,7 @@ static void processNetworkEvent(void) {
break; break;
case ENET_EVENT_TYPE_RECEIVE: case ENET_EVENT_TYPE_RECEIVE:
//logWrite(" IN: "); packetDebugPrint((uint8_t *)event.packet->data, event.packet->dataLength);
comAddToBuffer((char *)event.packet->data, event.packet->dataLength); comAddToBuffer((char *)event.packet->data, event.packet->dataLength);
break; break;

View file

@ -17,6 +17,7 @@
* *
*/ */
#include "comport.h" #include "comport.h"
#include "timer.h" #include "timer.h"
#include "config.h" #include "config.h"
@ -25,6 +26,8 @@
void comPacketSender(uint8_t *data, uint32_t length, void *userData) { void comPacketSender(uint8_t *data, uint32_t length, void *userData) {
(void)userData; (void)userData;
//logWrite("OUT: "); packetDebugPrint((uint8_t *)data, length);
comWrite(__configData.serialCom - 1, (char *)data, length); comWrite(__configData.serialCom - 1, (char *)data, length);
} }

View file

@ -117,7 +117,7 @@ void netProcess(void) {
r = comRead(__configData.serialCom - 1, (char *)buffer, 1024); r = comRead(__configData.serialCom - 1, (char *)buffer, 1024);
// New data or not, process anything in the queue. // New data or not, process anything in the queue.
if (packetDecode(__packetThreadData, &decoded, buffer, r)) { if (packetDecode(__packetThreadData, &decoded, buffer, r)) {
//logWrite("Packet In: %d\n", decoded.packetType); logWrite("network.c - Packet In: %d Length: %d Channel: %d\n", decoded.packetType, decoded.length, decoded.channel);
//packetDebugPrint((uint8_t *)decoded.data, decoded.length); //packetDebugPrint((uint8_t *)decoded.data, decoded.length);
switch (decoded.packetType) { switch (decoded.packetType) {
case PACKET_TYPE_PING: case PACKET_TYPE_PING:
@ -158,6 +158,7 @@ void netProcess(void) {
packet->data = (uint8_t *)malloc(decoded.length); packet->data = (uint8_t *)malloc(decoded.length);
memcpy(packet->data, decoded.data, decoded.length); memcpy(packet->data, decoded.data, decoded.length);
// Send it to the subscriber. // Send it to the subscriber.
logWrite("Delivering to subscriber %p\n", _channels[r].value);
_channels[r].value(packet); _channels[r].value(packet);
} }
} }

View file

@ -21,8 +21,8 @@ TEMPLATE = app
CONFIG -= qt CONFIG -= qt
CONFIG += \ CONFIG += \
console \ console \
c11 c11 \
# ASAN ASAN
DESTDIR = $$OUT_PWD/bin DESTDIR = $$OUT_PWD/bin
SHARED = $$PWD/../shared SHARED = $$PWD/../shared

View file

@ -49,7 +49,6 @@ void clientApiFileRequest(ClientThreadT *client, PacketDecodeDataT *data) {
break; break;
default: default:
logWrite("Got FILE_REQUEST_UNKNOWN [%d] %d\n\r", request, data->length);
// No idea what they want. // No idea what they want.
packetData = packetContentPack(&length, "i", FILE_RESPONSE_UNKNOWN); packetData = packetContentPack(&length, "i", FILE_RESPONSE_UNKNOWN);
// Build packet. // Build packet.
@ -80,8 +79,6 @@ static void clientApiFileRequestCheck(ClientThreadT *client, PacketDecodeDataT *
char buffer2[2048] = { 0 }; char buffer2[2048] = { 0 };
uint32_t temp = 0; uint32_t temp = 0;
logWrite("Got FILE_REQUEST_CHECK\n\r");
// Is something still open? // Is something still open?
if (client->handle) { if (client->handle) {
fclose(client->handle); fclose(client->handle);
@ -90,12 +87,10 @@ static void clientApiFileRequestCheck(ClientThreadT *client, PacketDecodeDataT *
// Extract the request. // Extract the request.
packetContentUnpack(data->data, "iss", &request, &sha256, &path); packetContentUnpack(data->data, "iss", &request, &sha256, &path);
logWrite("[%s] [%s]\n\r", sha256, path);
// Look up the entry and compare SHA256. // Look up the entry and compare SHA256.
dbFileSha256Get(path, shaInDB, 128); dbFileSha256Get(path, shaInDB, 128);
if (strcasecmp(sha256, shaInDB) == 0) { if (strcasecmp(sha256, shaInDB) == 0) {
logWrite("File is current. Sending FILE_RESPONSE_OKAY.\n\r");
// File is already current on client. // File is already current on client.
temp = FILE_RESPONSE_OKAY; temp = FILE_RESPONSE_OKAY;
packetData = packetContentPack(&length, "i", temp); packetData = packetContentPack(&length, "i", temp);
@ -107,14 +102,12 @@ static void clientApiFileRequestCheck(ClientThreadT *client, PacketDecodeDataT *
packetSend(client->packetThreadData, &encoded); packetSend(client->packetThreadData, &encoded);
DEL(packetData); DEL(packetData);
} else { } else {
logWrite("File needs updated.\n\r");
// Get real path. // Get real path.
dbFileRealPathGet(path, buffer, FILE_VIRTUAL_PATH_MAX); dbFileRealPathGet(path, buffer, FILE_VIRTUAL_PATH_MAX);
snprintf(buffer2, 2048, "%s%s", __settingsFile, buffer); snprintf(buffer2, 2048, "%s%s", __settingsFile, buffer);
// Open file & get file size. // Open file & get file size.
client->handle = fopen(buffer2, "rb"); client->handle = fopen(buffer2, "rb");
if (!client->handle) { if (!client->handle) {
logWrite("Unable to open [%s]\n", buffer2);
DEL(sha256); DEL(sha256);
DEL(path); DEL(path);
// ***TODO*** Handle error // ***TODO*** Handle error
@ -123,10 +116,8 @@ static void clientApiFileRequestCheck(ClientThreadT *client, PacketDecodeDataT *
fseek(client->handle, 0, SEEK_END); fseek(client->handle, 0, SEEK_END);
client->fileSize = ftell(client->handle); client->fileSize = ftell(client->handle);
fseek(client->handle, 0, SEEK_SET); fseek(client->handle, 0, SEEK_SET);
logWrite("Size is %d\n\r", client->fileSize);
// Send file metadata to start transfer // Send file metadata to start transfer
logWrite("Sending FILE_RESPONSE_SEND.\n\r");
temp = FILE_RESPONSE_SEND; temp = FILE_RESPONSE_SEND;
packetData = packetContentPack(&length, "iis", temp, client->fileSize, shaInDB); packetData = packetContentPack(&length, "iis", temp, client->fileSize, shaInDB);
encoded.control = PACKET_CONTROL_DAT; encoded.control = PACKET_CONTROL_DAT;
@ -135,7 +126,6 @@ static void clientApiFileRequestCheck(ClientThreadT *client, PacketDecodeDataT *
encoded.encrypt = 0; encoded.encrypt = 0;
packetEncode(client->packetThreadData, &encoded, packetData, length); packetEncode(client->packetThreadData, &encoded, packetData, length);
packetSend(client->packetThreadData, &encoded); packetSend(client->packetThreadData, &encoded);
//packetDebugPrint((uint8_t *)encoded.dataPointer, encoded.length);
DEL(packetData); DEL(packetData);
DEL(sha256); DEL(sha256);
@ -155,7 +145,6 @@ static void clientApiFileRequestNext(ClientThreadT *client, PacketDecodeDataT *d
// Do we have an open file? // Do we have an open file?
if (client->handle) { if (client->handle) {
logWrite("Sending FILE_RESPONSE_DATA.\n\r");
// Add response type. // Add response type.
temp = FILE_RESPONSE_DATA; temp = FILE_RESPONSE_DATA;
memcpy(&packetData[0], &temp, sizeof(int32_t)); memcpy(&packetData[0], &temp, sizeof(int32_t));
@ -163,24 +152,23 @@ static void clientApiFileRequestNext(ClientThreadT *client, PacketDecodeDataT *d
// Add file data. // Add file data.
// ***TODO*** We can't send quite a full packet for some reason. // ***TODO*** We can't send quite a full packet for some reason.
length = client->fileSize - ftell(client->handle); length = client->fileSize - ftell(client->handle);
if (length > PACKET_MAX - 14) { if (length > PACKET_MAX - (10 + sizeof(int32_t))) {
// File is larger than a packet size. // File is larger than a packet size.
length = PACKET_MAX - 14; // 4 for integer of response type. 10 more because a full PACKET_MAX causes issues. length = PACKET_MAX - (10 + sizeof(int32_t)); // 4 for integer of response type. 10 more because a full PACKET_MAX causes issues.
fread(&packetData[4], length, 1, client->handle); fread(&packetData[sizeof(int32_t)], length, 1, client->handle);
} else { } else {
// File remains will fit in this packet. // File remains will fit in this packet.
fread(&packetData[4], length, 1, client->handle); fread(&packetData[sizeof(int32_t)], length, 1, client->handle);
fclose(client->handle); fclose(client->handle);
client->handle = NULL; client->handle = NULL;
} }
logWrite("Sending %d bytes of file\n\r", length);
// Build packet. // Build packet.
encoded.control = PACKET_CONTROL_DAT; encoded.control = PACKET_CONTROL_DAT;
encoded.packetType = PACKET_TYPE_FILE_RESPONSE; encoded.packetType = PACKET_TYPE_FILE_RESPONSE;
encoded.channel = data->channel; encoded.channel = data->channel;
encoded.encrypt = 0; encoded.encrypt = 0;
packetEncode(client->packetThreadData, &encoded, packetData, length + 4); packetEncode(client->packetThreadData, &encoded, packetData, length + sizeof(int32_t));
// Send it. // Send it.
packetSend(client->packetThreadData, &encoded); packetSend(client->packetThreadData, &encoded);
} }

View file

@ -40,17 +40,16 @@ void clientApiSignup(ClientThreadT *client, PacketDecodeDataT *data) {
// This only makes sense if they're not logged in. // This only makes sense if they're not logged in.
if (!client->authenticated) { if (!client->authenticated) {
packetDebugPrint((uint8_t *)data->data, data->length);
// Get info for the user. // Get info for the user.
packetContentUnpack(data->data, "sssss", &email, &first, &last, &pass, &user); packetContentUnpack(data->data, "sssss", &email, &first, &last, &pass, &user);
/*
logWrite("Email: %s\n\r", email); logWrite("Email: %s\n\r", email);
logWrite("First: %s\n\r", first); logWrite("First: %s\n\r", first);
logWrite(" Last: %s\n\r", last); logWrite(" Last: %s\n\r", last);
logWrite(" Pass: %s\n\r", pass); logWrite(" Pass: %s\n\r", pass);
logWrite(" User: %s\n\r", user); logWrite(" User: %s\n\r", user);
*/
// See if they already exist in the database. // See if they already exist in the database.
if (dbUserNameExists(user)) { if (dbUserNameExists(user)) {

View file

@ -84,7 +84,7 @@ static void configWrite(char *file) {
"USER=%s\n" "USER=%s\n"
"PASS=%s\n", "PASS=%s\n",
_configServer, _configServer,
_configPort, (int)_configPort,
_configDatabase, _configDatabase,
_configUser, _configUser,
_configPassword _configPassword
@ -157,6 +157,7 @@ int main(int argc, char *argv[]) {
restShutdown(); restShutdown();
configWrite(configFile); configWrite(configFile);
DEL(configFile); DEL(configFile);
dbDisconnect();
logWrite("Shutdown complete.\n"); logWrite("Shutdown complete.\n");
logClose(); logClose();
memoryShutdown(); memoryShutdown();

View file

@ -63,6 +63,8 @@ static void serverPacketSender(uint8_t *data, uint32_t length, void *userData) {
ENetPeer *peer = (ENetPeer *)userData; ENetPeer *peer = (ENetPeer *)userData;
ENetPacket *packet = NULL; ENetPacket *packet = NULL;
//logWrite("OUT: "); packetDebugPrint((uint8_t *)data, length);
// Send packet. // Send packet.
packet = enet_packet_create(data, length, ENET_PACKET_FLAG_RELIABLE); packet = enet_packet_create(data, length, ENET_PACKET_FLAG_RELIABLE);
enet_peer_send(peer, 0, packet); enet_peer_send(peer, 0, packet);

View file

@ -51,6 +51,7 @@
#include "thirdparty/tiny-AES128-C/pkcs7_padding.h" #include "thirdparty/tiny-AES128-C/pkcs7_padding.h"
static uint8_t _packetLogging = 0; // Do we want to write all packets to disk?
static packetSender _packetSender = NULL; static packetSender _packetSender = NULL;
static uint8_t _encryptionReady = 0; static uint8_t _encryptionReady = 0;
@ -184,13 +185,6 @@ static uint8_t packetCRC(uint8_t *data, uint16_t length, uint8_t startAt) {
} }
void packetDebugPrint(uint8_t *data, uint16_t length) {
uint16_t i;
for (i=0; i<length; i++) logWrite("%02x [%c] ", data[i], data[i]);
logWrite("\n\r");
}
uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeData, uint8_t *input, uint16_t inputLength) { uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeData, uint8_t *input, uint16_t inputLength) {
//uint8_t sequence = 0; //uint8_t sequence = 0;
uint16_t unpadded = 0; uint16_t unpadded = 0;
@ -205,7 +199,7 @@ uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeDat
if (input != NULL && inputLength > 0) { if (input != NULL && inputLength > 0) {
for (x=0; x<inputLength; x++) { for (x=0; x<inputLength; x++) {
threadData->decodeQueue[threadData->decodeQueueHead++] = input[x]; threadData->decodeQueue[threadData->decodeQueueHead++] = input[x];
if (threadData->decodeQueueHead >= PACKET_INPUT_QUEUE_SIZE) threadData->decodeQueueHead = 0; if (threadData->decodeQueueHead >= PACKET_BUFFER_SIZE) threadData->decodeQueueHead = 0;
} }
} }
@ -215,7 +209,7 @@ uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeDat
// Get next byte. // Get next byte.
c = threadData->decodeQueue[threadData->decodeQueueTail++]; c = threadData->decodeQueue[threadData->decodeQueueTail++];
if (threadData->decodeQueueTail >= PACKET_INPUT_QUEUE_SIZE) threadData->decodeQueueTail = 0; if (threadData->decodeQueueTail >= PACKET_BUFFER_SIZE) threadData->decodeQueueTail = 0;
// New packet? // New packet?
if (threadData->newPacket) { if (threadData->newPacket) {
@ -235,6 +229,8 @@ uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeDat
// Yes! Process it and set up for the next packet. // Yes! Process it and set up for the next packet.
threadData->newPacket = 1; threadData->newPacket = 1;
packetLog(" IN:", threadData->decodeBuffer, threadData->length);
/* /*
// Check CRC. // Check CRC.
x = packetCRC(threadData->decodeBuffer, threadData->length - 1, 0); x = packetCRC(threadData->decodeBuffer, threadData->length - 1, 0);
@ -305,7 +301,7 @@ uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeDat
// Copy packet data to new buffer, if any. // Copy packet data to new buffer, if any.
if (threadData->length - 4 > 0) { if (threadData->length - 4 > 0) {
decodeData->data = (uint8_t *)malloc(threadData->length - 4); // 4 for 3 byte header and 1 byte CRC. decodeData->data = (uint8_t *)malloc(threadData->length - 4); // 4 for 3 byte header and 1 byte CRC.
if (!decodeData) continue; if (!decodeData->data) continue;
memcpy(decodeData->data, &threadData->decodeBuffer[3], threadData->length - 4); // Skip header and CRC. memcpy(decodeData->data, &threadData->decodeBuffer[3], threadData->length - 4); // Skip header and CRC.
decodeData->length = threadData->length - 4; decodeData->length = threadData->length - 4;
} else { } else {
@ -316,9 +312,6 @@ uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeDat
// Fix length to remove header and checksum. // Fix length to remove header and checksum.
threadData->length -= 4; threadData->length -= 4;
logWrite("Packet In: %d Length: %d\n\r", decodeData->packetType, decodeData->length);
//packetDebugPrint((uint8_t *)decodeData->data, decodeData->length);
// Is this a DH_REQUEST? // Is this a DH_REQUEST?
if (decodeData->packetType == PACKET_TYPE_DH_REQUEST) { if (decodeData->packetType == PACKET_TYPE_DH_REQUEST) {
memcpy(threadData->dhModulus, decodeData->data, PACKET_ENCRYPT_KEY_SIZE * sizeof(uint16_t)); memcpy(threadData->dhModulus, decodeData->data, PACKET_ENCRYPT_KEY_SIZE * sizeof(uint16_t));
@ -529,12 +522,39 @@ void packetEncryptionSetup(PacketThreadDataT *threadData) {
} }
void packetLog(char *message, uint8_t *packet, uint32_t length) {
FILE *log = NULL;
uint16_t i = 0;
static uint8_t firstCall = 1;
if (!_packetLogging) return;
if (firstCall) {
log = fopen("packet.log", "wt");
firstCall = 0;
} else {
log = fopen("packet.log", "at");
}
if (log) {
fprintf(log, "%s %05u ", message, length);
for (i=0; i<length; i++) {
if ((packet[i] > 32) && (packet[i] < 255) && (packet[i] != 127)) {
fprintf(log, "%02x [%c] ", packet[i], packet[i]);
} else {
fprintf(log, "%02x [ ] ", packet[i]);
}
}
fprintf(log, "\n-------------------------------------------------------------------------------\n");
fclose(log);
}
}
void packetSend(PacketThreadDataT *threadData, PacketEncodeDataT *data) { void packetSend(PacketThreadDataT *threadData, PacketEncodeDataT *data) {
// Valid control type? // Valid control type?
if (data->control != PACKET_CONTROL_BAD && data->control <= PACKET_CONTROL_COUNT) { if (data->control != PACKET_CONTROL_BAD && data->control <= PACKET_CONTROL_COUNT) {
packetLog("OUT:", data->dataPointer, data->length);
_packetSender(data->dataPointer, data->length, threadData->senderData); _packetSender(data->dataPointer, data->length, threadData->senderData);
logWrite("Packet Out: %d Length: %d\n\r", data->packetType, data->length);
//packetDebugPrint((uint8_t *)data->dataPointer, data->length);
} else { } else {
logWrite("Invalid PACKET_CONTROL!\n\r"); logWrite("Invalid PACKET_CONTROL!\n\r");
} }

View file

@ -43,7 +43,6 @@
#define PACKET_MAX 4096 // Maximum number of bytes per packet. #define PACKET_MAX 4096 // Maximum number of bytes per packet.
#define PACKET_SEQUENCE_MAX 32 // Five bits of data, 32 max. Represents size of replay history. Also maximum number of packets on the wire at a time. #define PACKET_SEQUENCE_MAX 32 // Five bits of data, 32 max. Represents size of replay history. Also maximum number of packets on the wire at a time.
#define PACKET_INPUT_QUEUE_SIZE 8192
#define PACKET_BUFFER_SIZE (PACKET_MAX * 2 + 2 + 8) // Worst case, every byte is a PACKET_FRAME. Add two for ending frame. Add 8 for worst case header and CRC. #define PACKET_BUFFER_SIZE (PACKET_MAX * 2 + 2 + 8) // Worst case, every byte is a PACKET_FRAME. Add two for ending frame. Add 8 for worst case header and CRC.
#define PACKET_FRAME 0x7e #define PACKET_FRAME 0x7e
@ -98,7 +97,7 @@ typedef struct PacketThreadDataS {
*/ */
uint8_t decodeBuffer[PACKET_MAX]; uint8_t decodeBuffer[PACKET_MAX];
uint8_t encodeBuffer[PACKET_BUFFER_SIZE]; uint8_t encodeBuffer[PACKET_BUFFER_SIZE];
uint8_t decodeQueue[PACKET_INPUT_QUEUE_SIZE]; uint8_t decodeQueue[PACKET_BUFFER_SIZE];
uint16_t decodeQueueHead; uint16_t decodeQueueHead;
uint16_t decodeQueueTail; uint16_t decodeQueueTail;
uint8_t inEscape; uint8_t inEscape;
@ -121,13 +120,13 @@ typedef void (*packetSender)(uint8_t *data, uint32_t length, void *userData);
uint8_t *packetContentPack(uint16_t *length, char *format, ...); uint8_t *packetContentPack(uint16_t *length, char *format, ...);
void packetContentUnpack(uint8_t *buffer, char *format, ...); void packetContentUnpack(uint8_t *buffer, char *format, ...);
void packetDebugPrint(uint8_t *data, uint16_t length);
uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeData, uint8_t *input, uint16_t inputLength); uint8_t packetDecode(PacketThreadDataT *threadData, PacketDecodeDataT *decodeData, uint8_t *input, uint16_t inputLength);
void packetDecodeDataDestroy(PacketDecodeDataT **packet); void packetDecodeDataDestroy(PacketDecodeDataT **packet);
void packetDecodeDataStaticDestroy(PacketDecodeDataT *packet); void packetDecodeDataStaticDestroy(PacketDecodeDataT *packet);
uint8_t packetEncode(PacketThreadDataT *threadData, PacketEncodeDataT *data, uint8_t *input, uint16_t length); uint8_t packetEncode(PacketThreadDataT *threadData, PacketEncodeDataT *data, uint8_t *input, uint16_t length);
uint8_t packetEncryptionReady(void); uint8_t packetEncryptionReady(void);
void packetEncryptionSetup(PacketThreadDataT *threadData); void packetEncryptionSetup(PacketThreadDataT *threadData);
void packetLog(char *message, uint8_t *packet, uint32_t length);
void packetSend(PacketThreadDataT *threadData, PacketEncodeDataT *data); void packetSend(PacketThreadDataT *threadData, PacketEncodeDataT *data);
void packetSenderRegister(packetSender sender); void packetSenderRegister(packetSender sender);
PacketThreadDataT *packetThreadDataCreate(void *senderData); PacketThreadDataT *packetThreadDataCreate(void *senderData);