1 #define xBUFFER_CACHE_SIZE 10
2 #define xMAX_FAULT_INJECTION_RATE 15
3 #define xMIN_FAULT_INJECTION_RATE 3
4 #define xNUM_FAULT_TYPES 1
6 static NetworkBufferDescriptor_t *xNetworkBufferCache[ xBUFFER_CACHE_SIZE ] = { 0 };
8 #define xFAULT_LOG_SIZE 2048
9 uint32_t ulInjectedFault[ xFAULT_LOG_SIZE ];
10 uint32_t ulFaultLogIndex = 0;
12 static BaseType_t prvCachePacket( NetworkBufferDescriptor_t *pxNetworkBufferIn )
14 BaseType_t x, xReturn = pdFALSE;
16 for( x = 0; x < xBUFFER_CACHE_SIZE; x++ )
18 if( xNetworkBufferCache[ x ] == NULL )
20 xNetworkBufferCache[ x ] = pxNetworkBufferIn;
28 /*-----------------------------------------------------------*/
30 static NetworkBufferDescriptor_t *prvGetCachedPacket( void )
33 NetworkBufferDescriptor_t *pxReturn = NULL;
35 for( x = ( xBUFFER_CACHE_SIZE - 1 ); x >= 0; x-- )
37 if( xNetworkBufferCache[ x ] != NULL )
39 pxReturn = xNetworkBufferCache[ x ];
40 xNetworkBufferCache[ x ] = NULL;
47 /*-----------------------------------------------------------*/
49 static NetworkBufferDescriptor_t *prvDuplicatePacket( NetworkBufferDescriptor_t * pxOriginalPacket, const uint8_t *pucPacketData )
51 NetworkBufferDescriptor_t *pxReturn;
53 /* Obtain a new descriptor. */
54 pxReturn = pxGetNetworkBufferWithDescriptor( pxOriginalPacket->xDataLength, 0 );
56 if( pxReturn != NULL )
58 /* Copy in the packet data. */
59 pxReturn->xDataLength = pxOriginalPacket->xDataLength;
60 memcpy( pxReturn->pucEthernetBuffer, pucPacketData, pxOriginalPacket->xDataLength );
65 /*-----------------------------------------------------------*/
67 static NetworkBufferDescriptor_t *prvRxFaultInjection( NetworkBufferDescriptor_t *pxNetworkBufferIn, const uint8_t *pucPacketData )
69 static uint32_t ulCallCount = 0, ulNextFaultCallCount = 0;
70 NetworkBufferDescriptor_t *pxReturn = pxNetworkBufferIn;
71 IPStackEvent_t xRxEvent = { eNetworkRxEvent, NULL };
74 return pxNetworkBufferIn;
78 if( ulCallCount > ulNextFaultCallCount )
80 xApplicationGetRandomNumber( &( ulNextFaultCallCount ) );
81 ulNextFaultCallCount = ulNextFaultCallCount % xMAX_FAULT_INJECTION_RATE;
82 if( ulNextFaultCallCount < xMIN_FAULT_INJECTION_RATE )
84 ulNextFaultCallCount = xMIN_FAULT_INJECTION_RATE;
89 xApplicationGetRandomNumber( &( ulFault ) );
90 ulFault = ulFault % xNUM_FAULT_TYPES;
92 if( ulFaultLogIndex < xFAULT_LOG_SIZE )
94 ulInjectedFault[ ulFaultLogIndex ] = ulFault;
101 /* Just drop the packet. */
102 vReleaseNetworkBufferAndDescriptor( pxNetworkBufferIn );
107 /* Store the packet in the cache for later. */
108 if( prvCachePacket( pxNetworkBufferIn ) == pdTRUE )
110 /* The packet may get sent later, it is not being sent
117 /* Send a cached packet. */
118 pxReturn = prvGetCachedPacket();
119 if( pxReturn != NULL )
121 /* A cached packet was obtained so drop the original
123 vReleaseNetworkBufferAndDescriptor( pxNetworkBufferIn );
127 /* Could not obtain a packet from the cache so just return
128 the packet that was passed in. */
129 pxReturn = pxNetworkBufferIn;
135 /* Send a duplicate of the packet right away. */
136 pxReturn = prvDuplicatePacket( pxNetworkBufferIn, pucPacketData );
138 /* Send the original packet to the stack. */
139 xRxEvent.pvData = ( void * ) pxNetworkBufferIn;
140 if( xSendEventStructToIPTask( &xRxEvent, ( TickType_t ) 0 ) == pdFAIL )
142 vReleaseNetworkBufferAndDescriptor( pxNetworkBufferIn );
148 /* Send both a cached packet and the current packet. */
149 xRxEvent.pvData = ( void * ) prvGetCachedPacket();
150 if( xRxEvent.pvData != NULL )
152 if( xSendEventStructToIPTask( &xRxEvent, ( TickType_t ) 0 ) == pdFAIL )
154 vReleaseNetworkBufferAndDescriptor( pxNetworkBufferIn );
162 /* Store the packet in the cache for later. */
163 if( prvCachePacket( pxNetworkBufferIn ) == pdTRUE )
165 /* The packet may get sent later, it is not being sent
175 /*-----------------------------------------------------------*/