diff --git a/AGWMoncode.c b/AGWMoncode.c index 2c26191..da9f81e 100644 --- a/AGWMoncode.c +++ b/AGWMoncode.c @@ -49,7 +49,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses #define DM 0x0F #define UA 0x63 #define FRMR 0x87 -#define XID 0xAF +#define XID 0xAF #define TEST 0xE3 #define RR 1 #define RNR 5 @@ -267,16 +267,16 @@ int InternalAGWDecodeFrame(MESSAGE * msg, char * buffer, time_t Stamp, int * Fra FRMRFLAG = 1; break; - case XID: - - strcpy(SUP, "XID"); - XIDFLAG = 1; - break; - - case TEST: - - strcpy(SUP, "TEST"); - TESTFLAG = 1; + case XID: + + strcpy(SUP, "XID"); + XIDFLAG = 1; + break; + + case TEST: + + strcpy(SUP, "TEST"); + TESTFLAG = 1; break; } diff --git a/BPQMail.c b/BPQMail.c index 2aab885..7b3c365 100644 --- a/BPQMail.c +++ b/BPQMail.c @@ -1154,6 +1154,7 @@ // Add Send and Receive byte counts to status displays (69) // Validate Mode and Frequency and fix formatting in Connected Message (71) // Fix using OpenBCM on other than Telnet connections (75) +// Fix sending + in Webmail (80) #include "bpqmail.h" #include "winstdint.h" diff --git a/Bpq32.c b/Bpq32.c index aafa0e3..15304d4 100644 --- a/Bpq32.c +++ b/Bpq32.c @@ -1279,6 +1279,7 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses // Fix to L4Compress from Steve G7TAJ (77) // Fix possible FRMR when RNR is cleared by SREJ (78) // Fix error in .77 L4Compress fix (mine, not Steve's!) (78) +// Fix possible stuck L2 session when handling SREJ (79) #define CKernel diff --git a/ChatMultiConsole.c b/ChatMultiConsole.c index bd38475..78308c6 100644 --- a/ChatMultiConsole.c +++ b/ChatMultiConsole.c @@ -983,7 +983,27 @@ LRESULT APIENTRY InputProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) return 0; } - + + if (wParam == 0x7) // BEL (Ctrl/G) + { + // Get buffer, append 07 and write back + + Cinfo->kbptr = SendMessage(Cinfo->hwndInput, WM_GETTEXT, INPUTLEN-1, + (LPARAM) (LPCSTR)Cinfo->kbbuf); + + + Cinfo->kbbuf[Cinfo->kbptr++] = 7; + Cinfo->kbbuf[Cinfo->kbptr] = 0; + + SendMessage(Cinfo->hwndInput,WM_SETTEXT,0,(LPARAM)(LPCSTR) Cinfo->kbbuf); + + // Send cursor right + + SendMessage(Cinfo->hwndInput, WM_KEYDOWN, VK_RIGHT, 0); + SendMessage(Cinfo->hwndInput, WM_KEYUP, VK_RIGHT, 0); + + return 0; + } } return CallWindowProc(Cinfo->wpOrigInputProc, hwnd, uMsg, wParam, lParam); diff --git a/L2Code.c b/L2Code.c index 440c238..0fd8ecd 100644 --- a/L2Code.c +++ b/L2Code.c @@ -2176,7 +2176,9 @@ VOID SFRAME(struct _LINKTABLE * LINK, struct PORTCONTROL * PORT, UCHAR CTL, UCHA int count; MESSAGE * Msg; MESSAGE * Buffer; - + + LINK->L2FLAGS &= ~POLLSENT; // CLEAR I(P) or RR(P) SET + Msg = LINK->FRAMES[NS]; // is frame available? if (Msg == NULL) @@ -2977,6 +2979,43 @@ VOID SDETX(struct _LINKTABLE * LINK) // if (LINK->L2RESEQ_Q) // return; + // **** Debug code **** look for stuck links + + if (LINK->LASTFRAMESENT && (time(NULL) - LINK->LASTFRAMESENT) > 60) // No send for 60 secs + { + if (COUNT_AT_L2(LINK) > 16) + { + // Dump Link State + + char Normcall[11] = ""; + char Normcall2[11] = ""; + + int Count = COUNT_AT_L2(LINK); + int secs = time(NULL) - LINK->LASTFRAMESENT; + + ConvFromAX25(LINK->LINKCALL, Normcall); + ConvFromAX25(LINK->OURCALL, Normcall2); + + Debugprintf("*** Stuck L2 Session for %d Secs %s %s %d", secs, Normcall, Normcall2, Count); + Debugprintf("LINK->LINKNS %d LINK->LINKOWS %d SDTSLOT %d LINKWINDOW %d L2FLAGS %d", LINK->LINKNS, LINK->LINKOWS, LINK->SDTSLOT, LINK->LINKWINDOW, LINK->L2FLAGS); + Debugprintf("Slots %x %x %x %x %x %x %x %x", LINK->FRAMES[0], LINK->FRAMES[1], LINK->FRAMES[2], LINK->FRAMES[3], + LINK->FRAMES[4], LINK->FRAMES[5], LINK->FRAMES[6], LINK->FRAMES[7]); + + // Reset Link + + + InformPartner(LINK, NORMALCLOSE); // TELL OTHER END ITS GONE + + LINK->L2RETRIES -= 1; // Just send one DISC + LINK->L2STATE = 4; // CLOSING + + L2SENDCOMMAND(LINK, DISC | PFBIT); + + return; + } + } + + Outstanding = LINK->LINKNS - LINK->LINKOWS; // Was WS not NS if (Outstanding < 0) @@ -2994,6 +3033,10 @@ VOID SDETX(struct _LINKTABLE * LINK) Msg = Q_REM(&LINK->TX_Q); Msg->CHAIN = NULL; + LINK->LASTFRAMESENT = time(NULL); + LINK->LASTSENTQCOUNT = COUNT_AT_L2(LINK); + + if (LINK->AllowCompress && Msg->LENGTH > 20 && LINK->TX_Q && Msg->PID == 240) // if short and no more not worth trying compression { int complen = 0; @@ -3018,6 +3061,7 @@ VOID SDETX(struct _LINKTABLE * LINK) // I think I need to know how many slots are available, so I don't compress too much // Then collect data, compressing after each frame to make sure will fit in available space + while (LINK->FRAMES[n] == NULL && slots < 8) { slots++; diff --git a/Versions.h b/Versions.h index 17f1dfe..4595afc 100644 --- a/Versions.h +++ b/Versions.h @@ -10,8 +10,8 @@ #endif -#define KVers 6,0,24,78 -#define KVerstring "6.0.24.78\0" +#define KVers 6,0,24,80 +#define KVerstring "6.0.24.80\0" #ifdef CKernel diff --git a/WebMail.c b/WebMail.c index 2c97f84..63bfd6e 100644 --- a/WebMail.c +++ b/WebMail.c @@ -2662,10 +2662,10 @@ VOID SaveNewMessage(struct HTTPConnectionInfo * Session, char * MsgPtr, char * R if (strlen(WebMail->BID) > 12) WebMail->BID[12] = 0; - UndoTransparency(WebMail->BID); - UndoTransparency(WebMail->To); - UndoTransparency(WebMail->Subject); - UndoTransparency(WebMail->Body); +// UndoTransparency(WebMail->BID); +// UndoTransparency(WebMail->To); +// UndoTransparency(WebMail->Subject); +// UndoTransparency(WebMail->Body); MsgLen = strlen(WebMail->Body); diff --git a/asmstrucs.h b/asmstrucs.h index 79e9a26..968f5fb 100644 --- a/asmstrucs.h +++ b/asmstrucs.h @@ -930,6 +930,9 @@ typedef struct _LINKTABLE VOID * FRAMES[8]; // FRAMES WAITING ACK VOID * RXFRAMES[8]; // Frames received out of sequence + time_t LASTFRAMESENT; // For detecting stuck links + int LASTSENTQCOUNT; // + UCHAR L2STATE; // PROCESSING STATE UCHAR Ver2point2; // Set if running 2.2 USHORT L2TIMER; // FRAME RETRY TIMER diff --git a/bpqchat.c b/bpqchat.c index 35f62c9..31dcc3e 100644 --- a/bpqchat.c +++ b/bpqchat.c @@ -73,6 +73,8 @@ //.25 // Increase size of status display buffers (7) +// Allow sending BEL (CTRL/G) (79) + #include "BPQChat.h" #include "Dbghelp.h" diff --git a/cMain.c b/cMain.c index c87fac2..05732c7 100644 --- a/cMain.c +++ b/cMain.c @@ -62,6 +62,7 @@ extern int needADSB; struct PORTCONFIG * PortRec; #define RNRSET 0x2 // RNR RECEIVED FROM OTHER END +#define PFBIT 0x10 // POLL/FINAL BIT IN CONTROL BYTE // STATION INFORMATION @@ -2506,6 +2507,47 @@ ENDOFLIST: if ((LINK->L2FLAGS & RNRSET) == 0) SDETX(LINK); + else + { + // Stuck link debug check + + if (LINK->LASTFRAMESENT && (time(NULL) - LINK->LASTFRAMESENT) > 60) // No send for 60 secs + { + if (COUNT_AT_L2(LINK) > 16) + { + // Dump Link State + + char Normcall[11] = ""; + char Normcall2[11] = ""; + + int Count = COUNT_AT_L2(LINK); + int secs = time(NULL) - LINK->LASTFRAMESENT; + + + ConvFromAX25(LINK->LINKCALL, Normcall); + ConvFromAX25(LINK->OURCALL, Normcall2); + + Debugprintf("*** Stuck L2 Session for %d Secs RNR Set %s %s %d", secs, Normcall, Normcall2, Count); + Debugprintf("LINK->LINKNS %d LINK->LINKOWS %d SDTSLOT %d LINKWINDOW %d L2FLAGS %d", LINK->LINKNS, LINK->LINKOWS, LINK->SDTSLOT, LINK->LINKWINDOW, LINK->L2FLAGS); + Debugprintf("Slots %x %x %x %x %x %x %x %x", LINK->FRAMES[0], LINK->FRAMES[1], LINK->FRAMES[2], LINK->FRAMES[3], + LINK->FRAMES[4], LINK->FRAMES[5], LINK->FRAMES[6], LINK->FRAMES[7]); + + // Reset Link + + + InformPartner(LINK, NORMALCLOSE); // TELL OTHER END ITS GONE + + LINK->L2RETRIES -= 1; // Just send one DISC + LINK->L2STATE = 4; // CLOSING + + L2SENDCOMMAND(LINK, DISC | PFBIT); + + return; + } + } + + } + } } LINK++;