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:
Renato Westphal 2019-10-17 15:46:54 -03:00
parent 2a1c520e9f
commit f80ec39e52
13 changed files with 2205 additions and 1920 deletions

View File

@ -29,7 +29,7 @@
#include "libfrr.h" #include "libfrr.h"
#include "ripd/ripd.h" #include "ripd/ripd.h"
#include "ripd/rip_cli.h" #include "ripd/rip_nb.h"
#ifndef VTYSH_EXTRACT_PL #ifndef VTYSH_EXTRACT_PL
#include "ripd/rip_cli_clippy.c" #include "ripd/rip_cli_clippy.c"
#endif #endif

View File

@ -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_ */

View File

@ -38,6 +38,7 @@
#include "libfrr.h" #include "libfrr.h"
#include "ripd/ripd.h" #include "ripd/ripd.h"
#include "ripd/rip_nb.h"
#include "ripd/rip_errors.h" #include "ripd/rip_errors.h"
/* ripd options. */ /* ripd options. */

369
ripd/rip_nb.c Normal file
View 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
View 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

File diff suppressed because it is too large Load Diff

View 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
View 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
View 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

View File

@ -46,6 +46,7 @@
#include "northbound_cli.h" #include "northbound_cli.h"
#include "ripd/ripd.h" #include "ripd/ripd.h"
#include "ripd/rip_nb.h"
#include "ripd/rip_debug.h" #include "ripd/rip_debug.h"
#include "ripd/rip_errors.h" #include "ripd/rip_errors.h"
#include "ripd/rip_interface.h" #include "ripd/rip_interface.h"

View File

@ -521,10 +521,7 @@ extern int offset_list_cmp(struct rip_offset_list *o1,
extern void rip_vrf_init(void); extern void rip_vrf_init(void);
extern void rip_vrf_terminate(void); extern void rip_vrf_terminate(void);
extern void rip_cli_init(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 struct zebra_privs_t ripd_privs; extern struct zebra_privs_t ripd_privs;
extern struct rip_instance_head rip_instances; 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_add, (struct connected * ifc), (ifc))
DECLARE_HOOK(rip_ifaddr_del, (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 */ #endif /* _ZEBRA_RIP_H */

View File

@ -24,7 +24,11 @@ ripd_librip_a_SOURCES = \
ripd/rip_errors.c \ ripd/rip_errors.c \
ripd/rip_interface.c \ ripd/rip_interface.c \
ripd/rip_offset.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_peer.c \
ripd/rip_routemap.c \ ripd/rip_routemap.c \
ripd/rip_zebra.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 ripd/rip_cli.$(OBJEXT): ripd/rip_cli_clippy.c
noinst_HEADERS += \ noinst_HEADERS += \
ripd/rip_cli.h \
ripd/rip_debug.h \ ripd/rip_debug.h \
ripd/rip_errors.h \ ripd/rip_errors.h \
ripd/rip_interface.h \ ripd/rip_interface.h \
ripd/rip_nb.h \
ripd/ripd.h \ ripd/ripd.h \
# end # end