diff --git a/zebra/interface.h b/zebra/interface.h index f095a32d1e..61c3359f3b 100644 --- a/zebra/interface.h +++ b/zebra/interface.h @@ -313,6 +313,8 @@ static inline void zebra_if_set_ziftype(struct interface *ifp, #define IS_ZEBRA_IF_VRF_SLAVE(ifp) \ (((struct zebra_if *)(ifp->info))->zif_slave_type == ZEBRA_IF_SLAVE_VRF) +extern void zebra_if_init(void); + extern struct interface *if_lookup_by_index_per_ns(struct zebra_ns *, u_int32_t); extern struct interface *if_lookup_by_name_per_ns(struct zebra_ns *, diff --git a/zebra/kernel_netlink.c b/zebra/kernel_netlink.c index a5c36b0dae..1be2cbcaf5 100644 --- a/zebra/kernel_netlink.c +++ b/zebra/kernel_netlink.c @@ -40,6 +40,7 @@ #include "zebra/zserv.h" #include "zebra/zebra_ns.h" #include "zebra/zebra_vrf.h" +#include "zebra/rt.h" #include "zebra/debug.h" #include "zebra/kernel_netlink.h" #include "zebra/rt_netlink.h" diff --git a/zebra/main.c b/zebra/main.c index 36c931c4ee..5eb8e75b87 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -295,7 +295,7 @@ int main(int argc, char **argv) zebrad.master = frr_init(); /* Zebra related initialize. */ - zebra_init(); + zserv_init(); rib_init(); zebra_if_init(); zebra_debug_init(); diff --git a/zebra/rib.h b/zebra/rib.h index 818844cb6d..4b82e8d8d5 100644 --- a/zebra/rib.h +++ b/zebra/rib.h @@ -435,4 +435,8 @@ static inline void rib_tables_iter_cleanup(rib_tables_iter_t *iter) DECLARE_HOOK(rib_update, (struct route_node * rn, const char *reason), (rn, reason)) + +extern void zebra_vty_init(void); +extern pid_t pid; + #endif /*_ZEBRA_RIB_H */ diff --git a/zebra/rt.h b/zebra/rt.h index 6bbe69e983..424319878d 100644 --- a/zebra/rt.h +++ b/zebra/rt.h @@ -112,4 +112,18 @@ extern int kernel_add_neigh(struct interface *ifp, struct ipaddr *ip, struct ethaddr *mac); extern int kernel_del_neigh(struct interface *ifp, struct ipaddr *ip); +/* + * Southbound Initialization routines to get initial starting + * state. + */ +extern void interface_list(struct zebra_ns *zns); +extern void kernel_init(struct zebra_ns *zns); +extern void kernel_terminate(struct zebra_ns *zns); +extern void macfdb_read(struct zebra_ns *zns); +extern void macfdb_read_for_bridge(struct zebra_ns *zns, struct interface *ifp, + struct interface *br_if); +extern void neigh_read(struct zebra_ns *zns); +extern void neigh_read_for_vlan(struct zebra_ns *zns, struct interface *ifp); +extern void route_read(struct zebra_ns *zns); + #endif /* _ZEBRA_RT_H */ diff --git a/zebra/rtread_getmsg.c b/zebra/rtread_getmsg.c index 62f3224b6e..39ecdb335c 100644 --- a/zebra/rtread_getmsg.c +++ b/zebra/rtread_getmsg.c @@ -30,7 +30,7 @@ #include "vty.h" #include "zebra/rib.h" -#include "zebra/zserv.h" +#include "zebra/rt.h" /* Thank you, Solaris, for polluting application symbol namespace. */ #undef hook_register diff --git a/zebra/rtread_netlink.c b/zebra/rtread_netlink.c index f38cba65e7..ec29d1820e 100644 --- a/zebra/rtread_netlink.c +++ b/zebra/rtread_netlink.c @@ -24,7 +24,7 @@ #ifdef GNU_LINUX #include "vty.h" -#include "zebra/zserv.h" +#include "zebra/rt.h" #include "zebra/rt_netlink.h" void route_read(struct zebra_ns *zns) diff --git a/zebra/rtread_sysctl.c b/zebra/rtread_sysctl.c index 53ed0e7906..4f5a80612e 100644 --- a/zebra/rtread_sysctl.c +++ b/zebra/rtread_sysctl.c @@ -28,7 +28,6 @@ #include "log.h" #include "vrf.h" -#include "zebra/zserv.h" #include "zebra/rt.h" #include "zebra/kernel_socket.h" diff --git a/zebra/zebra_ns.c b/zebra/zebra_ns.c index 78072f43bb..602dc5ea41 100644 --- a/zebra/zebra_ns.c +++ b/zebra/zebra_ns.c @@ -29,6 +29,7 @@ #include "zebra_ns.h" #include "zebra_vrf.h" #include "zebra_memory.h" +#include "rt.h" DEFINE_MTYPE(ZEBRA, ZEBRA_NS, "Zebra Name Space") diff --git a/zebra/zebra_routemap.h b/zebra/zebra_routemap.h index 1f95c7f83c..60bf7c3f59 100644 --- a/zebra/zebra_routemap.h +++ b/zebra/zebra_routemap.h @@ -22,6 +22,7 @@ #ifndef __ZEBRA_ROUTEMAP_H__ #define __ZEBRA_ROUTEMAP_H__ +extern void zebra_route_map_init(void); extern void zebra_routemap_config_write_protocol(struct vty *vty); extern char *zebra_get_import_table_route_map(afi_t afi, uint32_t table); extern void zebra_add_import_table_route_map(afi_t afi, const char *rmap_name, diff --git a/zebra/zebra_vty.c b/zebra/zebra_vty.c index c2c7075671..e4407d7316 100644 --- a/zebra/zebra_vty.c +++ b/zebra/zebra_vty.c @@ -47,6 +47,8 @@ #include "zebra/zebra_vty_clippy.c" #endif #include "zebra/zserv.h" +#include "zebra/router-id.h" +#include "zebra/ipforward.h" extern int allow_delete; @@ -2325,13 +2327,254 @@ static int config_write_protocol(struct vty *vty) return 1; } +#ifdef HAVE_NETLINK +/* Display default rtm_table for all clients. */ +DEFUN (show_table, + show_table_cmd, + "show table", + SHOW_STR + "default routing table to use for all clients\n") +{ + vty_out(vty, "table %d\n", zebrad.rtm_table_default); + return CMD_SUCCESS; +} + +DEFUN (config_table, + config_table_cmd, + "table TABLENO", + "Configure target kernel routing table\n" + "TABLE integer\n") +{ + zebrad.rtm_table_default = strtol(argv[1]->arg, (char **)0, 10); + return CMD_SUCCESS; +} + +DEFUN (no_config_table, + no_config_table_cmd, + "no table [TABLENO]", + NO_STR + "Configure target kernel routing table\n" + "TABLE integer\n") +{ + zebrad.rtm_table_default = 0; + return CMD_SUCCESS; +} +#endif + +DEFUN (show_zebra, + show_zebra_cmd, + "show zebra", + SHOW_STR + ZEBRA_STR) +{ + struct vrf *vrf; + + vty_out(vty, + " Route Route Neighbor LSP LSP\n"); + vty_out(vty, + "VRF Installs Removals Updates Installs Removals\n"); + + RB_FOREACH(vrf, vrf_name_head, &vrfs_by_name) { + struct zebra_vrf *zvrf = vrf->info; + + vty_out(vty, "%-25s %10" PRIu64 " %10" PRIu64 " %10" PRIu64 + " %10" PRIu64 " %10" PRIu64 "\n", + vrf->name, zvrf->installs, zvrf->removals, + zvrf->neigh_updates, zvrf->lsp_installs, + zvrf->lsp_removals); + } + + return CMD_SUCCESS; +} + +DEFUN (ip_forwarding, + ip_forwarding_cmd, + "ip forwarding", + IP_STR + "Turn on IP forwarding\n") +{ + int ret; + + ret = ipforward(); + if (ret == 0) + ret = ipforward_on(); + + if (ret == 0) { + vty_out(vty, "Can't turn on IP forwarding\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + return CMD_SUCCESS; +} + +DEFUN (no_ip_forwarding, + no_ip_forwarding_cmd, + "no ip forwarding", + NO_STR + IP_STR + "Turn off IP forwarding\n") +{ + int ret; + + ret = ipforward(); + if (ret != 0) + ret = ipforward_off(); + + if (ret != 0) { + vty_out(vty, "Can't turn off IP forwarding\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + return CMD_SUCCESS; +} + +/* Only display ip forwarding is enabled or not. */ +DEFUN (show_ip_forwarding, + show_ip_forwarding_cmd, + "show ip forwarding", + SHOW_STR + IP_STR + "IP forwarding status\n") +{ + int ret; + + ret = ipforward(); + + if (ret == 0) + vty_out(vty, "IP forwarding is off\n"); + else + vty_out(vty, "IP forwarding is on\n"); + return CMD_SUCCESS; +} + +/* Only display ipv6 forwarding is enabled or not. */ +DEFUN (show_ipv6_forwarding, + show_ipv6_forwarding_cmd, + "show ipv6 forwarding", + SHOW_STR + "IPv6 information\n" + "Forwarding status\n") +{ + int ret; + + ret = ipforward_ipv6(); + + switch (ret) { + case -1: + vty_out(vty, "ipv6 forwarding is unknown\n"); + break; + case 0: + vty_out(vty, "ipv6 forwarding is %s\n", "off"); + break; + case 1: + vty_out(vty, "ipv6 forwarding is %s\n", "on"); + break; + default: + vty_out(vty, "ipv6 forwarding is %s\n", "off"); + break; + } + return CMD_SUCCESS; +} + +DEFUN (ipv6_forwarding, + ipv6_forwarding_cmd, + "ipv6 forwarding", + IPV6_STR + "Turn on IPv6 forwarding\n") +{ + int ret; + + ret = ipforward_ipv6(); + if (ret == 0) + ret = ipforward_ipv6_on(); + + if (ret == 0) { + vty_out(vty, "Can't turn on IPv6 forwarding\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + return CMD_SUCCESS; +} + +DEFUN (no_ipv6_forwarding, + no_ipv6_forwarding_cmd, + "no ipv6 forwarding", + NO_STR + IPV6_STR + "Turn off IPv6 forwarding\n") +{ + int ret; + + ret = ipforward_ipv6(); + if (ret != 0) + ret = ipforward_ipv6_off(); + + if (ret != 0) { + vty_out(vty, "Can't turn off IPv6 forwarding\n"); + return CMD_WARNING_CONFIG_FAILED; + } + + return CMD_SUCCESS; +} + +/* Table configuration write function. */ +static int config_write_table(struct vty *vty) +{ + if (zebrad.rtm_table_default) + vty_out(vty, "table %d\n", zebrad.rtm_table_default); + return 0; +} + +/* IPForwarding configuration write function. */ +static int config_write_forwarding(struct vty *vty) +{ + /* FIXME: Find better place for that. */ + router_id_write(vty); + + if (!ipforward()) + vty_out(vty, "no ip forwarding\n"); + if (!ipforward_ipv6()) + vty_out(vty, "no ipv6 forwarding\n"); + vty_out(vty, "!\n"); + return 0; +} + /* IP node for static routes. */ static struct cmd_node ip_node = {IP_NODE, "", 1}; static struct cmd_node protocol_node = {PROTOCOL_NODE, "", 1}; +/* table node for routing tables. */ +static struct cmd_node table_node = {TABLE_NODE, + "", /* This node has no interface. */ + 1}; +static struct cmd_node forwarding_node = {FORWARDING_NODE, + "", /* This node has no interface. */ + 1}; /* Route VTY. */ void zebra_vty_init(void) { + /* Install configuration write function. */ + install_node(&table_node, config_write_table); + install_node(&forwarding_node, config_write_forwarding); + + install_element(VIEW_NODE, &show_ip_forwarding_cmd); + install_element(CONFIG_NODE, &ip_forwarding_cmd); + install_element(CONFIG_NODE, &no_ip_forwarding_cmd); + install_element(ENABLE_NODE, &show_zebra_cmd); + +#ifdef HAVE_NETLINK + install_element(VIEW_NODE, &show_table_cmd); + install_element(CONFIG_NODE, &config_table_cmd); + install_element(CONFIG_NODE, &no_config_table_cmd); +#endif /* HAVE_NETLINK */ + + install_element(VIEW_NODE, &show_ipv6_forwarding_cmd); + install_element(CONFIG_NODE, &ipv6_forwarding_cmd); + install_element(CONFIG_NODE, &no_ipv6_forwarding_cmd); + + /* Route-map */ + zebra_route_map_init(); + install_node(&ip_node, zebra_ip_config); install_node(&protocol_node, config_write_protocol); diff --git a/zebra/zserv.c b/zebra/zserv.c index b6d70084c0..684ba49e7d 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -48,7 +48,6 @@ #include "zebra/router-id.h" #include "zebra/redistribute.h" #include "zebra/debug.h" -#include "zebra/ipforward.h" #include "zebra/zebra_rnh.h" #include "zebra/rt_netlink.h" #include "zebra/interface.h" @@ -3017,105 +3016,6 @@ struct zserv *zebra_find_client(u_char proto, u_short instance) return NULL; } -#ifdef HAVE_NETLINK -/* Display default rtm_table for all clients. */ -DEFUN (show_table, - show_table_cmd, - "show table", - SHOW_STR - "default routing table to use for all clients\n") -{ - vty_out(vty, "table %d\n", zebrad.rtm_table_default); - return CMD_SUCCESS; -} - -DEFUN (config_table, - config_table_cmd, - "table TABLENO", - "Configure target kernel routing table\n" - "TABLE integer\n") -{ - zebrad.rtm_table_default = strtol(argv[1]->arg, (char **)0, 10); - return CMD_SUCCESS; -} - -DEFUN (no_config_table, - no_config_table_cmd, - "no table [TABLENO]", - NO_STR - "Configure target kernel routing table\n" - "TABLE integer\n") -{ - zebrad.rtm_table_default = 0; - return CMD_SUCCESS; -} -#endif - -DEFUN (ip_forwarding, - ip_forwarding_cmd, - "ip forwarding", - IP_STR - "Turn on IP forwarding\n") -{ - int ret; - - ret = ipforward(); - if (ret == 0) - ret = ipforward_on(); - - if (ret == 0) { - vty_out(vty, "Can't turn on IP forwarding\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - return CMD_SUCCESS; -} - -DEFUN (no_ip_forwarding, - no_ip_forwarding_cmd, - "no ip forwarding", - NO_STR - IP_STR - "Turn off IP forwarding\n") -{ - int ret; - - ret = ipforward(); - if (ret != 0) - ret = ipforward_off(); - - if (ret != 0) { - vty_out(vty, "Can't turn off IP forwarding\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - return CMD_SUCCESS; -} - -DEFUN (show_zebra, - show_zebra_cmd, - "show zebra", - SHOW_STR - ZEBRA_STR) -{ - struct vrf *vrf; - - vty_out(vty, - " Route Route Neighbor LSP LSP\n"); - vty_out(vty, - "VRF Installs Removals Updates Installs Removals\n"); - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) { - struct zebra_vrf *zvrf = vrf->info; - vty_out(vty, "%-25s %10" PRIu64 " %10" PRIu64 " %10" PRIu64 - " %10" PRIu64 " %10" PRIu64 "\n", - vrf->name, zvrf->installs, zvrf->removals, - zvrf->neigh_updates, zvrf->lsp_installs, - zvrf->lsp_removals); - } - - return CMD_SUCCESS; -} - /* This command is for debugging purpose. */ DEFUN (show_zebra_client, show_zebra_client_cmd, @@ -3157,127 +3057,6 @@ DEFUN (show_zebra_client_summary, return CMD_SUCCESS; } -/* Table configuration write function. */ -static int config_write_table(struct vty *vty) -{ - if (zebrad.rtm_table_default) - vty_out(vty, "table %d\n", zebrad.rtm_table_default); - return 0; -} - -/* table node for routing tables. */ -static struct cmd_node table_node = {TABLE_NODE, - "", /* This node has no interface. */ - 1}; - -/* Only display ip forwarding is enabled or not. */ -DEFUN (show_ip_forwarding, - show_ip_forwarding_cmd, - "show ip forwarding", - SHOW_STR - IP_STR - "IP forwarding status\n") -{ - int ret; - - ret = ipforward(); - - if (ret == 0) - vty_out(vty, "IP forwarding is off\n"); - else - vty_out(vty, "IP forwarding is on\n"); - return CMD_SUCCESS; -} - -/* Only display ipv6 forwarding is enabled or not. */ -DEFUN (show_ipv6_forwarding, - show_ipv6_forwarding_cmd, - "show ipv6 forwarding", - SHOW_STR - "IPv6 information\n" - "Forwarding status\n") -{ - int ret; - - ret = ipforward_ipv6(); - - switch (ret) { - case -1: - vty_out(vty, "ipv6 forwarding is unknown\n"); - break; - case 0: - vty_out(vty, "ipv6 forwarding is %s\n", "off"); - break; - case 1: - vty_out(vty, "ipv6 forwarding is %s\n", "on"); - break; - default: - vty_out(vty, "ipv6 forwarding is %s\n", "off"); - break; - } - return CMD_SUCCESS; -} - -DEFUN (ipv6_forwarding, - ipv6_forwarding_cmd, - "ipv6 forwarding", - IPV6_STR - "Turn on IPv6 forwarding\n") -{ - int ret; - - ret = ipforward_ipv6(); - if (ret == 0) - ret = ipforward_ipv6_on(); - - if (ret == 0) { - vty_out(vty, "Can't turn on IPv6 forwarding\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - return CMD_SUCCESS; -} - -DEFUN (no_ipv6_forwarding, - no_ipv6_forwarding_cmd, - "no ipv6 forwarding", - NO_STR - IPV6_STR - "Turn off IPv6 forwarding\n") -{ - int ret; - - ret = ipforward_ipv6(); - if (ret != 0) - ret = ipforward_ipv6_off(); - - if (ret != 0) { - vty_out(vty, "Can't turn off IPv6 forwarding\n"); - return CMD_WARNING_CONFIG_FAILED; - } - - return CMD_SUCCESS; -} - -/* IPForwarding configuration write function. */ -static int config_write_forwarding(struct vty *vty) -{ - /* FIXME: Find better place for that. */ - router_id_write(vty); - - if (!ipforward()) - vty_out(vty, "no ip forwarding\n"); - if (!ipforward_ipv6()) - vty_out(vty, "no ipv6 forwarding\n"); - vty_out(vty, "!\n"); - return 0; -} - -/* table node for routing tables. */ -static struct cmd_node forwarding_node = {FORWARDING_NODE, - "", /* This node has no interface. */ - 1}; - #if defined(HANDLE_ZAPI_FUZZING) void zserv_read_file(char *input) { @@ -3298,34 +3077,12 @@ void zserv_read_file(char *input) } #endif -/* Initialisation of zebra and installation of commands. */ -void zebra_init(void) +void zserv_init(void) { /* Client list init. */ zebrad.client_list = list_new(); zebrad.client_list->del = (void (*)(void *))zebra_client_free; - /* Install configuration write function. */ - install_node(&table_node, config_write_table); - install_node(&forwarding_node, config_write_forwarding); - - install_element(VIEW_NODE, &show_ip_forwarding_cmd); - install_element(CONFIG_NODE, &ip_forwarding_cmd); - install_element(CONFIG_NODE, &no_ip_forwarding_cmd); - install_element(ENABLE_NODE, &show_zebra_cmd); install_element(ENABLE_NODE, &show_zebra_client_cmd); install_element(ENABLE_NODE, &show_zebra_client_summary_cmd); - -#ifdef HAVE_NETLINK - install_element(VIEW_NODE, &show_table_cmd); - install_element(CONFIG_NODE, &config_table_cmd); - install_element(CONFIG_NODE, &no_config_table_cmd); -#endif /* HAVE_NETLINK */ - - install_element(VIEW_NODE, &show_ipv6_forwarding_cmd); - install_element(CONFIG_NODE, &ipv6_forwarding_cmd); - install_element(CONFIG_NODE, &no_ipv6_forwarding_cmd); - - /* Route-map */ - zebra_route_map_init(); } diff --git a/zebra/zserv.h b/zebra/zserv.h index 6077dc105a..c4b4e20df2 100644 --- a/zebra/zserv.h +++ b/zebra/zserv.h @@ -148,22 +148,8 @@ extern struct zebra_t zebrad; extern unsigned int multipath_num; /* Prototypes. */ -extern void zebra_init(void); -extern void zebra_if_init(void); +extern void zserv_init(void); extern void zebra_zserv_socket_init(char *path); -extern void hostinfo_get(void); -extern void rib_init(void); -extern void interface_list(struct zebra_ns *); -extern void route_read(struct zebra_ns *); -extern void macfdb_read(struct zebra_ns *); -extern void macfdb_read_for_bridge(struct zebra_ns *, struct interface *, - struct interface *); -extern void neigh_read(struct zebra_ns *); -extern void neigh_read_for_vlan(struct zebra_ns *, struct interface *); -extern void kernel_init(struct zebra_ns *); -extern void kernel_terminate(struct zebra_ns *); -extern void zebra_route_map_init(void); -extern void zebra_vty_init(void); extern int zsend_vrf_add(struct zserv *, struct zebra_vrf *); extern int zsend_vrf_delete(struct zserv *, struct zebra_vrf *); @@ -189,8 +175,6 @@ extern int zsend_route_notify_owner(u_char proto, u_short instance, vrf_id_t vrf_id, struct prefix *p, enum zapi_route_notify_owner note); -extern pid_t pid; - extern void zserv_create_header(struct stream *s, uint16_t cmd, vrf_id_t vrf_id); extern void zserv_nexthop_num_warn(const char *, const struct prefix *,