From 7d40548496f4d3cdfce828fc8e4f0fd4286e873a Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Wed, 2 Aug 2017 11:24:26 +0200 Subject: introduced a network library, added ethernet structure, moved generic stuff out of the network driver, kernel now sees ARP messages and prints src and dst MAC addresses --- src/drivers/net/rtl8139.c | 70 ++++++++++++----------------------------------- 1 file changed, 18 insertions(+), 52 deletions(-) (limited to 'src/drivers/net/rtl8139.c') diff --git a/src/drivers/net/rtl8139.c b/src/drivers/net/rtl8139.c index 08c2b1a..c119112 100644 --- a/src/drivers/net/rtl8139.c +++ b/src/drivers/net/rtl8139.c @@ -86,6 +86,8 @@ static rtl8139_vtable_t const rtl8139_vtable = { // header #define PACKET_HEADER_ROK 0x0001 +#define ETHERNET_MIN_FRAME_SIZE_IEEE_802_3 64 + // receive buffer, set to 8k + header (16) + wrap (2k) #define RECEIVE_BUFFER_SIZE 8192 #define RECEIVE_TOTAL_BUFFER_SIZE RECEIVE_BUFFER_SIZE + 16 + 2048 @@ -270,14 +272,21 @@ static void handle_receive_packet( rtl8139_t *rtl8139 ) for( int i = len; i < len + 4; i++ ) { printf( "%X ", rtl8139->receive_buffer[rtl8139->receive_buffer_pos+i] ); } + puts( "" ); #endif - // copy data for the handler of the network event network_event_t event; - event.length = len; - event.data = (uint8_t *)malloc( len ); - memcpy( event.data, buffer, len ); - memset( rtl8139->receive_buffer, 0, len + 2 * sizeof( uint16_t ) ); + + if( len >= ETHERNET_MIN_FRAME_SIZE_IEEE_802_3 ) { + // copy data for the handler of the network event + event.length = len; + event.data = (uint8_t *)malloc( len ); + memcpy( event.data, buffer, len ); + memset( rtl8139->receive_buffer, 0, len + 2 * sizeof( uint16_t ) ); + } else { + // make sure we don't have a runt package + puts( "rtl8139: too small frame seen. packet ignored." ); + } // adjust buffer pos rtl8139->receive_buffer_pos += 2 * sizeof( uint16_t ); @@ -292,53 +301,10 @@ static void handle_receive_packet( rtl8139_t *rtl8139 ) // documentation of the card!) port16_write( &rtl8139->CAPR_port, rtl8139->receive_buffer_pos - 16 ); - rtl8139->base.handler( &event, rtl8139 ); + if( len >= ETHERNET_MIN_FRAME_SIZE_IEEE_802_3 ) { + rtl8139->base.handler( &event, rtl8139 ); + } } - -#if 0 - - while (1) - { - netcard->rx_buffer_offset += 4; - - if (length >= sizeof(struct eth_packet_header)) - { - uint8_t data[length - 4]; - if ((netcard->rx_buffer_offset + length - 4) >= RX_BUFFER_SIZE) { - // FIXME Beim Umbruch gehen Daten kaputt - memcpy(data, buffer, RX_BUFFER_SIZE - netcard->rx_buffer_offset); - memcpy( - data + RX_BUFFER_SIZE - netcard->rx_buffer_offset, - netcard->rx_buffer, - (length - 4) - (RX_BUFFER_SIZE - netcard->rx_buffer_offset) - ); - } else { - memcpy(data, buffer, length - 4); - } - - cdi_net_receive( - (struct cdi_net_device*) netcard, - data, - length - 4); - } - --- - - // Den aktuellen Offset im Lesepuffer anpassen. Jedes Paket ist - // dword-aligned, daher anschließend Aufrundung. - netcard->rx_buffer_offset += length + 4; - netcard->rx_buffer_offset = (netcard->rx_buffer_offset + 3) & ~0x3; - - // Überläufe abfangen - netcard->rx_buffer_offset %= 0x2000; - - write_register_word(netcard, REG_CUR_READ_ADDR, - netcard->rx_buffer_offset - 0x10); - - - - } -#endif } uint32_t rtl8139_handle_interrupt( interrupt_handler_t *handler, uint32_t esp ) @@ -377,7 +343,7 @@ void rtl8139_print_info( void *obj ) { rtl8139_t *rtl8139 = (rtl8139_t *)obj; - char buf[20]; + char buf[NETWORK_ETHERNET_MAC_ADDR_STRING]; char buf2[30]; if( rtl8139->model == NULL ) { snprintf( buf2, 30, "unknown submodel 0x%X", rtl8139->model_id ); -- cgit v1.2.3-54-g00ecf