summaryrefslogtreecommitdiff
path: root/src/kernel/kernel.c
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-08-06 21:41:16 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-08-06 21:41:16 +0200
commitcb2acdaf3d1ee158f41a7e2617ebaaadfeef53da (patch)
tree65d1c197972f035be20f3b553c53fddeb5d82417 /src/kernel/kernel.c
parentc6e06f58e4d0b8bc40c8482728357cbd3be5d6b3 (diff)
downloadabaos-cb2acdaf3d1ee158f41a7e2617ebaaadfeef53da.tar.gz
abaos-cb2acdaf3d1ee158f41a7e2617ebaaadfeef53da.tar.bz2
some cleanup in ethernet constants
sending back an ARP packet rtl8139: started to implement write (work in progress)
Diffstat (limited to 'src/kernel/kernel.c')
-rw-r--r--src/kernel/kernel.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c
index 460cb74..0b10f45 100644
--- a/src/kernel/kernel.c
+++ b/src/kernel/kernel.c
@@ -456,7 +456,8 @@ void __stack_chk_fail( void )
void handle_network_event( network_event_t *event, void *context )
{
- network_ethernet_packet_t *packet = (network_ethernet_packet_t *)event->data;
+ network_ethernet_packet_t *packet = (network_ethernet_packet_t *)event->buf.data;
+ network_t *network = (network_t *)context;
char src_mac_addr[NETWORK_ETHERNET_MAC_ADDR_STRING];
char dst_mac_addr[NETWORK_ETHERNET_MAC_ADDR_STRING];
@@ -464,7 +465,7 @@ void handle_network_event( network_event_t *event, void *context )
network_mac_address_to_string( packet->header.dst_addr, dst_mac_addr, NETWORK_ETHERNET_MAC_ADDR_STRING );
printf( "NETWORK DATA: src: %s, dst: %s, len: %d, type: %X\n",
src_mac_addr, dst_mac_addr,
- event->length,
+ event->buf.length,
packet->header.type );
if( packet->header.type == NETWORK_ETHER_PROTOCOL_TYPE_ARP ) {
@@ -479,8 +480,19 @@ void handle_network_event( network_event_t *event, void *context )
printf( "ARP: hw src: %s, dst: %s, ip src: %s, dst: %s, oper: %d\n",
src_mac_addr, dst_mac_addr, src_ip, dst_ip, arp->operation );
+
+ // TODO: remember the address mapping
+
+ // send answer
+ packet->header.dst_addr = arp->source_hardware_address;
+ packet->header.src_addr = global_context.network->mac_address;
+ arp->operation = ARP_OPERATION_ANSWER;
+ arp->destination_hardware_address = arp->source_hardware_address;
+ arp->source_hardware_address = global_context.network->mac_address;
+
+ ((network_vtable_t *)( global_context.network->base.vtable ))->write( global_context.network, event->buf );
}
// we must free the data if we no longer need it
- free( event->data );
+ free( event->buf.data );
}