blob: 82e9e3e642cea7bdbdb17892ba6f49415123872f [file] [log] [blame]
/*
* Copyright 2022-present Open Networking Foundation
* 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 <libyang/libyang.h>
#include <sysrepo.h>
#include <sysrepo/xpath.h>
//Needed to handle callback functions with a working data type in CGO
typedef void (*function)(); // https://golang.org/issue/19835
//CGO can't see raw structs
typedef struct lyd_node lyd_node;
typedef struct ly_ctx ly_ctx;
//Used to define the datastore edit mode
const char* mergeOperation = "merge";
//Provides data for the schema-mount extension
LY_ERR mountpoint_ext_data_clb(
const struct lysc_ext_instance *ext,
void *user_data,
void **ext_data,
ly_bool *ext_data_free)
{
*ext_data = (lyd_node*) user_data;
*ext_data_free = 0;
return LY_SUCCESS;
}
// Exported by callbacks.go
sr_error_t get_devices_cb(sr_session_ctx_t *session, lyd_node **parent);
sr_error_t get_services_cb(sr_session_ctx_t *session, lyd_node **parent);
sr_error_t get_vlans_cb(sr_session_ctx_t *session, lyd_node **parent);
sr_error_t get_bandwidth_profiles_cb(sr_session_ctx_t *session, lyd_node **parent);
sr_error_t edit_service_profiles_cb(sr_session_ctx_t *session, sr_session_ctx_t *runningSession, sr_event_t event);
sr_error_t edit_vlans_cb(sr_session_ctx_t *session, sr_event_t event);
//The wrapper functions are needed because CGO cannot express some keywords
//such as "const", and thus it can't match sysrepo's callback signature
int get_devices_cb_wrapper(
sr_session_ctx_t *session,
uint32_t subscription_id,
const char *module_name,
const char *path,
const char *request_xpath,
uint32_t request_id,
struct lyd_node **parent,
void *private_data)
{
return get_devices_cb(session, parent);
}
int get_services_cb_wrapper(
sr_session_ctx_t *session,
uint32_t subscription_id,
const char *module_name,
const char *path,
const char *request_xpath,
uint32_t request_id,
struct lyd_node **parent,
void *private_data)
{
return get_services_cb(session, parent);
}
int get_vlans_cb_wrapper(
sr_session_ctx_t *session,
uint32_t subscription_id,
const char *module_name,
const char *path,
const char *request_xpath,
uint32_t request_id,
struct lyd_node **parent,
void *private_data)
{
return get_vlans_cb(session, parent);
}
int get_bandwidth_profiles_cb_wrapper(
sr_session_ctx_t *session,
uint32_t subscription_id,
const char *module_name,
const char *path,
const char *request_xpath,
uint32_t request_id,
struct lyd_node **parent,
void *private_data)
{
return get_bandwidth_profiles_cb(session, parent);
}
int edit_service_profiles_cb_wrapper(
sr_session_ctx_t *session,
uint32_t subscription_id,
const char *module_name,
const char *path,
sr_event_t event,
uint32_t request_id,
void *private_data)
{
sr_session_ctx_t* runningSession = (sr_session_ctx_t*)private_data;
return edit_service_profiles_cb(session, runningSession, event);
}
int edit_vlans_cb_wrapper(
sr_session_ctx_t *session,
uint32_t subscription_id,
const char *module_name,
const char *path,
sr_event_t event,
uint32_t request_id,
void *private_data)
{
return edit_vlans_cb(session, event);
}