summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers')
-rw-r--r--src/drivers/net/network.c10
-rw-r--r--src/drivers/net/network.h6
-rw-r--r--src/drivers/net/rtl8139.c70
3 files changed, 19 insertions, 67 deletions
diff --git a/src/drivers/net/network.c b/src/drivers/net/network.c
index 85bfdf2..be8001d 100644
--- a/src/drivers/net/network.c
+++ b/src/drivers/net/network.c
@@ -32,13 +32,3 @@ void network_register_handler( void *obj, network_event_handler_t handler )
network->handler = handler;
}
-
-char *network_mac_to_string( network_mac_address_t mac, char *buf, size_t buflen )
-{
- snprintf( buf, buflen, "%X:%X:%X:%X:%X:%X",
- mac.byte[0], mac.byte[1], mac.byte[2],
- mac.byte[3], mac.byte[4], mac.byte[5] );
-
- return buf;
-}
-
diff --git a/src/drivers/net/network.h b/src/drivers/net/network.h
index a4ffca0..91dbf61 100644
--- a/src/drivers/net/network.h
+++ b/src/drivers/net/network.h
@@ -6,9 +6,7 @@
#include "stdint.h"
#include "stddef.h"
-typedef struct {
- uint8_t byte[6];
-} network_mac_address_t;
+#include "ethernet.h"
typedef struct {
uint16_t length;
@@ -32,6 +30,4 @@ void network_init( network_t *network, interrupt_t *interrupt, void *context );
void network_register_handler( void *obj, network_event_handler_t handler );
-char *network_mac_to_string( network_mac_address_t mac, char *buf, size_t buflen );
-
#endif // NETWORK_H
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 );