This is a low-level network debugging utility that utilizes raw packet i/o to construct and deconstruct tcp, udp, ipv4, arp, and icmp packets over ethernet.

Dependencies:   mbed

Committer:
etherealflaim
Date:
Tue Oct 12 05:32:59 2010 +0000
Revision:
0:d494b853ce97
Child:
4:88fc7fa58931
Initial Publish - Slightly unfinished, but usable

Who changed what in which revision?

UserRevisionLine numberNew contents of line
etherealflaim 0:d494b853ce97 1 #ifndef LOG_H
etherealflaim 0:d494b853ce97 2 #define LOG_H
etherealflaim 0:d494b853ce97 3
etherealflaim 0:d494b853ce97 4 #include "mbed.h"
etherealflaim 0:d494b853ce97 5
etherealflaim 0:d494b853ce97 6 #include "stdarg.h"
etherealflaim 0:d494b853ce97 7 #include "stdio.h"
etherealflaim 0:d494b853ce97 8
etherealflaim 0:d494b853ce97 9 #define LOG_BUFSIZE 4096
etherealflaim 0:d494b853ce97 10
etherealflaim 0:d494b853ce97 11
etherealflaim 0:d494b853ce97 12
etherealflaim 0:d494b853ce97 13 typedef enum {
etherealflaim 0:d494b853ce97 14 LOG_USB = 0,
etherealflaim 0:d494b853ce97 15 LOG_SER_9_10,
etherealflaim 0:d494b853ce97 16 LOG_SER_13_14,
etherealflaim 0:d494b853ce97 17 LOG_SER_28_27,
etherealflaim 0:d494b853ce97 18 LOG_MAX
etherealflaim 0:d494b853ce97 19 } SerialLines;
etherealflaim 0:d494b853ce97 20
etherealflaim 0:d494b853ce97 21 class Log {
etherealflaim 0:d494b853ce97 22 private:
etherealflaim 0:d494b853ce97 23 // Accomodate all 3 serial ports and USB
etherealflaim 0:d494b853ce97 24 Serial *m_serial[4];
etherealflaim 0:d494b853ce97 25 bool m_enable[4];
etherealflaim 0:d494b853ce97 26
etherealflaim 0:d494b853ce97 27 // File log
etherealflaim 0:d494b853ce97 28 LocalFileSystem local;
etherealflaim 0:d494b853ce97 29
etherealflaim 0:d494b853ce97 30 public:
etherealflaim 0:d494b853ce97 31 inline Log() : local("local")
etherealflaim 0:d494b853ce97 32 {
etherealflaim 0:d494b853ce97 33 // Write to file
etherealflaim 0:d494b853ce97 34 FILE *logfile = fopen("/local/NetTool.log", "w");
etherealflaim 0:d494b853ce97 35 fputs("NetTool - Welcome!", logfile);
etherealflaim 0:d494b853ce97 36 fclose(logfile);
etherealflaim 0:d494b853ce97 37
etherealflaim 0:d494b853ce97 38 // Set up the serial classes
etherealflaim 0:d494b853ce97 39 m_serial[LOG_USB] = new Serial(USBTX,USBRX);
etherealflaim 0:d494b853ce97 40 m_serial[LOG_SER_9_10] = new Serial(p9,p10);
etherealflaim 0:d494b853ce97 41 m_serial[LOG_SER_13_14] = new Serial(p13,p14);
etherealflaim 0:d494b853ce97 42 m_serial[LOG_SER_28_27] = new Serial(p28,p27);
etherealflaim 0:d494b853ce97 43
etherealflaim 0:d494b853ce97 44 // Disable logging to all of them by default
etherealflaim 0:d494b853ce97 45 for (int idx = 0; idx < LOG_MAX; ++idx)
etherealflaim 0:d494b853ce97 46 {
etherealflaim 0:d494b853ce97 47 m_enable[idx] = false;
etherealflaim 0:d494b853ce97 48 }
etherealflaim 0:d494b853ce97 49 }
etherealflaim 0:d494b853ce97 50
etherealflaim 0:d494b853ce97 51 // Enable logging to the given serial line
etherealflaim 0:d494b853ce97 52 inline void enable(SerialLines idx)
etherealflaim 0:d494b853ce97 53 {
etherealflaim 0:d494b853ce97 54 m_enable[idx] = true;
etherealflaim 0:d494b853ce97 55 }
etherealflaim 0:d494b853ce97 56
etherealflaim 0:d494b853ce97 57 // Disable logging to the given serial line
etherealflaim 0:d494b853ce97 58 inline void disable(SerialLines idx)
etherealflaim 0:d494b853ce97 59 {
etherealflaim 0:d494b853ce97 60 m_enable[idx] = false;
etherealflaim 0:d494b853ce97 61 }
etherealflaim 0:d494b853ce97 62
etherealflaim 0:d494b853ce97 63 // This can log messages up to 4095 characters and has printf semantics
etherealflaim 0:d494b853ce97 64 // All log messages include an implicit \r\n at the end
etherealflaim 0:d494b853ce97 65 inline bool printf(char *format, ...)
etherealflaim 0:d494b853ce97 66 {
etherealflaim 0:d494b853ce97 67 static char buffer[LOG_BUFSIZE];
etherealflaim 0:d494b853ce97 68 static int count;
etherealflaim 0:d494b853ce97 69 static va_list va;
etherealflaim 0:d494b853ce97 70
etherealflaim 0:d494b853ce97 71 va_start(va, format);
etherealflaim 0:d494b853ce97 72 count = vsnprintf(buffer, LOG_BUFSIZE, format, va);
etherealflaim 0:d494b853ce97 73
etherealflaim 0:d494b853ce97 74 // Ensure that the log message fit
etherealflaim 0:d494b853ce97 75 if (count > LOG_BUFSIZE-1)
etherealflaim 0:d494b853ce97 76 {
etherealflaim 0:d494b853ce97 77 // Log an error message if it didn't
etherealflaim 0:d494b853ce97 78 Log::printf("Log message too long: %4d", count);
etherealflaim 0:d494b853ce97 79 }
etherealflaim 0:d494b853ce97 80 else
etherealflaim 0:d494b853ce97 81 {
etherealflaim 0:d494b853ce97 82 // Write all characters from the message
etherealflaim 0:d494b853ce97 83 puts(buffer);
etherealflaim 0:d494b853ce97 84 // Send the EOM (\r\n)
etherealflaim 0:d494b853ce97 85 puts("\r\n");
etherealflaim 0:d494b853ce97 86 }
etherealflaim 0:d494b853ce97 87 va_end(va);
etherealflaim 0:d494b853ce97 88 return true;
etherealflaim 0:d494b853ce97 89 } // printf
etherealflaim 0:d494b853ce97 90
etherealflaim 0:d494b853ce97 91 bool puts(const char *str)
etherealflaim 0:d494b853ce97 92 {
etherealflaim 0:d494b853ce97 93 // Write to file
etherealflaim 0:d494b853ce97 94 FILE *logfile = fopen("/local/NetTool.log", "a");
etherealflaim 0:d494b853ce97 95 fputs(str, logfile);
etherealflaim 0:d494b853ce97 96 fclose(logfile);
etherealflaim 0:d494b853ce97 97
etherealflaim 0:d494b853ce97 98 // Write all characters from the message
etherealflaim 0:d494b853ce97 99 while (*str)
etherealflaim 0:d494b853ce97 100 {
etherealflaim 0:d494b853ce97 101 // Write to all serial devices
etherealflaim 0:d494b853ce97 102 for (int s = 0; s < LOG_MAX; ++s)
etherealflaim 0:d494b853ce97 103 {
etherealflaim 0:d494b853ce97 104 // Only write if enabled
etherealflaim 0:d494b853ce97 105 if (m_enable[s])
etherealflaim 0:d494b853ce97 106 s[*m_serial].putc(*str++);
etherealflaim 0:d494b853ce97 107 }
etherealflaim 0:d494b853ce97 108 }
etherealflaim 0:d494b853ce97 109 return true;
etherealflaim 0:d494b853ce97 110 }
etherealflaim 0:d494b853ce97 111
etherealflaim 0:d494b853ce97 112 };
etherealflaim 0:d494b853ce97 113
etherealflaim 0:d494b853ce97 114 #endif