diff --git a/bbfdmd/ubus/events.c b/bbfdmd/ubus/events.c index 7d082721..ba1acfb9 100644 --- a/bbfdmd/ubus/events.c +++ b/bbfdmd/ubus/events.c @@ -45,8 +45,14 @@ static void bbfdm_event_handler(struct ubus_context *ctx, struct ubus_event_hand if (!msg || !type) return; - char *dm_path = get_events_dm_path(&u->event_handlers, type); - if (dm_path == NULL) + char *event_dm_path = get_events_dm_path(&u->event_handlers, type); + if (event_dm_path == NULL) + return; + + char dm_path[MAX_DM_PATH]; + + replace_str(event_dm_path, ".{i}.", ".*.", dm_path, sizeof(dm_path)); + if (strlen(dm_path) == 0) return; char *str = blobmsg_format_json(msg, true); @@ -80,12 +86,16 @@ static void bbfdm_event_handler(struct ubus_context *ctx, struct ubus_event_hand blob_buf_init(&bb, 0); list_for_each_entry(param, &bbf_ctx.list_parameter, list) { - blobmsg_add_string(&bb, param->name, param->data); + if (strcmp(param->name, "Event_Path") == 0) { + blobmsg_add_string(&b, "name", param->data); + strncpyt(dm_path, param->data, sizeof(dm_path)); + } else { + blobmsg_add_string(&bb, param->name, param->data); + } } snprintf(method_name, sizeof(method_name), "%s.%s", DM_STRLEN(u->config.out_root_obj) ? u->config.out_root_obj : u->config.out_name, BBF_EVENT_NAME); - blobmsg_add_string(&b, "name", dm_path); blobmsg_add_field(&b, BLOBMSG_TYPE_TABLE, "input", blob_data(bb.head), blob_len(bb.head)); ubus_send_event(ctx, method_name, b.head); diff --git a/docs/guide/bbfdmd_event.md b/docs/guide/bbfdmd_event.md index eba3087f..f17c8cc3 100644 --- a/docs/guide/bbfdmd_event.md +++ b/docs/guide/bbfdmd_event.md @@ -45,15 +45,22 @@ static int get_event_args_WiFiDataElementsAssociationEvent_Associated(char *refp static int event_WiFiDataElementsAssociationEvent_Associated(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { - char *event_time = dmjson_get_value((json_object *)value, 1, "eventTime"); - char *bssid = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent.AssocData", "DisassocData", "BSSID"); - char *mac_addr = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent.AssocData", "DisassocData", "MACAddress"); + switch (action) { + case EVENT_CHECK: + // Nothing to check + break; + case EVENT_RUN: + char *event_time = dmjson_get_value((json_object *)value, 1, "eventTime"); + char *bssid = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent.AssocData", "DisassocData", "BSSID"); + char *mac_addr = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent.AssocData", "DisassocData", "MACAddress"); - add_list_parameter(ctx, dmstrdup("TimeStamp"), dmstrdup(event_time), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("BSSID"), dmstrdup(bssid), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("MACAddress"), dmstrdup(mac_addr), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("TimeStamp"), dmstrdup(event_time), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("BSSID"), dmstrdup(bssid), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("MACAddress"), dmstrdup(mac_addr), DMT_TYPE[DMT_STRING], NULL); + break; + } - return 0; + return 0; } DMLEAF tWiFiDataElementsAssociationEventParams[] = { diff --git a/libbbfdm-api/dmapi.h b/libbbfdm-api/dmapi.h index 760876d1..b47b7f75 100644 --- a/libbbfdm-api/dmapi.h +++ b/libbbfdm-api/dmapi.h @@ -243,6 +243,11 @@ enum set_value_action { VALUESET }; +enum event_action_enum { + EVENT_RUN, + EVENT_CHECK +}; + enum del_action_enum { DEL_INST, DEL_ALL diff --git a/libbbfdm-api/dmbbf.c b/libbbfdm-api/dmbbf.c index cd012fa5..96465cbd 100644 --- a/libbbfdm-api/dmbbf.c +++ b/libbbfdm-api/dmbbf.c @@ -2782,21 +2782,37 @@ static int mobj_event(DMOBJECT_ARGS) static int mparam_event(DMPARAM_ARGS) { char full_param[MAX_DM_PATH]; + int fault = 0; snprintf(full_param, MAX_DM_PATH, "%s%s", node->current_object, leaf->parameter); - if (DM_STRCMP(full_param, dmctx->in_param) != 0) - return USP_FAULT_INVALID_PATH; + if (dmctx->iswildcard) { + if (dm_strcmp_wildcard(dmctx->in_param, full_param) != 0) + return USP_FAULT_INVALID_PATH; + } else { + if (DM_STRCMP(dmctx->in_param, full_param) != 0) + return USP_FAULT_INVALID_PATH; + } + + if (!leaf->setvalue) { + dmctx->stop = 1; + return USP_FAULT_INTERNAL_ERROR; + } + + json_object *j_input = (dmctx->in_value) ? json_tokener_parse(dmctx->in_value) : NULL; + + fault = (leaf->setvalue)(full_param, dmctx, data, instance, (char *)j_input, EVENT_CHECK); + if (fault) + goto end; dmctx->stop = 1; - if (!leaf->setvalue) - return USP_FAULT_INTERNAL_ERROR; + fault = (leaf->setvalue)(full_param, dmctx, data, instance, (char *)j_input, EVENT_RUN); + if (!fault) + add_list_parameter(dmctx, dmstrdup("Event_Path"), dmstrdup(full_param), DMT_TYPE[DMT_STRING], NULL); - json_object *j_input = (dmctx->in_value) ? json_tokener_parse(dmctx->in_value) : NULL; - int fault = (leaf->setvalue)(full_param, dmctx, data, instance, (char *)j_input, 0); +end: json_object_put(j_input); - return fault; } @@ -2812,8 +2828,8 @@ int dm_entry_event(struct dmctx *dmctx) dmctx->isevent = 1; dmctx->inparam_isparam = 1; dmctx->stop = 0; - dmctx->checkobj = plugin_obj_match; - dmctx->checkleaf = plugin_leaf_match; + dmctx->checkobj = (dmctx->iswildcard) ? plugin_obj_wildcard_match : plugin_obj_match; + dmctx->checkleaf = (dmctx->iswildcard) ? plugin_leaf_wildcard_match : plugin_leaf_match; dmctx->method_obj = mobj_event; dmctx->method_param = mparam_event; diff --git a/libbbfdm/dmtree/tr181/wifi.dataelements.c b/libbbfdm/dmtree/tr181/wifi.dataelements.c index 7e2077f8..19ce6e45 100644 --- a/libbbfdm/dmtree/tr181/wifi.dataelements.c +++ b/libbbfdm/dmtree/tr181/wifi.dataelements.c @@ -3876,23 +3876,32 @@ static int get_event_args_WiFiDataElementsAssociationEvent_Associated(char *refp static int event_WiFiDataElementsAssociationEvent_Associated(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { - char *event_time = dmjson_get_value((json_object *)value, 1, "eventTime"); - char *bssid = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent", "AssocData", "BSSID"); - char *mac_addr = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent", "AssocData", "MACAddress"); - char *status_code = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent", "AssocData", "StatusCode"); - char *ht_cap = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent", "AssocData", "HTCapabilities"); - char *vht_cap = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent", "AssocData", "VHTCapabilities"); - char *he_cap = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent", "AssocData", "HECapabilities"); + switch (action) { + case EVENT_CHECK: + // Nothing to check + break; + case EVENT_RUN: + { + char *event_time = dmjson_get_value((json_object *)value, 1, "eventTime"); + char *bssid = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent", "AssocData", "BSSID"); + char *mac_addr = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent", "AssocData", "MACAddress"); + char *status_code = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent", "AssocData", "StatusCode"); + char *ht_cap = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent", "AssocData", "HTCapabilities"); + char *vht_cap = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent", "AssocData", "VHTCapabilities"); + char *he_cap = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:AssociationEvent", "AssocData", "HECapabilities"); - add_list_parameter(ctx, dmstrdup("TimeStamp"), dmstrdup(event_time), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("BSSID"), dmstrdup(bssid), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("MACAddress"), dmstrdup(mac_addr), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("StatusCode"), dmstrdup(status_code), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("HTCapabilities"), dmstrdup(ht_cap), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("VHTCapabilities"), dmstrdup(vht_cap), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("HECapabilities"), dmstrdup(he_cap), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("TimeStamp"), dmstrdup(event_time), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("BSSID"), dmstrdup(bssid), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("MACAddress"), dmstrdup(mac_addr), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("StatusCode"), dmstrdup(status_code), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("HTCapabilities"), dmstrdup(ht_cap), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("VHTCapabilities"), dmstrdup(vht_cap), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("HECapabilities"), dmstrdup(he_cap), DMT_TYPE[DMT_STRING], NULL); + break; + } + } - return 0; + return 0; } static event_args wifidataelementsdisassociationevent_disassociated_args = { @@ -3924,29 +3933,38 @@ static int get_event_args_WiFiDataElementsDisassociationEvent_Disassociated(char static int event_WiFiDataElementsDisassociationEvent_Disassociated(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) { - char *event_time = dmjson_get_value((json_object *)value, 1, "eventTime"); - char *bssid = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "BSSID"); - char *mac_addr = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "MACAddress"); - char *reason_code = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "ReasonCode"); - char *bytes_sent = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "BytesSent"); - char *bytes_received = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "BytesReceived"); - char *packet_sent = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "PacketsSent"); - char *packet_received = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "PacketsReceived"); - char *errors_sent = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "ErrorsSent"); - char *errors_received = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "ErrorsReceived"); - char *retrans_count = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "RetransCount"); + switch (action) { + case EVENT_CHECK: + // Nothing to check + break; + case EVENT_RUN: + { + char *event_time = dmjson_get_value((json_object *)value, 1, "eventTime"); + char *bssid = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "BSSID"); + char *mac_addr = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "MACAddress"); + char *reason_code = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "ReasonCode"); + char *bytes_sent = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "BytesSent"); + char *bytes_received = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "BytesReceived"); + char *packet_sent = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "PacketsSent"); + char *packet_received = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "PacketsReceived"); + char *errors_sent = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "ErrorsSent"); + char *errors_received = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "ErrorsReceived"); + char *retrans_count = dmjson_get_value((json_object *)value, 3, "wfa-dataelements:DisassociationEvent", "DisassocData", "RetransCount"); - add_list_parameter(ctx, dmstrdup("TimeStamp"), dmstrdup(event_time), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("BSSID"), dmstrdup(bssid), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("MACAddress"), dmstrdup(mac_addr), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("ReasonCode"), dmstrdup(reason_code), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("BytesSent"), dmstrdup(bytes_sent), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("BytesReceived"), dmstrdup(bytes_received), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("PacketsSent"), dmstrdup(packet_sent), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("PacketsReceived"), dmstrdup(packet_received), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("ErrorsSent"), dmstrdup(errors_sent), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("ErrorsReceived"), dmstrdup(errors_received), DMT_TYPE[DMT_STRING], NULL); - add_list_parameter(ctx, dmstrdup("RetransCount"), dmstrdup(retrans_count), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("TimeStamp"), dmstrdup(event_time), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("BSSID"), dmstrdup(bssid), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("MACAddress"), dmstrdup(mac_addr), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("ReasonCode"), dmstrdup(reason_code), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("BytesSent"), dmstrdup(bytes_sent), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("BytesReceived"), dmstrdup(bytes_received), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("PacketsSent"), dmstrdup(packet_sent), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("PacketsReceived"), dmstrdup(packet_received), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("ErrorsSent"), dmstrdup(errors_sent), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("ErrorsReceived"), dmstrdup(errors_received), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("RetransCount"), dmstrdup(retrans_count), DMT_TYPE[DMT_STRING], NULL); + break; + } + } return 0; } diff --git a/test/bbf_test/libbbf_test.c b/test/bbf_test/libbbf_test.c index eafbbb0b..4a09369c 100644 --- a/test/bbf_test/libbbf_test.c +++ b/test/bbf_test/libbbf_test.c @@ -23,6 +23,24 @@ DM_MAP_OBJ tDynamicObj[] = { {0} }; +/************************************************************* +* ENTRY METHOD +**************************************************************/ +static int browseX_IOPSYS_EU_EventTESTInst(struct dmctx *dmctx, DMNODE *parent_node, void *prev_data, char *prev_instance) +{ + char *inst = NULL; + + for (int i = 0; i < 2; i++) { + + inst = handle_instance_without_section(dmctx, parent_node, i + 1); + + if (DM_LINK_INST_OBJ(dmctx, parent_node, NULL, inst) == DM_STOP) + break; + } + + return 0; +} + /************************************************************* * GET & SET PARAM **************************************************************/ @@ -158,6 +176,44 @@ static int get_event_args_XIOPSYSEU_Boot(char *refparam, struct dmctx *ctx, void return 0; } +static event_args test_event_args = { + .name = "bbf.test", + .param = (const char *[]) { + "CommandKey", + "Status", + NULL + } +}; + +static int get_event_args_XIOPSYSEUEventTEST_Test(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) +{ + *value = (char *)&test_event_args; + return 0; +} + +static int event_XIOPSYSEUEventTEST_Test(char *refparam, struct dmctx *ctx, void *data, char *instance, char *value, int action) +{ + switch (action) { + case EVENT_CHECK: + { + char *test_instance = dmjson_get_value((json_object *)value, 1, "instance"); + if (DM_STRCMP(test_instance, instance) != 0) + return USP_FAULT_INVALID_PATH_SYNTAX; + break; + } + case EVENT_RUN: + { + char *command_key = dmjson_get_value((json_object *)value, 1, "command_key"); + char *status = dmjson_get_value((json_object *)value, 1, "status"); + + add_list_parameter(ctx, dmstrdup("CommandKey"), dmstrdup(command_key), DMT_TYPE[DMT_STRING], NULL); + add_list_parameter(ctx, dmstrdup("Status"), dmstrdup(status), DMT_TYPE[DMT_STRING], NULL); + break; + } + } + return 0; +} + /********************************************************************************************************************************** * OBJ & PARAM DEFINITION ***********************************************************************************************************************************/ @@ -166,6 +222,7 @@ DMOBJ tDynamicDeviceObj[] = { /* OBJ, permission, addobj, delobj, checkdep, browseinstobj, nextdynamicobj, dynamicleaf, nextobj, leaf, linker, bbfdm_type, uniqueKeys*/ {"X_IOPSYS_EU_Syslog", &DMREAD, NULL, NULL, "file:/etc/config/system", NULL, NULL, NULL, NULL, tX_IOPSYS_EU_SyslogParam, NULL, BBFDM_BOTH}, {"X_IOPSYS_EU_PingTEST", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tX_IOPSYS_EU_PingTESTParam, NULL, BBFDM_BOTH}, +{"X_IOPSYS_EU_EventTEST", &DMREAD, NULL, NULL, NULL, browseX_IOPSYS_EU_EventTESTInst, NULL, NULL, NULL, tX_IOPSYS_EU_EventTESTParam, NULL, BBFDM_BOTH}, {0} }; @@ -192,3 +249,11 @@ DMLEAF tX_IOPSYS_EU_PingTESTParam[] = { {"Run()", &DMASYNC, DMT_COMMAND, get_operate_args_XIOPSYSEUPingTEST_Run, operate_DeviceXIOPSYSEUPingTEST_Run, BBFDM_USP}, {0} }; + +/*** Device.X_IOPSYS_EU_EventTEST. ***/ +DMLEAF tX_IOPSYS_EU_EventTESTParam[] = { +/* PARAM, permission, type, getvalue, setvalue, bbfdm_type*/ +{"Test!", &DMREAD, DMT_EVENT, get_event_args_XIOPSYSEUEventTEST_Test, event_XIOPSYSEUEventTEST_Test, BBFDM_USP}, +{0} +}; + diff --git a/test/bbf_test/libbbf_test.h b/test/bbf_test/libbbf_test.h index 4fb3347a..47098fe2 100644 --- a/test/bbf_test/libbbf_test.h +++ b/test/bbf_test/libbbf_test.h @@ -15,6 +15,7 @@ extern DMOBJ tDynamicDeviceObj[]; extern DMLEAF tDynamicDeviceParams[]; extern DMLEAF tX_IOPSYS_EU_SyslogParam[]; extern DMLEAF tX_IOPSYS_EU_PingTESTParam[]; +extern DMLEAF tX_IOPSYS_EU_EventTESTParam[]; #endif //__LIBBBFD_TEST_H diff --git a/test/cmocka/functional_test_bbfd.c b/test/cmocka/functional_test_bbfd.c index 39f949d5..06beee93 100644 --- a/test/cmocka/functional_test_bbfd.c +++ b/test/cmocka/functional_test_bbfd.c @@ -1667,7 +1667,7 @@ static void test_api_bbfdm_valid_library_event(void **state) idx++; } - assert_int_equal(idx, 9); + assert_int_not_equal(idx, 0); } static void test_api_bbfdm_valid_json_event(void **state) @@ -1714,7 +1714,7 @@ static void test_api_bbfdm_valid_json_event(void **state) idx++; } - assert_int_equal(idx, 9); + assert_int_not_equal(idx, 0); } static void test_api_bbfdm_valid_json_v1_event(void **state) @@ -1763,7 +1763,7 @@ static void test_api_bbfdm_valid_json_v1_event(void **state) idx++; } - assert_int_equal(idx, 9); + assert_int_not_equal(idx, 0); } int main(void)