]> git.sur5r.net Git - freertos/blob - FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/portable/NetworkInterface/WinPCap/FaultInjection.c
Sync FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP with the version in GitHub at (23665258ca...
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-TCP / portable / NetworkInterface / WinPCap / FaultInjection.c
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
5 \r
6 static NetworkBufferDescriptor_t *xNetworkBufferCache[ xBUFFER_CACHE_SIZE ] = { 0 };\r
7 \r
8 #define xFAULT_LOG_SIZE 2048\r
9 uint32_t ulInjectedFault[ xFAULT_LOG_SIZE ];\r
10 uint32_t ulFaultLogIndex = 0;\r
11 \r
12 static BaseType_t prvCachePacket( NetworkBufferDescriptor_t *pxNetworkBufferIn )\r
13 {\r
14 BaseType_t x, xReturn = pdFALSE;\r
15 \r
16         for( x = 0; x < xBUFFER_CACHE_SIZE; x++ )\r
17         {\r
18                 if( xNetworkBufferCache[ x ] == NULL )\r
19                 {\r
20                         xNetworkBufferCache[ x ] = pxNetworkBufferIn;\r
21                         xReturn = pdTRUE;\r
22                         break;\r
23                 }\r
24         }\r
25 \r
26         return xReturn;\r
27 }\r
28 /*-----------------------------------------------------------*/\r
29 \r
30 static NetworkBufferDescriptor_t *prvGetCachedPacket( void )\r
31 {\r
32 BaseType_t x;\r
33 NetworkBufferDescriptor_t *pxReturn = NULL;\r
34 \r
35         for( x = ( xBUFFER_CACHE_SIZE - 1 ); x >= 0; x-- )\r
36         {\r
37                 if( xNetworkBufferCache[ x ] != NULL )\r
38                 {\r
39                         pxReturn = xNetworkBufferCache[ x ];\r
40                         xNetworkBufferCache[ x ] = NULL;\r
41                         break;\r
42                 }\r
43         }\r
44 \r
45         return pxReturn;\r
46 }\r
47 /*-----------------------------------------------------------*/\r
48 \r
49 static NetworkBufferDescriptor_t *prvDuplicatePacket( NetworkBufferDescriptor_t * pxOriginalPacket, const uint8_t *pucPacketData )\r
50 {\r
51 NetworkBufferDescriptor_t *pxReturn;\r
52 \r
53         /* Obtain a new descriptor. */\r
54         pxReturn = pxGetNetworkBufferWithDescriptor( pxOriginalPacket->xDataLength, 0 );\r
55 \r
56         if( pxReturn != NULL )\r
57         {\r
58                 /* Copy in the packet data. */\r
59                 pxReturn->xDataLength = pxOriginalPacket->xDataLength;\r
60                 memcpy( pxReturn->pucEthernetBuffer, pucPacketData, pxOriginalPacket->xDataLength );\r
61         }\r
62 \r
63         return pxReturn;\r
64 }\r
65 /*-----------------------------------------------------------*/\r
66 \r
67 static NetworkBufferDescriptor_t *prvRxFaultInjection( NetworkBufferDescriptor_t *pxNetworkBufferIn, const uint8_t *pucPacketData )\r
68 {\r
69 static uint32_t ulCallCount = 0, ulNextFaultCallCount = 0;\r
70 NetworkBufferDescriptor_t *pxReturn = pxNetworkBufferIn;\r
71 IPStackEvent_t xRxEvent = { eNetworkRxEvent, NULL };\r
72 uint32_t ulFault;\r
73 \r
74 return pxNetworkBufferIn;\r
75 \r
76         ulCallCount++;\r
77 \r
78         if( ulCallCount > ulNextFaultCallCount )\r
79         {\r
80                 xApplicationGetRandomNumber( &( ulNextFaultCallCount ) );\r
81                 ulNextFaultCallCount = ulNextFaultCallCount % xMAX_FAULT_INJECTION_RATE;\r
82                 if( ulNextFaultCallCount < xMIN_FAULT_INJECTION_RATE )\r
83                 {\r
84                         ulNextFaultCallCount = xMIN_FAULT_INJECTION_RATE;\r
85                 }\r
86 \r
87                 ulCallCount = 0;\r
88 \r
89                 xApplicationGetRandomNumber( &( ulFault ) );\r
90                 ulFault = ulFault % xNUM_FAULT_TYPES;\r
91 \r
92                 if( ulFaultLogIndex < xFAULT_LOG_SIZE )\r
93                 {\r
94                         ulInjectedFault[ ulFaultLogIndex ] = ulFault;\r
95                         ulFaultLogIndex++;\r
96                 }\r
97 \r
98                 switch( ulFault )\r
99                 {\r
100                         case 0:\r
101                                 /* Just drop the packet. */\r
102                                 vReleaseNetworkBufferAndDescriptor( pxNetworkBufferIn );\r
103                                 pxReturn = NULL;\r
104                                 break;\r
105 \r
106                         case 1:\r
107                                 /* Store the packet in the cache for later. */\r
108                                 if( prvCachePacket( pxNetworkBufferIn ) == pdTRUE )\r
109                                 {\r
110                                         /* The packet may get sent later, it is not being sent\r
111                                         now. */\r
112                                         pxReturn = NULL;\r
113                                 }\r
114                                 break;\r
115 \r
116                         case 2:\r
117                                 /* Send a cached packet. */\r
118                                 pxReturn = prvGetCachedPacket();\r
119                                 if( pxReturn != NULL )\r
120                                 {\r
121                                         /* A cached packet was obtained so drop the original\r
122                                         packet. */\r
123                                         vReleaseNetworkBufferAndDescriptor( pxNetworkBufferIn );\r
124                                 }\r
125                                 else\r
126                                 {\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
130                                 }\r
131                                 break;\r
132 \r
133                         case 4:\r
134 \r
135                                 /* Send a duplicate of the packet right away. */\r
136                                 pxReturn = prvDuplicatePacket( pxNetworkBufferIn, pucPacketData );\r
137 \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
141                                 {\r
142                                         vReleaseNetworkBufferAndDescriptor( pxNetworkBufferIn );\r
143                                 }\r
144                                 break;\r
145 \r
146                         case 5:\r
147 \r
148                                 /* Send both a cached packet and the current packet. */\r
149                                 xRxEvent.pvData = ( void * ) prvGetCachedPacket();\r
150                                 if( xRxEvent.pvData != NULL )\r
151                                 {\r
152                                         if( xSendEventStructToIPTask( &xRxEvent, ( TickType_t ) 0 ) == pdFAIL )\r
153                                         {\r
154                                                 vReleaseNetworkBufferAndDescriptor( pxNetworkBufferIn );\r
155                                         }\r
156                                 }\r
157                                 break;\r
158 \r
159                         case 6:\r
160                         case 7:\r
161                         case 8:\r
162                                 /* Store the packet in the cache for later. */\r
163                                 if( prvCachePacket( pxNetworkBufferIn ) == pdTRUE )\r
164                                 {\r
165                                         /* The packet may get sent later, it is not being sent\r
166                                         now. */\r
167                                         pxReturn = NULL;\r
168                                 }\r
169                                 break;\r
170                 }\r
171         }\r
172 \r
173         return pxReturn;\r
174 }\r
175 /*-----------------------------------------------------------*/\r