Skip to content

Commit 567fda5

Browse files
henrikbrixandersencfriedt
authored andcommitted
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 b14f356 commit 567fda5

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
@@ -89,6 +89,28 @@ const struct zcan_frame test_ext_msg_2 = {
8989
.data = {1, 2, 3, 4, 5, 6, 7, 8}
9090
};
9191

92+
/**
93+
* @brief Standard (11-bit) CAN ID RTR frame 1.
94+
*/
95+
const struct zcan_frame test_std_rtr_msg_1 = {
96+
.id_type = CAN_STANDARD_IDENTIFIER,
97+
.rtr = CAN_REMOTEREQUEST,
98+
.id = TEST_CAN_STD_ID_1,
99+
.dlc = 0,
100+
.data = {0}
101+
};
102+
103+
/**
104+
* @brief Extended (29-bit) CAN ID RTR frame 1.
105+
*/
106+
const struct zcan_frame test_ext_rtr_msg_1 = {
107+
.id_type = CAN_EXTENDED_IDENTIFIER,
108+
.rtr = CAN_REMOTEREQUEST,
109+
.id = TEST_CAN_EXT_ID_1,
110+
.dlc = 0,
111+
.data = {0}
112+
};
113+
92114
const struct zcan_filter test_std_filter_1 = {
93115
.id_type = CAN_STANDARD_IDENTIFIER,
94116
.rtr = CAN_DATAFRAME,
@@ -154,6 +176,30 @@ const struct zcan_filter test_ext_masked_filter_2 = {
154176
.id_mask = TEST_CAN_EXT_MASK
155177
};
156178

179+
/**
180+
* @brief Standard (11-bit) CAN ID RTR filter 1. This filter matches
181+
* ``test_std_rtr_frame_1``.
182+
*/
183+
const struct zcan_filter test_std_rtr_filter_1 = {
184+
.id_type = CAN_STANDARD_IDENTIFIER,
185+
.rtr = CAN_REMOTEREQUEST,
186+
.id = TEST_CAN_STD_ID_1,
187+
.rtr_mask = 1,
188+
.id_mask = CAN_STD_ID_MASK
189+
};
190+
191+
/**
192+
* @brief Extended (29-bit) CAN ID RTR filter 1. This filter matches
193+
* ``test_ext_rtr_frame_1``.
194+
*/
195+
const struct zcan_filter test_ext_rtr_filter_1 = {
196+
.id_type = CAN_EXTENDED_IDENTIFIER,
197+
.rtr = CAN_REMOTEREQUEST,
198+
.id = TEST_CAN_EXT_ID_1,
199+
.rtr_mask = 1,
200+
.id_mask = CAN_EXT_ID_MASK
201+
};
202+
157203
const struct zcan_filter test_std_some_filter = {
158204
.id_type = CAN_STANDARD_IDENTIFIER,
159205
.rtr = CAN_DATAFRAME,
@@ -517,6 +563,55 @@ static void send_receive(const struct zcan_filter *filter1,
517563
can_detach(can_dev, filter_id_1);
518564
}
519565

566+
/**
567+
* @brief Perform a send/receive test with a set of CAN ID filters and CAN frames, RTR and data
568+
* frames.
569+
*
570+
* @param data_filter CAN data filter
571+
* @param rtr_filter CAN RTR filter
572+
* @param data_frame CAN data frame
573+
* @param rtr_frame CAN RTR frame
574+
*/
575+
void send_receive_rtr(const struct zcan_filter *data_filter,
576+
const struct zcan_filter *rtr_filter,
577+
const struct zcan_frame *data_frame,
578+
const struct zcan_frame *rtr_frame)
579+
{
580+
struct zcan_frame frame;
581+
int filter_id;
582+
int err;
583+
584+
filter_id = attach_msgq(can_dev, rtr_filter);
585+
586+
/* Verify that RTR filter does not match data frame */
587+
send_test_msg(can_dev, data_frame);
588+
err = k_msgq_get(&can_msgq, &frame, TEST_RECEIVE_TIMEOUT);
589+
zassert_equal(err, -EAGAIN, "Data frame passed RTR filter");
590+
591+
/* Verify that RTR filter matches RTR frame */
592+
send_test_msg(can_dev, rtr_frame);
593+
err = k_msgq_get(&can_msgq, &frame, TEST_RECEIVE_TIMEOUT);
594+
zassert_equal(err, 0, "receive timeout");
595+
check_msg(&frame, rtr_frame, 0);
596+
597+
can_detach(can_dev, filter_id);
598+
599+
filter_id = attach_msgq(can_dev, data_filter);
600+
601+
/* Verify that data filter does not match RTR frame */
602+
send_test_msg(can_dev, rtr_frame);
603+
err = k_msgq_get(&can_msgq, &frame, TEST_RECEIVE_TIMEOUT);
604+
zassert_equal(err, -EAGAIN, "RTR frame passed data filter");
605+
606+
/* Verify that data filter matches data frame */
607+
send_test_msg(can_dev, data_frame);
608+
err = k_msgq_get(&can_msgq, &frame, TEST_RECEIVE_TIMEOUT);
609+
zassert_equal(err, 0, "receive timeout");
610+
check_msg(&frame, data_frame, 0);
611+
612+
can_detach(can_dev, filter_id);
613+
}
614+
520615
/*
521616
* Set driver to loopback mode
522617
* The driver stays in loopback mode after that.
@@ -691,6 +786,24 @@ void test_send_receive_buffer(void)
691786
can_detach(can_dev, filter_id);
692787
}
693788

789+
/**
790+
* @brief Test send/receive with standard (11-bit) CAN IDs and remote transmission request (RTR).
791+
*/
792+
void test_send_receive_std_id_rtr(void)
793+
{
794+
send_receive_rtr(&test_std_filter_1, &test_std_rtr_filter_1,
795+
&test_std_msg_1, &test_std_rtr_msg_1);
796+
}
797+
798+
/**
799+
* @brief Test send/receive with extended (29-bit) CAN IDs and remote transmission request (RTR).
800+
*/
801+
void test_send_receive_ext_id_rtr(void)
802+
{
803+
send_receive_rtr(&test_ext_filter_1, &test_ext_rtr_filter_1,
804+
&test_ext_msg_1, &test_ext_rtr_msg_1);
805+
}
806+
694807
/*
695808
* Attach to a filter that should not pass the message and send a message
696809
* with a different id.
@@ -746,6 +859,8 @@ void test_main(void)
746859
ztest_unit_test(test_send_receive_ext),
747860
ztest_unit_test(test_send_receive_std_masked),
748861
ztest_unit_test(test_send_receive_ext_masked),
862+
ztest_user_unit_test(test_send_receive_std_id_rtr),
863+
ztest_user_unit_test(test_send_receive_ext_id_rtr),
749864
ztest_unit_test(test_send_receive_buffer),
750865
ztest_unit_test(test_send_receive_wrong_id));
751866
ztest_run_test_suite(can_driver);

0 commit comments

Comments
 (0)