diff options
Diffstat (limited to 'kernel/network/arp.c')
-rw-r--r-- | kernel/network/arp.c | 68 |
1 files changed, 34 insertions, 34 deletions
diff --git a/kernel/network/arp.c b/kernel/network/arp.c index 179f6c1..ddeb553 100644 --- a/kernel/network/arp.c +++ b/kernel/network/arp.c @@ -7,29 +7,29 @@ #include <string.h> struct ARP_DATA { - uint16_t htype; // Hardware type - uint16_t ptype; // Protocol type - uint8_t hlen; // Hardware address length (Ethernet = 6) - uint8_t plen; // Protocol address length (IPv4 = 4) - uint16_t opcode; // ARP Operation Code - uint8_t srchw[6]; // Source hardware address - hlen bytes (see above) - uint8_t srcpr[4]; // Source protocol address - plen bytes (see above). + u16 htype; // Hardware type + u16 ptype; // Protocol type + u8 hlen; // Hardware address length (Ethernet = 6) + u8 plen; // Protocol address length (IPv4 = 4) + u16 opcode; // ARP Operation Code + u8 srchw[6]; // Source hardware address - hlen bytes (see above) + u8 srcpr[4]; // Source protocol address - plen bytes (see above). // If IPv4 can just be a "u32" type. - uint8_t dsthw[6]; // Destination hardware address - hlen bytes (see above) - uint8_t dstpr[4]; // Destination protocol address - plen bytes (see + u8 dsthw[6]; // Destination hardware address - hlen bytes (see above) + u8 dstpr[4]; // Destination protocol address - plen bytes (see // above). If IPv4 can just be a "u32" type. }; struct ARP_TABLE_ENTRY { - uint8_t is_used; - uint8_t mac[6]; - uint8_t ip[4]; + u8 is_used; + u8 mac[6]; + u8 ip[4]; }; struct ARP_TABLE_ENTRY arp_table[10] = {0}; // FIXME: This is hardcoded, don't do this. -uint8_t ip_address[4] = {10, 0, 2, 15}; +u8 ip_address[4] = {10, 0, 2, 15}; struct ARP_TABLE_ENTRY *find_arp_entry_to_use(void) { // This does not need to find a "free" entry as a ARP table is @@ -42,7 +42,7 @@ struct ARP_TABLE_ENTRY *find_arp_entry_to_use(void) { return &arp_table[0]; } -void print_mac(const char *str, uint8_t *mac) { +void print_mac(const char *str, u8 *mac) { kprintf("%s: ", str); for (int i = 0; i < 6; i++) { kprintf("%x", mac[i]); @@ -52,7 +52,7 @@ void print_mac(const char *str, uint8_t *mac) { kprintf("\n"); } -void print_ip(const char *str, const uint8_t *ip) { +void print_ip(const char *str, const u8 *ip) { kprintf("%s: ", str); for (int i = 0; i < 4; i++) { kprintf("%d", ip[i]); @@ -62,7 +62,7 @@ void print_ip(const char *str, const uint8_t *ip) { kprintf("\n"); } -void send_arp_request(const uint8_t ip[4]) { +void send_arp_request(const u8 ip[4]) { struct ARP_DATA data; data.htype = htons(1); data.ptype = htons(0x0800); @@ -72,37 +72,37 @@ void send_arp_request(const uint8_t ip[4]) { data.opcode = htons(0x0001); get_mac_address(data.srchw); - memcpy(data.srcpr, ip_address, sizeof(uint8_t[4])); + memcpy(data.srcpr, ip_address, sizeof(u8[4])); - memset(data.dsthw, 0, sizeof(uint8_t[6])); - memcpy(data.dstpr, ip, sizeof(uint8_t[4])); + memset(data.dsthw, 0, sizeof(u8[6])); + memcpy(data.dstpr, ip, sizeof(u8[4])); - uint8_t broadcast[6]; + u8 broadcast[6]; memset(broadcast, 0xFF, sizeof(broadcast)); - send_ethernet_packet(broadcast, 0x0806, (uint8_t *)&data, sizeof(data)); + send_ethernet_packet(broadcast, 0x0806, (u8 *)&data, sizeof(data)); } -int get_mac_from_ip(const uint8_t ip[4], uint8_t mac[6]) { +int get_mac_from_ip(const u8 ip[4], u8 mac[6]) { print_ip("ARP GETTING MAC FROM IP: ", ip); for (int i = 0; i < 10; i++) { - if (0 != memcmp(arp_table[i].ip, ip, sizeof(uint8_t[4]))) + if (0 != memcmp(arp_table[i].ip, ip, sizeof(u8[4]))) continue; - memcpy(mac, arp_table[i].mac, sizeof(uint8_t[6])); + memcpy(mac, arp_table[i].mac, sizeof(u8[6])); return 1; } klog("ARP cache miss", LOG_NOTE); send_arp_request(ip); // TODO: Maybe wait a bit? for (int i = 0; i < 10; i++) { - if (0 != memcmp(arp_table[i].ip, ip, sizeof(uint8_t[4]))) + if (0 != memcmp(arp_table[i].ip, ip, sizeof(u8[4]))) continue; - memcpy(mac, arp_table[i].mac, sizeof(uint8_t[6])); + memcpy(mac, arp_table[i].mac, sizeof(u8[6])); return 1; } return 0; } -void handle_arp(const uint8_t *payload) { +void handle_arp(const u8 *payload) { struct ARP_DATA *data = (struct ARP_DATA *)payload; // Assert that communication is over ethernet @@ -120,7 +120,7 @@ void handle_arp(const uint8_t *payload) { print_mac("dsthw: ", data->dsthw); print_ip("dstpr: ", data->dstpr); - assert(0 == memcmp(data->dstpr, ip_address, sizeof(uint8_t[4]))); + assert(0 == memcmp(data->dstpr, ip_address, sizeof(u8[4]))); // Now we have to construct a ARP response struct ARP_DATA response; @@ -130,19 +130,19 @@ void handle_arp(const uint8_t *payload) { response.hlen = 6; response.plen = 4; get_mac_address(response.srchw); - memcpy(response.srcpr, ip_address, sizeof(uint8_t[4])); + memcpy(response.srcpr, ip_address, sizeof(u8[4])); - memcpy(response.dsthw, data->srchw, sizeof(uint8_t[6])); - memcpy(response.dstpr, data->srcpr, sizeof(uint8_t[4])); + memcpy(response.dsthw, data->srchw, sizeof(u8[6])); + memcpy(response.dstpr, data->srcpr, sizeof(u8[4])); - send_ethernet_packet(data->srchw, 0x0806, (uint8_t *)&response, + send_ethernet_packet(data->srchw, 0x0806, (u8 *)&response, sizeof(response)); } else if (0x0002 /*arp_response*/ == ntohs(data->opcode)) { // Find a entry to fill struct ARP_TABLE_ENTRY *entry = find_arp_entry_to_use(); entry->is_used = 1; - memcpy(entry->mac, data->srchw, sizeof(uint8_t[6])); - memcpy(entry->ip, data->srcpr, sizeof(uint8_t[4])); + memcpy(entry->mac, data->srchw, sizeof(u8[6])); + memcpy(entry->ip, data->srcpr, sizeof(u8[4])); print_ip("Added ip: ", entry->ip); } else { kprintf("GOT A ARP REQEUST WITH TYPE: %x\n", ntohs(data->opcode)); |