mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-12 07:26:08 +00:00
ripd: split northbound callbacks into multiple files
Rearrange the ripd northbound callbacks as following: * rip_nb.h: prototypes of all northbound callbacks. * rip_nb.c: definition of all northbound callbacks and their associated YANG data paths. * rip_nb_config.c: implementation of YANG configuration nodes. * rip_nb_state.c: implementation of YANG state nodes. * rip_nb_rpcs.c: implementation of YANG RPCs. * rip_nb_notifications.c: implementation of YANG notifications. This should help to keep to code more organized and easier to maintain. No behavior changes intended. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
This commit is contained in:
parent
2a1c520e9f
commit
f80ec39e52
@ -29,7 +29,7 @@
|
||||
#include "libfrr.h"
|
||||
|
||||
#include "ripd/ripd.h"
|
||||
#include "ripd/rip_cli.h"
|
||||
#include "ripd/rip_nb.h"
|
||||
#ifndef VTYSH_EXTRACT_PL
|
||||
#include "ripd/rip_cli_clippy.c"
|
||||
#endif
|
||||
|
@ -1,86 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
|
||||
* Copyright (C) 2018 NetDEF, Inc.
|
||||
* Renato Westphal
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; see the file COPYING; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef _FRR_RIP_CLI_H_
|
||||
#define _FRR_RIP_CLI_H_
|
||||
|
||||
extern void cli_show_router_rip(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_allow_ecmp(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_default_information_originate(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_default_metric(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_distance(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_distance_source(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_neighbor(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_network_prefix(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_network_interface(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_offset_list(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_passive_default(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_passive_interface(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_non_passive_interface(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_redistribute(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_route(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_timers(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_rip_version(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_ip_rip_split_horizon(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_ip_rip_v2_broadcast(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_ip_rip_receive_version(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_ip_rip_send_version(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_ip_rip_authentication_scheme(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_ip_rip_authentication_string(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
extern void cli_show_ip_rip_authentication_key_chain(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
|
||||
#endif /* _FRR_RIP_CLI_H_ */
|
@ -38,6 +38,7 @@
|
||||
#include "libfrr.h"
|
||||
|
||||
#include "ripd/ripd.h"
|
||||
#include "ripd/rip_nb.h"
|
||||
#include "ripd/rip_errors.h"
|
||||
|
||||
/* ripd options. */
|
||||
|
369
ripd/rip_nb.c
Normal file
369
ripd/rip_nb.c
Normal file
@ -0,0 +1,369 @@
|
||||
/*
|
||||
* Copyright (C) 2018 NetDEF, Inc.
|
||||
* Renato Westphal
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; see the file COPYING; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <zebra.h>
|
||||
|
||||
#include "northbound.h"
|
||||
#include "libfrr.h"
|
||||
|
||||
#include "ripd/rip_nb.h"
|
||||
|
||||
/* clang-format off */
|
||||
const struct frr_yang_module_info frr_ripd_info = {
|
||||
.name = "frr-ripd",
|
||||
.nodes = {
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_router_rip,
|
||||
.create = ripd_instance_create,
|
||||
.destroy = ripd_instance_destroy,
|
||||
.get_keys = ripd_instance_get_keys,
|
||||
.get_next = ripd_instance_get_next,
|
||||
.lookup_entry = ripd_instance_lookup_entry,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/allow-ecmp",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_allow_ecmp,
|
||||
.modify = ripd_instance_allow_ecmp_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/default-information-originate",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_default_information_originate,
|
||||
.modify = ripd_instance_default_information_originate_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/default-metric",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_default_metric,
|
||||
.modify = ripd_instance_default_metric_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/distance/default",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_distance,
|
||||
.modify = ripd_instance_distance_default_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/distance/source",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_distance_source,
|
||||
.create = ripd_instance_distance_source_create,
|
||||
.destroy = ripd_instance_distance_source_destroy,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/distance/source/distance",
|
||||
.cbs = {
|
||||
.modify = ripd_instance_distance_source_distance_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/distance/source/access-list",
|
||||
.cbs = {
|
||||
.destroy = ripd_instance_distance_source_access_list_destroy,
|
||||
.modify = ripd_instance_distance_source_access_list_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/explicit-neighbor",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_neighbor,
|
||||
.create = ripd_instance_explicit_neighbor_create,
|
||||
.destroy = ripd_instance_explicit_neighbor_destroy,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/network",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_network_prefix,
|
||||
.create = ripd_instance_network_create,
|
||||
.destroy = ripd_instance_network_destroy,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/interface",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_network_interface,
|
||||
.create = ripd_instance_interface_create,
|
||||
.destroy = ripd_instance_interface_destroy,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/offset-list",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_offset_list,
|
||||
.create = ripd_instance_offset_list_create,
|
||||
.destroy = ripd_instance_offset_list_destroy,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/offset-list/access-list",
|
||||
.cbs = {
|
||||
.modify = ripd_instance_offset_list_access_list_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/offset-list/metric",
|
||||
.cbs = {
|
||||
.modify = ripd_instance_offset_list_metric_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/passive-default",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_passive_default,
|
||||
.modify = ripd_instance_passive_default_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/passive-interface",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_passive_interface,
|
||||
.create = ripd_instance_passive_interface_create,
|
||||
.destroy = ripd_instance_passive_interface_destroy,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/non-passive-interface",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_non_passive_interface,
|
||||
.create = ripd_instance_non_passive_interface_create,
|
||||
.destroy = ripd_instance_non_passive_interface_destroy,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/redistribute",
|
||||
.cbs = {
|
||||
.apply_finish = ripd_instance_redistribute_apply_finish,
|
||||
.cli_show = cli_show_rip_redistribute,
|
||||
.create = ripd_instance_redistribute_create,
|
||||
.destroy = ripd_instance_redistribute_destroy,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/redistribute/route-map",
|
||||
.cbs = {
|
||||
.destroy = ripd_instance_redistribute_route_map_destroy,
|
||||
.modify = ripd_instance_redistribute_route_map_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/redistribute/metric",
|
||||
.cbs = {
|
||||
.destroy = ripd_instance_redistribute_metric_destroy,
|
||||
.modify = ripd_instance_redistribute_metric_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/static-route",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_route,
|
||||
.create = ripd_instance_static_route_create,
|
||||
.destroy = ripd_instance_static_route_destroy,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/timers",
|
||||
.cbs = {
|
||||
.apply_finish = ripd_instance_timers_apply_finish,
|
||||
.cli_show = cli_show_rip_timers,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/timers/flush-interval",
|
||||
.cbs = {
|
||||
.modify = ripd_instance_timers_flush_interval_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/timers/holddown-interval",
|
||||
.cbs = {
|
||||
.modify = ripd_instance_timers_holddown_interval_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/timers/update-interval",
|
||||
.cbs = {
|
||||
.modify = ripd_instance_timers_update_interval_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/version",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_rip_version,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/version/receive",
|
||||
.cbs = {
|
||||
.modify = ripd_instance_version_receive_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/version/send",
|
||||
.cbs = {
|
||||
.modify = ripd_instance_version_send_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-interface:lib/interface/frr-ripd:rip/split-horizon",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_ip_rip_split_horizon,
|
||||
.modify = lib_interface_rip_split_horizon_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-interface:lib/interface/frr-ripd:rip/v2-broadcast",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_ip_rip_v2_broadcast,
|
||||
.modify = lib_interface_rip_v2_broadcast_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-interface:lib/interface/frr-ripd:rip/version-receive",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_ip_rip_receive_version,
|
||||
.modify = lib_interface_rip_version_receive_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-interface:lib/interface/frr-ripd:rip/version-send",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_ip_rip_send_version,
|
||||
.modify = lib_interface_rip_version_send_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-interface:lib/interface/frr-ripd:rip/authentication-scheme",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_ip_rip_authentication_scheme,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-interface:lib/interface/frr-ripd:rip/authentication-scheme/mode",
|
||||
.cbs = {
|
||||
.modify = lib_interface_rip_authentication_scheme_mode_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-interface:lib/interface/frr-ripd:rip/authentication-scheme/md5-auth-length",
|
||||
.cbs = {
|
||||
.destroy = lib_interface_rip_authentication_scheme_md5_auth_length_destroy,
|
||||
.modify = lib_interface_rip_authentication_scheme_md5_auth_length_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-interface:lib/interface/frr-ripd:rip/authentication-password",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_ip_rip_authentication_string,
|
||||
.destroy = lib_interface_rip_authentication_password_destroy,
|
||||
.modify = lib_interface_rip_authentication_password_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-interface:lib/interface/frr-ripd:rip/authentication-key-chain",
|
||||
.cbs = {
|
||||
.cli_show = cli_show_ip_rip_authentication_key_chain,
|
||||
.destroy = lib_interface_rip_authentication_key_chain_destroy,
|
||||
.modify = lib_interface_rip_authentication_key_chain_modify,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/state/neighbors/neighbor",
|
||||
.cbs = {
|
||||
.get_keys = ripd_instance_state_neighbors_neighbor_get_keys,
|
||||
.get_next = ripd_instance_state_neighbors_neighbor_get_next,
|
||||
.lookup_entry = ripd_instance_state_neighbors_neighbor_lookup_entry,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/state/neighbors/neighbor/address",
|
||||
.cbs = {
|
||||
.get_elem = ripd_instance_state_neighbors_neighbor_address_get_elem,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/state/neighbors/neighbor/last-update",
|
||||
.cbs = {
|
||||
.get_elem = ripd_instance_state_neighbors_neighbor_last_update_get_elem,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/state/neighbors/neighbor/bad-packets-rcvd",
|
||||
.cbs = {
|
||||
.get_elem = ripd_instance_state_neighbors_neighbor_bad_packets_rcvd_get_elem,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/state/neighbors/neighbor/bad-routes-rcvd",
|
||||
.cbs = {
|
||||
.get_elem = ripd_instance_state_neighbors_neighbor_bad_routes_rcvd_get_elem,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/state/routes/route",
|
||||
.cbs = {
|
||||
.get_keys = ripd_instance_state_routes_route_get_keys,
|
||||
.get_next = ripd_instance_state_routes_route_get_next,
|
||||
.lookup_entry = ripd_instance_state_routes_route_lookup_entry,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/state/routes/route/prefix",
|
||||
.cbs = {
|
||||
.get_elem = ripd_instance_state_routes_route_prefix_get_elem,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/state/routes/route/next-hop",
|
||||
.cbs = {
|
||||
.get_elem = ripd_instance_state_routes_route_next_hop_get_elem,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/state/routes/route/interface",
|
||||
.cbs = {
|
||||
.get_elem = ripd_instance_state_routes_route_interface_get_elem,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:ripd/instance/state/routes/route/metric",
|
||||
.cbs = {
|
||||
.get_elem = ripd_instance_state_routes_route_metric_get_elem,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = "/frr-ripd:clear-rip-route",
|
||||
.cbs = {
|
||||
.rpc = clear_rip_route_rpc,
|
||||
},
|
||||
},
|
||||
{
|
||||
.xpath = NULL,
|
||||
},
|
||||
}
|
||||
};
|
265
ripd/rip_nb.h
Normal file
265
ripd/rip_nb.h
Normal file
@ -0,0 +1,265 @@
|
||||
/*
|
||||
* Copyright (C) 2018 NetDEF, Inc.
|
||||
* Renato Westphal
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; see the file COPYING; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef _FRR_RIP_NB_H_
|
||||
#define _FRR_RIP_NB_H_
|
||||
|
||||
extern const struct frr_yang_module_info frr_ripd_info;
|
||||
|
||||
/* Mandatory callbacks. */
|
||||
int ripd_instance_create(enum nb_event event, const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_destroy(enum nb_event event, const struct lyd_node *dnode);
|
||||
const void *ripd_instance_get_next(const void *parent_list_entry,
|
||||
const void *list_entry);
|
||||
int ripd_instance_get_keys(const void *list_entry, struct yang_list_keys *keys);
|
||||
const void *ripd_instance_lookup_entry(const void *parent_list_entry,
|
||||
const struct yang_list_keys *keys);
|
||||
int ripd_instance_allow_ecmp_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_default_information_originate_modify(
|
||||
enum nb_event event, const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_default_metric_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_distance_default_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_distance_source_create(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_distance_source_destroy(enum nb_event event,
|
||||
const struct lyd_node *dnode);
|
||||
int ripd_instance_distance_source_distance_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_distance_source_access_list_modify(
|
||||
enum nb_event event, const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_distance_source_access_list_destroy(
|
||||
enum nb_event event, const struct lyd_node *dnode);
|
||||
int ripd_instance_explicit_neighbor_create(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_explicit_neighbor_destroy(enum nb_event event,
|
||||
const struct lyd_node *dnode);
|
||||
int ripd_instance_network_create(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_network_destroy(enum nb_event event,
|
||||
const struct lyd_node *dnode);
|
||||
int ripd_instance_interface_create(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_interface_destroy(enum nb_event event,
|
||||
const struct lyd_node *dnode);
|
||||
int ripd_instance_offset_list_create(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_offset_list_destroy(enum nb_event event,
|
||||
const struct lyd_node *dnode);
|
||||
int ripd_instance_offset_list_access_list_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_offset_list_metric_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_passive_default_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_passive_interface_create(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_passive_interface_destroy(enum nb_event event,
|
||||
const struct lyd_node *dnode);
|
||||
int ripd_instance_non_passive_interface_create(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_non_passive_interface_destroy(enum nb_event event,
|
||||
const struct lyd_node *dnode);
|
||||
int ripd_instance_redistribute_create(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_redistribute_destroy(enum nb_event event,
|
||||
const struct lyd_node *dnode);
|
||||
int ripd_instance_redistribute_route_map_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_redistribute_route_map_destroy(enum nb_event event,
|
||||
const struct lyd_node *dnode);
|
||||
int ripd_instance_redistribute_metric_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_redistribute_metric_destroy(enum nb_event event,
|
||||
const struct lyd_node *dnode);
|
||||
int ripd_instance_static_route_create(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_static_route_destroy(enum nb_event event,
|
||||
const struct lyd_node *dnode);
|
||||
int ripd_instance_timers_flush_interval_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_timers_holddown_interval_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_timers_update_interval_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_version_receive_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int ripd_instance_version_send_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
const void *
|
||||
ripd_instance_state_neighbors_neighbor_get_next(const void *parent_list_entry,
|
||||
const void *list_entry);
|
||||
int ripd_instance_state_neighbors_neighbor_get_keys(
|
||||
const void *list_entry, struct yang_list_keys *keys);
|
||||
const void *ripd_instance_state_neighbors_neighbor_lookup_entry(
|
||||
const void *parent_list_entry, const struct yang_list_keys *keys);
|
||||
struct yang_data *
|
||||
ripd_instance_state_neighbors_neighbor_address_get_elem(const char *xpath,
|
||||
const void *list_entry);
|
||||
struct yang_data *ripd_instance_state_neighbors_neighbor_last_update_get_elem(
|
||||
const char *xpath, const void *list_entry);
|
||||
struct yang_data *
|
||||
ripd_instance_state_neighbors_neighbor_bad_packets_rcvd_get_elem(
|
||||
const char *xpath, const void *list_entry);
|
||||
struct yang_data *
|
||||
ripd_instance_state_neighbors_neighbor_bad_routes_rcvd_get_elem(
|
||||
const char *xpath, const void *list_entry);
|
||||
const void *
|
||||
ripd_instance_state_routes_route_get_next(const void *parent_list_entry,
|
||||
const void *list_entry);
|
||||
int ripd_instance_state_routes_route_get_keys(const void *list_entry,
|
||||
struct yang_list_keys *keys);
|
||||
const void *ripd_instance_state_routes_route_lookup_entry(
|
||||
const void *parent_list_entry, const struct yang_list_keys *keys);
|
||||
struct yang_data *
|
||||
ripd_instance_state_routes_route_prefix_get_elem(const char *xpath,
|
||||
const void *list_entry);
|
||||
struct yang_data *
|
||||
ripd_instance_state_routes_route_next_hop_get_elem(const char *xpath,
|
||||
const void *list_entry);
|
||||
struct yang_data *
|
||||
ripd_instance_state_routes_route_interface_get_elem(const char *xpath,
|
||||
const void *list_entry);
|
||||
struct yang_data *
|
||||
ripd_instance_state_routes_route_metric_get_elem(const char *xpath,
|
||||
const void *list_entry);
|
||||
int clear_rip_route_rpc(const char *xpath, const struct list *input,
|
||||
struct list *output);
|
||||
int lib_interface_rip_split_horizon_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int lib_interface_rip_v2_broadcast_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int lib_interface_rip_version_receive_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int lib_interface_rip_version_send_modify(enum nb_event event,
|
||||
const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int lib_interface_rip_authentication_scheme_mode_modify(
|
||||
enum nb_event event, const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int lib_interface_rip_authentication_scheme_md5_auth_length_modify(
|
||||
enum nb_event event, const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int lib_interface_rip_authentication_scheme_md5_auth_length_destroy(
|
||||
enum nb_event event, const struct lyd_node *dnode);
|
||||
int lib_interface_rip_authentication_password_modify(
|
||||
enum nb_event event, const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int lib_interface_rip_authentication_password_destroy(
|
||||
enum nb_event event, const struct lyd_node *dnode);
|
||||
int lib_interface_rip_authentication_key_chain_modify(
|
||||
enum nb_event event, const struct lyd_node *dnode,
|
||||
union nb_resource *resource);
|
||||
int lib_interface_rip_authentication_key_chain_destroy(
|
||||
enum nb_event event, const struct lyd_node *dnode);
|
||||
|
||||
/* Optional 'apply_finish' callbacks. */
|
||||
void ripd_instance_redistribute_apply_finish(const struct lyd_node *dnode);
|
||||
void ripd_instance_timers_apply_finish(const struct lyd_node *dnode);
|
||||
|
||||
/* Optional 'cli_show' callbacks. */
|
||||
void cli_show_router_rip(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_allow_ecmp(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_default_information_originate(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_default_metric(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_distance(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_distance_source(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_neighbor(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_network_prefix(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_network_interface(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_offset_list(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_passive_default(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_passive_interface(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_non_passive_interface(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_redistribute(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_route(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_timers(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_rip_version(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_ip_rip_split_horizon(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_ip_rip_v2_broadcast(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_ip_rip_receive_version(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_ip_rip_send_version(struct vty *vty, struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_ip_rip_authentication_scheme(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_ip_rip_authentication_string(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
void cli_show_ip_rip_authentication_key_chain(struct vty *vty,
|
||||
struct lyd_node *dnode,
|
||||
bool show_defaults);
|
||||
|
||||
/* Notifications. */
|
||||
extern void ripd_notif_send_auth_type_failure(const char *ifname);
|
||||
extern void ripd_notif_send_auth_failure(const char *ifname);
|
||||
|
||||
#endif /* _FRR_RIP_NB_H_ */
|
1099
ripd/rip_nb_config.c
Normal file
1099
ripd/rip_nb_config.c
Normal file
File diff suppressed because it is too large
Load Diff
73
ripd/rip_nb_notifications.c
Normal file
73
ripd/rip_nb_notifications.c
Normal file
@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright (C) 2018 NetDEF, Inc.
|
||||
* Renato Westphal
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; see the file COPYING; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <zebra.h>
|
||||
|
||||
#include "if.h"
|
||||
#include "vrf.h"
|
||||
#include "log.h"
|
||||
#include "prefix.h"
|
||||
#include "table.h"
|
||||
#include "command.h"
|
||||
#include "routemap.h"
|
||||
#include "northbound.h"
|
||||
#include "libfrr.h"
|
||||
|
||||
#include "ripd/ripd.h"
|
||||
#include "ripd/rip_nb.h"
|
||||
#include "ripd/rip_debug.h"
|
||||
#include "ripd/rip_interface.h"
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:authentication-type-failure
|
||||
*/
|
||||
void ripd_notif_send_auth_type_failure(const char *ifname)
|
||||
{
|
||||
const char *xpath = "/frr-ripd:authentication-type-failure";
|
||||
struct list *arguments;
|
||||
char xpath_arg[XPATH_MAXLEN];
|
||||
struct yang_data *data;
|
||||
|
||||
arguments = yang_data_list_new();
|
||||
|
||||
snprintf(xpath_arg, sizeof(xpath_arg), "%s/interface-name", xpath);
|
||||
data = yang_data_new_string(xpath_arg, ifname);
|
||||
listnode_add(arguments, data);
|
||||
|
||||
nb_notification_send(xpath, arguments);
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:authentication-failure
|
||||
*/
|
||||
void ripd_notif_send_auth_failure(const char *ifname)
|
||||
{
|
||||
const char *xpath = "/frr-ripd:authentication-failure";
|
||||
struct list *arguments;
|
||||
char xpath_arg[XPATH_MAXLEN];
|
||||
struct yang_data *data;
|
||||
|
||||
arguments = yang_data_list_new();
|
||||
|
||||
snprintf(xpath_arg, sizeof(xpath_arg), "%s/interface-name", xpath);
|
||||
data = yang_data_new_string(xpath_arg, ifname);
|
||||
listnode_add(arguments, data);
|
||||
|
||||
nb_notification_send(xpath, arguments);
|
||||
}
|
105
ripd/rip_nb_rpcs.c
Normal file
105
ripd/rip_nb_rpcs.c
Normal file
@ -0,0 +1,105 @@
|
||||
/*
|
||||
* Copyright (C) 2018 NetDEF, Inc.
|
||||
* Renato Westphal
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; see the file COPYING; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <zebra.h>
|
||||
|
||||
#include "if.h"
|
||||
#include "vrf.h"
|
||||
#include "log.h"
|
||||
#include "prefix.h"
|
||||
#include "table.h"
|
||||
#include "command.h"
|
||||
#include "routemap.h"
|
||||
#include "northbound.h"
|
||||
#include "libfrr.h"
|
||||
|
||||
#include "ripd/ripd.h"
|
||||
#include "ripd/rip_nb.h"
|
||||
#include "ripd/rip_debug.h"
|
||||
#include "ripd/rip_interface.h"
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:clear-rip-route
|
||||
*/
|
||||
static void clear_rip_route(struct rip *rip)
|
||||
{
|
||||
struct route_node *rp;
|
||||
|
||||
if (IS_RIP_DEBUG_EVENT)
|
||||
zlog_debug("Clearing all RIP routes (VRF %s)", rip->vrf_name);
|
||||
|
||||
/* Clear received RIP routes */
|
||||
for (rp = route_top(rip->table); rp; rp = route_next(rp)) {
|
||||
struct list *list;
|
||||
struct listnode *listnode;
|
||||
struct rip_info *rinfo;
|
||||
|
||||
list = rp->info;
|
||||
if (!list)
|
||||
continue;
|
||||
|
||||
for (ALL_LIST_ELEMENTS_RO(list, listnode, rinfo)) {
|
||||
if (!rip_route_rte(rinfo))
|
||||
continue;
|
||||
|
||||
if (CHECK_FLAG(rinfo->flags, RIP_RTF_FIB))
|
||||
rip_zebra_ipv4_delete(rip, rp);
|
||||
break;
|
||||
}
|
||||
|
||||
if (rinfo) {
|
||||
RIP_TIMER_OFF(rinfo->t_timeout);
|
||||
RIP_TIMER_OFF(rinfo->t_garbage_collect);
|
||||
listnode_delete(list, rinfo);
|
||||
rip_info_free(rinfo);
|
||||
}
|
||||
|
||||
if (list_isempty(list)) {
|
||||
list_delete(&list);
|
||||
rp->info = NULL;
|
||||
route_unlock_node(rp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int clear_rip_route_rpc(const char *xpath, const struct list *input,
|
||||
struct list *output)
|
||||
{
|
||||
struct rip *rip;
|
||||
struct yang_data *yang_vrf;
|
||||
|
||||
yang_vrf = yang_data_list_find(input, "%s/%s", xpath, "input/vrf");
|
||||
if (yang_vrf) {
|
||||
rip = rip_lookup_by_vrf_name(yang_vrf->value);
|
||||
if (rip)
|
||||
clear_rip_route(rip);
|
||||
} else {
|
||||
struct vrf *vrf;
|
||||
|
||||
RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
|
||||
rip = vrf->info;
|
||||
if (!rip)
|
||||
continue;
|
||||
|
||||
clear_rip_route(rip);
|
||||
}
|
||||
}
|
||||
|
||||
return NB_OK;
|
||||
}
|
284
ripd/rip_nb_state.c
Normal file
284
ripd/rip_nb_state.c
Normal file
@ -0,0 +1,284 @@
|
||||
/*
|
||||
* Copyright (C) 2018 NetDEF, Inc.
|
||||
* Renato Westphal
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program; see the file COPYING; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <zebra.h>
|
||||
|
||||
#include "if.h"
|
||||
#include "vrf.h"
|
||||
#include "log.h"
|
||||
#include "prefix.h"
|
||||
#include "table.h"
|
||||
#include "command.h"
|
||||
#include "routemap.h"
|
||||
#include "northbound.h"
|
||||
#include "libfrr.h"
|
||||
|
||||
#include "ripd/ripd.h"
|
||||
#include "ripd/rip_nb.h"
|
||||
#include "ripd/rip_debug.h"
|
||||
#include "ripd/rip_interface.h"
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:ripd/instance
|
||||
*/
|
||||
const void *ripd_instance_get_next(const void *parent_list_entry,
|
||||
const void *list_entry)
|
||||
{
|
||||
struct rip *rip = (struct rip *)list_entry;
|
||||
|
||||
if (list_entry == NULL)
|
||||
rip = RB_MIN(rip_instance_head, &rip_instances);
|
||||
else
|
||||
rip = RB_NEXT(rip_instance_head, rip);
|
||||
|
||||
return rip;
|
||||
}
|
||||
|
||||
int ripd_instance_get_keys(const void *list_entry, struct yang_list_keys *keys)
|
||||
{
|
||||
const struct rip *rip = list_entry;
|
||||
|
||||
keys->num = 1;
|
||||
strlcpy(keys->key[0], rip->vrf_name, sizeof(keys->key[0]));
|
||||
|
||||
return NB_OK;
|
||||
}
|
||||
|
||||
const void *ripd_instance_lookup_entry(const void *parent_list_entry,
|
||||
const struct yang_list_keys *keys)
|
||||
{
|
||||
const char *vrf_name = keys->key[0];
|
||||
|
||||
return rip_lookup_by_vrf_name(vrf_name);
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:ripd/instance/state/neighbors/neighbor
|
||||
*/
|
||||
const void *
|
||||
ripd_instance_state_neighbors_neighbor_get_next(const void *parent_list_entry,
|
||||
const void *list_entry)
|
||||
{
|
||||
const struct rip *rip = parent_list_entry;
|
||||
struct listnode *node;
|
||||
|
||||
if (list_entry == NULL)
|
||||
node = listhead(rip->peer_list);
|
||||
else
|
||||
node = listnextnode((struct listnode *)list_entry);
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
int ripd_instance_state_neighbors_neighbor_get_keys(const void *list_entry,
|
||||
struct yang_list_keys *keys)
|
||||
{
|
||||
const struct listnode *node = list_entry;
|
||||
const struct rip_peer *peer = listgetdata(node);
|
||||
|
||||
keys->num = 1;
|
||||
(void)inet_ntop(AF_INET, &peer->addr, keys->key[0],
|
||||
sizeof(keys->key[0]));
|
||||
|
||||
return NB_OK;
|
||||
}
|
||||
|
||||
const void *ripd_instance_state_neighbors_neighbor_lookup_entry(
|
||||
const void *parent_list_entry, const struct yang_list_keys *keys)
|
||||
{
|
||||
const struct rip *rip = parent_list_entry;
|
||||
struct in_addr address;
|
||||
struct rip_peer *peer;
|
||||
struct listnode *node;
|
||||
|
||||
yang_str2ipv4(keys->key[0], &address);
|
||||
|
||||
for (ALL_LIST_ELEMENTS_RO(rip->peer_list, node, peer)) {
|
||||
if (IPV4_ADDR_SAME(&peer->addr, &address))
|
||||
return node;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:ripd/instance/state/neighbors/neighbor/address
|
||||
*/
|
||||
struct yang_data *
|
||||
ripd_instance_state_neighbors_neighbor_address_get_elem(const char *xpath,
|
||||
const void *list_entry)
|
||||
{
|
||||
const struct listnode *node = list_entry;
|
||||
const struct rip_peer *peer = listgetdata(node);
|
||||
|
||||
return yang_data_new_ipv4(xpath, &peer->addr);
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:ripd/instance/state/neighbors/neighbor/last-update
|
||||
*/
|
||||
struct yang_data *ripd_instance_state_neighbors_neighbor_last_update_get_elem(
|
||||
const char *xpath, const void *list_entry)
|
||||
{
|
||||
/* TODO: yang:date-and-time is tricky */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:ripd/instance/state/neighbors/neighbor/bad-packets-rcvd
|
||||
*/
|
||||
struct yang_data *
|
||||
ripd_instance_state_neighbors_neighbor_bad_packets_rcvd_get_elem(
|
||||
const char *xpath, const void *list_entry)
|
||||
{
|
||||
const struct listnode *node = list_entry;
|
||||
const struct rip_peer *peer = listgetdata(node);
|
||||
|
||||
return yang_data_new_uint32(xpath, peer->recv_badpackets);
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:ripd/instance/state/neighbors/neighbor/bad-routes-rcvd
|
||||
*/
|
||||
struct yang_data *
|
||||
ripd_instance_state_neighbors_neighbor_bad_routes_rcvd_get_elem(
|
||||
const char *xpath, const void *list_entry)
|
||||
{
|
||||
const struct listnode *node = list_entry;
|
||||
const struct rip_peer *peer = listgetdata(node);
|
||||
|
||||
return yang_data_new_uint32(xpath, peer->recv_badroutes);
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:ripd/instance/state/routes/route
|
||||
*/
|
||||
const void *
|
||||
ripd_instance_state_routes_route_get_next(const void *parent_list_entry,
|
||||
const void *list_entry)
|
||||
{
|
||||
const struct rip *rip = parent_list_entry;
|
||||
struct route_node *rn;
|
||||
|
||||
if (list_entry == NULL)
|
||||
rn = route_top(rip->table);
|
||||
else
|
||||
rn = route_next((struct route_node *)list_entry);
|
||||
while (rn && rn->info == NULL)
|
||||
rn = route_next(rn);
|
||||
|
||||
return rn;
|
||||
}
|
||||
|
||||
int ripd_instance_state_routes_route_get_keys(const void *list_entry,
|
||||
struct yang_list_keys *keys)
|
||||
{
|
||||
const struct route_node *rn = list_entry;
|
||||
|
||||
keys->num = 1;
|
||||
(void)prefix2str(&rn->p, keys->key[0], sizeof(keys->key[0]));
|
||||
|
||||
return NB_OK;
|
||||
}
|
||||
|
||||
const void *
|
||||
ripd_instance_state_routes_route_lookup_entry(const void *parent_list_entry,
|
||||
const struct yang_list_keys *keys)
|
||||
{
|
||||
const struct rip *rip = parent_list_entry;
|
||||
struct prefix prefix;
|
||||
struct route_node *rn;
|
||||
|
||||
yang_str2ipv4p(keys->key[0], &prefix);
|
||||
|
||||
rn = route_node_lookup(rip->table, &prefix);
|
||||
if (!rn || !rn->info)
|
||||
return NULL;
|
||||
|
||||
route_unlock_node(rn);
|
||||
|
||||
return rn;
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:ripd/instance/state/routes/route/prefix
|
||||
*/
|
||||
struct yang_data *
|
||||
ripd_instance_state_routes_route_prefix_get_elem(const char *xpath,
|
||||
const void *list_entry)
|
||||
{
|
||||
const struct route_node *rn = list_entry;
|
||||
const struct rip_info *rinfo = listnode_head(rn->info);
|
||||
|
||||
return yang_data_new_ipv4p(xpath, &rinfo->rp->p);
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:ripd/instance/state/routes/route/next-hop
|
||||
*/
|
||||
struct yang_data *
|
||||
ripd_instance_state_routes_route_next_hop_get_elem(const char *xpath,
|
||||
const void *list_entry)
|
||||
{
|
||||
const struct route_node *rn = list_entry;
|
||||
const struct rip_info *rinfo = listnode_head(rn->info);
|
||||
|
||||
switch (rinfo->nh.type) {
|
||||
case NEXTHOP_TYPE_IPV4:
|
||||
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
||||
return yang_data_new_ipv4(xpath, &rinfo->nh.gate.ipv4);
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:ripd/instance/state/routes/route/interface
|
||||
*/
|
||||
struct yang_data *
|
||||
ripd_instance_state_routes_route_interface_get_elem(const char *xpath,
|
||||
const void *list_entry)
|
||||
{
|
||||
const struct route_node *rn = list_entry;
|
||||
const struct rip_info *rinfo = listnode_head(rn->info);
|
||||
const struct rip *rip = rip_info_get_instance(rinfo);
|
||||
|
||||
switch (rinfo->nh.type) {
|
||||
case NEXTHOP_TYPE_IFINDEX:
|
||||
case NEXTHOP_TYPE_IPV4_IFINDEX:
|
||||
return yang_data_new_string(
|
||||
xpath,
|
||||
ifindex2ifname(rinfo->nh.ifindex, rip->vrf->vrf_id));
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* XPath: /frr-ripd:ripd/instance/state/routes/route/metric
|
||||
*/
|
||||
struct yang_data *
|
||||
ripd_instance_state_routes_route_metric_get_elem(const char *xpath,
|
||||
const void *list_entry)
|
||||
{
|
||||
const struct route_node *rn = list_entry;
|
||||
const struct rip_info *rinfo = listnode_head(rn->info);
|
||||
|
||||
return yang_data_new_uint8(xpath, rinfo->metric);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -46,6 +46,7 @@
|
||||
#include "northbound_cli.h"
|
||||
|
||||
#include "ripd/ripd.h"
|
||||
#include "ripd/rip_nb.h"
|
||||
#include "ripd/rip_debug.h"
|
||||
#include "ripd/rip_errors.h"
|
||||
#include "ripd/rip_interface.h"
|
||||
|
@ -521,10 +521,7 @@ extern int offset_list_cmp(struct rip_offset_list *o1,
|
||||
|
||||
extern void rip_vrf_init(void);
|
||||
extern void rip_vrf_terminate(void);
|
||||
|
||||
/* YANG notifications */
|
||||
extern void ripd_notif_send_auth_type_failure(const char *ifname);
|
||||
extern void ripd_notif_send_auth_failure(const char *ifname);
|
||||
extern void rip_cli_init(void);
|
||||
|
||||
extern struct zebra_privs_t ripd_privs;
|
||||
extern struct rip_instance_head rip_instances;
|
||||
@ -535,8 +532,4 @@ extern struct thread_master *master;
|
||||
DECLARE_HOOK(rip_ifaddr_add, (struct connected * ifc), (ifc))
|
||||
DECLARE_HOOK(rip_ifaddr_del, (struct connected * ifc), (ifc))
|
||||
|
||||
/* Northbound. */
|
||||
extern void rip_cli_init(void);
|
||||
extern const struct frr_yang_module_info frr_ripd_info;
|
||||
|
||||
#endif /* _ZEBRA_RIP_H */
|
||||
|
@ -24,7 +24,11 @@ ripd_librip_a_SOURCES = \
|
||||
ripd/rip_errors.c \
|
||||
ripd/rip_interface.c \
|
||||
ripd/rip_offset.c \
|
||||
ripd/rip_northbound.c \
|
||||
ripd/rip_nb.c \
|
||||
ripd/rip_nb_config.c \
|
||||
ripd/rip_nb_rpcs.c \
|
||||
ripd/rip_nb_notifications.c \
|
||||
ripd/rip_nb_state.c \
|
||||
ripd/rip_peer.c \
|
||||
ripd/rip_routemap.c \
|
||||
ripd/rip_zebra.c \
|
||||
@ -35,10 +39,10 @@ ripd/rip_cli_clippy.c: $(CLIPPY_DEPS)
|
||||
ripd/rip_cli.$(OBJEXT): ripd/rip_cli_clippy.c
|
||||
|
||||
noinst_HEADERS += \
|
||||
ripd/rip_cli.h \
|
||||
ripd/rip_debug.h \
|
||||
ripd/rip_errors.h \
|
||||
ripd/rip_interface.h \
|
||||
ripd/rip_nb.h \
|
||||
ripd/ripd.h \
|
||||
# end
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user