FreeCalypso > hg > freecalypso-sw
changeset 171:4d8e4c58df71
rvtdump: implemented Tx extension hack, compiles
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Wed, 20 Nov 2013 05:39:31 +0000 |
parents | 4b53bd08f345 |
children | 019120585a1c |
files | rvinterf/Makefile rvinterf/log.c rvinterf/packettx.c rvinterf/rvtdump.c rvinterf/rvtdump_tx.c rvinterf/txpkt.h |
diffstat | 6 files changed, 153 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/rvinterf/Makefile Wed Nov 20 04:05:18 2013 +0000 +++ b/rvinterf/Makefile Wed Nov 20 05:39:31 2013 +0000 @@ -3,7 +3,8 @@ PROGS= rvtdump INSTBIN=/usr/local/bin -RVTDUMP_OBJS= log.o openport.o packetrx.o rvtdump.o trdump.o +RVTDUMP_OBJS= log.o openport.o packetrx.o packettx.o rvtdump.o rvtdump_tx.o \ + trdump.o all: ${PROGS}
--- a/rvinterf/log.c Wed Nov 20 04:05:18 2013 +0000 +++ b/rvinterf/log.c Wed Nov 20 05:39:31 2013 +0000 @@ -31,3 +31,20 @@ curtm->tm_sec, pr_item); bcopy(curtm, &last_tm, sizeof(struct tm)); } + +log_sent_packet(pkt, pktlen) + u_char *pkt; +{ + int i; + char *dp; + + dp = pr_item; + strcpy(dp, "Sent"); + dp += 4; + for (i = 0; i < pktlen; i++) { + sprintf(dp, " %02X", pkt[i]); + dp += 3; + } + *dp = '\0'; + print_item(); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/packettx.c Wed Nov 20 05:39:31 2013 +0000 @@ -0,0 +1,32 @@ +/* + * This module handles the lowest level of serial packet Tx + */ + +#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include "pktmux.h" +#include "txpkt.h" + +extern int target_fd; + +send_pkt_to_target(pkt, pktlen) + u_char *pkt; +{ + u_char buf[MAX_PKT_TO_TARGET*2+2]; + u_char *cp, *dp, *endp; + int c; + + endp = pkt + pktlen; + dp = buf; + *dp++ = STX; + for (cp = pkt; cp < endp; cp++) { + c = *cp; + if (c == STX || c == DLE) + *dp++ = DLE; + *dp++ = c; + } + *dp++ = STX; + write(target_fd, buf, dp - buf); +}
--- a/rvinterf/rvtdump.c Wed Nov 20 04:05:18 2013 +0000 +++ b/rvinterf/rvtdump.c Wed Nov 20 05:39:31 2013 +0000 @@ -14,21 +14,22 @@ extern char *baudrate_name; extern char pr_item[]; +extern int sendsock_fd; char *logfname; FILE *logF; time_t logtime; -int background; +int background, sendsock_enable; main(argc, argv) char **argv; { extern char *optarg; extern int optind; - int c; + int c, maxfd; fd_set fds; - while ((c = getopt(argc, argv, "bB:d:l:")) != EOF) + while ((c = getopt(argc, argv, "bB:d:l:s")) != EOF) switch (c) { case 'b': background++; @@ -42,6 +43,9 @@ case 'l': logfname = optarg; continue; + case 's': + sendsock_enable++; + continue; case '?': default: usage: fprintf(stderr, @@ -69,6 +73,8 @@ fprintf(logF, "*** Log of decoded RVT output ***\n"); setlinebuf(logF); } + if (sendsock_enable) + create_send_socket(); if (background) { c = fork(); if (c < 0) { @@ -80,10 +86,15 @@ exit(0); } } + maxfd = target_fd; + if (sendsock_fd > maxfd) + maxfd = sendsock_fd; for (;;) { FD_ZERO(&fds); FD_SET(target_fd, &fds); - c = select(target_fd+1, &fds, 0, 0, 0); + if (sendsock_enable) + FD_SET(sendsock_fd, &fds); + c = select(maxfd+1, &fds, 0, 0, 0); time(&logtime); if (c < 0) { if (errno == EINTR) @@ -93,6 +104,8 @@ } if (FD_ISSET(target_fd, &fds)) process_serial_rx(); + if (FD_ISSET(sendsock_fd, &fds)) + handle_sendsock(); } }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/rvtdump_tx.c Wed Nov 20 05:39:31 2013 +0000 @@ -0,0 +1,70 @@ +/* + * This module contains the implementation of the Tx extension to rvtdump + */ + +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/un.h> +#include <stdio.h> +#include <string.h> +#include <strings.h> +#include <stdlib.h> +#include <unistd.h> +#include "txpkt.h" + +static char sockpath[] = "/tmp/rvt_send_socket"; + +int sendsock_fd; +u_char sendsock_pkt[MAX_PKT_TO_TARGET]; +int sendsock_pktlen; + +create_send_socket() +{ + /* local socket binding voodoo copied from osmocon */ + struct sockaddr_un local; + unsigned int namelen; + int rc; + + sendsock_fd = socket(AF_UNIX, SOCK_DGRAM, 0); + if (sendsock_fd < 0) { + perror("socket(AF_UNIX, SOCK_DGRAM, 0)"); + exit(1); + } + + local.sun_family = AF_UNIX; + strncpy(local.sun_path, sockpath, sizeof(local.sun_path)); + local.sun_path[sizeof(local.sun_path) - 1] = '\0'; + unlink(local.sun_path); + + /* we use the same magic that X11 uses in Xtranssock.c for + * calculating the proper length of the sockaddr */ +#if defined(BSD44SOCKETS) || defined(__UNIXWARE__) + local.sun_len = strlen(local.sun_path); +#endif +#if defined(BSD44SOCKETS) || defined(SUN_LEN) + namelen = SUN_LEN(&local); +#else + namelen = strlen(local.sun_path) + + offsetof(struct sockaddr_un, sun_path); +#endif + + rc = bind(sendsock_fd, (struct sockaddr *) &local, namelen); + if (rc != 0) { + perror("bind on local dgram socket"); + exit(1); + } + + return(0); +} + +handle_sendsock() +{ + sendsock_pktlen = recv(sendsock_fd, sendsock_pkt, MAX_PKT_TO_TARGET, 0); + if (sendsock_pktlen <= 0) { + fprintf(stderr, "return value from recv on socket: %d\n", + sendsock_pktlen); + exit(1); + } + send_pkt_to_target(sendsock_pkt, sendsock_pktlen); + log_sent_packet(sendsock_pkt, sendsock_pktlen); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rvinterf/txpkt.h Wed Nov 20 05:39:31 2013 +0000 @@ -0,0 +1,15 @@ +/* + * For sizing our buffers etc in rvinterf, we need a limit on the size of + * message packets we can send to the target. As it happens, the packet + * Rx code in RVT on the target side also has a limit (quite naturally, + * as it needs to use a static buffer to reassemble incoming packets as + * they arrive at the UART in unpredictable interrupt-sized chunks), so + * we set our limit to match that in RVT. + */ + +#define MAX_PKT_TO_TARGET 255 + +/* + * The above limit definition counts all bytes between the opening and + * closing STX flags, but not DLEs inserted for binary transparency. + */