diff --git a/CMakeLists.txt b/CMakeLists.txt index a93657982..c382b6656 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,7 @@ set(FREERTOS_PLUS_TCP_NETWORK_IF_LIST DRIVER_SAM ESP32 KSZ8851SNL + LIBSLIRP LPC17xx LPC18xx LPC54018 M487 MPS2_AN385 @@ -96,6 +97,7 @@ if(NOT FREERTOS_PLUS_TCP_NETWORK_IF IN_LIST FREERTOS_PLUS_TCP_NETWORK_IF_LIST ) " DRIVER_SAM Target: Driver SAM Tested: TODO\n" " ESP32 Target: ESP-32 Tested: TODO\n" " KSZ8851SNL Target: ksz8851snl Tested: TODO\n" + " LIBSLIRP Target: libslirp Tested: TODO\n" " POSIX Target: linux/Posix\n" " LPC17xx Target: LPC17xx Tested: TODO\n" " LPC18xx Target: LPC18xx Tested: TODO\n" diff --git a/source/portable/NetworkInterface/DriverSAM/NetworkInterface.c b/source/portable/NetworkInterface/DriverSAM/NetworkInterface.c index df24e1779..de514694d 100644 --- a/source/portable/NetworkInterface/DriverSAM/NetworkInterface.c +++ b/source/portable/NetworkInterface/DriverSAM/NetworkInterface.c @@ -728,11 +728,10 @@ static BaseType_t prvGMACInit( NetworkInterface_t * pxInterface ) GMAC->GMAC_NCR |= GMAC_NCR_MPE; memset( &gmac_option, '\0', sizeof( gmac_option ) ); - gmac_option.uc_copy_all_frame = 0; - gmac_option.uc_no_boardcast = 0; - memcpy( gmac_option.uc_mac_addr, - pxEndPoint->xMACAddress.ucBytes, - sizeof( gmac_option.uc_mac_addr ) ); + /* Note that 'gmac_option.uc_copy_all_frame' is false, do not copy all frames. + * And 'gmac_option.uc_no_boardcast' is false, meaning that broadcast is received. + * 'boardcast' is a typo. */ + memcpy( gmac_option.uc_mac_addr, pxEndPoint->xMACAddress.ucBytes, sizeof( gmac_option.uc_mac_addr ) ); gs_gmac_dev.p_hw = GMAC; gmac_dev_init( GMAC, &gs_gmac_dev, &gmac_option ); @@ -740,7 +739,8 @@ static BaseType_t prvGMACInit( NetworkInterface_t * pxInterface ) NVIC_SetPriority( GMAC_IRQn, configMAC_INTERRUPT_PRIORITY ); NVIC_EnableIRQ( GMAC_IRQn ); - /* Clear the hash table for multicast MAC addresses. */ + /* Clear the hash table for multicast MAC addresses. + * OR set both to ~0H to receive all multicast packets. */ GMAC->GMAC_HRB = 0U; /* Hash Register Bottom. */ GMAC->GMAC_HRT = 0U; /* Hash Register Top. */ @@ -1097,8 +1097,8 @@ static uint32_t prvEMACRxPoll( void ) if( xSendEventStructToIPTask( &xRxEvent, xBlockTime ) != pdTRUE ) { - /* xSendEventStructToIPTask() timed out. Release the descriptor. - */ + /* xSendEventStructToIPTask() timed out. Release the descriptor. */ + FreeRTOS_printf( ( "prvEMACRxPoll: Can not queue a packet!\n" ) ); xRelease = pdTRUE; } } @@ -1110,8 +1110,6 @@ static uint32_t prvEMACRxPoll( void ) * again. */ vReleaseNetworkBufferAndDescriptor( pxNextNetworkBufferDescriptor ); iptraceETHERNET_RX_EVENT_LOST(); - FreeRTOS_printf( - ( "prvEMACRxPoll: Can not queue return packet!\n" ) ); } /* Now the buffer has either been passed to the IP-task, diff --git a/source/portable/NetworkInterface/DriverSAM/gmac_SAM.c b/source/portable/NetworkInterface/DriverSAM/gmac_SAM.c index 501c84b23..58fccf9c1 100644 --- a/source/portable/NetworkInterface/DriverSAM/gmac_SAM.c +++ b/source/portable/NetworkInterface/DriverSAM/gmac_SAM.c @@ -641,31 +641,40 @@ uint32_t gmac_dev_read( gmac_device_t * p_gmac_dev, return GMAC_RX_NO_DATA; } + /* Return the number of bytes received. */ + *p_rcv_size = bytesLeft; + /* gmac_dev_poll has confirmed that there is a complete frame at * the current position 'ul_rx_idx' */ nextIdx = p_gmac_dev->ul_rx_idx; - - /* Read +2 bytes because buffers are aligned at -2 bytes */ - bytesLeft = min( bytesLeft + 2, ( int32_t ) ul_frame_size ); - -#if( NETWORK_BUFFERS_CACHED != 0 ) && ( __DCACHE_PRESENT != 0 ) && \ - defined( CONF_BOARD_ENABLE_CACHE ) - SCB_InvalidateDCache(); -#endif + + #if ( NETWORK_BUFFERS_CACHED != 0 ) && ( __DCACHE_PRESENT != 0 ) && defined( CONF_BOARD_ENABLE_CACHE ) + SCB_InvalidateDCache(); + #endif #if( ipconfigZERO_COPY_RX_DRIVER == 0 ) { /* The frame will be copied in 1 or 2 memcpy's */ if( ( p_frame != NULL ) && ( bytesLeft != 0 ) ) { - const uint8_t * source; - int32_t left; - int32_t toCopy; + /* The frame will be copied in 1 or 2 memcpy's */ + if( p_frame != NULL ) + { + const uint8_t * source; + int32_t left; + int32_t toCopy; + + source = gs_uc_rx_buffer + nextIdx * GMAC_RX_UNITSIZE; + + /* The driver receives frames up to 1514 bytes long. + * The actual value of ul_frame_size is 1536, so the + * following test is not really necessary: + */ - source = gs_uc_rx_buffer + nextIdx * GMAC_RX_UNITSIZE; - left = bytesLeft; - toCopy = ( GMAC_RX_BUFFERS - nextIdx ) * GMAC_RX_UNITSIZE; + /* Read +2 bytes because buffers are aligned at -2 bytes */ + left = min( bytesLeft + 2, ( int32_t ) ul_frame_size ); + toCopy = ( GMAC_RX_BUFFERS - nextIdx ) * GMAC_RX_UNITSIZE; if( toCopy > left ) { @@ -717,8 +726,6 @@ uint32_t gmac_dev_read( gmac_device_t * p_gmac_dev, p_gmac_dev->ul_rx_idx = nextIdx; - *p_rcv_size = bytesLeft; - return GMAC_OK; } diff --git a/source/portable/NetworkInterface/NXP1060/NetworkInterface.c b/source/portable/NetworkInterface/NXP1060/NetworkInterface.c index bb8a2c835..6fbca1113 100644 --- a/source/portable/NetworkInterface/NXP1060/NetworkInterface.c +++ b/source/portable/NetworkInterface/NXP1060/NetworkInterface.c @@ -380,6 +380,11 @@ static BaseType_t prvNXP1060_NetworkInterfaceInitialise( if( xStatus != kStatus_Success ) { + if( !xFirstCall ) + { + xTaskNotify( receiveTaskHandle, DRIVER_READY, eSetValueWithOverwrite ); + } + break; } else @@ -404,7 +409,7 @@ static BaseType_t prvNXP1060_NetworkInterfaceInitialise( xTaskCreated = xTaskCreate( prvEMACHandlerTask, "EMAC-Handler", configMINIMAL_STACK_SIZE * 3, - NULL, + pxInterface, configMAX_PRIORITIES - 1, &receiveTaskHandle ); @@ -545,10 +550,7 @@ static void prvEMACHandlerTask( void * parameter ) if( ulTaskNotifyTake( pdTRUE, pdMS_TO_TICKS( 500 ) ) == pdFALSE ) { /* No RX packets for a bit so check for a link. */ - const IPStackEvent_t xNetworkEventDown = { - .eEventType = eNetworkDownEvent, - .pvData = NULL - }; + const IPStackEvent_t xNetworkEventDown = { .eEventType = eNetworkDownEvent, .pvData = parameter }; do { @@ -616,21 +618,14 @@ static void prvEMACHandlerTask( void * parameter ) receiving = pdFALSE; break; - case kStatus_ENET_RxFrameError: /* Received an error frame. - Read & drop it */ - PRINTF( "RX Receive Error\n" ); - ENET_ReadFrame( ethernetifLocal->base, - &( ethernetifLocal->handle ), - NULL, - 0, - 0, - NULL ); - /* Not sure if a trace is required. The MAC had an - * error and needed to dump bytes */ + case kStatus_ENET_RxFrameError: /* Received an error frame. Read & drop it */ + FreeRTOS_printf( ( "RX Receive Error\n" ) ); + ENET_ReadFrame( ethernetifLocal->base, &( ethernetifLocal->handle ), NULL, 0, 0, NULL ); + /* Not sure if a trace is required. The MAC had an error and needed to dump bytes */ break; default: - PRINTF( "RX Receive default" ); + FreeRTOS_printf( ( "RX Receive default" ) ); break; } }