• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/ap/gpl/zebra/bgpd/

Lines Matching refs:peer

165   struct peer *peer;
175 /* Set all peer's local identifier with this value. */
176 LIST_LOOP (bgp->peer, peer, nn)
178 IPV4_ADDR_COPY (&peer->local_id, id);
180 if (peer->status == Established)
181 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
191 struct peer *peer;
200 /* Clear peer router id configuration. */
201 LIST_LOOP (bgp->peer, peer, nn)
203 peer->local_id.s_addr = 0;
210 LIST_LOOP (bgp->peer, peer, nn)
212 if (peer->status == Established)
213 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
225 struct peer *peer;
235 /* Clear all IBGP peer. */
236 LIST_LOOP (bgp->peer, peer, nn)
238 if (peer_sort (peer) != BGP_PEER_IBGP)
241 if (peer->status == Established)
242 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
251 struct peer *peer;
260 /* Clear all IBGP peer. */
261 LIST_LOOP (bgp->peer, peer, nn)
263 if (peer_sort (peer) != BGP_PEER_IBGP)
266 if (peer->status == Established)
267 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
299 struct peer *peer;
314 LIST_LOOP (bgp->peer, peer, nn)
320 if (peer_sort (peer) == BGP_PEER_EBGP)
322 peer->local_as = as;
323 if (peer->status == Established)
324 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
327 BGP_EVENT_ADD (peer, BGP_Stop);
334 if (peer_sort (peer) != BGP_PEER_IBGP)
337 if (peer_sort (peer) == BGP_PEER_EBGP)
338 peer->local_as = as;
339 if (peer->status == Established)
340 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
343 BGP_EVENT_ADD (peer, BGP_Stop);
353 struct peer *peer;
359 LIST_LOOP (bgp->peer, peer, nn)
362 if (peer_sort (peer) != BGP_PEER_IBGP)
364 peer->local_as = bgp->as;
365 if (peer->status == Established)
366 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
369 BGP_EVENT_ADD (peer, BGP_Stop);
395 struct peer *peer;
420 LIST_LOOP (bgp->peer, peer, nn)
422 if (peer->as == as)
424 peer->local_as = bgp->as;
425 if (peer->status == Established)
426 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
429 BGP_EVENT_ADD (peer, BGP_Stop);
442 struct peer *peer;
469 /* Now reset any peer who's remote AS has just been removed from the
473 LIST_LOOP (bgp->peer, peer, nn)
475 if (peer->as == as)
477 peer->local_as = bgp->confed_id;
478 if (peer->status == Established)
479 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
482 BGP_EVENT_ADD (peer, BGP_Stop);
519 peer_cmp (struct peer *p1, struct peer *p2)
525 peer_af_flag_check (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag)
527 return CHECK_FLAG (peer->af_flags[afi][safi], flag);
532 peer_af_flag_reset (struct peer *peer, afi_t afi, safi_t safi)
538 filter = &peer->filter[afi][safi];
572 peer->af_flags[afi][safi] = 0;
575 peer->af_sflags[afi][safi] = 0;
578 peer->af_cap[afi][safi] = 0;
581 peer->orf_plist[afi][safi] = NULL;
582 sprintf (orf_name, "%s.%d.%d", peer->host, afi, safi);
588 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY);
589 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY);
593 if (peer->default_rmap[afi][safi].name)
594 free (peer->default_rmap[afi][safi].name);
595 peer->default_rmap[afi][safi].name = NULL;
596 peer->default_rmap[afi][safi].map = NULL;
599 peer->pmax[afi][safi] = 0;
600 peer->pmax_warning[afi][safi] = 0;
603 /* peer global config reset */
605 peer_global_config_reset (struct peer *peer)
607 peer->weight = 0;
608 peer->change_local_as = 0;
609 peer->ttl = (peer_sort (peer) == BGP_PEER_IBGP ? 255 : 1);
610 if (peer->update_source)
612 sockunion_free (peer->update_source);
613 peer->update_source = NULL;
615 if (peer->update_if)
617 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
618 peer->update_if = NULL;
621 if (peer_sort (peer) == BGP_PEER_IBGP)
622 peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
624 peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
626 peer->flags = 0;
627 peer->config = 0;
628 peer->holdtime = 0;
629 peer->keepalive = 0;
630 peer->connect = 0;
631 peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
634 /* Check peer's AS number and determin is this peer IBGP or EBGP */
636 peer_sort (struct peer *peer)
640 bgp = peer->bgp;
643 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
645 if (peer->as)
646 return (bgp->as == peer->as ? BGP_PEER_IBGP : BGP_PEER_EBGP);
649 struct peer *peer1;
650 peer1 = listnode_head (peer->group->peer);
658 /* Normal peer */
661 if (peer->local_as == 0)
664 if (peer->local_as == peer->as)
666 if (peer->local_as == bgp->confed_id)
672 if (bgp_confederation_peers_check (bgp, peer->as))
679 return (peer->local_as == 0
680 ? BGP_PEER_INTERNAL : peer->local_as == peer->as
685 /* Allocate new peer object. */
686 static struct peer *
691 struct peer *peer;
694 /* Allocate new peer. */
695 peer = XMALLOC (MTYPE_BGP_PEER, sizeof (struct peer));
696 memset (peer, 0, sizeof (struct peer));
699 peer->fd = -1;
700 peer->v_start = BGP_INIT_START_TIMER;
701 peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
702 peer->v_asorig = BGP_DEFAULT_ASORIGINATE;
703 peer->status = Idle;
704 peer->ostatus = Idle;
705 peer->version = BGP_VERSION_4;
706 peer->weight = 0;
714 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_COMMUNITY);
715 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SEND_EXT_COMMUNITY);
717 peer->orf_plist[afi][safi] = NULL;
719 SET_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
722 peer->ibuf = stream_new (BGP_MAX_PACKET_SIZE);
723 peer->obuf = stream_fifo_new ();
724 peer->work = stream_new (BGP_MAX_PACKET_SIZE);
726 bgp_sync_init (peer);
730 peer->port = (sp == NULL) ? BGP_PORT_DEFAULT : ntohs (sp->s_port);
732 return peer;
735 /* Create new BGP peer. */
736 struct peer *
741 struct peer *peer;
744 peer = peer_new ();
745 peer->bgp = bgp;
746 peer->su = *su;
747 peer->local_as = local_as;
748 peer->as = remote_as;
749 peer->local_id = bgp->router_id;
750 peer->v_holdtime = bgp->default_holdtime;
751 peer->v_keepalive = bgp->default_keepalive;
752 if (peer_sort (peer) == BGP_PEER_IBGP)
753 peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
755 peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
756 listnode_add_sort (bgp->peer, peer);
758 active = peer_active (peer);
761 peer->afc[afi][safi] = 1;
764 peer->readtime = time (NULL);
767 peer->ttl = (peer_sort (peer) == BGP_PEER_IBGP ? 255 : 1);
769 /* Make peer's address string. */
771 peer->host = strdup (buf);
773 /* Set up peer's events and timers. */
774 if (! active && peer_active (peer))
775 bgp_timer_set (peer);
777 return peer;
780 /* Make accept BGP peer. Called from bgp_accept (). */
781 struct peer *
784 struct peer *peer;
786 peer = peer_new ();
787 peer->bgp = bgp;
788 listnode_add_sort (bgp->peer, peer);
790 return peer;
793 /* Change peer's AS number. */
795 peer_as_change (struct peer *peer, as_t as)
799 /* Stop peer. */
800 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
802 if (peer->status == Established)
803 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
806 BGP_EVENT_ADD (peer, BGP_Stop);
808 type = peer_sort (peer);
809 peer->as = as;
812 if (peer_sort (peer) == BGP_PEER_IBGP)
813 peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
815 peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
818 if (peer_sort (peer) == BGP_PEER_IBGP)
819 peer->ttl = 255;
821 peer->ttl = 1;
824 if (peer_sort (peer) != BGP_PEER_IBGP)
826 UNSET_FLAG (peer->af_flags[AFI_IP][SAFI_UNICAST],
828 UNSET_FLAG (peer->af_flags[AFI_IP][SAFI_MULTICAST],
830 UNSET_FLAG (peer->af_flags[AFI_IP][SAFI_MPLS_VPN],
832 UNSET_FLAG (peer->af_flags[AFI_IP6][SAFI_UNICAST],
834 UNSET_FLAG (peer->af_flags[AFI_IP6][SAFI_MULTICAST],
839 if (peer_sort (peer) != BGP_PEER_EBGP)
841 peer->change_local_as = 0;
842 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
846 /* If peer does not exist, create new one. If peer already exists,
847 set AS number to the peer. */
852 struct peer *peer;
855 peer = peer_lookup (bgp, su);
857 if (peer)
859 /* When this peer is a member of peer-group. */
860 if (peer->group)
862 if (peer->group->conf->as)
864 /* Return peer group's AS number. */
865 *as = peer->group->conf->as;
868 if (peer_sort (peer->group->conf) == BGP_PEER_IBGP)
872 *as = peer->as;
880 *as = peer->as;
886 /* Existing peer's AS number change. */
887 if (peer->as != *as)
888 peer_as_change (peer, *as);
893 /* If the peer is not part of our confederation, and its not an
894 iBGP peer then spoof the source AS */
907 peer = peer_create (su, bgp, local_as, *as, 0, 0);
909 peer = peer_create (su, bgp, local_as, *as, afi, safi);
915 /* Activate the peer or peer group for specified AFI and SAFI. */
917 peer_activate (struct peer *peer, afi_t afi, safi_t safi)
921 if (peer->afc[afi][safi])
925 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
926 peer->afc[afi][safi] = 1;
929 active = peer_active (peer);
931 peer->afc[afi][safi] = 1;
933 if (! active && peer_active (peer))
934 bgp_timer_set (peer);
937 if (peer->status == Established)
939 if (CHECK_FLAG (peer->cap, PEER_CAP_DYNAMIC_RCV))
941 peer->afc_adv[afi][safi] = 1;
942 bgp_capability_send (peer, afi, safi,
945 if (peer->afc_recv[afi][safi])
947 peer->afc_nego[afi][safi] = 1;
948 bgp_announce_route (peer, afi, safi);
952 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
961 peer_deactivate (struct peer *peer, afi_t afi, safi_t safi)
964 struct peer *peer1;
967 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
969 group = peer->group;
971 LIST_LOOP (group->peer, peer1, nn)
979 if (peer->af_group[afi][safi])
983 if (! peer->afc[afi][safi])
987 peer->afc[afi][safi] = 0;
988 peer_af_flag_reset (peer, afi, safi);
990 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
992 if (peer->status == Established)
994 if (CHECK_FLAG (peer->cap, PEER_CAP_DYNAMIC_RCV))
996 peer->afc_adv[afi][safi] = 0;
997 peer->afc_nego[afi][safi] = 0;
999 if (peer_active_nego (peer))
1001 bgp_capability_send (peer, afi, safi,
1004 bgp_clear_route (peer, afi, safi);
1005 peer->pcount[afi][safi] = 0;
1008 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
1012 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
1019 /* Delete peer from confguration. */
1021 peer_delete (struct peer *peer)
1029 bgp = peer->bgp;
1031 /* If this peer belongs to peer group. Clearn up the
1033 if (peer->group)
1035 listnode_delete (peer->group->peer, peer);
1036 peer->group = NULL;
1040 BGP_EVENT_ADD (peer, BGP_Stop) at here. Because the event is
1041 executed after peer structure is deleted. */
1042 bgp_stop (peer);
1043 bgp_fsm_change_status (peer, Idle);
1046 BGP_TIMER_OFF (peer->t_start);
1047 BGP_TIMER_OFF (peer->t_connect);
1048 BGP_TIMER_OFF (peer->t_holdtime);
1049 BGP_TIMER_OFF (peer->t_keepalive);
1050 BGP_TIMER_OFF (peer->t_asorig);
1051 BGP_TIMER_OFF (peer->t_routeadv);
1053 /* Delete from all peer list. */
1054 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
1055 listnode_delete (bgp->peer, peer);
1058 if (peer->ibuf)
1059 stream_free (peer->ibuf);
1061 if (peer->obuf)
1062 stream_fifo_free (peer->obuf);
1064 if (peer->work)
1065 stream_free (peer->work);
1068 if (peer->host)
1069 free (peer->host);
1072 if (peer->su_local)
1073 XFREE (MTYPE_TMP, peer->su_local);
1074 if (peer->su_remote)
1075 XFREE (MTYPE_TMP, peer->su_remote);
1078 if (peer->desc)
1079 XFREE (MTYPE_TMP, peer->desc);
1081 bgp_sync_delete (peer);
1087 filter = &peer->filter[afi][safi];
1104 if (peer->default_rmap[afi][safi].name)
1105 free (peer->default_rmap[afi][safi].name);
1109 if (peer->update_source)
1111 sockunion_free (peer->update_source);
1112 peer->update_source = NULL;
1114 if (peer->update_if)
1116 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
1117 peer->update_if = NULL;
1120 /* Free peer structure. */
1121 XFREE (MTYPE_BGP_PEER, peer);
1133 /* If peer is configured at least one address family return 1. */
1135 peer_group_active (struct peer *peer)
1137 if (peer->af_group[AFI_IP][SAFI_UNICAST]
1138 || peer->af_group[AFI_IP][SAFI_MULTICAST]
1139 || peer->af_group[AFI_IP][SAFI_MPLS_VPN]
1140 || peer->af_group[AFI_IP6][SAFI_UNICAST]
1141 || peer->af_group[AFI_IP6][SAFI_MULTICAST])
1186 group->peer = list_new ();
1208 peer_group2peer_config_copy (struct peer_group *group, struct peer *peer,
1213 struct peer *conf;
1218 pfilter = &peer->filter[afi][safi];
1223 peer->as = conf->as;
1227 peer->change_local_as = conf->change_local_as;
1230 peer->ttl = conf->ttl;
1233 peer->weight = conf->weight;
1235 /* peer flags apply */
1236 peer->flags = conf->flags;
1237 /* peer af_flags apply */
1238 peer->af_flags[afi][safi] = conf->af_flags[afi][safi];
1239 /* peer config apply */
1240 peer->config = conf->config;
1242 /* peer timers apply */
1243 peer->holdtime = conf->holdtime;
1244 peer->keepalive = conf->keepalive;
1245 peer->connect = conf->connect;
1247 peer->v_connect = conf->connect;
1249 peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
1252 if (peer_sort (peer) == BGP_PEER_IBGP)
1253 peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
1255 peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
1258 peer->allowas_in[afi][safi] = conf->allowas_in[afi][safi];
1263 if (peer->update_source)
1264 sockunion_free (peer->update_source);
1265 if (peer->update_if)
1267 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
1268 peer->update_if = NULL;
1270 peer->update_source = sockunion_dup (conf->update_source);
1274 if (peer->update_if)
1275 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
1276 if (peer->update_source)
1278 sockunion_free (peer->update_source);
1279 peer->update_source = NULL;
1281 peer->update_if = XSTRDUP (MTYPE_PEER_UPDATE_SOURCE, conf->update_if);
1393 struct peer *peer;
1403 /* When we setup peer-group AS number all peer group member's AS
1407 LIST_LOOP (group->peer, peer, nn)
1409 if (peer->as != *as)
1410 peer_as_change (peer, *as);
1420 struct peer *peer;
1425 LIST_LOOP (group->peer, peer, nn)
1427 peer->group = NULL;
1428 peer_delete (peer);
1430 list_delete (group->peer);
1449 struct peer *peer;
1455 LIST_LOOP (group->peer, peer, nn)
1457 peer->group = NULL;
1458 peer_delete (peer);
1460 list_delete_all_node (group->peer);
1467 /* Bind specified peer to peer group. */
1472 struct peer *peer;
1475 /* Check peer group's address family. */
1479 /* Lookup the peer. */
1480 peer = peer_lookup (bgp, su);
1482 /* Create a new peer. */
1483 if (! peer)
1488 peer = peer_create (su, bgp, bgp->as, group->conf->as, afi, safi);
1489 peer->group = group;
1490 peer->af_group[afi][safi] = 1;
1491 listnode_add (group->peer, peer);
1492 peer_group2peer_config_copy (group, peer, afi, safi);
1497 /* When the peer already belongs to peer group, check the consistency. */
1498 if (peer->af_group[afi][safi])
1500 if (strcmp (peer->group->name, group->name) != 0)
1506 /* Check current peer group configuration. */
1507 if (peer_group_active (peer)
1508 && strcmp (peer->group->name, group->name) != 0)
1514 && peer_sort (group->conf) != peer_sort (peer))
1517 *as = peer->as;
1525 peer->af_group[afi][safi] = 1;
1526 peer->afc[afi][safi] = 1;
1527 if (! peer->group)
1529 peer->group = group;
1530 listnode_add (group->peer, peer);
1549 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
1552 peer_group2peer_config_copy (group, peer, afi, safi);
1554 if (peer->status == Established)
1555 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
1558 BGP_EVENT_ADD (peer, BGP_Stop);
1564 peer_group_unbind (struct bgp *bgp, struct peer *peer,
1567 if (! peer->af_group[afi][safi])
1570 if (group != peer->group)
1573 peer->af_group[afi][safi] = 0;
1574 peer->afc[afi][safi] = 0;
1575 peer_af_flag_reset (peer, afi, safi);
1577 if (! peer_group_active (peer))
1579 listnode_delete (group->peer, peer);
1580 peer->group = NULL;
1583 peer_delete (peer);
1586 peer_global_config_reset (peer);
1589 if (peer->status == Established)
1590 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
1593 BGP_EVENT_ADD (peer, BGP_Stop);
1612 bgp->peer = list_new ();
1613 bgp->peer->cmp = (int (*)(void *, void *)) peer_cmp;
1735 struct peer *peer;
1754 for (nn = bgp->peer->head; nn; nn = next)
1756 peer = nn->data;
1758 peer_delete (peer);
1782 struct peer *
1785 struct peer *peer;
1794 LIST_LOOP (bgp->peer, peer, nn)
1796 if (sockunion_same (&peer->su, su)
1797 && ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
1798 return peer;
1803 struct peer *
1807 struct peer *peer;
1815 LIST_LOOP (bgp->peer, peer, nn)
1817 if (sockunion_same (&peer->su, su)
1818 && ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
1820 if (peer->as == remote_as
1821 && peer->remote_id.s_addr == remote_id->s_addr)
1822 return peer;
1823 if (peer->as == remote_as)
1827 LIST_LOOP (bgp->peer, peer, nn)
1829 if (sockunion_same (&peer->su, su)
1830 && ! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
1832 if (peer->as == remote_as
1833 && peer->remote_id.s_addr == 0)
1834 return peer;
1835 if (peer->as == remote_as)
1843 /* If peer is configured at least one address family return 1. */
1845 peer_active (struct peer *peer)
1847 if (peer->afc[AFI_IP][SAFI_UNICAST]
1848 || peer->afc[AFI_IP][SAFI_MULTICAST]
1849 || peer->afc[AFI_IP][SAFI_MPLS_VPN]
1850 || peer->afc[AFI_IP6][SAFI_UNICAST]
1851 || peer->afc[AFI_IP6][SAFI_MULTICAST])
1856 /* If peer is negotiated at least one address family return 1. */
1858 peer_active_nego (struct peer *peer)
1860 if (peer->afc_nego[AFI_IP][SAFI_UNICAST]
1861 || peer->afc_nego[AFI_IP][SAFI_MULTICAST]
1862 || peer->afc_nego[AFI_IP][SAFI_MPLS_VPN]
1863 || peer->afc_nego[AFI_IP6][SAFI_UNICAST]
1864 || peer->afc_nego[AFI_IP6][SAFI_MULTICAST])
1880 peer_change_action (struct peer *peer, afi_t afi, safi_t safi,
1883 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
1887 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
1891 if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV)
1892 || CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV))
1893 bgp_route_refresh_send (peer, afi, safi, 0, 0, 0);
1895 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
1899 bgp_announce_route (peer, afi, safi);
1907 /* This flag can be set for peer-group member. */
1956 /* Check peer's frag action. */
1982 /* Set peer clear type. */
1996 peer_flag_modify_action (struct peer *peer, u_int32_t flag)
2000 if (CHECK_FLAG (peer->flags, flag))
2002 if (peer->status == Established)
2003 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2006 BGP_EVENT_ADD (peer, BGP_Stop);
2010 peer->v_start = BGP_INIT_START_TIMER;
2011 BGP_EVENT_ADD (peer, BGP_Stop);
2014 else if (peer->status == Established)
2017 && CHECK_FLAG (peer->cap, PEER_CAP_DYNAMIC_RCV))
2019 if (CHECK_FLAG (peer->flags, flag))
2020 UNSET_FLAG (peer->cap, PEER_CAP_REFRESH_ADV);
2022 SET_FLAG (peer->cap, PEER_CAP_REFRESH_ADV);
2024 bgp_capability_send (peer, AFI_IP, SAFI_UNICAST,
2026 CHECK_FLAG (peer->flags, flag) ?
2030 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2034 BGP_EVENT_ADD (peer, BGP_Stop);
2037 /* Change specified peer flag. */
2039 peer_flag_modify (struct peer *peer, u_int32_t flag, int set)
2056 /* Not for peer-group member. */
2057 if (action.not_for_member && peer_group_active (peer))
2060 /* When unset the peer-group member's flag we have to check
2061 peer-group configuration. */
2062 if (! set && peer_group_active (peer))
2063 if (CHECK_FLAG (peer->group->conf->flags, flag))
2073 && CHECK_FLAG (peer->flags | flag, PEER_FLAG_STRICT_CAP_MATCH)
2074 && CHECK_FLAG (peer->flags | flag, PEER_FLAG_OVERRIDE_CAPABILITY))
2077 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2079 if (set && CHECK_FLAG (peer->flags, flag) == flag)
2081 if (! set && ! CHECK_FLAG (peer->flags, flag))
2086 SET_FLAG (peer->flags, flag);
2088 UNSET_FLAG (peer->flags, flag);
2090 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2093 peer_flag_modify_action (peer, flag);
2098 /* peer-group member updates. */
2099 group = peer->group;
2101 LIST_LOOP (group->peer, peer, nn)
2103 if (set && CHECK_FLAG (peer->flags, flag) == flag)
2106 if (! set && ! CHECK_FLAG (peer->flags, flag))
2110 SET_FLAG (peer->flags, flag);
2112 UNSET_FLAG (peer->flags, flag);
2115 peer_flag_modify_action (peer, flag);
2121 peer_flag_set (struct peer *peer, u_int32_t flag)
2123 return peer_flag_modify (peer, flag, 1);
2127 peer_flag_unset (struct peer *peer, u_int32_t flag)
2129 return peer_flag_modify (peer, flag, 0);
2133 peer_is_group_member (struct peer *peer, afi_t afi, safi_t safi)
2135 if (peer->af_group[afi][safi])
2141 peer_af_flag_modify (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag,
2160 if (! peer->afc[afi][safi])
2163 /* Not for peer-group member. */
2164 if (action.not_for_member && peer_is_group_member (peer, afi, safi))
2169 && peer_sort (peer) != BGP_PEER_IBGP)
2174 && peer_sort (peer) == BGP_PEER_IBGP)
2177 /* When unset the peer-group member's flag we have to check
2178 peer-group configuration. */
2179 if (! set && peer->af_group[afi][safi])
2180 if (CHECK_FLAG (peer->group->conf->af_flags[afi][safi], flag))
2184 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2186 if (set && CHECK_FLAG (peer->af_flags[afi][safi], flag) == flag)
2188 if (! set && ! CHECK_FLAG (peer->af_flags[afi][safi], flag))
2193 SET_FLAG (peer->af_flags[afi][safi], flag);
2195 UNSET_FLAG (peer->af_flags[afi][safi], flag);
2197 /* Execute action when peer is established. */
2198 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
2199 && peer->status == Established)
2202 bgp_clear_adj_in (peer, afi, safi);
2204 peer_change_action (peer, afi, safi, action.type);
2208 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2210 group = peer->group;
2212 LIST_LOOP (group->peer, peer, nn)
2214 if (! peer->af_group[afi][safi])
2217 if (set && CHECK_FLAG (peer->af_flags[afi][safi], flag) == flag)
2220 if (! set && ! CHECK_FLAG (peer->af_flags[afi][safi], flag))
2224 SET_FLAG (peer->af_flags[afi][safi], flag);
2226 UNSET_FLAG (peer->af_flags[afi][safi], flag);
2228 if (peer->status == Established)
2231 bgp_clear_adj_in (peer, afi, safi);
2233 peer_change_action (peer, afi, safi, action.type);
2241 peer_af_flag_set (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag)
2243 return peer_af_flag_modify (peer, afi, safi, flag, 1);
2247 peer_af_flag_unset (struct peer *peer, afi_t afi, safi_t safi, u_int32_t flag)
2249 return peer_af_flag_modify (peer, afi, safi, flag, 0);
2255 peer_ebgp_multihop_set (struct peer *peer, int ttl)
2260 if (peer_sort (peer) == BGP_PEER_IBGP)
2263 peer->ttl = ttl;
2265 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2267 if (peer->fd >= 0 && peer_sort (peer) != BGP_PEER_IBGP)
2268 sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
2272 group = peer->group;
2273 LIST_LOOP (group->peer, peer, nn)
2275 if (peer_sort (peer) == BGP_PEER_IBGP)
2278 peer->ttl = group->conf->ttl;
2280 if (peer->fd >= 0)
2281 sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
2288 peer_ebgp_multihop_unset (struct peer *peer)
2293 if (peer_sort (peer) == BGP_PEER_IBGP)
2296 if (peer_group_active (peer))
2297 peer->ttl = peer->group->conf->ttl;
2299 peer->ttl = 1;
2301 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2303 if (peer->fd >= 0 && peer_sort (peer) != BGP_PEER_IBGP)
2304 sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
2308 group = peer->group;
2309 LIST_LOOP (group->peer, peer, nn)
2311 if (peer_sort (peer) == BGP_PEER_IBGP)
2314 peer->ttl = 1;
2316 if (peer->fd >= 0)
2317 sockopt_ttl (peer->su.sa.sa_family, peer->fd, peer->ttl);
2326 peer_description_set (struct peer *peer, char *desc)
2328 if (peer->desc)
2329 XFREE (MTYPE_PEER_DESC, peer->desc);
2331 peer->desc = XSTRDUP (MTYPE_PEER_DESC, desc);
2337 peer_description_unset (struct peer *peer)
2339 if (peer->desc)
2340 XFREE (MTYPE_PEER_DESC, peer->desc);
2342 peer->desc = NULL;
2350 peer_update_source_if_set (struct peer *peer, char *ifname)
2355 if (peer->update_if)
2357 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
2358 && strcmp (peer->update_if, ifname) == 0)
2361 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
2362 peer->update_if = NULL;
2365 if (peer->update_source)
2367 sockunion_free (peer->update_source);
2368 peer->update_source = NULL;
2371 peer->update_if = XSTRDUP (MTYPE_PEER_UPDATE_SOURCE, ifname);
2373 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2375 if (peer->status == Established)
2376 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2379 BGP_EVENT_ADD (peer, BGP_Stop);
2383 /* peer-group member updates. */
2384 group = peer->group;
2385 LIST_LOOP (group->peer, peer, nn)
2387 if (peer->update_if)
2389 if (strcmp (peer->update_if, ifname) == 0)
2392 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
2393 peer->update_if = NULL;
2396 if (peer->update_source)
2398 sockunion_free (peer->update_source);
2399 peer->update_source = NULL;
2402 peer->update_if = XSTRDUP (MTYPE_PEER_UPDATE_SOURCE, ifname);
2404 if (peer->status == Established)
2405 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2408 BGP_EVENT_ADD (peer, BGP_Stop);
2414 peer_update_source_addr_set (struct peer *peer, union sockunion *su)
2419 if (peer->update_source)
2421 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
2422 && sockunion_cmp (peer->update_source, su) == 0)
2424 sockunion_free (peer->update_source);
2425 peer->update_source = NULL;
2428 if (peer->update_if)
2430 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
2431 peer->update_if = NULL;
2434 peer->update_source = sockunion_dup (su);
2436 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2438 if (peer->status == Established)
2439 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2442 BGP_EVENT_ADD (peer, BGP_Stop);
2446 /* peer-group member updates. */
2447 group = peer->group;
2448 LIST_LOOP (group->peer, peer, nn)
2450 if (peer->update_source)
2452 if (sockunion_cmp (peer->update_source, su) == 0)
2454 sockunion_free (peer->update_source);
2455 peer->update_source = NULL;
2458 if (peer->update_if)
2460 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
2461 peer->update_if = NULL;
2464 peer->update_source = sockunion_dup (su);
2466 if (peer->status == Established)
2467 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2470 BGP_EVENT_ADD (peer, BGP_Stop);
2476 peer_update_source_unset (struct peer *peer)
2482 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP)
2483 && ! peer->update_source
2484 && ! peer->update_if)
2487 if (peer->update_source)
2489 sockunion_free (peer->update_source);
2490 peer->update_source = NULL;
2492 if (peer->update_if)
2494 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
2495 peer->update_if = NULL;
2498 if (peer_group_active (peer))
2500 group = peer->group;
2505 peer->update_source = su;
2508 peer->update_if =
2512 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2514 if (peer->status == Established)
2515 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2518 BGP_EVENT_ADD (peer, BGP_Stop);
2522 /* peer-group member updates. */
2523 group = peer->group;
2524 LIST_LOOP (group->peer, peer, nn)
2526 if (! peer->update_source && ! peer->update_if)
2529 if (peer->update_source)
2531 sockunion_free (peer->update_source);
2532 peer->update_source = NULL;
2535 if (peer->update_if)
2537 XFREE (MTYPE_PEER_UPDATE_SOURCE, peer->update_if);
2538 peer->update_if = NULL;
2541 if (peer->status == Established)
2542 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2545 BGP_EVENT_ADD (peer, BGP_Stop);
2552 peer_default_originate_set (struct peer *peer, afi_t afi, safi_t safi,
2556 if (! peer->afc[afi][safi])
2559 /* Default originate can't be used for peer group memeber. */
2560 if (peer_is_group_member (peer, afi, safi))
2563 if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE)
2564 || (rmap && ! peer->default_rmap[afi][safi].name)
2565 || (rmap && strcmp (rmap, peer->default_rmap[afi][safi].name) != 0))
2567 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE);
2571 if (peer->default_rmap[afi][safi].name)
2572 free (peer->default_rmap[afi][safi].name);
2573 peer->default_rmap[afi][safi].name = strdup (rmap);
2574 peer->default_rmap[afi][safi].map = route_map_lookup_by_name (rmap);
2577 if (peer->status == Established && peer->afc_nego[afi][safi])
2578 bgp_default_originate (peer, afi, safi, 0);
2584 peer_default_originate_unset (struct peer *peer, afi_t afi, safi_t safi)
2587 if (! peer->afc[afi][safi])
2590 /* Default originate can't be used for peer group memeber. */
2591 if (peer_is_group_member (peer, afi, safi))
2594 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
2596 UNSET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE);
2598 if (peer->default_rmap[afi][safi].name)
2599 free (peer->default_rmap[afi][safi].name);
2600 peer->default_rmap[afi][safi].name = NULL;
2601 peer->default_rmap[afi][safi].map = NULL;
2603 if (peer->status == Established && peer->afc_nego[afi][safi])
2604 bgp_default_originate (peer, afi, safi, 1);
2611 peer_port_set (struct peer *peer, u_int16_t port)
2613 peer->port = port;
2618 peer_port_unset (struct peer *peer)
2620 peer->port = BGP_PORT_DEFAULT;
2627 peer_weight_set (struct peer *peer, u_int16_t weight)
2632 SET_FLAG (peer->config, PEER_CONFIG_WEIGHT);
2633 peer->weight = weight;
2635 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2638 /* peer-group member updates. */
2639 group = peer->group;
2640 LIST_LOOP (group->peer, peer, nn)
2642 peer->weight = group->conf->weight;
2648 peer_weight_unset (struct peer *peer)
2654 if (peer_group_active (peer))
2655 peer->weight = peer->group->conf->weight;
2657 peer->weight = 0;
2659 UNSET_FLAG (peer->config, PEER_CONFIG_WEIGHT);
2661 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2664 /* peer-group member updates. */
2665 group = peer->group;
2666 LIST_LOOP (group->peer, peer, nn)
2668 peer->weight = 0;
2675 peer_timers_set (struct peer *peer, u_int32_t keepalive, u_int32_t holdtime)
2680 /* Not for peer group memeber. */
2681 if (peer_group_active (peer))
2697 SET_FLAG (peer->config, PEER_CONFIG_TIMER);
2698 peer->holdtime = holdtime;
2699 peer->keepalive = (keepalive < holdtime / 3 ? keepalive : holdtime / 3);
2701 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2704 /* peer-group member updates. */
2705 group = peer->group;
2706 LIST_LOOP (group->peer, peer, nn)
2708 SET_FLAG (peer->config, PEER_CONFIG_TIMER);
2709 peer->holdtime = group->conf->holdtime;
2710 peer->keepalive = group->conf->keepalive;
2716 peer_timers_unset (struct peer *peer)
2721 if (peer_group_active (peer))
2725 UNSET_FLAG (peer->config, PEER_CONFIG_TIMER);
2726 peer->keepalive = 0;
2727 peer->holdtime = 0;
2729 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2732 /* peer-group member updates. */
2733 group = peer->group;
2734 LIST_LOOP (group->peer, peer, nn)
2736 UNSET_FLAG (peer->config, PEER_CONFIG_TIMER);
2737 peer->holdtime = 0;
2738 peer->keepalive = 0;
2746 peer_timers_connect_set (struct peer *peer, u_int32_t connect)
2748 if (peer_group_active (peer))
2755 SET_FLAG (peer->config, PEER_CONFIG_CONNECT);
2756 peer->connect = connect;
2759 peer->v_connect = connect;
2765 peer_timers_connect_unset (struct peer *peer)
2767 if (peer_group_active (peer))
2771 UNSET_FLAG (peer->config, PEER_CONFIG_CONNECT);
2772 peer->connect = 0;
2775 peer->v_connect = BGP_DEFAULT_CONNECT_RETRY;
2782 peer_advertise_interval_set (struct peer *peer, u_int32_t routeadv)
2784 if (peer_group_active (peer))
2790 SET_FLAG (peer->config, PEER_CONFIG_ROUTEADV);
2791 peer->routeadv = routeadv;
2792 peer->v_routeadv = routeadv;
2798 peer_advertise_interval_unset (struct peer *peer)
2800 if (peer_group_active (peer))
2803 UNSET_FLAG (peer->config, PEER_CONFIG_ROUTEADV);
2804 peer->routeadv = 0;
2806 if (peer_sort (peer) == BGP_PEER_IBGP)
2807 peer->v_routeadv = BGP_DEFAULT_IBGP_ROUTEADV;
2809 peer->v_routeadv = BGP_DEFAULT_EBGP_ROUTEADV;
2816 peer_version_set (struct peer *peer, int version)
2821 peer->version = version;
2827 peer_version_unset (struct peer *peer)
2829 peer->version = BGP_VERSION_4;
2836 peer_interface_set (struct peer *peer, char *str)
2838 if (peer->ifname)
2839 free (peer->ifname);
2840 peer->ifname = strdup (str);
2846 peer_interface_unset (struct peer *peer)
2848 if (peer->ifname)
2849 free (peer->ifname);
2850 peer->ifname = NULL;
2858 peer_allowas_in_set (struct peer *peer, afi_t afi, safi_t safi, int allow_num)
2866 if (peer->allowas_in[afi][safi] != allow_num)
2868 peer->allowas_in[afi][safi] = allow_num;
2869 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN);
2870 peer_change_action (peer, afi, safi, peer_change_reset_in);
2873 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2876 group = peer->group;
2877 LIST_LOOP (group->peer, peer, nn)
2879 if (peer->allowas_in[afi][safi] != allow_num)
2881 peer->allowas_in[afi][safi] = allow_num;
2882 SET_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN);
2883 peer_change_action (peer, afi, safi, peer_change_reset_in);
2891 peer_allowas_in_unset (struct peer *peer, afi_t afi, safi_t safi)
2896 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN))
2898 peer->allowas_in[afi][safi] = 0;
2899 peer_af_flag_unset (peer, afi, safi, PEER_FLAG_ALLOWAS_IN);
2902 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2905 group = peer->group;
2906 LIST_LOOP (group->peer, peer, nn)
2908 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ALLOWAS_IN))
2910 peer->allowas_in[afi][safi] = 0;
2911 peer_af_flag_unset (peer, afi, safi, PEER_FLAG_ALLOWAS_IN);
2919 peer_local_as_set (struct peer *peer, as_t as, int no_prepend)
2921 struct bgp *bgp = peer->bgp;
2925 if (peer_sort (peer) != BGP_PEER_EBGP
2926 && peer_sort (peer) != BGP_PEER_INTERNAL)
2932 if (peer_group_active (peer))
2935 if (peer->change_local_as == as &&
2936 ((CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) && no_prepend)
2937 || (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) && ! no_prepend)))
2940 peer->change_local_as = as;
2942 SET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
2944 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
2946 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2948 if (peer->status == Established)
2949 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2952 BGP_EVENT_ADD (peer, BGP_Stop);
2957 group = peer->group;
2958 LIST_LOOP (group->peer, peer, nn)
2960 peer->change_local_as = as;
2962 SET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
2964 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
2966 if (peer->status == Established)
2967 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2970 BGP_EVENT_ADD (peer, BGP_Stop);
2977 peer_local_as_unset (struct peer *peer)
2982 if (peer_group_active (peer))
2985 if (! peer->change_local_as)
2988 peer->change_local_as = 0;
2989 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
2991 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
2993 if (peer->status == Established)
2994 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
2997 BGP_EVENT_ADD (peer, BGP_Stop);
3002 group = peer->group;
3003 LIST_LOOP (group->peer, peer, nn)
3005 peer->change_local_as = 0;
3006 UNSET_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND);
3008 if (peer->status == Established)
3009 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
3012 BGP_EVENT_ADD (peer, BGP_Stop);
3018 /* Set distribute list to the peer. */
3020 peer_distribute_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
3027 if (! peer->afc[afi][safi])
3033 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
3036 filter = &peer->filter[afi][safi];
3046 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3049 group = peer->group;
3050 LIST_LOOP (group->peer, peer, nn)
3052 filter = &peer->filter[afi][safi];
3054 if (! peer->af_group[afi][safi])
3067 peer_distribute_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
3074 if (! peer->afc[afi][safi])
3080 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
3083 filter = &peer->filter[afi][safi];
3085 /* apply peer-group filter */
3086 if (peer->af_group[afi][safi])
3088 gfilter = &peer->group->conf->filter[afi][safi];
3105 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3108 group = peer->group;
3109 LIST_LOOP (group->peer, peer, nn)
3111 filter = &peer->filter[afi][safi];
3113 if (! peer->af_group[afi][safi])
3134 struct peer *peer;
3140 LIST_LOOP (bgp->peer, peer, nm)
3145 filter = &peer->filter[afi][safi];
3178 /* Set prefix list to the peer. */
3180 peer_prefix_list_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
3187 if (! peer->afc[afi][safi])
3193 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
3196 filter = &peer->filter[afi][safi];
3206 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3209 group = peer->group;
3210 LIST_LOOP (group->peer, peer, nn)
3212 filter = &peer->filter[afi][safi];
3214 if (! peer->af_group[afi][safi])
3226 peer_prefix_list_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
3233 if (! peer->afc[afi][safi])
3239 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
3242 filter = &peer->filter[afi][safi];
3244 /* apply peer-group filter */
3245 if (peer->af_group[afi][safi])
3247 gfilter = &peer->group->conf->filter[afi][safi];
3264 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3267 group = peer->group;
3268 LIST_LOOP (group->peer, peer, nn)
3270 filter = &peer->filter[afi][safi];
3272 if (! peer->af_group[afi][safi])
3290 struct peer *peer;
3299 LIST_LOOP (bgp->peer, peer, nm)
3304 filter = &peer->filter[afi][safi];
3338 peer_aslist_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
3345 if (! peer->afc[afi][safi])
3351 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
3354 filter = &peer->filter[afi][safi];
3361 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3364 group = peer->group;
3365 LIST_LOOP (group->peer, peer, nn)
3367 filter = &peer->filter[afi][safi];
3369 if (! peer->af_group[afi][safi])
3381 peer_aslist_unset (struct peer *peer,afi_t afi, safi_t safi, int direct)
3388 if (! peer->afc[afi][safi])
3394 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
3397 filter = &peer->filter[afi][safi];
3399 /* apply peer-group filter */
3400 if (peer->af_group[afi][safi])
3402 gfilter = &peer->group->conf->filter[afi][safi];
3419 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3422 group = peer->group;
3423 LIST_LOOP (group->peer, peer, nn)
3425 filter = &peer->filter[afi][safi];
3427 if (! peer->af_group[afi][safi])
3447 struct peer *peer;
3453 LIST_LOOP (bgp->peer, peer, nm)
3458 filter = &peer->filter[afi][safi];
3491 /* Set route-map to the peer. */
3493 peer_route_map_set (struct peer *peer, afi_t afi, safi_t safi, int direct,
3500 if (! peer->afc[afi][safi])
3506 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
3509 filter = &peer->filter[afi][safi];
3517 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3520 group = peer->group;
3521 LIST_LOOP (group->peer, peer, nn)
3523 filter = &peer->filter[afi][safi];
3525 if (! peer->af_group[afi][safi])
3536 /* Unset route-map from the peer. */
3538 peer_route_map_unset (struct peer *peer, afi_t afi, safi_t safi, int direct)
3545 if (! peer->afc[afi][safi])
3551 if (direct == FILTER_OUT && peer_is_group_member (peer, afi, safi))
3554 filter = &peer->filter[afi][safi];
3556 /* apply peer-group filter */
3557 if (peer->af_group[afi][safi])
3559 gfilter = &peer->group->conf->filter[afi][safi];
3576 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3579 group = peer->group;
3580 LIST_LOOP (group->peer, peer, nn)
3582 filter = &peer->filter[afi][safi];
3584 if (! peer->af_group[afi][safi])
3596 /* Set unsuppress-map to the peer. */
3598 peer_unsuppress_map_set (struct peer *peer, afi_t afi, safi_t safi, char *name)
3604 if (! peer->afc[afi][safi])
3607 if (peer_is_group_member (peer, afi, safi))
3610 filter = &peer->filter[afi][safi];
3618 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3621 group = peer->group;
3622 LIST_LOOP (group->peer, peer, nn)
3624 filter = &peer->filter[afi][safi];
3626 if (! peer->af_group[afi][safi])
3637 /* Unset route-map from the peer. */
3639 peer_unsuppress_map_unset (struct peer *peer, afi_t afi, safi_t safi)
3645 if (! peer->afc[afi][safi])
3648 if (peer_is_group_member (peer, afi, safi))
3651 filter = &peer->filter[afi][safi];
3658 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3661 group = peer->group;
3662 LIST_LOOP (group->peer, peer, nn)
3664 filter = &peer->filter[afi][safi];
3666 if (! peer->af_group[afi][safi])
3679 peer_maximum_prefix_set (struct peer *peer, afi_t afi, safi_t safi,
3682 if (! peer->afc[afi][safi])
3685 peer->pmax[afi][safi] = max;
3686 peer->pmax_warning[afi][safi] = (warning ? 1 : 0);
3692 peer_maximum_prefix_unset (struct peer *peer, afi_t afi, safi_t safi)
3694 if (! peer->afc[afi][safi])
3697 peer->pmax[afi][safi] = 0;
3698 peer->pmax_warning[afi][safi] = 0;
3705 peer_clear (struct peer *peer)
3707 if (! CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))
3709 UNSET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
3710 peer->v_start = BGP_INIT_START_TIMER;
3711 if (peer->status == Established)
3712 bgp_notify_send (peer, BGP_NOTIFY_CEASE,
3715 BGP_EVENT_ADD (peer, BGP_Stop);
3721 peer_clear_soft (struct peer *peer, afi_t afi, safi_t safi,
3724 if (peer->status != Established)
3727 if (! peer->afc[afi][safi])
3731 bgp_announce_route (peer, afi, safi);
3735 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV)
3736 && (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV)
3737 || CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_OLD_RCV)))
3739 struct bgp_filter *filter = &peer->filter[afi][safi];
3742 if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_RCV))
3749 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND))
3750 bgp_route_refresh_send (peer, afi, safi,
3752 bgp_route_refresh_send (peer, afi, safi, prefix_type,
3757 if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND))
3758 bgp_route_refresh_send (peer, afi, safi,
3761 bgp_route_refresh_send (peer, afi, safi, 0, 0, 0);
3772 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
3773 bgp_soft_reconfig_in (peer, afi, safi);
3777 message to the peer. */
3778 if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV)
3779 || CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV))
3780 bgp_route_refresh_send (peer, afi, safi, 0, 0, 0);
3789 /* Display peer uptime. */
3833 bgp_config_write_filter (struct vty *vty, struct peer *peer,
3842 addr = peer->host;
3843 filter = &peer->filter[afi][safi];
3844 if (peer->af_group[afi][safi])
3845 gfilter = &peer->group->conf->filter[afi][safi];
3893 /* BGP peer configuration display function. */
3896 struct peer *peer, afi_t afi, safi_t safi)
3899 struct peer *g_peer = NULL;
3903 filter = &peer->filter[afi][safi];
3904 addr = peer->host;
3905 if (peer_group_active (peer))
3906 g_peer = peer->group->conf;
3914 if (! peer_group_active (peer))
3916 if (CHECK_FLAG (peer->sflags, PEER_STATUS_GROUP))
3917 vty_out (vty, " neighbor %s peer-group%s", addr,
3919 if (peer->as)
3920 vty_out (vty, " neighbor %s remote-as %d%s", addr, peer->as,
3926 vty_out (vty, " neighbor %s remote-as %d%s", addr, peer->as,
3928 if (peer->af_group[AFI_IP][SAFI_UNICAST])
3929 vty_out (vty, " neighbor %s peer-group %s%s", addr,
3930 peer->group->name, VTY_NEWLINE);
3934 if (peer->change_local_as)
3935 if (! peer_group_active (peer))
3937 peer->change_local_as,
3938 CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND) ?
3942 if (peer->desc)
3943 vty_out (vty, " neighbor %s description %s%s", addr, peer->desc,
3947 if (CHECK_FLAG (peer->flags, PEER_FLAG_SHUTDOWN))
3948 if (! peer_group_active (peer) ||
3953 if (peer->port != BGP_PORT_DEFAULT)
3954 vty_out (vty, " neighbor %s port %d%s", addr, peer->port,
3958 if (peer->ifname)
3959 vty_out (vty, " neighbor %s interface %s%s", addr, peer->ifname,
3963 if (CHECK_FLAG (peer->flags, PEER_FLAG_PASSIVE))
3964 if (! peer_group_active (peer) ||
3969 if (peer_sort (peer) != BGP_PEER_IBGP && peer->ttl != 1)
3970 if (! peer_group_active (peer) ||
3971 g_peer->ttl != peer->ttl)
3972 vty_out (vty, " neighbor %s ebgp-multihop %d%s", addr, peer->ttl,
3976 if (CHECK_FLAG (peer->flags, PEER_FLAG_ENFORCE_MULTIHOP))
3977 if (! peer_group_active (peer) ||
3982 if (peer->update_if)
3983 if (! peer_group_active (peer) || ! g_peer->update_if
3984 || strcmp (g_peer->update_if, peer->update_if) != 0)
3986 peer->update_if, VTY_NEWLINE);
3987 if (peer->update_source)
3988 if (! peer_group_active (peer) || ! g_peer->update_source
3990 peer->update_source) != 0)
3992 sockunion2str (peer->update_source, buf, SU_ADDRSTRLEN),
3996 if (peer->version == BGP_VERSION_MP_4_DRAFT_00)
4001 if (CHECK_FLAG (peer->config, PEER_CONFIG_ROUTEADV))
4003 addr, peer->v_routeadv, VTY_NEWLINE);
4006 if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER)
4007 && ! peer_group_active (peer))
4009 peer->keepalive, peer->holdtime, VTY_NEWLINE);
4011 if (CHECK_FLAG (peer->config, PEER_CONFIG_CONNECT))
4013 peer->connect, VTY_NEWLINE);
4016 if (CHECK_FLAG (peer->config, PEER_CONFIG_WEIGHT))
4017 if (! peer_group_active (peer) ||
4018 g_peer->weight != peer->weight)
4019 vty_out (vty, " neighbor %s weight %d%s", addr, peer->weight,
4023 if (CHECK_FLAG (peer->flags, PEER_FLAG_NO_ROUTE_REFRESH_CAP))
4024 if (! peer_group_active (peer) ||
4030 if (CHECK_FLAG (peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
4031 if (! peer_group_active (peer) ||
4037 if (CHECK_FLAG (peer->flags, PEER_FLAG_DONT_CAPABILITY))
4038 if (! peer_group_active (peer) ||
4044 if (CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
4045 if (! peer_group_active (peer) ||
4051 if (CHECK_FLAG (peer->flags, PEER_FLAG_STRICT_CAP_MATCH))
4052 if (! peer_group_active (peer) ||
4057 if (! peer_group_active (peer))
4061 if (peer->afc[AFI_IP][SAFI_UNICAST])
4066 if (! peer->afc[AFI_IP][SAFI_UNICAST])
4079 if (peer->af_group[afi][safi])
4080 vty_out (vty, " neighbor %s peer-group %s%s", addr,
4081 peer->group->name, VTY_NEWLINE);
4087 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
4088 || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
4089 if (! peer->af_group[afi][safi])
4093 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
4094 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
4096 else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM))
4104 if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REFLECTOR_CLIENT)
4105 && ! peer->af_group[afi][safi])
4110 if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_NEXTHOP_SELF)
4111 && ! peer->af_group[afi][safi])
4115 if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
4116 && ! peer->af_group[afi][safi])
4121 if (! peer->af_group[afi][safi])
4125 if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY)
4126 && peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
4128 else if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
4131 else if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY))
4136 if (! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY)
4137 && ! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
4140 else if (! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_EXT_COMMUNITY))
4143 else if (! peer_af_flag_check (peer, afi, safi, PEER_FLAG_SEND_COMMUNITY))
4150 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
4153 if (peer->default_rmap[afi][safi].name)
4154 vty_out (vty, " route-map %s", peer->default_rmap[afi][safi].name);
4159 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG))
4160 if (! peer->af_group[afi][safi] ||
4166 if (peer->pmax[afi][safi])
4168 addr, peer->pmax[afi][safi],
4169 peer->pmax_warning[afi][safi] ? " warning-only" : "",
4173 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
4174 && ! peer->af_group[afi][safi])
4178 if (peer_af_flag_check (peer, afi, safi, PEER_FLAG_ALLOWAS_IN))
4179 if (! peer_group_active (peer)
4181 || peer->allowas_in[afi][safi] != g_peer->allowas_in[afi][safi])
4183 if (peer->allowas_in[afi][safi] == 3)
4187 peer->allowas_in[afi][safi], VTY_NEWLINE);
4191 bgp_config_write_filter (vty, peer, afi, safi);
4194 if ((CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED)
4195 || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
4196 || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
4197 && ! peer->af_group[afi][safi])
4199 if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED)
4200 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
4201 && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
4205 (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_AS_PATH_UNCHANGED)) ?
4207 (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)) ?
4209 (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED)) ?
4242 /* Address family based peer configuration display. */
4248 struct peer *peer;
4264 LIST_LOOP (bgp->peer, peer, nn)
4266 if (peer->afc[afi][safi])
4268 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
4271 bgp_config_write_peer (vty, bgp, peer, afi, safi);
4287 struct peer *peer;
4424 /* peer-group */
4431 LIST_LOOP (bgp->peer, peer, no)
4433 if (! CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
4434 bgp_config_write_peer (vty, bgp, peer, AFI_IP, SAFI_UNICAST);