+/**
+ * @in[4] : the flags packets carries.
+ * @in[4] : the flags function expect to return.
+ * It will do blind check at the time of 1 second from beginning.
+ * At the time, it will use packets length of cbs -1, cbs + 1,
+ * ebs -1 and ebs +1 with flag in[0], in[1], in[2] and in[3] to do
+ * aware check, expect flag out[0], out[1], out[2] and out[3]
+ */
+static inline int
+tm_test_trtcm_rfc4115_aware_check
+(enum rte_meter_color in[4], enum rte_meter_color out[4])
+{
+#define TRTCM_RFC4115_AWARE_CHECK_MSG "trtcm_rfc4115_aware_check"
+ struct rte_meter_trtcm_rfc4115_profile tp;
+ struct rte_meter_trtcm_rfc4115 tm;
+ uint64_t time;
+ uint64_t hz = rte_get_tsc_hz();
+
+ if (rte_meter_trtcm_rfc4115_profile_config(&tp, &rfc4115params) != 0)
+ melog(TRTCM_AWARE_CHECK_MSG);
+ if (rte_meter_trtcm_rfc4115_config(&tm, &tp) != 0)
+ melog(TRTCM_RFC4115_AWARE_CHECK_MSG);
+ time = rte_get_tsc_cycles() + hz;
+ if (rte_meter_trtcm_rfc4115_color_aware_check(
+ &tm, &tp, time, TM_TEST_TRTCM_CBS_DF - 1, in[0]) != out[0])
+ melog(TRTCM_RFC4115_AWARE_CHECK_MSG" %u:%u", in[0], out[0]);
+
+ if (rte_meter_trtcm_rfc4115_profile_config(&tp, &rfc4115params) != 0)
+ melog(TRTCM_RFC4115_AWARE_CHECK_MSG);
+ if (rte_meter_trtcm_rfc4115_config(&tm, &tp) != 0)
+ melog(TRTCM_RFC4115_AWARE_CHECK_MSG);
+ time = rte_get_tsc_cycles() + hz;
+ if (rte_meter_trtcm_rfc4115_color_aware_check(
+ &tm, &tp, time, TM_TEST_TRTCM_CBS_DF + 1, in[1]) != out[1])
+ melog(TRTCM_RFC4115_AWARE_CHECK_MSG" %u:%u", in[1], out[1]);
+
+ if (rte_meter_trtcm_rfc4115_profile_config(&tp, &rfc4115params) != 0)
+ melog(TRTCM_RFC4115_AWARE_CHECK_MSG);
+ if (rte_meter_trtcm_rfc4115_config(&tm, &tp) != 0)
+ melog(TRTCM_RFC4115_AWARE_CHECK_MSG);
+ time = rte_get_tsc_cycles() + hz;
+ if (rte_meter_trtcm_rfc4115_color_aware_check(
+ &tm, &tp, time, TM_TEST_TRTCM_EBS_DF - 1, in[2]) != out[2])
+ melog(TRTCM_RFC4115_AWARE_CHECK_MSG" %u:%u", in[2], out[2]);
+
+ if (rte_meter_trtcm_rfc4115_profile_config(&tp, &rfc4115params) != 0)
+ melog(TRTCM_RFC4115_AWARE_CHECK_MSG);
+ if (rte_meter_trtcm_rfc4115_config(&tm, &tp) != 0)
+ melog(TRTCM_RFC4115_AWARE_CHECK_MSG);
+ time = rte_get_tsc_cycles() + hz;
+ if (rte_meter_trtcm_rfc4115_color_aware_check(
+ &tm, &tp, time, TM_TEST_TRTCM_EBS_DF + 1, in[3]) != out[3])
+ melog(TRTCM_RFC4115_AWARE_CHECK_MSG" %u:%u", in[3], out[3]);
+
+ return 0;
+}
+
+/**
+ * functional test for rte_meter_trtcm_rfc4115_color_aware_check
+ */
+static inline int
+tm_test_trtcm_rfc4115_color_aware_check(void)
+{
+ enum rte_meter_color in[4], out[4];
+ /**
+ * test 4 points that will produce green, yellow, yellow, red flag
+ * if using blind check
+ */
+
+ /* previouly have a green, test points should keep unchanged */
+ in[0] = in[1] = in[2] = in[3] = e_RTE_METER_GREEN;
+ out[0] = e_RTE_METER_GREEN;
+ out[1] = e_RTE_METER_YELLOW;
+ out[2] = e_RTE_METER_YELLOW;
+ out[3] = e_RTE_METER_RED;
+ if (tm_test_trtcm_rfc4115_aware_check(in, out) != 0)
+ return -1;
+
+ in[0] = in[1] = in[2] = in[3] = e_RTE_METER_YELLOW;
+ out[0] = e_RTE_METER_YELLOW;
+ out[1] = e_RTE_METER_YELLOW;
+ out[2] = e_RTE_METER_YELLOW;
+ out[3] = e_RTE_METER_RED;
+ if (tm_test_trtcm_rfc4115_aware_check(in, out) != 0)
+ return -1;
+
+ in[0] = in[1] = in[2] = in[3] = e_RTE_METER_RED;
+ out[0] = e_RTE_METER_RED;
+ out[1] = e_RTE_METER_RED;
+ out[2] = e_RTE_METER_RED;
+ out[3] = e_RTE_METER_RED;
+ if (tm_test_trtcm_rfc4115_aware_check(in, out) != 0)
+ return -1;
+
+ return 0;
+}
+