master 24.78
John Wiseman 5 months ago
parent 3143e32c1a
commit 3103c10e81

@ -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,77
#define KVerstring "6.0.24.77\0"
#ifdef CKernel
#define Vers KVers
#define Verstring KVerstring
#define Datestring "July 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

@ -0,0 +1,511 @@
/*
Copyright 2001-2015 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
*/
//
// DLL to provide BPQEther support for G8BPQ switch in a Linux environment,
// Normally uses a Raw socket, but that can't send to other apps on same machine.
// so can use a TAP device instead (or maybe as well??)
// Not suported on BSD based systems
#ifndef FREEBSD
#ifndef MACBPQ
#if !(defined(MACBPQ) || defined(FREEBSD))
#include <stdio.h>
#include "cheaders.h"
#include <sys/socket.h>
#if !(defined(FREEBSD))
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#include <linux/if_arp.h>
#endif
#endif
extern int tap_fd;
typedef struct PCAPStruct
{
UCHAR EthSource[6];
UCHAR EthDest[6];
short EtherType;
BOOL RLITX;
BOOL RLIRX;
BOOL Promiscuous;
int s; /*socketdescriptor*/
struct sockaddr_ll socket_address; /*target address*/
} PCAPINFO, *PPCAPINFO ;
PCAPINFO PCAPInfo[32];
// on linux default to broadcast
short udpport=0;
unsigned int OurInst = 0;
BOOL GotMsg;
DWORD n;
char Adapter[256];
static BOOL ReadConfigFile(int Port);
static int ProcessLine(char * buf,int Port, BOOL CheckPort);
int WritetoConsoleLocal(char * buff);
static size_t ExtProc(int fn, int port, PMESSAGE buff)
{
int len,txlen=0,res;
char txbuff[500];
unsigned char rxbuff[1600];
PCAPINFO * IF = &PCAPInfo[port];
if (IF->s == 0)
return 0;
switch (fn)
{
case 1: // poll
res = recvfrom(IF->s, rxbuff, ETH_FRAME_LEN, 0, NULL, NULL);
if (res == -1)
{
if (errno == 11)
return 0; //Resource temporarily unavailable
perror("Eth RX");
return 0;
}
if (res == 0)
/* Timeout elapsed */
return 0;
if (rxbuff[13] != 0xff)
return 0;
if (IF->RLIRX)
// RLI MODE - An extra 3 bytes before len, seem to be 00 00 41
{
len=rxbuff[18]*256 + rxbuff[17];
if ((len < 16) || (len > 320)) return 0; // Probably BPQ Mode Frame
len-=3;
memcpy(&buff->DEST, &rxbuff[19], len);
len += (1 + sizeof(void *));
}
else
{
len=rxbuff[15]*256 + rxbuff[14];
if ((len < 16) || (len > 320)) return 0; // Probably RLI Mode Frame
len-=3;
memcpy(&buff->DEST, &rxbuff[16], len);
len += (1 + sizeof(void *));
}
PutLengthinBuffer((PDATAMESSAGE)buff, len);
return 1;
case 2: // send
if (IF->RLITX)
// RLI MODE - An extra 3 bytes before len, seem to be 00 00 41
{
txlen = GetLengthfromBuffer((PDATAMESSAGE)buff); // 2 for CRC
txlen -= (sizeof(void *) - 2);
txbuff[16]=0x41;
txbuff[17]=(txlen & 0xff);
txbuff[18]=(txlen >> 8);
if (txlen < 1 || txlen > 400)
return 0;
memcpy(&txbuff[19], &buff->DEST[0], txlen);
}
else
{
txlen = GetLengthfromBuffer((PDATAMESSAGE)buff); // 2 for CRC
txlen -= (sizeof(void *) - 2);
txbuff[14]=(txlen & 0xff);
txbuff[15]=(txlen >> 8);
if (txlen < 1 || txlen > 400)
return 0;
memcpy(&txbuff[16], &buff->DEST[0], txlen);
}
memcpy(&txbuff[0], &IF->EthDest[0],6);
memcpy(&txbuff[6], &IF->EthSource[0],6);
memcpy(&txbuff[12], &IF->EtherType,2);
txlen+=14;
if (txlen < 60) txlen = 60;
// Send down the packet
res = sendto(IF->s, txbuff, txlen, 0,
(const struct sockaddr *)&IF->socket_address, sizeof(struct sockaddr_ll));
if (res < 0)
{
perror("Eth Send");
return 3;
}
// if (tap_fd)
// write(tap_fd, txbuff, txlen);
return (0);
case 3: // CHECK IF OK TO SEND
return (0); // OK
case 4: // reinit
return 0;
case 5: // reinit
return 0;
}
return (0);
}
void * ETHERExtInit(struct PORTCONTROL * PortEntry)
{
// Can have multiple ports, each mapping to a different Ethernet Adapter
// The Adapter number is in IOADDR
//
int i=0;
u_int netmask;
char buf[256];
int n;
struct ifreq ifr;
size_t if_name_len;
PCAPINFO * IF;
int port = PortEntry->PORTNUMBER;
u_long param=1;
struct ifreq buffer;
WritetoConsoleLocal("LinEther ");
//
// Read config
//
if (!ReadConfigFile(port))
return (FALSE);
if_name_len = strlen(Adapter);
IF = &PCAPInfo[port];
IF->s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_BPQ));
if (IF->s == -1)
{
perror("Open Ether Socket");
IF->s = 0;
}
else
{
ioctl(IF->s, FIONBIO, &param);
memcpy(ifr.ifr_name, Adapter, if_name_len);
ifr.ifr_name[if_name_len] = 0;
if (ioctl(IF->s, SIOCGIFINDEX,&ifr) == -1)
perror("Get IF Number");
// Get MAC Address
memset(&buffer, 0x00, sizeof(buffer));
strcpy(buffer.ifr_name, Adapter);
ioctl(IF->s, SIOCGIFHWADDR, &buffer);
memcpy(IF->EthSource, buffer.ifr_hwaddr.sa_data, 6);
}
n=sprintf(buf,"Using %s = Interface %d\n", Adapter, ifr.ifr_ifindex);
WritetoConsoleLocal(buf);
/*prepare sockaddr_ll*/
/*RAW communication*/
IF->socket_address.sll_family = PF_PACKET;
/*we don't use a protocoll above ethernet layer ->just use anything here*/
IF->socket_address.sll_protocol = htons(ETH_P_IP);
//index of the network device
IF->socket_address.sll_ifindex = ifr.ifr_ifindex;
/*ARP hardware identifier is ethernet*/
IF->socket_address.sll_hatype = ARPHRD_ETHER;
/*target is another host*/
IF->socket_address.sll_pkttype = PACKET_BROADCAST;
/*address length*/
IF->socket_address.sll_halen = ETH_ALEN;
/*MAC - begin*/
memcpy(IF->socket_address.sll_addr, IF->EthDest, 6);
IF->socket_address.sll_addr[6] = 0x00;/*not used*/
IF->socket_address.sll_addr[7] = 0x00;/*not used*/
// n=sprintf(buf,"Using %s Adapter = Interface %d\r", ifr.ifr_ifindex);
// WritetoConsole(buf);
return (ExtProc);
}
static BOOL ReadConfigFile(int Port)
{
//TYPE 1 08FF # Ethernet Type
//ETH 1 FF:FF:FF:FF:FF:FF # Target Ethernet AddrMAP G8BPQ-7 10.2.77.1 # IP 93 for compatibility
//ADAPTER 1 \Device\NPF_{21B601E8-8088-4F7D-96 29-EDE2A9243CF4} # Adapter Name
char buf[256],errbuf[256];
char * Config;
Config = PortConfig[Port];
PCAPInfo[Port].Promiscuous = 1; // Default
PCAPInfo[Port].EtherType=htons(0x08FF); // Default
memset(PCAPInfo[Port].EthDest, 0xff, 6);
if (Config)
{
// Using config from bpq32.cfg
char * ptr1 = Config, * ptr2;
ptr2 = strchr(ptr1, 13);
while(ptr2)
{
memcpy(buf, ptr1, ptr2 - ptr1);
buf[ptr2 - ptr1] = 0;
ptr1 = ptr2 + 2;
ptr2 = strchr(ptr1, 13);
strcpy(errbuf,buf); // save in case of error
if (!ProcessLine(buf, Port, FALSE))
{
WritetoConsoleLocal("BPQEther - Bad config record ");
WritetoConsoleLocal(errbuf);
WritetoConsoleLocal("\n");
}
}
return (TRUE);
}
n=sprintf(buf,"No config info found in bpq32.cfg\n");
WritetoConsoleLocal(buf);
return (FALSE);
}
static int ProcessLine(char * buf, int Port, BOOL CheckPort)
{
char * ptr;
char * p_port;
char * p_mac;
char * p_Adapter;
char * p_type;
int port;
int a,b,c,d,e,f,num;
ptr = strtok(buf, " \t\n\r");
if(ptr == NULL) return (TRUE);
if(*ptr =='#') return (TRUE); // comment
if(*ptr ==';') return (TRUE); // comment
if (CheckPort)
{
p_port = strtok(NULL, " \t\n\r");
if (p_port == NULL) return (FALSE);
port = atoi(p_port);
if (Port != port) return TRUE; // Not for us
}
if(_stricmp(ptr,"ADAPTER") == 0)
{
p_Adapter = strtok(NULL, " \t\n\r");
strcpy(Adapter,p_Adapter);
return (TRUE);
}
if(_stricmp(ptr,"TYPE") == 0)
{
p_type = strtok(NULL, " \t\n\r");
if (p_type == NULL) return (FALSE);
num=sscanf(p_type,"%x",&a);
if (num != 1) return FALSE;
PCAPInfo[Port].EtherType=htons(a);
return (TRUE);
}
if(_stricmp(ptr,"promiscuous") == 0)
{
ptr = strtok(NULL, " \t\n\r");
if (ptr == NULL) return (FALSE);
PCAPInfo[Port].Promiscuous = atoi(ptr);
return (TRUE);
}
if(_stricmp(ptr,"RXMODE") == 0)
{
p_port = strtok(NULL, " \t\n\r");
if (p_port == NULL) return (FALSE);
if(_stricmp(p_port,"RLI") == 0)
{
PCAPInfo[Port].RLIRX=TRUE;
return (TRUE);
}
if(_stricmp(p_port,"BPQ") == 0)
{
PCAPInfo[Port].RLIRX=FALSE;
return (TRUE);
}
return FALSE;
}
if(_stricmp(ptr,"TXMODE") == 0)
{
p_port = strtok(NULL, " \t\n\r");
if (p_port == NULL) return (FALSE);
if(_stricmp(p_port,"RLI") == 0)
{
PCAPInfo[Port].RLITX=TRUE;
return (TRUE);
}
if(_stricmp(p_port,"BPQ") == 0)
{
PCAPInfo[Port].RLITX=FALSE;
return (TRUE);
}
return FALSE;
}
if(_stricmp(ptr,"DEST") == 0)
{
p_mac = strtok(NULL, " \t\n\r");
if (p_mac == NULL) return (FALSE);
num=sscanf(p_mac,"%x-%x-%x-%x-%x-%x",&a,&b,&c,&d,&e,&f);
if (num != 6) return FALSE;
PCAPInfo[Port].EthDest[0]=a;
PCAPInfo[Port].EthDest[1]=b;
PCAPInfo[Port].EthDest[2]=c;
PCAPInfo[Port].EthDest[3]=d;
PCAPInfo[Port].EthDest[4]=e;
PCAPInfo[Port].EthDest[5]=f;
// strcpy(Adapter,p_Adapter);
return (TRUE);
}
if(_stricmp(ptr,"SOURCE") == 0) // not used, but ignore
return (TRUE);
//
// Bad line
//
return (FALSE);
}
//
#endif // MACBPQ
#endif // FREEBSD

@ -0,0 +1,65 @@
# LinBPQ Makefile
# To exclude i2c support run make noi2c
OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pngwutil.o\
pngread.o pngwrite.o png.o pngerror.o pngget.o pngmem.o APRSIconData.o AISCommon.o\
upnp.o APRSStdPages.o HSMODEM.o WinRPR.o KISSHF.o TNCEmulators.o bpqhdlc.o SerialPort.o\
adif.o WebMail.o utf8Routines.o VARA.o LzFind.o Alloc.o LzmaDec.o LzmaEnc.o LzmaLib.o \
Multicast.o ARDOP.o IPCode.o FLDigi.o linether.o CMSAuth.o APRSCode.o BPQtoAGW.o KAMPactor.o\
AEAPactor.o HALDriver.o MULTIPSK.o BBSHTMLConfig.o ChatHTMLConfig.o BBSUtilities.o bpqaxip.o\
BPQINP3.o BPQNRR.o cMain.o Cmd.o CommonCode.o HTMLCommonCode.o compatbits.o config.o datadefs.o \
FBBRoutines.o HFCommon.o Housekeeping.o HTTPcode.o kiss.o L2Code.o L3Code.o L4Code.o lzhuf32.o \
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 RHP.o
# Configuration:
#Default to Linux
CC = gcc
EXTRA_LDFLAGS = -Xlinker -Map=output.map -lrt -l:libpaho-mqtt3a.a -l:libjansson.a
#other OS
OS_NAME = $(shell uname -s)
ifeq ($(OS_NAME),NetBSD)
CC = cc
EXTRA_CFLAGS = -DFREEBSD -DNOMQTT -I/usr/pkg/include
EXTRA_LDFLAGS = -Xlinker -Map=output.map -Wl,-R/usr/pkg/lib -L/usr/pkg/lib -lrt -lutil -lexecinfo
endif
ifeq ($(OS_NAME),FreeBSD)
CC = cc
EXTRA_CFLAGS = -DFREEBSD -DNOMQTT -I/usr/local/include
EXTRA_LDFLAGS = -Xlinker -Map=output.map -L/usr/local/lib -lrt -liconv -lutil -lexecinfo
endif
ifeq ($(OS_NAME),Darwin)
CC = gcc
EXTRA_CFLAGS = -DMACBPQ -DNOMQTT
EXTRA_LDFLAGS = -liconv
endif
$(info OS_NAME is $(OS_NAME))
all: CFLAGS = -DLINBPQ -MMD -g -fcommon -fasynchronous-unwind-tables $(EXTRA_CFLAGS)
all: linbpq
nomqtt: CFLAGS = -DLINBPQ -MMD -fcommon -g -rdynamic -DNOMQTT -fasynchronous-unwind-tables
nomqtt: linbpq
noi2c: CFLAGS = -DLINBPQ -MMD -DNOI2C -g -rdynamic -fcommon -fasynchronous-unwind-tables
noi2c: linbpq
linbpq: $(OBJS)
cc $(OBJS) $(EXTRA_LDFLAGS) -lminiupnpc -lm -lz $(LDFLAGS) -lpthread -lconfig -lpcap -o 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)

Binary file not shown.

@ -1275,6 +1275,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Fix 64 bit compatiblility issues with AGWAPI (73)
// Fix KAM Pactor Interlock (73)
// Fix Node map reporting, broken in .73 (74)
// Fixes to build on FreeBSD and NetBSD from jg1uaa (77)
// Fix to L4Compress from Stece G7TAJ (77)
#define CKernel

@ -797,8 +797,6 @@ VOID L4BG()
// Fragment if more than L4CompPaclen
// Entered with original first fragment in saveMsg;
// Check for too big a compressed frame size. Bigger compresses better but adds latency to link
maxCompSendLen = L4CompPaclen * L4CompMaxframe;
@ -827,7 +825,7 @@ VOID L4BG()
if (Len > ChunkSize)
Len = ChunkSize;
complen = L2Compressit(Compressed, 8192, toCompress, toCompressLen);
complen = L2Compressit(Compressed, 8192, toCompress, Len);
Debugprintf("Chunked %d %d %d%%", Len, complen, ((Len - complen) * 100) / Len);

@ -10,8 +10,8 @@
#endif
#define KVers 6,0,24,76
#define KVerstring "6.0.24.76\0"
#define KVers 6,0,24,77
#define KVerstring "6.0.24.77\0"
#ifdef CKernel

@ -23,6 +23,12 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Normally uses a Raw socket, but that can't send to other apps on same machine.
// so can use a TAP device instead (or maybe as well??)
// Not suported on BSD based systems
#ifndef FREEBSD
#ifndef MACBPQ
#if !(defined(MACBPQ) || defined(FREEBSD))
#include <stdio.h>
@ -495,5 +501,11 @@ static int ProcessLine(char * buf, int Port, BOOL CheckPort)
return (FALSE);
}
//
#endif // MACBPQ
#endif // FREEBSD

@ -17,10 +17,32 @@ OBJS = pngwtran.o pngrtran.o pngset.o pngrio.o pngwio.o pngtrans.o pngrutil.o pn
# Configuration:
CC = gcc
all: CFLAGS = -DLINBPQ -MMD -g -rdynamic -fcommon -fasynchronous-unwind-tables
all: LDFLAGS = -l:libpaho-mqtt3a.a -l:libjansson.a
#Default to Linux
CC = gcc
EXTRA_LDFLAGS = -Xlinker -Map=output.map -lrt -l:libpaho-mqtt3a.a -l:libjansson.a
#other OS
OS_NAME = $(shell uname -s)
ifeq ($(OS_NAME),NetBSD)
CC = cc
EXTRA_CFLAGS = -DFREEBSD -DNOMQTT -I/usr/pkg/include
EXTRA_LDFLAGS = -Xlinker -Map=output.map -Wl,-R/usr/pkg/lib -L/usr/pkg/lib -lrt -lutil -lexecinfo
endif
ifeq ($(OS_NAME),FreeBSD)
CC = cc
EXTRA_CFLAGS = -DFREEBSD -DNOMQTT -I/usr/local/include
EXTRA_LDFLAGS = -Xlinker -Map=output.map -L/usr/local/lib -lrt -liconv -lutil -lexecinfo
endif
ifeq ($(OS_NAME),Darwin)
CC = gcc
EXTRA_CFLAGS = -DMACBPQ -DNOMQTT
EXTRA_LDFLAGS = -liconv
endif
$(info OS_NAME is $(OS_NAME))
all: CFLAGS = -DLINBPQ -MMD -g -fcommon -fasynchronous-unwind-tables $(EXTRA_CFLAGS)
all: linbpq
@ -32,7 +54,7 @@ noi2c: linbpq
linbpq: $(OBJS)
gcc $(OBJS) -Xlinker -Map=output.map -l:libminiupnpc.a -lrt -lm -lz $(LDFLAGS) -lpthread -lconfig -lpcap -o linbpq
cc $(OBJS) $(EXTRA_LDFLAGS) -lminiupnpc -lm -lz $(LDFLAGS) -lpthread -lconfig -lpcap -o linbpq
sudo setcap "CAP_NET_ADMIN=ep CAP_NET_RAW=ep CAP_NET_BIND_SERVICE=ep" linbpq
-include *.d

Loading…
Cancel
Save

Powered by TurnKey Linux.