vty_out(vty, "\n");
}
+/*
+ * XPath: /frr-ripd:ripd/instance/explicit-neighbor
+ */
+DEFPY (rip_neighbor,
+ rip_neighbor_cmd,
+ "[no] neighbor A.B.C.D",
+ NO_STR
+ "Specify a neighbor router\n"
+ "Neighbor address\n")
+{
+ struct cli_config_change changes[] = {
+ {
+ .xpath = "./explicit-neighbor",
+ .operation = no ? NB_OP_DELETE : NB_OP_CREATE,
+ .value = neighbor_str,
+ },
+ };
+
+ return nb_cli_cfg_change(vty, NULL, changes, array_size(changes));
+}
+
+void cli_show_rip_neighbor(struct vty *vty, struct lyd_node *dnode,
+ bool show_defaults)
+{
+ vty_out(vty, " neighbor %s\n", yang_dnode_get_string(dnode, NULL));
+}
+
void rip_cli_init(void)
{
install_element(CONFIG_NODE, &router_rip_cmd);
install_element(RIP_NODE, &no_rip_distance_cmd);
install_element(RIP_NODE, &rip_distance_source_cmd);
install_element(RIP_NODE, &no_rip_distance_source_cmd);
+ install_element(RIP_NODE, &rip_neighbor_cmd);
}
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);
#endif /* _FRR_RIP_CLI_H_ */
#include "sockopt.h"
#include "privs.h"
#include "lib_errors.h"
+#include "northbound_cli.h"
#include "zebra/connected.h"
}
/* Add new RIP neighbor to the neighbor tree. */
-static int rip_neighbor_add(struct prefix_ipv4 *p)
+int rip_neighbor_add(struct prefix_ipv4 *p)
{
struct route_node *node;
node = route_node_get(rip->neighbor, (struct prefix *)p);
if (node->info)
- return -1;
+ return NB_ERR_INCONSISTENCY;
node->info = rip->neighbor;
- return 0;
+ return NB_OK;
}
/* Delete RIP neighbor from the neighbor tree. */
-static int rip_neighbor_delete(struct prefix_ipv4 *p)
+int rip_neighbor_delete(struct prefix_ipv4 *p)
{
struct route_node *node;
/* Lock for look up. */
node = route_node_lookup(rip->neighbor, (struct prefix *)p);
if (!node)
- return -1;
+ return NB_ERR_INCONSISTENCY;
node->info = NULL;
/* Unlock real neighbor information lock. */
route_unlock_node(node);
- return 0;
+ return NB_OK;
}
/* Clear all network and neighbor configuration. */
return CMD_SUCCESS;
}
-/* RIP neighbor configuration set. */
-DEFUN (rip_neighbor,
- rip_neighbor_cmd,
- "neighbor A.B.C.D",
- "Specify a neighbor router\n"
- "Neighbor address\n")
-{
- int idx_ipv4 = 1;
- int ret;
- struct prefix_ipv4 p;
-
- ret = str2prefix_ipv4(argv[idx_ipv4]->arg, &p);
-
- if (ret <= 0) {
- vty_out(vty, "Please specify address by A.B.C.D\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- rip_neighbor_add(&p);
-
- return CMD_SUCCESS;
-}
-
-/* RIP neighbor configuration unset. */
-DEFUN (no_rip_neighbor,
- no_rip_neighbor_cmd,
- "no neighbor A.B.C.D",
- NO_STR
- "Specify a neighbor router\n"
- "Neighbor address\n")
-{
- int idx_ipv4 = 2;
- int ret;
- struct prefix_ipv4 p;
-
- ret = str2prefix_ipv4(argv[idx_ipv4]->arg, &p);
-
- if (ret <= 0) {
- vty_out(vty, "Please specify address by A.B.C.D\n");
- return CMD_WARNING_CONFIG_FAILED;
- }
-
- rip_neighbor_delete(&p);
-
- return CMD_SUCCESS;
-}
-
DEFUN (ip_rip_receive_version,
ip_rip_receive_version_cmd,
"ip rip receive version <(1-2)|none>",
/* Install commands. */
install_element(RIP_NODE, &rip_network_cmd);
install_element(RIP_NODE, &no_rip_network_cmd);
- install_element(RIP_NODE, &rip_neighbor_cmd);
- install_element(RIP_NODE, &no_rip_neighbor_cmd);
install_element(RIP_NODE, &rip_passive_interface_cmd);
install_element(RIP_NODE, &no_rip_passive_interface_cmd);
const struct lyd_node *dnode,
union nb_resource *resource)
{
- /* TODO: implement me. */
- return NB_OK;
+ struct prefix_ipv4 p;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ p.family = AF_INET;
+ p.prefixlen = IPV4_MAX_BITLEN;
+ yang_dnode_get_ipv4(&p.prefix, dnode, NULL);
+
+ return rip_neighbor_add(&p);
}
static int ripd_instance_explicit_neighbor_delete(enum nb_event event,
const struct lyd_node *dnode)
{
- /* TODO: implement me. */
- return NB_OK;
+ struct prefix_ipv4 p;
+
+ if (event != NB_EV_APPLY)
+ return NB_OK;
+
+ p.family = AF_INET;
+ p.prefixlen = IPV4_MAX_BITLEN;
+ yang_dnode_get_ipv4(&p.prefix, dnode, NULL);
+
+ return rip_neighbor_delete(&p);
}
/*
.xpath = "/frr-ripd:ripd/instance/explicit-neighbor",
.cbs.create = ripd_instance_explicit_neighbor_create,
.cbs.delete = ripd_instance_explicit_neighbor_delete,
+ .cbs.cli_show = cli_show_rip_neighbor,
},
{
.xpath = "/frr-ripd:ripd/instance/network",
extern int rip_request_send(struct sockaddr_in *, struct interface *, uint8_t,
struct connected *);
extern int rip_neighbor_lookup(struct sockaddr_in *);
+extern int rip_neighbor_add(struct prefix_ipv4 *p);
+extern int rip_neighbor_delete(struct prefix_ipv4 *p);
extern void rip_ecmp_disable(void);