{
struct bgp *bgp;
struct listnode *node, *nnode;
- struct interface *ifp;
extern struct zclient *zclient;
/* it only makes sense for this to be called on a clean exit */
/* reverse bgp_zebra_init/if_init */
if (retain_mode)
if_add_hook (IF_DELETE_HOOK, NULL);
+ /*Pending: Must-Do, this needs to be moved in a loop for all the instances..
+ Do the iflist lookup for vrf associated with the instance
for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
{
struct listnode *c_node, *c_nnode;
for (ALL_LIST_ELEMENTS (ifp->connected, c_node, c_nnode, c))
bgp_connected_delete (c);
}
+ */
/* reverse bgp_attr_init */
bgp_attr_finish ();
if (bgp_ifindices_buf)
stream_free (bgp_ifindices_buf);
- /* reverse bgp_scan_init */
- bgp_scan_finish ();
-
/* reverse bgp_master_init */
if (bm->master)
thread_master_free (bm->master);
struct peer *peer;
struct peer *peer1;
char buf[SU_ADDRSTRLEN];
+ struct bgp *bgp;
+ char name[VRF_NAMSIZ + 1];
+ int rc;
+ socklen_t name_len = VRF_NAMSIZ;
sockunion_init (&su);
}
set_nonblocking (bgp_sock);
+ name[0] = '\0';
+ rc = getsockopt(bgp_sock, SOL_SOCKET, SO_BINDTODEVICE, name, &name_len);
+ if (rc != 0)
+ {
+ zlog_err ("[Error] BGP SO_BINDTODEVICE get failed (%s)", safe_strerror (errno));
+ return -1;
+ }
+ else if (name[0] != '\0')
+ {
+ /* Pending:
+ - Cleanup/add proper debugs in this area.
+ - Test/find a way to implement interface config within a VRF.
+ */
+ zlog_debug ("BGP accept vrf/interface %s, %u", name, name_len);
+ bgp = bgp_lookup_by_name (name);
+ if (bgp)
+ {
+ if (bgp->vrf_id)
+ zlog_debug ("BGP SO_BINDTODEVICE vrf-id in BGP %u", bgp->vrf_id);
+ else
+ {
+ zlog_debug ("BGP vrf not active!");
+ return -1;
+ }
+ }
+ /* if socket is interface bound, control may reach here, because name
+ may be equal to the interface name */
+ }
+ else
+ {
+ bgp = NULL;
+ }
+
/* Set socket send buffer size */
bgp_update_sock_send_buffer_size(bgp_sock);
/* Check remote IP address */
- peer1 = peer_lookup (NULL, &su);
+ peer1 = peer_lookup (bgp, &su);
if (! peer1)
{
- peer1 = peer_lookup_dynamic_neighbor (NULL, &su);
+ peer1 = peer_lookup_dynamic_neighbor (bgp, &su);
if (peer1)
{
/* Dynamic neighbor has been created, let it proceed */
int ret;
char *name;
- if (! peer->ifname && !peer->conf_if)
+ if (!peer->bgp->vrf_id && ! peer->ifname && !peer->conf_if)
return 0;
- name = (peer->conf_if ? peer->conf_if : peer->ifname);
+ name = (peer->conf_if ? peer->conf_if : (peer->ifname ? peer->ifname : peer->bgp->name));
+
+ zlog_debug ("Binding to interface %s\n", name);
if ( bgpd_privs.change (ZPRIVS_RAISE) )
zlog_err ("bgp_bind: could not raise privs");
-/* Route table for next-hop lookup cache. */
-struct bgp_table *bgp_nexthop_cache_table[AFI_MAX];
-
-/* Route table for connected route. */
-static struct bgp_table *bgp_connected_table[AFI_MAX];
-
-/* Route table for import-check */
-struct bgp_table *bgp_import_check_table[AFI_MAX];
-
char *
bnc_str (struct bgp_nexthop_cache *bnc, char *buf, int size)
{
int refcnt;
};
-static struct hash *bgp_address_hash;
-
static void *
bgp_address_hash_alloc (void *p)
{
}
void
-bgp_address_init (void)
+bgp_address_init (struct bgp *bgp)
{
- bgp_address_hash = hash_create (bgp_address_hash_key_make,
+ bgp->address_hash = hash_create (bgp_address_hash_key_make,
bgp_address_hash_cmp);
}
static void
-bgp_address_add (struct prefix *p)
+bgp_address_add (struct bgp *bgp, struct prefix *p)
{
struct bgp_addr tmp;
struct bgp_addr *addr;
tmp.addr = p->u.prefix4;
- addr = hash_get (bgp_address_hash, &tmp, bgp_address_hash_alloc);
+ addr = hash_get (bgp->address_hash, &tmp, bgp_address_hash_alloc);
if (!addr)
return;
}
static void
-bgp_address_del (struct prefix *p)
+bgp_address_del (struct bgp *bgp, struct prefix *p)
{
struct bgp_addr tmp;
struct bgp_addr *addr;
tmp.addr = p->u.prefix4;
- addr = hash_lookup (bgp_address_hash, &tmp);
+ addr = hash_lookup (bgp->address_hash, &tmp);
/* may have been deleted earlier by bgp_interface_down() */
if (addr == NULL)
return;
if (addr->refcnt == 0)
{
- hash_release (bgp_address_hash, addr);
+ hash_release (bgp->address_hash, addr);
XFREE (MTYPE_BGP_ADDR, addr);
}
}
};
void
-bgp_connected_add (struct connected *ifc)
+bgp_connected_add (struct bgp *bgp, struct connected *ifc)
{
struct prefix p;
struct prefix *addr;
struct bgp_node *rn;
struct bgp_connected_ref *bc;
- struct listnode *node, *nnode, *mnode;
- struct bgp *bgp;
+ struct listnode *node, *nnode;
struct peer *peer;
addr = ifc->address;
if (prefix_ipv4_any ((struct prefix_ipv4 *) &p))
return;
- bgp_address_add (addr);
+ bgp_address_add (bgp, addr);
- rn = bgp_node_get (bgp_connected_table[AFI_IP], (struct prefix *) &p);
+ rn = bgp_node_get (bgp->connected_table[AFI_IP], (struct prefix *) &p);
if (rn->info)
{
bc = rn->info;
rn->info = bc;
}
- for (ALL_LIST_ELEMENTS_RO (bm->bgp, mnode, bgp))
- {
- for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
- {
- if (peer->conf_if && (strcmp (peer->conf_if, ifc->ifp->name) == 0) &&
- !CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY))
- {
- if (peer_active(peer))
- BGP_EVENT_ADD (peer, BGP_Stop);
- BGP_EVENT_ADD (peer, BGP_Start);
- }
- }
- }
+ for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
+ {
+ if (peer->conf_if && (strcmp (peer->conf_if, ifc->ifp->name) == 0) &&
+ !CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY))
+ {
+ if (peer_active(peer))
+ BGP_EVENT_ADD (peer, BGP_Stop);
+ BGP_EVENT_ADD (peer, BGP_Start);
+ }
+ }
}
#ifdef HAVE_IPV6
else if (addr->family == AF_INET6)
if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
return;
- rn = bgp_node_get (bgp_connected_table[AFI_IP6], (struct prefix *) &p);
+ rn = bgp_node_get (bgp->connected_table[AFI_IP6], (struct prefix *) &p);
if (rn->info)
{
bc = rn->info;
}
void
-bgp_connected_delete (struct connected *ifc)
+bgp_connected_delete (struct bgp *bgp, struct connected *ifc)
{
struct prefix p;
struct prefix *addr;
if (prefix_ipv4_any ((struct prefix_ipv4 *) &p))
return;
- bgp_address_del (addr);
+ bgp_address_del (bgp, addr);
- rn = bgp_node_lookup (bgp_connected_table[AFI_IP], &p);
+ rn = bgp_node_lookup (bgp->connected_table[AFI_IP], &p);
if (! rn)
return;
if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
return;
- rn = bgp_node_lookup (bgp_connected_table[AFI_IP6], (struct prefix *) &p);
+ rn = bgp_node_lookup (bgp->connected_table[AFI_IP6], (struct prefix *) &p);
if (! rn)
return;
}
int
-bgp_nexthop_self (struct attr *attr)
+bgp_nexthop_self (struct bgp *bgp, struct attr *attr)
{
struct bgp_addr tmp, *addr;
tmp.addr = attr->nexthop;
- addr = hash_lookup (bgp_address_hash, &tmp);
+ addr = hash_lookup (bgp->address_hash, &tmp);
if (addr)
return 1;
p.prefixlen = IPV4_MAX_BITLEN;
p.u.prefix4 = nexthop;
- rn1 = bgp_node_match (bgp_connected_table[AFI_IP], &p);
+ rn1 = bgp_node_match (peer->bgp->connected_table[AFI_IP], &p);
if (!rn1)
return 0;
p.prefixlen = IPV4_MAX_BITLEN;
p.u.prefix4 = peer->su.sin.sin_addr;
- rn2 = bgp_node_match (bgp_connected_table[AFI_IP], &p);
+ rn2 = bgp_node_match (peer->bgp->connected_table[AFI_IP], &p);
if (!rn2)
{
bgp_unlock_node(rn1);
}
static int
-show_ip_bgp_nexthop_table (struct vty *vty, int detail)
+show_ip_bgp_nexthop_table (struct vty *vty, const char *name, int detail)
{
struct bgp_node *rn;
struct bgp_nexthop_cache *bnc;
struct nexthop *nexthop;
time_t tbuf;
afi_t afi;
+ struct bgp *bgp;
+
+ if (name)
+ bgp = bgp_lookup_by_name (name);
+ else
+ bgp = bgp_get_default ();
+ if (!bgp)
+ {
+ vty_out (vty, "%% No such BGP instance exist%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
vty_out (vty, "Current BGP nexthop cache:%s", VTY_NEWLINE);
for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
{
- for (rn = bgp_table_top (bgp_nexthop_cache_table[afi]); rn; rn = bgp_route_next (rn))
+ for (rn = bgp_table_top (bgp->nexthop_cache_table[afi]); rn; rn = bgp_route_next (rn))
{
if ((bnc = rn->info) != NULL)
{
BGP_STR
"BGP nexthop table\n")
{
- return show_ip_bgp_nexthop_table (vty, 0);
+ return show_ip_bgp_nexthop_table (vty, NULL, 0);
}
DEFUN (show_ip_bgp_nexthop_detail,
BGP_STR
"BGP nexthop table\n")
{
- return show_ip_bgp_nexthop_table (vty, 1);
+ return show_ip_bgp_nexthop_table (vty, NULL, 1);
}
void
-bgp_scan_init (void)
+bgp_scan_init (struct bgp *bgp)
{
- bgp_nexthop_cache_table[AFI_IP] = bgp_table_init (AFI_IP, SAFI_UNICAST);
- bgp_connected_table[AFI_IP] = bgp_table_init (AFI_IP, SAFI_UNICAST);
- bgp_import_check_table[AFI_IP] = bgp_table_init (AFI_IP, SAFI_UNICAST);
+ bgp->nexthop_cache_table[AFI_IP] = bgp_table_init (AFI_IP, SAFI_UNICAST);
+ bgp->connected_table[AFI_IP] = bgp_table_init (AFI_IP, SAFI_UNICAST);
+ bgp->import_check_table[AFI_IP] = bgp_table_init (AFI_IP, SAFI_UNICAST);
#ifdef HAVE_IPV6
- bgp_nexthop_cache_table[AFI_IP6] = bgp_table_init (AFI_IP6, SAFI_UNICAST);
- bgp_connected_table[AFI_IP6] = bgp_table_init (AFI_IP6, SAFI_UNICAST);
- bgp_import_check_table[AFI_IP6] = bgp_table_init (AFI_IP6, SAFI_UNICAST);
+ bgp->nexthop_cache_table[AFI_IP6] = bgp_table_init (AFI_IP6, SAFI_UNICAST);
+ bgp->connected_table[AFI_IP6] = bgp_table_init (AFI_IP6, SAFI_UNICAST);
+ bgp->import_check_table[AFI_IP6] = bgp_table_init (AFI_IP6, SAFI_UNICAST);
#endif /* HAVE_IPV6 */
}
}
void
-bgp_scan_finish (void)
+bgp_scan_finish (struct bgp *bgp)
{
/* Only the current one needs to be reset. */
- bgp_nexthop_cache_reset (bgp_nexthop_cache_table[AFI_IP]);
+ bgp_nexthop_cache_reset (bgp->nexthop_cache_table[AFI_IP]);
- bgp_table_unlock (bgp_nexthop_cache_table[AFI_IP]);
- bgp_nexthop_cache_table[AFI_IP] = NULL;
+ bgp_table_unlock (bgp->nexthop_cache_table[AFI_IP]);
+ bgp->nexthop_cache_table[AFI_IP] = NULL;
- bgp_table_unlock (bgp_connected_table[AFI_IP]);
- bgp_connected_table[AFI_IP] = NULL;
+ bgp_table_unlock (bgp->connected_table[AFI_IP]);
+ bgp->connected_table[AFI_IP] = NULL;
- bgp_table_unlock (bgp_import_check_table[AFI_IP]);
- bgp_import_check_table[AFI_IP] = NULL;
+ bgp_table_unlock (bgp->import_check_table[AFI_IP]);
+ bgp->import_check_table[AFI_IP] = NULL;
#ifdef HAVE_IPV6
/* Only the current one needs to be reset. */
- bgp_nexthop_cache_reset (bgp_nexthop_cache_table[AFI_IP6]);
+ bgp_nexthop_cache_reset (bgp->nexthop_cache_table[AFI_IP6]);
- bgp_table_unlock (bgp_nexthop_cache_table[AFI_IP6]);
- bgp_nexthop_cache_table[AFI_IP6] = NULL;
+ bgp_table_unlock (bgp->nexthop_cache_table[AFI_IP6]);
+ bgp->nexthop_cache_table[AFI_IP6] = NULL;
- bgp_table_unlock (bgp_connected_table[AFI_IP6]);
- bgp_connected_table[AFI_IP6] = NULL;
+ bgp_table_unlock (bgp->connected_table[AFI_IP6]);
+ bgp->connected_table[AFI_IP6] = NULL;
- bgp_table_unlock (bgp_import_check_table[AFI_IP6]);
- bgp_import_check_table[AFI_IP6] = NULL;
+ bgp_table_unlock (bgp->import_check_table[AFI_IP6]);
+ bgp->import_check_table[AFI_IP6] = NULL;
#endif /* HAVE_IPV6 */
}
extern int bgp_nexthop_lookup (afi_t, struct peer *peer, struct bgp_info *,
int *, int *);
-extern void bgp_connected_add (struct connected *c);
-extern void bgp_connected_delete (struct connected *c);
+extern void bgp_connected_add (struct bgp *bgp, struct connected *c);
+extern void bgp_connected_delete (struct bgp *bgp, struct connected *c);
extern int bgp_multiaccess_check_v4 (struct in_addr, struct peer *);
extern int bgp_config_write_scan_time (struct vty *);
-extern int bgp_nexthop_self (struct attr *);
-extern void bgp_address_init (void);
+extern int bgp_nexthop_self (struct bgp *, struct attr *);
+extern void bgp_address_init (struct bgp *);
extern struct bgp_nexthop_cache *bnc_new(void);
extern void bnc_free(struct bgp_nexthop_cache *bnc);
extern void bnc_nexthop_free(struct bgp_nexthop_cache *bnc);
extern char *bnc_str(struct bgp_nexthop_cache *bnc, char *buf, int size);
-extern void bgp_scan_init(void);
+extern void bgp_scan_init(struct bgp *bgp);
+extern void bgp_scan_finish(struct bgp *bgp);
extern void bgp_scan_vty_init(void);
#endif /* _QUAGGA_BGP_NEXTHOP_H */
#include "bgpd/bgp_fsm.h"
extern struct zclient *zclient;
-extern struct bgp_table *bgp_nexthop_cache_table[AFI_MAX];
-extern struct bgp_table *bgp_import_check_table[AFI_MAX];
static void register_zebra_rnh(struct bgp_nexthop_cache *bnc,
int is_bgp_static_route);
return 0;
if (is_bgp_static_route)
- rn = bgp_node_get (bgp_import_check_table[afi], &p);
+ rn = bgp_node_get (bgp->import_check_table[afi], &p);
else
- rn = bgp_node_get (bgp_nexthop_cache_table[afi], &p);
+ rn = bgp_node_get (bgp->nexthop_cache_table[afi], &p);
if (!rn->info)
{
else
return;
- rn = bgp_node_lookup(bgp_nexthop_cache_table[family2afi(p.family)], &p);
+ rn = bgp_node_lookup(peer->bgp->nexthop_cache_table[family2afi(p.family)], &p);
if (!rn || !rn->info)
{
if (BGP_DEBUG(nht, NHT))
u_char nexthop_num;
struct prefix p;
int i;
+ struct bgp *bgp;
+
+ bgp = bgp_lookup_by_vrf_id (vrf_id);
+ if (!bgp)
+ {
+ zlog_err("parse nexthop update: instance not found for vrf_id %d", vrf_id);
+ return;
+ }
s = zclient->ibuf;
}
if (command == ZEBRA_NEXTHOP_UPDATE)
- rn = bgp_node_lookup(bgp_nexthop_cache_table[family2afi(p.family)], &p);
+ rn = bgp_node_lookup(bgp->nexthop_cache_table[family2afi(p.family)], &p);
else if (command == ZEBRA_IMPORT_CHECK_UPDATE)
- rn = bgp_node_lookup(bgp_import_check_table[family2afi(p.family)], &p);
+ rn = bgp_node_lookup(bgp->import_check_table[family2afi(p.family)], &p);
if (!rn || !rn->info)
{
/* Check socket. */
if (!zclient || zclient->sock < 0)
{
- /* Pending: hiding this error now, because bgp_nht_register_all() is implemented.
+ /* Hiding this error now, because bgp_nht_register_all() is implemented.
which tries it after zclient_connect()
zlog_debug("%s: Can't send NH register, Zebra client not established",
__FUNCTION__);
+ Pending: remove this comment after reviewing to see if no message is needed in this case
*/
return;
}
p = &(bnc->node->p);
s = zclient->obuf;
stream_reset (s);
- zclient_create_header (s, command, VRF_DEFAULT);
+ zclient_create_header (s, command, bnc->bgp->vrf_id);
if (CHECK_FLAG(bnc->flags, BGP_NEXTHOP_CONNECTED) ||
CHECK_FLAG(bnc->flags, BGP_STATIC_ROUTE_EXACT_MATCH))
stream_putc(s, 1);
}
void
-bgp_nht_register_all (void)
+bgp_nht_register_all (vrf_id_t vrf_id)
{
struct bgp_node *rn;
struct bgp_nexthop_cache *bnc;
+ struct bgp *bgp;
+
+ bgp = bgp_lookup_by_vrf_id (vrf_id);
+ if (!bgp)
+ {
+ zlog_err("bgp_nht_register_all: instance not found for vrf_id %d", vrf_id);
+ return;
+ }
- for (rn = bgp_table_top (bgp_nexthop_cache_table[AFI_IP]); rn; rn = bgp_route_next (rn))
+ for (rn = bgp_table_top (bgp->nexthop_cache_table[AFI_IP]); rn; rn = bgp_route_next (rn))
if ((bnc = rn->info) != NULL &&
!CHECK_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED))
{
register_zebra_rnh(bnc, 0);
}
- for (rn = bgp_table_top (bgp_nexthop_cache_table[AFI_IP6]); rn; rn = bgp_route_next (rn))
+ for (rn = bgp_table_top (bgp->nexthop_cache_table[AFI_IP6]); rn; rn = bgp_route_next (rn))
if ((bnc = rn->info) != NULL &&
!CHECK_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED))
{
register_zebra_rnh(bnc, 0);
}
- for (rn = bgp_table_top (bgp_import_check_table[AFI_IP]); rn; rn = bgp_route_next (rn))
+ for (rn = bgp_table_top (bgp->import_check_table[AFI_IP]); rn; rn = bgp_route_next (rn))
if ((bnc = rn->info) != NULL &&
!CHECK_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED))
{
register_zebra_rnh(bnc, 1);
}
- for (rn = bgp_table_top (bgp_import_check_table[AFI_IP6]); rn; rn = bgp_route_next (rn))
+ for (rn = bgp_table_top (bgp->import_check_table[AFI_IP6]); rn; rn = bgp_route_next (rn))
if ((bnc = rn->info) != NULL &&
!CHECK_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED))
{
#ifndef _BGP_NHT_H
#define _BGP_NHT_H
-extern void bgp_nht_register_all (void);
+extern void bgp_nht_register_all (vrf_id_t);
/**
* bgp_parse_nexthop_update() - parse a nexthop update message from Zebra.
group_announce_route(bgp, afi, safi, rn, new_select);
/* FIB update. */
- if ((safi == SAFI_UNICAST || safi == SAFI_MULTICAST) && (! bgp->name &&
+ if ((safi == SAFI_UNICAST || safi == SAFI_MULTICAST) && (! bgp_flag_check(bgp, BGP_FLAG_INSTANCE_TYPE_VIEW) &&
! bgp_option_check (BGP_OPT_NO_FIB)))
{
if (new_select
/* Check if received nexthop is valid or not. */
static int
-bgp_update_martian_nexthop (afi_t afi, safi_t safi, struct attr *attr)
+bgp_update_martian_nexthop (struct bgp *bgp, afi_t afi, safi_t safi, struct attr *attr)
{
struct attr_extra *attre = attr->extra;
int ret = 0;
{
if (attr->nexthop.s_addr == 0 ||
IPV4_CLASS_DE (ntohl (attr->nexthop.s_addr)) ||
- bgp_nexthop_self (attr))
+ bgp_nexthop_self (bgp, attr))
ret = 1;
}
}
/* next hop check. */
- if (bgp_update_martian_nexthop (afi, safi, &new_attr))
+ if (bgp_update_martian_nexthop (bgp, afi, safi, &new_attr))
{
reason = "martian or self next-hop;";
bgp_attr_flush (&new_attr);
return CMD_SUCCESS;
}
+void
+bgp_static_add (struct bgp *bgp)
+{
+ afi_t afi;
+ safi_t safi;
+ struct bgp_node *rn;
+ struct bgp_node *rm;
+ struct bgp_table *table;
+ struct bgp_static *bgp_static;
+
+ for (afi = AFI_IP; afi < AFI_MAX; afi++)
+ for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
+ for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
+ if (rn->info != NULL)
+ {
+ if (safi == SAFI_MPLS_VPN)
+ {
+ table = rn->info;
+
+ for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
+ {
+ bgp_static = rn->info;
+ bgp_static_update_vpnv4 (bgp, &rm->p,
+ AFI_IP, SAFI_MPLS_VPN,
+ (struct prefix_rd *)&rn->p,
+ bgp_static->tag);
+ }
+ }
+ else
+ {
+ bgp_static_update (bgp, &rn->p, rn->info, afi, safi);
+ }
+ }
+}
+
/* Called from bgp_delete(). Delete all static routes from the BGP
instance. */
void
/* Redistribute route treatment. */
void
-bgp_redistribute_add (struct prefix *p, const struct in_addr *nexthop,
+bgp_redistribute_add (struct bgp *bgp, struct prefix *p, const struct in_addr *nexthop,
const struct in6_addr *nexthop6, unsigned int ifindex,
u_int32_t metric, u_char type, u_short instance, u_short tag)
{
- struct bgp *bgp;
- struct listnode *node, *nnode;
struct bgp_info *new;
struct bgp_info *bi;
struct bgp_info info;
attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
attr.extra->tag = tag;
- for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
+ afi = family2afi (p->family);
+
+ red = bgp_redist_lookup(bgp, afi, type, instance);
+ if (red)
{
- afi = family2afi (p->family);
+ struct attr attr_new;
+ struct attr_extra extra_new;
- red = bgp_redist_lookup(bgp, afi, type, instance);
- if (red)
- {
- struct attr attr_new;
- struct attr_extra extra_new;
+ /* Copy attribute for modification. */
+ attr_new.extra = &extra_new;
+ bgp_attr_dup (&attr_new, &attr);
- /* Copy attribute for modification. */
- attr_new.extra = &extra_new;
- bgp_attr_dup (&attr_new, &attr);
+ if (red->redist_metric_flag)
+ attr_new.med = red->redist_metric;
- if (red->redist_metric_flag)
- attr_new.med = red->redist_metric;
+ /* Apply route-map. */
+ if (red->rmap.name)
+ {
+ info.peer = bgp->peer_self;
+ info.attr = &attr_new;
- /* Apply route-map. */
- if (red->rmap.name)
- {
- info.peer = bgp->peer_self;
- info.attr = &attr_new;
+ SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_REDISTRIBUTE);
- SET_FLAG (bgp->peer_self->rmap_type, PEER_RMAP_TYPE_REDISTRIBUTE);
+ ret = route_map_apply (red->rmap.map, p, RMAP_BGP, &info);
- ret = route_map_apply (red->rmap.map, p, RMAP_BGP, &info);
+ bgp->peer_self->rmap_type = 0;
- bgp->peer_self->rmap_type = 0;
+ if (ret == RMAP_DENYMATCH)
+ {
+ /* Free uninterned attribute. */
+ bgp_attr_flush (&attr_new);
+
+ /* Unintern original. */
+ aspath_unintern (&attr.aspath);
+ bgp_attr_extra_free (&attr);
+ bgp_redistribute_delete (bgp, p, type, instance);
+ return;
+ }
+ }
- if (ret == RMAP_DENYMATCH)
- {
- /* Free uninterned attribute. */
- bgp_attr_flush (&attr_new);
-
- /* Unintern original. */
- aspath_unintern (&attr.aspath);
- bgp_attr_extra_free (&attr);
- bgp_redistribute_delete (p, type, instance);
- return;
- }
- }
+ bn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST],
+ afi, SAFI_UNICAST, p, NULL);
- bn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST],
- afi, SAFI_UNICAST, p, NULL);
-
- new_attr = bgp_attr_intern (&attr_new);
+ new_attr = bgp_attr_intern (&attr_new);
- for (bi = bn->info; bi; bi = bi->next)
- if (bi->peer == bgp->peer_self
- && bi->sub_type == BGP_ROUTE_REDISTRIBUTE)
- break;
-
- if (bi)
- {
- /* Ensure the (source route) type is updated. */
- bi->type = type;
- if (attrhash_cmp (bi->attr, new_attr) &&
- !CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
- {
- bgp_attr_unintern (&new_attr);
- aspath_unintern (&attr.aspath);
- bgp_attr_extra_free (&attr);
- bgp_unlock_node (bn);
- return;
- }
- else
- {
- /* The attribute is changed. */
- bgp_info_set_flag (bn, bi, BGP_INFO_ATTR_CHANGED);
-
- /* Rewrite BGP route information. */
- if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
- bgp_info_restore(bn, bi);
- else
- bgp_aggregate_decrement (bgp, p, bi, afi, SAFI_UNICAST);
- bgp_attr_unintern (&bi->attr);
- bi->attr = new_attr;
- bi->uptime = bgp_clock ();
-
- /* Process change. */
- bgp_aggregate_increment (bgp, p, bi, afi, SAFI_UNICAST);
- bgp_process (bgp, bn, afi, SAFI_UNICAST);
- bgp_unlock_node (bn);
- aspath_unintern (&attr.aspath);
- bgp_attr_extra_free (&attr);
- return;
- }
- }
+ for (bi = bn->info; bi; bi = bi->next)
+ if (bi->peer == bgp->peer_self
+ && bi->sub_type == BGP_ROUTE_REDISTRIBUTE)
+ break;
+
+ if (bi)
+ {
+ /* Ensure the (source route) type is updated. */
+ bi->type = type;
+ if (attrhash_cmp (bi->attr, new_attr) &&
+ !CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
+ {
+ bgp_attr_unintern (&new_attr);
+ aspath_unintern (&attr.aspath);
+ bgp_attr_extra_free (&attr);
+ bgp_unlock_node (bn);
+ return;
+ }
+ else
+ {
+ /* The attribute is changed. */
+ bgp_info_set_flag (bn, bi, BGP_INFO_ATTR_CHANGED);
- new = info_make(type, BGP_ROUTE_REDISTRIBUTE, instance, bgp->peer_self,
- new_attr, bn);
- SET_FLAG (new->flags, BGP_INFO_VALID);
+ /* Rewrite BGP route information. */
+ if (CHECK_FLAG(bi->flags, BGP_INFO_REMOVED))
+ bgp_info_restore(bn, bi);
+ else
+ bgp_aggregate_decrement (bgp, p, bi, afi, SAFI_UNICAST);
+ bgp_attr_unintern (&bi->attr);
+ bi->attr = new_attr;
+ bi->uptime = bgp_clock ();
+
+ /* Process change. */
+ bgp_aggregate_increment (bgp, p, bi, afi, SAFI_UNICAST);
+ bgp_process (bgp, bn, afi, SAFI_UNICAST);
+ bgp_unlock_node (bn);
+ aspath_unintern (&attr.aspath);
+ bgp_attr_extra_free (&attr);
+ return;
+ }
+ }
- bgp_aggregate_increment (bgp, p, new, afi, SAFI_UNICAST);
- bgp_info_add (bn, new);
- bgp_unlock_node (bn);
- bgp_process (bgp, bn, afi, SAFI_UNICAST);
- }
+ new = info_make(type, BGP_ROUTE_REDISTRIBUTE, instance, bgp->peer_self,
+ new_attr, bn);
+ SET_FLAG (new->flags, BGP_INFO_VALID);
+
+ bgp_aggregate_increment (bgp, p, new, afi, SAFI_UNICAST);
+ bgp_info_add (bn, new);
+ bgp_unlock_node (bn);
+ bgp_process (bgp, bn, afi, SAFI_UNICAST);
}
/* Unintern original. */
}
void
-bgp_redistribute_delete (struct prefix *p, u_char type, u_short instance)
+bgp_redistribute_delete (struct bgp *bgp, struct prefix *p, u_char type, u_short instance)
{
- struct bgp *bgp;
- struct listnode *node, *nnode;
afi_t afi;
struct bgp_node *rn;
struct bgp_info *ri;
struct bgp_redist *red;
- for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
- {
- afi = family2afi (p->family);
+ afi = family2afi (p->family);
- red = bgp_redist_lookup(bgp, afi, type, instance);
- if (red)
- {
- rn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST], afi, SAFI_UNICAST, p, NULL);
+ red = bgp_redist_lookup(bgp, afi, type, instance);
+ if (red)
+ {
+ rn = bgp_afi_node_get (bgp->rib[afi][SAFI_UNICAST], afi, SAFI_UNICAST, p, NULL);
- for (ri = rn->info; ri; ri = ri->next)
- if (ri->peer == bgp->peer_self
- && ri->type == type)
- break;
+ for (ri = rn->info; ri; ri = ri->next)
+ if (ri->peer == bgp->peer_self
+ && ri->type == type)
+ break;
- if (ri)
- {
- bgp_aggregate_decrement (bgp, p, ri, afi, SAFI_UNICAST);
- bgp_info_delete (rn, ri);
- bgp_process (bgp, rn, afi, SAFI_UNICAST);
- }
- bgp_unlock_node (rn);
- }
+ if (ri)
+ {
+ bgp_aggregate_decrement (bgp, p, ri, afi, SAFI_UNICAST);
+ bgp_info_delete (rn, ri);
+ bgp_process (bgp, rn, afi, SAFI_UNICAST);
+ }
+ bgp_unlock_node (rn);
}
}
bgp = bgp_lookup_by_name (view_name);
if (bgp == NULL)
{
- vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
+ vty_out (vty, "Can't find BGP instance %s%s", view_name, VTY_NEWLINE);
return CMD_WARNING;
}
}
DEFUN (show_ip_bgp_view,
show_ip_bgp_view_cmd,
- "show ip bgp view WORD {json}",
+ "show ip bgp (view|vrf) WORD {json}",
SHOW_STR
IP_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"JavaScript Object Notation\n")
{
struct bgp *bgp;
/* BGP structure lookup. */
- bgp = bgp_lookup_by_name (argv[0]);
+ bgp = bgp_lookup_by_name (argv[1]);
if (bgp == NULL)
{
- vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
+ vty_out (vty, "Can't find BGP instance %s%s", argv[1], VTY_NEWLINE);
return CMD_WARNING;
}
DEFUN (show_ip_bgp_view_route,
show_ip_bgp_view_route_cmd,
- "show ip bgp view WORD A.B.C.D {json}",
+ "show ip bgp (view|vrf) WORD A.B.C.D {json}",
SHOW_STR
IP_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Network in the BGP routing table to display\n"
"JavaScript Object Notation\n")
{
- return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 0, BGP_PATH_ALL, use_json(argc, argv));
+ return bgp_show_route (vty, argv[1], argv[2], AFI_IP, SAFI_UNICAST, NULL, 0, BGP_PATH_ALL, use_json(argc, argv));
}
DEFUN (show_ip_bgp_view_prefix,
show_ip_bgp_view_prefix_cmd,
- "show ip bgp view WORD A.B.C.D/M {json}",
+ "show ip bgp (view|vrf) WORD A.B.C.D/M {json}",
SHOW_STR
IP_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
"JavaScript Object Notation\n")
{
- return bgp_show_route (vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST, NULL, 1, BGP_PATH_ALL, use_json(argc, argv));
+ return bgp_show_route (vty, argv[1], argv[2], AFI_IP, SAFI_UNICAST, NULL, 1, BGP_PATH_ALL, use_json(argc, argv));
}
#ifdef HAVE_IPV6
DEFUN (show_bgp_view,
show_bgp_view_cmd,
- "show bgp view WORD {json}",
+ "show bgp (view|vrf) WORD {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"JavaScript Object Notation\n")
{
struct bgp *bgp;
/* BGP structure lookup. */
- bgp = bgp_lookup_by_name (argv[0]);
+ bgp = bgp_lookup_by_name (argv[1]);
if (bgp == NULL)
{
- vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
+ vty_out (vty, "Can't find BGP instance %s%s", argv[1], VTY_NEWLINE);
return CMD_WARNING;
}
ALIAS (show_bgp_view,
show_bgp_view_ipv6_cmd,
- "show bgp view WORD ipv6 {json}",
+ "show bgp (view|vrf) WORD ipv6 {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
"JavaScript Object Notation\n")
DEFUN (show_bgp_view_route,
show_bgp_view_route_cmd,
- "show bgp view WORD X:X::X:X {json}",
+ "show bgp (view|vrf) WORD X:X::X:X {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Network in the BGP routing table to display\n"
"JavaScript Object Notation\n")
{
- return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 0, BGP_PATH_ALL, use_json(argc, argv));
+ return bgp_show_route (vty, argv[1], argv[2], AFI_IP6, SAFI_UNICAST, NULL, 0, BGP_PATH_ALL, use_json(argc, argv));
}
ALIAS (show_bgp_view_route,
show_bgp_view_ipv6_route_cmd,
- "show bgp view WORD ipv6 X:X::X:X {json}",
+ "show bgp (view|vrf) WORD ipv6 X:X::X:X {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
"Network in the BGP routing table to display\n"
"JavaScript Object Notation\n")
DEFUN (show_bgp_view_prefix,
show_bgp_view_prefix_cmd,
- "show bgp view WORD X:X::X:X/M {json}",
+ "show bgp (view|vrf) WORD X:X::X:X/M {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"IPv6 prefix <network>/<length>\n"
"JavaScript Object Notation\n")
{
- return bgp_show_route (vty, argv[0], argv[1], AFI_IP6, SAFI_UNICAST, NULL, 1, BGP_PATH_ALL, use_json(argc, argv));
+ return bgp_show_route (vty, argv[1], argv[2], AFI_IP6, SAFI_UNICAST, NULL, 1, BGP_PATH_ALL, use_json(argc, argv));
}
ALIAS (show_bgp_view_prefix,
show_bgp_view_ipv6_prefix_cmd,
- "show bgp view WORD ipv6 X:X::X:X/M {json}",
+ "show bgp (view|vrf) WORD ipv6 X:X::X:X/M {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
"IPv6 prefix <network>/<length>\n"
"JavaScript Object Notation\n")
bgp = bgp_lookup_by_name (view_name);
if (bgp == NULL)
{
- vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
+ vty_out (vty, "Can't find BGP instance %s%s", view_name, VTY_NEWLINE);
return CMD_WARNING;
}
}
DEFUN (show_bgp_view_afi_safi_community_all,
show_bgp_view_afi_safi_community_all_cmd,
#ifdef HAVE_IPV6
- "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community",
+ "show bgp (view|vrf) WORD (ipv4|ipv6) (unicast|multicast) community",
#else
- "show bgp view WORD ipv4 (unicast|multicast) community",
+ "show bgp (view|vrf) WORD ipv4 (unicast|multicast) community",
#endif
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
#ifdef HAVE_IPV6
"Address family\n"
struct bgp *bgp;
/* BGP structure lookup. */
- bgp = bgp_lookup_by_name (argv[0]);
+ bgp = bgp_lookup_by_name (argv[1]);
if (bgp == NULL)
{
- vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
+ vty_out (vty, "Can't find BGP instance %s%s", argv[1], VTY_NEWLINE);
return CMD_WARNING;
}
#ifdef HAVE_IPV6
- afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
- safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
+ afi = (strncmp (argv[2], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
+ safi = (strncmp (argv[3], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
#else
afi = AFI_IP;
- safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
+ safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
#endif
return bgp_show (vty, bgp, afi, safi, bgp_show_type_community_all, NULL, 0);
}
DEFUN (show_bgp_view_afi_safi_community,
show_bgp_view_afi_safi_community_cmd,
#ifdef HAVE_IPV6
- "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
+ "show bgp (view|vrf) WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
#else
- "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
+ "show bgp (view|vrf) WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export)",
#endif
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
#ifdef HAVE_IPV6
"Address family\n"
int safi;
#ifdef HAVE_IPV6
- afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
- safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
- return bgp_show_community (vty, argv[0], argc-3, &argv[3], 0, afi, safi);
+ afi = (strncmp (argv[2], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
+ safi = (strncmp (argv[3], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
+ return bgp_show_community (vty, argv[1], argc-4, &argv[4], 0, afi, safi);
#else
afi = AFI_IP;
- safi = (strncmp (argv[1], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
- return bgp_show_community (vty, argv[0], argc-2, &argv[2], 0, afi, safi);
+ safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
+ return bgp_show_community (vty, argv[1], argc-3, &argv[3], 0, afi, safi);
#endif
}
ALIAS (show_bgp_view_afi_safi_community,
show_bgp_view_afi_safi_community2_cmd,
#ifdef HAVE_IPV6
- "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
+ "show bgp (view|vrf) WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
#else
- "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
+ "show bgp (view|vrf) WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
#endif
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
#ifdef HAVE_IPV6
"Address family\n"
ALIAS (show_bgp_view_afi_safi_community,
show_bgp_view_afi_safi_community3_cmd,
#ifdef HAVE_IPV6
- "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
+ "show bgp (view|vrf) WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
#else
- "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
+ "show bgp (view|vrf) WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
#endif
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
#ifdef HAVE_IPV6
"Address family\n"
ALIAS (show_bgp_view_afi_safi_community,
show_bgp_view_afi_safi_community4_cmd,
#ifdef HAVE_IPV6
- "show bgp view WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
+ "show bgp (view|vrf) WORD (ipv4|ipv6) (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
#else
- "show bgp view WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
+ "show bgp (view|vrf) WORD ipv4 (unicast|multicast) community (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export) (AA:NN|local-AS|no-advertise|no-export)",
#endif
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
#ifdef HAVE_IPV6
"Address family\n"
json_object_free(json_no);
}
else
- vty_out (vty, "Can't find BGP view %s%s", view_name, VTY_NEWLINE);
+ vty_out (vty, "Can't find BGP instance %s%s", view_name, VTY_NEWLINE);
return NULL;
}
}
DEFUN (show_bgp_statistics_view,
show_bgp_statistics_view_cmd,
- "show bgp view WORD (ipv4|ipv6) (unicast|multicast) statistics",
+ "show bgp (view|vrf) WORD (ipv4|ipv6) (unicast|multicast) statistics",
SHOW_STR
BGP_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"Address family\n"
"Address family\n"
"Address Family modifier\n"
"Address Family modifier\n"
"BGP RIB advertisement statistics\n")
{
- return bgp_table_stats_vty (vty, NULL, argv[0], argv[1]);
+ return bgp_table_stats_vty (vty, NULL, argv[1], argv[2]);
}
ALIAS (show_bgp_statistics_view,
show_bgp_statistics_view_vpnv4_cmd,
- "show bgp view WORD (ipv4) (vpnv4) statistics",
+ "show bgp (view|vrf) WORD (ipv4) (vpnv4) statistics",
SHOW_STR
BGP_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"Address family\n"
"Address Family modifier\n"
"BGP RIB advertisement statistics\n")
DEFUN (show_ip_bgp_view_neighbor_advertised_route,
show_ip_bgp_view_neighbor_advertised_route_cmd,
- "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
+ "show ip bgp (view|vrf) WORD neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
SHOW_STR
IP_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
"Neighbor to display information about\n"
struct peer *peer;
u_char uj = use_json(argc, argv);
- if (argc == 3 || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
- peer = peer_lookup_in_view (vty, argv[0], argv[1], uj);
+ if (argc == 4 || (argc == 3 && argv[2] && strcmp(argv[2], "json") != 0))
+ peer = peer_lookup_in_view (vty, argv[1], argv[2], uj);
else
- peer = peer_lookup_in_view (vty, NULL, argv[0], uj);
+ peer = peer_lookup_in_view (vty, NULL, argv[1], uj);
if (! peer)
return CMD_WARNING;
#ifdef HAVE_IPV6
DEFUN (show_bgp_view_neighbor_advertised_route,
show_bgp_view_neighbor_advertised_route_cmd,
- "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
+ "show bgp (view|vrf) WORD neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
"Neighbor to display information about\n"
struct peer *peer;
u_char uj = use_json(argc, argv);
- if (argc == 3 || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
- peer = peer_lookup_in_view (vty, argv[0], argv[1], uj);
+ if (argc == 4 || (argc == 3 && argv[2] && strcmp(argv[2], "json") != 0))
+ peer = peer_lookup_in_view (vty, argv[1], argv[2], uj);
else
- peer = peer_lookup_in_view (vty, NULL, argv[0], uj);
+ peer = peer_lookup_in_view (vty, NULL, argv[1], uj);
if (! peer)
return CMD_WARNING;
ALIAS (show_bgp_view_neighbor_advertised_route,
show_bgp_view_ipv6_neighbor_advertised_route_cmd,
- "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
+ "show bgp (view|vrf) WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) advertised-routes {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
DEFUN (show_bgp_view_neighbor_received_routes,
show_bgp_view_neighbor_received_routes_cmd,
- "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
+ "show bgp (view|vrf) WORD neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
"Neighbor to display information about\n"
if (uj)
{
- if (argc == 3)
- peer = peer_lookup_in_view (vty, argv[0], argv[1], uj);
+ if (argc == 4)
+ peer = peer_lookup_in_view (vty, argv[1], argv[2], uj);
else
- peer = peer_lookup_in_view (vty, NULL, argv[0], uj);
+ peer = peer_lookup_in_view (vty, NULL, argv[1], uj);
}
else
{
- if (argc == 2)
- peer = peer_lookup_in_view (vty, argv[0], argv[1], uj);
+ if (argc == 3)
+ peer = peer_lookup_in_view (vty, argv[1], argv[2], uj);
else
- peer = peer_lookup_in_view (vty, NULL, argv[0], uj);
+ peer = peer_lookup_in_view (vty, NULL, argv[1], uj);
}
if (! peer)
DEFUN (show_ip_bgp_view_neighbor_received_routes,
show_ip_bgp_view_neighbor_received_routes_cmd,
- "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
+ "show ip bgp (view|vrf) WORD neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
SHOW_STR
IP_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
"Neighbor to display information about\n"
struct peer *peer;
u_char uj = use_json(argc, argv);
- if (argc == 3 || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
- peer = peer_lookup_in_view (vty, argv[0], argv[1], uj);
+ if (argc == 4 || (argc == 3 && argv[2] && strcmp(argv[2], "json") != 0))
+ peer = peer_lookup_in_view (vty, argv[1], argv[2], uj);
else
- peer = peer_lookup_in_view (vty, NULL, argv[0], uj);
+ peer = peer_lookup_in_view (vty, NULL, argv[1], uj);
if (! peer)
return CMD_WARNING;
ALIAS (show_bgp_view_neighbor_received_routes,
show_bgp_view_ipv6_neighbor_received_routes_cmd,
- "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
+ "show bgp (view|vrf) WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) received-routes {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
DEFUN (show_bgp_view_afi_safi_neighbor_adv_recd_routes,
show_bgp_view_afi_safi_neighbor_adv_recd_routes_cmd,
#ifdef HAVE_IPV6
- "show bgp view WORD (ipv4|ipv6) (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) (advertised-routes|received-routes) {json}",
+ "show bgp (view|vrf) WORD (ipv4|ipv6) (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) (advertised-routes|received-routes) {json}",
#else
- "show bgp view WORD ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) (advertised-routes|received-routes) {json}",
+ "show bgp (view|vrf) WORD ipv4 (unicast|multicast) neighbors (A.B.C.D|X:X::X:X|WORD) (advertised-routes|received-routes) {json}",
#endif
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
#ifdef HAVE_IPV6
"Address family\n"
struct peer *peer;
u_char uj = use_json(argc, argv);
- peer = peer_lookup_in_view (vty, argv[0], argv[3], uj);
+ peer = peer_lookup_in_view (vty, argv[1], argv[4], uj);
if (! peer)
return CMD_WARNING;
- afi = (strncmp (argv[1], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
- safi = (strncmp (argv[2], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
- in = (strncmp (argv[4], "r", 1) == 0) ? 1 : 0;
+ afi = (strncmp (argv[2], "ipv6", 4) == 0) ? AFI_IP6 : AFI_IP;
+ safi = (strncmp (argv[3], "m", 1) == 0) ? SAFI_MULTICAST : SAFI_UNICAST;
+ in = (strncmp (argv[5], "r", 1) == 0) ? 1 : 0;
return peer_adj_routes (vty, peer, afi, safi, in, NULL, uj);
}
DEFUN (show_bgp_view_neighbor_received_prefix_filter,
show_bgp_view_neighbor_received_prefix_filter_cmd,
- "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter {json}",
+ "show bgp (view|vrf) WORD neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
"Neighbor to display information about\n"
u_char uj = use_json(argc, argv);
/* BGP structure lookup. */
- bgp = bgp_lookup_by_name (argv[0]);
+ bgp = bgp_lookup_by_name (argv[1]);
if (bgp == NULL)
{
if (uj)
json_object_free(json_no);
}
else
- vty_out (vty, "Can't find BGP view %s%s", argv[0], VTY_NEWLINE);
+ vty_out (vty, "Can't find BGP instance %s%s", argv[1], VTY_NEWLINE);
return CMD_WARNING;
}
- ret = str2sockunion (argv[1], &su);
+ ret = str2sockunion (argv[2], &su);
if (ret < 0)
{
- peer = peer_lookup_by_conf_if (bgp, argv[1]);
+ peer = peer_lookup_by_conf_if (bgp, argv[2]);
if (! peer)
{
if (uj)
json_no = json_object_new_object();
json_sub = json_object_new_object();
json_object_string_add(json_no, "warning", "Malformed address or name");
- json_object_string_add(json_sub, "warningCause", argv[1]);
+ json_object_string_add(json_sub, "warningCause", argv[2]);
json_object_object_add(json_no, "detail", json_sub);
vty_out (vty, "%s%s", json_object_to_json_string(json_no), VTY_NEWLINE);
json_object_free(json_no);
}
else
- vty_out (vty, "%% Malformed address or name: %s%s", argv[1], VTY_NEWLINE);
+ vty_out (vty, "%% Malformed address or name: %s%s", argv[2], VTY_NEWLINE);
return CMD_WARNING;
}
}
}
ALIAS (show_bgp_view_neighbor_received_prefix_filter,
show_bgp_view_ipv6_neighbor_received_prefix_filter_cmd,
- "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter {json}",
+ "show bgp (view|vrf) WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) received prefix-filter {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
#ifdef HAVE_IPV6
DEFUN (show_bgp_view_neighbor_routes,
show_bgp_view_neighbor_routes_cmd,
- "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) routes {json}",
+ "show bgp (view|vrf) WORD neighbors (A.B.C.D|X:X::X:X|WORD) routes {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
"Neighbor to display information about\n"
struct peer *peer;
u_char uj = use_json(argc, argv);
- if ((argc == 3 && argv[2] && strcmp(argv[2], "json") == 0)
- || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
- peer = peer_lookup_in_view (vty, argv[0], argv[1], uj);
+ if ((argc == 4 && argv[3] && strcmp(argv[3], "json") == 0)
+ || (argc == 3 && argv[2] && strcmp(argv[2], "json") != 0))
+ peer = peer_lookup_in_view (vty, argv[1], argv[2], uj);
else
- peer = peer_lookup_in_view (vty, NULL, argv[0], uj);
+ peer = peer_lookup_in_view (vty, NULL, argv[1], uj);
if (! peer)
return CMD_WARNING;
ALIAS (show_bgp_view_neighbor_routes,
show_bgp_view_ipv6_neighbor_routes_cmd,
- "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) routes {json}",
+ "show bgp (view|vrf) WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) routes {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
DEFUN (show_bgp_view_neighbor_damp,
show_bgp_view_neighbor_damp_cmd,
- "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes {json}",
+ "show bgp (view|vrf) WORD neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
"Neighbor to display information about\n"
struct peer *peer;
u_char uj = use_json(argc, argv);
- if ((argc == 3 && argv[2] && strcmp(argv[2], "json") == 0)
- || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
- peer = peer_lookup_in_view (vty, argv[0], argv[1], uj);
+ if ((argc == 4 && argv[3] && strcmp(argv[3], "json") == 0)
+ || (argc == 3 && argv[2] && strcmp(argv[2], "json") != 0))
+ peer = peer_lookup_in_view (vty, argv[1], argv[2], uj);
else
- peer = peer_lookup_in_view (vty, NULL, argv[0], uj);
+ peer = peer_lookup_in_view (vty, NULL, argv[1], uj);
if (! peer)
return CMD_WARNING;
ALIAS (show_bgp_view_neighbor_damp,
show_bgp_view_ipv6_neighbor_damp_cmd,
- "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes {json}",
+ "show bgp (view|vrf) WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) dampened-routes {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
DEFUN (show_bgp_view_neighbor_flap,
show_bgp_view_neighbor_flap_cmd,
- "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics {json}",
+ "show bgp (view|vrf) WORD neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
"Neighbor to display information about\n"
struct peer *peer;
u_char uj = use_json(argc, argv);
- if ((argc == 3 && argv[2] && strcmp(argv[2], "json") == 0)
- || (argc == 2 && argv[1] && strcmp(argv[1], "json") != 0))
- peer = peer_lookup_in_view (vty, argv[0], argv[1], uj);
+ if ((argc == 4 && argv[3] && strcmp(argv[3], "json") == 0)
+ || (argc == 3 && argv[2] && strcmp(argv[2], "json") != 0))
+ peer = peer_lookup_in_view (vty, argv[1], argv[2], uj);
else
- peer = peer_lookup_in_view (vty, NULL, argv[0], uj);
+ peer = peer_lookup_in_view (vty, NULL, argv[1], uj);
if (! peer)
return CMD_WARNING;
ALIAS (show_bgp_view_neighbor_flap,
show_bgp_view_ipv6_neighbor_flap_cmd,
- "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics {json}",
+ "show bgp (view|vrf) WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) flap-statistics {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
bgp = bgp_lookup_by_name (view_name);
if (bgp == NULL)
{
- vty_out (vty, "%% Can't find BGP view %s%s", view_name, VTY_NEWLINE);
+ vty_out (vty, "%% Can't find BGP instance %s%s", view_name, VTY_NEWLINE);
return CMD_WARNING;
}
}
extern int bgp_maximum_prefix_overflow (struct peer *, afi_t, safi_t, int);
-extern void bgp_redistribute_add (struct prefix *, const struct in_addr *,
+extern void bgp_redistribute_add (struct bgp *, struct prefix *, const struct in_addr *,
const struct in6_addr *, unsigned int ifindex,
u_int32_t, u_char, u_short, u_short);
-extern void bgp_redistribute_delete (struct prefix *, u_char, u_short);
+extern void bgp_redistribute_delete (struct bgp *, struct prefix *, u_char, u_short);
extern void bgp_redistribute_withdraw (struct bgp *, afi_t, int, u_short);
+extern void bgp_static_add (struct bgp *);
extern void bgp_static_delete (struct bgp *);
extern void bgp_static_redo_import_check (struct bgp *);
extern void bgp_static_update (struct bgp *, struct prefix *, struct bgp_static *,
#include "bgpd/bgp_updgrp.h"
#include "bgpd/bgp_bfd.h"
-extern struct in_addr router_id_zebra;
-
static struct peer_group *
listen_range_exists (struct bgp *bgp, struct prefix *range, int exact);
}
static int
-peer_address_self_check (union sockunion *su)
+peer_address_self_check (struct bgp *bgp, union sockunion *su)
{
struct interface *ifp = NULL;
if (su->sa.sa_family == AF_INET)
- ifp = if_lookup_by_ipv4_exact (&su->sin.sin_addr);
+ ifp = if_lookup_by_ipv4_exact (&su->sin.sin_addr, bgp->vrf_id);
#ifdef HAVE_IPV6
else if (su->sa.sa_family == AF_INET6)
ifp = if_lookup_by_ipv6_exact (&su->sin6.sin6_addr,
- su->sin6.sin6_scope_id);
+ su->sin6.sin6_scope_id, bgp->vrf_id);
#endif /* HAVE IPV6 */
if (ifp)
bgp = bgp_lookup_by_name (name);
if (bgp == NULL)
{
- vty_out (vty, "Can't find BGP view %s%s", name, VTY_NEWLINE);
+ vty_out (vty, "Can't find BGP instance %s%s", name, VTY_NEWLINE);
return CMD_WARNING;
}
}
// "router bgp" without an ASN
if (argc < 1)
{
+ //Pending: Make VRF option available for ASN less config
bgp = bgp_get_default();
if (bgp == NULL)
{
VTY_GET_INTEGER_RANGE ("AS", as, argv[0], 1, BGP_AS4_MAX);
- if (argc == 2)
- name = argv[1];
+ if (argc == 3)
+ name = argv[2];
ret = bgp_get (&bgp, &as, name);
switch (ret)
vty_out (vty, "BGP is already running; AS is %u%s", as, VTY_NEWLINE);
return CMD_WARNING;
case BGP_ERR_INSTANCE_MISMATCH:
- vty_out (vty, "BGP view name and AS number mismatch%s", VTY_NEWLINE);
+ vty_out (vty, "BGP instance name and AS number mismatch%s", VTY_NEWLINE);
vty_out (vty, "BGP instance is already running; AS is %u%s",
as, VTY_NEWLINE);
return CMD_WARNING;
}
+
+ /* Pending: handle when user tries to change a view to vrf n vv. */
+ if (argc == 3 && !strcmp(argv[1], "vrf"))
+ bgp_flag_set (bgp, BGP_FLAG_INSTANCE_TYPE_VRF);
+ if (argc == 3 && !strcmp(argv[1], "view"))
+ bgp_flag_set (bgp, BGP_FLAG_INSTANCE_TYPE_VIEW);
}
vty->node = BGP_NODE;
}
ALIAS (router_bgp,
- router_bgp_view_cmd,
- "router bgp " CMD_AS_RANGE " view WORD",
+ router_bgp_instance_cmd,
+ "router bgp " CMD_AS_RANGE " (view|vrf) WORD",
ROUTER_STR
BGP_STR
AS_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"view name\n")
ALIAS (router_bgp,
VTY_GET_INTEGER_RANGE ("AS", as, argv[0], 1, BGP_AS4_MAX);
- if (argc == 2)
- name = argv[1];
+ if (argc == 3)
+ name = argv[2];
/* Lookup bgp structure. */
bgp = bgp_lookup (as, name);
}
ALIAS (no_router_bgp,
- no_router_bgp_view_cmd,
- "no router bgp " CMD_AS_RANGE " view WORD",
+ no_router_bgp_instance_cmd,
+ "no router bgp " CMD_AS_RANGE " (view|vrf) WORD",
NO_STR
ROUTER_STR
BGP_STR
AS_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"view name\n")
/* BGP router-id. */
}
bgp->router_id_static.s_addr = 0;
- bgp_router_id_set (bgp, &router_id_zebra);
+ bgp_router_id_set (bgp, &bgp->router_id_zebra);
return CMD_SUCCESS;
}
}
else
{
- if (peer_address_self_check (&su))
+ if (peer_address_self_check (bgp, &su))
{
vty_out (vty, "%% Can not configure the local system as neighbor%s",
VTY_NEWLINE);
}
else
{
- if (peer_address_self_check (&su))
+ if (peer_address_self_check (bgp, &su))
{
vty_out (vty, "%% Can not configure the local system as neighbor%s",
VTY_NEWLINE);
bgp = bgp_lookup_by_name (view_name);
if (bgp == NULL)
{
- vty_out (vty, "%% Can't find BGP view %s%s", view_name, VTY_NEWLINE);
+ vty_out (vty, "%% Can't find BGP instance %s%s", view_name, VTY_NEWLINE);
return CMD_WARNING;
}
}
BGP_STR
"Clear all peers\n")
{
- if (argc == 1)
- return bgp_clear_vty (vty, argv[0], 0, 0, clear_all, BGP_CLEAR_SOFT_NONE, NULL);
+ if (argc == 2)
+ return bgp_clear_vty (vty, argv[1], 0, 0, clear_all, BGP_CLEAR_SOFT_NONE, NULL);
return bgp_clear_vty (vty, NULL, 0, 0, clear_all, BGP_CLEAR_SOFT_NONE, NULL);
}
ALIAS (clear_ip_bgp_all,
clear_ip_bgp_instance_all_cmd,
- "clear ip bgp view WORD *",
+ "clear ip bgp (view|vrf) WORD *",
CLEAR_STR
IP_STR
BGP_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"view name\n"
"Clear all peers\n")
ALIAS (clear_ip_bgp_all,
clear_bgp_instance_all_cmd,
- "clear bgp view WORD *",
+ "clear bgp (view|vrf) WORD *",
CLEAR_STR
BGP_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"view name\n"
"Clear all peers\n")
BGP_SOFT_STR
BGP_SOFT_OUT_STR)
{
- if (argc == 1)
- return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
+ if (argc == 2)
+ return bgp_clear_vty (vty, argv[1], AFI_IP, SAFI_UNICAST, clear_all,
BGP_CLEAR_SOFT_OUT, NULL);
return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
ALIAS (clear_ip_bgp_all_soft_out,
clear_ip_bgp_instance_all_soft_out_cmd,
- "clear ip bgp view WORD * soft out",
+ "clear ip bgp (view|vrf) WORD * soft out",
CLEAR_STR
IP_STR
BGP_STR
- "BGP view\n"
- "view name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Clear all peers\n"
BGP_SOFT_STR
BGP_SOFT_OUT_STR)
DEFUN (clear_ip_bgp_instance_all_ipv4_soft_out,
clear_ip_bgp_instance_all_ipv4_soft_out_cmd,
- "clear ip bgp view WORD * ipv4 (unicast|multicast) soft out",
+ "clear ip bgp (view|vrf) WORD * ipv4 (unicast|multicast) soft out",
CLEAR_STR
IP_STR
BGP_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"view name\n"
"Clear all peers\n"
"Address family\n"
"Address Family modifier\n"
BGP_SOFT_OUT_STR)
{
- if (strncmp (argv[1], "m", 1) == 0)
- return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_MULTICAST, clear_all,
+ if (strncmp (argv[2], "m", 1) == 0)
+ return bgp_clear_vty (vty, argv[1], AFI_IP, SAFI_MULTICAST, clear_all,
BGP_CLEAR_SOFT_OUT, NULL);
return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
BGP_SOFT_STR
BGP_SOFT_OUT_STR)
{
- if (argc == 1)
- return bgp_clear_vty (vty, argv[0], AFI_IP6, SAFI_UNICAST, clear_all,
+ if (argc == 2)
+ return bgp_clear_vty (vty, argv[1], AFI_IP6, SAFI_UNICAST, clear_all,
BGP_CLEAR_SOFT_OUT, NULL);
return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_all,
ALIAS (clear_bgp_all_soft_out,
clear_bgp_instance_all_soft_out_cmd,
- "clear bgp view WORD * soft out",
+ "clear bgp (view|vrf) WORD * soft out",
CLEAR_STR
BGP_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"view name\n"
"Clear all peers\n"
BGP_SOFT_STR
BGP_SOFT_STR
BGP_SOFT_IN_STR)
{
- if (argc == 1)
- return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
+ if (argc == 2)
+ return bgp_clear_vty (vty, argv[1], AFI_IP, SAFI_UNICAST, clear_all,
BGP_CLEAR_SOFT_IN, NULL);
return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
ALIAS (clear_ip_bgp_all_soft_in,
clear_ip_bgp_instance_all_soft_in_cmd,
- "clear ip bgp view WORD * soft in",
+ "clear ip bgp (view|vrf) WORD * soft in",
CLEAR_STR
IP_STR
BGP_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"view name\n"
"Clear all peers\n"
BGP_SOFT_STR
BGP_SOFT_IN_STR
"Push out prefix-list ORF and do inbound soft reconfig\n")
{
- if (argc== 1)
- return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
+ if (argc== 2)
+ return bgp_clear_vty (vty, argv[1], AFI_IP, SAFI_UNICAST, clear_all,
BGP_CLEAR_SOFT_IN_ORF_PREFIX, NULL);
return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
ALIAS (clear_ip_bgp_all_in_prefix_filter,
clear_ip_bgp_instance_all_in_prefix_filter_cmd,
- "clear ip bgp view WORD * in prefix-filter",
+ "clear ip bgp (view|vrf) WORD * in prefix-filter",
CLEAR_STR
IP_STR
BGP_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"view name\n"
"Clear all peers\n"
BGP_SOFT_IN_STR
DEFUN (clear_ip_bgp_instance_all_ipv4_soft_in,
clear_ip_bgp_instance_all_ipv4_soft_in_cmd,
- "clear ip bgp view WORD * ipv4 (unicast|multicast) soft in",
+ "clear ip bgp (view|vrf) WORD * ipv4 (unicast|multicast) soft in",
CLEAR_STR
IP_STR
BGP_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"view name\n"
"Clear all peers\n"
"Address family\n"
BGP_SOFT_STR
BGP_SOFT_IN_STR)
{
- if (strncmp (argv[1], "m", 1) == 0)
- return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_MULTICAST, clear_all,
+ if (strncmp (argv[2], "m", 1) == 0)
+ return bgp_clear_vty (vty, argv[1], AFI_IP, SAFI_MULTICAST, clear_all,
BGP_CLEAR_SOFT_IN, NULL);
- return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
+ return bgp_clear_vty (vty, argv[1], AFI_IP, SAFI_UNICAST, clear_all,
BGP_CLEAR_SOFT_IN, NULL);
}
DEFUN (clear_ip_bgp_instance_all_ipv4_in_prefix_filter,
clear_ip_bgp_instance_all_ipv4_in_prefix_filter_cmd,
- "clear ip bgp view WORD * ipv4 (unicast|multicast) in prefix-filter",
+ "clear ip bgp (view|vrf) WORD * ipv4 (unicast|multicast) in prefix-filter",
CLEAR_STR
IP_STR
BGP_STR
BGP_SOFT_IN_STR
"Push out prefix-list ORF and do inbound soft reconfig\n")
{
- if (strncmp (argv[1], "m", 1) == 0)
- return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_MULTICAST, clear_all,
+ if (strncmp (argv[2], "m", 1) == 0)
+ return bgp_clear_vty (vty, argv[1], AFI_IP, SAFI_MULTICAST, clear_all,
BGP_CLEAR_SOFT_IN_ORF_PREFIX, NULL);
return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
BGP_SOFT_STR
BGP_SOFT_IN_STR)
{
- if (argc == 1)
- return bgp_clear_vty (vty, argv[0], AFI_IP6, SAFI_UNICAST, clear_all,
+ if (argc == 2)
+ return bgp_clear_vty (vty, argv[1], AFI_IP6, SAFI_UNICAST, clear_all,
BGP_CLEAR_SOFT_IN, NULL);
return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_all,
ALIAS (clear_bgp_all_soft_in,
clear_bgp_instance_all_soft_in_cmd,
- "clear bgp view WORD * soft in",
+ "clear bgp (view|vrf) WORD * soft in",
CLEAR_STR
BGP_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"view name\n"
"Clear all peers\n"
BGP_SOFT_STR
"Clear all peers\n"
BGP_SOFT_STR)
{
- if (argc == 1)
- return bgp_clear_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, clear_all,
+ if (argc == 2)
+ return bgp_clear_vty (vty, argv[1], AFI_IP, SAFI_UNICAST, clear_all,
BGP_CLEAR_SOFT_BOTH, NULL);
return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
ALIAS (clear_ip_bgp_all_soft,
clear_ip_bgp_instance_all_soft_cmd,
- "clear ip bgp view WORD * soft",
+ "clear ip bgp (view|vrf) WORD * soft",
CLEAR_STR
IP_STR
BGP_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"view name\n"
"Clear all peers\n"
BGP_SOFT_STR)
DEFUN (clear_ip_bgp_instance_all_ipv4_soft,
clear_ip_bgp_instance_all_ipv4_soft_cmd,
- "clear ip bgp view WORD * ipv4 (unicast|multicast) soft",
+ "clear ip bgp (view|vrf) WORD * ipv4 (unicast|multicast) soft",
CLEAR_STR
IP_STR
BGP_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"view name\n"
"Clear all peers\n"
"Address family\n"
"Address Family Modifier\n"
BGP_SOFT_STR)
{
- if (strncmp (argv[1], "m", 1) == 0)
- return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_MULTICAST, clear_all,
+ if (strncmp (argv[2], "m", 1) == 0)
+ return bgp_clear_vty (vty, argv[1], AFI_IP, SAFI_MULTICAST, clear_all,
BGP_CLEAR_SOFT_BOTH, NULL);
return bgp_clear_vty (vty, NULL, AFI_IP, SAFI_UNICAST, clear_all,
"Clear all peers\n"
BGP_SOFT_STR)
{
- if (argc == 1)
- return bgp_clear_vty (vty, argv[0], AFI_IP6, SAFI_UNICAST, clear_all,
+ if (argc == 2)
+ return bgp_clear_vty (vty, argv[1], AFI_IP6, SAFI_UNICAST, clear_all,
BGP_CLEAR_SOFT_BOTH, argv[0]);
return bgp_clear_vty (vty, NULL, AFI_IP6, SAFI_UNICAST, clear_all,
ALIAS (clear_bgp_all_soft,
clear_bgp_instance_all_soft_cmd,
- "clear bgp view WORD * soft",
+ "clear bgp (view|vrf) WORD * soft",
CLEAR_STR
BGP_STR
- "BGP view\n"
+ "BGP view\nBGP VRF\n"
"view name\n"
"Clear all peers\n"
BGP_SOFT_STR)
{
json_object_string_add(json, "routerId", inet_ntoa (bgp->router_id));
json_object_int_add(json, "as", bgp->as);
+
+ if (bgp->vrf_id)
+ json_object_int_add(json, "vrf-id", bgp->vrf_id);
+
}
else
{
vty_out (vty,
- "BGP router identifier %s, local AS number %u%s",
- inet_ntoa (bgp->router_id), bgp->as, VTY_NEWLINE);
+ "BGP router identifier %s, local AS number %u",
+ inet_ntoa (bgp->router_id), bgp->as);
+
+ if (bgp->vrf_id)
+ vty_out (vty, " vrf-id %u", bgp->vrf_id);
+
+ vty_out (vty, "%s", VTY_NEWLINE);
}
if (bgp_update_delay_configured(bgp))
DEFUN (show_ip_bgp_instance_summary,
show_ip_bgp_instance_summary_cmd,
- "show ip bgp view WORD summary {json}",
+ "show ip bgp (view|vrf) WORD summary {json}",
SHOW_STR
IP_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Summary of BGP neighbor status\n"
"JavaScript Object Notation\n")
{
u_char uj = use_json(argc, argv);
- return bgp_show_summary_vty (vty, argv[0], AFI_IP, SAFI_UNICAST, uj);
+ return bgp_show_summary_vty (vty, argv[1], AFI_IP, SAFI_UNICAST, uj);
}
DEFUN (show_ip_bgp_ipv4_summary,
DEFUN (show_bgp_instance_summary,
show_bgp_instance_summary_cmd,
- "show bgp view WORD summary {json}",
+ "show bgp (view|vrf) WORD summary {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Summary of BGP neighbor status\n"
"JavaScript Object Notation\n")
{
- return bgp_show_summary_vty (vty, argv[0], AFI_IP6, SAFI_UNICAST, use_json(argc, argv));
+ return bgp_show_summary_vty (vty, argv[1], AFI_IP6, SAFI_UNICAST, use_json(argc, argv));
}
ALIAS (show_bgp_summary,
ALIAS (show_bgp_instance_summary,
show_bgp_instance_ipv6_summary_cmd,
- "show bgp view WORD ipv6 summary {json}",
+ "show bgp (view|vrf) WORD ipv6 summary {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
"Summary of BGP neighbor status\n")
DEFUN (show_bgp_instance_ipv6_safi_summary,
show_bgp_instance_ipv6_safi_summary_cmd,
- "show bgp view WORD ipv6 (unicast|multicast) summary {json}",
+ "show bgp (view|vrf) WORD ipv6 (unicast|multicast) summary {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
"Address Family modifier\n"
"Address Family modifier\n"
"JavaScript Object Notation\n")
{
u_char uj = use_json(argc, argv);
- if (strncmp (argv[1], "m", 1) == 0)
- return bgp_show_summary_vty (vty, argv[0], AFI_IP6, SAFI_MULTICAST, uj);
+ if (strncmp (argv[2], "m", 1) == 0)
+ return bgp_show_summary_vty (vty, argv[1], AFI_IP6, SAFI_MULTICAST, uj);
- return bgp_show_summary_vty (vty, argv[0], AFI_IP6, SAFI_UNICAST, uj);
+ return bgp_show_summary_vty (vty, argv[1], AFI_IP6, SAFI_UNICAST, uj);
}
/* old command */
DEFUN (show_ip_bgp_instance_neighbors,
show_ip_bgp_instance_neighbors_cmd,
- "show ip bgp view WORD neighbors {json}",
+ "show ip bgp (view|vrf) WORD neighbors {json}",
SHOW_STR
IP_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Detailed information on TCP and BGP neighbor connections\n"
"JavaScript Object Notation\n")
{
u_char uj = use_json(argc, argv);
- return bgp_show_neighbor_vty (vty, argv[0], show_all, NULL, uj);
+ return bgp_show_neighbor_vty (vty, argv[1], show_all, NULL, uj);
}
ALIAS (show_ip_bgp_instance_neighbors,
show_bgp_instance_neighbors_cmd,
- "show bgp view WORD neighbors {json}",
+ "show bgp (view|vrf) WORD neighbors {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Detailed information on TCP and BGP neighbor connections\n"
"JavaScript Object Notation\n")
ALIAS (show_ip_bgp_instance_neighbors,
show_bgp_instance_ipv6_neighbors_cmd,
- "show bgp view WORD ipv6 neighbors {json}",
+ "show bgp (view|vrf) WORD ipv6 neighbors {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
"Detailed information on TCP and BGP neighbor connections\n"
"JavaScript Object Notation\n")
DEFUN (show_ip_bgp_instance_neighbors_peer,
show_ip_bgp_instance_neighbors_peer_cmd,
- "show ip bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) {json}",
+ "show ip bgp (view|vrf) WORD neighbors (A.B.C.D|X:X::X:X|WORD) {json}",
SHOW_STR
IP_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
"Neighbor to display information about\n"
{
u_char uj = use_json(argc, argv);
- return bgp_show_neighbor_vty (vty, argv[0], show_peer, argv[1], uj);
+ return bgp_show_neighbor_vty (vty, argv[1], show_peer, argv[2], uj);
}
ALIAS (show_ip_bgp_instance_neighbors_peer,
show_bgp_instance_neighbors_peer_cmd,
- "show bgp view WORD neighbors (A.B.C.D|X:X::X:X|WORD) {json}",
+ "show bgp (view|vrf) WORD neighbors (A.B.C.D|X:X::X:X|WORD) {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
"Neighbor to display information about\n"
ALIAS (show_ip_bgp_instance_neighbors_peer,
show_bgp_instance_ipv6_neighbors_peer_cmd,
- "show bgp view WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) {json}",
+ "show bgp (view|vrf) WORD ipv6 neighbors (A.B.C.D|X:X::X:X|WORD) {json}",
SHOW_STR
BGP_STR
- "BGP view\n"
- "View name\n"
+ "BGP view\nBGP VRF\n"
+ "View/VRF name\n"
"Address family\n"
"Detailed information on TCP and BGP neighbor connections\n"
"Neighbor to display information about\n"
DEFUN (show_ip_bgp_instance_peer_groups,
show_ip_bgp_instance_peer_groups_cmd,
- "show ip bgp view WORD peer-group",
+ "show ip bgp (view|vrf) WORD peer-group",
SHOW_STR
IP_STR
BGP_STR
DEFUN (show_ip_bgp_instance_peer_group,
show_ip_bgp_instance_peer_group_cmd,
- "show ip bgp view WORD peer-group WORD",
+ "show ip bgp (view|vrf) WORD peer-group WORD",
SHOW_STR
IP_STR
BGP_STR
return CMD_WARNING;
}
bgp_redist_add(vty->index, AFI_IP, type, 0);
- return bgp_redistribute_set (AFI_IP, type, 0);
+ return bgp_redistribute_set (vty->index, AFI_IP, type, 0);
}
DEFUN (bgp_redistribute_ipv4_rmap,
red = bgp_redist_add(vty->index, AFI_IP, type, 0);
bgp_redistribute_rmap_set (red, argv[1]);
- return bgp_redistribute_set (AFI_IP, type, 0);
+ return bgp_redistribute_set (vty->index, AFI_IP, type, 0);
}
DEFUN (bgp_redistribute_ipv4_metric,
red = bgp_redist_add(vty->index, AFI_IP, type, 0);
bgp_redistribute_metric_set(vty->index, red, AFI_IP, type, metric);
- return bgp_redistribute_set (AFI_IP, type, 0);
+ return bgp_redistribute_set (vty->index, AFI_IP, type, 0);
}
DEFUN (bgp_redistribute_ipv4_rmap_metric,
red = bgp_redist_add(vty->index, AFI_IP, type, 0);
bgp_redistribute_rmap_set (red, argv[1]);
bgp_redistribute_metric_set(vty->index, red, AFI_IP, type, metric);
- return bgp_redistribute_set (AFI_IP, type, 0);
+ return bgp_redistribute_set (vty->index, AFI_IP, type, 0);
}
DEFUN (bgp_redistribute_ipv4_metric_rmap,
red = bgp_redist_add(vty->index, AFI_IP, type, 0);
bgp_redistribute_metric_set(vty->index, red, AFI_IP, type, metric);
bgp_redistribute_rmap_set (red, argv[2]);
- return bgp_redistribute_set (AFI_IP, type, 0);
+ return bgp_redistribute_set (vty->index, AFI_IP, type, 0);
}
DEFUN (bgp_redistribute_ipv4_ospf,
protocol = ZEBRA_ROUTE_TABLE;
bgp_redist_add(vty->index, AFI_IP, protocol, instance);
- return bgp_redistribute_set (AFI_IP, protocol, instance);
+ return bgp_redistribute_set (vty->index, AFI_IP, protocol, instance);
}
DEFUN (bgp_redistribute_ipv4_ospf_rmap,
VTY_GET_INTEGER ("Instance ID", instance, argv[1]);
red = bgp_redist_add(vty->index, AFI_IP, protocol, instance);
bgp_redistribute_rmap_set (red, argv[2]);
- return bgp_redistribute_set (AFI_IP, protocol, instance);
+ return bgp_redistribute_set (vty->index, AFI_IP, protocol, instance);
}
DEFUN (bgp_redistribute_ipv4_ospf_metric,
red = bgp_redist_add(vty->index, AFI_IP, protocol, instance);
bgp_redistribute_metric_set(vty->index, red, AFI_IP, protocol, metric);
- return bgp_redistribute_set (AFI_IP, protocol, instance);
+ return bgp_redistribute_set (vty->index, AFI_IP, protocol, instance);
}
DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
red = bgp_redist_add(vty->index, AFI_IP, protocol, instance);
bgp_redistribute_rmap_set (red, argv[2]);
bgp_redistribute_metric_set(vty->index, red, AFI_IP, protocol, metric);
- return bgp_redistribute_set (AFI_IP, protocol, instance);
+ return bgp_redistribute_set (vty->index, AFI_IP, protocol, instance);
}
DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
red = bgp_redist_add(vty->index, AFI_IP, protocol, instance);
bgp_redistribute_metric_set(vty->index, red, AFI_IP, protocol, metric);
bgp_redistribute_rmap_set (red, argv[3]);
- return bgp_redistribute_set (AFI_IP, protocol, instance);
+ return bgp_redistribute_set (vty->index, AFI_IP, protocol, instance);
}
DEFUN (no_bgp_redistribute_ipv4_ospf,
}
bgp_redist_add(vty->index, AFI_IP6, type, 0);
- return bgp_redistribute_set (AFI_IP6, type, 0);
+ return bgp_redistribute_set (vty->index, AFI_IP6, type, 0);
}
DEFUN (bgp_redistribute_ipv6_rmap,
red = bgp_redist_add(vty->index, AFI_IP6, type, 0);
bgp_redistribute_rmap_set (red, argv[1]);
- return bgp_redistribute_set (AFI_IP6, type, 0);
+ return bgp_redistribute_set (vty->index, AFI_IP6, type, 0);
}
DEFUN (bgp_redistribute_ipv6_metric,
red = bgp_redist_add(vty->index, AFI_IP6, type, 0);
bgp_redistribute_metric_set(vty->index, red, AFI_IP6, type, metric);
- return bgp_redistribute_set (AFI_IP6, type, 0);
+ return bgp_redistribute_set (vty->index, AFI_IP6, type, 0);
}
DEFUN (bgp_redistribute_ipv6_rmap_metric,
red = bgp_redist_add(vty->index, AFI_IP6, type, 0);
bgp_redistribute_rmap_set (red, argv[1]);
bgp_redistribute_metric_set(vty->index, red, AFI_IP6, type, metric);
- return bgp_redistribute_set (AFI_IP6, type, 0);
+ return bgp_redistribute_set (vty->index, AFI_IP6, type, 0);
}
DEFUN (bgp_redistribute_ipv6_metric_rmap,
red = bgp_redist_add(vty->index, AFI_IP6, type, 0);
bgp_redistribute_metric_set(vty->index, red, AFI_IP6, SAFI_UNICAST, metric);
bgp_redistribute_rmap_set (red, argv[2]);
- return bgp_redistribute_set (AFI_IP6, type, 0);
+ return bgp_redistribute_set (vty->index, AFI_IP6, type, 0);
}
DEFUN (no_bgp_redistribute_ipv6,
/* "router bgp" commands. */
install_element (CONFIG_NODE, &router_bgp_cmd);
- install_element (CONFIG_NODE, &router_bgp_view_cmd);
+ install_element (CONFIG_NODE, &router_bgp_instance_cmd);
install_element (CONFIG_NODE, &router_bgp_noasn_cmd);
/* "no router bgp" commands. */
install_element (CONFIG_NODE, &no_router_bgp_cmd);
- install_element (CONFIG_NODE, &no_router_bgp_view_cmd);
+ install_element (CONFIG_NODE, &no_router_bgp_instance_cmd);
/* "bgp router-id" commands. */
install_element (BGP_NODE, &bgp_router_id_cmd);
/* All information about zebra. */
struct zclient *zclient = NULL;
-struct in_addr router_id_zebra;
/* Growable buffer for nexthops sent to zebra */
struct stream *bgp_nexthop_buf = NULL;
{
char buf[PREFIX2STR_BUFFER];
prefix2str(&router_id, buf, sizeof(buf));
- zlog_debug("Zebra rcvd: router id update %s", buf);
+ zlog_debug("Zebra rcvd: router id update %s vrf %u", buf, vrf_id);
}
- router_id_zebra = router_id.u.prefix4;
+ if (!vrf_id)
+ {
+ /* This is to cover all the views */
+ for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
+ {
+ if (bgp_flag_check(bgp, BGP_FLAG_INSTANCE_TYPE_VRF))
+ continue;
- for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
+ bgp->router_id_zebra = router_id.u.prefix4;
+
+ if (!bgp->router_id_static.s_addr)
+ bgp_router_id_set (bgp, &router_id.u.prefix4);
+ }
+ }
+ else
{
- if (!bgp->router_id_static.s_addr)
- bgp_router_id_set (bgp, &router_id.u.prefix4);
+ bgp = bgp_lookup_by_vrf_id (vrf_id);
+ if (bgp)
+ {
+ bgp->router_id_zebra = router_id.u.prefix4;
+
+ if (!bgp->router_id_static.s_addr)
+ bgp_router_id_set (bgp, &router_id.u.prefix4);
+ }
}
return 0;
}
static void
-bgp_start_interface_nbrs (struct interface *ifp)
+bgp_start_interface_nbrs (struct bgp *bgp, struct interface *ifp)
{
- struct listnode *node, *nnode, *mnode;
- struct bgp *bgp;
+ struct listnode *node, *nnode;
struct peer *peer;
- for (ALL_LIST_ELEMENTS_RO (bm->bgp, mnode, bgp))
+ for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
{
- for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
+ if (peer->conf_if &&
+ (strcmp (peer->conf_if, ifp->name) == 0) &&
+ peer->status != Established)
{
- if (peer->conf_if &&
- (strcmp (peer->conf_if, ifp->name) == 0) &&
- peer->status != Established)
- {
- if (peer_active(peer))
- BGP_EVENT_ADD (peer, BGP_Stop);
- BGP_EVENT_ADD (peer, BGP_Start);
- }
+ if (peer_active(peer))
+ BGP_EVENT_ADD (peer, BGP_Stop);
+ BGP_EVENT_ADD (peer, BGP_Start);
}
}
}
static void
-bgp_nbr_connected_add (struct nbr_connected *ifc)
+bgp_nbr_connected_add (struct bgp *bgp, struct nbr_connected *ifc)
{
struct listnode *node;
struct connected *connected;
if (!connected)
return;
- bgp_start_interface_nbrs (ifp);
+ bgp_start_interface_nbrs (bgp, ifp);
}
static void
-bgp_nbr_connected_delete (struct nbr_connected *ifc, int del)
+bgp_nbr_connected_delete (struct bgp *bgp, struct nbr_connected *ifc, int del)
{
- struct listnode *node, *nnode, *mnode;
- struct bgp *bgp;
+ struct listnode *node, *nnode;
struct peer *peer;
struct interface *ifp;
- for (ALL_LIST_ELEMENTS_RO (bm->bgp, mnode, bgp))
+ for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
{
- for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
+ if (peer->conf_if && (strcmp (peer->conf_if, ifc->ifp->name) == 0))
{
- if (peer->conf_if && (strcmp (peer->conf_if, ifc->ifp->name) == 0))
- {
- BGP_EVENT_ADD (peer, BGP_Stop);
- }
+ BGP_EVENT_ADD (peer, BGP_Stop);
}
}
/* Free neighbor also, if we're asked to. */
}
}
+/* Inteface addition message from zebra. */
+static int
+bgp_vrf_add (int command, struct zclient *zclient, zebra_size_t length,
+ vrf_id_t vrf_id)
+{
+ struct vrf *vrf;
+ struct bgp *bgp;
+
+ vrf = zebra_vrf_add_read (zclient->ibuf, vrf_id);
+
+ if (BGP_DEBUG (zebra, ZEBRA) && vrf)
+ zlog_debug("Zebra rcvd: vrf add %s", vrf->name);
+
+ bgp = bgp_lookup_by_name(vrf->name);
+ if (bgp)
+ {
+ bgp->vrf_id = vrf_id;
+
+ if (BGP_DEBUG (zebra, ZEBRA) && vrf)
+ zlog_debug("zclient_send_requests %u", vrf_id);
+
+ zclient_send_requests (zclient, vrf_id);
+
+ bgp_instance_up (bgp);
+ //Pending: See if the following can be moved inside bgp_instance_up ()
+ bgp_nht_register_all(vrf_id);
+
+ }
+
+ return 0;
+}
+
+void
+bgp_vrf_update (struct bgp *bgp)
+{
+ struct vrf *vrf;
+
+ if (bgp->name)
+ {
+ vrf = vrf_lookup_by_name(bgp->name);
+ if (vrf)
+ bgp->vrf_id = vrf->vrf_id;
+ }
+
+ zclient_send_requests (zclient, bgp->vrf_id);
+ bgp_nht_register_all (bgp->vrf_id);
+}
+
+/* Inteface deletion message from zebra. */
+static int
+bgp_vrf_delete (int command, struct zclient *zclient, zebra_size_t length,
+ vrf_id_t vrf_id)
+{
+ struct vrf *vrf;
+ struct bgp *bgp;
+
+ vrf = zebra_vrf_state_read (zclient->ibuf, vrf_id);
+
+ if (BGP_DEBUG (zebra, ZEBRA) && vrf)
+ zlog_debug("Zebra rcvd: vrf delete %s", vrf->name);
+
+ bgp = bgp_lookup_by_name(vrf->name);
+ if (bgp)
+ {
+ bgp_instance_down (bgp);
+ bgp->vrf_id = 0;
+ }
+
+ return 0;
+}
+
+
+
/* Inteface addition message from zebra. */
static int
bgp_interface_add (int command, struct zclient *zclient, zebra_size_t length,
struct connected *c;
struct nbr_connected *nc;
struct listnode *node, *nnode;
+ struct bgp *bgp;
+
+ bgp = bgp_lookup_by_vrf_id (vrf_id);
+ if (!bgp)
+ return 0;
s = zclient->ibuf;
ifp = zebra_interface_state_read (s, vrf_id);
zlog_debug("Zebra rcvd: interface %s up", ifp->name);
for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, c))
- bgp_connected_add (c);
+ bgp_connected_add (bgp, c);
for (ALL_LIST_ELEMENTS (ifp->nbr_connected, node, nnode, nc))
- bgp_nbr_connected_add (nc);
+ bgp_nbr_connected_add (bgp, nc);
return 0;
}
struct connected *c;
struct nbr_connected *nc;
struct listnode *node, *nnode;
+ struct bgp *bgp;
+
+ bgp = bgp_lookup_by_vrf_id (vrf_id);
+ if (!bgp)
+ return 0;
s = zclient->ibuf;
ifp = zebra_interface_state_read (s, vrf_id);
zlog_debug("Zebra rcvd: interface %s down", ifp->name);
for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, c))
- bgp_connected_delete (c);
+ bgp_connected_delete (bgp, c);
for (ALL_LIST_ELEMENTS (ifp->nbr_connected, node, nnode, nc))
- bgp_nbr_connected_delete (nc, 1);
+ bgp_nbr_connected_delete (bgp, nc, 1);
/* Fast external-failover */
{
if (if_is_operative (ifc->ifp))
{
- bgp_connected_add (ifc);
+ struct bgp *bgp;
+
+ bgp = bgp_lookup_by_vrf_id (vrf_id);
+ if (!bgp)
+ {
+ zlog_err("instance not found\n");
+ return 0;
+ }
+
+ bgp_connected_add (bgp, ifc);
/* If we have learnt of any neighbors on this interface,
* check to kick off any BGP interface-based neighbors,
* but only if this is a link-local address.
*/
if (IN6_IS_ADDR_LINKLOCAL(&ifc->address->u.prefix6) &&
!list_isempty(ifc->ifp->nbr_connected))
- bgp_start_interface_nbrs (ifc->ifp);
+ bgp_start_interface_nbrs (bgp, ifc->ifp);
}
return 0;
zebra_size_t length, vrf_id_t vrf_id)
{
struct connected *ifc;
+ struct bgp *bgp;
+
+ bgp = bgp_lookup_by_vrf_id (vrf_id);
+ if (!bgp)
+ return 0;
ifc = zebra_interface_address_read (command, zclient->ibuf, vrf_id);
}
if (if_is_operative (ifc->ifp))
- bgp_connected_delete (ifc);
+ bgp_connected_delete (bgp, ifc);
connected_free (ifc);
zebra_size_t length, vrf_id_t vrf_id)
{
struct nbr_connected *ifc = NULL;
+ struct bgp *bgp;
+
+ bgp = bgp_lookup_by_vrf_id (vrf_id);
+ if (!bgp)
+ return 0;
ifc = zebra_interface_nbr_address_read (command, zclient->ibuf, vrf_id);
}
if (if_is_operative (ifc->ifp))
- bgp_nbr_connected_add (ifc);
+ bgp_nbr_connected_add (bgp, ifc);
return 0;
}
zebra_size_t length, vrf_id_t vrf_id)
{
struct nbr_connected *ifc = NULL;
+ struct bgp *bgp;
+
+ bgp = bgp_lookup_by_vrf_id (vrf_id);
+ if (!bgp)
+ return 0;
ifc = zebra_interface_nbr_address_read (command, zclient->ibuf, vrf_id);
}
if (if_is_operative (ifc->ifp))
- bgp_nbr_connected_delete (ifc, 0);
+ bgp_nbr_connected_delete (bgp, ifc, 0);
nbr_connected_free (ifc);
struct prefix_ipv4 p;
unsigned int ifindex;
int i;
+ struct bgp *bgp;
+
+ bgp = bgp_lookup_by_vrf_id (vrf_id);
+ if (!bgp)
+ return 0;
s = zclient->ibuf;
nexthop.s_addr = 0;
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
{
if (i != api.type)
- bgp_redistribute_delete((struct prefix *)&p, i, api.instance);
+ bgp_redistribute_delete(bgp, (struct prefix *)&p, i, api.instance);
}
/* Now perform the add/update. */
- bgp_redistribute_add((struct prefix *)&p, &nexthop, NULL, ifindex,
+ bgp_redistribute_add(bgp, (struct prefix *)&p, &nexthop, NULL, ifindex,
api.metric, api.type, api.instance, api.tag);
}
else if (command == ZEBRA_REDISTRIBUTE_IPV4_DEL)
api.metric,
api.tag);
}
- bgp_redistribute_delete((struct prefix *)&p, api.type, api.instance);
+ bgp_redistribute_delete(bgp, (struct prefix *)&p, api.type, api.instance);
}
return 0;
struct prefix_ipv6 p;
unsigned int ifindex;
int i;
+ struct bgp *bgp;
+
+ bgp = bgp_lookup_by_vrf_id (vrf_id);
+ if (!bgp)
+ return 0;
s = zclient->ibuf;
memset (&nexthop, 0, sizeof (struct in6_addr));
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
{
if (i != api.type)
- bgp_redistribute_delete((struct prefix *)&p, i, api.instance);
+ bgp_redistribute_delete(bgp, (struct prefix *)&p, i, api.instance);
}
- bgp_redistribute_add ((struct prefix *)&p, NULL, &nexthop, ifindex,
+ bgp_redistribute_add (bgp, (struct prefix *)&p, NULL, &nexthop, ifindex,
api.metric, api.type, api.instance, api.tag);
}
else if (command == ZEBRA_REDISTRIBUTE_IPV6_DEL)
api.metric,
api.tag);
}
- bgp_redistribute_delete ((struct prefix *) &p, api.type, api.instance);
+ bgp_redistribute_delete (bgp, (struct prefix *) &p, api.type, api.instance);
}
return 0;
#endif /* HAVE_IPV6 */
struct interface *
-if_lookup_by_ipv4 (struct in_addr *addr)
+if_lookup_by_ipv4 (struct in_addr *addr, vrf_id_t vrf_id)
{
struct listnode *ifnode;
struct listnode *cnode;
p.prefix = *addr;
p.prefixlen = IPV4_MAX_BITLEN;
- for (ALL_LIST_ELEMENTS_RO (iflist, ifnode, ifp))
+ for (ALL_LIST_ELEMENTS_RO (vrf_iflist(vrf_id), ifnode, ifp))
{
for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
{
}
struct interface *
-if_lookup_by_ipv4_exact (struct in_addr *addr)
+if_lookup_by_ipv4_exact (struct in_addr *addr, vrf_id_t vrf_id)
{
struct listnode *ifnode;
struct listnode *cnode;
struct connected *connected;
struct prefix *cp;
- for (ALL_LIST_ELEMENTS_RO (iflist, ifnode, ifp))
+ for (ALL_LIST_ELEMENTS_RO (vrf_iflist(vrf_id), ifnode, ifp))
{
for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
{
#ifdef HAVE_IPV6
struct interface *
-if_lookup_by_ipv6 (struct in6_addr *addr, unsigned int ifindex)
+if_lookup_by_ipv6 (struct in6_addr *addr, unsigned int ifindex, vrf_id_t vrf_id)
{
struct listnode *ifnode;
struct listnode *cnode;
p.prefix = *addr;
p.prefixlen = IPV6_MAX_BITLEN;
- for (ALL_LIST_ELEMENTS_RO (iflist, ifnode, ifp))
+ for (ALL_LIST_ELEMENTS_RO (vrf_iflist(vrf_id), ifnode, ifp))
{
for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
{
}
struct interface *
-if_lookup_by_ipv6_exact (struct in6_addr *addr, unsigned int ifindex)
+if_lookup_by_ipv6_exact (struct in6_addr *addr, unsigned int ifindex, vrf_id_t vrf_id)
{
struct listnode *ifnode;
struct listnode *cnode;
struct connected *connected;
struct prefix *cp;
- for (ALL_LIST_ELEMENTS_RO (iflist, ifnode, ifp))
+ for (ALL_LIST_ELEMENTS_RO (vrf_iflist(vrf_id), ifnode, ifp))
{
for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, connected))
{
{
nexthop->v4 = local->sin.sin_addr;
if (peer->update_if)
- ifp = if_lookup_by_name (peer->update_if);
+ ifp = if_lookup_by_name_vrf (peer->update_if, peer->bgp->vrf_id);
else
- ifp = if_lookup_by_ipv4_exact (&local->sin.sin_addr);
+ ifp = if_lookup_by_ipv4_exact (&local->sin.sin_addr, peer->bgp->vrf_id);
}
#ifdef HAVE_IPV6
if (local->sa.sa_family == AF_INET6)
if (IN6_IS_ADDR_LINKLOCAL (&local->sin6.sin6_addr))
{
if (peer->conf_if || peer->ifname)
- ifp = if_lookup_by_index (if_nametoindex (peer->conf_if ? peer->conf_if : peer->ifname));
+ ifp = if_lookup_by_index_vrf (if_nametoindex (peer->conf_if ? peer->conf_if : peer->ifname), peer->bgp->vrf_id);
}
else if (peer->update_if)
- ifp = if_lookup_by_name (peer->update_if);
+ ifp = if_lookup_by_name_vrf (peer->update_if, peer->bgp->vrf_id);
else
ifp = if_lookup_by_ipv6_exact (&local->sin6.sin6_addr,
- local->sin6.sin6_scope_id);
+ local->sin6.sin6_scope_id,
+ peer->bgp->vrf_id);
}
#endif /* HAVE_IPV6 */
else
if_get_ipv6_local (ifp, &nexthop->v6_local);
- if (if_lookup_by_ipv4 (&remote->sin.sin_addr))
+ if (if_lookup_by_ipv4 (&remote->sin.sin_addr, peer->bgp->vrf_id))
peer->shared_network = 1;
else
peer->shared_network = 0;
/* If directory connected set link-local address. */
direct = if_lookup_by_ipv6 (&remote->sin6.sin6_addr,
- remote->sin6.sin6_scope_id);
+ remote->sin6.sin6_scope_id, peer->bgp->vrf_id);
if (direct)
if_get_ipv6_local (ifp, &nexthop->v6_local);
}
}
if (IN6_IS_ADDR_LINKLOCAL (&local->sin6.sin6_addr) ||
- if_lookup_by_ipv6 (&remote->sin6.sin6_addr, remote->sin6.sin6_scope_id))
+ if_lookup_by_ipv6 (&remote->sin6.sin6_addr, remote->sin6.sin6_scope_id,
+ peer->bgp->vrf_id))
peer->shared_network = 1;
else
peer->shared_network = 0;
return;
if ((p->family == AF_INET &&
- !vrf_bitmap_check (zclient->redist[AFI_IP][ZEBRA_ROUTE_BGP], VRF_DEFAULT))
+ !vrf_bitmap_check (zclient->redist[AFI_IP][ZEBRA_ROUTE_BGP], bgp->vrf_id))
|| (p->family == AF_INET6 &&
- !vrf_bitmap_check (zclient->redist[AFI_IP6][ZEBRA_ROUTE_BGP], VRF_DEFAULT)))
+ !vrf_bitmap_check (zclient->redist[AFI_IP6][ZEBRA_ROUTE_BGP], bgp->vrf_id)))
return;
if (bgp->main_zebra_update_hold)
valid_nh_count++;
}
- api.vrf_id = VRF_DEFAULT;
+ api.vrf_id = bgp->vrf_id;
api.flags = flags;
api.type = ZEBRA_ROUTE_BGP;
api.instance = 0;
}
/* Make Zebra API structure. */
- api.vrf_id = VRF_DEFAULT;
+ api.vrf_id = bgp->vrf_id;
api.flags = flags;
api.type = ZEBRA_ROUTE_BGP;
api.instance = 0;
if (zclient->sock < 0)
return;
+ peer = info->peer;
+
if ((p->family == AF_INET &&
- !vrf_bitmap_check (zclient->redist[AFI_IP][ZEBRA_ROUTE_BGP], VRF_DEFAULT))
+ !vrf_bitmap_check (zclient->redist[AFI_IP][ZEBRA_ROUTE_BGP], peer->bgp->vrf_id))
|| (p->family == AF_INET6 &&
- !vrf_bitmap_check (zclient->redist[AFI_IP6][ZEBRA_ROUTE_BGP], VRF_DEFAULT)))
+ !vrf_bitmap_check (zclient->redist[AFI_IP6][ZEBRA_ROUTE_BGP], peer->bgp->vrf_id)))
return;
- peer = info->peer;
-
flags = 0;
if (peer->sort == BGP_PEER_IBGP)
{
struct zapi_ipv4 api;
- api.vrf_id = VRF_DEFAULT;
+ api.vrf_id = peer->bgp->vrf_id;
api.flags = flags;
api.type = ZEBRA_ROUTE_BGP;
assert (info->attr->extra);
- api.vrf_id = VRF_DEFAULT;
+ api.vrf_id = peer->bgp->vrf_id;
api.flags = flags;
api.type = ZEBRA_ROUTE_BGP;
api.instance = 0;
/* Other routes redistribution into BGP. */
int
-bgp_redistribute_set (afi_t afi, int type, u_short instance)
+bgp_redistribute_set (struct bgp *bgp, afi_t afi, int type, u_short instance)
{
/* Return if already redistribute flag is set. */
}
else
{
- if (vrf_bitmap_check (zclient->redist[afi][type], VRF_DEFAULT))
+ if (vrf_bitmap_check (zclient->redist[afi][type], bgp->vrf_id))
return CMD_WARNING;
- vrf_bitmap_set (zclient->redist[afi][type], VRF_DEFAULT);
+ vrf_bitmap_set (zclient->redist[afi][type], bgp->vrf_id);
}
/* Return if zebra connection is not established. */
/* Send distribute add message to zebra. */
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, afi, type,
- instance, VRF_DEFAULT);
+ instance, bgp->vrf_id);
return CMD_SUCCESS;
}
/* Unset redistribution. */
int
-bgp_redistribute_unset (struct bgp *bgp, afi_t afi, int type, u_short instance)
+bgp_redistribute_unreg (struct bgp *bgp, afi_t afi, int type, u_short instance)
{
struct bgp_redist *red;
if (!red)
return CMD_SUCCESS;
- /* Unset route-map. */
- if (red->rmap.name)
- XFREE(MTYPE_ROUTE_MAP_NAME, red->rmap.name);
- red->rmap.name = NULL;
- red->rmap.map = NULL;
-
- /* Unset metric. */
- red->redist_metric_flag = 0;
- red->redist_metric = 0;
-
- bgp_redist_del(bgp, afi, type, instance);
-
/* Return if zebra connection is disabled. */
if (instance)
{
}
else
{
- if (! vrf_bitmap_check (zclient->redist[afi][type], VRF_DEFAULT))
+ if (! vrf_bitmap_check (zclient->redist[afi][type], bgp->vrf_id))
return CMD_WARNING;
- vrf_bitmap_unset (zclient->redist[afi][type], VRF_DEFAULT);
+ vrf_bitmap_unset (zclient->redist[afi][type], bgp->vrf_id);
}
if (zclient->sock >= 0)
zlog_debug("Zebra send: redistribute delete afi %d %s %d",
afi, zebra_route_string(type), instance);
zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, afi, type, instance,
- VRF_DEFAULT);
+ bgp->vrf_id);
}
/* Withdraw redistributed routes from current BGP's routing table. */
return CMD_SUCCESS;
}
+/* Unset redistribution. */
+int
+bgp_redistribute_unset (struct bgp *bgp, afi_t afi, int type, u_short instance)
+{
+ struct bgp_redist *red;
+
+ red = bgp_redist_lookup(bgp, afi, type, instance);
+ if (!red)
+ return CMD_SUCCESS;
+
+ bgp_redistribute_unreg(bgp, afi, type, instance);
+
+ /* Unset route-map. */
+ if (red->rmap.name)
+ XFREE(MTYPE_ROUTE_MAP_NAME, red->rmap.name);
+ red->rmap.name = NULL;
+ red->rmap.map = NULL;
+
+ /* Unset metric. */
+ red->redist_metric_flag = 0;
+ red->redist_metric = 0;
+
+ bgp_redist_del(bgp, afi, type, instance);
+
+ return CMD_SUCCESS;
+}
+
void
bgp_zclient_reset (void)
{
static void
bgp_zebra_connected (struct zclient *zclient)
{
- zclient_send_requests (zclient, VRF_DEFAULT);
+ struct listnode *node, *nnode;
+ struct bgp *bgp;
- bgp_nht_register_all();
+ for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
+ bgp_vrf_update (bgp);
}
+
void
bgp_zebra_init (struct thread_master *master)
{
zclient_init (zclient, ZEBRA_ROUTE_BGP, 0);
zclient->zebra_connected = bgp_zebra_connected;
zclient->router_id_update = bgp_router_id_update;
+ zclient->vrf_add = bgp_vrf_add;
+ zclient->vrf_delete = bgp_vrf_delete;
zclient->interface_add = bgp_interface_add;
zclient->interface_delete = bgp_interface_delete;
zclient->interface_address_add = bgp_interface_address_add;
extern void bgp_zebra_init(struct thread_master *master);
extern int bgp_if_update_all (void);
+extern void bgp_vrf_update (struct bgp *);
extern int bgp_config_write_maxpaths (struct vty *, struct bgp *, afi_t,
safi_t, int *);
extern int bgp_config_write_redistribute (struct vty *, struct bgp *, afi_t, safi_t,
extern struct bgp_redist *bgp_redist_lookup (struct bgp *, afi_t, u_char, u_short);
extern struct bgp_redist *bgp_redist_add (struct bgp *, afi_t, u_char, u_short);
-extern int bgp_redistribute_set (afi_t, int, u_short);
+extern int bgp_redistribute_set (struct bgp *, afi_t, int, u_short);
extern int bgp_redistribute_resend (struct bgp *, afi_t, int, u_short);
extern int bgp_redistribute_rmap_set (struct bgp_redist *, const char *);
extern int bgp_redistribute_metric_set(struct bgp *, struct bgp_redist *,
afi_t, int, u_int32_t);
extern int bgp_redistribute_unset (struct bgp *, afi_t, int, u_short);
+extern int bgp_redistribute_unreg (struct bgp *, afi_t, int, u_short);
-extern struct interface *if_lookup_by_ipv4 (struct in_addr *);
-extern struct interface *if_lookup_by_ipv4_exact (struct in_addr *);
+extern struct interface *if_lookup_by_ipv4 (struct in_addr *, vrf_id_t);
+extern struct interface *if_lookup_by_ipv4_exact (struct in_addr *, vrf_id_t);
#ifdef HAVE_IPV6
-extern struct interface *if_lookup_by_ipv6 (struct in6_addr *, unsigned int ifindex);
-extern struct interface *if_lookup_by_ipv6_exact (struct in6_addr *, unsigned int ifindex);
+extern struct interface *if_lookup_by_ipv6 (struct in6_addr *, unsigned int, vrf_id_t);
+extern struct interface *if_lookup_by_ipv6_exact (struct in6_addr *, unsigned int, vrf_id_t);
#endif /* HAVE_IPV6 */
#endif /* _QUAGGA_BGP_ZEBRA_H */
/* BGP process wide configuration. */
static struct bgp_master bgp_master;
-extern struct in_addr router_id_zebra;
-
/* BGP process wide configuration pointer to export. */
struct bgp_master *bm;
bgp->as = *as;
if (name)
- bgp->name = XSTRDUP(MTYPE_BGP, name);
+ {
+ bgp->name = XSTRDUP(MTYPE_BGP, name);
+ }
+ else
+ {
+ //Pending: See if calling bgp_instance_up() makes more sense.
+ THREAD_TIMER_ON (bm->master, bgp->t_startup, bgp_startup_timer_expire,
+ bgp, bgp->restart_time);
+ }
bgp->wpkt_quanta = BGP_WRITE_PACKET_MAX;
bgp->coalesce_time = BGP_DEFAULT_SUBGROUP_COALESCE_TIME;
+ update_bgp_group_init(bgp);
+ return bgp;
+}
+
+void
+bgp_instance_up (struct bgp *bgp)
+{
+ struct peer *peer;
+ struct listnode *node, *next;
+ afi_t afi;
+ int i;
+
THREAD_TIMER_ON (bm->master, bgp->t_startup, bgp_startup_timer_expire,
bgp, bgp->restart_time);
- update_bgp_group_init(bgp);
- return bgp;
+ /* Delete static route. */
+ bgp_static_add (bgp);
+
+ /* Set redistribution. */
+ for (afi = AFI_IP; afi < AFI_MAX; afi++)
+ for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
+ if (i != ZEBRA_ROUTE_BGP && bgp_redist_lookup(bgp, afi, i, 0))
+ bgp_redistribute_set (bgp, afi, i, 0);
+
+ for (ALL_LIST_ELEMENTS (bgp->peer, node, next, peer))
+ {
+ BGP_EVENT_ADD (peer, BGP_Start);
+ }
}
/* Return first entry of BGP. */
return NULL;
}
+/* Lookup BGP structure by view name. */
+//Pending: move this based on the vrf_hash lookup and find the linked bgp instance.
+struct bgp *
+bgp_lookup_by_vrf_id (vrf_id_t vrf_id)
+{
+ struct bgp *bgp;
+ struct listnode *node, *nnode;
+
+ for (ALL_LIST_ELEMENTS (bm->bgp, node, nnode, bgp))
+ if (bgp->vrf_id == vrf_id)
+ return bgp;
+ return NULL;
+}
+
/* Called from VTY commands. */
int
bgp_get (struct bgp **bgp_val, as_t *as, const char *name)
}
bgp = bgp_create (as, name);
- bgp_router_id_set(bgp, &router_id_zebra);
+ bgp_router_id_set(bgp, &bgp->router_id_zebra);
+ bgp_address_init (bgp);
+ bgp_scan_init (bgp);
*bgp_val = bgp;
bgp->t_rmap_def_originate_eval = NULL;
listnode_add (bm->bgp, bgp);
+ bgp_vrf_update (bgp);
+
return 0;
}
/* Delete BGP instance. */
-int
-bgp_delete (struct bgp *bgp)
+void
+bgp_instance_down (struct bgp *bgp)
{
struct peer *peer;
struct peer_group *group;
for (afi = AFI_IP; afi < AFI_MAX; afi++)
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
if (i != ZEBRA_ROUTE_BGP)
- bgp_redistribute_unset (bgp, afi, i, 0);
+ bgp_redistribute_unreg (bgp, afi, i, 0);
for (ALL_LIST_ELEMENTS (bgp->group, node, next, group))
{
bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
}
}
- peer_group_delete (group);
}
for (ALL_LIST_ELEMENTS (bgp->peer, node, next, peer))
/* Send notify to remote peer. */
bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN);
}
+ }
+
+ if (bgp->t_rmap_def_originate_eval)
+ {
+ BGP_TIMER_OFF(bgp->t_rmap_def_originate_eval);
+ }
+
+ return;
+}
+/* Delete BGP instance. */
+int
+bgp_delete (struct bgp *bgp)
+{
+ struct peer *peer;
+ struct peer_group *group;
+ struct listnode *node, *next;
+ afi_t afi;
+ int i;
+
+ /* Delete static route. */
+ bgp_static_delete (bgp);
+
+ /* Unset redistribution. */
+ for (afi = AFI_IP; afi < AFI_MAX; afi++)
+ for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
+ if (i != ZEBRA_ROUTE_BGP)
+ bgp_redistribute_unset (bgp, afi, i, 0);
+
+ for (ALL_LIST_ELEMENTS (bgp->group, node, next, group))
+ {
+ peer_group_delete (group);
+ }
+
+ for (ALL_LIST_ELEMENTS (bgp->peer, node, next, peer))
+ {
peer_delete (peer);
}
if (bgp->t_rmap_def_originate_eval)
{
- BGP_TIMER_OFF(bgp->t_rmap_def_originate_eval);
bgp_unlock(bgp);
}
for (ALL_LIST_ELEMENTS (bm->bgp, bgpnode, nbgpnode, bgp))
{
+ /*
+ * Don't have to cross the instance boundaries for VRFs.
+ */
+ if (bgp_flag_check(bgp, BGP_FLAG_INSTANCE_TYPE_VRF))
+ continue;
+
peer = hash_lookup(bgp->peerhash, &tmp_peer);
if (peer)
if (bgp_option_check (BGP_OPT_MULTIPLE_INSTANCE))
{
if (bgp->name)
- vty_out (vty, " view %s", bgp->name);
+ vty_out (vty, " %s %s", (bgp_flag_check(bgp, BGP_FLAG_INSTANCE_TYPE_VIEW) ?
+ "view" : "vrf"), bgp->name);
}
vty_out (vty, "%s", VTY_NEWLINE);
{
/* allocates some vital data structures used by peer commands in vty_init */
- bgp_scan_init ();
/* Init zebra. */
bgp_zebra_init(bm->master);
bgp_dump_init ();
bgp_route_init ();
bgp_route_map_init ();
- bgp_address_init ();
bgp_scan_vty_init();
bgp_mplsvpn_init ();
#define _QUAGGA_BGPD_H
#include "lib/json.h"
+#include "vrf.h"
+
/* For union sockunion. */
#include "queue.h"
#include "sockunion.h"
/* Name of this BGP instance. */
char *name;
+
+ vrf_id_t vrf_id;
/* Reference count to allow peer_delete to finish after bgp_delete */
int lock;
/* BGP router identifier. */
struct in_addr router_id;
struct in_addr router_id_static;
+ struct in_addr router_id_zebra;
/* BGP route reflector cluster ID. */
struct in_addr cluster_id;
#define BGP_FLAG_MULTIPATH_RELAX_AS_SET (1 << 17)
#define BGP_FLAG_FORCE_STATIC_PROCESS (1 << 18)
#define BGP_FLAG_SHOW_HOSTNAME (1 << 19)
+#define BGP_FLAG_INSTANCE_TYPE_VIEW (1 << 20)
+#define BGP_FLAG_INSTANCE_TYPE_VRF (1 << 21)
/* BGP Per AF flags */
u_int16_t af_flags[AFI_MAX][SAFI_MAX];
#define BGP_CONFIG_DAMPENING (1 << 0)
+ /* Route table for next-hop lookup cache. */
+ struct bgp_table *nexthop_cache_table[AFI_MAX];
+
+ /* Route table for import-check */
+ struct bgp_table *import_check_table[AFI_MAX];
+
+ struct bgp_table *connected_table[AFI_MAX];
+
+ struct hash *address_hash;
+
/* Static route configuration. */
struct bgp_table *route[AFI_MAX][SAFI_MAX];
extern struct bgp *bgp_get_default (void);
extern struct bgp *bgp_lookup (as_t, const char *);
extern struct bgp *bgp_lookup_by_name (const char *);
+extern struct bgp *bgp_lookup_by_vrf_id (vrf_id_t);
extern struct peer *peer_lookup (struct bgp *, union sockunion *);
extern struct peer *peer_lookup_by_conf_if (struct bgp *, const char *);
extern struct peer *peer_lookup_by_hostname(struct bgp *, const char *);
extern int bgp_option_check (int);
extern int bgp_get (struct bgp **, as_t *, const char *);
+extern void bgp_instance_up (struct bgp *);
+extern void bgp_instance_down (struct bgp *);
extern int bgp_delete (struct bgp *);
extern int bgp_flag_set (struct bgp *, int);
extern struct peer_af * peer_af_find (struct peer *, afi_t, safi_t);
extern int peer_af_delete (struct peer *, afi_t, safi_t);
-extern void bgp_scan_finish(void);
extern void bgp_close(void);
static inline int