@@ -101,138 +101,171 @@ FIXTURE_VARIANT(can_filters) {
101
101
int exp_num_rx ;
102
102
int exp_rxbits ;
103
103
};
104
+ #define T_EFF (CAN_EFF_FLAG >> 28)
105
+ #define T_RTR (CAN_RTR_FLAG >> 28)
104
106
107
+ /* Receive all frames when filtering for the ID in standard frame format */
105
108
FIXTURE_VARIANT_ADD (can_filters , base ) {
106
109
.testcase = 1 ,
107
110
.id = ID ,
108
111
.mask = CAN_SFF_MASK ,
109
112
.exp_num_rx = 4 ,
110
- .exp_rxbits = 4369 ,
113
+ .exp_rxbits = ( 1 | 1 << ( T_EFF ) | 1 << ( T_RTR ) | 1 << ( T_EFF | T_RTR )) ,
111
114
};
115
+ /* Ignore EFF flag in filter ID if not covered by filter mask */
112
116
FIXTURE_VARIANT_ADD (can_filters , base_eff ) {
113
117
.testcase = 2 ,
114
118
.id = ID | CAN_EFF_FLAG ,
115
119
.mask = CAN_SFF_MASK ,
116
120
.exp_num_rx = 4 ,
117
- .exp_rxbits = 4369 ,
121
+ .exp_rxbits = ( 1 | 1 << ( T_EFF ) | 1 << ( T_RTR ) | 1 << ( T_EFF | T_RTR )) ,
118
122
};
123
+ /* Ignore RTR flag in filter ID if not covered by filter mask */
119
124
FIXTURE_VARIANT_ADD (can_filters , base_rtr ) {
120
125
.testcase = 3 ,
121
126
.id = ID | CAN_RTR_FLAG ,
122
127
.mask = CAN_SFF_MASK ,
123
128
.exp_num_rx = 4 ,
124
- .exp_rxbits = 4369 ,
129
+ .exp_rxbits = ( 1 | 1 << ( T_EFF ) | 1 << ( T_RTR ) | 1 << ( T_EFF | T_RTR )) ,
125
130
};
131
+ /* Ignore EFF and RTR flags in filter ID if not covered by filter mask */
126
132
FIXTURE_VARIANT_ADD (can_filters , base_effrtr ) {
127
133
.testcase = 4 ,
128
134
.id = ID | CAN_EFF_FLAG | CAN_RTR_FLAG ,
129
135
.mask = CAN_SFF_MASK ,
130
136
.exp_num_rx = 4 ,
131
- .exp_rxbits = 4369 ,
137
+ .exp_rxbits = ( 1 | 1 << ( T_EFF ) | 1 << ( T_RTR ) | 1 << ( T_EFF | T_RTR )) ,
132
138
};
133
139
140
+ /* Receive only SFF frames when expecting no EFF flag */
134
141
FIXTURE_VARIANT_ADD (can_filters , filter_eff ) {
135
142
.testcase = 5 ,
136
143
.id = ID ,
137
144
.mask = CAN_SFF_MASK | CAN_EFF_FLAG ,
138
145
.exp_num_rx = 2 ,
139
- .exp_rxbits = 17 ,
146
+ .exp_rxbits = ( 1 | 1 << ( T_RTR )) ,
140
147
};
148
+ /* Receive only EFF frames when filter id and filter mask include EFF flag */
141
149
FIXTURE_VARIANT_ADD (can_filters , filter_eff_eff ) {
142
150
.testcase = 6 ,
143
151
.id = ID | CAN_EFF_FLAG ,
144
152
.mask = CAN_SFF_MASK | CAN_EFF_FLAG ,
145
153
.exp_num_rx = 2 ,
146
- .exp_rxbits = 4352 ,
154
+ .exp_rxbits = ( 1 << ( T_EFF ) | 1 << ( T_EFF | T_RTR )) ,
147
155
};
156
+ /* Receive only SFF frames when expecting no EFF flag, ignoring RTR flag */
148
157
FIXTURE_VARIANT_ADD (can_filters , filter_eff_rtr ) {
149
158
.testcase = 7 ,
150
159
.id = ID | CAN_RTR_FLAG ,
151
160
.mask = CAN_SFF_MASK | CAN_EFF_FLAG ,
152
161
.exp_num_rx = 2 ,
153
- .exp_rxbits = 17 ,
162
+ .exp_rxbits = ( 1 | 1 << ( T_RTR )) ,
154
163
};
164
+ /* Receive only EFF frames when filter id and filter mask include EFF flag,
165
+ * ignoring RTR flag
166
+ */
155
167
FIXTURE_VARIANT_ADD (can_filters , filter_eff_effrtr ) {
156
168
.testcase = 8 ,
157
169
.id = ID | CAN_EFF_FLAG | CAN_RTR_FLAG ,
158
170
.mask = CAN_SFF_MASK | CAN_EFF_FLAG ,
159
171
.exp_num_rx = 2 ,
160
- .exp_rxbits = 4352 ,
172
+ .exp_rxbits = ( 1 << ( T_EFF ) | 1 << ( T_EFF | T_RTR )) ,
161
173
};
162
174
175
+ /* Receive no remote frames when filtering for no RTR flag */
163
176
FIXTURE_VARIANT_ADD (can_filters , filter_rtr ) {
164
177
.testcase = 9 ,
165
178
.id = ID ,
166
179
.mask = CAN_SFF_MASK | CAN_RTR_FLAG ,
167
180
.exp_num_rx = 2 ,
168
- .exp_rxbits = 257 ,
181
+ .exp_rxbits = ( 1 | 1 << ( T_EFF )) ,
169
182
};
183
+ /* Receive no remote frames when filtering for no RTR flag, ignoring EFF flag */
170
184
FIXTURE_VARIANT_ADD (can_filters , filter_rtr_eff ) {
171
185
.testcase = 10 ,
172
186
.id = ID | CAN_EFF_FLAG ,
173
187
.mask = CAN_SFF_MASK | CAN_RTR_FLAG ,
174
188
.exp_num_rx = 2 ,
175
- .exp_rxbits = 257 ,
189
+ .exp_rxbits = ( 1 | 1 << ( T_EFF )) ,
176
190
};
191
+ /* Receive only remote frames when filter includes RTR flag */
177
192
FIXTURE_VARIANT_ADD (can_filters , filter_rtr_rtr ) {
178
193
.testcase = 11 ,
179
194
.id = ID | CAN_RTR_FLAG ,
180
195
.mask = CAN_SFF_MASK | CAN_RTR_FLAG ,
181
196
.exp_num_rx = 2 ,
182
- .exp_rxbits = 4112 ,
197
+ .exp_rxbits = ( 1 << ( T_RTR ) | 1 << ( T_EFF | T_RTR )) ,
183
198
};
199
+ /* Receive only remote frames when filter includes RTR flag, ignoring EFF
200
+ * flag
201
+ */
184
202
FIXTURE_VARIANT_ADD (can_filters , filter_rtr_effrtr ) {
185
203
.testcase = 12 ,
186
204
.id = ID | CAN_EFF_FLAG | CAN_RTR_FLAG ,
187
205
.mask = CAN_SFF_MASK | CAN_RTR_FLAG ,
188
206
.exp_num_rx = 2 ,
189
- .exp_rxbits = 4112 ,
207
+ .exp_rxbits = ( 1 << ( T_RTR ) | 1 << ( T_EFF | T_RTR )) ,
190
208
};
191
209
210
+ /* Receive only SFF data frame when filtering for no flags */
192
211
FIXTURE_VARIANT_ADD (can_filters , filter_effrtr ) {
193
212
.testcase = 13 ,
194
213
.id = ID ,
195
214
.mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG ,
196
215
.exp_num_rx = 1 ,
197
216
.exp_rxbits = 1 ,
198
217
};
218
+ /* Receive only EFF data frame when filtering for EFF but no RTR flag */
199
219
FIXTURE_VARIANT_ADD (can_filters , filter_effrtr_eff ) {
200
220
.testcase = 14 ,
201
221
.id = ID | CAN_EFF_FLAG ,
202
222
.mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG ,
203
223
.exp_num_rx = 1 ,
204
- .exp_rxbits = 256 ,
224
+ .exp_rxbits = ( 1 << ( T_EFF )) ,
205
225
};
226
+ /* Receive only SFF remote frame when filtering for RTR but no EFF flag */
206
227
FIXTURE_VARIANT_ADD (can_filters , filter_effrtr_rtr ) {
207
228
.testcase = 15 ,
208
229
.id = ID | CAN_RTR_FLAG ,
209
230
.mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG ,
210
231
.exp_num_rx = 1 ,
211
- .exp_rxbits = 16 ,
232
+ .exp_rxbits = ( 1 << ( T_RTR )) ,
212
233
};
234
+ /* Receive only EFF remote frame when filtering for EFF and RTR flag */
213
235
FIXTURE_VARIANT_ADD (can_filters , filter_effrtr_effrtr ) {
214
236
.testcase = 16 ,
215
237
.id = ID | CAN_EFF_FLAG | CAN_RTR_FLAG ,
216
238
.mask = CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG ,
217
239
.exp_num_rx = 1 ,
218
- .exp_rxbits = 4096 ,
240
+ .exp_rxbits = ( 1 << ( T_EFF | T_RTR )) ,
219
241
};
220
242
243
+ /* Receive only SFF data frame when filtering for no EFF flag and no RTR flag
244
+ * but based on EFF mask
245
+ */
221
246
FIXTURE_VARIANT_ADD (can_filters , eff ) {
222
247
.testcase = 17 ,
223
248
.id = ID ,
224
249
.mask = CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG ,
225
250
.exp_num_rx = 1 ,
226
251
.exp_rxbits = 1 ,
227
252
};
253
+ /* Receive only EFF data frame when filtering for EFF flag and no RTR flag but
254
+ * based on EFF mask
255
+ */
228
256
FIXTURE_VARIANT_ADD (can_filters , eff_eff ) {
229
257
.testcase = 18 ,
230
258
.id = ID | CAN_EFF_FLAG ,
231
259
.mask = CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG ,
232
260
.exp_num_rx = 1 ,
233
- .exp_rxbits = 256 ,
261
+ .exp_rxbits = ( 1 << ( T_EFF )) ,
234
262
};
235
263
264
+ /* This test verifies that the raw CAN filters work, by checking if only frames
265
+ * with the expected set of flags are received. For each test case, the given
266
+ * filter (id and mask) is added and four CAN frames are sent with every
267
+ * combination of set/unset EFF/RTR flags.
268
+ */
236
269
TEST_F (can_filters , test_filter )
237
270
{
238
271
fd_set rdfs ;
0 commit comments