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