X-Git-Url: http://git.joshuawise.com/netwatch.git/blobdiff_plain/50d89a314a394e5427d0791a08ffc3a3b79b6670..d9de6545faee2e375a98f43e373dda9f3418b14b:/net/net.c?ds=inline diff --git a/net/net.c b/net/net.c index 7312fde..e1c7444 100644 --- a/net/net.c +++ b/net/net.c @@ -4,7 +4,9 @@ #include #include #include +#include #include "net.h" +#include "../aseg/keyboard.h" static struct nic *_nic = 0x0; @@ -18,6 +20,8 @@ typedef struct packet_t { char from[6]; char to[6]; unsigned short ethertype; + unsigned short datalen; + unsigned char command; char data[]; } packet_t; @@ -33,6 +37,20 @@ static unsigned int vga_base() + (((unsigned int) vga_read(CRTC_START_ADDR_LSB_IDX)) << 1); } +void handle_command(packet_t * p) +{ + uint16_t dl = htons(p->datalen); + int i; + + outputf("NIC: Command: 0x%x, %d bytes", p->command, dl); + + if (p->command == 0x42) + { + for (i = 0; i < dl; i++) + kbd_inject_key(p->data[i]); + } +} + void eth_poll() { int i; @@ -51,9 +69,13 @@ void eth_poll() packet_t * p = (packet_t *) packet; - outputf("NIC: Packet: %d 0x%x", _nic->packetlen, p->ethertype); - if (p->ethertype == 0x3813) { - outputf("NIC: Command: 0x%x", *((uint16_t *)p->data)); + outputf("NIC: Packet: %d 0x%x", _nic->packetlen, htons(p->ethertype)); + if (htons(p->ethertype) == 0x1338) { + if (htons(p->datalen) + sizeof(packet_t) > _nic->packetlen) { + outputf("NIC: Malformed packet"); + } else { + handle_command(p); + } } } smram_tseg_set_state(SMRAM_TSEG_OPEN);