diff options
Diffstat (limited to 'bgpd/bgpd.c')
-rw-r--r-- | bgpd/bgpd.c | 99 |
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) || |