jcs
/subtext
/amendments
/598
binkp: Add packet read timeout, minor socket read improvement
binkp_frame is not a packed struct of the actual frame, so read into
buf and assign to binkp_frame manually.
jcs made amendment 598 11 months ago
--- binkp.c Tue Jan 23 16:24:43 2024
+++ binkp.c Wed Oct 22 22:12:22 2025
@@ -380,27 +380,38 @@ binkp_read_frame(void)
return false;
}
- if (binkpc->tcp_status_pb.amtUnreadData < 2)
+ if (binkpc->tcp_status_pb.amtUnreadData < 2) {
+ if (Time - binkpc->last_frame_at > 60) {
+ logger_printf("[binkp] No data received in %ld seconds, "
+ "disconnecting", Time - binkpc->last_frame_at);
+ binkpc->error = true;
+ }
return false;
+ }
rlen = 2;
error = _TCPRcv(&binkpc->tcp_read_iopb, binkpc->tcp_stream,
- (Ptr)&binkpc->cur_frame, &rlen, nil, nil, false);
+ (Ptr)binkpc->buf, &rlen, nil, nil, false);
if (error) {
binkpc->error = true;
return false;
}
+#ifdef BINKP_DEBUG
+ logger_printf("[binkp] Received frame header 0x%x 0x%x",
+ (unsigned char)binkpc->buf[0], (unsigned char)binkpc->buf[1]);
+#endif
+
+ binkpc->cur_frame.type = (unsigned char)binkpc->buf[0] >> 7;
+ binkpc->cur_frame.data_size =
+ (unsigned short)((unsigned char)binkpc->buf[0] & 127) << 8;
+ binkpc->cur_frame.data_size |= (unsigned char)binkpc->buf[1];
if (binkpc->cur_frame.data_size == 0) {
logger_printf("[binkp] Received bogus frame, no data_size");
return false;
}
binkpc->last_frame_at = Time;
- binkpc->cur_frame.type =
- (binkpc->cur_frame.data_size & (1 << 15)) == 0 ? BINKP_TYPE_DATA :
- BINKP_TYPE_COMMAND;
- binkpc->cur_frame.data_size &= 0x7fff;
frame_data_read = 0;
while (frame_data_read < binkpc->cur_frame.data_size) {
--- binkp.h Tue Jan 23 16:25:03 2024
+++ binkp.h Wed Oct 22 21:54:37 2025
@@ -21,8 +21,12 @@
#include "tcp.h"
#include "uthread.h"
#include "util.h"
-
+
+/* this is not the on-wire format */
struct binkp_frame {
+ char type;
+#define BINKP_TYPE_DATA 0x0
+#define BINKP_TYPE_COMMAND 0x1
u_int16_t data_size;
char command_id;
#define BINKP_DATA -1
@@ -37,10 +41,6 @@ struct binkp_frame {
#define BINKP_COMMAND_M_BSY 8
#define BINKP_COMMAND_M_GET 9
#define BINKP_COMMAND_M_SKIP 10
-
- char type;
-#define BINKP_TYPE_DATA 0x0
-#define BINKP_TYPE_COMMAND 0x1
};
struct binkp_file {