master 24.73
John Wiseman 7 months ago
parent fcb3973abd
commit 6620d4ae1f

@ -36,7 +36,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
struct AGWHeader struct AGWHeader
{ {
unsigned int Port; uint8_t Port;
uint8_t filler1[3];
unsigned char DataKind; unsigned char DataKind;
unsigned char filler2; unsigned char filler2;
unsigned char PID; unsigned char PID;
@ -751,6 +752,12 @@ int AGWDoMonitorData()
RXFlag = TRUE; RXFlag = TRUE;
} }
if (Port == 0)
{
Debugprintf("AGWMON Port number is zero");
return 0;
}
// Can now have different mon flags per connection, so need to run decode for each socket // Can now have different mon flags per connection, so need to run decode for each socket
for (n = 1; n<= CurrentSockets; n++) for (n = 1; n<= CurrentSockets; n++)
@ -829,9 +836,7 @@ int AGWDoMonitorData()
} }
} }
} }
return 0;
return 0;
} }
int DeleteConnection(struct BPQConnectionInfo * Con) int DeleteConnection(struct BPQConnectionInfo * Con)
@ -1128,6 +1133,7 @@ int AGWDataSocket_Read(struct AGWSocketConnectionInfo * sockptr, SOCKET sock)
int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr) int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
{ {
int AGWVersion[2]={2003,999}; int AGWVersion[2]={2003,999};
byte AGWPortCaps[12] = { 0, 255, 30, 10, 63, 10, 4, 0, 1, 0, 0, 0 };
char AGWRegReply[1]; char AGWRegReply[1];
struct BPQConnectionInfo * Connection; struct BPQConnectionInfo * Connection;
int Stream; int Stream;
@ -1293,9 +1299,7 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
// Version // Version
memset(&AGWTXHeader,0,36); memset(&AGWTXHeader,0,36);
AGWTXHeader.DataKind = 'R'; AGWTXHeader.DataKind = 'R';
AGWTXHeader.DataLength = 8; // Length AGWTXHeader.DataLength = 8; // Length
SendtoSocket(sockptr->socket, (char *)&AGWVersion[0]); SendtoSocket(sockptr->socket, (char *)&AGWVersion[0]);
@ -1309,15 +1313,27 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
memset(&AGWTXHeader,0,36); memset(&AGWTXHeader,0,36);
AGWTXHeader.DataKind = 'G'; AGWTXHeader.DataKind = 'G';
AGWTXHeader.DataLength =(int)strlen(AGWPorts)+1; // Length AGWTXHeader.DataLength =(int)strlen(AGWPorts)+1; // Length
SendtoSocket(sockptr->socket, AGWPorts); SendtoSocket(sockptr->socket, AGWPorts);
return 0; return 0;
case 'g':
// Port capabilities. Currently hard-coded.
AGWTXHeader.Port = sockptr->AGWRXHeader.Port;
AGWTXHeader.DataKind = 'g';
AGWTXHeader.DataLength = 12;
SendtoSocket(sockptr->socket, (char *)&AGWPortCaps[0]);
return 0;
case 'k': case 'k':
@ -1416,6 +1432,8 @@ int ProcessAGWCommand(struct AGWSocketConnectionInfo * sockptr)
AGWTXHeader.DataKind = 'X'; AGWTXHeader.DataKind = 'X';
memcpy(&AGWTXHeader.callfrom, RegCall, 10);
AGWTXHeader.DataLength = 1; // Length AGWTXHeader.DataLength = 1; // Length
AGWRegReply[0] = 1; AGWRegReply[0] = 1;

File diff suppressed because it is too large Load Diff

@ -49,9 +49,14 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
#define DM 0x0F #define DM 0x0F
#define UA 0x63 #define UA 0x63
#define FRMR 0x87 #define FRMR 0x87
#define XID 0xAF
#define TEST 0xE3
#define RR 1 #define RR 1
#define RNR 5 #define RNR 5
#define REJ 9 #define REJ 9
#define SREJ 0x0D
#define SABME 0x6F
#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE #define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE
@ -261,6 +266,18 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
strcpy(SUP, "FRMR"); strcpy(SUP, "FRMR");
FRMRFLAG = 1; FRMRFLAG = 1;
break; break;
case XID:
strcpy(SUP, "XID");
XIDFLAG = 1;
break;
case TEST:
strcpy(SUP, "TEST");
TESTFLAG = 1;
break;
} }
Output += sprintf((char *)Output, "<%s%s%s>", SUP, CRCHAR, PFCHAR); Output += sprintf((char *)Output, "<%s%s%s>", SUP, CRCHAR, PFCHAR);
@ -270,7 +287,7 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
// Super // Super
int NR = (CTL >> 5) & 7; int NR = (CTL >> 5) & 7;
char SUP[4] = "??"; char SUP[5] = "??";
switch (CTL & 0x0F) switch (CTL & 0x0F)
{ {
@ -288,6 +305,13 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
strcpy(SUP, "REJ"); strcpy(SUP, "REJ");
break; break;
case SREJ:
strcpy(SUP, "SREJ");
break;
} }
Output += sprintf((char *)Output, "<%s%s%s R%d>", SUP, CRCHAR, PFCHAR, NR); Output += sprintf((char *)Output, "<%s%s%s R%d>", SUP, CRCHAR, PFCHAR, NR);
@ -300,6 +324,72 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra
if (FRMRFLAG) if (FRMRFLAG)
Output += sprintf((char *)Output, "%02X %02X %02X", ADJBUFFER->PID, ADJBUFFER->L2DATA[0], ADJBUFFER->L2DATA[1]); Output += sprintf((char *)Output, "%02X %02X %02X", ADJBUFFER->PID, ADJBUFFER->L2DATA[0], ADJBUFFER->L2DATA[1]);
if (XIDFLAG)
{
// Decode and display XID
UCHAR * ptr = &ADJBUFFER->PID;
if (*ptr++ == 0x82 && *ptr++ == 0x80)
{
int Type;
int Len;
unsigned int value;
int xidlen = *(ptr++) << 8;
xidlen += *ptr++;
// XID is set of Type, Len, Value n-tuples
// G8BPQ-2>G8BPQ:(XID cmd, p=1) Half-Duplex SREJ modulo-128 I-Field-Length-Rx=256 Window-Size-Rx=32 Ack-Timer=3000 Retries=10
while (xidlen > 0)
{
Type = *ptr++;
Len = *ptr++;
value = 0;
xidlen -= (Len + 2);
while (Len--)
{
value <<=8;
value += *ptr++;
}
switch(Type)
{
case 2: //Bin fields
case 3:
Output += sprintf((char *)Output, " %d=%x", Type, value);
break;
case 6: //RX Size
Output += sprintf((char *)Output, " RX Paclen=%d", value / 8);
break;
case 8: //RX Window
Output += sprintf((char *)Output, " RX Window=%d", value);
break;
case 16:
Output += sprintf((char *)Output, " Can Compress");
break;
case 17:
Output += sprintf((char *)Output, " Compress ok");
break;
}
}
}
}
if (Info) if (Info)
{ {
// We have an info frame // We have an info frame

@ -1270,6 +1270,8 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses
// Support IPv6 for Telnet outward connects (72) // Support IPv6 for Telnet outward connects (72)
// Fix decaying NETROM routes (72) // Fix decaying NETROM routes (72)
// Add OnlyVer2point0 config command (72) // Add OnlyVer2point0 config command (72)
// Add option to allow AX/UDP on a network using NAT (72)
// Include AGWAPI foxes from Martin KD6YAM to enable use with Paracon terminal (72)
#define CKernel #define CKernel

@ -4005,6 +4005,7 @@ VOID CONNECTREFUSED(struct _LINKTABLE * LINK)
ConnectFailedOrRefused(LINK, "Busy from"); ConnectFailedOrRefused(LINK, "Busy from");
} }
VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK); VOID L3LINKSETUPFAILED(struct _LINKTABLE * LINK);

@ -10,8 +10,8 @@
#endif #endif
#define KVers 6,0,24,72 #define KVers 6,0,24,73
#define KVerstring "6.0.24.72\0" #define KVerstring "6.0.24.73\0"
#ifdef CKernel #ifdef CKernel

@ -2623,6 +2623,7 @@ BOOL CheckSourceisResolvable(struct AXIPPORTINFO * PORT, char * call, int FromPo
if (arp->replytoSourcePort) if (arp->replytoSourcePort)
{ {
arp->port = FromPort; arp->port = FromPort;
arp->destaddr.sin_port = htons(arp->port);
if (arp->SourcePort == 0) if (arp->SourcePort == 0)
arp->SourcePort = ToPort; arp->SourcePort = ToPort;
} }

Loading…
Cancel
Save

Powered by TurnKey Linux.