5 #include "net/endianess.h"
6 #include "lib/string.h"
8 #include "net/ethernet.h"
10 uint8_t default_broadcast_mac_address[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
13 size_t arp_table_curr = 0;
23 qemu_warn(
"ARP REQUEST");
25 if(
memcmp((
const char*)
arp_packet->dest_ip, (
const char*)card->ipv4_addr, 4) != 0) {
46 arp_packet->hardware_type = htons(HARDWARE_TYPE_ETHERNET);
49 arp_packet->protocol = htons(ETHERNET_TYPE_IPV4);
52 ethernet_send_packet(card, dest_mac, (uint8_t*)
arp_packet,
sizeof(arp_packet_t), ETHERNET_TYPE_ARP);
54 }
else if(ntohs(
arp_packet->opcode) == ARP_REPLY){
55 qemu_log(
"ARP REPLY");
58 qemu_log(
"Source MAC: %x:%x:%x:%x:%x:%x",
65 qemu_log(
"Destination IP: %d.%d.%d.%d",
70 qemu_log(
"Destination MAC: %x:%x:%x:%x:%x:%x",
78 qemu_log(
"Got unknown ARP opcode (%d)",
arp_packet->opcode);
83 arp_lookup_add(dest_mac, dest_ip);
87 void arp_send_packet(
netcard_entry_t* card, uint8_t* dest_mac, uint8_t* dest_ip) {
88 arp_packet_t*
arp_packet = kcalloc(
sizeof(arp_packet_t), 1);
109 arp_packet->hardware_type = htons(HARDWARE_TYPE_ETHERNET);
112 arp_packet->protocol = htons(ETHERNET_TYPE_IPV4);
115 ethernet_send_packet(
117 default_broadcast_mac_address,
119 sizeof(arp_packet_t),
123 void arp_lookup_add(uint8_t* ret_hardware_addr, uint8_t * ip_addr) {
124 qemu_note(
"lookup add: [%x:%x:%x:%x:%x:%x] is [%d.%d.%d.%d]",
125 ret_hardware_addr[0],
126 ret_hardware_addr[1],
127 ret_hardware_addr[2],
128 ret_hardware_addr[3],
129 ret_hardware_addr[4],
130 ret_hardware_addr[5],
136 memcpy(&arp_table[arp_table_curr].ip_addr, ip_addr, 4);
137 memcpy(&arp_table[arp_table_curr].mac_addr, ret_hardware_addr, 6);
139 if(arp_table_curr < ARP_TABLE_MAX_SIZE) {
143 if(arp_table_curr >= ARP_TABLE_MAX_SIZE) {
148 bool arp_lookup(uint8_t* ret_hardware_addr,
const uint8_t* ip_addr) {
149 uint32_t ip_entry = *((uint32_t*)(ip_addr));
151 qemu_log(
"Looking up: %d.%d.%d.%d", ip_addr[0], ip_addr[1], ip_addr[2], ip_addr[3]);
153 for(
int i = 0; i < ARP_TABLE_MAX_SIZE; i++) {
154 if(arp_table[i].ip_addr == ip_entry) {
155 memcpy(ret_hardware_addr, arp_table[i].mac_addr, 6);
156 qemu_ok(
"Found %x:%x:%x:%x:%x:%x!",
157 arp_table[i].mac_addr[0],
158 arp_table[i].mac_addr[1],
159 arp_table[i].mac_addr[2],
160 arp_table[i].mac_addr[3],
161 arp_table[i].mac_addr[4],
162 arp_table[i].mac_addr[5]);
173 uint8_t broadcast_ip[4];
174 uint8_t broadcast_mac[6];
176 memset(broadcast_ip, 0xff, 4);
177 memset(broadcast_mac, 0xff, 6);
179 arp_lookup_add(broadcast_mac, broadcast_ip);
Основные определения ядра
void * memset(void *ptr, char value, size_t num)
Заполнение массива указанными символами
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
int32_t memcmp(const char *s1, const char *s2, size_t n)
Сравнение массивов