1
0
mirror of https://github.com/FreeRTOS/FreeRTOS-Plus-TCP synced 2025-10-23 01:18:54 +08:00

Update IPv6 UDP endpoint selection (#853)

* use matching endpoint instead of first endpoint

* update with @htibosch  latest changes

* fix formatting

* fix misra and spellings

* code clean up
This commit is contained in:
Tony Josi
2023-05-02 04:08:00 +00:00
committed by GitHub
parent af710fafbd
commit 8fa0d6b86d
2 changed files with 27 additions and 16 deletions

1
.github/lexicon.txt vendored
View File

@@ -1829,6 +1829,7 @@ xipversion
xisbound xisbound
xiscallingfromiptask xiscallingfromiptask
xisforrx xisforrx
xisglobal
xisinputstream xisinputstream
xiswaitingarpresolution xiswaitingarpresolution
xitemvalue xitemvalue

View File

@@ -73,18 +73,23 @@
/* _HT_ this is a temporary aid while testing. In case an end-0point is not found, /* _HT_ this is a temporary aid while testing. In case an end-0point is not found,
* this function will return the first end-point of the required type, * this function will return the first end-point of the required type,
* either 'ipTYPE_IPv4' or 'ipTYPE_IPv6' */ * either 'ipTYPE_IPv4' or 'ipTYPE_IPv6' */
extern NetworkEndPoint_t * pxGetEndpoint( BaseType_t xIPType ); extern NetworkEndPoint_t * pxGetEndpoint( BaseType_t xIPType,
BaseType_t xIsGlobal );
/** /**
* @brief Get the first end point of the type (IPv4/IPv6) from the list * @brief Get the first end point of the type (IPv4/IPv6) from the list
* the list of end points. * the list of end points.
* *
* @param[in] xIPType IT type (ipTYPE_IPv6/ipTYPE_IPv4) * @param[in] xIPType IP type (ipTYPE_IPv6/ipTYPE_IPv4)
* @param[in] xIsGlobal when pdTRUE, an endpoint with a global address must be
* returned. When pdFALSE, a local-link endpoint is returned.
* This only applies to IPv6 endpoints.
* *
* @returns Pointer to the first end point of the given IP type from the * @returns Pointer to the first end point of the given IP type from the
* list of end points. * list of end points.
*/ */
NetworkEndPoint_t * pxGetEndpoint( BaseType_t xIPType ) NetworkEndPoint_t * pxGetEndpoint( BaseType_t xIPType,
BaseType_t xIsGlobal )
{ {
NetworkEndPoint_t * pxEndPoint; NetworkEndPoint_t * pxEndPoint;
@@ -95,10 +100,16 @@ NetworkEndPoint_t * pxGetEndpoint( BaseType_t xIPType )
if( xIPType == ( BaseType_t ) ipTYPE_IPv6 ) if( xIPType == ( BaseType_t ) ipTYPE_IPv6 )
{ {
if( pxEndPoint->bits.bIPv6 != 0U ) if( pxEndPoint->bits.bIPv6 != 0U )
{
IPv6_Type_t eEndpointType = xIPv6_GetIPType( &( pxEndPoint->ipv6_settings.xIPAddress ) );
BaseType_t xEndpointGlobal = ( eEndpointType == eIPv6_Global ) ? pdTRUE : pdFALSE;
if( xEndpointGlobal == xIsGlobal )
{ {
break; break;
} }
} }
}
else else
{ {
if( pxEndPoint->bits.bIPv6 == 0U ) if( pxEndPoint->bits.bIPv6 == 0U )
@@ -130,7 +141,7 @@ static eARPLookupResult_t prvStartLookup( NetworkBufferDescriptor_t * const pxNe
/* MISRA Ref 11.3.1 [Misaligned access] */ /* MISRA Ref 11.3.1 [Misaligned access] */
/* More details at: https://github.com/FreeRTOS/FreeRTOS-Plus-TCP/blob/main/MISRA.md#rule-113 */ /* More details at: https://github.com/FreeRTOS/FreeRTOS-Plus-TCP/blob/main/MISRA.md#rule-113 */
/* coverity[misra_c_2012_rule_11_3_violation] */ /* coverity[misra_c_2012_rule_11_3_violation] */
const UDPPacket_t * pxUDPPacket = ( ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer ); const UDPPacket_t * pxUDPPacket = ( ( const UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer );
if( pxUDPPacket->xEthernetHeader.usFrameType == ipIPv6_FRAME_TYPE ) if( pxUDPPacket->xEthernetHeader.usFrameType == ipIPv6_FRAME_TYPE )
{ {
@@ -140,7 +151,9 @@ static eARPLookupResult_t prvStartLookup( NetworkBufferDescriptor_t * const pxNe
if( pxNetworkBuffer->pxEndPoint == NULL ) if( pxNetworkBuffer->pxEndPoint == NULL )
{ {
pxNetworkBuffer->pxEndPoint = pxGetEndpoint( ( BaseType_t ) ipTYPE_IPv6 ); IPv6_Type_t eTargetType = xIPv6_GetIPType( &( pxNetworkBuffer->xIPAddress.xIP_IPv6 ) );
BaseType_t xIsGlobal = ( eTargetType == eIPv6_Global ) ? pdTRUE : pdFALSE;
pxNetworkBuffer->pxEndPoint = pxGetEndpoint( ( BaseType_t ) ipTYPE_IPv6, xIsGlobal );
FreeRTOS_printf( ( "prvStartLookup: Got an end-point: %s\n", pxNetworkBuffer->pxEndPoint ? "yes" : "no" ) ); FreeRTOS_printf( ( "prvStartLookup: Got an end-point: %s\n", pxNetworkBuffer->pxEndPoint ? "yes" : "no" ) );
} }
@@ -337,16 +350,12 @@ void vProcessGeneratedUDPPacket_IPv6( NetworkBufferDescriptor_t * const pxNetwor
} }
else if( eReturned == eARPCacheMiss ) else if( eReturned == eARPCacheMiss )
{ {
eReturned = prvStartLookup( pxNetworkBuffer, &( xLostBuffer ) ); if( pxEndPoint != NULL )
if( pxNetworkBuffer->pxEndPoint != NULL )
{ {
vNDSendNeighbourSolicitation( pxNetworkBuffer, &( pxNetworkBuffer->xIPAddress.xIP_IPv6 ) ); pxNetworkBuffer->pxEndPoint = pxEndPoint;
/* pxNetworkBuffer has been sent and released.
* Make sure it won't be used again.. */
xLostBuffer = pdTRUE;
} }
eReturned = prvStartLookup( pxNetworkBuffer, &( xLostBuffer ) );
} }
else else
{ {
@@ -426,6 +435,7 @@ BaseType_t xProcessReceivedUDPPacket_IPv6( NetworkBufferDescriptor_t * pxNetwork
/* Returning pdPASS means that the packet was consumed, released. */ /* Returning pdPASS means that the packet was consumed, released. */
BaseType_t xReturn = pdPASS; BaseType_t xReturn = pdPASS;
FreeRTOS_Socket_t * pxSocket; FreeRTOS_Socket_t * pxSocket;
const UDPPacket_IPv6_t * pxUDPPacket_IPv6;
configASSERT( pxNetworkBuffer != NULL ); configASSERT( pxNetworkBuffer != NULL );
configASSERT( pxNetworkBuffer->pucEthernetBuffer != NULL ); configASSERT( pxNetworkBuffer->pucEthernetBuffer != NULL );
@@ -437,7 +447,7 @@ BaseType_t xProcessReceivedUDPPacket_IPv6( NetworkBufferDescriptor_t * pxNetwork
/* MISRA Ref 11.3.1 [Misaligned access] */ /* MISRA Ref 11.3.1 [Misaligned access] */
/* More details at: https://github.com/FreeRTOS/FreeRTOS-Plus-TCP/blob/main/MISRA.md#rule-113 */ /* More details at: https://github.com/FreeRTOS/FreeRTOS-Plus-TCP/blob/main/MISRA.md#rule-113 */
/* coverity[misra_c_2012_rule_11_3_violation] */ /* coverity[misra_c_2012_rule_11_3_violation] */
const UDPPacket_IPv6_t * pxUDPPacket_IPv6 = ( ( UDPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer ); pxUDPPacket_IPv6 = ( ( UDPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer );
/* Caller must check for minimum packet size. */ /* Caller must check for minimum packet size. */
pxSocket = pxUDPSocketLookup( usPort ); pxSocket = pxUDPSocketLookup( usPort );