summaryrefslogtreecommitdiffstats
path: root/bgpd/bgpd.c
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgpd.c')
-rw-r--r--bgpd/bgpd.c99
1 files changed, 98 insertions, 1 deletions
diff --git a/bgpd/bgpd.c b/bgpd/bgpd.c
index 3f841078..7163f3f9 100644
--- a/bgpd/bgpd.c
+++ b/bgpd/bgpd.c
@@ -631,6 +631,10 @@ peer_global_config_reset (struct peer *peer)
peer->keepalive = 0;
peer->connect = 0;
peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
+
+#ifdef SUPPORT_REALMS
+ peer->realm = 0;
+#endif
}
/* Check peer's AS number and determin is this peer IBGP or EBGP */
@@ -791,6 +795,10 @@ peer_new (struct bgp *bgp)
peer->bgp = bgp;
peer = peer_lock (peer); /* initial reference */
+#ifdef SUPPORT_REALMS
+ peer->realm = 0;
+#endif
+
/* Set default flags. */
for (afi = AFI_IP; afi < AFI_MAX; afi++)
for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
@@ -1395,6 +1403,13 @@ peer_group2peer_config_copy (struct peer_group *group, struct peer *peer,
/* Weight */
peer->weight = conf->weight;
+#ifdef CONFIG_REALMS
+
+ /* Realm */
+ peer->realm = conf->realm;
+
+#endif
+
/* peer flags apply */
peer->flags = conf->flags;
/* peer af_flags apply */
@@ -3047,7 +3062,60 @@ peer_weight_unset (struct peer *peer)
}
return 0;
}
-
+
+#ifdef SUPPORT_REALMS
+
+/* neighbor realm. */
+int
+peer_realm_set (struct peer *peer, u_int32_t realm)
+{
+ struct peer_group *group;
+ struct listnode *node, *nnode;
+
+ SET_FLAG (peer->config, PEER_CONFIG_REALM);
+ peer->realm = realm;
+
+ if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
+ return 0;
+
+ /* peer-group member updates. */
+ group = peer->group;
+ for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
+ {
+ peer->realm = group->conf->realm;
+ }
+ return 0;
+}
+
+int
+peer_realm_unset (struct peer *peer)
+{
+ struct peer_group *group;
+ struct listnode *node, *nnode;
+
+ /* Set default realm. */
+ if (peer_group_active (peer))
+ peer->realm = peer->group->conf->realm;
+ else
+ peer->realm = 0;
+
+ UNSET_FLAG (peer->config, PEER_CONFIG_REALM);
+
+ if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
+ return 0;
+
+ /* peer-group member updates. */
+ group = peer->group;
+ for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
+ {
+ peer->realm = 0;
+ }
+ return 0;
+}
+
+
+#endif
+
int
peer_timers_set (struct peer *peer, u_int32_t keepalive, u_int32_t holdtime)
{
@@ -4481,6 +4549,35 @@ bgp_config_write_peer (struct vty *vty, struct bgp *bgp,
vty_out (vty, " neighbor %s weight %d%s", addr, peer->weight,
VTY_NEWLINE);
+#ifdef SUPPORT_REALMS
+
+#define REALM_PEER_AS 0xFFFFA
+#define REALM_ORIGIN_AS 0xFFFFB
+
+ /* Default realm. */
+ if (CHECK_FLAG (peer->config, PEER_CONFIG_REALM))
+ if (! peer_group_active (peer) ||
+ g_peer->realm != peer->realm)
+ {
+ char realmbuf[64];
+ if (peer->realm == REALM_PEER_AS)
+ vty_out (vty, " neighbor %s realm peer-as%s", addr,
+ VTY_NEWLINE);
+ else if (peer->realm == REALM_ORIGIN_AS)
+ vty_out (vty, " neighbor %s realm origin-as%s", addr,
+ VTY_NEWLINE);
+ else vty_out (vty, " neighbor %s realm %s%s", addr,
+ rtnl_rtrealm_n2a (peer->realm, realmbuf, sizeof (realmbuf)), VTY_NEWLINE);
+ }
+#endif
+
+
+
+
+
+
+
+
/* Dynamic capability. */
if (CHECK_FLAG (peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
if (! peer_group_active (peer) ||