Compare commits

..

No commits in common. "a5ce8b2319806c805fab0a3b353a9efd8fec6578" and "61f49ee46b56cdff6cfae929f7547b36de26f141" have entirely different histories.

78 changed files with 475 additions and 7625 deletions

1
.gitignore vendored
View File

@ -1 +0,0 @@
.pc/

View File

@ -970,7 +970,7 @@ ok:
UCHAR * data = &buffptr->Data[0];
STREAM->FramesQueued--;
txlen = (int)buffptr->Len;
STREAM->bytesTXed += txlen;
STREAM->BytesTXed += txlen;
bytes=SerialSendData(TNC, data, txlen);
WritetoTrace(TNC, data, txlen);

View File

@ -812,7 +812,7 @@ VOID AEAPoll(int Port)
{
// Limit amount in TX
if (TNC->Streams[0].bytesTXed - TNC->Streams[0].BytesAcked > 200)
if (TNC->Streams[0].BytesTXed - TNC->Streams[0].BytesAcked > 200)
continue;
// If in IRS state for too long, force turnround
@ -877,8 +877,8 @@ VOID AEAPoll(int Port)
EncodeAndSend(TNC, TXMsg, datalen + 1);
ReleaseBuffer(buffptr);
TNC->Streams[Stream].bytesTXed += datalen;
Debugprintf("Stream %d Sending %d, BytesTXED now %d", Stream, datalen, TNC->Streams[Stream].bytesTXed);
TNC->Streams[Stream].BytesTXed += datalen;
Debugprintf("Stream %d Sending %d, BytesTXED now %d", Stream, datalen, TNC->Streams[Stream].BytesTXed);
TNC->Timeout = 0;
TNC->DataBusy = TRUE;
@ -1212,7 +1212,7 @@ static VOID ProcessAEAPacket(struct TNCINFO * TNC, UCHAR * Msg, size_t Len)
// If nothing more to send, turn round link
if ((TNC->Streams[0].BPQtoPACTOR_Q == 0) && TNC->NeedTurnRound &&
(TNC->Streams[0].BytesAcked >= TNC->Streams[0].bytesTXed)) // Nothing following and all acked
(TNC->Streams[0].BytesAcked >= TNC->Streams[0].BytesTXed)) // Nothing following and all acked
{
Debugprintf("AEA Sent = Acked - sending Turnround");
@ -1247,7 +1247,7 @@ static VOID ProcessAEAPacket(struct TNCINFO * TNC, UCHAR * Msg, size_t Len)
Len--; // Remove Header
buffptr->Len = Len; // Length
TNC->Streams[Stream].bytesRXed += (int)Len;
TNC->Streams[Stream].BytesRXed += (int)Len;
memcpy(&buffptr->Data[0], Buffer, Len);
C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr);
@ -1418,7 +1418,7 @@ static VOID ProcessAEAPacket(struct TNCINFO * TNC, UCHAR * Msg, size_t Len)
Buffer[Len-2] = 0;
}
TNC->Streams[Stream].bytesRXed = TNC->Streams[Stream].bytesTXed = TNC->Streams[Stream].BytesAcked = 0;
TNC->Streams[Stream].BytesRXed = TNC->Streams[Stream].BytesTXed = TNC->Streams[Stream].BytesAcked = 0;
TNC->Streams[Stream].ConnectTime = time(NULL);
if (Stream == 0)

View File

@ -564,27 +564,9 @@ int AGWConnected(struct BPQConnectionInfo * Con, int Stream)
{
// Create Key
char callsign[10];
int port;
int sesstype;
int paclen;
int maxframe;
int l4window;
keyptr=(byte *)&Con->CallKey;
// Try using the BPQ Port Number if a L2 connect, first free port number if not
GetConnectionInfo(Stream, callsign,
&port, &sesstype, &paclen,
&maxframe, &l4window);
if (port == 0)
port = 64;
*(keyptr++)='0' + port;
*(keyptr++)='1';
memcpy(keyptr, ApplCall, 10);
keyptr+=10;
memcpy(keyptr,ConnectingCall, 10);
@ -704,9 +686,8 @@ int AGWDoMonitorData()
struct AGWSocketConnectionInfo * sockptr;
byte AGWBuffer[1000];
int n;
int Frametype;
int Stamp, Frametype;
BOOL RXFlag;
time_t Stamp;
// Look for Monitor Data
@ -727,7 +708,7 @@ int AGWDoMonitorData()
return 0;
}
Stamp = monbuff->Timestamp;
Stamp = (UINT)monbuff->Timestamp;
memcpy(Buffer, monbuff, RawLen);

View File

@ -69,7 +69,7 @@ static UCHAR * DISPLAYIPDATAGRAM(IPMSG * IP, UCHAR * Output, int MsgLen);
static UCHAR * DISPLAYARPDATAGRAM(UCHAR * Datagram, UCHAR * Output);
int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * FrameType, int useLocalTime, int DoNodes)
int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, int Stamp, int * FrameType, int useLocalTime, int DoNodes)
{
UCHAR * ptr;
int n;
@ -365,7 +365,7 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
}
if (Output == NULL)
return 0;
return NULL;
if (Output[-1] != 13)
Output += sprintf((char *)Output, "\r");

45
ARDOP.c
View File

@ -314,7 +314,7 @@ void SendARDOPorPacketData(struct TNCINFO * TNC, int Stream, UCHAR * Buff, int t
if (Stream == 0)
{
ARDOPSendData(TNC, Buff, txlen);
STREAM->bytesTXed += txlen;
STREAM->BytesTXed += txlen;
WritetoTrace(TNC, Buff, txlen);
}
else
@ -1274,7 +1274,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
UCHAR * data = &buffptr->Data[0];
STREAM->FramesQueued--;
txlen = (int)buffptr->Len;
STREAM->bytesTXed += txlen;
STREAM->BytesTXed += txlen;
if (Stream == 0)
{
@ -1381,7 +1381,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
{
bytes=ARDOPSendData(TNC, &buff->L2DATA[0], txlen);
TNC->Streams[Stream].BytesOutstanding += bytes; // So flow control works - will be updated by BUFFER response
STREAM->bytesTXed += bytes;
STREAM->BytesTXed += bytes;
WritetoTrace(TNC, &buff->L2DATA[0], txlen);
}
else
@ -1627,8 +1627,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
ARDOPChangeMYC(TNC, TNC->Streams[0].MyCall);
hookL4SessionAttempt(STREAM, &buff->L2DATA[2], TNC->Streams[0].MyCall);
// See if Busy
if (InterlockedCheckBusy(TNC))
@ -2265,7 +2263,7 @@ VOID TNCLost(struct TNCINFO * TNC)
if (Stream == 0)
{
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->bytesTXed - STREAM->BytesOutstanding, STREAM->bytesRXed, STREAM->BytesOutstanding);
STREAM->BytesTXed - STREAM->BytesOutstanding, STREAM->BytesRXed, STREAM->BytesOutstanding);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
}
@ -3065,7 +3063,7 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
}
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->bytesTXed - STREAM->BytesOutstanding, STREAM->bytesRXed, STREAM->BytesOutstanding);
STREAM->BytesTXed - STREAM->BytesOutstanding, STREAM->BytesRXed, STREAM->BytesOutstanding);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
return;
}
@ -3085,7 +3083,7 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
WritetoTrace(TNC, Buffer, MsgLen - 1);
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->PacketsSent = 0;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->PacketsSent = 0;
memcpy(Call, &Buffer[10], 10);
@ -3262,7 +3260,7 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
STREAM->NeedDisc = 100; // 10 secs
}
}
strcpy(STREAM->MyCall, TNC->TargetCall);
return;
}
else
@ -3349,13 +3347,29 @@ VOID ARDOPProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
WritetoTrace(TNC, Buffer, MsgLen - 1);
// Release Session
// Release Session3
if (TNC->Streams[0].Connected)
{
// Create a traffic record
hookL4SessionDeleted(TNC, STREAM);
char logmsg[120];
time_t Duration;
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1;
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
STREAM->ConnectTime = 0; // Prevent retrigger
}
@ -3836,12 +3850,13 @@ VOID ARDOPProcessDataPacket(struct TNCINFO * TNC, UCHAR * Type, UCHAR * Data, in
return;
}
STREAM->bytesRXed += Length;
STREAM->BytesRXed += Length;
Data[Length] = 0;
Debugprintf("ARDOP: RXD %d bytes", Length);
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->bytesTXed - STREAM->BytesOutstanding, STREAM->bytesRXed, STREAM->BytesOutstanding);
STREAM->BytesTXed - STREAM->BytesOutstanding, STREAM->BytesRXed, STREAM->BytesOutstanding);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
@ -3944,8 +3959,6 @@ VOID ARDOPProcessDataPacket(struct TNCINFO * TNC, UCHAR * Type, UCHAR * Data, in
BPQTRACE((MESSAGE *)buffptr, TRUE);
ReleaseBuffer(buffptr);
}
else
{
@ -4990,7 +5003,7 @@ tcpHostFrame:
WritetoTrace(TNC, Buffer, len);
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->PacketsSent = 0;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->PacketsSent = 0;
memcpy(Call, &Buffer[19], 10);
ptr = strchr(Call, ' ');

View File

@ -116,7 +116,7 @@ int SendWebMailHeader(char * Reply, char * Key, struct HTTPConnectionInfo * Sess
struct UserInfo * FindBBS(char * Name);
void ReleaseWebMailStruct(WebMailInfo * WebMail);
VOID TidyWelcomeMsg(char ** pPrompt);
int MailAPIProcessHTTPMessage(struct HTTPConnectionInfo * Session, char * response, char * Method, char * URL, char * request, BOOL LOCAL, char * Param, char * Token);
int MailAPIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, char * Param);
char UNC[] = "";
char CHKD[] = "checked=checked ";
@ -447,7 +447,7 @@ void ConvertTitletoUTF8(WebMailInfo * WebMail, char * Title, char * UTF8Title, i
BOOL GotFirstMessage = 0;
void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen, char * Token)
void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen)
{
char * Context = 0, * NodeURL;
int ReplyLen;
@ -477,13 +477,6 @@ void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method,
}
if (_memicmp(URL, "/Mail/API/v1/", 13) == 0)
{
*RLen = MailAPIProcessHTTPMessage(Session, Reply, Method, URL, input, LOCAL, Context, Token);
return;
}
// There is a problem if Mail is reloaded without reloading the node
if (GotFirstMessage == 0)
@ -501,6 +494,12 @@ void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method,
return;
}
if (_memicmp(URL, "/Mail/API/", 10) == 0)
{
*RLen = MailAPIProcessHTTPMessage(Reply, Method, URL, input, LOCAL, Context);
return;
}
if (strcmp(Method, "POST") == 0)
{
@ -2997,8 +2996,6 @@ int ProcessWebmailWebSock(char * MsgPtr, char * OutBuffer);
static char PipeFileName[] = "\\\\.\\pipe\\BPQMailWebPipe";
// Constants
static DWORD WINAPI InstanceThread(LPVOID lpvParam)
// This routine is a thread processing function to read from and reply to a client
@ -3019,7 +3016,6 @@ static DWORD WINAPI InstanceThread(LPVOID lpvParam)
char URL[100001];
char * Context, * Method;
int n;
char token[16]= "";
char * ptr;
@ -3055,33 +3051,8 @@ static DWORD WINAPI InstanceThread(LPVOID lpvParam)
}
else
{
// look for auth header
const char * auth_header = "Authorization: Bearer ";
char * token_begin = strstr(MsgPtr, auth_header);
int Flags = 0, n;
// Node Flags isn't currently used
char * Tok;
char * param;
if (token_begin)
{
// Using Auth Header
// Extract the token from the request (assuming it's present in the request headers)
token_begin += strlen(auth_header); // Move to the beginning of the token
strncpy(token, token_begin, 13);
token[13] = '\0'; // Null-terminate the token
}
}
strcpy(URL, MsgPtr);
ptr = strstr(URL, " HTTP");
if (ptr)
@ -3089,8 +3060,8 @@ static DWORD WINAPI InstanceThread(LPVOID lpvParam)
Method = strtok_s(URL, " ", &Context);
ProcessMailHTTPMessage(&Session, Method, Context, MsgPtr, OutBuffer, &OutputLen, InputLen, token);
ProcessMailHTTPMessage(&Session, Method, Context, MsgPtr, OutBuffer, &OutputLen, InputLen);
}
WriteFile(hPipe, &Session, sizeof (struct HTTPConnectionInfo), &n, NULL);
WriteFile(hPipe, OutBuffer, OutputLen, &cbWritten, NULL);

View File

@ -269,8 +269,6 @@ char FilesNames[4][100] = {"", "", "", ""};
char * Logs[4] = {"BBS", "CHAT", "TCP", "DEBUG"};
extern struct SEM ConfigSEM;
BOOL OpenLogfile(int Flags)
{
@ -2211,7 +2209,7 @@ BOOL CheckValidCall(char * From)
if (DontCheckFromCall)
return TRUE;
if (strcmp(From, "SYSOP") == 0 || strcmp(From, "SYSTEM") == 0 || strcmp(From, "SERVIC") == 0 ||
if (strcmp(From, "SYSOP") == 0 || strcmp(From, "SYSTEM") == 0 ||
strcmp(From, "IMPORT") == 0 || strcmp(From, "SMTP:") == 0 || strcmp(From, "RMS:") == 0)
return TRUE;
@ -8138,15 +8136,6 @@ BOOL ProcessBBSConnectScript(CIRCUIT * conn, char * Buffer, int len)
Line = Scripts[n];
}
if (Line == NULL)
{
// No more lines - Disconnect
conn->BBSFlags &= ~RunningConnectScript; // so it doesn't get reentered
Disconnect(conn->BPQStream);
return FALSE;
}
if (_memicmp(Line, "TIMES", 5) == 0)
{
NextBand:
@ -9534,8 +9523,6 @@ VOID SaveConfig(char * ConfigName)
FBBFilter * p = Filters;
char * ptr = FBBString;
GetSemaphore(&ConfigSEM, 60);
if (configSaved == 0)
{
// only create backup once per run
@ -9962,7 +9949,6 @@ VOID SaveConfig(char * ConfigName)
{
print("Error while writing file.\n");
config_destroy(&cfg);
FreeSemaphore(&ConfigSEM);
return;
}
@ -9974,8 +9960,6 @@ VOID SaveConfig(char * ConfigName)
{
fprintf(stderr, "Error while writing file.\n");
config_destroy(&cfg);
FreeSemaphore(&ConfigSEM);
return;
}
@ -10004,8 +9988,6 @@ VOID SaveConfig(char * ConfigName)
}
#endif
*/
FreeSemaphore(&ConfigSEM);
}
int GetIntValue(config_setting_t * group, char * name)

View File

@ -1140,8 +1140,6 @@
// Rewrite PG server code on Lunux (41)
// Fix SendPToMultiple not stopping at Implied AT match (45)
// Log Our HA when checking for flood bulls (45)
// Semaphore calls to SaveConfig
// Include SERVIC as valid from call (for Winlink Service messages) (49)
#include "bpqmail.h"
#include "winstdint.h"
@ -1394,7 +1392,7 @@ DWORD Stack[16];
BOOL Restarting = FALSE;
void Dump_Process_State(struct _EXCEPTION_POINTERS * exinfo, char * Msg)
Dump_Process_State(struct _EXCEPTION_POINTERS * exinfo, char * Msg)
{
unsigned int SPPtr;
unsigned int SPVal;

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1227,12 +1227,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Allow interlocking of KISS and Session mode ports (eg ARDOP and VARA) (45)
// Add ARDOP UI Packets to MH (45)
// Add support for Qtsm Mgmt Interface (45)
// NodeAPI improvements (46)
// Add MQTT Interface (46)
// Fix buffer leak in ARDOP code(46)
// Fix possible crash if MQTT not in use (47)
// Add optional ATTACH time limit for VARA (48)
// API format fixes (48)
#define CKernel

View File

@ -20,7 +20,7 @@
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="C:\Dev\Msdev2005\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
OutputDirectory="d:\devprogs\bpq32"
IntermediateDirectory="C:\Dev\Msdev2005\Intermed\$(SolutionName)\$(ProjectName)\$(ConfigurationName)"
ConfigurationType="2"
CharacterSet="0"
@ -50,7 +50,7 @@
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\CInclude;..\CommonSource;..\CKernel"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;BPQ32_EXPORTS;MDIKERNEL;_USE_32BIT_TIME_T;BPQ32;NOMQTT"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;BPQ32_EXPORTS;MDIKERNEL;_USE_32BIT_TIME_T;BPQ32"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@ -159,7 +159,7 @@
Optimization="0"
WholeProgramOptimization="false"
AdditionalIncludeDirectories="..\CInclude;..\CommonSource;..\CKernel"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;BPQ32_EXPORTS;MDIKERNEL;_USE_32BIT_TIME_T;NOMQTT"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;BPQ32_EXPORTS;MDIKERNEL;_USE_32BIT_TIME_T"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
AssemblerOutput="2"
@ -438,18 +438,6 @@
RelativePath="..\CommonSource\Moncode.c"
>
</File>
<File
RelativePath=".\mqtt.c"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
CompileAs="1"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\CommonSource\MULTIPSK.c"
>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="C:\Devprogs\BPQ32\bpq32.exe"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command=""
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="C:\Devprogs\BPQ32\bpq32.exe"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command=""
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -153,7 +153,6 @@ int APIENTRY Reboot();
int APIENTRY Reconfig();
Dll int APIENTRY SaveNodes ();
struct SEM;
void GetSemaphore(struct SEM * Semaphore, int ID);
@ -252,7 +251,6 @@ extern UCHAR MYCALLWITHALIAS[13];
extern APPLCALLS APPLCALLTABLE[NumberofAppls];
extern UCHAR MYNODECALL[]; // NODE CALLSIGN (ASCII)
extern char NODECALLLOPPED[]; // NODE CALLSIGN (ASCII). Null terminated
extern UCHAR MYNETROMCALL[]; // NETROM CALLSIGN (ASCII)
extern UCHAR NETROMCALL[]; // NETORM CALL (AX25)
@ -429,19 +427,4 @@ extern char Message[MaxBPQPortNo + 1][1000]; // Beacon Text
extern int MinCounter[MaxBPQPortNo + 1]; // Interval Countdown
extern BOOL SendFromFile[MaxBPQPortNo + 1];
extern BOOL MQTT;
extern char MQTT_HOST[80];
extern int MQTT_PORT;
extern char MQTT_USER[80];
extern char MQTT_PASS[80];
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK);
void hookL2SessionDeleted(struct _LINKTABLE * LINK);
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK);
void hookL4SessionAttempt(void * STREAM, char * remotecall, char * ourcall);
void hookL4SessionAccepted(void * STREAM, char * remotecall, char * ourcall);
void hookL4SessionDeleted(struct TNCINFO * TNC, void * STREAM);

6
Cmd.c
View File

@ -2838,6 +2838,12 @@ noFlip3:
RESET2(LINK); // RESET ALL FLAGS
toCall[ConvFromAX25(LINK->LINKCALL, toCall)] = 0;
fromCall[ConvFromAX25(LINK->OURCALL, fromCall)] = 0;
hookL2SessionAttempt(CONNECTPORT, fromCall, toCall, LINK);
if (CMD->String[0] == 'N' && SUPPORT2point2)
LINK->L2STATE = 1; // New (2.2) send XID
else

View File

@ -28,7 +28,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mqtt.h"
#pragma data_seg("_BPQDATA")
@ -736,7 +735,22 @@ VOID CheckForDetach(struct TNCINFO * TNC, int Stream, struct STREAMINFO * STREAM
// Create a traffic record
hookL4SessionDeleted(TNC, STREAM);
if (STREAM->Connected && STREAM->ConnectTime)
{
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1; // Or will get divide by zero error
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
STREAM->ConnectTime = 0;
}
if (STREAM->BPQtoPACTOR_Q) // Still data to send?
return; // Will close when all acked
@ -906,7 +920,6 @@ BOOL ProcessIncommingConnectEx(struct TNCINFO * TNC, char * Call, int Stream, BO
int Totallen = 0;
UCHAR * ptr;
struct PORTCONTROL * PORT = (struct PORTCONTROL *)TNC->PortRecord;
struct STREAMINFO * STREAM = &TNC->Streams[Stream];
// Stop Scanner
@ -939,11 +952,7 @@ BOOL ProcessIncommingConnectEx(struct TNCINFO * TNC, char * Call, int Stream, BO
memset(Session, 0, sizeof(TRANSPORTENTRY));
memcpy(STREAM->RemoteCall, Call, 9); // Save Text Callsign
// May be subsequently rejected but a good place to capture calls
hookL4SessionAccepted(STREAM, Call, TNC->TargetCall);
memcpy(TNC->Streams[Stream].RemoteCall, Call, 9); // Save Text Callsign
if (AllowTR)
ConvToAX25Ex(Call, Session->L4USER); // Allow -T and -R SSID's for MPS
@ -956,7 +965,7 @@ BOOL ProcessIncommingConnectEx(struct TNCINFO * TNC, char * Call, int Stream, BO
if (NEXTID == 0) NEXTID++; // Keep non-zero
TNC->PortRecord->ATTACHEDSESSIONS[Stream] = Session;
STREAM->Attached = TRUE;
TNC->Streams[Stream].Attached = TRUE;
Session->L4TARGET.EXTPORT = TNC->PortRecord;
@ -967,7 +976,7 @@ BOOL ProcessIncommingConnectEx(struct TNCINFO * TNC, char * Call, int Stream, BO
Session->SESSPACLEN = TNC->PortRecord->PORTCONTROL.PORTPACLEN;
Session->KAMSESSION = Stream;
STREAM->Connected = TRUE; // Subsequent data to data channel
TNC->Streams[Stream].Connected = TRUE; // Subsequent data to data channel
if (LogAllConnects)
{
@ -3707,11 +3716,6 @@ VOID OpenReportingSockets()
Chatreportdest.sin_port = htons(81);
_beginthread(ResolveUpdateThread, 0, NULL);
printf("MQTT Enabled %d\n", MQTT);
if (MQTT)
MQTTConnect(MQTT_HOST, MQTT_PORT, MQTT_USER, MQTT_PASS);
}
VOID WriteMiniDumpThread();

118
Events.c
View File

@ -23,8 +23,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "compatbits.h"
#include <string.h>
#include "asmstrucs.h"
#include "tncinfo.h"
VOID __cdecl Debugprintf(const char * format, ...);
@ -39,11 +37,6 @@ VOID __cdecl Debugprintf(const char * format, ...);
#endif
extern BOOL EventsEnabled;
void MQTTReportSession(char * Msg);
extern int MQTT;
extern char Modenames[19][10];
// Runs use specified routine on certain event
#ifndef WIN32
@ -117,122 +110,13 @@ DllExport void APIENTRY RunEventProgram(char * Program, char * Param)
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK)
{
// Incoming SABM
LINK->ConnectTime = time(NULL);
LINK->bytesTXed = LINK->bytesRXed = 0;
strcpy(LINK->callingCall, remotecall);
strcpy(LINK->receivingCall, ourcall);
strcpy(LINK->Direction, "In");
}
void hookL2SessionDeleted(struct _LINKTABLE * LINK)
void hookL2SessionDeleted(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK)
{
// calculate session time and av bytes/min in and out
if (LINK->ConnectTime)
{
if (LINK->bytesTXed == 0 && LINK->bytesRXed == 0)
{
// assume failed connect and ignore for now - maybe log later
}
else
{
char Msg[256];
char timestamp[16];
time_t sessionTime = time(NULL) - LINK->ConnectTime;
double avBytesSent = LINK->bytesTXed / (sessionTime / 60.0);
double avBytesRXed = LINK->bytesRXed / (sessionTime / 60.0);
time_t Now = time(NULL);
struct tm * TM = localtime(&Now);
sprintf(timestamp, "%02d:%02d:%02d", TM->tm_hour, TM->tm_min, TM->tm_sec);
if (sessionTime == 0)
sessionTime = 1; // Or will get divide by zero error
Debugprintf("KISS Session Stats Port %d %s %s %d secs Bytes Sent %d BPM %4.2f Bytes Received %d %4.2f BPM ",
LINK->LINKPORT->PORTNUMBER, LINK->callingCall, LINK->receivingCall, sessionTime, LINK->bytesTXed, avBytesSent, LINK->bytesRXed, avBytesRXed, timestamp);
sprintf(Msg, "{\"mode\": \"%s\", \"direction\": \"%s\", \"port\": %d, \"callfrom\": \"%s\", \"callto\": \"%s\", \"time\": %d, \"bytesSent\": %d,"
"\"BPMSent\": %4.2f, \"BytesReceived\": %d, \"BPMReceived\": %4.2f, \"timestamp\": \"%s\"}",
"KISS", LINK->Direction, LINK->LINKPORT->PORTNUMBER, LINK->callingCall, LINK->receivingCall, sessionTime,
LINK->bytesTXed, avBytesSent, LINK->bytesRXed, avBytesRXed, timestamp);
if (MQTT)
MQTTReportSession(Msg);
}
LINK->ConnectTime = 0;
}
}
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK)
{
LINK->ConnectTime = time(NULL);
LINK->bytesTXed = LINK->bytesRXed = 0;
strcpy(LINK->callingCall, ourcall);
strcpy(LINK->receivingCall, remotecall);
strcpy(LINK->Direction, "Out");
}
void hookL4SessionAttempt(struct STREAMINFO * STREAM, char * remotecall, char * ourcall)
{
// Outgoing Connect
STREAM->ConnectTime = time(NULL);
STREAM->bytesTXed = STREAM->bytesRXed = 0;
strcpy(STREAM->callingCall, ourcall);
strcpy(STREAM->receivingCall, remotecall);
strcpy(STREAM->Direction, "Out");
}
void hookL4SessionAccepted(struct STREAMINFO * STREAM, char * remotecall, char * ourcall)
{
// Incoming Connect
STREAM->ConnectTime = time(NULL);
STREAM->bytesTXed = STREAM->bytesRXed = 0;
strcpy(STREAM->callingCall, remotecall);
strcpy(STREAM->receivingCall, ourcall);
strcpy(STREAM->Direction, "In");
}
void hookL4SessionDeleted(struct TNCINFO * TNC, struct STREAMINFO * STREAM)
{
char Msg[256];
char timestamp[16];
if (STREAM->ConnectTime)
{
time_t sessionTime = time(NULL) - STREAM->ConnectTime;
double avBytesRXed = STREAM->bytesRXed / (sessionTime / 60.0);
double avBytesSent = STREAM->bytesTXed / (sessionTime / 60.0);
time_t Now = time(NULL);
struct tm * TM = localtime(&Now);
sprintf(timestamp, "%02d:%02d:%02d", TM->tm_hour, TM->tm_min, TM->tm_sec);
if (sessionTime == 0)
sessionTime = 1; // Or will get divide by zero error
sprintf(Msg, "{\"mode\": \"%s\", \"direction\": \"%s\", \"port\": %d, \"callfrom\": \"%s\", \"callto\": \"%s\", \"time\": %d, \"bytesSent\": %d,"
"\"BPMSent\": %4.2f, \"BytesReceived\": %d, \"BPMReceived\": %4.2f, \"timestamp\": \"%s\"}",
Modenames[TNC->Hardware - 1], STREAM->Direction, TNC->Port, STREAM->callingCall, STREAM->receivingCall, sessionTime,
STREAM->bytesTXed, avBytesSent, STREAM->bytesRXed, avBytesRXed, timestamp);
if (MQTT)
MQTTReportSession(Msg);
STREAM->ConnectTime = 0;
}
}

View File

@ -1637,7 +1637,7 @@ static VOID ConnecttoFLDigiThread(void * portptr)
VOID UpdateStatsLine(struct TNCINFO * TNC, struct STREAMINFO * STREAM)
{
sprintf(TNC->WEB_TRAFFIC, "RX %d TX %d ACKED %d Resent %d Queued %d",
STREAM->bytesRXed, STREAM->bytesTXed, STREAM->BytesAcked, STREAM->BytesResent, STREAM->BytesOutstanding);
STREAM->BytesRXed, STREAM->BytesTXed, STREAM->BytesAcked, STREAM->BytesResent, STREAM->BytesOutstanding);
SetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
}
@ -2531,7 +2531,7 @@ VOID ProcessFLDigiData(struct TNCINFO * TNC, UCHAR * Input, int Len, char Channe
strcpy(STREAM->MyCall, call2);
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->BytesAcked = STREAM->BytesResent = 0;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->BytesAcked = STREAM->BytesResent = 0;
if (TNC->RIG && TNC->RIG != &TNC->DummyRig && strcmp(TNC->RIG->RigName, "PTT"))
{
@ -2690,7 +2690,7 @@ AckConnectRequest:
goto SendKReply; // Repeated ACK
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->BytesAcked = STREAM->BytesResent = 0;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->BytesAcked = STREAM->BytesResent = 0;
STREAM->Connected = TRUE;
ARQ->ARQTimerState = 0;
@ -2951,7 +2951,22 @@ SendKReply:
if (STREAM->Connected)
{
hookL4SessionDeleted(TNC, STREAM);
// Create a traffic record
char logmsg[120];
time_t Duration;
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1;
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
}
STREAM->Connecting = FALSE;
@ -3014,7 +3029,7 @@ SendKReply:
buffptr->Len = Len;
memcpy(buffptr->Data, &Input[1], Len);
STREAM->bytesRXed += Len;
STREAM->BytesRXed += Len;
UpdateStatsLine(TNC, STREAM);
@ -3131,7 +3146,7 @@ VOID SendARQData(struct TNCINFO * TNC, PMSGWITHLEN Buffer)
ARQ->TXHOLDQ[ARQ->TXSeq] = Buffer;
STREAM->bytesTXed += Origlen;
STREAM->BytesTXed += Origlen;
UpdateStatsLine(TNC, STREAM);

View File

@ -971,7 +971,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
memset(STREAM->RemoteCall, 0, 10);
strcpy(STREAM->RemoteCall, &buff->L2DATA[2]);
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->PacketsSent = 0;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->PacketsSent = 0;
sprintf(TNC->WEB_TNCSTATE, "%s Connecting to %s", STREAM->MyCall, STREAM->RemoteCall);
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
@ -1950,7 +1950,7 @@ VOID FreeDataProcessTNCMessage(struct TNCINFO * TNC, char * Call, unsigned char
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->PacketsSent = 0;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->PacketsSent = 0;
STREAM->Connected = TRUE;
// Send Connect ACK
@ -2019,7 +2019,20 @@ VOID FreeDataProcessTNCMessage(struct TNCINFO * TNC, char * Call, unsigned char
{
// Create a traffic record
hookL4SessionDeleted(TNC, STREAM);
char logmsg[120];
time_t Duration;
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1;
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
}
STREAM->Connected = FALSE; // Back to Command Mode
@ -2049,7 +2062,7 @@ VOID FreeDataProcessTNCMessage(struct TNCINFO * TNC, char * Call, unsigned char
WritetoTrace(TNC, Msg, 256);
Len -= 256;
Msg += 256;
STREAM->bytesRXed += 256;
STREAM->BytesRXed += 256;
}
@ -2058,9 +2071,9 @@ VOID FreeDataProcessTNCMessage(struct TNCINFO * TNC, char * Call, unsigned char
memcpy(buffptr->Data, Msg, Len);
C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr);
WritetoTrace(TNC, Msg, Len);
STREAM->bytesRXed += Len;
STREAM->BytesRXed += Len;
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->bytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->bytesRXed, TNC->FreeDataInfo->toSendCount);
STREAM->BytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->BytesRXed, TNC->FreeDataInfo->toSendCount);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
return;
@ -2313,7 +2326,7 @@ VOID FreeDataProcessNewConnect(struct TNCINFO * TNC, char * fromCall, char * toC
MySetWindowText(TNC->xIDC_TNCSTATE, TNC->WEB_TNCSTATE);
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->PacketsSent = 0;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->PacketsSent = 0;
STREAM->Connected = TRUE;
return;
@ -2413,7 +2426,7 @@ void FlushData(struct TNCINFO * TNC)
Info->toSendTimeout = 0;
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->bytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->bytesRXed, TNC->FreeDataInfo->toSendCount);
STREAM->BytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->BytesRXed, TNC->FreeDataInfo->toSendCount);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
}
@ -2436,10 +2449,10 @@ static int SendAsFile(struct TNCINFO * TNC, char * Call, char * Msg, int Len)
Info->toSendCount += Len;
Info->toSendTimeout = 10; // About a second
STREAM->bytesTXed += Len;
STREAM->BytesTXed += Len;
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->bytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->bytesRXed, TNC->FreeDataInfo->toSendCount);
STREAM->BytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->BytesRXed, TNC->FreeDataInfo->toSendCount);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
return Len;
@ -2706,7 +2719,7 @@ void ProcessMessageObject(struct TNCINFO * TNC, char * This)
WritetoTrace(TNC, Line, 256);
Len -= 256;
Line += 256;
STREAM->bytesRXed += 256;
STREAM->BytesRXed += 256;
}
buffptr = GetBuff();
@ -2714,12 +2727,12 @@ void ProcessMessageObject(struct TNCINFO * TNC, char * This)
memcpy(buffptr->Data, Line, Len);
C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr);
WritetoTrace(TNC, Line, Len);
STREAM->bytesRXed += Len;
STREAM->BytesRXed += Len;
}
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->bytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->bytesRXed, TNC->FreeDataInfo->toSendCount);
STREAM->BytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->BytesRXed, TNC->FreeDataInfo->toSendCount);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
}
return;
@ -2798,7 +2811,7 @@ void ProcessMessageObject(struct TNCINFO * TNC, char * This)
WritetoTrace(TNC, Line, 256);
Len -= 256;
TEXT += 256;
STREAM->bytesRXed += 256;
STREAM->BytesRXed += 256;
}
buffptr = GetBuff();
@ -2806,14 +2819,14 @@ void ProcessMessageObject(struct TNCINFO * TNC, char * This)
memcpy(buffptr->Data, Line, Len);
C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr);
WritetoTrace(TNC, Line, Len);
STREAM->bytesRXed += Len;
STREAM->BytesRXed += Len;
TEXT = rest;
rest = strlop(TEXT, 10); // FreeData chat ues LF
}
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->bytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->bytesRXed, TNC->FreeDataInfo->toSendCount);
STREAM->BytesTXed - TNC->FreeDataInfo->toSendCount, STREAM->BytesRXed, TNC->FreeDataInfo->toSendCount);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
}
}
@ -3145,8 +3158,22 @@ void ProcessTNCJSON(struct TNCINFO * TNC, char * Msg, int Len)
if (STREAM->Connected)
{
// Create a traffic record
hookL4SessionDeleted(TNC, STREAM);
char logmsg[120];
time_t Duration;
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1;
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
STREAM->Connected = FALSE; // Back to Command Mode
STREAM->ReportDISC = TRUE; // Tell Node
@ -3324,7 +3351,20 @@ void ProcessTNCJSON(struct TNCINFO * TNC, char * Msg, int Len)
{
// Create a traffic record
hookL4SessionDeleted(TNC, STREAM);
char logmsg[120];
time_t Duration;
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1;
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
STREAM->Connected = FALSE; // Back to Command Mode
STREAM->ReportDISC = TRUE; // Tell Node

View File

@ -749,7 +749,7 @@ VOID HALPoll(int Port)
STREAM->Attached = TRUE;
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->BytesAcked = 0;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->BytesAcked = 0;
calllen = ConvFromAX25(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4USER, STREAM->MyCall);
STREAM->MyCall[calllen] = 0;
@ -829,7 +829,7 @@ VOID HALPoll(int Port)
//for (Stream = 0; Stream <= MaxStreams; Stream++)
{
if (TNC->TNCOK && STREAM->BPQtoPACTOR_Q && (STREAM->bytesTXed - STREAM->BytesAcked < 600))
if (TNC->TNCOK && STREAM->BPQtoPACTOR_Q && (STREAM->BytesTXed - STREAM->BytesAcked < 600))
{
int datalen;
PMSGWITHLEN buffptr;
@ -872,7 +872,7 @@ VOID HALPoll(int Port)
ReleaseBuffer(buffptr);
WriteLogLine(2, MsgPtr, datalen);
STREAM->bytesTXed += datalen;
STREAM->BytesTXed += datalen;
STREAM->FramesQueued--;
ShowTraffic(TNC);
@ -1090,10 +1090,10 @@ VOID ProcessHALData(struct TNCINFO * TNC)
STREAM->BytesAcked += Len;
// Debugprintf("Acked %d", Len);
if (STREAM->BytesAcked > STREAM->bytesTXed)
if (STREAM->BytesAcked > STREAM->BytesTXed)
Debugprintf("Too Much Acked");
if ((STREAM->BPQtoPACTOR_Q == 0) && STREAM->BytesAcked >= STREAM->bytesTXed)
if ((STREAM->BPQtoPACTOR_Q == 0) && STREAM->BytesAcked >= STREAM->BytesTXed)
{
// All sent
@ -1121,7 +1121,7 @@ VOID ProcessHALData(struct TNCINFO * TNC)
WriteLogLine(1, TNC->DataBuffer, Len);
STREAM->bytesRXed += Len;
STREAM->BytesRXed += Len;
memcpy(buffptr->Data, TNC->DataBuffer, Len);
@ -1756,7 +1756,7 @@ BOOL HALConnected(struct TNCINFO * TNC, char * Call)
strcpy(CallCopy, Call);
strcat(CallCopy, " "); // Some routines expect 10 char calls
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->BytesAcked = 0;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->BytesAcked = 0;
STREAM->ConnectTime = time(NULL);
// Stop Scanner
@ -1804,7 +1804,7 @@ BOOL HALConnected(struct TNCINFO * TNC, char * Call)
EncodeAndSend(TNC, CTEXTMSG, CTEXTLEN);
WriteLogLine(2, CTEXTMSG, CTEXTLEN);
STREAM->bytesTXed += CTEXTLEN;
STREAM->BytesTXed += CTEXTLEN;
}
return TRUE;
}

View File

@ -1602,7 +1602,7 @@ VOID ShowTraffic(struct TNCINFO * TNC)
char Status[80];
sprintf(Status, "RX %d TX %d ACKED %d ",
TNC->Streams[0].bytesRXed, TNC->Streams[0].bytesTXed, TNC->Streams[0].BytesAcked);
TNC->Streams[0].BytesRXed, TNC->Streams[0].BytesTXed, TNC->Streams[0].BytesAcked);
#ifndef LINBPQ
SetDlgItemText(TNC->hDlg, IDC_TRAFFIC, Status);
#endif

View File

@ -589,7 +589,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
UCHAR * data = &buffptr->Data[0];
STREAM->FramesQueued--;
txlen = (int)buffptr->Len;
STREAM->bytesTXed += txlen;
STREAM->BytesTXed += txlen;
bytes=HSMODEMSendData(TNC, data, txlen);
WritetoTrace(TNC, data, txlen);
@ -668,7 +668,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
bytes=HSMODEMSendData(TNC, TXMsg, txlen);
TNC->Streams[Stream].BytesOutstanding += bytes; // So flow control works - will be updated by BUFFER response
STREAM->bytesTXed += bytes;
STREAM->BytesTXed += bytes;
// WritetoTrace(TNC, &buff->L2DATA[0], txlen);
return 1;

View File

@ -106,13 +106,12 @@ char * strlop(char * buf, char delim);
VOID sendandcheck(SOCKET sock, const char * Buffer, int Len);
int CompareNode(const void *a, const void *b);
int CompareAlias(const void *a, const void *b);
void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen, char * Token);
void ProcessMailHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen, int InputLen);
void ProcessChatHTTPMessage(struct HTTPConnectionInfo * Session, char * Method, char * URL, char * input, char * Reply, int * RLen);
struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
int SetupNodeMenu(char * Buff, int SYSOP);
int StatusProc(char * Buff);
int ProcessMailSignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char * Reply, struct HTTPConnectionInfo ** Session, BOOL WebMail, int LOCAL);
int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char * Reply, struct HTTPConnectionInfo ** Session, BOOL WebMail, int LOCAL);
int ProcessChatSignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char * Reply, struct HTTPConnectionInfo ** Session, int LOCAL);
VOID APRSProcessHTTPMessage(SOCKET sock, char * MsgPtr, BOOL LOCAL, BOOL COOKIE);
@ -1168,9 +1167,6 @@ int SendMessageFile(SOCKET sock, char * FN, BOOL OnlyifExists, int allowDeflate)
if (_stricmp(ptr, "js") == 0)
strcpy(Type, "Content-Type: text/javascript\r\n");
if (_stricmp(ptr, "css") == 0)
strcpy(Type, "Content-Type: text/css\r\n");
if (_stricmp(ptr, "pdf") == 0)
strcpy(Type, "Content-Type: application/pdf\r\n");
@ -1184,8 +1180,7 @@ int SendMessageFile(SOCKET sock, char * FN, BOOL OnlyifExists, int allowDeflate)
Compressed = MsgBytes;
}
if (_stricmp(ptr, "jpg") == 0 || _stricmp(ptr, "jpeg") == 0 || _stricmp(ptr, "png") == 0 ||
_stricmp(ptr, "gif") == 0 || _stricmp(ptr, "bmp") == 0 || _stricmp(ptr, "ico") == 0)
if (_stricmp(ptr, "jpg") == 0 || _stricmp(ptr, "jpeg") == 0 || _stricmp(ptr, "png") == 0 || _stricmp(ptr, "gif") == 0 || _stricmp(ptr, "ico") == 0)
strcpy(Type, "Content-Type: image\r\n");
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\n"
@ -1798,28 +1793,6 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn)
if (_memicmp(Context, "/api/", 5) == 0 || _stricmp(Context, "/api") == 0)
{
char * Compressed;
// if for mail api process signon here and rearrange url from
// api/v1/mail to mail/api/v1 so it goes to mail handler later
if (_memicmp(Context, "/api/v1/mail/", 13) == 0)
{
memcpy(MsgPtr, "GET /mail/api/v1/", 17);
if (memcmp(&Context[13], "login", 5) == 0)
{
ReplyLen = ProcessMailAPISignon(TCP, MsgPtr, "M", Reply, &Session, FALSE, LOCAL);
memcpy(MsgPtr, "GET /mail/api/v1/", 17);
if (ReplyLen) // Error message
goto Returnit;
}
memcpy(Context, "/mail/api/v1/", 13);
goto doHeader;
}
else
{
ReplyLen = APIProcessHTTPMessage(_REPLYBUFFER, Method, Context, MsgPtr, LOCAL, COOKIE);
if (memcmp(_REPLYBUFFER, "HTTP", 4) == 0)
@ -1840,7 +1813,6 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn)
"Content-Length: %d\r\n"
"Content-Type: application/json\r\n"
"Connection: close\r\n"
"Access-Control-Allow-Origin: *\r\n"
"%s\r\n", ReplyLen, Encoding);
sendandcheck(sock, Header, HeaderLen);
@ -1851,7 +1823,7 @@ int InnerProcessHTTPMessage(struct ConnectionInfo * conn)
return 0;
}
}
// APRS process internally
@ -2123,7 +2095,11 @@ Returnit:
Compressed = Reply;
if (NodeURL && _memicmp(NodeURL, "/mail/api/", 10) == 0)
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\nContent-Type: application/json\r\nConnection: close\r\n%s\r\n", ReplyLen, Encoding);
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\n"
"Content-Length: %d\r\n"
"Content-Type: application/json\r\n"
"Connection: close\r\n"
"%s\r\n", ReplyLen, Encoding);
else
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\nContent-Type: text/html\r\n%s\r\n", ReplyLen, Encoding);
@ -2146,82 +2122,15 @@ doHeader:
char _REPLYBUFFER[250000];
struct HTTPConnectionInfo Dummy = {0};
int Sent, Loops = 0;
char token[16] = "";
// look for auth header
const char * auth_header = "Authorization: Bearer ";
char * token_begin = strstr(MsgPtr, auth_header);
int Flags = 0, n;
char * Tok;
char * param;
if (token_begin)
{
// Using Auth Header
// Extract the token from the request (assuming it's present in the request headers)
token_begin += strlen(auth_header); // Move to the beginning of the token
strncpy(token, token_begin, 13);
token[13] = '\0'; // Null-terminate the token
}
ReplyLen = 0;
if (Session == 0)
Session = &Dummy;
if (LOCAL)
Session->TNC = (void *)1; // TNC only used for Web Terminal Sessions
else
Session->TNC = (void *)0;
Session->TNC = (void *)LOCAL; // TNC only used for Web Terminal Sessions
ProcessMailHTTPMessage(Session, Method, Context, MsgPtr, _REPLYBUFFER, &ReplyLen, MsgLen, token);
if (Context && _memicmp(Context, "/mail/api/", 10) == 0)
{
if (memcmp(_REPLYBUFFER, "HTTP", 4) == 0)
{
// Full Header provided by appl - just send it
// Send may block
Sent = send(sock, _REPLYBUFFER, ReplyLen, 0);
while (Sent != ReplyLen && Loops++ < 3000) // 100 secs max
{
// Debugprintf("%d out of %d sent %d Loops", Sent, InputLen, Loops);
if (Sent > 0) // something sent
{
InputLen -= Sent;
memmove(_REPLYBUFFER, &_REPLYBUFFER[Sent], ReplyLen);
}
Sleep(30);
Sent = send(sock, _REPLYBUFFER, ReplyLen, 0);
}
return 0;
}
// compress if allowed
if (allowDeflate)
Compressed = Compressit(_REPLYBUFFER, ReplyLen, &ReplyLen);
else
Compressed = _REPLYBUFFER;
HeaderLen = sprintf(Header, "HTTP/1.1 200 OK\r\nContent-Length: %d\r\nContent-Type: application/json\r\nConnection: close\r\n%s\r\n", ReplyLen, Encoding);
sendandcheck(sock, Header, HeaderLen);
sendandcheck(sock, Compressed, ReplyLen);
if (allowDeflate)
free (Compressed);
return 0;
}
ProcessMailHTTPMessage(Session, Method, Context, MsgPtr, _REPLYBUFFER, &ReplyLen, MsgLen);
if (memcmp(_REPLYBUFFER, "HTTP", 4) == 0)
{
@ -2247,16 +2156,11 @@ doHeader:
return 0;
}
if (Context && _memicmp(Context, "/mail/api/", 10) != 0)
{
// Add tail
strcpy(&_REPLYBUFFER[ReplyLen], Tail);
ReplyLen += strlen(Tail);
}
// compress if allowed
if (allowDeflate)
@ -2346,8 +2250,6 @@ doHeader:
// Pass to MailChat if active
NodeURL = Context;
if ((_memicmp(Context, "/MAIL/", 6) == 0) || (_memicmp(Context, "/WebMail", 8) == 0))
{
// If for Mail, Pass to Mail Server via Named Pipe
@ -4281,78 +4183,6 @@ int ProcessNodeSignon(SOCKET sock, struct TCPINFO * TCP, char * MsgPtr, char * A
return ReplyLen;
}
int ProcessMailAPISignon(struct TCPINFO * TCP, char * MsgPtr, char * Appl, char * Reply, struct HTTPConnectionInfo ** Session, BOOL WebMail, int LOCAL)
{
int ReplyLen = 0;
char * input = strstr(MsgPtr, "\r\n\r\n"); // End of headers
char * user, * password, * Key;
struct HTTPConnectionInfo * NewSession;
int i;
struct UserRec * USER;
if (strchr(MsgPtr, '?'))
{
// Check Password
user = strlop(MsgPtr, '?');
password = strlop(user, '&');
strlop(password, ' ');
for (i = 0; i < TCP->NumberofUsers; i++)
{
USER = TCP->UserRecPtr[i];
if (user && _stricmp(user, USER->UserName) == 0)
{
if ((strcmp(password, USER->Password) == 0) && (USER->Secure || WebMail))
{
// ok
NewSession = AllocateSession(Appl[0], 'M');
*Session = NewSession;
if (NewSession)
{
ReplyLen = 0;
strcpy(NewSession->Callsign, USER->Callsign);
}
else
{
ReplyLen = SetupNodeMenu(Reply, LOCAL);
ReplyLen += sprintf(&Reply[ReplyLen], "%s", BusyError);
}
return ReplyLen;
}
}
}
// Pass failed attempt to BBS code so it can try a bbs user login
// Need to put url back together
if (user && user[0] && password && password[0])
{
sprintf(MsgPtr, "%s?%s&%s", MsgPtr, user, password);
}
}
NewSession = AllocateSession(Appl[0], 'M');
*Session = NewSession;
if (NewSession)
ReplyLen = 0;
else
{
ReplyLen = SetupNodeMenu(Reply, LOCAL);
ReplyLen += sprintf(&Reply[ReplyLen], "%s", BusyError);
}
return ReplyLen;
}

View File

@ -1099,7 +1099,7 @@ VOID KAMPoll(int Port)
// Limit amount in TX, so we keep some on the TX Q and don't send turnround too early
if (TNC->Streams[0].bytesTXed - TNC->Streams[0].BytesAcked > 200)
if (TNC->Streams[0].BytesTXed - TNC->Streams[0].BytesAcked > 200)
continue;
// Dont send if IRS State
@ -1132,7 +1132,7 @@ VOID KAMPoll(int Port)
}
Next = 0;
STREAM->bytesTXed += datalen;
STREAM->BytesTXed += datalen;
if (Stream == 0)
{
@ -1157,7 +1157,7 @@ VOID KAMPoll(int Port)
if (Stream == 0)
{
sprintf(Status, "RX %d TX %d ACKED %d ",
TNC->Streams[0].bytesRXed, TNC->Streams[0].bytesTXed, TNC->Streams[0].BytesAcked);
TNC->Streams[0].BytesRXed, TNC->Streams[0].BytesTXed, TNC->Streams[0].BytesAcked);
SetWindowText(TNC->xIDC_TRAFFIC, Status);
if ((TNC->HFPacket == 0) && (TNC->Streams[0].BPQtoPACTOR_Q == 0)) // Nothing following
@ -1532,14 +1532,14 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
{
if (Msg[1] == '2') // HF Port
{
if (TNC->Streams[0].bytesTXed)
if (TNC->Streams[0].BytesTXed)
TNC->Streams[0].BytesAcked += Len - 3; // We get an ack before the first send
sprintf(Status, "RX %d TX %d ACKED %d ",
TNC->Streams[0].bytesRXed, TNC->Streams[0].bytesTXed, TNC->Streams[0].BytesAcked);
TNC->Streams[0].BytesRXed, TNC->Streams[0].BytesTXed, TNC->Streams[0].BytesAcked);
SetWindowText(TNC->xIDC_TRAFFIC, Status);
if (TNC->Streams[0].bytesTXed - TNC->Streams[0].BytesAcked < 500)
if (TNC->Streams[0].BytesTXed - TNC->Streams[0].BytesAcked < 500)
TNC->Streams[0].FramesOutstanding = 0;
}
return;
@ -1555,7 +1555,7 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
Len-=3; // Remove Header
buffptr->Len = Len; // Length
STREAM->bytesRXed += Len;
STREAM->BytesRXed += Len;
memcpy(buffptr->Data, Buffer, Len);
C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr);
@ -1563,7 +1563,7 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
if (Stream == 0)
{
sprintf(TNC->WEB_TRAFFIC, "RX %d TX %d ACKED %d ",
TNC->Streams[0].bytesRXed, TNC->Streams[0].bytesTXed, TNC->Streams[0].BytesAcked);
TNC->Streams[0].BytesRXed, TNC->Streams[0].BytesTXed, TNC->Streams[0].BytesAcked);
SetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
}
@ -1762,7 +1762,7 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
Buffer[Len-4] = 0;
}
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->BytesAcked = 0;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->BytesAcked = 0;
STREAM->ConnectTime = time(NULL);
if (Stream == 0)
@ -1776,7 +1776,7 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
Rig_Command( (TRANSPORTENTRY *) -1, Msg);
sprintf(TNC->WEB_TRAFFIC, "RX %d TX %d ACKED %d ",
TNC->Streams[0].bytesRXed, TNC->Streams[0].bytesTXed, TNC->Streams[0].BytesAcked);
TNC->Streams[0].BytesRXed, TNC->Streams[0].BytesTXed, TNC->Streams[0].BytesAcked);
SetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
}
@ -1874,7 +1874,7 @@ VOID ProcessKHOSTPacket(struct TNCINFO * TNC, UCHAR * Msg, int Len)
memcpy(&CTBuff[3], &CTEXTMSG[Next], Len);
EncodeAndSend(TNC, CTBuff, Len + 3);
EncodeAndSend(TNC, "E", 1); // Changeover when all sent
TNC->Streams[0].bytesTXed += CTEXTLEN;
TNC->Streams[0].BytesTXed += CTEXTLEN;
}
return;

View File

@ -358,7 +358,7 @@ ok:
UCHAR * data = &buffptr->Data[0];
STREAM->FramesQueued--;
txlen = (int)buffptr->Len;
STREAM->bytesTXed += txlen;
STREAM->BytesTXed += txlen;
bytes=SerialSendData(TNC, data, txlen);
WritetoTrace(TNC, data, txlen);

View File

@ -110,7 +110,7 @@ int seeifInterlockneeded(struct PORTCONTROL * PORT);
int seeifUnlockneeded(struct _LINKTABLE * LINK);
int CheckKissInterlock(struct PORTCONTROL * MYPORT, int Exclusive);
void hookL2SessionAccepted(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK);
void hookL2SessionDeleted(struct _LINKTABLE * LINK);
void hookL2SessionDeleted(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK);
void hookL2SessionAttempt(int Port, char * fromCall, char * toCall, struct _LINKTABLE * LINK);
@ -1131,9 +1131,6 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
return;
}
toCall[ConvFromAX25(ADJBUFFER->DEST, toCall)] = 0;
fromCall[ConvFromAX25(ADJBUFFER->ORIGIN, fromCall)] = 0;
SETUPNEWL2SESSION(LINK, PORT, Buffer, MSGFLAG);
if (LINK->L2STATE != 5) // Setup OK?
@ -1146,6 +1143,10 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
seeifInterlockneeded(PORT);
toCall[ConvFromAX25(ADJBUFFER->DEST, toCall)] = 0;
fromCall[ConvFromAX25(ADJBUFFER->ORIGIN, fromCall)] = 0;
// IF CONNECT TO APPL ADDRESS, SET UP APPL SESSION
if (APPLMASK == 0)
@ -1161,7 +1162,12 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
UCHAR * ptr;
if (LogAllConnects)
{
char toCall[12], fromCall[12];
toCall[ConvFromAX25(ADJBUFFER->DEST, toCall)] = 0;
fromCall[ConvFromAX25(ADJBUFFER->ORIGIN, fromCall)] = 0;
WriteConnectLog(fromCall, toCall, "AX.25");
}
hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK);
@ -1279,8 +1285,6 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
L2SENDUA(PORT, Buffer, ADJBUFFER);
hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK);
if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
{
struct DATAMESSAGE * Msg;
@ -1379,9 +1383,6 @@ VOID L2SABM(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE * Buffe
L2SENDUA(PORT, Buffer, ADJBUFFER);
hookL2SessionAccepted(PORT->PORTNUMBER, fromCall, toCall, LINK);
if (PORT->TNC && PORT->TNC->Hardware == H_KISSHF)
{
struct DATAMESSAGE * Msg;
@ -2441,8 +2442,6 @@ VOID PROC_I_FRAME(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, MESSAGE *
Length = Buffer->LENGTH - (MSGHDDRLEN + 15); // Buffer Header + addrs + CTL
Info = &Buffer->PID;
LINK->bytesRXed += Length;
// Adjust for DIGIS
EOA = &Buffer->ORIGIN[6]; // End of address Bit
@ -2648,13 +2647,6 @@ VOID RESET2(struct _LINKTABLE * LINK)
VOID SENDSABM(struct _LINKTABLE * LINK)
{
char toCall[10];
char fromCall[10];
toCall[ConvFromAX25(LINK->LINKCALL, toCall)] = 0;
fromCall[ConvFromAX25(LINK->OURCALL, fromCall)] = 0;
hookL2SessionAttempt(LINK->LINKPORT->PORTNUMBER, fromCall, toCall, LINK);
L2SENDCOMMAND(LINK, SABM | PFBIT);
}
@ -3268,7 +3260,12 @@ VOID SENDFRMR(struct _LINKTABLE * LINK)
VOID CLEAROUTLINK(struct _LINKTABLE * LINK)
{
hookL2SessionDeleted(LINK);
char toCall[12], fromCall[12];
toCall[ConvFromAX25(LINK->LINKCALL, toCall)] = 0;
fromCall[ConvFromAX25(LINK->OURCALL, fromCall)] = 0;
hookL2SessionDeleted(LINK->LINKPORT->PORTNUMBER, fromCall, toCall, LINK);
seeifUnlockneeded(LINK);

View File

@ -603,9 +603,6 @@ VOID L4BG()
// If we want to enforce PACLEN this may be a good place to do it
Msglen = Msg->LENGTH - (MSGHDDRLEN + 1); //Dont include PID
LINK->bytesTXed += Msglen;
Paclen = L4->SESSPACLEN;
if (Paclen == 0)

View File

@ -1269,7 +1269,6 @@ int main(int argc, char * argv[])
}
}
for (i = optind; i < argc; i++)
{
if (_stricmp(argv[i], "tidymail") == 0)
DeleteRedundantMessages();
@ -1289,10 +1288,6 @@ int main(int argc, char * argv[])
AGWActive = AGWAPIInit();
if (Redirected == 0)
ConTerm.BPQStream = FindFreeStream();
#ifndef WIN32
for (i = 1; i < argc; i++)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,277 +0,0 @@
/*******************************************************************************
* Copyright (c) 2009, 2020 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* https://www.eclipse.org/legal/epl-2.0/
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial API and implementation and/or initial documentation
*******************************************************************************/
/**
* @file
* \brief This structure represents a persistent data store, used to store
* outbound and inbound messages, in order to achieve reliable messaging.
*
* The MQTT Client persists QoS1 and QoS2 messages in order to meet the
* assurances of delivery associated with these @ref qos levels. The messages
* are saved in persistent storage
* The type and context of the persistence implementation are specified when
* the MQTT client is created (see MQTTClient_create()). The default
* persistence type (::MQTTCLIENT_PERSISTENCE_DEFAULT) uses a file system-based
* persistence mechanism. The <i>persistence_context</i> argument passed to
* MQTTClient_create() when using the default peristence is a string
* representing the location of the persistence directory. If the context
* argument is NULL, the working directory will be used.
*
* To use memory-based persistence, an application passes
* ::MQTTCLIENT_PERSISTENCE_NONE as the <i>persistence_type</i> to
* MQTTClient_create(). This can lead to message loss in certain situations,
* but can be appropriate in some cases (see @ref qos).
*
* Client applications can provide their own persistence mechanism by passing
* ::MQTTCLIENT_PERSISTENCE_USER as the <i>persistence_type</i>. To implement a
* custom persistence mechanism, the application must pass an initialized
* ::MQTTClient_persistence structure as the <i>persistence_context</i>
* argument to MQTTClient_create().
*
* If the functions defined return an ::MQTTCLIENT_PERSISTENCE_ERROR then the
* state of the persisted data should remain as it was prior to the function
* being called. For example, if Persistence_put() returns
* ::MQTTCLIENT_PERSISTENCE_ERROR, then it is assumed tha tthe persistent store
* does not contain the data that was passed to the function. Similarly, if
* Persistence_remove() returns ::MQTTCLIENT_PERSISTENCE_ERROR then it is
* assumed that the data to be removed is still held in the persistent store.
*
* It is up to the persistence implementation to log any error information that
* may be required to diagnose a persistence mechanism failure.
*/
/*
/// @cond EXCLUDE
*/
#if !defined(MQTTCLIENTPERSISTENCE_H)
#define MQTTCLIENTPERSISTENCE_H
/*
/// @endcond
*/
/**
* This <i>persistence_type</i> value specifies the default file system-based
* persistence mechanism (see MQTTClient_create()).
*/
#define MQTTCLIENT_PERSISTENCE_DEFAULT 0
/**
* This <i>persistence_type</i> value specifies a memory-based
* persistence mechanism (see MQTTClient_create()).
*/
#define MQTTCLIENT_PERSISTENCE_NONE 1
/**
* This <i>persistence_type</i> value specifies an application-specific
* persistence mechanism (see MQTTClient_create()).
*/
#define MQTTCLIENT_PERSISTENCE_USER 2
/**
* Application-specific persistence functions must return this error code if
* there is a problem executing the function.
*/
#define MQTTCLIENT_PERSISTENCE_ERROR -2
/**
* @brief Initialize the persistent store.
*
* Either open the existing persistent store for this client ID or create a new
* one if one doesn't exist. If the persistent store is already open, return
* without taking any action.
*
* An application can use the same client identifier to connect to many
* different servers. The <i>clientid</i> in conjunction with the
* <i>serverURI</i> uniquely identifies the persistence store required.
*
* @param handle The address of a pointer to a handle for this persistence
* implementation. This function must set handle to a valid reference to the
* persistence following a successful return.
* The handle pointer is passed as an argument to all the other
* persistence functions. It may include the context parameter and/or any other
* data for use by the persistence functions.
* @param clientID The client identifier for which the persistent store should
* be opened.
* @param serverURI The connection string specified when the MQTT client was
* created (see MQTTClient_create()).
* @param context A pointer to any data required to initialize the persistent
* store (see ::MQTTClient_persistence).
* @return Return 0 if the function completes successfully, otherwise return
* ::MQTTCLIENT_PERSISTENCE_ERROR.
*/
typedef int (*Persistence_open)(void** handle, const char* clientID, const char* serverURI, void* context);
/**
* @brief Close the persistent store referred to by the handle.
*
* @param handle The handle pointer from a successful call to
* Persistence_open().
* @return Return 0 if the function completes successfully, otherwise return
* ::MQTTCLIENT_PERSISTENCE_ERROR.
*/
typedef int (*Persistence_close)(void* handle);
/**
* @brief Put the specified data into the persistent store.
*
* @param handle The handle pointer from a successful call to
* Persistence_open().
* @param key A string used as the key for the data to be put in the store. The
* key is later used to retrieve data from the store with Persistence_get().
* @param bufcount The number of buffers to write to the persistence store.
* @param buffers An array of pointers to the data buffers associated with
* this <i>key</i>.
* @param buflens An array of lengths of the data buffers. <i>buflen[n]</i>
* gives the length of <i>buffer[n]</i>.
* @return Return 0 if the function completes successfully, otherwise return
* ::MQTTCLIENT_PERSISTENCE_ERROR.
*/
typedef int (*Persistence_put)(void* handle, char* key, int bufcount, char* buffers[], int buflens[]);
/**
* @brief Retrieve the specified data from the persistent store.
*
* @param handle The handle pointer from a successful call to
* Persistence_open().
* @param key A string that is the key for the data to be retrieved. This is
* the same key used to save the data to the store with Persistence_put().
* @param buffer The address of a pointer to a buffer. This function sets the
* pointer to point at the retrieved data, if successful.
* @param buflen The address of an int that is set to the length of
* <i>buffer</i> by this function if successful.
* @return Return 0 if the function completes successfully, otherwise return
* ::MQTTCLIENT_PERSISTENCE_ERROR.
*/
typedef int (*Persistence_get)(void* handle, char* key, char** buffer, int* buflen);
/**
* @brief Remove the data for the specified key from the store.
*
* @param handle The handle pointer from a successful call to
* Persistence_open().
* @param key A string that is the key for the data to be removed from the
* store. This is the same key used to save the data to the store with
* Persistence_put().
* @return Return 0 if the function completes successfully, otherwise return
* ::MQTTCLIENT_PERSISTENCE_ERROR.
*/
typedef int (*Persistence_remove)(void* handle, char* key);
/**
* @brief Returns the keys in this persistent data store.
*
* @param handle The handle pointer from a successful call to
* Persistence_open().
* @param keys The address of a pointer to pointers to strings. Assuming
* successful execution, this function allocates memory to hold the returned
* keys (strings used to store the data with Persistence_put()). It also
* allocates memory to hold an array of pointers to these strings. <i>keys</i>
* is set to point to the array of pointers to strings.
* @param nkeys A pointer to the number of keys in this persistent data store.
* This function sets the number of keys, if successful.
* @return Return 0 if the function completes successfully, otherwise return
* ::MQTTCLIENT_PERSISTENCE_ERROR.
*/
typedef int (*Persistence_keys)(void* handle, char*** keys, int* nkeys);
/**
* @brief Clears the persistence store, so that it no longer contains any
* persisted data.
*
* @param handle The handle pointer from a successful call to
* Persistence_open().
* @return Return 0 if the function completes successfully, otherwise return
* ::MQTTCLIENT_PERSISTENCE_ERROR.
*/
typedef int (*Persistence_clear)(void* handle);
/**
* @brief Returns whether any data has been persisted using the specified key.
*
* @param handle The handle pointer from a successful call to
* Persistence_open().
* @param key The string to be tested for existence in the store.
* @return Return 0 if the key was found in the store, otherwise return
* ::MQTTCLIENT_PERSISTENCE_ERROR.
*/
typedef int (*Persistence_containskey)(void* handle, char* key);
/**
* @brief A structure containing the function pointers to a persistence
* implementation and the context or state that will be shared across all
* the persistence functions.
*/
typedef struct {
/**
* A pointer to any data required to initialize the persistent store.
*/
void* context;
/**
* A function pointer to an implementation of Persistence_open().
*/
Persistence_open popen;
/**
* A function pointer to an implementation of Persistence_close().
*/
Persistence_close pclose;
/**
* A function pointer to an implementation of Persistence_put().
*/
Persistence_put pput;
/**
* A function pointer to an implementation of Persistence_get().
*/
Persistence_get pget;
/**
* A function pointer to an implementation of Persistence_remove().
*/
Persistence_remove premove;
/**
* A function pointer to an implementation of Persistence_keys().
*/
Persistence_keys pkeys;
/**
* A function pointer to an implementation of Persistence_clear().
*/
Persistence_clear pclear;
/**
* A function pointer to an implementation of Persistence_containskey().
*/
Persistence_containskey pcontainskey;
} MQTTClient_persistence;
/**
* A callback which is invoked just before a write to persistence. This can be
* used to transform the data, for instance to encrypt it.
* @param context The context as set in ::MQTTAsync_setBeforePersistenceWrite
* @param bufcount The number of buffers to write to the persistence store.
* @param buffers An array of pointers to the data buffers.
* @param buflens An array of lengths of the data buffers.
* @return Return 0 if the function completes successfully, otherwise non 0.
*/
typedef int MQTTPersistence_beforeWrite(void* context, int bufcount, char* buffers[], int buflens[]);
/**
* A callback which is invoked just after a read from persistence. This can be
* used to transform the data, for instance to decrypt it.
* @param context The context as set in ::MQTTAsync_setAfterPersistenceRead
* @param buffer The address of a pointer to a buffer.
* @param buflen The address of an int that is the length of the buffer.
* @return Return 0 if the function completes successfully, otherwise non 0.
*/
typedef int MQTTPersistence_afterRead(void* context, char** buffer, int* buflen);
#endif

View File

@ -1,36 +0,0 @@
/*******************************************************************************
* Copyright (c) 2020, 2020 Andreas Walter
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* https://www.eclipse.org/legal/epl-2.0/
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Andreas Walter - initially moved export declarations into separate fle
*******************************************************************************/
#if !defined(EXPORTDECLARATIONS_H)
#define EXPORTDECLARATIONS_H
#if defined(_WIN32) || defined(_WIN64)
# if defined(PAHO_MQTT_EXPORTS)
# define LIBMQTT_API __declspec(dllexport)
# elif defined(PAHO_MQTT_IMPORTS)
# define LIBMQTT_API __declspec(dllimport)
# else
# define LIBMQTT_API
# endif
#else
# if defined(PAHO_MQTT_EXPORTS)
# define LIBMQTT_API __attribute__ ((visibility ("default")))
# else
# define LIBMQTT_API extern
# endif
#endif
#endif

View File

@ -1,222 +0,0 @@
/*******************************************************************************
* Copyright (c) 2017, 2023 IBM Corp. and others
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* https://www.eclipse.org/legal/epl-2.0/
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial API and implementation and/or initial documentation
*******************************************************************************/
#if !defined(MQTTPROPERTIES_H)
#define MQTTPROPERTIES_H
#include "MQTTExportDeclarations.h"
#define MQTT_INVALID_PROPERTY_ID -2
/** The one byte MQTT V5 property indicator */
enum MQTTPropertyCodes {
MQTTPROPERTY_CODE_PAYLOAD_FORMAT_INDICATOR = 1, /**< The value is 1 */
MQTTPROPERTY_CODE_MESSAGE_EXPIRY_INTERVAL = 2, /**< The value is 2 */
MQTTPROPERTY_CODE_CONTENT_TYPE = 3, /**< The value is 3 */
MQTTPROPERTY_CODE_RESPONSE_TOPIC = 8, /**< The value is 8 */
MQTTPROPERTY_CODE_CORRELATION_DATA = 9, /**< The value is 9 */
MQTTPROPERTY_CODE_SUBSCRIPTION_IDENTIFIER = 11, /**< The value is 11 */
MQTTPROPERTY_CODE_SESSION_EXPIRY_INTERVAL = 17, /**< The value is 17 */
MQTTPROPERTY_CODE_ASSIGNED_CLIENT_IDENTIFER = 18,/**< The value is 18 */
MQTTPROPERTY_CODE_SERVER_KEEP_ALIVE = 19, /**< The value is 19 */
MQTTPROPERTY_CODE_AUTHENTICATION_METHOD = 21, /**< The value is 21 */
MQTTPROPERTY_CODE_AUTHENTICATION_DATA = 22, /**< The value is 22 */
MQTTPROPERTY_CODE_REQUEST_PROBLEM_INFORMATION = 23,/**< The value is 23 */
MQTTPROPERTY_CODE_WILL_DELAY_INTERVAL = 24, /**< The value is 24 */
MQTTPROPERTY_CODE_REQUEST_RESPONSE_INFORMATION = 25,/**< The value is 25 */
MQTTPROPERTY_CODE_RESPONSE_INFORMATION = 26, /**< The value is 26 */
MQTTPROPERTY_CODE_SERVER_REFERENCE = 28, /**< The value is 28 */
MQTTPROPERTY_CODE_REASON_STRING = 31, /**< The value is 31 */
MQTTPROPERTY_CODE_RECEIVE_MAXIMUM = 33, /**< The value is 33*/
MQTTPROPERTY_CODE_TOPIC_ALIAS_MAXIMUM = 34, /**< The value is 34 */
MQTTPROPERTY_CODE_TOPIC_ALIAS = 35, /**< The value is 35 */
MQTTPROPERTY_CODE_MAXIMUM_QOS = 36, /**< The value is 36 */
MQTTPROPERTY_CODE_RETAIN_AVAILABLE = 37, /**< The value is 37 */
MQTTPROPERTY_CODE_USER_PROPERTY = 38, /**< The value is 38 */
MQTTPROPERTY_CODE_MAXIMUM_PACKET_SIZE = 39, /**< The value is 39 */
MQTTPROPERTY_CODE_WILDCARD_SUBSCRIPTION_AVAILABLE = 40,/**< The value is 40 */
MQTTPROPERTY_CODE_SUBSCRIPTION_IDENTIFIERS_AVAILABLE = 41,/**< The value is 41 */
MQTTPROPERTY_CODE_SHARED_SUBSCRIPTION_AVAILABLE = 42/**< The value is 241 */
};
/**
* Returns a printable string description of an MQTT V5 property code.
* @param value an MQTT V5 property code.
* @return the printable string description of the input property code.
* NULL if the code was not found.
*/
LIBMQTT_API const char* MQTTPropertyName(enum MQTTPropertyCodes value);
/** The one byte MQTT V5 property type */
enum MQTTPropertyTypes {
MQTTPROPERTY_TYPE_BYTE,
MQTTPROPERTY_TYPE_TWO_BYTE_INTEGER,
MQTTPROPERTY_TYPE_FOUR_BYTE_INTEGER,
MQTTPROPERTY_TYPE_VARIABLE_BYTE_INTEGER,
MQTTPROPERTY_TYPE_BINARY_DATA,
MQTTPROPERTY_TYPE_UTF_8_ENCODED_STRING,
MQTTPROPERTY_TYPE_UTF_8_STRING_PAIR
};
/**
* Returns the MQTT V5 type code of an MQTT V5 property.
* @param value an MQTT V5 property code.
* @return the MQTT V5 type code of the input property. -1 if the code was not found.
*/
LIBMQTT_API int MQTTProperty_getType(enum MQTTPropertyCodes value);
/**
* The data for a length delimited string
*/
typedef struct
{
int len; /**< the length of the string */
char* data; /**< pointer to the string data */
} MQTTLenString;
/**
* Structure to hold an MQTT version 5 property of any type
*/
typedef struct
{
enum MQTTPropertyCodes identifier; /**< The MQTT V5 property id. A multi-byte integer. */
/** The value of the property, as a union of the different possible types. */
union {
unsigned char byte; /**< holds the value of a byte property type */
unsigned short integer2; /**< holds the value of a 2 byte integer property type */
unsigned int integer4; /**< holds the value of a 4 byte integer property type */
struct {
MQTTLenString data; /**< The value of a string property, or the name of a user property. */
MQTTLenString value; /**< The value of a user property. */
};
} value;
} MQTTProperty;
/**
* MQTT version 5 property list
*/
typedef struct MQTTProperties
{
int count; /**< number of property entries in the array */
int max_count; /**< max number of properties that the currently allocated array can store */
int length; /**< mbi: byte length of all properties */
MQTTProperty *array; /**< array of properties */
} MQTTProperties;
#define MQTTProperties_initializer {0, 0, 0, NULL}
/**
* Returns the length of the properties structure when serialized ready for network transmission.
* @param props an MQTT V5 property structure.
* @return the length in bytes of the properties when serialized.
*/
int MQTTProperties_len(MQTTProperties* props);
/**
* Add a property pointer to the property array. Memory is allocated in this function,
* so MQTTClient_create or MQTTAsync_create must be called first to initialize the
* internal heap tracking. Alternatively MQTTAsync_global_init() can be called first
* or build with the HIGH_PERFORMANCE option which disables the heap tracking.
* @param props The property list to add the property to.
* @param prop The property to add to the list.
* @return 0 on success, -1 on failure.
*/
LIBMQTT_API int MQTTProperties_add(MQTTProperties* props, const MQTTProperty* prop);
/**
* Serialize the given property list to a character buffer, e.g. for writing to the network.
* @param pptr pointer to the buffer - move the pointer as we add data
* @param properties pointer to the property list, can be NULL
* @return whether the write succeeded or not: number of bytes written, or < 0 on failure.
*/
int MQTTProperties_write(char** pptr, const MQTTProperties* properties);
/**
* Reads a property list from a character buffer into an array.
* @param properties pointer to the property list to be filled. Should be initalized but empty.
* @param pptr pointer to the character buffer.
* @param enddata pointer to the end of the character buffer so we don't read beyond.
* @return 1 if the properties were read successfully.
*/
int MQTTProperties_read(MQTTProperties* properties, char** pptr, char* enddata);
/**
* Free all memory allocated to the property list, including any to individual properties.
* @param properties pointer to the property list.
*/
LIBMQTT_API void MQTTProperties_free(MQTTProperties* properties);
/**
* Copy the contents of a property list, allocating additional memory if needed.
* @param props pointer to the property list.
* @return the duplicated property list.
*/
LIBMQTT_API MQTTProperties MQTTProperties_copy(const MQTTProperties* props);
/**
* Checks if property list contains a specific property.
* @param props pointer to the property list.
* @param propid the property id to check for.
* @return 1 if found, 0 if not.
*/
LIBMQTT_API int MQTTProperties_hasProperty(MQTTProperties *props, enum MQTTPropertyCodes propid);
/**
* Returns the number of instances of a property id. Most properties can exist only once.
* User properties and subscription ids can exist more than once.
* @param props pointer to the property list.
* @param propid the property id to check for.
* @return the number of times found. Can be 0.
*/
LIBMQTT_API int MQTTProperties_propertyCount(MQTTProperties *props, enum MQTTPropertyCodes propid);
/**
* Returns the integer value of a specific property. The property given must be a numeric type.
* @param props pointer to the property list.
* @param propid the property id to check for.
* @return the integer value of the property. -9999999 on failure.
*/
LIBMQTT_API int MQTTProperties_getNumericValue(MQTTProperties *props, enum MQTTPropertyCodes propid);
/**
* Returns the integer value of a specific property when it's not the only instance.
* The property given must be a numeric type.
* @param props pointer to the property list.
* @param propid the property id to check for.
* @param index the instance number, starting at 0.
* @return the integer value of the property. -9999999 on failure.
*/
LIBMQTT_API int MQTTProperties_getNumericValueAt(MQTTProperties *props, enum MQTTPropertyCodes propid, int index);
/**
* Returns a pointer to the property structure for a specific property.
* @param props pointer to the property list.
* @param propid the property id to check for.
* @return the pointer to the property structure if found. NULL if not found.
*/
LIBMQTT_API MQTTProperty* MQTTProperties_getProperty(MQTTProperties *props, enum MQTTPropertyCodes propid);
/**
* Returns a pointer to the property structure for a specific property when it's not the only instance.
* @param props pointer to the property list.
* @param propid the property id to check for.
* @param index the instance number, starting at 0.
* @return the pointer to the property structure if found. NULL if not found.
*/
LIBMQTT_API MQTTProperty* MQTTProperties_getPropertyAt(MQTTProperties *props, enum MQTTPropertyCodes propid, int index);
#endif /* MQTTPROPERTIES_H */

View File

@ -1,79 +0,0 @@
/*******************************************************************************
* Copyright (c) 2017, 2020 IBM Corp. and others
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* https://www.eclipse.org/legal/epl-2.0/
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial API and implementation and/or initial documentation
*******************************************************************************/
#if !defined(MQTTREASONCODES_H)
#define MQTTREASONCODES_H
#include "MQTTExportDeclarations.h"
/** The MQTT V5 one byte reason code */
enum MQTTReasonCodes {
MQTTREASONCODE_SUCCESS = 0,
MQTTREASONCODE_NORMAL_DISCONNECTION = 0,
MQTTREASONCODE_GRANTED_QOS_0 = 0,
MQTTREASONCODE_GRANTED_QOS_1 = 1,
MQTTREASONCODE_GRANTED_QOS_2 = 2,
MQTTREASONCODE_DISCONNECT_WITH_WILL_MESSAGE = 4,
MQTTREASONCODE_NO_MATCHING_SUBSCRIBERS = 16,
MQTTREASONCODE_NO_SUBSCRIPTION_FOUND = 17,
MQTTREASONCODE_CONTINUE_AUTHENTICATION = 24,
MQTTREASONCODE_RE_AUTHENTICATE = 25,
MQTTREASONCODE_UNSPECIFIED_ERROR = 128,
MQTTREASONCODE_MALFORMED_PACKET = 129,
MQTTREASONCODE_PROTOCOL_ERROR = 130,
MQTTREASONCODE_IMPLEMENTATION_SPECIFIC_ERROR = 131,
MQTTREASONCODE_UNSUPPORTED_PROTOCOL_VERSION = 132,
MQTTREASONCODE_CLIENT_IDENTIFIER_NOT_VALID = 133,
MQTTREASONCODE_BAD_USER_NAME_OR_PASSWORD = 134,
MQTTREASONCODE_NOT_AUTHORIZED = 135,
MQTTREASONCODE_SERVER_UNAVAILABLE = 136,
MQTTREASONCODE_SERVER_BUSY = 137,
MQTTREASONCODE_BANNED = 138,
MQTTREASONCODE_SERVER_SHUTTING_DOWN = 139,
MQTTREASONCODE_BAD_AUTHENTICATION_METHOD = 140,
MQTTREASONCODE_KEEP_ALIVE_TIMEOUT = 141,
MQTTREASONCODE_SESSION_TAKEN_OVER = 142,
MQTTREASONCODE_TOPIC_FILTER_INVALID = 143,
MQTTREASONCODE_TOPIC_NAME_INVALID = 144,
MQTTREASONCODE_PACKET_IDENTIFIER_IN_USE = 145,
MQTTREASONCODE_PACKET_IDENTIFIER_NOT_FOUND = 146,
MQTTREASONCODE_RECEIVE_MAXIMUM_EXCEEDED = 147,
MQTTREASONCODE_TOPIC_ALIAS_INVALID = 148,
MQTTREASONCODE_PACKET_TOO_LARGE = 149,
MQTTREASONCODE_MESSAGE_RATE_TOO_HIGH = 150,
MQTTREASONCODE_QUOTA_EXCEEDED = 151,
MQTTREASONCODE_ADMINISTRATIVE_ACTION = 152,
MQTTREASONCODE_PAYLOAD_FORMAT_INVALID = 153,
MQTTREASONCODE_RETAIN_NOT_SUPPORTED = 154,
MQTTREASONCODE_QOS_NOT_SUPPORTED = 155,
MQTTREASONCODE_USE_ANOTHER_SERVER = 156,
MQTTREASONCODE_SERVER_MOVED = 157,
MQTTREASONCODE_SHARED_SUBSCRIPTIONS_NOT_SUPPORTED = 158,
MQTTREASONCODE_CONNECTION_RATE_EXCEEDED = 159,
MQTTREASONCODE_MAXIMUM_CONNECT_TIME = 160,
MQTTREASONCODE_SUBSCRIPTION_IDENTIFIERS_NOT_SUPPORTED = 161,
MQTTREASONCODE_WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED = 162
};
/**
* Returns a printable string description of an MQTT V5 reason code.
* @param value an MQTT V5 reason code.
* @return the printable string description of the input reason code.
* NULL if the code was not found.
*/
LIBMQTT_API const char* MQTTReasonCode_toString(enum MQTTReasonCodes value);
#endif

View File

@ -1,46 +0,0 @@
/*******************************************************************************
* Copyright (c) 2018 IBM Corp.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* https://www.eclipse.org/legal/epl-2.0/
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Ian Craggs - initial API and implementation and/or initial documentation
*******************************************************************************/
#if !defined(SUBOPTS_H)
#define SUBOPTS_H
/** The MQTT V5 subscribe options, apart from QoS which existed before V5. */
typedef struct MQTTSubscribe_options
{
/** The eyecatcher for this structure. Must be MQSO. */
char struct_id[4];
/** The version number of this structure. Must be 0.
*/
int struct_version;
/** To not receive our own publications, set to 1.
* 0 is the original MQTT behaviour - all messages matching the subscription are received.
*/
unsigned char noLocal;
/** To keep the retain flag as on the original publish message, set to 1.
* If 0, defaults to the original MQTT behaviour where the retain flag is only set on
* publications sent by a broker if in response to a subscribe request.
*/
unsigned char retainAsPublished;
/** 0 - send retained messages at the time of the subscribe (original MQTT behaviour)
* 1 - send retained messages on subscribe only if the subscription is new
* 2 - do not send retained messages at all
*/
unsigned char retainHandling;
} MQTTSubscribe_options;
#define MQTTSubscribe_options_initializer { {'M', 'Q', 'S', 'O'}, 0, 0, 0, 0 }
#endif

View File

@ -1317,7 +1317,7 @@ VOID ProcessMSPKData(struct TNCINFO * TNC)
C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr);
STREAM->bytesRXed += TNC->DataLen;
STREAM->BytesRXed += TNC->DataLen;
}
TNC->DataLen = 0;
@ -1387,7 +1387,7 @@ DataLoop:
STREAM->Connected = TRUE;
STREAM->Connecting = FALSE;
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = 0;
STREAM->BytesRXed = STREAM->BytesTXed = 0;
buffptr = GetBuff();
if (buffptr)
@ -1402,7 +1402,7 @@ DataLoop:
STREAM->Connected = TRUE;
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = 0;
STREAM->BytesRXed = STREAM->BytesTXed = 0;
UpdateMH(TNC, CallFrom, '+', 'I');
@ -1483,7 +1483,7 @@ VOID SendData(struct TNCINFO * TNC, char * Msg, int MsgLen)
char * inptr = Msg;
SOCKET sock = TNCInfo[MasterPort[TNC->Port]]->TCPSock;
TNC->Streams[0].bytesTXed += MsgLen;
TNC->Streams[0].BytesTXed += MsgLen;
for (n = 0; n < MsgLen; n++)
{

View File

@ -43,7 +43,6 @@ struct SEM AllocSemaphore = {0, 0};
struct SEM ConSemaphore = {0, 0};
struct SEM Semaphore = {0, 0};
struct SEM OutputSEM = {0, 0};
struct SEM ConfigSEM = {0, 0};
struct UserInfo ** UserRecPtr=NULL;
int NumberofUsers=0;

View File

@ -41,7 +41,7 @@
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="..\CKernel;..\CommonSource;..\CInclude"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;LINBPQ;_USE_32BIT_TIME_T;NOMQTT"
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;LINBPQ;_USE_32BIT_TIME_T"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@ -456,10 +456,6 @@
RelativePath="..\CommonSource\Moncode.c"
>
</File>
<File
RelativePath=".\mqtt.c"
>
</File>
<File
RelativePath="..\CommonSource\Multicast.c"
>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory="C:\Users\John\AppData\Roaming\BPQ32"
CommandArguments="MAIL"
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor="0"
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory="C:\Users\John\AppData\Roaming\BPQ32"
CommandArguments="MAIL"
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor="0"
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -9422,7 +9422,7 @@ return TRUE;
#include <stdio.h>
#include <stdlib.h>
//
//#include <stdint.h>
//#include <windows.h>
#include <setupapi.h>
//#include <ddk/hidsdi.h>

View File

@ -1972,7 +1972,7 @@ VOID SCSPoll(int Port)
}
Poll[3] = 0; // Data?
TNC->Streams[Stream].bytesTXed += datalen;
TNC->Streams[Stream].BytesTXed += datalen;
Poll[4] = datalen - 1;
memcpy(&Poll[5], Buffer, datalen);
@ -2324,7 +2324,7 @@ void SCSTryToSendDATA(struct TNCINFO * TNC, int Stream)
}
Poll[3] = 0; // Data
STREAM->bytesTXed += datalen;
STREAM->BytesTXed += datalen;
Poll[4] = datalen - 1;
memcpy(&Poll[5], Buffer, datalen);
@ -3402,7 +3402,7 @@ VOID ProcessDEDFrame(struct TNCINFO * TNC, UCHAR * Msg, int framelen)
{
if (TNC->TXBuffer[6]== 'T') // TX count Status
{
sprintf(TNC->WEB_TRAFFIC, "RX %d TX %d ACKED %s", TNC->Streams[Stream].bytesRXed, TNC->Streams[Stream].bytesTXed, Buffer);
sprintf(TNC->WEB_TRAFFIC, "RX %d TX %d ACKED %s", TNC->Streams[Stream].BytesRXed, TNC->Streams[Stream].BytesTXed, Buffer);
SetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
return;
}
@ -3501,7 +3501,7 @@ VOID ProcessDEDFrame(struct TNCINFO * TNC, UCHAR * Msg, int framelen)
STREAM->Connected = TRUE; // Subsequent data to data channel
STREAM->Connecting = FALSE;
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = 0;
STREAM->BytesRXed = STREAM->BytesTXed = 0;
// Stop Scanner
@ -3897,7 +3897,7 @@ VOID ProcessDEDFrame(struct TNCINFO * TNC, UCHAR * Msg, int framelen)
if (buffptr == NULL) return; // No buffers, so ignore
buffptr->Len = Msg[4] + 1; // Length
TNC->Streams[Stream].bytesRXed += (int)buffptr->Len;
TNC->Streams[Stream].BytesRXed += (int)buffptr->Len;
memcpy(buffptr->Data, &Msg[5], buffptr->Len);
WritetoTrace(TNC, &Msg[5], (int)buffptr->Len);

View File

@ -825,7 +825,7 @@ static VOID DEDPoll(int Port)
}
Poll[1] = 0; // Data
TNC->Streams[Stream].bytesTXed += datalen;
TNC->Streams[Stream].BytesTXed += datalen;
Poll[2] = datalen - 1;
memcpy(&Poll[3], Buffer, datalen);
@ -1508,7 +1508,7 @@ static VOID ProcessDEDFrame(struct TNCINFO * TNC)
STREAM->Connected = TRUE; // Subsequent data to data channel
STREAM->Connecting = FALSE;
STREAM->bytesRXed = STREAM->bytesTXed = 0;
STREAM->BytesRXed = STREAM->BytesTXed = 0;
memcpy(MHCall, Call, 9);
MHCall[9] = 0;
@ -1677,7 +1677,7 @@ static VOID ProcessDEDFrame(struct TNCINFO * TNC)
if (buffptr == NULL) return; // No buffers, so ignore
buffptr->Len = framelen; // Length
TNC->Streams[Stream].bytesRXed += buffptr->Len;
TNC->Streams[Stream].BytesRXed += buffptr->Len;
memcpy(buffptr->Data, Msg, buffptr->Len);
C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr);

View File

@ -1267,7 +1267,7 @@ reinit:
}
Poll[1] = 0; // Data
TNC->Streams[Stream].bytesTXed += datalen;
TNC->Streams[Stream].BytesTXed += datalen;
Poll[2] = datalen - 1;
memcpy(&Poll[3], Buffer, datalen);
@ -1888,7 +1888,7 @@ VOID TrkProcessDEDFrame(struct TNCINFO * TNC)
{
if (TNC->TXBuffer[4]== 'T') // TX count Status
{
sprintf(TNC->WEB_TRAFFIC, "RX %d TX %d ACKED %s", TNC->Streams[Stream].bytesRXed, TNC->Streams[Stream].bytesTXed, Buffer);
sprintf(TNC->WEB_TRAFFIC, "RX %d TX %d ACKED %s", TNC->Streams[Stream].BytesRXed, TNC->Streams[Stream].BytesTXed, Buffer);
SetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
TNC->WEB_CHANGED = TRUE;
return;
@ -2027,7 +2027,7 @@ VOID TrkProcessDEDFrame(struct TNCINFO * TNC)
STREAM->Connected = TRUE; // Subsequent data to data channel
STREAM->Connecting = FALSE;
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = 0;
STREAM->BytesRXed = STREAM->BytesTXed = 0;
if (TNC->SlowTimer)
Debugprintf("RP Incoming call to APPLCALL completed");
@ -2385,7 +2385,7 @@ VOID TrkProcessDEDFrame(struct TNCINFO * TNC)
if (buffptr == NULL) return; // No buffers, so ignore
buffptr->Len = framelen; // Length
TNC->Streams[Stream].bytesRXed += (int)buffptr->Len;
TNC->Streams[Stream].BytesRXed += (int)buffptr->Len;
memcpy(buffptr->Data, Msg, buffptr->Len);
WritetoTrace(TNC, Msg, (int)buffptr->Len);

View File

@ -402,7 +402,7 @@ ok:
UCHAR * data = &buffptr->Data[0];
STREAM->FramesQueued--;
txlen = (int)buffptr->Len;
STREAM->bytesTXed += txlen;
STREAM->BytesTXed += txlen;
bytes=SerialSendData(TNC, data, txlen);
WritetoTrace(TNC, data, txlen);
@ -491,7 +491,7 @@ ok:
bytes=SerialSendData(TNC, TXMsg, txlen);
TNC->Streams[Stream].BytesOutstanding += bytes; // So flow control works - will be updated by BUFFER response
STREAM->bytesTXed += bytes;
STREAM->BytesTXed += bytes;
// WritetoTrace(TNC, &buff->L2DATA[0], txlen);
return 1;

View File

@ -2382,7 +2382,7 @@ nosocks:
{
char logmsg[120];
sprintf(logmsg,"%d Disconnected. Bytes Sent = %d Bytes Received %d\n",
sockptr->Number, STREAM->bytesTXed, STREAM->bytesRXed);
sockptr->Number, STREAM->BytesTXed, STREAM->BytesRXed);
WriteLog (logmsg);
}
@ -2407,7 +2407,7 @@ nosocks:
{
char logmsg[120];
sprintf(logmsg,"%d Disconnected. Bytes Sent = %d Bytes Received %d Time %d Seconds\r\n",
sockptr->Number, STREAM->bytesTXed, STREAM->bytesRXed, (int)(time(NULL) - sockptr->ConnectTime));
sockptr->Number, STREAM->BytesTXed, STREAM->BytesRXed, (int)(time(NULL) - sockptr->ConnectTime));
WriteCMSLog (logmsg);
}
@ -2415,7 +2415,7 @@ nosocks:
// Don't report if Internet down unless ReportRelayTraffic set)
if (sockptr->RelaySession == FALSE || TCP->ReportRelayTraffic)
SendWL2KSessionRecord(sockptr->ADIF, STREAM->bytesTXed, STREAM->bytesRXed);
SendWL2KSessionRecord(sockptr->ADIF, STREAM->BytesTXed, STREAM->BytesRXed);
WriteADIFRecord(sockptr->ADIF);
@ -3285,7 +3285,7 @@ int Socket_Accept(struct TNCINFO * TNC, SOCKET SocketId, int Port)
sockptr->Keepalive = FALSE;
sockptr->UTF8 = 0;
TNC->Streams[n].bytesRXed = TNC->Streams[n].bytesTXed = 0;
TNC->Streams[n].BytesRXed = TNC->Streams[n].BytesTXed = 0;
TNC->Streams[n].FramesQueued = 0;
sockptr->HTTPMode = FALSE;
@ -3834,7 +3834,7 @@ MsgLoop:
// Normal Data State
STREAM->bytesRXed += MsgLen;
STREAM->BytesRXed += MsgLen;
SendIndex = 0;
// Line could be up to 500 chars if coming from a program rather than an interative user
@ -3986,7 +3986,7 @@ MsgLoop:
if (ctlen > 0) send(sock, ct, ctlen, 0);
STREAM->bytesTXed = ctlen;
STREAM->BytesTXed = ctlen;
if (LogEnabled)
{
@ -4067,7 +4067,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
MsgPtr = &sockptr->InputBuffer[0];
InputLen = sockptr->InputLen;
STREAM->bytesRXed += InputLen;
STREAM->BytesRXed += InputLen;
if (sockptr->LoginState == 2)
{
@ -4077,7 +4077,7 @@ int DataSocket_ReadRelay(struct TNCINFO * TNC, struct ConnectionInfo * sockptr,
// Queue to Node. Data may arrive it large quatities, possibly exceeding node buffer capacity
STREAM->bytesRXed += InputLen;
STREAM->BytesRXed += InputLen;
if (sockptr->FromHostBuffPutptr + InputLen > sockptr->FromHostBufferSize)
{
@ -4347,7 +4347,7 @@ int DataSocket_ReadSync(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, S
InputLen = sockptr->InputLen;
MsgPtr[InputLen] = 0;
STREAM->bytesRXed += InputLen;
STREAM->BytesRXed += InputLen;
if (sockptr->LoginState == 0) // Initial connection
{
@ -4495,7 +4495,7 @@ MsgLoop:
// Queue to Node. Data may arrive it large quantities, possibly exceeding node buffer capacity
STREAM->bytesRXed += InputLen;
STREAM->BytesRXed += InputLen;
BuffertoNode(sockptr, MsgPtr, InputLen);
sockptr->InputLen = 0;
@ -4677,7 +4677,7 @@ MsgLoop:
if (strstr(MsgPtr, "Password :"))
{
// Send "CMSTelnet" + gateway callsign + frequency + emission type if info is available
// Send “CMSTelnet” + gateway callsign + frequency + emission type if info is available
TRANSPORTENTRY * Sess1 = TNC->PortRecord->ATTACHEDSESSIONS[Stream];
TRANSPORTENTRY * Sess2 = NULL;
@ -5650,7 +5650,7 @@ int Telnet_Connected(struct TNCINFO * TNC, struct ConnectionInfo * sockptr, SOCK
sockptr->FromHostBuffPutptr = sockptr->FromHostBuffGetptr = 0;
TNC->Streams[Stream].bytesRXed = TNC->Streams[Stream].bytesTXed = 0;
TNC->Streams[Stream].BytesRXed = TNC->Streams[Stream].BytesTXed = 0;
return 0;
}
@ -6508,7 +6508,7 @@ BOOL TelSendPacket(int Stream, struct STREAMINFO * STREAM, PMSGWITHLEN buffptr,
datalen = (int)buffptr->Len;
MsgPtr = &buffptr->Data[0];
STREAM->bytesTXed += datalen;
STREAM->BytesTXed += datalen;
sock = sockptr->socket;

27
UIARQ.c
View File

@ -367,10 +367,10 @@ static VOID UpdateStatsLine(struct TNCINFO * TNC, struct STREAMINFO * STREAM)
{
char Count[16];
sprintf(Count, "%d", STREAM->bytesRXed);
sprintf(Count, "%d", STREAM->BytesRXed);
SetWindowText(STREAM->xIDC_RXED, Count);
sprintf(Count, "%d", STREAM->bytesTXed);
sprintf(Count, "%d", STREAM->BytesTXed);
SetWindowText(STREAM->xIDC_SEND, Count);
sprintf(Count, "%d", STREAM->BytesResent);
@ -849,7 +849,7 @@ static VOID ProcessFLDigiData(struct TNCINFO * TNC, UCHAR * Input, int Len, int
strcpy(STREAM->MyCall, call2);
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->BytesAcked = STREAM->BytesResent = 0;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->BytesAcked = STREAM->BytesResent = 0;
if (WL2K)
strcpy(SESS->RMSCall, WL2K->RMSCall);
@ -1001,7 +1001,7 @@ AckConnectRequest:
goto SendKReply; // Repeated ACK
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->BytesAcked = STREAM->BytesResent = 0;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->BytesAcked = STREAM->BytesResent = 0;
STREAM->Connected = TRUE;
ARQ->ARQTimerState = 0;
@ -1240,7 +1240,20 @@ SendKReply:
{
// Create a traffic record
hookL4SessionDeleted(TNC, STREAM);
char logmsg[120];
time_t Duration;
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1;
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
}
STREAM->Connecting = FALSE;
@ -1300,7 +1313,7 @@ SendKReply:
buffptr->Len = Len;
memcpy(buffptr->Data, &Input[1], Len);
STREAM->bytesRXed += Len;
STREAM->BytesRXed += Len;
UpdateStatsLine(TNC, STREAM);
@ -1388,7 +1401,7 @@ static VOID SendARQData(struct TNCINFO * TNC, PMSGWITHLEN Buffer, int Stream)
ARQ->TXHOLDQ[ARQ->TXSeq] = Buffer;
STREAM->bytesTXed += Origlen;
STREAM->BytesTXed += Origlen;
UpdateStatsLine(TNC, STREAM);

View File

@ -884,7 +884,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
if (STREAM->ReportDISC)
{
hookL4SessionDeleted(TNC, STREAM);
STREAM->ReportDISC = FALSE;
buff->PORT = Stream;
@ -1230,9 +1229,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
ViaList[0] = Digis;
}
hookL4SessionAttempt(STREAM,&STREAM->AGWKey[1], &STREAM->AGWKey[11]);
sent = send(TNCInfo[MasterPort[port]]->TCPSock, (char *)&AGW->TXHeader, AGWHDDRLEN, 0);
if (Digis)
send(TNCInfo[MasterPort[port]]->TCPSock, ViaList, Digis * 10 + 1, 0);
@ -2234,8 +2230,6 @@ VOID ProcessAGWPacket(struct TNCINFO * TNC, UCHAR * Message)
buffptr->Len = RXHeader->DataLength;
memcpy(buffptr->Data, Message, RXHeader->DataLength);
STREAM->bytesRXed += RXHeader->DataLength;
C_Q_ADD(&STREAM->PACTORtoBPQ_Q, buffptr);
return;
}
@ -2376,7 +2370,7 @@ GotStream:
memcpy(STREAM->AGWKey, Key, 21);
STREAM->Connected = TRUE;
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = 0;
STREAM->BytesRXed = STREAM->BytesTXed = 0;
SuspendOtherPorts(TNC);
@ -2473,8 +2467,6 @@ GotStream:
}
strcpy(STREAM->MyCall, TNC->TargetCall);
if (App < 32)
{
char AppName[13];
@ -2511,9 +2503,6 @@ GotStream:
}
}
strcpy(STREAM->MyCall, TNC->TargetCall);
// Not to a known appl - drop through to Node
return;
@ -2537,7 +2526,7 @@ GotStream:
STREAM->Connected = TRUE;
STREAM->Connecting = FALSE;
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = 0;
STREAM->BytesRXed = STREAM->BytesTXed = 0;
buffptr = GetBuff();
if (buffptr == 0) return; // No buffers, so ignore
@ -2751,7 +2740,7 @@ GotStream:
// Capabilities - along with Version used to indicate QtSoundModem
// with ability to set and read Modem type and frequency/
if ((Message[2] == 24 && Message[3] == 3 && Message[4] == 100) || TNC->AGWInfo->isQTSM)
if (Message[2] == 24 && Message[3] == 3 && Message[4] == 100)
{
// Set flag on any other ports on same TNC (all ports with this as master port)
@ -2939,9 +2928,6 @@ VOID SendData(int Stream, struct TNCINFO * TNC, char * Key, char * Msg, int MsgL
memcpy(AGW->TXHeader.callfrom, &Key[11], 10);
memcpy(AGW->TXHeader.callto, &Key[1], 10);
TNC->Streams[Stream].bytesTXed += MsgLen;
// If Length is greater than Paclen we should fragment
if (TNC->PortRecord->ATTACHEDSESSIONS[Stream])

68
VARA.c
View File

@ -394,18 +394,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
}
}
// Check ATTACH time limit
if (STREAM->Attached)
{
if (STREAM->AttachTime && TNC->AttachTimeLimit && time(NULL) > (TNC->AttachTimeLimit + STREAM->AttachTime))
{
STREAM->ReportDISC = 1;
STREAM->AttachTime = 0;
}
}
while (TNC->PortRecord->UI_Q)
{
buffptr = Q_REM(&TNC->PortRecord->UI_Q);
@ -518,8 +506,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
int calllen;
char Msg[80];
memset(STREAM, 0, sizeof(struct STREAMINFO));
TNC->Streams[0].Attached = TRUE;
calllen = ConvFromAX25(TNC->PortRecord->ATTACHEDSESSIONS[0]->L4USER, TNC->Streams[0].MyCall);
@ -530,7 +516,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
VARASendCommand(TNC, "LISTEN OFF\r", TRUE);
TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit; // Reset Limit
STREAM->AttachTime = time(NULL);
// Stop other ports in same group
@ -583,7 +568,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
buffptr->Data[txlen] = 0; // Null terminate
STREAM->bytesTXed += txlen;
STREAM->BytesTXed += txlen;
WritetoTrace(TNC, buffptr->Data, txlen);
// Always add to stored data and set timer. If it expires send message
@ -614,7 +599,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
memcpy(txbuff, buffptr->Data, txlen);
bytes = VARASendData(TNC, &txbuff[0], txlen);
STREAM->bytesTXed += bytes;
STREAM->BytesTXed += bytes;
ReleaseBuffer(buffptr);
}
@ -662,7 +647,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
txlen = (int)buffptr->Len;
memcpy(txbuff, buffptr->Data, txlen);
bytes=send(TNC->TCPDataSock, buff->L2DATA, txlen, 0);
STREAM->bytesTXed += bytes;
STREAM->BytesTXed += bytes;
WritetoTrace(TNC, txbuff, txlen);
ReleaseBuffer(buffptr);
}
@ -689,7 +674,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
memcpy(txbuff, buff->L2DATA, txlen);
bytes=send(TNC->TCPDataSock, txbuff, txlen, 0);
STREAM->bytesTXed += bytes;
STREAM->BytesTXed += bytes;
WritetoTrace(TNC, buff->L2DATA, txlen);
return 0;
}
@ -705,7 +690,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
buff->L2DATA[txlen] = 0; // Null terminate
STREAM->bytesTXed += txlen;
STREAM->BytesTXed += txlen;
WritetoTrace(TNC, buff->L2DATA, txlen);
// Always add to stored data and set timer. If it expires send message
@ -831,8 +816,6 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
TNC->Streams[0].Connecting = TRUE;
hookL4SessionAttempt(STREAM, &buff->L2DATA[2], TNC->Streams[0].MyCall);
// See if Busy
if (InterlockedCheckBusy(TNC))
@ -2017,7 +2000,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
}
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %s",
STREAM->bytesTXed, STREAM->bytesRXed, &Buffer[7]);
STREAM->BytesTXed, STREAM->BytesRXed, &Buffer[7]);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
return;
@ -2037,7 +2020,8 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
Debugprintf(Buffer);
WritetoTrace(TNC, Buffer, MsgLen - 1);
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->PacketsSent = 0;
STREAM->ConnectTime = time(NULL);
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->PacketsSent = 0;
if (TNC->VARACMsg)
free(TNC->VARACMsg);
@ -2104,10 +2088,6 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
// Stop other ports in same group
memset(STREAM, 0, sizeof(struct STREAMINFO));
STREAM->ConnectTime = time(NULL);
SuspendOtherPorts(TNC);
TNC->SessionTimeLimit = TNC->DefaultSessionTimeLimit; // Reset Limit
@ -2203,7 +2183,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
STREAM->PacketsSent++;
bytes = send(TNC->TCPDataSock, TNC->NetRomTxBuffer, TNC->NetRomTxLen, 0);
STREAM->bytesTXed += TNC->NetRomTxLen;
STREAM->BytesTXed += TNC->NetRomTxLen;
free(TNC->NetRomTxBuffer);
TNC->NetRomTxBuffer = NULL;
@ -2284,8 +2264,6 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
STREAM->NeedDisc = 100; // 10 secs
}
}
strcpy(STREAM->MyCall, TNC->TargetCall);
return;
}
else
@ -2295,7 +2273,6 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
char Reply[80];
int ReplyLen;
STREAM->ConnectTime = time(NULL);
if (TNC->NetRomMode)
{
@ -2308,7 +2285,7 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
STREAM->PacketsSent++;
bytes = send(TNC->TCPDataSock, TNC->NetRomTxBuffer, TNC->NetRomTxLen, 0);
STREAM->bytesTXed += TNC->NetRomTxLen;
STREAM->BytesTXed += TNC->NetRomTxLen;
free(TNC->NetRomTxBuffer);
TNC->NetRomTxBuffer = NULL;
TNC->NetRomTxLen = 0;
@ -2397,7 +2374,22 @@ VOID VARAProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
{
// Create a traffic record
hookL4SessionDeleted(TNC, STREAM);
char logmsg[120];
time_t Duration;
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1;
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
STREAM->ConnectTime= 0; //Prevent retrigger
}
@ -2750,13 +2742,13 @@ VOID VARAProcessDataPacket(struct TNCINFO * TNC, UCHAR * Data, int Length)
TNC->TimeSinceLast = 0;
STREAM->bytesRXed += Length;
STREAM->BytesRXed += Length;
Data[Length] = 0;
// Debugprintf("VARA: RXD %d bytes", Length);
sprintf(TNC->WEB_TRAFFIC, "Sent %d RXed %d Queued %d",
STREAM->bytesTXed, STREAM->bytesRXed,STREAM->BytesOutstanding);
STREAM->BytesTXed, STREAM->BytesRXed,STREAM->BytesOutstanding);
MySetWindowText(TNC->xIDC_TRAFFIC, TNC->WEB_TRAFFIC);
// if VARAAC Mode, remove byte count from front and add cr
@ -2899,7 +2891,7 @@ int VARASendData(struct TNCINFO * TNC, UCHAR * Buff, int Len)
struct STREAMINFO * STREAM = &TNC->Streams[0];
int bytes=send(TNC->TCPDataSock,(const char FAR *)Buff, Len, 0);
STREAM->bytesTXed += bytes;
STREAM->BytesTXed += bytes;
WritetoTrace(TNC, Buff, Len);
return bytes;
}
@ -2998,7 +2990,7 @@ void SendVARANetrom(struct TNCINFO * TNC, unsigned char * Data, int Len)
STREAM->PacketsSent++;
bytes = send(TNC->TCPDataSock, TNC->NetRomTxBuffer, TNC->NetRomTxLen, 0);
STREAM->bytesTXed += TNC->NetRomTxLen;
STREAM->BytesTXed += TNC->NetRomTxLen;
free(TNC->NetRomTxBuffer);
TNC->NetRomTxBuffer = NULL;

View File

@ -10,8 +10,8 @@
#endif
#define KVers 6,0,24,49
#define KVerstring "6.0.24.49\0"
#define KVers 6,0,24,45
#define KVerstring "6.0.24.45\0"
#ifdef CKernel

View File

@ -915,7 +915,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
txlen = buffptr->Len;
memcpy(txbuff, buffptr->Data, txlen);
bytes = send(TNC->TCPDataSock, txbuff, (int)txlen, 0);
STREAM->bytesTXed += bytes;
STREAM->BytesTXed += bytes;
WritetoTrace(TNC, txbuff, (int)txlen);
ReleaseBuffer(buffptr);
}
@ -941,7 +941,7 @@ static size_t ExtProc(int fn, int port, PDATAMESSAGE buff)
}
bytes = send(TNC->TCPDataSock,buff->L2DATA, (int)txlen, 0);
STREAM->bytesTXed += bytes;
STREAM->BytesTXed += bytes;
WritetoTrace(TNC, &buff->L2DATA[0], (int)txlen);
}
@ -2106,7 +2106,7 @@ VOID ProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
FreeSemaphore(&Semaphore);
STREAM->ConnectTime = time(NULL);
STREAM->bytesRXed = STREAM->bytesTXed = STREAM->PacketsSent = 0;
STREAM->BytesRXed = STREAM->BytesTXed = STREAM->PacketsSent = 0;
if (TNC->StartInRobust)
send(TNC->TCPSock, "ROBUST TRUE\r\n", 13, 0);
@ -2207,7 +2207,7 @@ VOID ProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
PMSGWITHLEN buffptr = Q_REM(&STREAM->BPQtoPACTOR_Q);
send(TNC->TCPDataSock, buffptr->Data, (int)buffptr->Len, 0);
STREAM->bytesTXed += (int)buffptr->Len;
STREAM->BytesTXed += (int)buffptr->Len;
WritetoTrace(TNC, buffptr->Data, (int)buffptr->Len);
ReleaseBuffer(buffptr);
}
@ -2368,7 +2368,22 @@ VOID ProcessResponse(struct TNCINFO * TNC, UCHAR * Buffer, int MsgLen)
if (TNC->Streams[0].Connected)
{
hookL4SessionDeleted(TNC, STREAM);
// Create a traffic record
char logmsg[120];
time_t Duration;
Duration = time(NULL) - STREAM->ConnectTime;
if (Duration == 0)
Duration = 1; // Avoid zero divide
sprintf(logmsg,"Port %2d %9s Bytes Sent %d BPS %d Bytes Received %d BPS %d Time %d Seconds",
TNC->Port, STREAM->RemoteCall,
STREAM->BytesTXed, (int)(STREAM->BytesTXed/Duration),
STREAM->BytesRXed, (int)(STREAM->BytesRXed/Duration), (int)Duration);
Debugprintf(logmsg);
GetSemaphore(&Semaphore, 50);
WritetoTrace(TNC, Buffer, MsgLen - 2);
@ -2693,7 +2708,7 @@ loop:
return;
}
STREAM->bytesRXed += InputLen;
STREAM->BytesRXed += InputLen;
msg = &buffptr->Data[0];
msg[InputLen] = 0;

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -1,65 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="8.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
<Configuration
Name="Release|Win32"
>
<DebugSettings
Command="$(TargetPath)"
WorkingDirectory=""
CommandArguments=""
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="NOTTSDESKTOP"
RemoteCommand=""
HttpUrl=""
PDBPath=""
SQLDebugging=""
Environment=""
EnvironmentMerge="true"
DebuggerFlavor=""
MPIRunCommand=""
MPIRunArguments=""
MPIRunWorkingDirectory=""
ApplicationCommand=""
ApplicationArguments=""
ShimCommand=""
MPIAcceptMode=""
MPIAcceptFilter=""
/>
</Configuration>
</Configurations>
</VisualStudioUserFile>

View File

@ -756,6 +756,7 @@ typedef struct KISSINFO
int QtSMFreq;
int QtSMStats; // Set if stats received as KISS Command
// UCHAR WIN32INFO[16]; // FOR WINDOWS DRIVER
} *PKISSINFO;
@ -879,11 +880,6 @@ typedef struct _LINKTABLE
UCHAR OURCALL[7]; // CALLSIGN OF OUR END
UCHAR DIGIS[56]; // LEVEL 2 DIGIS IN PATH
char callingCall[10]; // for reporting. Link and Our calls depand on which end connected
char receivingCall[10]; // for reporting. Link and Our calls depand on which end connected
char Direction[4]; // In or Out
PPORTCONTROL LINKPORT; // PORT NUMBER
UCHAR LINKTYPE; // 1 = UP, 2= DOWN, 3 = INTERNODE
@ -931,10 +927,6 @@ typedef struct _LINKTABLE
int IFrameRetryCounter; // Number of times an I frame in repeated without a frame being acked
time_t ConnectTime; // For session stats
int bytesRXed; // Info bytes only
int bytesTXed;
} LINKTABLE;
#pragma pack(1)

View File

@ -55,7 +55,7 @@ extern int ProgramErrors;
extern struct _EXCEPTION_POINTERS exinfox;
#ifdef WIN32
void Dump_Process_State(struct _EXCEPTION_POINTERS * exinfo, char * Msg);
Dump_Process_State(struct _EXCEPTION_POINTERS * exinfo, char * Msg);
#define My__except_Routine(Message) \
__except(memcpy(&exinfo, GetExceptionInformation(), sizeof(struct _EXCEPTION_POINTERS)), EXCEPTION_EXECUTE_HANDLER)\

30
cMain.c
View File

@ -36,7 +36,6 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#include "kernelresource.h"
#include "CHeaders.h"
#include "tncinfo.h"
#include "mqtt.h"
VOID L2Routine(struct PORTCONTROL * PORT, PMESSAGE Buffer);
VOID ProcessIframe(struct _LINKTABLE * LINK, PDATAMESSAGE Buffer);
@ -49,7 +48,6 @@ void ADSBTimer();
VOID SendSmartID(struct PORTCONTROL * PORT);
int CanPortDigi(int Port);
int KissEncode(UCHAR * inbuff, UCHAR * outbuff, int len);
void MQTTTimer();
#include "configstructs.h"
@ -84,7 +82,6 @@ char MYCALL[7] = ""; // DB 7 DUP (0) ; NODE CALLSIGN (BIT SHIFTED)
char MYALIASTEXT[6] = ""; // DB ' ' ; NODE ALIAS (KEEP TOGETHER)
char MYALIASLOPPED[10];
char MYCALLLOPPED[10];
UCHAR MYCALLWITHALIAS[13] = "";
@ -94,7 +91,6 @@ APPLCALLS APPLCALLTABLE[NumberofAppls] = {0};
UCHAR MYNODECALL[10] = ""; // NODE CALLSIGN (ASCII)
UCHAR MYNETROMCALL[10] = ""; // NETROM CALLSIGN (ASCII)
char NODECALLLOPPED[10];
VOID * FREE_Q = NULL;
@ -146,15 +142,6 @@ extern UCHAR LogDirectory[260];
extern BOOL EventsEnabled;
extern BOOL SaveAPRSMsgs;
BOOL M0LTEMap = FALSE;
BOOL MQTT = FALSE;
char MQTT_HOST[80] = "";
int MQTT_PORT = 0;
char MQTT_USER[80] = "";
char MQTT_PASS[80] = "";
int MQTT_Connecting = 0;
int MQTT_Connected = 0;
//TNCTABLE DD 0
//NUMBEROFSTREAMS DD 0
@ -451,6 +438,7 @@ Loop:
if (TNC->DisconnectScript)
{
int n = 0;
char command[256];
struct DATAMESSAGE * Buffer;
TRANSPORTENTRY Session = {0}; // = TNC->PortRecord->ATTACHEDSESSIONS[Sessno];
@ -741,10 +729,6 @@ BOOL Start()
memcpy(MYNETROMCALL, cfg->C_NETROMCALL, 10);
strlop(MYNETROMCALL, ' ');
strlop(MYNODECALL, ' ');
memcpy(NODECALLLOPPED, MYNODECALL, 10);
strlop(NODECALLLOPPED, ' ');
APPLCALLTABLE[0].APPLQUAL = BBSQUAL;
@ -809,11 +793,7 @@ BOOL Start()
EventsEnabled = cfg->C_EVENTS;
SaveAPRSMsgs = cfg->C_SaveAPRSMsgs;
M0LTEMap = cfg->C_M0LTEMap;
MQTT = cfg->C_MQTT;
strcpy(MQTT_HOST, cfg->C_MQTT_HOST);
MQTT_PORT = cfg->C_MQTT_PORT;
strcpy(MQTT_USER, cfg->C_MQTT_USER);
strcpy(MQTT_PASS, cfg->C_MQTT_PASS);
// Get pointers to PASSWORD and APPL1 commands
@ -2087,9 +2067,6 @@ VOID TIMERINTERRUPT()
sendFreqReport();
sendModeReport();
if (MQTT)
MQTTTimer();
/*
if (QCOUNT < 200)
{
@ -2242,9 +2219,6 @@ L2Packet:
Message->PORT = CURRENTPORT;
if (MQTT && PORT->PROTOCOL == 0)
MQTTKISSRX(Buffer);
// Bridge if requested
for (toPort = 1; toPort <= MaxBPQPortNo; toPort++)

View File

@ -1,239 +0,0 @@
/*
Stuff to make compiling on WINDOWS and LINUX easier
*/
#ifndef _COMPATBITS_
#define _COMPATBITS_
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stddef.h>
#ifdef WIN32
#define _CRT_SECURE_NO_DEPRECATE
#include <crtdbg.h>
#define strtoll _strtoi64
#ifdef _WIN64
#include "stdint.h"
#else
#include "winstdint.h"
#endif
#include "winsock2.h"
#include "WS2tcpip.h"
#include <windowsx.h>
#include <Richedit.h>
#include "commctrl.h"
#include "Commdlg.h"
#include <shellapi.h>
#define Dll __declspec(dllexport)
#define DllExport __declspec(dllexport)
#define ioctl ioctlsocket
#define pthread_t uintptr_t
int pthread_equal(pthread_t T1, pthread_t T2);
uintptr_t _beginthread(void(__cdecl *start_address)(void *), unsigned stack_size, void *arglist);
#else
int Sleep(int ms);
#define ioctlsocket ioctl
#define Dll
#define DllExport
#include <unistd.h>
#include <time.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <signal.h>
#include <sys/select.h>
#include <stdarg.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <netdb.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <fcntl.h>
#include <syslog.h>
#include <pthread.h>
#define BOOL int
#define VOID void
#define UCHAR unsigned char
#define USHORT unsigned short
#define ULONG unsigned long
#define UINT unsigned int
#define SHORT short
#define DWORD unsigned int
#define BYTE unsigned char
#define APIENTRY
#define WINAPI
#define WINUSERAPI
#define TCHAR char
#define TRUE 1
#define FALSE 0
#define FAR
#define byte UCHAR
//#define Byte UCHAR
#define Word WORD
typedef DWORD COLORREF;
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((USHORT)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
#define GetRValue(rgb) rgb & 0xFF
#define GetGValue(rgb) (rgb >> 8) & 0xFF
#define GetBValue(rgb) (rgb >> 16) & 0xFF
#define HWND unsigned int
#define HINSTANCE unsigned int
#define HKEY unsigned int
#define UINT_PTR unsigned int *
#define HANDLE UINT
#define SOCKET int
#define INVALID_SOCKET -1
#define SOCKET_ERROR -1
#define HMENU UINT
#define WNDPROC UINT
#define __cdecl
#define strtok_s strtok_r
#define _memicmp memicmp
#define _stricmp stricmp
#define _strdup strdup
#define _strupr strupr
#define _strlwr strlwr
#define _snprintf snprintf
#define _gcvt gcvt
#define _fcvt fcvt
#define _atoi64 atoll
#define DeleteFile unlink
#define MoveFile rename
#define CreateDirectory mkdir
uint64_t GetTickCount();
int sprintf_s(char * string, int plen, const char * format, ...);
int memicmp(unsigned char *a, unsigned char *b, int n);
int stricmp(const unsigned char * pStr1, const unsigned char *pStr2);
char * strupr(char* s);
char * strlwr(char* s);
pthread_t _beginthread(void(*start_address)(), unsigned stack_size, VOID * arglist);
#define WSAGetLastError() errno
#define GetLastError() errno
void closesocket(int sock);
#define GetCurrentProcessId getpid
#define GetCurrentThreadId pthread_self
char * inet_ntoa(struct in_addr in);
#define LOBYTE(w) ((BYTE)((ULONG *)(w) & 0xff))
#define HIBYTE(w) ((BYTE)((ULONG *)(w) >> 8))
#define LOWORD(l) ((SHORT) ((l) & 0xffff))
#define WSAEWOULDBLOCK 11
#define MAX_PATH 250
typedef int (*PROC)();
typedef struct tagRECT
{
unsigned int left;
unsigned int top;
unsigned int right;
unsigned int bottom;
} RECT, *PRECT, *NPRECT, *LPRECT;
#define HBRUSH int
#define _timezone timezone
#endif
#ifdef LINBPQ
#ifndef WIN32
void SetWindowText(HWND hWnd, char * lpString);
BOOL MySetDlgItemText(HWND hWnd, int item, char * lpString);
BOOL CopyFile(char * In, char * Out, BOOL Failifexists);
int GetNumberofPorts();
int SendMsg(int stream, char * msg, int len);
int SendRaw(int port, char * msg, int len);
VOID md5(char *arg, unsigned char * checksum);
// Send Raw (KISS mode) frame to port (BPQHOST function 10)
int APIENTRY SendRaw(int port, char * msg, int len);
BOOL MySetDlgItemText();
VOID OutputDebugString(char * string);
#endif
#ifdef APIENTRY
#undef APIENTRY
#endif
#define APIENTRY
typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr_in *PSOCKADDR_IN;
typedef struct sockaddr_in *LPSOCKADDR_IN;
typedef struct sockaddr SOCKADDR;
typedef struct sockaddr *PSOCKADDR;
typedef struct sockaddr *LPSOCKADDR;
#define __int16 short
#define __int32 long
#endif
#endif

View File

@ -302,7 +302,7 @@ static char *keywords[] =
"APPL5QUAL", "APPL6QUAL", "APPL7QUAL", "APPL8QUAL",
"BTEXT:", "NETROMCALL", "C_IS_CHAT", "MAXRTT", "MAXHOPS", // IPGATEWAY= no longer allowed
"LogL4Connects", "LogAllConnects", "SAVEMH", "ENABLEADIFLOG", "ENABLEEVENTS", "SAVEAPRSMSGS",
"EnableM0LTEMap", "MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS"
"EnableM0LTEMap"
}; /* parameter keywords */
static void * offset[] =
@ -323,7 +323,7 @@ static void * offset[] =
&xxcfg.C_APPL[4].ApplQual, &xxcfg.C_APPL[5].ApplQual, &xxcfg.C_APPL[6].ApplQual, &xxcfg.C_APPL[7].ApplQual,
&xxcfg.C_BTEXT, &xxcfg.C_NETROMCALL, &xxcfg.C_C, &xxcfg.C_MAXRTT, &xxcfg.C_MAXHOPS, // IPGATEWAY= no longer allowed
&xxcfg.C_LogL4Connects, &xxcfg.C_LogAllConnects, &xxcfg.C_SaveMH, &xxcfg.C_ADIF, &xxcfg.C_EVENTS, &xxcfg.C_SaveAPRSMsgs,
&xxcfg.C_M0LTEMap, &xxcfg.C_MQTT, &xxcfg.C_MQTT_HOST, &xxcfg.C_MQTT_PORT, &xxcfg.C_MQTT_USER, &xxcfg.C_MQTT_PASS}; /* offset for corresponding data in config file */
&xxcfg.C_M0LTEMap}; /* offset for corresponding data in config file */
static int routine[] =
{
@ -343,7 +343,7 @@ static int routine[] =
14, 14 ,14, 14,
15, 0, 2, 9, 9,
2, 2, 2, 2, 2, 2,
2, 2, 0, 1, 20, 20} ; // Routine to process param
2} ; // Routine to process param
int PARAMLIM = sizeof(routine)/sizeof(int);
//int NUMBEROFKEYWORDS = sizeof(routine)/sizeof(int);
@ -365,8 +365,7 @@ static char *pkeywords[] =
"BCALL", "DIGIMASK", "NOKEEPALIVES", "COMPORT", "DRIVER", "WL2KREPORT", "UIONLY",
"UDPPORT", "IPADDR", "I2CBUS", "I2CDEVICE", "UDPTXPORT", "UDPRXPORT", "NONORMALIZE",
"IGNOREUNLOCKEDROUTES", "INP3ONLY", "TCPPORT", "RIGPORT", "PERMITTEDAPPLS", "HIDE",
"SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort",
"MQTT", "MQTT_HOST", "MQTT_PORT", "MQTT_USER", "MQTT_PASS"}; /* parameter keywords */
"SMARTID", "KISSCOMMAND", "SendtoM0LTEMap", "PortFreq", "M0LTEMapInfo", "QTSMPort"}; /* parameter keywords */
static void * poffset[] =
{
@ -607,11 +606,6 @@ BOOL ProcessConfig()
paramok[79]=1; // SaveAPRSMsgs optional
paramok[79]=1; // SaveAPRSMsgs optional
paramok[80]=1; // EnableM0LTEMap optional
paramok[81]=1; // MQTT Params
paramok[82]=1; // MQTT Params
paramok[83]=1; // MQTT Params
paramok[84]=1; // MQTT Params
paramok[85]=1; // MQTT Params
for (i=0; i < PARAMLIM; i++)
{
@ -1159,26 +1153,6 @@ NextAPRS:
}
if (_memicmp("MQTT_HOST=", rec, 10) == 0)
{
strcpy(xxcfg.C_MQTT_HOST, &rec[10]);
xxcfg.C_MQTT_HOST[strlen(xxcfg.C_MQTT_HOST)-1] = '\0';
return 0;
}
if (_memicmp("MQTT_USER=", rec, 10) == 0)
{
strcpy(xxcfg.C_MQTT_USER, &rec[10]);
xxcfg.C_MQTT_USER[strlen(xxcfg.C_MQTT_USER)-1] = '\0';
return 0;
}
if (_memicmp("MQTT_PASS=", rec, 10) == 0)
{
strcpy(xxcfg.C_MQTT_PASS, &rec[10]);
xxcfg.C_MQTT_PASS[strlen(xxcfg.C_MQTT_PASS)-1] = '\0';
return 0;
}
if (xindex(rec,"=") >= 0)
sscanf(rec,"%[^=]=%s",key_word,value);
else

View File

@ -165,11 +165,6 @@ struct CONFIGTABLE
struct ROUTECONFIG C_ROUTE[MaxLockedRoutes];
struct APPLCONFIG C_APPL[NumberofAppls];
struct PORTCONFIG C_PORT[MaxBPQPortNo + 4];
int C_MQTT;
char C_MQTT_HOST[80];
int C_MQTT_PORT;
char C_MQTT_USER[80];
char C_MQTT_PASS[80];
//#define ApplOffset 80000 // Applications offset in config buffer
//#define InfoOffset 85000 // Infomsg offset in buffer

8
debian/changelog vendored
View File

@ -1,11 +1,3 @@
linbpq (6.0.24.49-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New Upstream import
* Patches refreshed
* Add mqtt requirements
-- Dave Hibberd <hibby@debian.org> Tue, 05 Nov 2024 21:52:29 +0000
linbpq (6.0.24.45-1~hibbian+1) bookworm-hibbian-unstable; urgency=medium
* New upstream import

2
debian/control vendored
View File

@ -6,7 +6,7 @@ Standards-Version: 4.7.0.0
Vcs-Browser: https://github.com/Online-Amateur-Radio-Club-M0OUK/oarc-bpqnode
Vcs-Git: https://github.com/Online-Amateur-Radio-Club-M0OUK/oarc-bpqnode.git
Homepage: https://www.cantab.net/users/john.wiseman/Documents/
Build-Depends: debhelper-compat (= 13), libssl-dev, libminiupnpc-dev, libpcap-dev, libconfig-dev, zlib1g-dev, libpaho-mqtt-dev, libjansson-dev
Build-Depends: debhelper-compat (= 13), libssl-dev, libminiupnpc-dev, libpcap-dev, libconfig-dev, zlib1g-dev
Rules-Requires-Root: no
Package: linbpq

View File

@ -33,3 +33,23 @@
int AGWDataSocket_Disconnect( struct AGWSocketConnectionInfo * sockptr);
int SendRawPacket(struct AGWSocketConnectionInfo * sockptr, char *txmsg, int Length);
int ShowApps();
--- a/AGWMoncode.c
+++ b/AGWMoncode.c
@@ -68,7 +68,7 @@
static UCHAR * DISPLAYARPDATAGRAM(UCHAR * Datagram, UCHAR * Output);
-int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, int Stamp, int * FrameType, int useLocalTime, int DoNodes)
+int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * FrameType, int useLocalTime, int DoNodes)
{
UCHAR * ptr;
int n;
@@ -364,7 +364,7 @@
}
if (Output == NULL)
- return NULL;
+ return 0;
if (Output[-1] != 13)
Output += sprintf((char *)Output, "\r");

View File

@ -35,14 +35,13 @@
BOOL CompareCalls(UCHAR * c1, UCHAR * c2);
VOID PostDataAvailable(TRANSPORTENTRY * Session);
@@ -437,7 +437,6 @@
@@ -427,4 +427,4 @@
extern int MinCounter[MaxBPQPortNo + 1]; // Interval Countdown
extern BOOL SendFromFile[MaxBPQPortNo + 1];
DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
-
void hookL2SessionAccepted(int Port, char * remotecall, char * ourcall, struct _LINKTABLE * LINK);
void hookL2SessionDeleted(struct _LINKTABLE * LINK);
void hookL2SessionAttempt(int Port, char * ourcall, char * remotecall, struct _LINKTABLE * LINK);
-DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
\ No newline at end of file
+DllExport uint64_t APIENTRY GetPortFrequency(int PortNo, char * FreqStringMhz);
--- a/WinRPR.c
+++ b/WinRPR.c
@@ -63,7 +63,6 @@
@ -107,7 +106,7 @@
static UCHAR * DISPLAY_NETROM(MESSAGE * ADJBUFFER, UCHAR * Output, int MsgLen, int DoNodes);
--- a/Bpq32.c
+++ b/Bpq32.c
@@ -1415,7 +1415,6 @@
@@ -1411,7 +1411,6 @@
VOID FindLostBuffers();
BOOL InitializeTNCEmulator();
VOID TNCTimer();
@ -248,7 +247,7 @@
--- a/CommonCode.c
+++ b/CommonCode.c
@@ -571,7 +571,7 @@
@@ -570,7 +570,7 @@
return ptr;
}

View File

@ -1,21 +1,21 @@
--- a/makefile
+++ b/makefile
@@ -33,11 +33,14 @@
@@ -29,11 +29,15 @@
linbpq: $(OBJS)
gcc $(OBJS) -Xlinker -Map=output.map -l:libminiupnpc.a -lrt -lm -lz $(LDFLAGS) -lpthread -lconfig -lpcap -o linbpq
gcc $(OBJS) -Xlinker -Map=output.map -l:libminiupnpc.a -lrt -lm -lz -lpthread -lconfig -lpcap -o linbpq
- sudo setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq
+ # sudo setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq
-include *.d
-clean :
- rm *.d
- rm linbpq $(OBJS)
+# setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq
+
+install:
+ install -b -m 755 -D -d debian/linbpq/usr/sbin
+ install -b -m 755 -s -p linbpq debian/linbpq/usr/sbin
+clean:
-include *.d
clean :
- rm *.d
- rm linbpq $(OBJS)
+ $(RM) *.d
+ $(RM) linbpq $(OBJS)

View File

@ -86,7 +86,7 @@
--- a/config.c
+++ b/config.c
@@ -644,7 +644,7 @@
@@ -638,7 +638,7 @@
if (LOCATOR[0] == 0 && LocSpecified == 0 && RFOnly == 0)
{
Consoleprintf("");
@ -97,7 +97,7 @@
--- a/kiss.c
+++ b/kiss.c
@@ -1485,7 +1485,7 @@
@@ -1476,7 +1476,7 @@
}
}
else

Binary file not shown.

12
kiss.c
View File

@ -78,7 +78,6 @@ int i2c_smbus_read_byte()
#include "CHeaders.h"
#include "mqtt.h"
#include "kiss.h"
int i2cPoll(struct PORTCONTROL * PORT, NPASYINFO npKISSINFO);
@ -995,10 +994,6 @@ DONTCHECKDCD:
*/
SENDFRAME(KISS, Buffer);
if (MQTT)
MQTTKISSTX(Buffer);
}
VOID SENDFRAME(struct KISSINFO * KISS, PMESSAGE Buffer)
@ -1185,10 +1180,6 @@ VOID SENDFRAME(struct KISSINFO * KISS, PMESSAGE Buffer)
ASYSEND(PORT, ENCBUFF, (int)(ptr2 - (char *)ENCBUFF));
if (MQTT)
MQTTKISSTX_RAW((char *)ENCBUFF, (int)(ptr2 - (char *)ENCBUFF), PORT);
// Pass buffer to trace routines
C_Q_ADD(&TRACE_Q, Buffer);
@ -1748,9 +1739,6 @@ SeeifMore:
}
else
*/
if (MQTT)
MQTTKISSRX_RAW((char *)Buffer, len, PORT);
C_Q_ADD(&KISS->PORT.PORTRX_Q, (UINT *)Buffer);
}

564
mailapi.c
View File

@ -1,6 +1,6 @@
// basic JASON API to BPQ Node
// Authentication is via Telnet USER records or bbs records
// Authentication is via Telnet USER records.
#define _CRT_SECURE_NO_DEPRECATE
@ -10,11 +10,6 @@
#include "CHeaders.h"
#include <stdlib.h>
#include "bpqmail.h"
#include "httpconnectioninfo.h"
struct MsgInfo * GetMsgFromNumber(int msgno);
BOOL CheckUserMsg(struct MsgInfo * Msg, char * Call, BOOL SYSOP);
char * doXMLTransparency(char * string);
// Constants
@ -27,92 +22,17 @@ typedef struct MailToken {
time_t expiration_time;
struct UserInfo * User;
char Call[10];
int Auth; // Security level of user
struct MailToken* next;
} MailToken;
static MailToken * token_list = NULL;
typedef struct MailAPI
{
char *URL;
int URLLen;
int (* APIRoutine)();
int Auth;
} MailAPI;
// Auth defines
#define AuthNone 0
#define AuthUser 1
#define AuthBBSUser 2
#define AuthSysop 4
static int verify_token(const char* token);
static void remove_expired_tokens();
static int request_token(char * response);
static void add_token_to_list(MailToken* token);
static MailToken * find_token(const char* token);
int sendMsgList(struct HTTPConnectionInfo * Session, char * response, char * Rest, int Auth);
int sendFwdQueueLen(struct HTTPConnectionInfo * Session, char * response, char * Rest, int Auth);
int sendFwdConfig(struct HTTPConnectionInfo * Session, char * response, char * Rest, int Auth);
static struct MailAPI APIList[] =
{
"/mail/api/v1/msgs", 17, sendMsgList, 0,
"/mail/api/v1/FwdQLen", 20, sendFwdQueueLen, AuthSysop,
"/mail/api/v1/FwdConfig", 22, sendFwdConfig, AuthSysop,
};
static int APICount = sizeof(APIList) / sizeof(struct MailAPI);
#ifndef WIN32
iconv_t * icu = NULL;
#endif
void APIConvertTitletoUTF8(char * Title, char * UTF8Title, int Len)
{
if (WebIsUTF8(Title, (int)strlen(Title)) == FALSE)
{
// With Windows it is simple - convert using current codepage
// I think the only reliable way is to convert to unicode and back
int origlen = (int)strlen(Title) + 1;
#ifdef WIN32
WCHAR BufferW[128];
int wlen;
int len = origlen;
wlen = MultiByteToWideChar(CP_ACP, 0, Title, len, BufferW, origlen * 2);
len = WideCharToMultiByte(CP_UTF8, 0, BufferW, wlen, UTF8Title, origlen * 2, NULL, NULL);
#else
size_t left = Len - 1;
size_t len = origlen;
if (icu == NULL)
icu = iconv_open("UTF-8//IGNORE", "CP1252");
if (icu == (iconv_t)-1)
{
strcpy(UTF8Title, Title);
icu = NULL;
return;
}
char * orig = UTF8Title;
iconv(icu, NULL, NULL, NULL, NULL); // Reset State Machine
iconv(icu, &Title, &len, (char ** __restrict__)&UTF8Title, &left);
#endif
}
else
strcpy(UTF8Title, Title);
}
static MailToken * generate_token()
{
// Generate a random authentication token
@ -152,6 +72,29 @@ static void add_token_to_list(MailToken * token)
}
}
static int verify_token(const char* token)
{
// Find the token in the token list
MailToken * existing_token = find_token(token);
if (existing_token != NULL)
{
// Check if the token has expired
time_t current_time = time(NULL);
if (current_time > existing_token->expiration_time)
{
// Token has expired, remove it from the token list
remove_expired_tokens();
return 0;
}
// Token is valid
return 1;
}
// Token doesn't exist in the token list
return 0;
}
static void remove_expired_tokens()
{
time_t current_time = time(NULL);
@ -183,7 +126,6 @@ static void remove_expired_tokens()
static MailToken * find_token(const char* token)
{
MailToken * current_token = token_list;
while (current_token != NULL)
{
if (strcmp(current_token->token, token) == 0)
@ -201,160 +143,7 @@ static int send_http_response(char * response, const char* msg)
}
int MailAPIProcessHTTPMessage(struct HTTPConnectionInfo * Session, char * response, char * Method, char * URL, char * request, BOOL LOCAL, char *Params, char * TokenString)
{
char * pass = strlop(Params, '&');
int Flags = 0, n;
MailToken * Token;
char Msg[64];
struct UserInfo * User;
int Auth = 0;
if (LOCAL)
Auth = AuthSysop;
// Check if the request is for token generation
if (strcmp(Method, "GET") != 0)
return send_http_response(response, "403 (Bad Method)");
if (_stricmp(URL, "/mail/api/v1/login") == 0)
{
// Key is in Session->Key
// Signon may have been validated in Node. If Session->Callsign is set
if (Session->Callsign[0] == 0)
{
// Try BBS logon
User = LookupCall(Params);
if (User)
{
// Check Password
if (pass[0] == 0 || strcmp(User->pass, pass) != 0 || User->flags & F_Excluded)
return send_http_response(response, "403 (Login Failed)");
strcpy(Session->Callsign, User->Call);
Auth = AuthBBSUser;
if (User->flags & F_SYSOP)
Auth |= AuthSysop;
}
}
else
{
User = LookupCall(Session->Callsign);
if (User)
{
Auth = AuthUser;
if (User->flags & F_SYSOP)
Auth |= AuthSysop;
}
}
n = sprintf_s(Msg, sizeof(Msg), "API Connect from %s", _strupr(Params));
WriteLogLine(NULL, '|',Msg, n, LOG_BBS);
Token = zalloc(sizeof(MailToken));
strcpy(Token->token, Session->Key);
strcpy(Token->Call, Session->Callsign);
Token->Auth = Auth;
Token->expiration_time = time(NULL) + TOKEN_EXPIRATION; // Set token expiration time
add_token_to_list(Token);
// Return Token
sprintf(response, "{\"access_token\":\"%s\", \"expires_at\":%d, \"scope\":\"create\"}\r\n",
Token->token, Token->expiration_time);
return strlen(response);
}
// Find Token
if (TokenString[0]) // Token form Auth Header
Token = find_token(TokenString);
else
Token = find_token(Params); // Token form URL
if (Token != NULL)
{
// Check if the token has expired
time_t current_time = time(NULL);
if (current_time > Token->expiration_time)
{
// Token has expired, remove it from the token list
remove_expired_tokens();
Token = NULL;
}
}
if (Token)
Auth |= Token->Auth;
// Determine the requested API endpoint
for (n = 0; n < APICount; n++)
{
struct MailAPI * APIEntry;
char * rest;
APIEntry = &APIList[n];
if (_memicmp(URL, APIEntry->URL, APIEntry->URLLen) == 0)
{
rest = &request[4 + APIEntry->URLLen]; // Anything following?
if (rest[0] =='?')
{
//Key
strlop(rest, ' ');
strlop(rest, '&');
Token = find_token(&rest[1]);
if (Token)
{
strcpy(Session->Callsign, Token->Call);
strcpy(Session->Key, Token->token);
}
else
return send_http_response(response, "403 (Invalid Security Token)");
}
if (APIEntry->Auth)
{
// Check Level
if ((Auth & APIEntry->Auth) == 0)
return send_http_response(response, "403 (Not Authorized)");
}
if (rest[0] == ' ' || rest[0] == '/' || rest[0] == '?')
{
return APIEntry->APIRoutine(Session, response, rest, Auth);
}
}
}
return send_http_response(response, "401 Invalid API Call");
return 0;
}
int WebMailAPIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, char *Params)
int MailAPIProcessHTTPMessage(char * response, char * Method, char * URL, char * request, BOOL LOCAL, char *Params)
{
char * pass = strlop(Params, '&');
int Flags = 0;
@ -396,7 +185,7 @@ int WebMailAPIProcessHTTPMessage(char * response, char * Method, char * URL, cha
// Return Token
sprintf(response, "{\"access_token\":\"%s\", \"expires_in\":%d, \"scope\":\"create\"}\r\n",
Token->token, Token->expiration_time);
Token->token, TOKEN_EXPIRATION);
return strlen(response);
@ -405,304 +194,3 @@ int WebMailAPIProcessHTTPMessage(char * response, char * Method, char * URL, cha
return 0;
}
// Unauthorised users can only get bulls.
// Autothorised may read only users message or all messages depending on sysop status
int sendMsgList(struct HTTPConnectionInfo * Session, char * response, char * Rest, int Auth)
{
struct UserInfo * User = LookupCall(Session->Callsign);
int m;
struct MsgInfo * Msg;
char * ptr = response;
int n = NumberofMessages; //LineCount;
char Via[64];
int Count = 0;
struct UserInfo DummyUser = {""};
ptr[0] = 0;
if (User == 0)
User=&DummyUser;
n = sprintf(ptr,"{\"msgs\":[\r\n");
ptr += n;
for (m = LatestMsg; m >= 1; m--)
{
if (ptr > &response[244000])
break; // protect buffer
Msg = GetMsgFromNumber(m);
if (Msg == 0 || Msg->type == 0 || Msg->status == 0)
continue; // Protect against corrupt messages
if (Msg && CheckUserMsg(Msg, User->Call, Auth & AuthSysop))
{
char UTF8Title[4096];
char * EncodedTitle;
// List if it is the right type and in the page range we want
if (Count++ < Session->WebMailSkip)
continue;
ptr += sprintf(ptr, "{\r\n");
strcpy(Via, Msg->via);
strlop(Via, '.');
// make sure title is HTML safe (no < > etc) and UTF 8 encoded
EncodedTitle = doXMLTransparency(Msg->title);
memset(UTF8Title, 0, 4096); // In case convert fails part way through
APIConvertTitletoUTF8(EncodedTitle, UTF8Title, 4095);
ptr += sprintf(ptr, "\"id\": \"%d\",\r\n", Msg->number);
ptr += sprintf(ptr, "\"mid\": \"%s\",\r\n", Msg->bid);
ptr += sprintf(ptr, "\"rcvd\": \"%d\",\r\n", Msg->datecreated);
ptr += sprintf(ptr, "\"type\": \"%c\",\r\n", Msg->type);
ptr += sprintf(ptr, "\"status\": \"%c\",\r\n", Msg->status);
ptr += sprintf(ptr, "\"to\": \"%s\",\r\n", Msg->to);
ptr += sprintf(ptr, "\"from\": \"%s\",\r\n", Msg->from);
ptr += sprintf(ptr, "\"size\": \"%d\",\r\n", Msg->length);
ptr += sprintf(ptr, "\"subject\": \"%s\"\r\n", UTF8Title);
free(EncodedTitle);
// ptr += sprintf(ptr, "<a href=/WebMail/WM?%s&%d>%6d</a> %s %c%c %5d %-8s%-8s%-8s%s\r\n",
// Session->Key, Msg->number, Msg->number,
// FormatDateAndTime((time_t)Msg->datecreated, TRUE), Msg->type,
// Msg->status, Msg->length, Msg->to, Via,
// Msg->from, UTF8Title);
ptr += sprintf(ptr, "},\r\n");
n--;
if (n == 0)
break;
}
}
if (response[n] == 0) // No entries
{
response[strlen(response) - 2] = '\0'; // remove \r\n
strcat(response, "]}\r\n");
}
else
{
response[strlen(response)-3 ] = '\0'; // remove ,\r\n
strcat(response, "\r\n]}\r\n");
}
return strlen(response);
}
int sendFwdQueueLen(struct HTTPConnectionInfo * Session, char * response, char * Rest, int Auth)
{
struct UserInfo * USER;
char * ptr = response;
int n;
int i = 0;
int Len = 0;
n = sprintf(ptr,"{\"forwardqueuelength\":[\r\n");
ptr += n;
for (USER = BBSChain; USER; USER = USER->BBSNext)
{
int Count = CountMessagestoForward (USER);
ptr += sprintf(ptr, "{");
ptr += sprintf(ptr, "\"call\": \"%s\",", USER->Call);
ptr += sprintf(ptr, "\"queueLength\": \"%d\"", Count);
ptr += sprintf(ptr, "},\r\n");
}
if (response[n] == 0) // No entries
{
response[strlen(response) - 2] = '\0'; // remove \r\n
strcat(response, "]}\r\n");
}
else
{
response[strlen(response)-3 ] = '\0'; // remove ,\r\n
strcat(response, "\r\n]}\r\n");
}
return strlen(response);
}
VOID APIMultiStringValue(char ** values, char * Multi)
{
char ** Calls;
char * ptr = &Multi[0];
*ptr = 0;
if (values)
{
Calls = values;
while(Calls[0])
{
ptr += sprintf(ptr, "\"%s\",", Calls[0]);
Calls++;
}
if (ptr != &Multi[0])
*(--ptr) = 0;
}
}
char * APIConvTime(int ss)
{
int hh, mm;
static char timebuf[64];
hh = ss / 3600;
mm = (ss - (hh * 3600)) / 60;
ss = ss % 60;
sprintf(timebuf, "\"%02d:%02d:%02d\"", hh, mm, ss);
return timebuf;
}
int sendFwdConfig(struct HTTPConnectionInfo * Session, char * response, char * Rest, int Auth)
{
struct UserInfo * USER;
char * ptr = response;
int n = 0;
int i = 0;
int Len = 0;
response[n] = 0;
n = sprintf(ptr, "{\r\n");
ptr += n;
for (USER = BBSChain; USER; USER = USER->BBSNext)
{
struct BBSForwardingInfo * FWDInfo = USER->ForwardingInfo;
int Count = CountMessagestoForward (USER);
char TO[2048] = "";
char AT[2048] = "";
char TIMES[2048] = "";
char FWD[100000] = "";
char HRB[2048] = "";
char HRP[2048] = "";
APIMultiStringValue(FWDInfo->TOCalls, TO);
APIMultiStringValue(FWDInfo->ATCalls, AT);
APIMultiStringValue(FWDInfo->FWDTimes, TIMES);
APIMultiStringValue(FWDInfo->ConnectScript, FWD);
APIMultiStringValue(FWDInfo->Haddresses, HRB);
APIMultiStringValue(FWDInfo->HaddressesP, HRP);
ptr += sprintf(ptr, " \"%s\": {\r\n", USER->Call);
ptr += sprintf(ptr, " \"queueLength\": %d,\r\n", Count);
ptr += sprintf(ptr, " \"to\": [%s],\r\n", TO);
ptr += sprintf(ptr, " \"at\": [%s],\r\n", AT);
ptr += sprintf(ptr, " \"hrp\": [%s],\r\n",HRP);
ptr += sprintf(ptr, " \"hrb\": [%s],\r\n",HRB);
ptr += sprintf(ptr, " \"times\": [%s],\r\n",TIMES);
ptr += sprintf(ptr, " \"connectScript\": [%s],\r\n",FWD);
ptr += sprintf(ptr, " \"bbsHa\": \"%s\",\r\n", (FWDInfo->BBSHA)?FWDInfo->BBSHA:"");
ptr += sprintf(ptr, " \"enableForwarding\": %s,\r\n", (FWDInfo->Enabled)?"true":"false");
ptr += sprintf(ptr, " \"forwardingInterval\": %s,\r\n", APIConvTime(FWDInfo->FwdInterval));
ptr += sprintf(ptr, " \"requestReverse\": %s,\r\n", (FWDInfo->ReverseFlag)?"true":"false");
ptr += sprintf(ptr, " \"reverseInterval\": %s,\r\n", APIConvTime(FWDInfo->RevFwdInterval));
ptr += sprintf(ptr, " \"sendNewMessagesWithoutWaiting\": %s,\r\n", (FWDInfo->SendNew)?"true":"false");
ptr += sprintf(ptr, " \"fbbBlocked\": %s,\r\n", (FWDInfo->AllowBlocked)?"true":"false");
ptr += sprintf(ptr, " \"maxBlock\": %d,\r\n", FWDInfo->MaxFBBBlockSize);
ptr += sprintf(ptr, " \"sendPersonalMailOnly\": %s,\r\n", (FWDInfo->PersonalOnly)?"true":"false");
ptr += sprintf(ptr, " \"allowBinary\": %s,\r\n", (FWDInfo->AllowCompressed)?"true":"false");
ptr += sprintf(ptr, " \"useB1Protocol\": %s,\r\n", (FWDInfo->AllowB1)?"true":"false");
ptr += sprintf(ptr, " \"useB2Protocol\": %s,\r\n", (FWDInfo->AllowB2)?"true":"false");
ptr += sprintf(ptr, " \"incomingConnectTimeout\": %s\r\n", APIConvTime(FWDInfo->ConTimeout));
ptr += sprintf(ptr, " },\r\n");
}
if (response[n] == 0) // No entries
{
strcpy(response, "{}\r\n");
}
else
{
response[strlen(response)-3 ] = '\0'; // remove ,\r\n
strcat(response, "\r\n}\r\n");
}
return strlen(response);
}
/*
{
"GB7BEX": {
"queueLength": 0,
"forwardingConfig": {
"to": [],
"at": [
"OARC",
"GBR",
"WW"
],
"times": [],
"connectScript": [
"PAUSE 3",
"INTERLOCK 3",
"NC 3 !GB7BEX"
],
"hierarchicalRoutes": [],
"hr": [
"#38.GBR.EURO"
],
"bbsHa": "GB7BEX.#38.GBR.EURO",
"enableForwarding": true,
"forwardingInterval": "00:56:40",
"requestReverse": false,
"reverseInterval": "00:56:40",
"sendNewMessagesWithoutWaiting": true,
"fbbBlocked": true,
"maxBlock": 1000,
"sendPersonalMailOnly": false,
"allowBinary": true,
"useB1Protocol": false,
"useB2Protocol": true,
"sendCtrlZInsteadOfEx": false,
"incomingConnectTimeout": "00:02:00"
}
},
"GB7RDG": {
"queueLength": 0,
"forwardingConfig": {
"to": [],
...
"incomingConnectTimeout": "00:02:00"
}
}
}
# HELP packetmail_queue_length The number of messages in the packetmail queue
# TYPE packetmail_queue_length gauge
packetmail_queue_length{partner="DM4RW"} 0 1729090716916
packetmail_queue_length{partner="G8BPQ"} 3 1729090716916
packetmail_queue_length{partner="GB7BEX"} 0 1729090716916
packetmail_queue_length{partner="GB7BPQ"} 1 1729090716916
packetmail_queue_length{partner="GB7MNS"} 0 1729090716916
packetmail_queue_length{partner="GB7NOT"} 0 1729090716916
packetmail_queue_length{partner="GB7NWL"} 0 1729090716916
packetmail_queue_length{partner="GM8BPQ"} 0 1729090716916
*/

View File

@ -13,26 +13,22 @@ OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pn
MailCommands.o MailDataDefs.o LinBPQ.o MailRouting.o MailTCP.o MBLRoutines.o md5.o Moncode.o \
NNTPRoutines.o RigControl.o TelnetV6.o WINMOR.o TNCCode.o UZ7HODrv.o WPRoutines.o \
SCSTrackeMulti.o SCSPactor.o SCSTracker.o HanksRT.o UIRoutines.o AGWAPI.o AGWMoncode.o \
DRATS.o FreeDATA.o base64.o Events.o nodeapi.o mailapi.o mqtt.o
DRATS.o FreeDATA.o base64.o Events.o nodeapi.o mailapi.o
# Configuration:
CC = gcc
all: CFLAGS = -DLINBPQ -MMD -g -fcommon
all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a
all: linbpq
nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -DNOMQTT
nomqtt: linbpq
noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -fcommon
noi2c: linbpq
linbpq: $(OBJS)
gcc $(OBJS) -Xlinker -Map=output.map -l:libminiupnpc.a -lrt -lm -lz $(LDFLAGS) -lpthread -lconfig -lpcap -o linbpq
gcc $(OBJS) -Xlinker -Map=output.map -l:libminiupnpc.a -lrt -lm -lz -lpthread -lconfig -lpcap -o linbpq
sudo setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq
-include *.d

382
mqtt.c
View File

@ -1,382 +0,0 @@
#define _CRT_SECURE_NO_DEPRECATE
#ifndef NOMQTT
#include "MQTTAsync.h"
#ifndef WIN32
#include <jansson.h>
#endif
#include "CHeaders.h"
#include "asmstrucs.h"
#include "mqtt.h"
extern int MQTT_Connecting;
extern int MQTT_Connected;
DllExport int APIENTRY MQTTSend(char * topic, char * Msg, int MsgLen);
MQTTAsync client = NULL;
time_t MQTTLastStatus = 0;
void MQTTSendStatus()
{
char topic[256];
char payload[128];
sprintf(topic, "PACKETNODE/%s", NODECALLLOPPED);
strcpy(payload,"{\"status\":\"online\"}");
MQTTSend(topic, payload, strlen(payload));
MQTTLastStatus = time(NULL);
}
void MQTTTimer()
{
if (MQTT_Connecting == 0 && MQTT_Connected == 0)
MQTTConnect(MQTT_HOST, MQTT_PORT, MQTT_USER, MQTT_PASS);
if ((time(NULL) - MQTTLastStatus) > 1800)
MQTTSendStatus();
}
void MQTTDisconnect()
{
if (MQTT_Connected)
{
MQTTAsync_disconnectOptions disc_opts = MQTTAsync_disconnectOptions_initializer;
MQTTAsync_disconnect(client, &disc_opts);
MQTT_Connecting = MQTT_Connected = 0;
// Try to recconect. If it fails system will rety every minute
MQTTConnect(MQTT_HOST, MQTT_PORT, MQTT_USER, MQTT_PASS);
}
}
DllExport int APIENTRY MQTTSend(char * topic, char * Msg, int MsgLen)
{
int rc;
MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
pubmsg.payload = Msg;
pubmsg.payloadlen = MsgLen;
rc = MQTTAsync_sendMessage(client, topic, &pubmsg, &opts);
if (rc)
MQTTDisconnect();
return rc;
}
void onConnect(void* context, MQTTAsync_successData* response)
{
MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
MQTT_Connecting = 0;
MQTT_Connected = 1;
printf("Successful MQTT connection\n");
// Send start up message
MQTTSendStatus();
}
void onConnectFailure(void* context, MQTTAsync_failureData* response)
{
printf("MQTT connection failed, rc %d\n", response ? response->code : 0);
MQTT_Connecting = 0;
}
char* jsonEncodeMessage(MESSAGE *msg)
{
char From[10];
char To[10];
char buffer[1024];
unsigned long long SaveMMASK = MMASK;
BOOL SaveMTX = MTX;
BOOL SaveMCOM = MCOM;
BOOL SaveMUI = MUIONLY;
int len;
char *msg_str;
char payload_timestamp[16];
struct tm * TM = localtime(&msg->Timestamp);
sprintf(payload_timestamp, "%02d:%02d:%02d", TM->tm_hour, TM->tm_min, TM->tm_sec);
IntSetTraceOptionsEx(MMASK, TRUE, TRUE, FALSE);
From[ConvFromAX25(msg->ORIGIN, From)] = 0;
To[ConvFromAX25(msg->DEST, To)] = 0;
len = IntDecodeFrame(msg, buffer, msg->Timestamp, 0xffffffffffffffff, FALSE, FALSE);
IntSetTraceOptionsEx(SaveMMASK, SaveMTX, SaveMCOM, SaveMUI);
buffer[len] = 0;
#ifdef WIN32
msg_str = zalloc(2048);
sprintf(msg_str, "{\"from\": \"%s\", \"to\": \"%s\", \"payload\": \"%s\", \"port\": %d, \"timestamp\": \"%s\"}",
From, To, buffer, msg->PORT, payload_timestamp);
#else
json_t *root;
root = json_object();
json_object_set_new(root, "from", json_string(From));
json_object_set_new(root, "to", json_string(To));
json_object_set_new(root, "payload", json_string(buffer));
json_object_set_new(root, "port", json_integer(msg->PORT));
sprintf(payload_timestamp, "%02d:%02d:%02d", TM->tm_hour, TM->tm_min, TM->tm_sec);
json_object_set_new(root, "timestamp", json_string(payload_timestamp));
msg_str = json_dumps(root, 0);
json_decref(root);
#endif
return msg_str;
}
void MQTTKISSTX(void *message)
{
MESSAGE *msg = (MESSAGE *)message;
char topic[256];
char *msg_str;
sprintf(topic, "PACKETNODE/ax25/trace/bpqformat/%s/sent/%d", NODECALLLOPPED, msg->PORT);
msg_str = jsonEncodeMessage(msg);
MQTTSend(topic, msg_str, strlen(msg_str));
free(msg_str);
}
void MQTTKISSTX_RAW(char* buffer, int bufferLength, void* PORT)
{
PPORTCONTROL PPORT = (PPORTCONTROL)PORT;
char topic[256];
sprintf(topic, "PACKETNODE/kiss/%s/sent/%d", NODECALLLOPPED, PPORT->PORTNUMBER);
MQTTSend(topic, buffer, bufferLength);
}
void MQTTKISSRX(void *message)
{
MESSAGE *msg = (MESSAGE *)message;
char topic[256];
char *msg_str;
sprintf(topic, "PACKETNODE/ax25/trace/bpqformat/%s/rcvd/%d", NODECALLLOPPED, msg->PORT);
msg_str = jsonEncodeMessage(msg);
MQTTSend(topic, msg_str, strlen(msg_str));
free(msg_str);
}
void MQTTKISSRX_RAW(char* buffer, int bufferLength, void* PORT)
{
PPORTCONTROL PPORT = (PPORTCONTROL)PORT;
char topic[256];
sprintf(topic, "PACKETNODE/kiss/%s/rcvd/%d", NODECALLLOPPED, PPORT->PORTNUMBER);
MQTTSend(topic, buffer, bufferLength);
}
void MQTTReportSession(char * Msg)
{
char topic[256];
sprintf(topic, "PACKETNODE/stats/session/%s", NODECALLLOPPED);
MQTTSend(topic, Msg, strlen(Msg));
}
char* replace(char* str, char* a, char* b)
{
int len = strlen(str);
int lena = strlen(a), lenb = strlen(b);
char * p;
for (p = str; p = strstr(p, a); p) {
if (lena != lenb) // shift end as needed
memmove(p + lenb, p + lena,
len - (p - str) + lenb);
memcpy(p, b, lenb);
}
return str;
}
int MQTTPublish(void *message, char *topic)
{
MESSAGE *msg = (MESSAGE *)message;
char From[10];
char To[10];
MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
unsigned long long SaveMMASK = MMASK;
BOOL SaveMTX = MTX;
BOOL SaveMCOM = MCOM;
BOOL SaveMUI = MUIONLY;
int len;
char* replaced_buffer;
char buffer[1024];
time_t timestamp = msg->Timestamp;
From[ConvFromAX25(msg->ORIGIN, From)] = 0;
To[ConvFromAX25(msg->DEST, To)] = 0;
IntSetTraceOptionsEx(8, TRUE, TRUE, FALSE);
len = IntDecodeFrame(msg, buffer, timestamp, 1, FALSE, FALSE);
IntSetTraceOptionsEx(SaveMMASK, SaveMTX, SaveMCOM, SaveMUI);
// MQTT _really_ doesn't like \r, so replace it with something
// that is at least human readable
replaced_buffer = replace(buffer, "\r", "\r\n");
pubmsg.payload = replaced_buffer;
pubmsg.payloadlen = strlen(replaced_buffer);
printf("%s\n", replaced_buffer);
return MQTTAsync_sendMessage(client, topic, &pubmsg, &opts);
}
int MQTTConnect(char* host, int port, char* user, char* pass)
{
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
int rc;
char hostString[256];
sprintf(hostString, "tcp://%s:%d", host, port);
printf("MQTT Connect to %s\n", hostString);
rc = MQTTAsync_create(&client, hostString, NODECALLLOPPED, MQTTCLIENT_PERSISTENCE_NONE, NULL);
if (rc != MQTTASYNC_SUCCESS)
{
printf("Failed to create client, return code %d\n", rc);
return rc;
}
conn_opts.keepAliveInterval = 20;
conn_opts.cleansession = 1;
conn_opts.username = user;
conn_opts.password = pass;
conn_opts.onSuccess = onConnect;
conn_opts.onFailure = onConnectFailure;
// conn_opts.automaticReconnect = 1;
// conn_opts.minRetryInterval = 30;
// conn_opts.maxRetryInterval = 300;
rc = MQTTAsync_connect(client, &conn_opts);
if (rc != MQTTASYNC_SUCCESS)
{
printf("Failed to start connect, return code %d\n", rc);
return rc;
}
MQTT_Connecting = 1;
return 0;
}
/*
void MQTTMessageEvent(void* message)
{
struct MsgInfo* msg = (struct MsgInfo *)message;
char *msg_str;
char * ptr;
MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
char topic[256];
json_t *root = json_object();
json_object_set_new(root, "id", json_integer(msg->number));
json_object_set_new(root, "size", json_integer(msg->length));
json_object_set_new(root, "type", json_string(msg->type == 'P' ? "P" : "B"));
json_object_set_new(root, "to", json_string(msg->to));
json_object_set_new(root, "from", json_string(msg->from));
json_object_set_new(root, "subj", json_string(msg->title));
switch(msg->status) {
case 'N':
json_object_set_new(root, "event", json_string("newmsg"));
break;
case 'F':
json_object_set_new(root, "event", json_string("fwded"));
break;
case 'R':
json_object_set_new(root, "event", json_string("read"));
break;
case 'K':
json_object_set_new(root, "event", json_string("killed"));
break;
}
msg_str = json_dumps(root, 0);
pubmsg.payload = msg_str;
pubmsg.payloadlen = strlen(msg_str);
sprintf(topic, "PACKETNODE/event/%s/pmsg", NODECALLLOPPED);
MQTTAsync_sendMessage(client, topic, &pubmsg, &opts);
}
*/
#else
// Dummies ofr build without MQTT libraries
int MQTTConnect(char* host, int port, char* user, char* pass)
{
return 0;
}
void MQTTKISSTX(void *message) {};
void MQTTKISSTX_RAW(char* buffer, int bufferLength, void* PORT) {};
void MQTTKISSRX(void *message) {};
void MQTTKISSRX_RAW(char* buffer, int bufferLength, void* PORT) {};
void MQTTTimer() {};
void MQTTReportSession(char * Msg) {};
#endif

10
mqtt.h
View File

@ -1,10 +0,0 @@
int MQTTConnect(char* host, int port, char* user, char* pass);
int MQTTPublish(void * msg, char *topic);
void MQTTKISSTX(void *message);
void MQTTKISSTX_RAW(char* buffer, int bufferLength, void* PORT);
void MQTTKISSRX(void *message);
void MQTTKISSRX_RAW(char* buffer, int bufferLength, void* PORT);
void MQTTMessageEvent(void *message);

130
nodeapi.c
View File

@ -22,20 +22,6 @@ typedef struct Token {
struct Token* next;
} Token;
typedef struct API
{
char *URL;
int URLLen;
int (* APIRoutine)();
int Auth;
} API;
// Auth defines
#define AuthNone 0
#define AuthUser 1
#define Auth BBSUser 2
#define AuthSysop 4
// Function prototypes
void handle_request(SOCKET client_socket, char * request, char * response);
@ -50,12 +36,12 @@ void add_token_to_list(Token* token);
Token* find_token(const char* token);
Token* generate_token();
int sendPortList(char * response, char * token, char * Rest);
int sendNodeList(char * response, char * token, char * Rest);
int sendUserList(char * response, char * token, char * Rest);
int sendInfo(char * response, char * token, char * Rest);
int sendLinks(char * response, char * token, char * Rest);
int sendPortMHList(char * response, char * token, char * Rest);
int sendPortList(char * response, char * token,int Flags);
int sendNodeList(char * response, char * token,int Flags);
int sendUserList(char * response, char * token,int Flags);
int sendInfo(char * response, char * token, int Flags);
int sendLinks(char * response, char * token, int Flags);
int sendPortMHList(char * response, char * token, int param);
void BuildPortMH(char * MHJSON, struct PORTCONTROL * PORT);
DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
@ -63,21 +49,6 @@ DllExport struct PORTCONTROL * APIENTRY GetPortTableEntryFromSlot(int portslot);
// Token list
Token* token_list = NULL;
struct API APIList[] =
{
"/api/ports", 10, sendPortList, 0,
"/api/nodes", 10, sendNodeList, 0,
"/api/info", 9, sendInfo, 0,
"/api/links", 10, sendLinks, 0,
"/api/users", 10, sendUserList, 0,
"/api/mheard", 11, sendPortMHList, 0
};
int APICount = sizeof(APIList) / sizeof(struct API);
int xx()
{
while (1)
@ -96,7 +67,7 @@ int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * req
const char * auth_header = "Authorization: Bearer ";
char * token_begin = strstr(request, auth_header);
char token[TOKEN_SIZE + 1]= "";
int Flags = 0, n;
int Flags = 0;
// Node Flags isn't currently used
@ -123,7 +94,7 @@ int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * req
}
else
{
// There may be a token as first param, but if auth not needed may be misisng
// Token must be first param of URL
Tok = strlop(URL, '?');
param = strlop(Tok, '&');
@ -134,33 +105,18 @@ int APIProcessHTTPMessage(char * response, char * Method, char * URL, char * req
strcpy(token, Tok);
}
else param = Tok;
}
remove_expired_tokens(); // Tidy up
// Check if the request is for token generation
if (strcmp(Method, "OPTIONS") == 0)
{
// CORS Request
char Resp[] =
"HTTP/1.1 200 OK\r\n"
"Access-Control-Allow-Origin: *\r\n"
"Access-Control-Allow-Methods: POST, GET, OPTIONS\r\n"
"Access-Control-Allow-Headers: authorization";
return send_http_response(response, Resp);
}
if (strcmp(Method, "GET") != 0)
return send_http_response(response, "403 (Bad Method)");
if (_stricmp(URL, "/api/request_token") == 0)
return request_token(response);
/*
if (token[0] == 0)
{
// Extract the token from the request (assuming it's present in the request headers)
@ -181,26 +137,20 @@ if (token[0] == 0)
return send_http_response(response, "401 Unauthorized");
}
*/
// Determine the requested API endpoint
for (n = 0; n < APICount; n++)
{
struct API * APIEntry;
char * rest;
APIEntry = &APIList[n];
if (_memicmp(URL, APIEntry->URL, APIEntry->URLLen) == 0)
{
rest = &request[4 + APIEntry->URLLen]; // Anything following?
if (rest[0] == ' ' || rest[0] == '/' || rest[0] == '?')
return APIEntry->APIRoutine(response, token, rest);
}
}
if (_stricmp(URL, "/api/ports") == 0)
return sendPortList(response, token, Flags);
else if (_stricmp(URL, "/api/nodes") == 0)
return sendNodeList(response, token, Flags);
else if (_stricmp(URL, "/api/users") == 0)
return sendUserList(response, token, Flags);
else if (_stricmp(URL, "/api/info") == 0)
return sendInfo(response, token, Flags);
else if (_stricmp(URL, "/api/links") == 0)
return sendLinks(response, token, Flags);
else if (strstr(URL, "/api/mheardport") != 0)
return sendPortMHList(response, token, atoi(param));
return send_http_response(response, "401 Invalid API Call");
}
@ -344,7 +294,7 @@ int send_http_response(char * response, const char* msg)
extern int MasterPort[MAXBPQPORTS+1]; // Pointer to first BPQ port for a specific MPSK or UZ7HO host
int sendPortList(char * response, char * token, char * param)
int sendPortList(char * response, char * token, int Flags)
{
char * Array = 0;
int ArrayLen = 0;
@ -556,7 +506,7 @@ extern struct DEST_LIST * DESTS; // NODE LIST
extern int DEST_LIST_LEN;
int sendNodeList(char * response, char * token, char * param)
int sendNodeList(char * response, char * token, int Flags)
{
int ArrayPtr = 0;
@ -660,16 +610,16 @@ int sendNodeList(char * response, char * token, char * param)
}
int sendUserList(char * response, char * token, char * param)
int sendUserList(char * response, char * token, int Flags)
{
int ArrayPtr = 0;
int n = MAXCIRCUITS;
TRANSPORTENTRY * L4 = L4TABLE;
// TRANSPORTENTRY * Partner;
TRANSPORTENTRY * Partner;
int MaxLinks = MAXLINKS;
char State[12] = "", Type[12] = "Uplink";
char LHS[50] = "", MID[10] = "", RHS[50] = "";
// char Line[100];
char Line[100];
char Normcall[10];
int len;
@ -684,7 +634,7 @@ int sendUserList(char * response, char * token, char * param)
len = ConvFromAX25(L4->L4USER, Normcall);
Normcall[len] = 0;
ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\": \"%s\"},\r\n", Normcall);
ArrayPtr += sprintf(&response[ArrayPtr], " {\"Call\", \"%s\"},\r\n", Normcall);
L4++;
}
}
@ -706,7 +656,7 @@ extern char MYALIASLOPPED[];
extern char TextVerstring[];
extern char LOCATOR[];
int sendInfo(char * response, char * token, char * param)
int sendInfo(char * response, char * token, int Flags)
{
char call[10];
@ -719,7 +669,7 @@ int sendInfo(char * response, char * token, char * param)
return strlen(response);
}
int sendLinks(char * response, char * token, char * param)
int sendLinks(char * response, char * token, int Flags)
{
struct _LINKTABLE * Links = LINKS;
int MaxLinks = MAXLINKS;
@ -784,36 +734,18 @@ int sendLinks(char * response, char * token, char * param)
return ReplyLen;
}
int sendPortMHList(char * response, char * token, char * param)
int sendPortMHList(char * response, char * token, int param)
{
struct PORTCONTROL * PORTVEC ;
int n;
int port = 0;
struct PORTCONTROL * PORTVEC = GetPortTableEntryFromPortNum(param);
if (param[0] = '?' || param[0] == '/')
port = atoi(&param[1]);
PORTVEC = GetPortTableEntryFromPortNum(port);
response[0] = 0;
if (PORTVEC == 0)
return send_http_response(response, "401 Invalid API Call");
n = sprintf(response,"{\"mheard\":[\r\n");
BuildPortMH(&response[n], PORTVEC );
if (response[n] == 0) // No entries
{
response[strlen(response) - 2] = '\0'; // remove \r\n
strcat(response, "]}\r\n");
}
else
{
BuildPortMH( response, PORTVEC );
response[ strlen(response)-3 ] = '\0'; // remove ,\r\n
strcat(response, "\r\n]}\r\n");
// printf("MH for port %d:\r\n%s\r\n", PORTVEC->PORTNUMBER, response);
}
return strlen(response);
}

Binary file not shown.

Binary file not shown.

View File

@ -222,20 +222,14 @@ struct STREAMINFO
char MyCall[10] ; // Call we are using
char RemoteCall[10]; // Callsign
char callingCall[10]; // for reporting. Link and Our calls depand on which end connected
char receivingCall[10]; // for reporting. Link and Our calls depand on which end connected
char Direction[4]; // In or Out
char AGWKey[21]; // Session Key for AGW Session Based Drivers
time_t ConnectTime; // Time connection made
time_t AttachTime;
int bytesTXed;
int BytesTXed;
int BytesAcked;
int bytesRXed;
int BytesRXed;
int PacketsSent;
int BytesResent;
int BytesOutstanding; // For Packet Channels

Binary file not shown.