9 #define HAL_LOG_CHANNEL SCOM
10 #define HAL_LOG_SUBCHANNEL FILTERING
18 #ifndef SCOM_FILTERING_ACCESS_GUARD_TIMEOUT
19 #define SCOM_FILTERING_ACCESS_GUARD_TIMEOUT 5000
22 #ifndef SCOM_FILTER_PROC_PERIOD
23 #define SCOM_FILTER_PROC_PERIOD 40
31 #if defined SCOM_MAX_FRAME_FILTERS && (SCOM_MAX_FRAME_FILTERS > 0)
32 HAL_ASSERT_AND_EXECUTE(NULL != scom) {
34 OSCNTSEM_Give(scom->filters.dataReady);
35 HAL_LOG_DEBUG(
"SCOM_FilteringFrameReceptionHandler: Semaphore give.");
47 #if defined SCOM_MAX_FRAME_FILTERS && (SCOM_MAX_FRAME_FILTERS > 0)
52 HAL_ASSERT_AND_EXECUTE(NULL != scom) {
54 if(OSCNTSEM_Take(scom->filters.dataReady, 0) == 0) {
55 HAL_LOG_DEBUG(
"SCOM_FilterProc: Processing filter frame.");
56 #if defined HAL_ENABLE_OS && (HAL_ENABLE_OS == 1)
62 HAL_ASSERT_AND_EXECUTE(NULL != frame){
64 item = LLST_GetFirstItem(&scom->filters.list);
74 #if defined HAL_ENABLE_OS && (HAL_ENABLE_OS == 1)
82 item = LLST_GetNextItem(item);
84 HAL_LOG_DEBUG(
"SCOM_FilterProc: Deleting frame. Failed in matching frame, type: %" PRIu8
"", frame->
type);
87 #if defined HAL_ENABLE_OS && (HAL_ENABLE_OS == 1)
104 #if defined SCOM_MAX_FRAME_FILTERS && (SCOM_MAX_FRAME_FILTERS > 0)
105 HAL_ASSERT_AND_EXECUTE(NULL != scom) {
106 HAL_ASSERT_AND_EXECUTE(NULL != filter) {
108 #if defined HAL_ENABLE_OS && (HAL_ENABLE_OS == 1)
113 if (HALRESULT_OK == LLST_AddItem(&scom->filters.list, filter, NULL)) {
117 #if defined HAL_ENABLE_OS && (HAL_ENABLE_OS == 1)
137 #if defined SCOM_MAX_FRAME_FILTERS && (SCOM_MAX_FRAME_FILTERS > 0)
138 HAL_ASSERT_AND_EXECUTE(NULL != scom) {
139 HAL_ASSERT_AND_EXECUTE(NULL != filter) {
141 #if defined HAL_ENABLE_OS && (HAL_ENABLE_OS == 1)
146 LLSTItem item = LLST_GetItemByData(&scom->filters.list, filter);
148 LLST_UnlinkItem(&scom->filters.list, item);
151 #if defined HAL_ENABLE_OS && (HAL_ENABLE_OS == 1)
170 #if defined SCOM_MAX_FRAME_FILTERS && (SCOM_MAX_FRAME_FILTERS > 0)
172 HAL_ASSERT_AND_EXECUTE(NULL != scom) {
173 #if defined HAL_ENABLE_OS && (HAL_ENABLE_OS == 1)
180 LLST_Init(&scom->filters.list, scom->filters.pool, SCOM_MAX_FRAME_FILTERS);
185 scom->filters.dataReady = OSCNTSEM_Create(0, 255);
187 #if defined HAL_ENABLE_OS && (HAL_ENABLE_OS == 1)
209 #if defined SCOM_MAX_FRAME_FILTERS && (SCOM_MAX_FRAME_FILTERS > 0)
210 HAL_ASSERT_AND_EXECUTE(NULL != scom) {
212 #if defined HAL_ENABLE_OS && (HAL_ENABLE_OS == 1)
217 if (scom->filters.dataReady) {
218 OSCNTSEM_Destroy(scom->filters.dataReady);
219 scom->filters.dataReady = NULL;
223 #if defined HAL_ENABLE_OS && (HAL_ENABLE_OS == 1)
234 #if defined SCOM_MAX_FRAME_FILTERS && (SCOM_MAX_FRAME_FILTERS > 0)
239 static int SCOM_FilterThread(
void* param)
241 HAL_ASSERT_AND_EXECUTE(NULL != param) {
244 HAL_ASSERT_AND_EXECUTE(NULL != scom) {
246 while (OSTASK_IsAlive()) {
262 #if defined SCOM_MAX_FRAME_FILTERS && (SCOM_MAX_FRAME_FILTERS > 0)
263 #if defined HAL_ENABLE_OS && (HAL_ENABLE_OS == 1)
264 HAL_ASSERT_AND_EXECUTE(NULL != scom) {
266 scom->filterTask = OSTASK_Create(SCOM_FilterThread, HAL_OSTASK_JOINABLE | HAL_OSTASK_MORTAL, HAL_OSTASK_PRIORITY_NORMAL, 0, scom);
267 HAL_ASSERT_AND_EXECUTE(OSTASK_IsValid(scom->filterTask)) {
280 #if defined SCOM_MAX_FRAME_FILTERS && (SCOM_MAX_FRAME_FILTERS > 0)
281 #if defined HAL_ENABLE_OS && (HAL_ENABLE_OS == 1)
282 HAL_ASSERT_AND_EXECUTE(NULL != scom) {
284 OSTASK_Kill(scom->filterTask);
286 if (!OSTASK_Join(scom->filterTask, 10000, NULL)) {
287 HAL_LOG_WARNING(
"Unable to stop SCOM filtering thread");
SCOMFrameQueue rxFrameQueue
descriptor of the frame queue used for receiving
SCOMResult SCOM_SetFrameReceptionHandlerFunc(SCOMDataLinkDesc *const scom, SCOMFrameReceptionHandler frameReceptionFunc)
void SCOM_StopFilteringThread(SCOMDataLink scom)
#define SCOM_FILTERING_ACCESS_GUARD_TIMEOUT
SCOM Data Link descriptor.
struct SCOMFilterDesc * SCOMFilter
Utility type being a pointer to a SCOM frame filter descriptor.
bool SCOM_FilteringFrameReceptionHandler(SCOMDataLink scom, SCOMFrame *frame)
void SCOM_FilterProc(SCOMDataLink scom)
SCOMResult SCOM_RemoveFilter(SCOMDataLink scom, SCOMFilter filter)
SCOMDataLinkDesc * SCOMDataLink
uint8_t type
frame type field
size_t size
Pool size (number of managed items)
SCOMResult SCOM_RunFilteringThread(SCOMDataLink scom)
Actual definition of the SCOM frame filter descriptor structure.
SCOMResult SCOM_InitFiltering(SCOMDataLink scom)
SCOMResult SCOM_DeinitFiltering(SCOMDataLink scom)
SCOMResult SCOM_InsertFilter(SCOMDataLink scom, SCOMFilter filter)
SCOMFilterMatchFunc filter_match_function
function that performs filter matching
void SCOM_UnlockFrame(SCOMDataLink scom, SCOMFrame *frame)
#define SCOM_FILTER_PROC_PERIOD
OSMutex accessGuard
SCOM statistics.
SCOMFrame * SCOM_GetReceivedFrame(SCOMDataLink scom)
SCOMFrameBuffer * frameBuffer
monitor mode indication (when true - monitor mode is on, the device does not transmit anything...
#define SCOM_MAX_FRAME_FILTERS