mirror of git://vps1.g8bpq.net/linbpq
parent
4a7536c236
commit
2af4cf380b
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,402 @@
|
||||
/*
|
||||
Copyright 2001-2022 John Wiseman G8BPQ
|
||||
|
||||
This file is part of LinBPQ/BPQ32.
|
||||
|
||||
LinBPQ/BPQ32 is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
LinBPQ/BPQ32 is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
|
||||
*/
|
||||
|
||||
//
|
||||
// C replacement for TNCCode.asm
|
||||
//
|
||||
#define Kernel
|
||||
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#pragma data_seg("_BPQDATA")
|
||||
|
||||
#include "time.h"
|
||||
#include "stdio.h"
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "cheaders.h"
|
||||
#include "tncinfo.h"
|
||||
|
||||
int C_Q_COUNT(VOID *PQ);
|
||||
VOID SENDUIMESSAGE(struct DATAMESSAGE * Msg);
|
||||
|
||||
VOID TNCTimerProc()
|
||||
{
|
||||
// CALLED AT 10 HZ
|
||||
|
||||
int n = BPQHOSTSTREAMS;
|
||||
PBPQVECSTRUC HOSTSESS = BPQHOSTVECTOR;
|
||||
TRANSPORTENTRY * Session;
|
||||
UCHAR DISCFLAG = 0;
|
||||
|
||||
while (n--)
|
||||
{
|
||||
// Action any DISC Requests (must be done in timer owning process)
|
||||
|
||||
if (HOSTSESS->HOSTFLAGS & 0x40) // DISC REQUEST
|
||||
{
|
||||
if (HOSTSESS->HOSTFLAGS & 0x20) // Stay?
|
||||
DISCFLAG = 'S';
|
||||
|
||||
HOSTSESS->HOSTFLAGS &= 0x9F; // Clear Flags
|
||||
|
||||
Session = HOSTSESS->HOSTSESSION;
|
||||
|
||||
if (Session == 0) // Gone??
|
||||
{
|
||||
HOSTSESS->HOSTFLAGS |= 3; // STATE CHANGE
|
||||
#ifndef LINBPQ
|
||||
if (HOSTSESS->HOSTHANDLE);
|
||||
{
|
||||
PostMessage(HOSTSESS->HOSTHANDLE, BPQMsg, HOSTSESS->HOSTSTREAM, 4);
|
||||
}
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
|
||||
if (Session->L4CROSSLINK)
|
||||
Session->L4CROSSLINK->STAYFLAG = DISCFLAG;
|
||||
|
||||
HOSTSESS->HOSTSESSION = 0;
|
||||
HOSTSESS->HOSTFLAGS |= 3; // STATE CHANGE
|
||||
|
||||
PostStateChange(Session);
|
||||
|
||||
CloseSessionPartner(Session); // SEND CLOSE TO PARTNER (IF PRESENT)
|
||||
}
|
||||
|
||||
// Check Trace Q
|
||||
|
||||
if (HOSTSESS->HOSTAPPLFLAGS & 0x80)
|
||||
{
|
||||
if (HOSTSESS->HOSTTRACEQ)
|
||||
{
|
||||
int Count = C_Q_COUNT(&HOSTSESS->HOSTTRACEQ);
|
||||
|
||||
if (Count > 100)
|
||||
ReleaseBuffer((void *)Q_REM((void *)&HOSTSESS->HOSTTRACEQ));
|
||||
}
|
||||
}
|
||||
HOSTSESS++;
|
||||
}
|
||||
}
|
||||
|
||||
VOID SendSmartID(struct PORTCONTROL * PORT)
|
||||
{
|
||||
struct _MESSAGE * ID = IDMSG;
|
||||
struct _MESSAGE * Buffer;
|
||||
|
||||
PORT->SmartIDNeeded = 0;
|
||||
|
||||
Buffer = GetBuff();
|
||||
|
||||
if (Buffer)
|
||||
{
|
||||
memcpy(Buffer, ID, ID->LENGTH);
|
||||
|
||||
Buffer->PORT = PORT->PORTNUMBER;
|
||||
|
||||
// IF PORT HAS A CALLSIGN DEFINED, SEND THAT INSTEAD
|
||||
|
||||
if (PORT->PORTCALL[0] > 0x40)
|
||||
{
|
||||
memcpy(Buffer->ORIGIN, PORT->PORTCALL, 7);
|
||||
Buffer->ORIGIN[6] |= 1; // SET END OF CALL BIT
|
||||
}
|
||||
|
||||
// If Pactor Style add to UI_Q
|
||||
|
||||
if (PORT->PROTOCOL == 10 && PORT->TNC && PORT->TNC->Hardware != H_KISSHF && PORT->UICAPABLE)
|
||||
{
|
||||
EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT;
|
||||
|
||||
C_Q_ADD(&EXTPORT->UI_Q, Buffer);
|
||||
return;
|
||||
}
|
||||
|
||||
PUT_ON_PORT_Q(PORT, Buffer);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID SENDIDMSG()
|
||||
{
|
||||
struct PORTCONTROL * PORT = PORTTABLE;
|
||||
struct _MESSAGE * ID = IDMSG;
|
||||
struct _MESSAGE * Buffer;
|
||||
|
||||
while (PORT)
|
||||
{
|
||||
if (PORT->PROTOCOL < 10) // Not Pactor-style
|
||||
{
|
||||
Buffer = GetBuff();
|
||||
|
||||
if (Buffer)
|
||||
{
|
||||
memcpy(Buffer, ID, ID->LENGTH);
|
||||
|
||||
Buffer->PORT = PORT->PORTNUMBER;
|
||||
|
||||
// IF PORT HAS A CALLSIGN DEFINED, SEND THAT INSTEAD
|
||||
|
||||
if (PORT->PORTCALL[0] > 0x40)
|
||||
{
|
||||
memcpy(Buffer->ORIGIN, PORT->PORTCALL, 7);
|
||||
Buffer->ORIGIN[6] |= 1; // SET END OF CALL BIT
|
||||
}
|
||||
C_Q_ADD(&IDMSG_Q, Buffer);
|
||||
}
|
||||
}
|
||||
PORT = PORT->PORTPOINTER;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
VOID SENDBTMSG()
|
||||
{
|
||||
struct PORTCONTROL * PORT = PORTTABLE;
|
||||
struct _MESSAGE * Buffer;
|
||||
char * ptr1, * ptr2;
|
||||
|
||||
while (PORT)
|
||||
{
|
||||
if (PORT->PROTOCOL >= 10 || PORT->PORTUNPROTO == 0) // Pactor-style or no UNPROTO ADDR?
|
||||
{
|
||||
PORT = PORT->PORTPOINTER;
|
||||
continue;
|
||||
}
|
||||
|
||||
Buffer = GetBuff();
|
||||
|
||||
if (Buffer)
|
||||
{
|
||||
memcpy(Buffer->DEST, PORT->PORTUNPROTO, 7);
|
||||
Buffer->DEST[6] |= 0xC0; // Set Command bits
|
||||
|
||||
// Send from BBSCALL unless PORTBCALL defined
|
||||
|
||||
if (PORT->PORTBCALL[0] > 32)
|
||||
memcpy(Buffer->ORIGIN, PORT->PORTBCALL, 7);
|
||||
else if (APPLCALLTABLE->APPLCALL[0] > 32)
|
||||
memcpy(Buffer->ORIGIN, APPLCALLTABLE->APPLCALL, 7);
|
||||
else
|
||||
memcpy(Buffer->ORIGIN, MYCALL, 7);
|
||||
|
||||
ptr1 = &PORT->PORTUNPROTO[7]; // First Digi
|
||||
ptr2 = &Buffer->CTL; // Digi field in buffer
|
||||
|
||||
// Copy any digis
|
||||
|
||||
while (*(ptr1))
|
||||
{
|
||||
memcpy(ptr2, ptr1, 7);
|
||||
ptr1 += 7;
|
||||
ptr2 += 7;
|
||||
}
|
||||
|
||||
*(ptr2 - 1) |= 1; // Set End of Address
|
||||
*(ptr2++) = UI;
|
||||
|
||||
memcpy(ptr2, &BTHDDR.PID, BTHDDR.LENGTH);
|
||||
ptr2 += BTHDDR.LENGTH;
|
||||
Buffer->LENGTH = (int)(ptr2 - (char *)Buffer);
|
||||
Buffer->PORT = PORT->PORTNUMBER;
|
||||
|
||||
C_Q_ADD(&IDMSG_Q, Buffer);
|
||||
}
|
||||
PORT = PORT->PORTPOINTER;
|
||||
}
|
||||
}
|
||||
|
||||
VOID SENDUIMESSAGE(struct DATAMESSAGE * Msg)
|
||||
{
|
||||
struct PORTCONTROL * PORT = PORTTABLE;
|
||||
struct _MESSAGE * Buffer;
|
||||
char * ptr1, * ptr2;
|
||||
|
||||
Msg->LENGTH -= MSGHDDRLEN; // Remove Header
|
||||
|
||||
while (PORT)
|
||||
{
|
||||
if ((PORT->PROTOCOL == 10 && PORT->UICAPABLE == 0) || PORT->PORTUNPROTO == 0) // Pactor-style or no UNPROTO ADDR?
|
||||
{
|
||||
PORT = PORT->PORTPOINTER;
|
||||
continue;
|
||||
}
|
||||
|
||||
Buffer = GetBuff();
|
||||
|
||||
if (Buffer)
|
||||
{
|
||||
memcpy(Buffer->DEST, PORT->PORTUNPROTO, 7);
|
||||
Buffer->DEST[6] |= 0xC0; // Set Command bits
|
||||
|
||||
// Send from BBSCALL unless PORTBCALL defined
|
||||
|
||||
if (PORT->PORTBCALL[0] > 32)
|
||||
memcpy(Buffer->ORIGIN, PORT->PORTBCALL, 7);
|
||||
else if (APPLCALLTABLE->APPLCALL[0] > 32)
|
||||
memcpy(Buffer->ORIGIN, APPLCALLTABLE->APPLCALL, 7);
|
||||
else
|
||||
memcpy(Buffer->ORIGIN, MYCALL, 7);
|
||||
|
||||
ptr1 = &PORT->PORTUNPROTO[7]; // First Digi
|
||||
ptr2 = &Buffer->CTL; // Digi field in buffer
|
||||
|
||||
// Copy any digis
|
||||
|
||||
while (*(ptr1))
|
||||
{
|
||||
memcpy(ptr2, ptr1, 7);
|
||||
ptr1 += 7;
|
||||
ptr2 += 7;
|
||||
}
|
||||
|
||||
*(ptr2 - 1) |= 1; // Set End of Address
|
||||
*(ptr2++) = UI;
|
||||
|
||||
memcpy(ptr2, &Msg->PID, Msg->LENGTH);
|
||||
ptr2 += Msg->LENGTH;
|
||||
Buffer->LENGTH = (int)(ptr2 - (char *)Buffer);
|
||||
Buffer->PORT = PORT->PORTNUMBER;
|
||||
|
||||
if (PORT->PROTOCOL == 10)
|
||||
{
|
||||
EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT;
|
||||
C_Q_ADD(&EXTPORT->UI_Q, Buffer);
|
||||
}
|
||||
else
|
||||
C_Q_ADD(&IDMSG_Q, Buffer);
|
||||
}
|
||||
PORT = PORT->PORTPOINTER;
|
||||
}
|
||||
}
|
||||
|
||||
Dll VOID APIENTRY Send_AX(UCHAR * Block, DWORD Len, UCHAR Port)
|
||||
{
|
||||
// Block included the 7/11 byte header, Len does not
|
||||
|
||||
struct PORTCONTROL * PORT;
|
||||
PMESSAGE Copy;
|
||||
|
||||
if (Len > 360 - 15)
|
||||
return;
|
||||
|
||||
if (QCOUNT < 50)
|
||||
return; // Running low
|
||||
|
||||
PORT = GetPortTableEntryFromPortNum(Port);
|
||||
|
||||
if (PORT == 0)
|
||||
return;
|
||||
|
||||
Copy = GetBuff();
|
||||
|
||||
if (Copy == 0)
|
||||
return;
|
||||
|
||||
memcpy(&Copy->DEST[0], &Block[MSGHDDRLEN], Len);
|
||||
|
||||
Copy->LENGTH = (USHORT)Len + MSGHDDRLEN;
|
||||
|
||||
if (PORT->PROTOCOL == 10 && PORT->TNC && PORT->TNC->Hardware != H_KISSHF)
|
||||
{
|
||||
// Pactor Style. Probably will only be used for Tracker uneless we do APRS over V4 or WINMOR
|
||||
|
||||
EXTPORTDATA * EXTPORT = (EXTPORTDATA *) PORT;
|
||||
|
||||
if (EXTPORT->UI_Q)
|
||||
C_Q_ADD(&EXTPORT->UI_Q, Copy);
|
||||
else
|
||||
C_Q_ADD(&EXTPORT->UI_Q, Copy);
|
||||
return;
|
||||
}
|
||||
|
||||
Copy->PORT = Port;
|
||||
|
||||
PUT_ON_PORT_Q(PORT, Copy);
|
||||
}
|
||||
|
||||
|
||||
TRANSPORTENTRY * SetupSessionFromHost(PBPQVECSTRUC HOST, UINT ApplMask)
|
||||
{
|
||||
// Create a Transport (L4) session linked to an incoming HOST (API) Session
|
||||
|
||||
TRANSPORTENTRY * NewSess = L4TABLE;
|
||||
int Index = 0;
|
||||
|
||||
|
||||
while (Index < MAXCIRCUITS)
|
||||
{
|
||||
if (NewSess->L4USER[0] == 0)
|
||||
{
|
||||
// Got One
|
||||
|
||||
UCHAR * ourcall = &MYCALL[0];
|
||||
|
||||
// IF APPL PORT USE APPL CALL, ELSE NODE CALL
|
||||
|
||||
if (ApplMask)
|
||||
{
|
||||
// Circuit for APPL - look for an APPLCALL
|
||||
|
||||
APPLCALLS * APPL = APPLCALLTABLE;
|
||||
|
||||
while ((ApplMask & 1) == 0)
|
||||
{
|
||||
ApplMask >>= 1;
|
||||
APPL++;
|
||||
}
|
||||
if (APPL->APPLCALL[0] > 0x40) // We have an applcall
|
||||
ourcall = &APPL->APPLCALL[0];
|
||||
}
|
||||
|
||||
memcpy(NewSess->L4USER, ourcall, 7);
|
||||
memcpy(NewSess->L4MYCALL, ourcall, 7);
|
||||
|
||||
NewSess->CIRCUITINDEX = Index; //OUR INDEX
|
||||
NewSess->CIRCUITID = NEXTID;
|
||||
|
||||
NEXTID++;
|
||||
if (NEXTID == 0)
|
||||
NEXTID++; // Keep Non-Zero
|
||||
|
||||
NewSess->L4TARGET.HOST = HOST;
|
||||
NewSess->L4STATE = 5;
|
||||
|
||||
|
||||
NewSess->SESSIONT1 = L4T1;
|
||||
NewSess->L4WINDOW = (UCHAR)L4DEFAULTWINDOW;
|
||||
NewSess->SESSPACLEN = PACLEN; // Default;
|
||||
|
||||
return NewSess;
|
||||
}
|
||||
Index++;
|
||||
NewSess++;
|
||||
}
|
||||
|
||||
// Table Full
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,434 @@
|
||||
|
||||
#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;
|
||||
}
|
||||
|
||||
// Message Database Entry. Designed to be compatible with FBB
|
||||
|
||||
#define NBBBS 160 // Max BBSes we can forward to. Must be Multiple of 8, and must be 80 for FBB compatibliliy
|
||||
#define NBMASK NBBBS/8 // Number of bytes in Forward bitlists.
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
struct MsgInfo
|
||||
{
|
||||
char type;
|
||||
char status;
|
||||
int number;
|
||||
int length;
|
||||
int xdatereceived;
|
||||
char bbsfrom[7]; // ? BBS we got it from ?
|
||||
char via[41];
|
||||
char from[7];
|
||||
char to[7];
|
||||
char bid[13];
|
||||
char title[61];
|
||||
int nntpnum; // Number within topic (ie Bull TO Addr) - used for nntp
|
||||
|
||||
UCHAR B2Flags; // Not all flags specific to B2
|
||||
|
||||
#define B2Msg 1 // Set if Message File is a formatted B2 message
|
||||
#define Attachments 2 // Set if B2 message has attachments
|
||||
#define FromPaclink 4
|
||||
#define FromCMS 8
|
||||
#define FromRMSExpress 16
|
||||
#define RadioOnlyMsg 32 // Received using call-T
|
||||
#define RadioOnlyFwd 64 // Received using call-R
|
||||
#define WarnNotForwardedSent 128
|
||||
|
||||
int xdatecreated;
|
||||
int xdatechanged;
|
||||
UCHAR fbbs[NBMASK];
|
||||
UCHAR forw[NBMASK];
|
||||
char emailfrom[41];
|
||||
char Locked; // Set if selected for sending (NTS Pickup)
|
||||
char Defered; // FBB response '=' received
|
||||
UCHAR UTF8; // Set if Message is in UTF8 (ie from POP/SMTP)
|
||||
|
||||
// For 64 bit time_t compatibility define as long long
|
||||
// (so struct is same with 32 or 64 bit time_t)
|
||||
|
||||
int64_t datereceived;
|
||||
int64_t datecreated;
|
||||
int64_t datechanged;
|
||||
|
||||
char Spare[61 - 24]; // For future use
|
||||
} ;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
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) {};
|
||||
void MQTTMessageEvent(void* message) {};
|
||||
|
||||
#endif
|
||||
@ -0,0 +1,126 @@
|
||||
|
||||
#ifdef Kernel
|
||||
|
||||
#define Vers 5,2,9,2
|
||||
#define Verstring "5.2.9.2\0"
|
||||
#define Datestring "September 2012"
|
||||
#define VerComments "G8BPQ Packet Switch V5.2.9.2\0"
|
||||
#define VerCopyright "Copyright © 2001-2012 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "BPQ32 Switch\0"
|
||||
|
||||
#endif
|
||||
|
||||
#define KVers 6,0,24,71
|
||||
#define KVerstring "6.0.24.71\0"
|
||||
|
||||
|
||||
#ifdef CKernel
|
||||
|
||||
#define Vers KVers
|
||||
#define Verstring KVerstring
|
||||
#define Datestring "April 2025"
|
||||
#define VerComments "G8BPQ Packet Switch (C Version)" KVerstring
|
||||
#define VerCopyright "Copyright © 2001-2025 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "BPQ32 Switch\0"
|
||||
#define VerProduct "BPQ32"
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef TermTCP
|
||||
|
||||
#define Vers 1,0,16,2
|
||||
#define Verstring "1.0.16.2\0"
|
||||
#define VerComments "Internet Terminal for G8BPQ Packet Switch\0"
|
||||
#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "Simple TCP Terminal Program for G8BPQ Switch\0"
|
||||
#define VerProduct "BPQTermTCP"
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef BPQTerm
|
||||
|
||||
#define Vers 2,2,5,2
|
||||
#define Verstring "2.2.5.2\0"
|
||||
#define VerComments "Simple Terminal for G8BPQ Packet Switch\0"
|
||||
#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "Simple Terminal Program for G8BPQ Switch\0"
|
||||
#define VerProduct "BPQTerminal"
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef BPQTermMDI
|
||||
|
||||
#define Vers 2,2,0,3
|
||||
#define Verstring "2.2.0.3\0"
|
||||
#define VerComments "MDI Terminal for G8BPQ Packet Switch\0"
|
||||
#define VerCopyright "Copyright © 1999-2025 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "MDI Terminal Program for G8BPQ Switch\0"
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef MAIL
|
||||
|
||||
#define Vers KVers
|
||||
#define Verstring KVerstring
|
||||
#define VerComments "Mail server for G8BPQ Packet Switch\0"
|
||||
#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "Mail server for G8BPQ's 32 Bit Switch\0"
|
||||
#define VerProduct "BPQMail"
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef HOSTMODES
|
||||
|
||||
#define Vers 1,1,8,1
|
||||
#define Verstring "1.1.8.1\0"
|
||||
//#define SPECIALVERSION "Test 3"
|
||||
#define VerComments "Host Modes Emulator for G8BPQ Packet Switch\0"
|
||||
#define VerCopyright "Copyright © 2009-2019 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "Host Modes Emulator for G8BPQ's 32 Bit Switch\0"
|
||||
#define VerProduct "BPQHostModes"
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef UIUTIL
|
||||
|
||||
#define Vers 0,1,3,1
|
||||
#define Verstring "0.1.3.1\0"
|
||||
#define VerComments "Beacon Utility for G8BPQ Packet Switch\0"
|
||||
#define VerCopyright "Copyright © 2011-2019 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "Beacon Utility for G8BPQ Switch\0"
|
||||
#define VerProduct "BPQUIUtil"
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef AUTH
|
||||
|
||||
#define Vers 0,1,0,0
|
||||
#define Verstring "0.1.0.0\0"
|
||||
#define VerComments "Password Generation Utility for G8BPQ Packet Switch\0"
|
||||
#define VerCopyright "Copyright © 2011-2025 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "Password Generation Utility for G8BPQ Switch\0"
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef APRS
|
||||
|
||||
#define Vers KVers
|
||||
#define Verstring KVerstring
|
||||
#define VerComments "APRS Client for G8BPQ Switch\0"
|
||||
#define VerCopyright "Copyright © 2012-2025 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "APRS Client for G8BPQ Switch\0"
|
||||
#define VerProduct "BPQAPRS"
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CHAT
|
||||
|
||||
#define Vers KVers
|
||||
#define Verstring KVerstring
|
||||
#define VerComments "Chat server for G8BPQ Packet Switch\0"
|
||||
#define VerCopyright "Copyright © 2009-2025 John Wiseman G8BPQ\0"
|
||||
#define VerDesc "Chat server for G8BPQ's 32 Bit Switch\0"
|
||||
#define VerProduct "BPQChat"
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,206 @@
|
||||
|
||||
#ifndef CONFIGSTRUCT
|
||||
#define CONFIGSTRUCT
|
||||
|
||||
|
||||
// MAKE SURE SHORTS ARE CORRECTLY ALLIGNED FOR ARMV5
|
||||
|
||||
struct PORTCONFIG
|
||||
{
|
||||
short PORTNUM;
|
||||
char ID[30]; //2
|
||||
short TYPE; // 32,
|
||||
short PROTOCOL; // 34,
|
||||
short IOADDR; // 36,
|
||||
short INTLEVEL; // 38,
|
||||
unsigned short SPEED; // 40,
|
||||
unsigned char CHANNEL; // 42,
|
||||
unsigned char pad;
|
||||
short BBSFLAG; // 44,
|
||||
short QUALITY; // 46,
|
||||
short MAXFRAME; // 48,
|
||||
short TXDELAY; // 50,
|
||||
short SLOTTIME; // 52,
|
||||
short PERSIST; // 54,
|
||||
|
||||
short FULLDUP; // 56,
|
||||
short SOFTDCD; // 58,
|
||||
short FRACK; // 60,
|
||||
short RESPTIME; // 62,
|
||||
short RETRIES; // 64,
|
||||
|
||||
short PACLEN; // 66,
|
||||
short QUALADJUST; // 68,
|
||||
UCHAR DIGIFLAG; // 70,
|
||||
UCHAR DIGIPORT; // 71
|
||||
short DIGIMASK; // 72
|
||||
short USERS; // 74,
|
||||
short TXTAIL; // 76
|
||||
unsigned char ALIAS_IS_BBS; // 78
|
||||
unsigned char pad2;
|
||||
char CWID[10]; // 80,
|
||||
char PORTCALL[10]; // 90,
|
||||
char PORTALIAS[10]; // 100,
|
||||
char L3ONLY; // 110,
|
||||
char IGNOREUNLOCKED; // 111
|
||||
short KISSOPTIONS; // 112,
|
||||
short INTERLOCK; // 114,
|
||||
short NODESPACLEN; // 116,
|
||||
short TXPORT; // 118,
|
||||
UCHAR MHEARD; // 120,
|
||||
UCHAR CWIDTYPE; // 121,
|
||||
char MINQUAL; // 122,
|
||||
char MAXDIGIS; // 123,
|
||||
char DefaultNoKeepAlives; // 124
|
||||
char UIONLY; // 125,
|
||||
unsigned short ListenPort; // 126
|
||||
char UNPROTO[72]; // 128,
|
||||
char PORTALIAS2[10]; // 200,
|
||||
char DLLNAME[16]; // 210,
|
||||
char BCALL[10]; // 226,
|
||||
unsigned long IPADDR; // 236
|
||||
char I2CMode; // 240
|
||||
char I2CAddr; // 241
|
||||
char INP3ONLY; // 242
|
||||
char NoNormalize; // 243 Normalise Nodes Qualities
|
||||
unsigned short TCPPORT; // 244
|
||||
char Pad2[10]; // 246
|
||||
char VALIDCALLS[256]; // 256 - 512
|
||||
struct WL2KInfo * WL2K; // 512
|
||||
char * SerialPortName; // 516
|
||||
struct XDIGI * XDIGIS; // 596 Cross port digi setup
|
||||
int RIGPORT; // Linked port with RigControl
|
||||
unsigned int PERMITTEDAPPLS; // Appls allowed on this port
|
||||
int HavePermittedAppls; // Indicated PERMITTEDAPPLS uses
|
||||
int Hide; // Don't show on Ports display or AGW Connect Menu
|
||||
// long long txOffset; // Transverter tx offset
|
||||
// long long rxOffset; // Transverter rx offset ppa
|
||||
int SmartID;
|
||||
unsigned char * KissParams;
|
||||
int SendtoM0LTEMap;
|
||||
uint64_t PortFreq;
|
||||
char * M0LTEMapInfo;
|
||||
int QtSMPort;
|
||||
int AllowINP3;
|
||||
};
|
||||
|
||||
struct ROUTECONFIG
|
||||
{
|
||||
char call[80]; // May have VIA
|
||||
int quality;
|
||||
int port;
|
||||
int pwind;
|
||||
int pfrack;
|
||||
int ppacl;
|
||||
int farQual;
|
||||
};
|
||||
|
||||
struct CONFIGTABLE
|
||||
{
|
||||
// CONFIGURATION DATA STRUCTURE
|
||||
|
||||
// DEFINES LAYOUT OF CONFIG RECORD PRODUCED BY CONFIGURATION PROG
|
||||
|
||||
char C_NODECALL[10]; // OFFSET = 0
|
||||
char C_NODEALIAS[10]; // OFFSET = 10
|
||||
char C_BBSCALL[10]; // OFFSET = 20
|
||||
char C_BBSALIAS[10]; // OFFSET = 30
|
||||
|
||||
short C_OBSINIT; // OFFSET = 40
|
||||
short C_OBSMIN; // OFFSET = 42
|
||||
short C_NODESINTERVAL; // OFFSET = 44
|
||||
short C_L3TIMETOLIVE; // OFFSET = 46
|
||||
short C_L4RETRIES; // OFFSET = 48
|
||||
short C_L4TIMEOUT; // OFFSET = 50
|
||||
short C_BUFFERS; // OFFSET = 52
|
||||
short C_PACLEN; // OFFSET = 54
|
||||
short C_TRANSDELAY; // OFFSET = 56
|
||||
short C_T3; // OFFSET = 58
|
||||
short Spare1; // OFFSET = 60
|
||||
short Spare2; // OFFSET = 62
|
||||
short C_IDLETIME; // OFFSET = 64
|
||||
UCHAR C_EMSFLAG; // OFFSET = 66
|
||||
UCHAR C_LINKEDFLAG; // OFFSET = 67
|
||||
UCHAR C_BBS; // OFFSET = 68
|
||||
UCHAR C_NODE; // OFFSET = 69
|
||||
UCHAR C_HOSTINTERRUPT; // OFFSET = 70
|
||||
UCHAR C_DESQVIEW; // OFFSET = 71
|
||||
short C_MAXLINKS; // OFFSET = 72
|
||||
short C_MAXDESTS;
|
||||
short C_MAXNEIGHBOURS;
|
||||
short C_MAXCIRCUITS; // 78
|
||||
UCHAR C_TNCPORTLIST[16]; // OFFSET = 80
|
||||
short C_IDINTERVAL; // 96
|
||||
short C_FULLCTEXT; // 98 ; SPARE (WAS DIGIFLAG)
|
||||
short C_MINQUAL; // 100
|
||||
UCHAR C_HIDENODES; // 102
|
||||
UCHAR C_AUTOSAVE; // 103
|
||||
short C_L4DELAY; // 104
|
||||
short C_L4WINDOW; // 106
|
||||
short C_BTINTERVAL; // 108
|
||||
UCHAR C_L4APPL; // 110
|
||||
UCHAR C_C; // 111 "C" = HOST Command Enabled
|
||||
UCHAR C_IP; // 112 IP Enabled
|
||||
UCHAR C_MAXRTT; // 113
|
||||
UCHAR C_MAXHOPS; // 114
|
||||
UCHAR C_PM; // 115 Poermapper Enabled
|
||||
UCHAR C_LogL4Connects; // 116
|
||||
UCHAR C_SaveMH; // 117
|
||||
short C_BBSQUAL; // 118
|
||||
UCHAR C_WASUNPROTO;
|
||||
UCHAR C_BTEXT[120]; // 121
|
||||
char C_VERSTRING[10]; // 241 Version String from Config File
|
||||
UCHAR C_ADIF;
|
||||
UCHAR C_EVENTS;
|
||||
UCHAR C_LogAllConnects;
|
||||
UCHAR C_SaveAPRSMsgs;
|
||||
UCHAR C_M0LTEMap;
|
||||
UCHAR C_VERSION; // CONFIG PROG VERSION
|
||||
// Reuse C_APPLICATIONS - no longer used
|
||||
char C_NETROMCALL[10];
|
||||
UCHAR C_EXCLUDE[71];
|
||||
char C_IDMSG[512];
|
||||
char C_CTEXT[512];
|
||||
char C_INFOMSG[2048];
|
||||
UCHAR CfgBridgeMap[MaxBPQPortNo + 1][MaxBPQPortNo + 1];
|
||||
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];
|
||||
int C_L4Compress;
|
||||
int C_L4CompMaxframe;
|
||||
int C_L4CompPaclen;
|
||||
int C_L2Compress;
|
||||
int C_L2CompMaxframe;
|
||||
int C_L2CompPaclen;
|
||||
int C_PREFERINP3ROUTES;
|
||||
|
||||
|
||||
//#define ApplOffset 80000 // Applications offset in config buffer
|
||||
//#define InfoOffset 85000 // Infomsg offset in buffer
|
||||
//#define InfoMax 2000 // Max Info
|
||||
|
||||
//#define C_IDMSG 512
|
||||
//#define C_ROUTES 90000 // Allow 2500
|
||||
//#define C_CTEXT 2048
|
||||
//#define C_PORTS 2560
|
||||
//#define C_INFOMSG 85000
|
||||
|
||||
};
|
||||
|
||||
struct UPNP
|
||||
{
|
||||
struct UPNP * Next;
|
||||
char * Protocol;
|
||||
char * LANport;
|
||||
char * WANPort;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,216 @@
|
||||
// Includes code from MiniUPnPc, used subject to the following conditions:
|
||||
|
||||
/*
|
||||
|
||||
MiniUPnPc
|
||||
Copyright (c) 2005-2020, Thomas BERNARD
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
* The name of the author may not be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#define MINIUPNP_STATICLIB
|
||||
|
||||
#include <stdio.h>
|
||||
#ifdef _WIN32
|
||||
#include "upnpcommands.h"
|
||||
#include "miniupnpc.h"
|
||||
#include "upnperrors.h"
|
||||
#include <winsock2.h>
|
||||
#endif
|
||||
#ifdef LINBPQ
|
||||
#ifndef MACBPQ
|
||||
#ifndef WIN32
|
||||
#include <miniupnpc/upnpcommands.h>
|
||||
#include <miniupnpc/miniupnpc.h>
|
||||
#include <miniupnpc/upnperrors.h>
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#ifdef MACBPQ
|
||||
#include </usr/local/Cellar/miniupnpc/2.2.5/include/miniupnpc/upnpcommands.h>
|
||||
#include </usr/local/Cellar/miniupnpc/2.2.5/include/miniupnpc/miniupnpc.h>
|
||||
#include </usr/local/Cellar/miniupnpc/2.2.5/include/miniupnpc/upnperrors.h>
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
int AddMap(char * controlURL, char * eport, char * iport, char * proto);
|
||||
int DeleteMap(char * controlURL, char * eport, char * iport, char * proto);
|
||||
|
||||
void Consoleprintf(const char * format, ...);
|
||||
|
||||
struct UPNP
|
||||
{
|
||||
struct UPNP * Next;
|
||||
char * Protocol;
|
||||
char * LANport;
|
||||
char * WANPort;
|
||||
};
|
||||
|
||||
extern struct UPNP * UPNPConfig;
|
||||
|
||||
char * controlURL = 0;
|
||||
char * servicetype = 0;
|
||||
char iaddr[] = "IP";
|
||||
char * inClient = NULL;
|
||||
#ifdef LINBPQ
|
||||
char desc[] = "LinBPQ ";
|
||||
#else
|
||||
char desc[] = "BPQ32 ";
|
||||
#endif
|
||||
char * remoteHost = NULL;
|
||||
char * leaseDuration = NULL;
|
||||
|
||||
struct UPNPDev * devlist = 0;
|
||||
char lanaddr[64] = "unset"; /* my ip address on the LAN */
|
||||
char wanaddr[64] = "unset"; /* my ip address on the LAN */
|
||||
struct UPNPUrls urls;
|
||||
struct IGDdatas data;
|
||||
|
||||
int i;
|
||||
const char * rootdescurl = 0;
|
||||
const char * multicastif = 0;
|
||||
const char * minissdpdpath = 0;
|
||||
#ifdef UPNP_LOCAL_PORT_ANY
|
||||
int localport = UPNP_LOCAL_PORT_ANY;
|
||||
#else
|
||||
int localport = 0;
|
||||
#endif
|
||||
int retcode = 0;
|
||||
int error = 0;
|
||||
int ipv6 = 0;
|
||||
int ignore = 0;
|
||||
unsigned char ttl = 2;
|
||||
|
||||
|
||||
int upnpInit()
|
||||
{
|
||||
struct UPNP * Config = UPNPConfig;
|
||||
int i;
|
||||
#ifdef WIN32
|
||||
WSADATA wsaData;
|
||||
int nResult = WSAStartup(MAKEWORD(2,2), &wsaData);
|
||||
if(nResult != NO_ERROR)
|
||||
{
|
||||
fprintf(stderr, "WSAStartup() failed.\n");
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
while (Config)
|
||||
{
|
||||
if (devlist == NULL)
|
||||
{
|
||||
#if MINIUPNPC_API_VERSION == 10
|
||||
devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, &error);
|
||||
#else
|
||||
devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, ttl, &error);
|
||||
#endif
|
||||
if (devlist == NULL)
|
||||
{
|
||||
Consoleprintf("Failed to find a UPNP device");
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if MINIUPNPC_API_VERSION == 18
|
||||
i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr), wanaddr, sizeof(wanaddr));
|
||||
#else
|
||||
i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr));
|
||||
#endif
|
||||
}
|
||||
|
||||
AddMap(devlist->descURL, Config->LANport, Config->WANPort, Config->Protocol);
|
||||
Config = Config->Next;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int upnpClose()
|
||||
{
|
||||
struct UPNP * Config = UPNPConfig;
|
||||
int i;
|
||||
|
||||
while (Config)
|
||||
{
|
||||
if (devlist == NULL)
|
||||
{
|
||||
#if MINIUPNPC_API_VERSION == 10
|
||||
devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, &error);
|
||||
#else
|
||||
devlist = upnpDiscover(2000, multicastif, minissdpdpath, localport, ipv6, ttl, &error);
|
||||
#endif
|
||||
if (devlist == NULL)
|
||||
{
|
||||
Consoleprintf("Failed to find a UPNP device");
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if MINIUPNPC_API_VERSION == 18
|
||||
i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr), wanaddr, sizeof(wanaddr));
|
||||
#else
|
||||
i = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr));
|
||||
#endif
|
||||
}
|
||||
|
||||
DeleteMap(devlist->descURL, Config->LANport, Config->WANPort, Config->Protocol);
|
||||
Config = Config->Next;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int AddMap(char * controlURL, char * eport, char * iport, char * proto)
|
||||
{
|
||||
int r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype,
|
||||
eport, iport, lanaddr, desc,
|
||||
proto, remoteHost, leaseDuration);
|
||||
|
||||
if (r != UPNPCOMMAND_SUCCESS)
|
||||
{
|
||||
Consoleprintf("UPNP AddPortMapping(%s, %s, %s) failed with code %d (%s)", eport, iport, lanaddr, r, strupnperror(r));
|
||||
return -2;
|
||||
}
|
||||
Consoleprintf("UPNP AddPortMapping(%s, %s, %s) Succeeded", eport, iport, lanaddr, r);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int DeleteMap(char * controlURL, char * eport, char * iport, char * proto)
|
||||
{
|
||||
int r = UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, eport, proto, remoteHost);
|
||||
|
||||
if(r != UPNPCOMMAND_SUCCESS)
|
||||
{
|
||||
Consoleprintf("UPNP DeletePortMapping(%s, %s, %s) failed with code %d (%s)", eport, iport, lanaddr, r, strupnperror(r));
|
||||
return -2;
|
||||
}
|
||||
Consoleprintf("UPNP DeletePortMapping(%s, %s, %s) Succeeded", eport, iport, lanaddr, r);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue