FreeCalypso > hg > freecalypso-sw
comparison rvinterf/lowlevel/packetrx.c @ 174:3256dc6e84ae
rvinterf: refactored rvtdump compiles and works
| author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
|---|---|
| date | Fri, 22 Nov 2013 07:41:31 +0000 |
| parents | f42854da4563 |
| children | 2f285f20d617 |
comparison
equal
deleted
inserted
replaced
| 173:f42854da4563 | 174:3256dc6e84ae |
|---|---|
| 4 | 4 |
| 5 #include <sys/types.h> | 5 #include <sys/types.h> |
| 6 #include <stdio.h> | 6 #include <stdio.h> |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <unistd.h> | 8 #include <unistd.h> |
| 9 #include "pktmux.h" | 9 #include "../pktmux.h" |
| 10 #include "../limits.h" | |
| 10 | 11 |
| 11 extern int target_fd; | 12 extern int target_fd; |
| 12 | 13 |
| 13 #define MAXPKT 512 | 14 u_char rxpkt[MAX_PKT_FROM_TARGET]; |
| 14 u_char rxpkt[MAXPKT]; | |
| 15 size_t rxpkt_len; | 15 size_t rxpkt_len; |
| 16 | |
| 17 extern char pr_item[]; | |
| 18 | 16 |
| 19 static int in_pkt, dle_state, toobig; | 17 static int in_pkt, dle_state, toobig; |
| 20 | 18 |
| 21 static void | 19 static void |
| 22 process_inbyte(inb) | 20 process_inbyte(inb) |
| 23 { | 21 { |
| 22 char errbuf[128]; | |
| 23 | |
| 24 if (!in_pkt) { | 24 if (!in_pkt) { |
| 25 if (inb != STX || dle_state) { | 25 if (inb != STX || dle_state) { |
| 26 rxpkt_len++; | 26 rxpkt_len++; |
| 27 dle_state = (inb == DLE); | 27 dle_state = (inb == DLE); |
| 28 return; | 28 return; |
| 29 } | 29 } |
| 30 if (rxpkt_len) { | 30 if (rxpkt_len) { |
| 31 sprintf(pr_item, | 31 sprintf(errbuf, |
| 32 "Warning: Rx %u byte%s outside of a packet", | 32 "Warning: Rx %u byte%s outside of a packet", |
| 33 (unsigned)rxpkt_len, rxpkt_len != 1 ? "s" : ""); | 33 (unsigned)rxpkt_len, rxpkt_len != 1 ? "s" : ""); |
| 34 print_item(); | 34 output_line(errbuf); |
| 35 rxpkt_len = 0; | 35 rxpkt_len = 0; |
| 36 } | 36 } |
| 37 in_pkt = 1; | 37 in_pkt = 1; |
| 38 toobig = 0; | 38 toobig = 0; |
| 39 return; | 39 return; |
| 40 } | 40 } |
| 41 if (dle_state) { | 41 if (dle_state) { |
| 42 dle_state = 0; | 42 dle_state = 0; |
| 43 if (inb != STX && inb != DLE) { | 43 if (inb != STX && inb != DLE) { |
| 44 sprintf(pr_item, | 44 sprintf(errbuf, |
| 45 "Rx framing error: %02X after DLE\n", inb); | 45 "Rx framing error: %02X after DLE", inb); |
| 46 print_item(); | 46 output_line(errbuf); |
| 47 in_pkt = 0; | 47 in_pkt = 0; |
| 48 rxpkt_len = 0; | 48 rxpkt_len = 0; |
| 49 return; | 49 return; |
| 50 } | 50 } |
| 51 goto data; | 51 goto data; |
| 59 in_pkt = 0; | 59 in_pkt = 0; |
| 60 handle_rx_packet(); | 60 handle_rx_packet(); |
| 61 rxpkt_len = 0; | 61 rxpkt_len = 0; |
| 62 return; | 62 return; |
| 63 } | 63 } |
| 64 data: if (rxpkt_len >= MAXPKT) { | 64 data: if (rxpkt_len >= MAX_PKT_FROM_TARGET) { |
| 65 if (!toobig) { | 65 if (!toobig) { |
| 66 sprintf(pr_item, "Error: Rx packet too big!\n"); | 66 output_line("Error: Rx packet too big!"); |
| 67 print_item(); | |
| 68 toobig = 1; | 67 toobig = 1; |
| 69 } | 68 } |
| 70 return; | 69 return; |
| 71 } | 70 } |
| 72 rxpkt[rxpkt_len++] = inb; | 71 rxpkt[rxpkt_len++] = inb; |
