A simple Ethernet sniffer. A demonstration how to use the Ethernet interface.

Dependencies:   mbed

main.cpp

Committer:
rolf
Date:
2009-09-04
Revision:
0:29e2df9de9f1

File content as of revision 0:29e2df9de9f1:

#include "mbed.h"
#include "Ethernet.h"
#include "hexview.h"

using namespace mbed;

DigitalOut led4(LED4);

Ethernet eth;

/*
__packed struct eth {
    unsigned char    dst[6];
    unsigned char    src[6];
    unsigned short   type;
};

void show(char *buffer, int size) {
    eth *e = (eth *)buffer;
    printf("Destination:  %02hx:%02hx:%02hx:%02hx:%02hx:%02hx\n",
            e->dst[0], e->dst[1], e->dst[2], e->dst[3], e->dst[4], e->dst[5]);
    printf("Source: %02hx:%02hx:%02hx:%02hx:%02hx:%02hx\n",
            e->src[0], e->src[1], e->src[2], e->src[3], e->src[4], e->src[5]);
  
    printf("Type %hd\n", eth->type);
    hexview(buffer, size);
}
*/

unsigned short htons(unsigned short n) {               // Host short to network shor
  return ((n & 0xff) << 8) | ((n & 0xff00) >> 8);      // Byte swapping
}

void show(char *buf, int size) {
    printf("Destination:  %02hx:%02hx:%02hx:%02hx:%02hx:%02hx\n",
            buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
    printf("Source: %02hx:%02hx:%02hx:%02hx:%02hx:%02hx\n",
            buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]);
  
    printf("Type %hd\n", htons((short)buf[12]));
    
    hexview(buf, size);
}


int main() {
    char buffer[0x600];
    int size = 0;
    
    while(1) {
        if((size = eth.receive()) != 0) {
            eth.read(buffer, size);
            show(buffer, size);
        }
        
        led4 = 1;
        wait(0.2);
        led4 = 0;
        wait(0.2);
    }
}