|
274 | 274 | } |
275 | 275 | /*-----------------------------------------------------------*/ |
276 | 276 |
|
| 277 | + static BaseType_t vTCPRemoveTCPChild( const FreeRTOS_Socket_t * pxChildSocket ) |
| 278 | + { |
| 279 | + BaseType_t xReturn = pdFALSE; |
| 280 | + const ListItem_t * pxEnd = ( ( const ListItem_t * ) &( xBoundTCPSocketsList.xListEnd ) ); |
| 281 | + |
| 282 | + /* MISRA Ref 11.3.1 [Misaligned access] */ |
| 283 | + /* More details at: https://github.com/FreeRTOS/FreeRTOS-Plus-TCP/blob/main/MISRA.md#rule-113 */ |
| 284 | + /* coverity[misra_c_2012_rule_11_3_violation] */ |
| 285 | + const ListItem_t * pxIterator = ( const ListItem_t * ) listGET_HEAD_ENTRY( &xBoundTCPSocketsList ); |
| 286 | + |
| 287 | + while( pxIterator != pxEnd ) |
| 288 | + { |
| 289 | + FreeRTOS_Socket_t * pxSocket; |
| 290 | + pxSocket = ( ( FreeRTOS_Socket_t * ) listGET_LIST_ITEM_OWNER( pxIterator ) ); |
| 291 | + pxIterator = ( ListItem_t * ) listGET_NEXT( pxIterator ); |
| 292 | + |
| 293 | + if( ( pxSocket != pxChildSocket ) && ( pxSocket->usLocalPort == pxChildSocket->usLocalPort ) ) |
| 294 | + { |
| 295 | + if( pxSocket->u.xTCP.pxPeerSocket == pxChildSocket ) /**< for server socket: child, for child socket: parent */ |
| 296 | + { |
| 297 | + pxSocket->u.xTCP.pxPeerSocket = NULL; |
| 298 | + xReturn = pdTRUE; |
| 299 | + break; |
| 300 | + } |
| 301 | + } |
| 302 | + } |
| 303 | + |
| 304 | + return xReturn; |
| 305 | + } |
| 306 | + |
277 | 307 | /** |
278 | 308 | * @brief Changing to a new state. Centralised here to do specific actions such as |
279 | 309 | * resetting the alive timer, calling the user's OnConnect handler to notify |
|
440 | 470 | if( ( eTCPState == eCLOSED ) || |
441 | 471 | ( eTCPState == eCLOSE_WAIT ) ) |
442 | 472 | { |
| 473 | + BaseType_t xMustClear = pdFALSE; |
| 474 | + BaseType_t xHasCleared = pdFALSE; |
| 475 | + |
| 476 | + if( ( xParent == pxSocket ) && ( pxSocket->u.xTCP.pxPeerSocket != NULL ) ) |
| 477 | + { |
| 478 | + xParent = pxSocket->u.xTCP.pxPeerSocket; |
| 479 | + } |
| 480 | + |
| 481 | + if( ( xParent->u.xTCP.pxPeerSocket != NULL ) && |
| 482 | + ( xParent->u.xTCP.pxPeerSocket == pxSocket ) ) |
| 483 | + { |
| 484 | + xMustClear = pdTRUE; |
| 485 | + ( void ) xMustClear; |
| 486 | + } |
| 487 | + |
443 | 488 | /* Socket goes to status eCLOSED because of a RST. |
444 | 489 | * When nobody owns the socket yet, delete it. */ |
| 490 | + FreeRTOS_printf( ( "vTCPStateChange: Closing (Queued %d, Accept %d Reuse %d)\n", |
| 491 | + pxSocket->u.xTCP.bits.bPassQueued, |
| 492 | + pxSocket->u.xTCP.bits.bPassAccept, |
| 493 | + pxSocket->u.xTCP.bits.bReuseSocket ) ); |
| 494 | + FreeRTOS_printf( ( "vTCPStateChange: me %p parent %p peer %p clear %d\n", |
| 495 | + ( void * ) pxSocket, |
| 496 | + ( void * ) xParent, |
| 497 | + xParent ? ( void * ) xParent->u.xTCP.pxPeerSocket : NULL, |
| 498 | + ( int ) xMustClear ) ); |
| 499 | + |
445 | 500 | vTaskSuspendAll(); |
446 | 501 | { |
447 | 502 | if( ( pxSocket->u.xTCP.bits.bPassQueued != pdFALSE_UNSIGNED ) || |
448 | 503 | ( pxSocket->u.xTCP.bits.bPassAccept != pdFALSE_UNSIGNED ) ) |
449 | 504 | { |
450 | 505 | if( pxSocket->u.xTCP.bits.bReuseSocket == pdFALSE_UNSIGNED ) |
451 | 506 | { |
| 507 | + xHasCleared = vTCPRemoveTCPChild( pxSocket ); |
| 508 | + ( void ) xHasCleared; |
| 509 | + |
452 | 510 | pxSocket->u.xTCP.bits.bPassQueued = pdFALSE_UNSIGNED; |
453 | 511 | pxSocket->u.xTCP.bits.bPassAccept = pdFALSE_UNSIGNED; |
454 | | - } |
455 | | - |
456 | | - ( void ) xTaskResumeAll(); |
457 | | - |
458 | | - FreeRTOS_printf( ( "vTCPStateChange: Closing socket\n" ) ); |
459 | | - |
460 | | - if( pxSocket->u.xTCP.bits.bReuseSocket == pdFALSE_UNSIGNED ) |
461 | | - { |
462 | 512 | configASSERT( xIsCallingFromIPTask() != pdFALSE ); |
463 | 513 | vSocketCloseNextTime( pxSocket ); |
464 | 514 | } |
465 | 515 | } |
466 | | - else |
467 | | - { |
468 | | - ( void ) xTaskResumeAll(); |
469 | | - } |
470 | 516 | } |
| 517 | + ( void ) xTaskResumeAll(); |
| 518 | + FreeRTOS_printf( ( "vTCPStateChange: xHasCleared = %d\n", |
| 519 | + ( int ) xHasCleared ) ); |
471 | 520 | } |
472 | 521 |
|
473 | 522 | if( ( eTCPState == eCLOSE_WAIT ) && ( pxSocket->u.xTCP.bits.bReuseSocket == pdTRUE_UNSIGNED ) ) |
|
0 commit comments