diff --git a/examples/test_config.xml b/examples/test_config.xml index 12eff8c4..74a734be 100644 --- a/examples/test_config.xml +++ b/examples/test_config.xml @@ -8,6 +8,13 @@ test_if Test Interface ianaift:other - true + false + + + + if0 + Test Interface + ianaift:other + false \ No newline at end of file diff --git a/src/interfaces/src/plugin/api/interfaces/interface/change.c b/src/interfaces/src/plugin/api/interfaces/interface/change.c index 2d3db614..fb8eaff5 100644 --- a/src/interfaces/src/plugin/api/interfaces/interface/change.c +++ b/src/interfaces/src/plugin/api/interfaces/interface/change.c @@ -121,41 +121,55 @@ int interfaces_interface_change_enabled(void* priv, sr_session_ctx_t* session, c // get interface name SRPC_SAFE_CALL_ERR(error, interfacecs_interface_extract_name(session, change_ctx->node, interface_name_buffer, sizeof(interface_name_buffer)), error_out); - SRPLG_LOG_INF(PLUGIN_NAME, "Working with interface %s", interface_name_buffer); - - // get link by name - SRPC_SAFE_CALL_PTR(current_link, rtnl_link_get_by_name(mod_ctx->link_cache, interface_name_buffer), error_out); - - // create request link - SRPC_SAFE_CALL_PTR(request_link, rtnl_link_alloc(), error_out); - - // set name - rtnl_link_set_name(request_link, interface_name_buffer); - rtnl_link_set_type(request_link, rtnl_link_get_type(current_link)); - switch (change_ctx->operation) { case SR_OP_CREATED: case SR_OP_MODIFIED: + // get link by name + SRPC_SAFE_CALL_PTR(current_link, rtnl_link_get_by_name(mod_ctx->link_cache, interface_name_buffer), error_out); + + // create request link + SRPC_SAFE_CALL_PTR(request_link, rtnl_link_alloc(), error_out); + + // set name + rtnl_link_set_name(request_link, interface_name_buffer); + rtnl_link_set_type(request_link, rtnl_link_get_type(current_link)); // set operstate rtnl_link_set_flags(request_link, (strcmp(node_value, "true") == 0) ? (unsigned int)rtnl_link_str2flags("up") : (unsigned int)rtnl_link_str2flags("down")); rtnl_link_unset_flags(request_link, (strcmp(node_value, "true") == 0) ? (unsigned int)rtnl_link_str2flags("down") : (unsigned int)rtnl_link_str2flags("up")); rtnl_link_set_operstate(request_link, (strcmp(node_value, "true") == 0) ? IF_OPER_UP : IF_OPER_DOWN); + + SRPLG_LOG_INF(PLUGIN_NAME, "Current link status: %d", rtnl_link_get_operstate(current_link)); + SRPLG_LOG_INF(PLUGIN_NAME, "Changed link status: %d", rtnl_link_get_operstate(request_link)); + + // apply changes + SRPC_SAFE_CALL_ERR(error, rtnl_link_change(mod_ctx->socket, current_link, request_link, NLM_F_REPLACE), error_out); break; case SR_OP_DELETED: + // get link by name + // goto out if this function fails - if the link has completely been deleted, no need to delete enabled leaf + SRPC_SAFE_CALL_PTR(current_link, rtnl_link_get_by_name(mod_ctx->link_cache, interface_name_buffer), out); + + // create request link + SRPC_SAFE_CALL_PTR(request_link, rtnl_link_alloc(), error_out); + + // set name + rtnl_link_set_name(request_link, interface_name_buffer); + rtnl_link_set_type(request_link, rtnl_link_get_type(current_link)); + // treat as set to up - default value rtnl_link_set_flags(request_link, (unsigned int)rtnl_link_str2flags("up")); rtnl_link_set_operstate(request_link, IF_OPER_UP); + + SRPLG_LOG_INF(PLUGIN_NAME, "Current link status: %d", rtnl_link_get_operstate(current_link)); + SRPLG_LOG_INF(PLUGIN_NAME, "Changed link status: %d", rtnl_link_get_operstate(request_link)); + + // apply changes + SRPC_SAFE_CALL_ERR(error, rtnl_link_change(mod_ctx->socket, current_link, request_link, NLM_F_REPLACE), error_out); break; case SR_OP_MOVED: break; } - SRPLG_LOG_INF(PLUGIN_NAME, "Current link status: %d", rtnl_link_get_operstate(current_link)); - SRPLG_LOG_INF(PLUGIN_NAME, "Changed link status: %d", rtnl_link_get_operstate(request_link)); - - // apply changes - SRPC_SAFE_CALL_ERR(error, rtnl_link_change(mod_ctx->socket, current_link, request_link, NLM_F_REPLACE), error_out); - goto out; error_out: @@ -165,8 +179,9 @@ int interfaces_interface_change_enabled(void* priv, sr_session_ctx_t* session, c error = -1; out: - // free request link - rtnl_link_put(request_link); + if (request_link) { + rtnl_link_put(request_link); + } return error; } @@ -210,21 +225,21 @@ int interfaces_interface_change_type(void* priv, sr_session_ctx_t* session, cons SRPLG_LOG_INF(PLUGIN_NAME, "Node Name: %s; Previous Value: %s; Value: %s; Operation: %d", node_name, change_ctx->previous_value, node_value, change_ctx->operation); - // get interface name - SRPC_SAFE_CALL_ERR(error, interfacecs_interface_extract_name(session, change_ctx->node, interface_name_buffer, sizeof(interface_name_buffer)), error_out); + switch (change_ctx->operation) { + case SR_OP_CREATED: + case SR_OP_MODIFIED: + // get interface name + SRPC_SAFE_CALL_ERR(error, interfacecs_interface_extract_name(session, change_ctx->node, interface_name_buffer, sizeof(interface_name_buffer)), error_out); - // get link by name - SRPC_SAFE_CALL_PTR(current_link, rtnl_link_get_by_name(mod_ctx->link_cache, interface_name_buffer), error_out); + // get link by name + SRPC_SAFE_CALL_PTR(current_link, rtnl_link_get_by_name(mod_ctx->link_cache, interface_name_buffer), error_out); - // create request link - SRPC_SAFE_CALL_PTR(request_link, rtnl_link_alloc(), error_out); + // create request link + SRPC_SAFE_CALL_PTR(request_link, rtnl_link_alloc(), error_out); - // set name - rtnl_link_set_name(request_link, interface_name_buffer); + // set name + rtnl_link_set_name(request_link, interface_name_buffer); - switch (change_ctx->operation) { - case SR_OP_CREATED: - case SR_OP_MODIFIED: // set type for (size_t i = 0; i < ARRAY_SIZE(type_pairs); i++) { if (!strcmp(node_value, type_pairs[i].yang_type)) { @@ -317,7 +332,7 @@ int interfaces_interface_change_name(void* priv, sr_session_ctx_t* session, cons goto error_out; case SR_OP_DELETED: // get link and delete it - SRPC_SAFE_CALL_PTR(old_link, rtnl_link_get_by_name(mod_ctx->link_cache, change_ctx->previous_value), error_out); + SRPC_SAFE_CALL_PTR(old_link, rtnl_link_get_by_name(mod_ctx->link_cache, node_value), error_out); SRPC_SAFE_CALL_ERR(error, rtnl_link_delete(mod_ctx->socket, old_link), error_out); break; diff --git a/src/interfaces/src/plugin/subscription/operational.c b/src/interfaces/src/plugin/subscription/operational.c index b241942b..7ec5662e 100644 --- a/src/interfaces/src/plugin/subscription/operational.c +++ b/src/interfaces/src/plugin/subscription/operational.c @@ -140,14 +140,14 @@ int interfaces_subscription_operational_interfaces_interface_last_change(sr_sess // add oper-status node SRPC_SAFE_CALL_ERR(error, interfaces_ly_tree_create_interfaces_interface_last_change(ly_ctx, *parent, last_change_buffer), error_out); - pthread_mutex_unlock(&state_ctx->state_hash_mutex); - goto out; error_out: error = SR_ERR_CALLBACK_FAILED; out: + pthread_mutex_unlock(&state_ctx->state_hash_mutex); + return error; }