Added MS/TP Capture to PCAP format for Wireshark viewing to the rx_fsm program in ports/win32.
This commit is contained in:
@@ -37,6 +37,8 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <conio.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
/* Windows includes */
|
/* Windows includes */
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
@@ -133,6 +135,7 @@ uint16_t MSTP_Get_Reply(
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
static void print_received_packet(
|
static void print_received_packet(
|
||||||
volatile struct mstp_port_struct_t *mstp_port)
|
volatile struct mstp_port_struct_t *mstp_port)
|
||||||
{
|
{
|
||||||
@@ -162,13 +165,41 @@ static void print_received_packet(
|
|||||||
fprintf(stderr, "%s", mstptext_frame_type(mstp_port->FrameType));
|
fprintf(stderr, "%s", mstptext_frame_type(mstp_port->FrameType));
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* returns a delta timestamp */
|
||||||
|
void timestamp(
|
||||||
|
uint32_t *ts_sec, /* timestamp seconds since epoch (Unix) */
|
||||||
|
uint32_t *ts_usec) /* timestamp microseconds (unix) */
|
||||||
|
{
|
||||||
|
DWORD ticks = 0;
|
||||||
|
static DWORD initial_ticks = 0;
|
||||||
|
static time_t initial_seconds = 0;
|
||||||
|
time_t seconds = 0;
|
||||||
|
time_t milliseconds = 0;
|
||||||
|
time_t elapsed_ticks = 0;
|
||||||
|
|
||||||
|
if (initial_seconds == 0) {
|
||||||
|
initial_seconds = time(NULL);
|
||||||
|
initial_ticks = GetTickCount();
|
||||||
|
}
|
||||||
|
ticks = GetTickCount();
|
||||||
|
/* how much total time has passed? */
|
||||||
|
elapsed_ticks = ticks - initial_ticks;
|
||||||
|
seconds = elapsed_ticks / 1000;
|
||||||
|
milliseconds = elapsed_ticks - (seconds * 1000);
|
||||||
|
*ts_sec = initial_seconds + seconds;
|
||||||
|
*ts_usec = milliseconds * 1000;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
static const char *Capture_Filename = "mstp.cap";
|
static const char *Capture_Filename = "mstp.cap";
|
||||||
|
static FILE *pFile = NULL; /* stream pointer */
|
||||||
|
|
||||||
/* write packet to file in libpcap format */
|
/* write packet to file in libpcap format */
|
||||||
static void write_global_header(void)
|
static void write_global_header(void)
|
||||||
{
|
{
|
||||||
FILE *pFile = NULL; /* stream pointer */
|
|
||||||
uint32_t magic_number = 0xa1b2c3d4; /* magic number */
|
uint32_t magic_number = 0xa1b2c3d4; /* magic number */
|
||||||
uint16_t version_major = 2; /* major version number */
|
uint16_t version_major = 2; /* major version number */
|
||||||
uint16_t version_minor = 4; /* minor version number */
|
uint16_t version_minor = 4; /* minor version number */
|
||||||
@@ -177,6 +208,7 @@ static void write_global_header(void)
|
|||||||
uint32_t snaplen = 65535; /* max length of captured packets, in octets */
|
uint32_t snaplen = 65535; /* max length of captured packets, in octets */
|
||||||
uint32_t network = 165; /* data link type */
|
uint32_t network = 165; /* data link type */
|
||||||
|
|
||||||
|
/* create a new file. */
|
||||||
pFile = fopen(Capture_Filename, "wb");
|
pFile = fopen(Capture_Filename, "wb");
|
||||||
if (pFile) {
|
if (pFile) {
|
||||||
fwrite(&magic_number,sizeof(magic_number),1,pFile);
|
fwrite(&magic_number,sizeof(magic_number),1,pFile);
|
||||||
@@ -186,45 +218,23 @@ static void write_global_header(void)
|
|||||||
fwrite(&sigfigs,sizeof(sigfigs),1,pFile);
|
fwrite(&sigfigs,sizeof(sigfigs),1,pFile);
|
||||||
fwrite(&snaplen,sizeof(snaplen),1,pFile);
|
fwrite(&snaplen,sizeof(snaplen),1,pFile);
|
||||||
fwrite(&network,sizeof(network),1,pFile);
|
fwrite(&network,sizeof(network),1,pFile);
|
||||||
fclose(pFile);
|
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr,"rx_fsm: failed to open %s: %s\n",
|
fprintf(stderr,"rx_fsm: failed to open %s: %s\n",
|
||||||
Capture_Filename, strerror(errno));
|
Capture_Filename, strerror(errno));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* returns a delta timestamp */
|
|
||||||
static uint32_t timestamp_ms(
|
|
||||||
void)
|
|
||||||
{
|
|
||||||
DWORD ticks = 0, delta_ticks = 0;
|
|
||||||
static DWORD last_ticks = 0;
|
|
||||||
|
|
||||||
ticks = GetTickCount();
|
|
||||||
delta_ticks =
|
|
||||||
(ticks >= last_ticks ? ticks - last_ticks : MAXDWORD - last_ticks);
|
|
||||||
last_ticks = ticks;
|
|
||||||
|
|
||||||
return delta_ticks;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void write_received_packet(
|
static void write_received_packet(
|
||||||
volatile struct mstp_port_struct_t *mstp_port)
|
volatile struct mstp_port_struct_t *mstp_port)
|
||||||
{
|
{
|
||||||
FILE *pFile = NULL; /* stream pointer */
|
|
||||||
unsigned i;
|
|
||||||
uint32_t ts_sec; /* timestamp seconds */
|
uint32_t ts_sec; /* timestamp seconds */
|
||||||
uint32_t ts_usec; /* timestamp microseconds */
|
uint32_t ts_usec; /* timestamp microseconds */
|
||||||
uint32_t incl_len; /* number of octets of packet saved in file */
|
uint32_t incl_len; /* number of octets of packet saved in file */
|
||||||
uint32_t orig_len; /* actual length of packet */
|
uint32_t orig_len; /* actual length of packet */
|
||||||
uint8_t header[8] = {0x55,0xFF};
|
uint8_t header[8]; /* MS/TP header */
|
||||||
uint32_t milliseconds;
|
|
||||||
|
|
||||||
milliseconds = timestamp_ms();
|
|
||||||
pFile = fopen(Capture_Filename, "ab");
|
|
||||||
if (pFile) {
|
if (pFile) {
|
||||||
ts_sec = milliseconds/1000;
|
timestamp(&ts_sec, &ts_usec);
|
||||||
ts_usec = milliseconds - (ts_sec * 1000);
|
|
||||||
fwrite(&ts_sec,sizeof(ts_sec),1,pFile);
|
fwrite(&ts_sec,sizeof(ts_sec),1,pFile);
|
||||||
fwrite(&ts_usec,sizeof(ts_usec),1,pFile);
|
fwrite(&ts_usec,sizeof(ts_usec),1,pFile);
|
||||||
if (mstp_port->DataLength) {
|
if (mstp_port->DataLength) {
|
||||||
@@ -248,7 +258,6 @@ static void write_received_packet(
|
|||||||
fwrite(&(mstp_port->DataCRCActualMSB),1,1,pFile);
|
fwrite(&(mstp_port->DataCRCActualMSB),1,1,pFile);
|
||||||
fwrite(&(mstp_port->DataCRCActualLSB),1,1,pFile);
|
fwrite(&(mstp_port->DataCRCActualLSB),1,1,pFile);
|
||||||
}
|
}
|
||||||
fclose(pFile);
|
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr,"rx_fsm: failed to open %s: %s\n",
|
fprintf(stderr,"rx_fsm: failed to open %s: %s\n",
|
||||||
Capture_Filename, strerror(errno));
|
Capture_Filename, strerror(errno));
|
||||||
@@ -257,6 +266,15 @@ static void write_received_packet(
|
|||||||
|
|
||||||
static char *Network_Interface = NULL;
|
static char *Network_Interface = NULL;
|
||||||
|
|
||||||
|
static void cleanup(void)
|
||||||
|
{
|
||||||
|
if (pFile) {
|
||||||
|
fflush(pFile); /* stream pointer */
|
||||||
|
fclose(pFile); /* stream pointer */
|
||||||
|
}
|
||||||
|
pFile = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* simple test to packetize the data and print it */
|
/* simple test to packetize the data and print it */
|
||||||
int main(
|
int main(
|
||||||
int argc,
|
int argc,
|
||||||
@@ -303,20 +321,27 @@ int main(
|
|||||||
if (hThread == 0) {
|
if (hThread == 0) {
|
||||||
fprintf(stderr, "Failed to start timer task\n");
|
fprintf(stderr, "Failed to start timer task\n");
|
||||||
}
|
}
|
||||||
/* run forever */
|
atexit(cleanup);
|
||||||
write_global_header();
|
write_global_header();
|
||||||
|
(void) SetThreadPriority(GetCurrentThread(),
|
||||||
|
THREAD_PRIORITY_TIME_CRITICAL);
|
||||||
|
/* run forever */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
RS485_Check_UART_Data(mstp_port);
|
RS485_Check_UART_Data(mstp_port);
|
||||||
MSTP_Receive_Frame_FSM(mstp_port);
|
MSTP_Receive_Frame_FSM(mstp_port);
|
||||||
/* process the data portion of the frame */
|
/* process the data portion of the frame */
|
||||||
if (mstp_port->ReceivedValidFrame) {
|
if (mstp_port->ReceivedValidFrame) {
|
||||||
mstp_port->ReceivedValidFrame = false;
|
mstp_port->ReceivedValidFrame = false;
|
||||||
|
#if 0
|
||||||
print_received_packet(mstp_port);
|
print_received_packet(mstp_port);
|
||||||
|
#endif
|
||||||
write_received_packet(mstp_port);
|
write_received_packet(mstp_port);
|
||||||
} else if (mstp_port->ReceivedInvalidFrame) {
|
} else if (mstp_port->ReceivedInvalidFrame) {
|
||||||
mstp_port->ReceivedInvalidFrame = false;
|
mstp_port->ReceivedInvalidFrame = false;
|
||||||
fprintf(stderr, "ReceivedInvalidFrame\n");
|
fprintf(stderr, "ReceivedInvalidFrame\n");
|
||||||
|
#if 0
|
||||||
print_received_packet(mstp_port);
|
print_received_packet(mstp_port);
|
||||||
|
#endif
|
||||||
write_received_packet(mstp_port);
|
write_received_packet(mstp_port);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user