diff options
Diffstat (limited to 'src/plugins/openconfig')
-rw-r--r-- | src/plugins/openconfig/openconfig_interfaces.c | 62 | ||||
-rw-r--r-- | src/plugins/openconfig/openconfig_interfaces.h | 29 | ||||
-rw-r--r-- | src/plugins/openconfig/openconfig_local_routing.c | 61 | ||||
-rw-r--r-- | src/plugins/openconfig/openconfig_local_routing.h | 28 | ||||
-rw-r--r-- | src/plugins/openconfig/openconfig_plugin.c | 267 | ||||
-rw-r--r-- | src/plugins/openconfig/openconfig_plugin.h | 78 |
6 files changed, 128 insertions, 397 deletions
diff --git a/src/plugins/openconfig/openconfig_interfaces.c b/src/plugins/openconfig/openconfig_interfaces.c index e401e07..a1f66bb 100644 --- a/src/plugins/openconfig/openconfig_interfaces.c +++ b/src/plugins/openconfig/openconfig_interfaces.c @@ -24,6 +24,7 @@ #include <string.h> #include <sysrepo/xpath.h> #include <sysrepo/values.h> +#include <sysrepo.h> #define XPATH_SIZE 2000 @@ -209,7 +210,7 @@ int openconfig_interface_mod_cb( __attribute__((unused)) sr_notif_event_t event, __attribute__((unused)) void *private_ctx) { - SRP_LOG_INF("Module subscribe: %s", module_name); + SRP_LOG_DBG("Interface module subscribe: %s", module_name); return SR_ERR_OK; } @@ -876,3 +877,62 @@ int openconfig_interfaces_interfaces_interface_subinterfaces_subinterface_oc_ip_ return SR_ERR_OK; } +const xpath_t oc_interfaces_xpaths[OC_INTERFACES_SIZE] = { + { + .xpath = "openconfig-interfaces", + .method = MODULE, + .datastore = SR_DS_RUNNING, + .cb.mcb = openconfig_interface_mod_cb, + .private_ctx = NULL, + .priority = 0, + //.opts = SR_SUBSCR_EV_ENABLED | SR_SUBSCR_APPLY_ONLY + .opts = SR_SUBSCR_EV_ENABLED | SR_SUBSCR_APPLY_ONLY | SR_SUBSCR_CTX_REUSE + }, + { + .xpath = "/openconfig-interfaces:interfaces/interface/config", + .method = XPATH, + .datastore = SR_DS_RUNNING, + .cb.scb = openconfig_interfaces_interfaces_interface_config_cb, + .private_ctx = NULL, + .priority = 0, + //.opts = SR_SUBSCR_DEFAULT + .opts = SR_SUBSCR_CTX_REUSE + }, + { + .xpath = "/openconfig-interfaces:interfaces/interface/state", + .method = GETITEM, + .datastore = SR_DS_RUNNING, + .cb.gcb = openconfig_interfaces_interfaces_interface_state_cb, + .private_ctx = NULL, + .priority = 0, + .opts = SR_SUBSCR_CTX_REUSE + }, + { + .xpath = "/openconfig-interfaces:interfaces/interface/subinterfaces/subinterface/state", + .method = GETITEM, + .datastore = SR_DS_RUNNING, + .cb.gcb = openconfig_interfaces_interfaces_interface_subinterfaces_subinterface_state_cb, + .private_ctx = NULL, + .priority = 0, + .opts = SR_SUBSCR_CTX_REUSE + }, + { + .xpath = "/openconfig-interfaces:interfaces/interface/subinterfaces/subinterface/openconfig-if-ip:ipv4/openconfig-if-ip:addresses/openconfig-if-ip:address/openconfig-if-ip:config", + .method = XPATH, + .datastore = SR_DS_RUNNING, + .cb.scb = openconfig_interfaces_interfaces_interface_subinterfaces_subinterface_oc_ip_ipv4_oc_ip_addresses_oc_ip_address_oc_ip_config_cb, + .private_ctx = NULL, + .priority = 0, + //.opts = SR_SUBSCR_DEFAULT + .opts = SR_SUBSCR_CTX_REUSE + }, + { + .xpath = "/openconfig-interfaces:interfaces/interface/subinterfaces/subinterface/openconfig-if-ip:ipv4/openconfig-if-ip:addresses/openconfig-if-ip:address/openconfig-if-ip:state", + .method = GETITEM, + .datastore = SR_DS_RUNNING, + .cb.gcb = openconfig_interfaces_interfaces_interface_subinterfaces_subinterface_oc_ip_ipv4_oc_ip_addresses_oc_ip_address_oc_ip_state_cb, + .private_ctx = NULL, + .priority = 0, + .opts = SR_SUBSCR_CTX_REUSE + } +}; diff --git a/src/plugins/openconfig/openconfig_interfaces.h b/src/plugins/openconfig/openconfig_interfaces.h index df5e31c..88d5fe0 100644 --- a/src/plugins/openconfig/openconfig_interfaces.h +++ b/src/plugins/openconfig/openconfig_interfaces.h @@ -18,32 +18,9 @@ #ifndef __OPENCONFIG_INTERFACES_H__ #define __OPENCONFIG_INTERFACES_H__ -#include <sysrepo.h> - -int openconfig_interface_mod_cb(sr_session_ctx_t *session, - const char *module_name, - sr_notif_event_t event, - void *private_ctx); - -int openconfig_interfaces_interfaces_interface_config_cb( - sr_session_ctx_t *ds, const char *xpath, sr_notif_event_t event, - void *private_ctx); - -int openconfig_interfaces_interfaces_interface_subinterfaces_subinterface_oc_ip_ipv4_oc_ip_addresses_oc_ip_address_oc_ip_state_cb( - const char *xpath, sr_val_t **values, size_t *values_cnt, - uint64_t request_id, const char *original_xpath, void *private_ctx); - -int openconfig_interfaces_interfaces_interface_subinterfaces_subinterface_state_cb( - const char *xpath, sr_val_t **values, size_t *values_cnt, - uint64_t request_id, const char *original_xpath, void *private_ctx); - -int openconfig_interfaces_interfaces_interface_state_cb( - const char *xpath, sr_val_t **values, size_t *values_cnt, - uint64_t request_id, const char *original_xpath, void *private_ctx); - -int openconfig_interfaces_interfaces_interface_subinterfaces_subinterface_oc_ip_ipv4_oc_ip_addresses_oc_ip_address_oc_ip_config_cb( - sr_session_ctx_t *ds, const char *xpath, sr_notif_event_t event, - void *private_ctx); +#include "../sc_model.h" +#define OC_INTERFACES_SIZE 6 +extern const xpath_t oc_interfaces_xpaths[OC_INTERFACES_SIZE]; #endif /* __OPENCONFIG_INTERFACES_H__ */ diff --git a/src/plugins/openconfig/openconfig_local_routing.c b/src/plugins/openconfig/openconfig_local_routing.c index daf39cc..59574a2 100644 --- a/src/plugins/openconfig/openconfig_local_routing.c +++ b/src/plugins/openconfig/openconfig_local_routing.c @@ -22,6 +22,7 @@ #include <assert.h> #include <string.h> +#include <sysrepo.h> #include <sysrepo/xpath.h> #include <sysrepo/values.h> @@ -728,3 +729,63 @@ int openconfig_local_routing_local_routes_static_routes_static_next_hops_next_ho return next_hop_inner(true, xpath, values, values_cnt, request_id, private_ctx); } + +const xpath_t oc_local_routing_xpaths[OC_LROUTING_SIZE] = { + { + .xpath = "openconfig-local-routing", + .method = MODULE, + .datastore = SR_DS_RUNNING, + .cb.mcb = openconfig_local_routing_mod_cb, + .private_ctx = NULL, + .priority = 0, + //.opts = SR_SUBSCR_EV_ENABLED | SR_SUBSCR_APPLY_ONLY + .opts = SR_SUBSCR_EV_ENABLED | SR_SUBSCR_APPLY_ONLY | SR_SUBSCR_CTX_REUSE + }, + { + .xpath = "/openconfig-local-routing:local-routes/static-routes/static/next-hops/next-hop/config", + .method = XPATH, + .datastore = SR_DS_RUNNING, + .cb.scb = openconfig_local_routing_local_routes_static_routes_static_next_hops_next_hop_config_cb, + .private_ctx = NULL, + .priority = 0, + //.opts = SR_SUBSCR_DEFAULT + .opts = SR_SUBSCR_CTX_REUSE + }, + { + .xpath = "/openconfig-local-routing:local-routes/static-routes/static/next-hops/next-hop/interface-ref/config", + .method = XPATH, + .datastore = SR_DS_RUNNING, + .cb.scb = openconfig_local_routing_local_routes_static_routes_static_next_hops_next_hop_interface_ref_config_cb, + .private_ctx = NULL, + .priority = 0, + //.opts = SR_SUBSCR_DEFAULT + .opts = SR_SUBSCR_CTX_REUSE + }, + { + .xpath = "/openconfig-local-routing:local-routes/static-routes/static/state", + .method = GETITEM, + .datastore = SR_DS_RUNNING, + .cb.gcb = openconfig_local_routing_local_routes_static_routes_static_state_cb, + .private_ctx = NULL, + .priority = 0, + .opts = SR_SUBSCR_CTX_REUSE + }, + { + .xpath = "/openconfig-local-routing:local-routes/static-routes/static/next-hops/next-hop/state", + .method = GETITEM, + .datastore = SR_DS_RUNNING, + .cb.gcb = openconfig_local_routing_local_routes_static_routes_static_next_hops_next_hop_state_cb, + .private_ctx = NULL, + .priority = 0, + .opts = SR_SUBSCR_CTX_REUSE + }, + { + .xpath = "/openconfig-local-routing:local-routes/static-routes/static/next-hops/next-hop/interface-ref/state", + .method = GETITEM, + .datastore = SR_DS_RUNNING, + .cb.gcb = openconfig_local_routing_local_routes_static_routes_static_next_hops_next_hop_interface_ref_state_cb, + .private_ctx = NULL, + .priority = 0, + .opts = SR_SUBSCR_CTX_REUSE + }, +}; diff --git a/src/plugins/openconfig/openconfig_local_routing.h b/src/plugins/openconfig/openconfig_local_routing.h index 4cd2966..13d2982 100644 --- a/src/plugins/openconfig/openconfig_local_routing.h +++ b/src/plugins/openconfig/openconfig_local_routing.h @@ -17,31 +17,9 @@ #ifndef __OPENCONFIG_LOCAL_ROUTING_H__ #define __OPENCONFIG_LOCAL_ROUTING_H__ -#include <sysrepo.h> +#include "../sc_model.h" -int openconfig_local_routing_mod_cb(sr_session_ctx_t *session, - const char *module_name, - sr_notif_event_t event, - void *private_ctx); - -int openconfig_local_routing_local_routes_static_routes_static_next_hops_next_hop_config_cb( - sr_session_ctx_t *ds, const char *xpath, sr_notif_event_t event, - void *private_ctx); - -int openconfig_local_routing_local_routes_static_routes_static_next_hops_next_hop_interface_ref_config_cb( - sr_session_ctx_t *ds, const char *xpath, sr_notif_event_t event, - void *private_ctx); - -int openconfig_local_routing_local_routes_static_routes_static_state_cb( - const char *xpath, sr_val_t **values, size_t *values_cnt, - uint64_t request_id, const char *original_xpath, void *private_ctx); - -int openconfig_local_routing_local_routes_static_routes_static_next_hops_next_hop_state_cb( - const char *xpath, sr_val_t **values, size_t *values_cnt, - uint64_t request_id, const char *original_xpath, void *private_ctx); - -int openconfig_local_routing_local_routes_static_routes_static_next_hops_next_hop_interface_ref_state_cb( - const char *xpath, sr_val_t **values, size_t *values_cnt, - uint64_t request_id, const char *original_xpath, void *private_ctx); +#define OC_LROUTING_SIZE 6 +extern const xpath_t oc_local_routing_xpaths[OC_LROUTING_SIZE]; #endif /* __OPENCONFIG_LOCAL_ROUTING_H__ */ diff --git a/src/plugins/openconfig/openconfig_plugin.c b/src/plugins/openconfig/openconfig_plugin.c deleted file mode 100644 index fbcd396..0000000 --- a/src/plugins/openconfig/openconfig_plugin.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright (c) 2018 PANTHEON.tech. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "openconfig_plugin.h" -#include "sys_util.h" -#include "openconfig_interfaces.h" -#include "openconfig_local_routing.h" -#include "sc_vpp_comm.h" - -#include <assert.h> -#include <string.h> -#include <sysrepo/xpath.h> -#include <sysrepo/values.h> - -#define XPATH_SIZE 2000 - -static struct _sys_repo_call sysrepo_callback[] = { - { - .xpath = "openconfig-interfaces", - .method = MODULE, - .datastore = RUNNING, - .cb.mcb = openconfig_interface_mod_cb, - .private_ctx = NULL, - .priority = 0, - .opts = SR_SUBSCR_EV_ENABLED | SR_SUBSCR_APPLY_ONLY - }, - { - .xpath = "openconfig-local-routing", - .method = MODULE, - .datastore = RUNNING, - .cb.mcb = openconfig_local_routing_mod_cb, - .private_ctx = NULL, - .priority = 0, - .opts = SR_SUBSCR_EV_ENABLED | SR_SUBSCR_APPLY_ONLY - }, - { - .xpath = "/openconfig-interfaces:interfaces/interface/config", - .method = XPATH, - .datastore = RUNNING, - .cb.scb = openconfig_interfaces_interfaces_interface_config_cb, - .private_ctx = NULL, - .priority = 0, - .opts = SR_SUBSCR_DEFAULT - }, - { - .xpath = "/openconfig-interfaces:interfaces/interface/state", - .method = GETITEM, - .datastore = RUNNING, - .cb.gcb = openconfig_interfaces_interfaces_interface_state_cb, - .private_ctx = NULL, - .priority = 0, - .opts = SR_SUBSCR_CTX_REUSE - }, - { - .xpath = "/openconfig-interfaces:interfaces/interface/subinterfaces/subinterface/state", - .method = GETITEM, - .datastore = RUNNING, - .cb.gcb = openconfig_interfaces_interfaces_interface_subinterfaces_subinterface_state_cb, - .private_ctx = NULL, - .priority = 0, - .opts = SR_SUBSCR_CTX_REUSE - }, - { - .xpath = "/openconfig-interfaces:interfaces/interface/subinterfaces/subinterface/openconfig-if-ip:ipv4/openconfig-if-ip:addresses/openconfig-if-ip:address/openconfig-if-ip:config", - .method = XPATH, - .datastore = RUNNING, - .cb.scb = openconfig_interfaces_interfaces_interface_subinterfaces_subinterface_oc_ip_ipv4_oc_ip_addresses_oc_ip_address_oc_ip_config_cb, - .private_ctx = NULL, - .priority = 0, - .opts = SR_SUBSCR_DEFAULT - }, - { - .xpath = "/openconfig-interfaces:interfaces/interface/subinterfaces/subinterface/openconfig-if-ip:ipv4/openconfig-if-ip:addresses/openconfig-if-ip:address/openconfig-if-ip:state", - .method = GETITEM, - .datastore = RUNNING, - .cb.gcb = openconfig_interfaces_interfaces_interface_subinterfaces_subinterface_oc_ip_ipv4_oc_ip_addresses_oc_ip_address_oc_ip_state_cb, - .private_ctx = NULL, - .priority = 0, - .opts = SR_SUBSCR_CTX_REUSE - }, - { - .xpath = "/openconfig-local-routing:local-routes/static-routes/static/next-hops/next-hop/config", - .method = XPATH, - .datastore = RUNNING, - .cb.scb = openconfig_local_routing_local_routes_static_routes_static_next_hops_next_hop_config_cb, - .private_ctx = NULL, - .priority = 0, - .opts = SR_SUBSCR_DEFAULT - }, - { - .xpath = "/openconfig-local-routing:local-routes/static-routes/static/next-hops/next-hop/interface-ref/config", - .method = XPATH, - .datastore = RUNNING, - .cb.scb = openconfig_local_routing_local_routes_static_routes_static_next_hops_next_hop_interface_ref_config_cb, - .private_ctx = NULL, - .priority = 0, - .opts = SR_SUBSCR_DEFAULT - }, - { - .xpath = "/openconfig-local-routing:local-routes/static-routes/static/state", - .method = GETITEM, - .datastore = RUNNING, - .cb.gcb = openconfig_local_routing_local_routes_static_routes_static_state_cb, - .private_ctx = NULL, - .priority = 0, - .opts = SR_SUBSCR_CTX_REUSE - }, - { - .xpath = "/openconfig-local-routing:local-routes/static-routes/static/next-hops/next-hop/state", - .method = GETITEM, - .datastore = RUNNING, - .cb.gcb = openconfig_local_routing_local_routes_static_routes_static_next_hops_next_hop_state_cb, - .private_ctx = NULL, - .priority = 0, - .opts = SR_SUBSCR_CTX_REUSE - }, - { - .xpath = "/openconfig-local-routing:local-routes/static-routes/static/next-hops/next-hop/interface-ref/state", - .method = GETITEM, - .datastore = RUNNING, - .cb.gcb = openconfig_local_routing_local_routes_static_routes_static_next_hops_next_hop_interface_ref_state_cb, - .private_ctx = NULL, - .priority = 0, - .opts = SR_SUBSCR_CTX_REUSE - }, -}; - -static inline void -append(plugin_subcscription_t **list, plugin_subcscription_t *new) -{ - plugin_subcscription_t **tmp = list; - - while (*tmp) - tmp = &(*tmp)->next; - - *tmp = new; -} - -static int sys_repo_subscribe(plugin_main_t *plugin_main, sr_session_ctx_t *ds, - struct _sys_repo_call *call) -{ - plugin_subcscription_t *end, *new; - int rc; - - new = calloc(sizeof(plugin_subcscription_t), 1); - if (new == NULL) - return SR_ERR_NOMEM; - new->datastore = call->datastore; - - if (call->method == MODULE) { - rc = sr_module_change_subscribe(ds, call->xpath, call->cb.mcb, - call->private_ctx, call->priority, - call->opts, - &(new->sr_subscription_ctx)); - if (SR_ERR_OK != rc) - goto error; - } else if (call->method == XPATH) { - rc = sr_subtree_change_subscribe(ds, call->xpath, call->cb.scb, - call->private_ctx, call->priority, - call->opts, - &(new->sr_subscription_ctx)); - if (SR_ERR_OK != rc) - goto error; - } else if (call->method == GETITEM) { - rc = sr_dp_get_items_subscribe(ds, call->xpath, call->cb.gcb, - call->private_ctx, call->opts, - &(new->sr_subscription_ctx)); - if (SR_ERR_OK != rc) - goto error; - } else if (call->method == RPC) { - rc = sr_rpc_subscribe(ds, call->xpath, call->cb.rcb, - call->private_ctx, call->opts, - &(new->sr_subscription_ctx)); - if (SR_ERR_OK != rc) - goto error; - } - - SRP_LOG_DBG("Subscribed to xpath: %s", call->xpath); - - //add new subscription to the end of plugin subscription Linked List - append(&(plugin_main->plugin_subcscription), new); - - return SR_ERR_OK; - -error: - SRP_LOG_ERR("Error subscribed to RPC: %s", call->xpath); - return rc; -} - -int openconfig_register_subscribe(plugin_main_t* plugin_main) -{ - int rc = 0; - uint32_t i = 0; - sr_session_ctx_t *datastore = NULL; - - ARG_CHECK(-1, plugin_main); - - for (i = 0; i < ARRAY_SIZE(sysrepo_callback); i++) { - if (STARTUP == sysrepo_callback[i].datastore) { - datastore = plugin_main->ds_startup; - } else if (RUNNING == sysrepo_callback[i].datastore) { - datastore = plugin_main->ds_running; - } else { - SRP_LOG_ERR_MSG("Error: wrong database type"); - return -1; - } - - rc = sys_repo_subscribe(plugin_main, datastore, &sysrepo_callback[i]); - if (SR_ERR_OK != rc) { - SRP_LOG_ERR("Error: subscribing to subtree change, xpath: %s", - sysrepo_callback[i].xpath); -// return -1; - } - } - - return 0; -} - -void openconfig_unsubscribe(plugin_main_t* plugin_main) -{ - plugin_subcscription_t *plugin_subcscription, *tmp; - - if (plugin_main->plugin_subcscription == NULL) - return; - - plugin_subcscription = plugin_main->plugin_subcscription; - do { - tmp = plugin_subcscription; - plugin_subcscription = plugin_subcscription->next; - - if (tmp->datastore == STARTUP) - sr_unsubscribe(plugin_main->ds_startup, tmp->sr_subscription_ctx); - else if (tmp->datastore == RUNNING) - sr_unsubscribe(plugin_main->ds_running, tmp->sr_subscription_ctx); - - free(tmp); - } while (plugin_subcscription != NULL); -} - -plugin_main_t plugin_main; - -int openconfig_plugin_init(sr_session_ctx_t* session) -{ - memset((void*) &plugin_main, 0, sizeof(plugin_main)); - - plugin_main.ds_running = session; - - openconfig_register_subscribe(&plugin_main); -} - -void openconfig_plugin_cleanup() -{ - openconfig_unsubscribe(&plugin_main); -} diff --git a/src/plugins/openconfig/openconfig_plugin.h b/src/plugins/openconfig/openconfig_plugin.h deleted file mode 100644 index 714ae7d..0000000 --- a/src/plugins/openconfig/openconfig_plugin.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2018 PANTHEON.tech. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __SWEETCOMB_OPENCONFIG_PLUGIN__ -#define __SWEETCOMB_OPENCONFIG_PLUGIN__ - -#include <stdlib.h> -#include <sysrepo.h> - -#define ARRAY_SIZE(X) (sizeof(X) / sizeof(*X)) - -typedef enum { - MODULE, - XPATH, - GETITEM, - RPC, -} method_e; - -typedef enum { - STARTUP, - RUNNING, -} datastore_e; - -typedef struct _plugin_subcscription_t{ - datastore_e datastore; - sr_subscription_ctx_t *sr_subscription_ctx; - struct _plugin_subcscription_t *next; -} plugin_subcscription_t; - -typedef struct { - sr_conn_ctx_t *sr_conn_ctx; - sr_session_ctx_t *ds_startup; - sr_session_ctx_t *ds_running; - //sr_session_ctx_t *ds_candidate; - plugin_subcscription_t *plugin_subcscription; -} plugin_main_t; - -struct _sys_repo_call { - char *xpath; - method_e method; - datastore_e datastore; - union { - sr_module_change_cb mcb; - sr_subtree_change_cb scb; - sr_dp_get_items_cb gcb; - sr_rpc_cb rcb; - } cb; - void *private_ctx; - uint32_t priority; - sr_subscr_options_t opts; -}; - -int openconfig_register_subscribe(plugin_main_t *plugin_main); -void openconfig_unsubscribe(plugin_main_t *plugin_main); - -//FIXME: -// This solution is not good and should be rewrite. -// But first we must discuss the architecture of sweetcomb and how we should -// register the new YANGS modules. -// This function here is only for test. -int openconfig_plugin_init(sr_session_ctx_t *session); -void openconfig_plugin_cleanup(); - - -#endif /* __SWEETCOMB_OPENCONFIG_PLUGIN__ */ |