#include "memory.h"
#include "hash.h"
#include "queue.h"
+#include "if.h"
+#include "vrf.h"
#include "bgpd/bgpd.h"
#include "bgpd/bgp_advertise.h"
int ret;
struct in_addr id;
struct bgp *bgp;
+ struct interface *ifp;
+ struct listnode *node;
+ struct connected *ifc;
+ struct prefix *p;
bgp = vty->index;
{
ret = inet_aton (argv[0], &id);
if (! ret)
- {
- vty_out (vty, "%% Malformed BGP router identifier%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
+ {
+ ifp = if_lookup_by_name_vrf(argv[0], bgp->vrf_id);
+ if (!ifp) {
+ vty_out (vty, "%% Malformed BGP router identifier%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc))
+ {
+ p = ifc->address;
+ if (p && (p->family == AF_INET))
+ {
+ id = p->u.prefix4;
+ break;
+ }
+ }
+ }
if (! IPV4_ADDR_SAME (&bgp->router_id_static, &id))
- {
- vty_out (vty, "%% BGP router-id doesn't match%s", VTY_NEWLINE);
- return CMD_WARNING;
- }
+ {
+ vty_out (vty, "%% BGP router-id doesn't match%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
}
bgp->router_id_static.s_addr = 0;
"Override configured router identifier\n"
"Manually configured router identifier\n")
+DEFUN (bgp_router_id_interface,
+ bgp_router_id_interface_cmd,
+ "bgp router-id IFNAME",
+ BGP_STR
+ "Override configured router identifier\n"
+ "Interface name\n")
+{
+ struct bgp *bgp;
+ struct interface *ifp;
+ struct connected *ifc;
+ struct listnode *node;
+ struct prefix *p;
+ struct vrf *vrf;
+
+ bgp = vty->index;
+ p = NULL;
+
+ ifp = if_lookup_by_name_vrf(argv[0], bgp->vrf_id);
+ if (!ifp)
+ {
+ vrf = vrf_lookup(bgp->vrf_id);
+ vty_out (vty, "%% Couldnt find interface %s in VRF %s%s", argv[0], vrf? vrf->name:"", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc))
+ {
+ p = ifc->address;
+
+ if (p && (p->family == AF_INET))
+ {
+ if (IPV4_ADDR_SAME (&bgp->router_id_static, &p->u.prefix4))
+ return CMD_SUCCESS;
+ bgp->router_id_static = p->u.prefix4;
+ bgp_router_id_set (bgp, &p->u.prefix4);
+ return CMD_SUCCESS;
+ }
+ }
+ vty_out (vty, "%% Couldnt assign the router-id%s", VTY_NEWLINE);
+ return CMD_WARNING;
+}
+
+ALIAS (no_bgp_router_id,
+ no_bgp_router_id_interface_cmd,
+ "no bgp router-id IFNAME",
+ NO_STR
+ BGP_STR
+ "Override configured router identifier\n"
+ "Interface name\n")
+
/* BGP Cluster ID. */
DEFUN (bgp_cluster_id,
install_element (BGP_NODE, &bgp_router_id_cmd);
install_element (BGP_NODE, &no_bgp_router_id_cmd);
install_element (BGP_NODE, &no_bgp_router_id_val_cmd);
+ install_element (BGP_NODE, &bgp_router_id_interface_cmd);
+ install_element (BGP_NODE, &no_bgp_router_id_interface_cmd);
/* "bgp cluster-id" commands. */
install_element (BGP_NODE, &bgp_cluster_id_cmd);
struct ospf *ospf = vty->index;
struct listnode *node;
struct ospf_area *area;
+ struct in_addr id;
+ struct interface *ifp;
+ struct connected *ifc;
+ struct prefix *p;
+ int ret;
if (!ospf)
return CMD_SUCCESS;
+ if (argc == 1)
+ {
+ ret = inet_aton (argv[0], &id);
+ if (! ret)
+ {
+ ifp = if_lookup_by_name(argv[0]);
+ if (!ifp) {
+ vty_out (vty, "%% Malformed OSPF router identifier%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc))
+ {
+ p = ifc->address;
+ if (p && (p->family == AF_INET))
+ {
+ id = p->u.prefix4;
+ break;
+ }
+ }
+ }
+
+ if (! IPV4_ADDR_SAME (&ospf->router_id_static, &id))
+ {
+ vty_out (vty, "%% OSPF router-id doesn't match%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ }
+
ospf->router_id_static.s_addr = 0;
for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
"router-id for the OSPF process\n"
"OSPF router-id in IP address format\n")
+DEFUN (ospf_router_id_interface,
+ ospf_router_id_interface_cmd,
+ "ospf router-id IFNAME",
+ "OSPF specific commands\n"
+ "router-id for the OSPF process\n"
+ "Interface name\n")
+{
+ struct ospf *ospf = vty->index;
+ struct listnode *node;
+ struct ospf_area *area;
+ struct interface *ifp;
+ struct connected *ifc;
+ struct prefix *p;
+
+ if (!ospf)
+ return CMD_SUCCESS;
+
+ p = NULL;
+ ifp = if_lookup_by_name(argv[0]);
+ if (!ifp)
+ {
+ vty_out (vty, "%% Couldnt find interface %s%s", argv[0], VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+
+ for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc))
+ {
+ p = ifc->address;
+
+ if (p && (p->family == AF_INET))
+ {
+ if (IPV4_ADDR_SAME (&ospf->router_id_static, &p->u.prefix4))
+ return CMD_SUCCESS;
+ ospf->router_id_static = p->u.prefix4;
+ for (ALL_LIST_ELEMENTS_RO (ospf->areas, node, area))
+ if (area->full_nbrs)
+ {
+ vty_out (vty, "For this router-id change to take effect,"
+ " save config and restart ospfd%s", VTY_NEWLINE);
+ return CMD_SUCCESS;
+ }
+ ospf_router_id_update (ospf);
+ return CMD_SUCCESS;
+ }
+ }
+ vty_out (vty, "%% Couldnt assign the router-id%s", VTY_NEWLINE);
+ return CMD_WARNING;
+}
+
+ALIAS (no_ospf_router_id,
+ no_ospf_router_id_interface_cmd,
+ "no ospf router-id IFNAME",
+ NO_STR
+ "OSPF specific commands\n"
+ "router-id for the OSPF process\n"
+ "Interface name\n")
+
static void
ospf_passive_interface_default (struct ospf *ospf, u_char newval)
{
/* "ospf router-id" commands. */
install_element (OSPF_NODE, &ospf_router_id_cmd);
install_element (OSPF_NODE, &ospf_router_id_old_cmd);
+ install_element (OSPF_NODE, &ospf_router_id_interface_cmd);
install_element (OSPF_NODE, &no_ospf_router_id_cmd);
install_element (OSPF_NODE, &no_ospf_router_id_val_cmd);
+ install_element (OSPF_NODE, &no_ospf_router_id_interface_cmd);
/* "passive-interface" commands. */
install_element (OSPF_NODE, &ospf_passive_interface_addr_cmd);