Skip to content

Commit 0e6f654

Browse files
tests: drivers: can: api: add test for RTR filter matching
Add test for CAN RX filtering of RTR frames. Signed-off-by: Henrik Brix Andersen <[email protected]>
1 parent fc52bb1 commit 0e6f654

File tree

1 file changed

+115
-0
lines changed
  • tests/drivers/can/api/src

1 file changed

+115
-0
lines changed

tests/drivers/can/api/src/main.c

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,28 @@ const struct zcan_frame test_ext_frame_2 = {
100100
.data = {1, 2, 3, 4, 5, 6, 7, 8}
101101
};
102102

103+
/**
104+
* @brief Standard (11-bit) CAN ID RTR frame 1.
105+
*/
106+
const struct zcan_frame test_std_rtr_frame_1 = {
107+
.id_type = CAN_STANDARD_IDENTIFIER,
108+
.rtr = CAN_REMOTEREQUEST,
109+
.id = TEST_CAN_STD_ID_1,
110+
.dlc = 0,
111+
.data = {0}
112+
};
113+
114+
/**
115+
* @brief Extended (29-bit) CAN ID RTR frame 1.
116+
*/
117+
const struct zcan_frame test_ext_rtr_frame_1 = {
118+
.id_type = CAN_EXTENDED_IDENTIFIER,
119+
.rtr = CAN_REMOTEREQUEST,
120+
.id = TEST_CAN_EXT_ID_1,
121+
.dlc = 0,
122+
.data = {0}
123+
};
124+
103125
/**
104126
* @brief Standard (11-bit) CAN ID filter 1. This filter matches
105127
* ``test_std_frame_1``.
@@ -196,6 +218,30 @@ const struct zcan_filter test_ext_masked_filter_2 = {
196218
.id_mask = TEST_CAN_EXT_MASK
197219
};
198220

221+
/**
222+
* @brief Standard (11-bit) CAN ID RTR filter 1. This filter matches
223+
* ``test_std_rtr_frame_1``.
224+
*/
225+
const struct zcan_filter test_std_rtr_filter_1 = {
226+
.id_type = CAN_STANDARD_IDENTIFIER,
227+
.rtr = CAN_REMOTEREQUEST,
228+
.id = TEST_CAN_STD_ID_1,
229+
.rtr_mask = 1,
230+
.id_mask = CAN_STD_ID_MASK
231+
};
232+
233+
/**
234+
* @brief Extended (29-bit) CAN ID RTR filter 1. This filter matches
235+
* ``test_ext_rtr_frame_1``.
236+
*/
237+
const struct zcan_filter test_ext_rtr_filter_1 = {
238+
.id_type = CAN_EXTENDED_IDENTIFIER,
239+
.rtr = CAN_REMOTEREQUEST,
240+
.id = TEST_CAN_EXT_ID_1,
241+
.rtr_mask = 1,
242+
.id_mask = CAN_EXT_ID_MASK
243+
};
244+
199245
/**
200246
* @brief Standard (11-bit) CAN ID filter. This filter matches
201247
* ``TEST_CAN_SOME_STD_ID``.
@@ -585,6 +631,55 @@ static void send_receive(const struct zcan_filter *filter1,
585631
can_remove_rx_filter(can_dev, filter_id_2);
586632
}
587633

634+
/**
635+
* @brief Perform a send/receive test with a set of CAN ID filters and CAN frames, RTR and data
636+
* frames.
637+
*
638+
* @param data_filter CAN data filter
639+
* @param rtr_filter CAN RTR filter
640+
* @param data_frame CAN data frame
641+
* @param rtr_frame CAN RTR frame
642+
*/
643+
void send_receive_rtr(const struct zcan_filter *data_filter,
644+
const struct zcan_filter *rtr_filter,
645+
const struct zcan_frame *data_frame,
646+
const struct zcan_frame *rtr_frame)
647+
{
648+
struct zcan_frame frame;
649+
int filter_id;
650+
int err;
651+
652+
filter_id = add_rx_msgq(can_dev, rtr_filter);
653+
654+
/* Verify that RTR filter does not match data frame */
655+
send_test_frame(can_dev, data_frame);
656+
err = k_msgq_get(&can_msgq, &frame, TEST_RECEIVE_TIMEOUT);
657+
zassert_equal(err, -EAGAIN, "Data frame passed RTR filter");
658+
659+
/* Verify that RTR filter matches RTR frame */
660+
send_test_frame(can_dev, rtr_frame);
661+
err = k_msgq_get(&can_msgq, &frame, TEST_RECEIVE_TIMEOUT);
662+
zassert_equal(err, 0, "receive timeout");
663+
assert_frame_equal(&frame, rtr_frame, 0);
664+
665+
can_remove_rx_filter(can_dev, filter_id);
666+
667+
filter_id = add_rx_msgq(can_dev, data_filter);
668+
669+
/* Verify that data filter does not match RTR frame */
670+
send_test_frame(can_dev, rtr_frame);
671+
err = k_msgq_get(&can_msgq, &frame, TEST_RECEIVE_TIMEOUT);
672+
zassert_equal(err, -EAGAIN, "RTR frame passed data filter");
673+
674+
/* Verify that data filter matches data frame */
675+
send_test_frame(can_dev, data_frame);
676+
err = k_msgq_get(&can_msgq, &frame, TEST_RECEIVE_TIMEOUT);
677+
zassert_equal(err, 0, "receive timeout");
678+
assert_frame_equal(&frame, data_frame, 0);
679+
680+
can_remove_rx_filter(can_dev, filter_id);
681+
}
682+
588683
/**
589684
* @brief Test getting the CAN core clock rate.
590685
*/
@@ -888,6 +983,24 @@ void test_send_receive_msgq(void)
888983
can_remove_rx_filter(can_dev, filter_id);
889984
}
890985

986+
/**
987+
* @brief Test send/receive with standard (11-bit) CAN IDs and remote transmission request (RTR).
988+
*/
989+
void test_send_receive_std_id_rtr(void)
990+
{
991+
send_receive_rtr(&test_std_filter_1, &test_std_rtr_filter_1,
992+
&test_std_frame_1, &test_std_rtr_frame_1);
993+
}
994+
995+
/**
996+
* @brief Test send/receive with extended (29-bit) CAN IDs and remote transmission request (RTR).
997+
*/
998+
void test_send_receive_ext_id_rtr(void)
999+
{
1000+
send_receive_rtr(&test_ext_filter_1, &test_ext_rtr_filter_1,
1001+
&test_ext_frame_1, &test_ext_rtr_frame_1);
1002+
}
1003+
8911004
/**
8921005
* @brief Test that non-matching CAN frames do not pass a filter.
8931006
*/
@@ -1038,6 +1151,8 @@ void test_main(void)
10381151
ztest_unit_test(test_send_receive_std_id_masked),
10391152
ztest_unit_test(test_send_receive_ext_id_masked),
10401153
ztest_user_unit_test(test_send_receive_msgq),
1154+
ztest_user_unit_test(test_send_receive_std_id_rtr),
1155+
ztest_user_unit_test(test_send_receive_ext_id_rtr),
10411156
ztest_user_unit_test(test_send_invalid_dlc),
10421157
ztest_unit_test(test_send_receive_wrong_id),
10431158
ztest_user_unit_test(test_recover),

0 commit comments

Comments
 (0)