diff --git a/include/neuron/define.h b/include/neuron/define.h index a7dc5c0f..40a5c21e 100644 --- a/include/neuron/define.h +++ b/include/neuron/define.h @@ -34,6 +34,7 @@ #define NEU_TAG_NAME_LEN 64 #define NEU_TAG_ADDRESS_LEN 128 #define NEU_TAG_DESCRIPTION_LEN 128 +#define NEU_GROUP_MAX_PER_NODE 512 #define NEU_GROUP_NAME_LEN 128 #define NEU_GROUP_INTERVAL_LIMIT 100 #define NEU_DEFAULT_GROUP_INTERVAL 100 diff --git a/include/neuron/errcodes.h b/include/neuron/errcodes.h index 84a043ee..78c105dc 100644 --- a/include/neuron/errcodes.h +++ b/include/neuron/errcodes.h @@ -70,6 +70,7 @@ typedef enum { NEU_ERR_GROUP_PARAMETER_INVALID = 2105, NEU_ERR_GROUP_NOT_EXIST = 2106, NEU_ERR_GROUP_NAME_TOO_LONG = 2107, + NEU_ERR_GROUP_MAX_GROUPS = 2108, NEU_ERR_TAG_NOT_EXIST = 2201, NEU_ERR_TAG_NAME_CONFLICT = 2202, diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index 1eebc7af..7a62a058 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -1059,6 +1059,12 @@ static int adapter_loop(enum neu_event_io_type type, int fd, void *usr_data) if (adapter->module->type != NEU_NA_TYPE_DRIVER) { resp.error = NEU_ERR_GROUP_NOT_ALLOW; + } else if (neu_adapter_driver_new_group_count( + (neu_adapter_driver_t *) adapter, cmd) + + neu_adapter_driver_group_count( + (neu_adapter_driver_t *) adapter) > + NEU_GROUP_MAX_PER_NODE) { + resp.error = NEU_ERR_GROUP_MAX_GROUPS; } else { if (validate_gtags(adapter, cmd, &resp) == 0 && try_add_gtags(adapter, cmd, &resp) == 0 && diff --git a/src/adapter/driver/driver.c b/src/adapter/driver/driver.c index 46c415ee..7a625679 100644 --- a/src/adapter/driver/driver.c +++ b/src/adapter/driver/driver.c @@ -1122,6 +1122,29 @@ int neu_adapter_driver_del_group(neu_adapter_driver_t *driver, const char *name) return ret; } +uint16_t neu_adapter_driver_group_count(neu_adapter_driver_t *driver) +{ + u_int16_t num_groups = 0; + if (driver && driver->groups) { + num_groups = HASH_COUNT(driver->groups); + } + return num_groups; +} + +uint16_t neu_adapter_driver_new_group_count(neu_adapter_driver_t *driver, + neu_req_add_gtag_t * cmd) +{ + uint16_t new_groups_count = 0; + for (int i = 0; i < cmd->n_group; i++) { + group_t *group_in_driver; + HASH_FIND_STR(driver->groups, cmd->groups[i].group, group_in_driver); + if (!group_in_driver) { + new_groups_count++; + } + } + return new_groups_count; +} + static group_t *find_group(neu_adapter_driver_t *driver, const char *name) { group_t *find = NULL; diff --git a/src/adapter/driver/driver_internal.h b/src/adapter/driver/driver_internal.h index 0031a4ff..bac91a1e 100644 --- a/src/adapter/driver/driver_internal.h +++ b/src/adapter/driver/driver_internal.h @@ -51,6 +51,9 @@ int neu_adapter_driver_del_group(neu_adapter_driver_t *driver, int neu_adapter_driver_group_exist(neu_adapter_driver_t *driver, const char * name); UT_array *neu_adapter_driver_get_group(neu_adapter_driver_t *driver); +uint16_t neu_adapter_driver_group_count(neu_adapter_driver_t *driver); +uint16_t neu_adapter_driver_new_group_count(neu_adapter_driver_t *driver, + neu_req_add_gtag_t * cmd); int neu_adapter_driver_try_del_tag(neu_adapter_driver_t *driver, int n_tag); int neu_adapter_driver_try_add_tag(neu_adapter_driver_t *driver, diff --git a/src/utils/http.c b/src/utils/http.c index 839eae46..de52faac 100644 --- a/src/utils/http.c +++ b/src/utils/http.c @@ -354,6 +354,7 @@ int neu_http_response(nng_aio *aio, neu_err_code_e code, char *content) case NEU_ERR_TAG_NAME_TOO_LONG: case NEU_ERR_TAG_ADDRESS_TOO_LONG: case NEU_ERR_TAG_VALUE_INVALID: + case NEU_ERR_GROUP_MAX_GROUPS: case NEU_ERR_LICENSE_MAX_TAGS: case NEU_ERR_LICENSE_BAD_CLOCK: case NEU_ERR_LICENSE_MODULE_INVALID: