summaryrefslogtreecommitdiff
path: root/src/drivers/net/rtl8139.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/net/rtl8139.c')
-rw-r--r--src/drivers/net/rtl8139.c70
1 files changed, 18 insertions, 52 deletions
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 );