mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-09-04 05:13:51 -04:00
Sync FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP with the version in GitHub at (23665258cabe49d5d68ba23968b6845a7c80eb34).
Notes: - header has version 2.2.0. - This sync did not bring in ./test directory, though we should. - New NetworkInterfaces are introduced by this merge. - Keil compiler support. - FreeRTOS_IP.h new API xApplicationGetRandomNumber(). - FreeRTOS_IP_Private.h new eIPEvent_t eNetworkTxEvent. - FreeRTOS_Stream_Buffer.h removing static xStreamBufferIsEmpty() and xStreamBufferIsFull(). - FreeRTOSConfigDefaults.h provides default ipconfigDNS_RECEIVE_BLOCK_TIME_TICKS. - other type changes.
This commit is contained in:
parent
0c1c85a9dd
commit
ec6f3d77c3
54 changed files with 5688 additions and 1701 deletions
|
@ -0,0 +1,193 @@
|
|||
// Copyright 2018 Espressif Systems (Shanghai) PTE LTD
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
/* Standard includes. */
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* FreeRTOS includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
#include "queue.h"
|
||||
#include "semphr.h"
|
||||
|
||||
/* FreeRTOS+TCP includes. */
|
||||
#include "FreeRTOS_IP.h"
|
||||
#include "FreeRTOS_Sockets.h"
|
||||
#include "FreeRTOS_IP_Private.h"
|
||||
#include "FreeRTOS_DNS.h"
|
||||
#include "NetworkBufferManagement.h"
|
||||
#include "NetworkInterface.h"
|
||||
|
||||
#include "esp_log.h"
|
||||
#include "esp_wifi.h"
|
||||
#include "esp_wifi_internal.h"
|
||||
#include "tcpip_adapter.h"
|
||||
|
||||
enum if_state_t {
|
||||
INTERFACE_DOWN = 0,
|
||||
INTERFACE_UP,
|
||||
};
|
||||
|
||||
static const char *TAG = "NetInterface";
|
||||
volatile static uint32_t xInterfaceState = INTERFACE_DOWN;
|
||||
|
||||
#if ( ipconfigHAS_PRINTF != 0 )
|
||||
static void prvMonitorResources();
|
||||
#endif
|
||||
|
||||
BaseType_t xNetworkInterfaceInitialise( void )
|
||||
{
|
||||
static BaseType_t xMACAdrInitialized = pdFALSE;
|
||||
uint8_t ucMACAddress[ ipMAC_ADDRESS_LENGTH_BYTES ];
|
||||
|
||||
if (xInterfaceState == INTERFACE_UP) {
|
||||
if (xMACAdrInitialized == pdFALSE) {
|
||||
esp_wifi_get_mac(ESP_IF_WIFI_STA, ucMACAddress);
|
||||
FreeRTOS_UpdateMACAddress(ucMACAddress);
|
||||
xMACAdrInitialized = pdTRUE;
|
||||
}
|
||||
return pdTRUE;
|
||||
}
|
||||
return pdFALSE;
|
||||
}
|
||||
|
||||
BaseType_t xNetworkInterfaceOutput( NetworkBufferDescriptor_t *const pxNetworkBuffer, BaseType_t xReleaseAfterSend )
|
||||
{
|
||||
if (pxNetworkBuffer == NULL || pxNetworkBuffer->pucEthernetBuffer == NULL || pxNetworkBuffer->xDataLength == 0) {
|
||||
ESP_LOGE(TAG, "Invalid params");
|
||||
return pdFALSE;
|
||||
}
|
||||
|
||||
esp_err_t ret;
|
||||
if (xInterfaceState == INTERFACE_DOWN) {
|
||||
ESP_LOGD(TAG, "Interface down");
|
||||
ret = ESP_FAIL;
|
||||
} else {
|
||||
ret = esp_wifi_internal_tx(ESP_IF_WIFI_STA, pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength);
|
||||
if (ret != ESP_OK) {
|
||||
ESP_LOGE(TAG, "Failed to tx buffer %p, len %d, err %d", pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, ret);
|
||||
}
|
||||
}
|
||||
|
||||
#if ( ipconfigHAS_PRINTF != 0 )
|
||||
prvMonitorResources();
|
||||
#endif
|
||||
if (xReleaseAfterSend == pdTRUE) {
|
||||
vReleaseNetworkBufferAndDescriptor(pxNetworkBuffer);
|
||||
}
|
||||
|
||||
return ret == ESP_OK ? pdTRUE : pdFALSE;
|
||||
}
|
||||
|
||||
void vNetworkNotifyIFDown()
|
||||
{
|
||||
IPStackEvent_t xRxEvent = { eNetworkDownEvent, NULL };
|
||||
if (xInterfaceState != INTERFACE_DOWN) {
|
||||
xInterfaceState = INTERFACE_DOWN;
|
||||
xSendEventStructToIPTask( &xRxEvent, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
void vNetworkNotifyIFUp()
|
||||
{
|
||||
xInterfaceState = INTERFACE_UP;
|
||||
}
|
||||
|
||||
esp_err_t wlanif_input(void *netif, void *buffer, uint16_t len, void *eb)
|
||||
{
|
||||
NetworkBufferDescriptor_t *pxNetworkBuffer;
|
||||
IPStackEvent_t xRxEvent = { eNetworkRxEvent, NULL };
|
||||
const TickType_t xDescriptorWaitTime = pdMS_TO_TICKS( 250 );
|
||||
|
||||
#if ( ipconfigHAS_PRINTF != 0 )
|
||||
prvMonitorResources();
|
||||
#endif
|
||||
|
||||
if( eConsiderFrameForProcessing( buffer ) != eProcessBuffer ) {
|
||||
ESP_LOGD(TAG, "Dropping packet");
|
||||
esp_wifi_internal_free_rx_buffer(eb);
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
pxNetworkBuffer = pxGetNetworkBufferWithDescriptor(len, xDescriptorWaitTime);
|
||||
if (pxNetworkBuffer != NULL) {
|
||||
|
||||
/* Set the packet size, in case a larger buffer was returned. */
|
||||
pxNetworkBuffer->xDataLength = len;
|
||||
|
||||
/* Copy the packet data. */
|
||||
memcpy(pxNetworkBuffer->pucEthernetBuffer, buffer, len);
|
||||
xRxEvent.pvData = (void *) pxNetworkBuffer;
|
||||
|
||||
if ( xSendEventStructToIPTask( &xRxEvent, xDescriptorWaitTime) == pdFAIL ) {
|
||||
ESP_LOGE(TAG, "Failed to enqueue packet to network stack %p, len %d", buffer, len);
|
||||
vReleaseNetworkBufferAndDescriptor(pxNetworkBuffer);
|
||||
return ESP_FAIL;
|
||||
}
|
||||
esp_wifi_internal_free_rx_buffer(eb);
|
||||
return ESP_OK;
|
||||
} else {
|
||||
ESP_LOGE(TAG, "Failed to get buffer descriptor");
|
||||
return ESP_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
#if ( ipconfigHAS_PRINTF != 0 )
|
||||
static void prvMonitorResources()
|
||||
{
|
||||
static UBaseType_t uxLastMinBufferCount = 0u;
|
||||
static UBaseType_t uxCurrentBufferCount = 0u;
|
||||
static size_t uxMinLastSize = 0uL;
|
||||
size_t uxMinSize;
|
||||
|
||||
uxCurrentBufferCount = uxGetMinimumFreeNetworkBuffers();
|
||||
|
||||
if( uxLastMinBufferCount != uxCurrentBufferCount )
|
||||
{
|
||||
/* The logging produced below may be helpful
|
||||
* while tuning +TCP: see how many buffers are in use. */
|
||||
uxLastMinBufferCount = uxCurrentBufferCount;
|
||||
FreeRTOS_printf( ( "Network buffers: %lu lowest %lu\n",
|
||||
uxGetNumberOfFreeNetworkBuffers(), uxCurrentBufferCount ) );
|
||||
}
|
||||
|
||||
uxMinSize = xPortGetMinimumEverFreeHeapSize();
|
||||
|
||||
if( uxMinLastSize != uxMinSize )
|
||||
{
|
||||
uxMinLastSize = uxMinSize;
|
||||
FreeRTOS_printf( ( "Heap: current %lu lowest %lu\n", xPortGetFreeHeapSize(), uxMinSize ) );
|
||||
}
|
||||
|
||||
#if ( ipconfigCHECK_IP_QUEUE_SPACE != 0 )
|
||||
{
|
||||
static UBaseType_t uxLastMinQueueSpace = 0;
|
||||
UBaseType_t uxCurrentCount = 0u;
|
||||
|
||||
uxCurrentCount = uxGetMinimumIPQueueSpace();
|
||||
|
||||
if( uxLastMinQueueSpace != uxCurrentCount )
|
||||
{
|
||||
/* The logging produced below may be helpful
|
||||
* while tuning +TCP: see how many buffers are in use. */
|
||||
uxLastMinQueueSpace = uxCurrentCount;
|
||||
FreeRTOS_printf( ( "Queue space: lowest %lu\n", uxCurrentCount ) );
|
||||
}
|
||||
}
|
||||
#endif /* ipconfigCHECK_IP_QUEUE_SPACE */
|
||||
}
|
||||
#endif /* ( ipconfigHAS_PRINTF != 0 ) */
|
||||
/*-----------------------------------------------------------*/
|
Loading…
Add table
Add a link
Reference in a new issue