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 ulNextFaultCallCount = ipconfigRAND32() % xMAX_FAULT_INJECTION_RATE;
\r
81 if( ulNextFaultCallCount < xMIN_FAULT_INJECTION_RATE )
\r
83 ulNextFaultCallCount = xMIN_FAULT_INJECTION_RATE;
\r
88 ulFault = ipconfigRAND32() % xNUM_FAULT_TYPES;
\r
90 if( ulFaultLogIndex < xFAULT_LOG_SIZE )
\r
92 ulInjectedFault[ ulFaultLogIndex ] = ulFault;
\r
99 /* Just drop the packet. */
\r
100 vReleaseNetworkBufferAndDescriptor( pxNetworkBufferIn );
\r
105 /* Store the packet in the cache for later. */
\r
106 if( prvCachePacket( pxNetworkBufferIn ) == pdTRUE )
\r
108 /* The packet may get sent later, it is not being sent
\r
115 /* Send a cached packet. */
\r
116 pxReturn = prvGetCachedPacket();
\r
117 if( pxReturn != NULL )
\r
119 /* A cached packet was obtained so drop the original
\r
121 vReleaseNetworkBufferAndDescriptor( pxNetworkBufferIn );
\r
125 /* Could not obtain a packet from the cache so just return
\r
126 the packet that was passed in. */
\r
127 pxReturn = pxNetworkBufferIn;
\r
133 /* Send a duplicate of the packet right away. */
\r
134 pxReturn = prvDuplicatePacket( pxNetworkBufferIn, pucPacketData );
\r
136 /* Send the original packet to the stack. */
\r
137 xRxEvent.pvData = ( void * ) pxNetworkBufferIn;
\r
138 if( xSendEventStructToIPTask( &xRxEvent, ( TickType_t ) 0 ) == pdFAIL )
\r
140 vReleaseNetworkBufferAndDescriptor( pxNetworkBufferIn );
\r
146 /* Send both a cached packet and the current packet. */
\r
147 xRxEvent.pvData = ( void * ) prvGetCachedPacket();
\r
148 if( xRxEvent.pvData != NULL )
\r
150 if( xSendEventStructToIPTask( &xRxEvent, ( TickType_t ) 0 ) == pdFAIL )
\r
152 vReleaseNetworkBufferAndDescriptor( pxNetworkBufferIn );
\r
160 /* Store the packet in the cache for later. */
\r
161 if( prvCachePacket( pxNetworkBufferIn ) == pdTRUE )
\r
163 /* The packet may get sent later, it is not being sent
\r
173 /*-----------------------------------------------------------*/
\r