diff --git a/kernel-src/include/kernel/eth.h b/kernel-src/include/kernel/eth.h index ed33dad7..1a5bb0bb 100644 --- a/kernel-src/include/kernel/eth.h +++ b/kernel-src/include/kernel/eth.h @@ -2,6 +2,7 @@ #define _ETH_H #include +#include typedef struct { uint8_t destination[6]; @@ -12,4 +13,6 @@ typedef struct { #define ETH_PROTO_IP 0x0800 #define ETH_PROTO_ARP 0x0806 +void eth_process(netdev_t *netdev, void *buffer); + #endif diff --git a/kernel-src/include/kernel/net.h b/kernel-src/include/kernel/net.h index 7491009c..72e33c67 100644 --- a/kernel-src/include/kernel/net.h +++ b/kernel-src/include/kernel/net.h @@ -4,7 +4,10 @@ #include #include -#include +#include +#include +#include +#include typedef struct { void *address; @@ -19,22 +22,11 @@ typedef struct { typedef struct netdev_t { mac_t mac; size_t mtu; + hashtable_t arpcache; int (*allocdesc)(size_t requestedsize, netdesc_t *desc); int (*sendpacket)(struct netdev_t *_internal, netdesc_t desc, mac_t targetmac, int proto); } netdev_t; -typedef struct { - uint16_t hwtype; - uint16_t protocoltype; - uint8_t hwlen; - uint8_t ptlen; - uint16_t opcode; - uint8_t srchw[6]; - uint8_t srcpt[4]; - uint8_t dsthw[6]; - uint8_t dstpt[4]; -} __attribute__((packed)) arpframe_t; - typedef struct { uint8_t version_length; uint8_t servicetype_ecn; @@ -55,10 +47,20 @@ typedef struct { uint16_t checksum; } __attribute__((packed)) udpframe_t; +typedef struct { + uint16_t port; + uint32_t addr; +} ipv4addr_t; + #define NET_BROADCAST_MAC (mac_t){.address = {0xff,0xff,0xff,0xff,0xff,0xff}} +#define MAC_EQUAL(m1,m2) (memcmp(m1, m2, sizeof(mac_t)) == 0) + #define IPV4_PROTO_UDP 0x11 +void arp_init(); +void udp_init(); +void arp_process(netdev_t *netdev, void *buffer); int udp_allocdesc(netdev_t *netdev, size_t requestedsize, netdesc_t *desc); int udp_sendpacket(netdev_t *netdev, netdesc_t desc, uint32_t ip, uint16_t srcport, uint16_t dstport); int ipv4_allocdesc(netdev_t *netdev, size_t requestedsize, netdesc_t *desc); diff --git a/kernel-src/io/net/eth.c b/kernel-src/io/net/eth.c new file mode 100644 index 00000000..d0a62a06 --- /dev/null +++ b/kernel-src/io/net/eth.c @@ -0,0 +1,29 @@ +#include +#include +#include + +// runs on dpc context, called by the individual driver dpcs on a receive. +void eth_process(netdev_t *netdev, void *buffer) { + ethframe_t *frame = buffer; + + mac_t dst, src; + memcpy(&dst, &frame->destination, sizeof(mac_t)); + memcpy(&src, &frame->source, sizeof(mac_t)); + + mac_t broadcast = NET_BROADCAST_MAC; + // check if packet is for our machine or a broadcast. if neither, do nothing + if (!(MAC_EQUAL(&dst, &netdev->mac) || MAC_EQUAL(&dst, &broadcast))) + return; + + printf("our machine!\n"); + + void *nextbuff = (void *)((uintptr_t)buffer + sizeof(ethframe_t)); + + switch (be_to_cpu_w(frame->type)) { + case ETH_PROTO_IP: + break; + case ETH_PROTO_ARP: + arp_process(netdev, nextbuff); + break; + } +} diff --git a/kernel-src/io/net/ipv4.c b/kernel-src/io/net/ipv4.c index bcf378d8..bababf90 100644 --- a/kernel-src/io/net/ipv4.c +++ b/kernel-src/io/net/ipv4.c @@ -1,4 +1,5 @@ #include +#include #include #include