view rvinterf/lowlevel/format.c @ 950:bdd92dba7dd9

doc/Rvinterf-tools: document rvinterf -X option
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 07 Jun 2023 07:51:49 +0000
parents fab04df64690
children
line wrap: on
line source

/*
 * This module implements the decoding of Rx packets
 * into human-readable form.
 */

#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include "../include/pktmux.h"
#include "../include/limits.h"

extern u_char rxpkt[];
extern size_t rxpkt_len;

extern void output_line();
extern void output_cont();
extern void output_cont_logpref();

void
print_rv_trace()
{
	int i;
	char fmtbuf[MAX_PKT_FROM_TARGET*4];
	char *dp = fmtbuf;

	strcpy(dp, "RV ");
	dp += 3;
	/* the SWE static ID is sent MSB first */
	for (i = 1; i <= 4; i++) {
		sprintf(dp, "%02X", rxpkt[i]);
		dp += 2;
	}
	/* severity level */
	sprintf(dp, " %d ", rxpkt[5]);
	dp = index(dp, '\0');
	safe_print_trace(rxpkt + 6, (int)rxpkt_len - 6, dp);
	output_line(fmtbuf);
}

void
print_l1_trace()
{
	int i, c;
	char fmtbuf[MAX_PKT_FROM_TARGET*4+1];
	char *dp = fmtbuf;

	strcpy(dp, "L1: ");
	dp += 4;
	for (i = 1; i < rxpkt_len; i++) {
		if ((i+1 < rxpkt_len) &&
		    (rxpkt[i] == '\r' && rxpkt[i+1] == '\n' ||
		     rxpkt[i] == '\n' && rxpkt[i+1] == '\r')) {
			*dp = '\0';
			output_line(fmtbuf);
			if (i+2 == rxpkt_len)
				return;
			dp = fmtbuf;
			*dp++ = '+';
			*dp++ = ' ';
			i++;
			continue;
		}
		c = rxpkt[i];
		switch (c) {
		case '\\':
			*dp++ = '\\';
			*dp++ = '\\';
			continue;
		case '\r':
			*dp++ = '\\';
			*dp++ = 'r';
			continue;
		case '\n':
			*dp++ = '\\';
			*dp++ = 'n';
			continue;
		}
		if (c >= ' ' && c <= '~')
			*dp++ = c;
		else if (c <= 7 && (i+1 == rxpkt_len || !isdigit(rxpkt[i+1]))) {
			sprintf(dp, "\\%d", c);
			dp += 2;
		} else {
			sprintf(dp, "\\x%02X", c);
			dp += 4;
		}
	}
	/* will get here only if no newline sequence at the end */
	*dp = '\0';
	output_line(fmtbuf);
}

void
print_g23_trace()
{
	format_gpf_packet(rxpkt, (unsigned) rxpkt_len, "", output_line,
			  output_cont_logpref);
}

void
print_tm_output_raw()
{
	int i;
	char fmtbuf[MAX_PKT_FROM_TARGET*3+1];
	char *dp = fmtbuf;

	strcpy(dp, "TM:");
	dp += 3;
	for (i = 1; i < rxpkt_len; i++) {
		sprintf(dp, " %02X", rxpkt[i]);
		dp += 3;
	}
	*dp = '\0';
	output_line(fmtbuf);
}

void
print_unknown_packet()
{
	output_line("Rx unknown packet format");
	packet_hex_dump(rxpkt, (unsigned) rxpkt_len, output_cont);
}