1+ #include "firewall.h"
2+
3+ typedef int32_t (* RuleFunctionPointer )(const uint8_t * p_input_packet , const int32_t input_size , uint8_t * * pp_output_packet , int32_t * p_output_size );
4+
5+ // Rule 1: If source ID is 1, set destination ID to 5.
6+ int32_t rule1 (const uint8_t * p_input_packet , const int32_t input_size , uint8_t * * pp_output_packet , int32_t * p_output_size )
7+ {
8+ if (p_input_packet == NULL || input_size <= 0 )
9+ {
10+ return -1 ;
11+ }
12+
13+ * pp_output_packet = (uint8_t * )malloc (input_size * sizeof (uint8_t ));
14+ memcpy (* pp_output_packet , p_input_packet , input_size * sizeof (uint8_t ));
15+
16+ uint32_t source_id = ((uint32_t * )p_input_packet )[0 ];
17+ printf ("rule1: id: %d\n" , source_id );
18+ if (source_id == 1 )
19+ {
20+ ((uint32_t * )(* pp_output_packet ))[1 ] = 5 ; // change destination ID to 5.
21+ }
22+
23+ * p_output_size = input_size ;
24+ return 0 ;
25+ }
26+
27+ // Rule 2: If source ID is 2, set source ID to 7.
28+ int32_t rule2 (const uint8_t * p_input_packet , const int32_t input_size , uint8_t * * pp_output_packet , int32_t * p_output_size )
29+ {
30+ if (p_input_packet == NULL || input_size <= 0 )
31+ {
32+ return -1 ;
33+ }
34+
35+ * pp_output_packet = (uint8_t * )malloc (input_size * sizeof (uint8_t ));
36+ memcpy (* pp_output_packet , p_input_packet , input_size * sizeof (uint8_t ));
37+
38+ uint32_t source_id = ((uint32_t * )p_input_packet )[0 ];
39+ printf ("rule2: id: %d\n" , source_id );
40+ if (source_id == 2 )
41+ {
42+ ((uint32_t * )(* pp_output_packet ))[0 ] = 7 ; // change destination ID to 7.
43+ }
44+
45+ * p_output_size = input_size ;
46+ return 0 ;
47+ }
48+
49+ // // Rule 3: If size is 2, duplicate data.
50+ int32_t rule3 (const uint8_t * p_input_packet , const int32_t input_size , uint8_t * * pp_output_packet , int32_t * p_output_size )
51+ {
52+ if (p_input_packet == NULL || input_size <= 0 )
53+ {
54+ return -1 ;
55+ }
56+
57+ uint16_t packet_size = ((uint16_t * )p_input_packet )[4 ];
58+ printf ("rule3: size: %d\n" , packet_size );
59+ if (packet_size == 2 )
60+ {
61+ * pp_output_packet = (uint8_t * )malloc ((input_size + packet_size ) * sizeof (uint8_t ));
62+ memcpy (* pp_output_packet , p_input_packet , input_size * sizeof (uint8_t ));
63+ memcpy (* pp_output_packet + input_size , p_input_packet + input_size - packet_size , packet_size * sizeof (uint8_t )); // duplicate data
64+ * p_output_size = input_size + packet_size ;
65+ }
66+ else
67+ {
68+ * pp_output_packet = (uint8_t * )malloc (input_size * sizeof (uint8_t ));
69+ memcpy (* pp_output_packet , p_input_packet , input_size * sizeof (uint8_t ));
70+ * p_output_size = input_size ;
71+ }
72+
73+ return 0 ;
74+ }
75+
76+ // Rule 4: If source ID is 7 and destination ID is 3, Drop the packet.
77+ int32_t rule4 (const uint8_t * p_input_packet , const int32_t input_size , uint8_t * * pp_output_packet , int32_t * p_output_size )
78+ {
79+ if (p_input_packet == NULL || input_size <= 0 )
80+ {
81+ return -1 ;
82+ }
83+
84+ uint32_t source_id = ((uint32_t * )p_input_packet )[0 ];
85+ uint32_t destination_id = ((uint32_t * )p_input_packet )[1 ];
86+
87+ printf ("rule4: s_id: %d, d_id: %d\n" , source_id , destination_id );
88+ if (source_id == 7 && destination_id == 3 )
89+ {
90+ return 1 ; // drop signal
91+ }
92+
93+ * pp_output_packet = (uint8_t * )malloc (input_size * sizeof (uint8_t ));
94+ memcpy (* pp_output_packet , p_input_packet , input_size * sizeof (uint8_t ));
95+ * p_output_size = input_size ;
96+ return 0 ;
97+ }
98+
99+ int main ()
100+ {
101+ uint8_t array [] = { 0x01 , 0x00 , 0x00 , 0x00 , // Packet 1 -> Source ID: 1
102+ 0x02 , 0x00 , 0x00 , 0x00 , // Destination ID: 2
103+ 0x03 , 0x00 , // Size
104+ 0x01 , 0x02 , 0x03 , // Data
105+ 0x01 , 0x00 , 0x00 , 0x00 , // Packet 2 -> Source ID: 1
106+ 0x03 , 0x00 , 0x00 , 0x00 , // Destination ID: 3
107+ 0x02 , 0x00 , // Size
108+ 0xEE , 0xFF , // Data
109+ 0x02 , 0x00 , 0x00 , 0x00 , // Packet 3 -> Source ID: 2
110+ 0x03 , 0x00 , 0x00 , 0x00 , // Destination ID: 3
111+ 0x04 , 0x00 , // Size
112+ 0x00 , 0x00 , 0x01 , 0x02 // Data
113+ };
114+
115+ size_t array_len = sizeof (array )/sizeof (array [0 ]);
116+
117+ uint8_t * inputPacket = malloc (array_len * sizeof (uint8_t ));
118+ memcpy (inputPacket , array , array_len );
119+ int32_t inputSize = array_len ;
120+ uint8_t * outputPacket = NULL ;
121+ int32_t outputSize = 0 ;
122+
123+ printf ("rule1: %d\n" , set_rule (0 , rule1 ));
124+ printf ("rule2: %d\n" , set_rule (10 , rule2 ));
125+ printf ("rule3: %d\n" , set_rule (20 , rule3 ));
126+ printf ("rule4: %d\n" , set_rule (99 , rule4 ));
127+ printf ("filter: %d\n" , filter (inputPacket , inputSize , & outputPacket , & outputSize ));
128+
129+ uint8_t ans_array [] = { 0x01 , 0x00 , 0x00 , 0x00 , // Packet 1 -> Source ID: 1
130+ 0x05 , 0x00 , 0x00 , 0x00 , // Destination ID: 5
131+ 0x03 , 0x00 , // Size
132+ 0x01 , 0x02 , 0x03 , // Data
133+ 0x01 , 0x00 , 0x00 , 0x00 , // Packet 2 -> Source ID: 1
134+ 0x05 , 0x00 , 0x00 , 0x00 , // Destination ID: 5
135+ 0x04 , 0x00 , // Size
136+ 0xEE , 0xFF , 0xEE , 0xFF // Data
137+ };
138+
139+ printf ("input_size: %d, output_size: %d\n" , inputSize , outputSize );
140+ for (int i = 0 ; i < inputSize ; i ++ )
141+ {
142+ printf ("%d, " , inputPacket [i ]);
143+ }
144+ printf ("\n" );
145+ for (int i = 0 ; i < outputSize ; i ++ )
146+ {
147+ printf ("%d, " , outputPacket [i ]);
148+ }
149+ printf ("\n" );
150+ for (int i = 0 ; i < sizeof (ans_array )/sizeof (ans_array [0 ]); i ++ )
151+ {
152+ printf ("%d, " , ans_array [i ]);
153+ }
154+
155+ printf ("\n=============end===========\n" );
156+ return 0 ;
157+ }
0 commit comments