diff rvinterf/asyncshell/pktsort.c @ 0:e7502631a0f9

initial import from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 11 Jun 2016 00:13:35 +0000
parents
children d43d82cbfb85
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rvinterf/asyncshell/pktsort.c	Sat Jun 11 00:13:35 2016 +0000
@@ -0,0 +1,83 @@
+/*
+ * Here we sort out incoming packets from the target relayed via rvinterf.
+ */
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <strings.h>
+#include <stdlib.h>
+#include "pktmux.h"
+#include "limits.h"
+#include "localsock.h"
+#include "localtypes.h"
+
+extern u_char rvi_msg[];
+extern int rvi_msg_len;
+
+static void
+process_rvt()
+{
+	u32 useid;
+
+	if (rvi_msg_len < 7) {
+		tty_cleanup();
+		fprintf(stderr, "Error: rvinterf sent us an invalid RVT msg\n");
+		exit(1);
+	}
+	useid = rvi_msg[2] << 24 | rvi_msg[3] << 16 | rvi_msg[4] << 8
+		| rvi_msg[5];
+	switch (useid) {
+	case 0:
+		handle_useid_0();
+		return;
+	default:
+		tty_cleanup();
+		fprintf(stderr, "unexpected fwd of USEID %08X from rvinterf\n",
+			useid);
+		exit(1);
+	}
+}
+
+static void
+gpf_packet_rx()
+{
+	char fmtbuf[MAX_PKT_FROM_TARGET*8];	/* size it generously */
+
+	format_g23_packet(rvi_msg + 1, rvi_msg_len - 1, fmtbuf);
+	async_msg_output(fmtbuf);
+}
+
+static void
+response_from_ati()
+{
+	char buf[MAX_PKT_FROM_TARGET*4+2];
+
+	strcpy(buf, "ATI: ");
+	safe_print_trace(rvi_msg + 2, rvi_msg_len - 2, buf + 5);
+	async_msg_output(buf);
+}
+
+void
+process_pkt_from_target()
+{
+	switch (rvi_msg[1]) {
+	case RVT_RV_HEADER:
+		process_rvt();
+		return;
+	case RVT_L23_HEADER:
+		gpf_packet_rx();
+		return;
+	case RVT_AT_HEADER:
+		response_from_ati();
+		return;
+	case RVT_TCH_HEADER:
+		tch_packet_rx();
+		return;
+	default:
+		tty_cleanup();
+		fprintf(stderr, "unexpected fwd of MUX %02X from rvinterf\n",
+			rvi_msg[1]);
+		exit(1);
+	}
+}