83 lines
1.6 KiB
C
83 lines
1.6 KiB
C
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <errno.h>
|
|
#include <syscall.h>
|
|
#include <sys/nic.h>
|
|
|
|
#include <net/ethernet.h>
|
|
|
|
static int nicNo = 0;
|
|
static char buf[4096];
|
|
static MBuf mbuf;
|
|
|
|
void
|
|
dumpPacket()
|
|
{
|
|
struct ether_header *hdr = (struct ether_header *)&buf;
|
|
char srcMac[18];
|
|
char dstMac[18];
|
|
|
|
sprintf(srcMac, "%02x:%02x:%02x:%02x:%02x:%02x",
|
|
hdr->ether_shost[0], hdr->ether_shost[1], hdr->ether_shost[2],
|
|
hdr->ether_shost[3], hdr->ether_shost[4], hdr->ether_shost[5]);
|
|
sprintf(dstMac, "%02x:%02x:%02x:%02x:%02x:%02x",
|
|
hdr->ether_dhost[0], hdr->ether_dhost[1], hdr->ether_dhost[2],
|
|
hdr->ether_dhost[3], hdr->ether_dhost[4], hdr->ether_dhost[5]);
|
|
|
|
printf("From %s to %s of type %04x\n", srcMac, dstMac, hdr->ether_type);
|
|
}
|
|
|
|
void
|
|
readPacket(UNUSED NIC *nic)
|
|
{
|
|
uint64_t status;
|
|
|
|
mbuf.vaddr = (uint64_t)&buf;
|
|
mbuf.maddr = 0;
|
|
mbuf.len = 4096;
|
|
mbuf.type = MBUF_TYPE_NULL;
|
|
mbuf.flags = 0;
|
|
mbuf.status = MBUF_STATUS_NULL;
|
|
|
|
status = OSNICRecv(nicNo, &mbuf);
|
|
if (status != 0) {
|
|
printf("OSNICRecv failed!\n");
|
|
return;
|
|
}
|
|
|
|
if (mbuf.status == MBUF_STATUS_FAILED) {
|
|
printf("Failed to read packet!\n");
|
|
return;
|
|
}
|
|
|
|
dumpPacket();
|
|
}
|
|
|
|
int
|
|
main(int argc, const char *argv[])
|
|
{
|
|
uint64_t status;
|
|
NIC nic;
|
|
|
|
printf("Ethernet Dump Tool\n");
|
|
|
|
if (argc == 2) {
|
|
nicNo = atoi(argv[1]);
|
|
}
|
|
|
|
status = OSNICStat(nicNo, &nic);
|
|
if (status == ENOENT) {
|
|
printf("nic%d not present\n", nicNo);
|
|
return 1;
|
|
}
|
|
|
|
printf("Listening to nic%d\n", (int)nic.nicNo);
|
|
|
|
while (1) {
|
|
readPacket(&nic);
|
|
}
|
|
}
|
|
|