/* neighbor weight. */
static int
peer_weight_set_vty (struct vty *vty, const char *ip_str,
+ afi_t afi, safi_t safi,
const char *weight_str)
{
int ret;
VTY_GET_INTEGER_RANGE("weight", weight, weight_str, 0, 65535);
- ret = peer_weight_set (peer, weight);
+ ret = peer_weight_set (peer, afi, safi, weight);
return bgp_vty_return (vty, ret);
}
static int
-peer_weight_unset_vty (struct vty *vty, const char *ip_str)
+peer_weight_unset_vty (struct vty *vty, const char *ip_str,
+ afi_t afi, safi_t safi)
{
int ret;
struct peer *peer;
if (! peer)
return CMD_WARNING;
- ret = peer_weight_unset (peer);
+ ret = peer_weight_unset (peer, afi, safi);
return bgp_vty_return (vty, ret);
}
"Set default weight for routes from this neighbor\n"
"default weight\n")
{
- return peer_weight_set_vty (vty, argv[0], argv[1]);
+ return peer_weight_set_vty (vty, argv[0], bgp_node_afi (vty), bgp_node_safi (vty), argv[1]);
}
DEFUN (no_neighbor_weight,
NEIGHBOR_ADDR_STR2
"Set default weight for routes from this neighbor\n")
{
- return peer_weight_unset_vty (vty, argv[0]);
+ return peer_weight_unset_vty (vty, argv[0], bgp_node_afi (vty), bgp_node_safi (vty));
}
ALIAS (no_neighbor_weight,
else if (p->update_source)
json_object_string_add(json_neigh, "updateSource", sockunion2str (p->update_source, buf1, SU_ADDRSTRLEN));
}
-
- /* Default weight */
- if (CHECK_FLAG (p->config, PEER_CONFIG_WEIGHT))
- json_object_int_add(json_neigh, "defaultWeight", p->weight);
-
}
else
{
vty_out (vty, "%s", VTY_NEWLINE);
}
- /* Default weight */
- if (CHECK_FLAG (p->config, PEER_CONFIG_WEIGHT))
- vty_out (vty, " Default weight %d%s", p->weight, VTY_NEWLINE);
-
vty_out (vty, "%s", VTY_NEWLINE);
}
install_element (BGP_NODE, &neighbor_weight_cmd);
install_element (BGP_NODE, &no_neighbor_weight_cmd);
install_element (BGP_NODE, &no_neighbor_weight_val_cmd);
+ install_element (BGP_IPV4_NODE, &neighbor_weight_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_weight_cmd);
+ install_element (BGP_IPV4_NODE, &no_neighbor_weight_val_cmd);
+ install_element (BGP_IPV4M_NODE, &neighbor_weight_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_weight_cmd);
+ install_element (BGP_IPV4M_NODE, &no_neighbor_weight_val_cmd);
+ install_element (BGP_IPV6_NODE, &neighbor_weight_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_weight_cmd);
+ install_element (BGP_IPV6_NODE, &no_neighbor_weight_val_cmd);
+ install_element (BGP_IPV6M_NODE, &neighbor_weight_cmd);
+ install_element (BGP_IPV6M_NODE, &no_neighbor_weight_cmd);
+ install_element (BGP_IPV6M_NODE, &no_neighbor_weight_val_cmd);
+ install_element (BGP_VPNV4_NODE, &neighbor_weight_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_weight_cmd);
+ install_element (BGP_VPNV4_NODE, &no_neighbor_weight_val_cmd);
+ install_element (BGP_VPNV6_NODE, &neighbor_weight_cmd);
+ install_element (BGP_VPNV6_NODE, &no_neighbor_weight_cmd);
+ install_element (BGP_VPNV6_NODE, &no_neighbor_weight_val_cmd);
+ install_element (BGP_ENCAP_NODE, &neighbor_weight_cmd);
+ install_element (BGP_ENCAP_NODE, &no_neighbor_weight_cmd);
+ install_element (BGP_ENCAP_NODE, &no_neighbor_weight_val_cmd);
+ install_element (BGP_ENCAPV6_NODE, &neighbor_weight_cmd);
+ install_element (BGP_ENCAPV6_NODE, &no_neighbor_weight_cmd);
+ install_element (BGP_ENCAPV6_NODE, &no_neighbor_weight_val_cmd);
/* "neighbor override-capability" commands. */
install_element (BGP_NODE, &neighbor_override_capability_cmd);
int v6only;
- peer->weight = 0;
peer->change_local_as = 0;
peer->ttl = (peer_sort (peer) == BGP_PEER_IBGP ? MAXTTL : 1);
if (peer->update_source)
peer->bgp = bgp;
peer = peer_lock (peer); /* initial reference */
bgp_lock (bgp);
- peer->weight = 0;
peer->password = NULL;
/* Set default flags. */
peer_dst->afc[afi][safi] = peer_src->afc[afi][safi];
peer_dst->af_flags[afi][safi] = peer_src->af_flags[afi][safi];
peer_dst->allowas_in[afi][safi] = peer_src->allowas_in[afi][safi];
+ peer_dst->weight[afi][safi] = peer_src->weight[afi][safi];
}
for (afidx = BGP_AF_START; afidx < BGP_AF_MAX; afidx++)
/* GTSM hops */
peer->gtsm_hops = conf->gtsm_hops;
- /* Weight */
- peer->weight = conf->weight;
-
/* this flag is per-neighbor and so has to be preserved */
v6only = CHECK_FLAG(peer->flags, PEER_FLAG_IFPEER_V6ONLY);
/* allowas-in */
peer->allowas_in[afi][safi] = conf->allowas_in[afi][safi];
+ /* weight */
+ peer->weight[afi][safi] = conf->weight[afi][safi];
+
/* default-originate route-map */
if (conf->default_rmap[afi][safi].name)
{
{ PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE,1, peer_change_reset_out },
{ PEER_FLAG_ADDPATH_TX_ALL_PATHS, 1, peer_change_reset },
{ PEER_FLAG_ADDPATH_TX_BESTPATH_PER_AS, 1, peer_change_reset },
+ { PEER_FLAG_WEIGHT, 0, peer_change_reset_in },
{ 0, 0, 0 }
};
return 0;
}
+/*
+ * Helper function that is called after the name of the policy
+ * being used by a peer has changed (AF specific). Automatically
+ * initiates inbound or outbound processing as needed.
+ */
+static void
+peer_on_policy_change (struct peer *peer, afi_t afi, safi_t safi, int outbound)
+{
+ if (outbound)
+ {
+ update_group_adjust_peer (peer_af_find (peer, afi, safi));
+ if (peer->status == Established)
+ bgp_announce_route(peer, afi, safi);
+ }
+ else
+ {
+ if (peer->status != Established)
+ return;
+
+ if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
+ bgp_soft_reconfig_in (peer, afi, safi);
+ else if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV)
+ || CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV))
+ bgp_route_refresh_send (peer, afi, safi, 0, 0, 0);
+ }
+}
+
+
/* neighbor weight. */
int
-peer_weight_set (struct peer *peer, u_int16_t weight)
+peer_weight_set (struct peer *peer, afi_t afi, safi_t safi, u_int16_t weight)
{
struct peer_group *group;
struct listnode *node, *nnode;
- SET_FLAG (peer->config, PEER_CONFIG_WEIGHT);
- peer->weight = weight;
+ if (peer->weight[afi][safi] != weight)
+ {
+ peer->weight[afi][safi] = weight;
+ SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_WEIGHT);
+ peer_on_policy_change (peer, afi, safi, 0);
+ }
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
return 0;
group = peer->group;
for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
{
- peer->weight = group->conf->weight;
+ if (peer->weight[afi][safi] != weight)
+ {
+ peer->weight[afi][safi] = weight;
+ SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_WEIGHT);
+ peer_on_policy_change (peer, afi, safi, 0);
+ }
}
- return 1;
+ return 0;
}
int
-peer_weight_unset (struct peer *peer)
+peer_weight_unset (struct peer *peer, afi_t afi, safi_t safi)
{
struct peer_group *group;
struct listnode *node, *nnode;
- /* Set default weight. */
- if (peer_group_active (peer))
- peer->weight = peer->group->conf->weight;
- else
- peer->weight = 0;
-
- UNSET_FLAG (peer->config, PEER_CONFIG_WEIGHT);
+ /* not the peer-group itself but a peer in a peer-group */
+ if (peer_group_active(peer))
+ {
+ group = peer->group;
- if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
- return 0;
+ /* inherit weight from the peer-group */
+ if (CHECK_FLAG (group->conf->af_flags[afi][safi], PEER_FLAG_WEIGHT))
+ {
+ peer->weight[afi][safi] = group->conf->weight[afi][safi];
+ peer_af_flag_set (peer, afi, safi, PEER_FLAG_WEIGHT);
+ peer_on_policy_change (peer, afi, safi, 0);
+ }
+ else
+ {
+ if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_WEIGHT))
+ {
+ peer->weight[afi][safi] = 0;
+ peer_af_flag_unset (peer, afi, safi, PEER_FLAG_WEIGHT);
+ peer_on_policy_change (peer, afi, safi, 0);
+ }
+ }
+ }
- /* peer-group member updates. */
- group = peer->group;
- for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
+ else
{
- peer->weight = 0;
+ if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_WEIGHT))
+ {
+ peer->weight[afi][safi] = 0;
+ peer_af_flag_unset (peer, afi, safi, PEER_FLAG_WEIGHT);
+ peer_on_policy_change (peer, afi, safi, 0);
+ }
+
+ /* peer-group member updates. */
+ group = peer->group;
+
+ if (group)
+ {
+ for (ALL_LIST_ELEMENTS (group->peer, node, nnode, peer))
+ {
+ if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_WEIGHT))
+ {
+ peer->weight[afi][safi] = 0;
+ peer_af_flag_unset (peer, afi, safi, PEER_FLAG_WEIGHT);
+ peer_on_policy_change (peer, afi, safi, 0);
+ }
+ }
+ }
}
- return 1;
+ return 0;
}
int
{
peer->allowas_in[afi][safi] = allow_num;
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN);
- peer_change_action (peer, afi, safi, peer_change_reset_in);
+ peer_on_policy_change (peer, afi, safi, 0);
}
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
{
peer->allowas_in[afi][safi] = allow_num;
SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN);
- peer_change_action (peer, afi, safi, peer_change_reset_in);
+ peer_on_policy_change (peer, afi, safi, 0);
}
}
{
peer->allowas_in[afi][safi] = 0;
peer_af_flag_unset (peer, afi, safi, PEER_FLAG_ALLOWAS_IN);
+ peer_on_policy_change (peer, afi, safi, 0);
}
if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
{
peer->allowas_in[afi][safi] = 0;
peer_af_flag_unset (peer, afi, safi, PEER_FLAG_ALLOWAS_IN);
+ peer_on_policy_change (peer, afi, safi, 0);
}
}
return 0;
return 0;
}
-/*
- * Helper function that is called after the name of the policy
- * being used by a peer has changed (AF specific). Automatically
- * initiates inbound or outbound processing as needed.
- */
-static void
-peer_on_policy_change (struct peer *peer, afi_t afi, safi_t safi, int outbound)
-{
- if (outbound)
- {
- update_group_adjust_peer (peer_af_find (peer, afi, safi));
- if (peer->status == Established)
- bgp_announce_route(peer, afi, safi);
- }
- else
- {
- if (peer->status != Established)
- return;
-
- if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
- bgp_soft_reconfig_in (peer, afi, safi);
- else if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV)
- || CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV))
- bgp_route_refresh_send (peer, afi, safi, 0, 0, 0);
- }
-}
-
/* Set distribute list to the peer. */
int
peer->connect, VTY_NEWLINE);
}
- /* weight */
- if (CHECK_FLAG (peer->config, PEER_CONFIG_WEIGHT))
- {
- if (! peer_group_active (peer) || g_peer->weight != peer->weight)
- {
- vty_out (vty, " neighbor %s weight %d%s", addr, peer->weight,
- VTY_NEWLINE);
- }
- }
-
/* capability dynamic */
if (CHECK_FLAG (peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
{
}
}
+ /* weight */
+ if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_WEIGHT))
+ if (! peer_group_active (peer)
+ || ! peer_af_flag_check (g_peer, afi, safi, PEER_FLAG_WEIGHT)
+ || peer->weight[afi][safi] != g_peer->weight[afi][safi])
+ {
+ if (peer->weight[afi][safi])
+ {
+ afi_header_vty_out (vty, afi, safi, write,
+ " neighbor %s weight %d%s",
+ addr, peer->weight[afi][safi], VTY_NEWLINE);
+ }
+ }
+
/* Filter. */
bgp_config_write_filter (vty, peer, afi, safi, write);