bgp_route.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:275k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* BGP routing information
  2.    Copyright (C) 1996, 97, 98, 99 Kunihiro Ishiguro
  3. This file is part of GNU Zebra.
  4. GNU Zebra is free software; you can redistribute it and/or modify it
  5. under the terms of the GNU General Public License as published by the
  6. Free Software Foundation; either version 2, or (at your option) any
  7. later version.
  8. GNU Zebra is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11. General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with GNU Zebra; see the file COPYING.  If not, write to the Free
  14. Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  15. 02111-1307, USA.  */
  16. #include <zebra.h>
  17. #include "prefix.h"
  18. #include "linklist.h"
  19. #include "memory.h"
  20. #include "command.h"
  21. #include "stream.h"
  22. #include "filter.h"
  23. #include "str.h"
  24. #include "log.h"
  25. #include "routemap.h"
  26. #include "buffer.h"
  27. #include "sockunion.h"
  28. #include "plist.h"
  29. #include "thread.h"
  30. #include "bgpd/bgpd.h"
  31. #include "bgpd/bgp_table.h"
  32. #include "bgpd/bgp_route.h"
  33. #include "bgpd/bgp_attr.h"
  34. #include "bgpd/bgp_debug.h"
  35. #include "bgpd/bgp_aspath.h"
  36. #include "bgpd/bgp_regex.h"
  37. #include "bgpd/bgp_community.h"
  38. #include "bgpd/bgp_ecommunity.h"
  39. #include "bgpd/bgp_clist.h"
  40. #include "bgpd/bgp_packet.h"
  41. #include "bgpd/bgp_filter.h"
  42. #include "bgpd/bgp_fsm.h"
  43. #include "bgpd/bgp_mplsvpn.h"
  44. #include "bgpd/bgp_nexthop.h"
  45. #include "bgpd/bgp_damp.h"
  46. #include "bgpd/bgp_advertise.h"
  47. #include "bgpd/bgp_zebra.h"
  48. #include "bgpd/bgp_vty.h"
  49. /* Extern from bgp_dump.c */
  50. extern char *bgp_origin_str[];
  51. extern char *bgp_origin_long_str[];
  52. struct bgp_node *
  53. bgp_afi_node_get (struct bgp *bgp, afi_t afi, safi_t safi, struct prefix *p,
  54.   struct prefix_rd *prd)
  55. {
  56.   struct bgp_node *rn;
  57.   struct bgp_node *prn = NULL;
  58.   struct bgp_table *table;
  59.   if (safi == SAFI_MPLS_VPN)
  60.     {
  61.       prn = bgp_node_get (bgp->rib[afi][safi], (struct prefix *) prd);
  62.       if (prn->info == NULL)
  63. prn->info = bgp_table_init ();
  64.       else
  65. bgp_unlock_node (prn);
  66.       table = prn->info;
  67.     }
  68.   else
  69.     table = bgp->rib[afi][safi];
  70.   rn = bgp_node_get (table, p);
  71.   if (safi == SAFI_MPLS_VPN)
  72.     rn->prn = prn;
  73.   return rn;
  74. }
  75. /* Allocate new bgp info structure. */
  76. struct bgp_info *
  77. bgp_info_new ()
  78. {
  79.   struct bgp_info *new;
  80.   new = XMALLOC (MTYPE_BGP_ROUTE, sizeof (struct bgp_info));
  81.   memset (new, 0, sizeof (struct bgp_info));
  82.   return new;
  83. }
  84. /* Free bgp route information. */
  85. void
  86. bgp_info_free (struct bgp_info *binfo)
  87. {
  88.   if (binfo->attr)
  89.     bgp_attr_unintern (binfo->attr);
  90.   if (binfo->damp_info)
  91.     bgp_damp_info_free (binfo->damp_info, 0);
  92.   XFREE (MTYPE_BGP_ROUTE, binfo);
  93. }
  94. void
  95. bgp_info_add (struct bgp_node *rn, struct bgp_info *ri)
  96. {
  97.   struct bgp_info *top;
  98.   top = rn->info;
  99.   ri->next = rn->info;
  100.   ri->prev = NULL;
  101.   if (top)
  102.     top->prev = ri;
  103.   rn->info = ri;
  104. }
  105. void
  106. bgp_info_delete (struct bgp_node *rn, struct bgp_info *ri)
  107. {
  108.   if (ri->next)
  109.     ri->next->prev = ri->prev;
  110.   if (ri->prev)
  111.     ri->prev->next = ri->next;
  112.   else
  113.     rn->info = ri->next;
  114. }
  115. /* Get MED value.  If MED value is missing and "bgp bestpath
  116.    missing-as-worst" is specified, treat it as the worst value. */
  117. u_int32_t
  118. bgp_med_value (struct attr *attr, struct bgp *bgp)
  119. {
  120.   if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
  121.     return attr->med;
  122.   else
  123.     {
  124.       if (bgp_flag_check (bgp, BGP_FLAG_MED_MISSING_AS_WORST))
  125. return 4294967295ul;
  126.       else
  127. return 0;
  128.     }
  129. }
  130. /* Compare two bgp route entity.  br is preferable then return 1. */
  131. int
  132. bgp_info_cmp (struct bgp *bgp, struct bgp_info *new, struct bgp_info *exist)
  133. {
  134.   u_int32_t new_pref;
  135.   u_int32_t exist_pref;
  136.   u_int32_t new_med;
  137.   u_int32_t exist_med;
  138.   struct in_addr new_id;
  139.   struct in_addr exist_id;
  140.   int new_cluster;
  141.   int exist_cluster;
  142.   int internal_as_route = 0;
  143.   int confed_as_route = 0;
  144.   int cost_community = 0;
  145.   int ret;
  146.   /* 0. Null check. */
  147.   if (new == NULL)
  148.     return 0;
  149.   if (exist == NULL)
  150.     return 1;
  151.   /* 1. Weight check. */
  152.   if (new->attr->weight > exist->attr->weight)
  153.     return 1;
  154.   if (new->attr->weight < exist->attr->weight)
  155.     return 0;
  156.   /* 2. Local preference check. */
  157.   if (new->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
  158.     new_pref = new->attr->local_pref;
  159.   else
  160.     new_pref = bgp->default_local_pref;
  161.   if (exist->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))
  162.     exist_pref = exist->attr->local_pref;
  163.   else
  164.     exist_pref = bgp->default_local_pref;
  165.     
  166.   if (new_pref > exist_pref)
  167.     return 1;
  168.   if (new_pref < exist_pref)
  169.     return 0;
  170.   /* 3. Local route check. */
  171.   if (new->sub_type == BGP_ROUTE_STATIC)
  172.     return 1;
  173.   if (exist->sub_type == BGP_ROUTE_STATIC)
  174.     return 0;
  175.   if (new->sub_type == BGP_ROUTE_REDISTRIBUTE)
  176.     return 1;
  177.   if (exist->sub_type == BGP_ROUTE_REDISTRIBUTE)
  178.     return 0;
  179.   if (new->sub_type == BGP_ROUTE_AGGREGATE)
  180.     return 1;
  181.   if (exist->sub_type == BGP_ROUTE_AGGREGATE)
  182.     return 0;
  183.   /* 4. AS path length check. */
  184.   if (! bgp_flag_check (bgp, BGP_FLAG_ASPATH_IGNORE))
  185.     {
  186.       if (new->attr->aspath->count < exist->attr->aspath->count)
  187. return 1;
  188.       if (new->attr->aspath->count > exist->attr->aspath->count)
  189. return 0;
  190.     }
  191.   /* 5. Origin check. */
  192.   if (new->attr->origin < exist->attr->origin)
  193.     return 1;
  194.   if (new->attr->origin > exist->attr->origin)
  195.     return 0;
  196.   /* 6. MED check. */
  197.   internal_as_route = (new->attr->aspath->length == 0
  198.       && exist->attr->aspath->length == 0);
  199.   confed_as_route = (new->attr->aspath->length > 0
  200.     && exist->attr->aspath->length > 0
  201.     && new->attr->aspath->count == 0
  202.     && exist->attr->aspath->count == 0);
  203.   
  204.   if (bgp_flag_check (bgp, BGP_FLAG_ALWAYS_COMPARE_MED)
  205.       || (bgp_flag_check (bgp, BGP_FLAG_MED_CONFED)
  206.  && confed_as_route)
  207.       || aspath_cmp_left (new->attr->aspath, exist->attr->aspath)
  208.       || aspath_cmp_left_confed (new->attr->aspath, exist->attr->aspath)
  209.       || internal_as_route)
  210.     {
  211.       new_med = bgp_med_value (new->attr, bgp);
  212.       exist_med = bgp_med_value (exist->attr, bgp);
  213.       if (new_med < exist_med)
  214. return 1;
  215.       if (new_med > exist_med)
  216. return 0;
  217.     }
  218.   /* 7. Peer type check. */
  219.   if (peer_sort (new->peer) == BGP_PEER_EBGP 
  220.       && peer_sort (exist->peer) == BGP_PEER_IBGP)
  221.     return 1;
  222.   if (peer_sort (new->peer) == BGP_PEER_EBGP 
  223.       && peer_sort (exist->peer) == BGP_PEER_CONFED)
  224.     return 1;
  225.   if (peer_sort (new->peer) == BGP_PEER_IBGP 
  226.       && peer_sort (exist->peer) == BGP_PEER_EBGP)
  227.     return 0;
  228.   if (peer_sort (new->peer) == BGP_PEER_CONFED 
  229.       && peer_sort (exist->peer) == BGP_PEER_EBGP)
  230.     return 0;
  231.   /* 8. IGP metric check. */
  232.   if (new->igpmetric < exist->igpmetric)
  233.     return 1;
  234.   if (new->igpmetric > exist->igpmetric)
  235.     return 0;
  236.   /* 9. cost community check. */
  237.   if (! bgp_flag_check (bgp, BGP_FLAG_COST_COMMUNITY_IGNORE))
  238.     {
  239.       cost_community = ecommunity_cost_cmp (new->attr->ecommunity,
  240.     exist->attr->ecommunity, ECOMMUNITY_COST_POI_IGP);
  241.       if (cost_community > 0)
  242. return 1;
  243.       if (cost_community < 0)
  244. return 0;
  245.     }
  246.   /* 10. Maximum path check. */
  247.   /* 11. If both paths are external, prefer the path that was received
  248.      first (the oldest one).  This step minimizes route-flap, since a
  249.      newer path won't displace an older one, even if it was the
  250.      preferred route based on the additional decision criteria below.  */
  251.   if (! bgp_flag_check (bgp, BGP_FLAG_COMPARE_ROUTER_ID)
  252.       && peer_sort (new->peer) == BGP_PEER_EBGP
  253.       && peer_sort (exist->peer) == BGP_PEER_EBGP)
  254.     {
  255.       if (CHECK_FLAG (new->flags, BGP_INFO_SELECTED))
  256. return 1;
  257.       if (CHECK_FLAG (exist->flags, BGP_INFO_SELECTED))
  258. return 0;
  259.     }
  260.   /* 12. Rourter-ID comparision. */
  261.   if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
  262.     new_id.s_addr = new->attr->originator_id.s_addr;
  263.   else
  264.     new_id.s_addr = new->peer->remote_id.s_addr;
  265.   if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_ORIGINATOR_ID))
  266.     exist_id.s_addr = exist->attr->originator_id.s_addr;
  267.   else
  268.     exist_id.s_addr = exist->peer->remote_id.s_addr;
  269.   if (ntohl (new_id.s_addr) < ntohl (exist_id.s_addr))
  270.     return 1;
  271.   if (ntohl (new_id.s_addr) > ntohl (exist_id.s_addr))
  272.     return 0;
  273.   /* 13. Cluster length comparision. */
  274.   if (new->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
  275.     new_cluster = new->attr->cluster->length;
  276.   else
  277.     new_cluster = 0;
  278.   if (exist->attr->flag & ATTR_FLAG_BIT(BGP_ATTR_CLUSTER_LIST))
  279.     exist_cluster = exist->attr->cluster->length;
  280.   else
  281.     exist_cluster = 0;
  282.   if (new_cluster < exist_cluster)
  283.     return 1;
  284.   if (new_cluster > exist_cluster)
  285.     return 0;
  286.   /* 14. Neighbor address comparision. */
  287.   ret = sockunion_cmp (new->peer->su_remote, exist->peer->su_remote);
  288.   if (ret == 1)
  289.     return 0;
  290.   if (ret == -1)
  291.     return 1;
  292.   return 1;
  293. }
  294. enum filter_type
  295. bgp_input_filter (struct peer *peer, struct prefix *p, struct attr *attr,
  296.   afi_t afi, safi_t safi)
  297. {
  298.   struct bgp_filter *filter;
  299.   filter = &peer->filter[afi][safi];
  300.   if (DISTRIBUTE_IN_NAME (filter))
  301.     if (access_list_apply (DISTRIBUTE_IN (filter), p) == FILTER_DENY)
  302.       return FILTER_DENY;
  303.   if (PREFIX_LIST_IN_NAME (filter))
  304.     if (prefix_list_apply (PREFIX_LIST_IN (filter), p) == PREFIX_DENY)
  305.       return FILTER_DENY;
  306.   
  307.   if (FILTER_LIST_IN_NAME (filter))
  308.     if (as_list_apply (FILTER_LIST_IN (filter), attr->aspath)== AS_FILTER_DENY)
  309.       return FILTER_DENY;
  310.   return FILTER_PERMIT;
  311. }
  312. enum filter_type
  313. bgp_output_filter (struct peer *peer, struct prefix *p, struct attr *attr,
  314.    afi_t afi, safi_t safi)
  315. {
  316.   struct bgp_filter *filter;
  317.   filter = &peer->filter[afi][safi];
  318.   if (DISTRIBUTE_OUT_NAME (filter))
  319.     if (access_list_apply (DISTRIBUTE_OUT (filter), p) == FILTER_DENY)
  320.       return FILTER_DENY;
  321.   if (PREFIX_LIST_OUT_NAME (filter))
  322.     if (prefix_list_apply (PREFIX_LIST_OUT (filter), p) == PREFIX_DENY)
  323.       return FILTER_DENY;
  324.   if (FILTER_LIST_OUT_NAME (filter))
  325.     if (as_list_apply (FILTER_LIST_OUT (filter), attr->aspath) == AS_FILTER_DENY)
  326.       return FILTER_DENY;
  327.   return FILTER_PERMIT;
  328. }
  329. /* If community attribute includes no_export then return 1. */
  330. int
  331. bgp_community_filter (struct peer *peer, struct attr *attr)
  332. {
  333.   if (attr->community)
  334.     {
  335.       /* NO_ADVERTISE check. */
  336.       if (community_include (attr->community, COMMUNITY_NO_ADVERTISE))
  337. return 1;
  338.       /* NO_EXPORT check. */
  339.       if (peer_sort (peer) == BGP_PEER_EBGP &&
  340.   community_include (attr->community, COMMUNITY_NO_EXPORT))
  341. return 1;
  342.       /* NO_EXPORT_SUBCONFED check. */
  343.       if (peer_sort (peer) == BGP_PEER_EBGP 
  344.   || peer_sort (peer) == BGP_PEER_CONFED)
  345. if (community_include (attr->community, COMMUNITY_NO_EXPORT_SUBCONFED))
  346.   return 1;
  347.     }
  348.   return 0;
  349. }
  350. /* Route reflection loop check.  */
  351. static int
  352. bgp_cluster_filter (struct peer *peer, struct attr *attr)
  353. {
  354.   struct in_addr cluster_id;
  355.   if (attr->cluster)
  356.     {
  357.       if (peer->bgp->config & BGP_CONFIG_CLUSTER_ID)
  358. cluster_id = peer->bgp->cluster_id;
  359.       else
  360. cluster_id = peer->bgp->router_id;
  361.       
  362.       if (cluster_loop_check (attr->cluster, cluster_id))
  363. return 1;
  364.     }
  365.   return 0;
  366. }
  367. int
  368. bgp_input_modifier (struct peer *peer, struct prefix *p, struct attr *attr,
  369.     afi_t afi, safi_t safi)
  370. {
  371.   struct bgp_filter *filter;
  372.   struct bgp_info info;
  373.   route_map_result_t ret;
  374.   filter = &peer->filter[afi][safi];
  375.   /* Apply default weight value. */
  376.   if (CHECK_FLAG (peer->af_config[afi][safi], PEER_AF_CONFIG_WEIGHT))
  377.     attr->weight = peer->weight[afi][safi];
  378.   else
  379.     attr->weight = 0;
  380.   /* Route map apply. */
  381.   if (ROUTE_MAP_IN_NAME (filter))
  382.     {
  383.       /* Duplicate current value to new strucutre for modification. */
  384.       info.peer = peer;
  385.       info.attr = attr;
  386.       SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_IN); 
  387.       /* Apply BGP route map to the attribute. */
  388.       ret = route_map_apply (ROUTE_MAP_IN (filter), p, RMAP_BGP, &info);
  389.       peer->rmap_type = 0;
  390.       if (ret == RMAP_DENYMATCH)
  391. {
  392.   /* Free newly generated AS path and community by route-map. */
  393.   bgp_attr_flush (attr);
  394.   return RMAP_DENY;
  395. }
  396.     }
  397.   return RMAP_PERMIT;
  398. }
  399. int
  400. bgp_announce_check (struct bgp_info *ri, struct peer *peer, struct prefix *p,
  401.     struct attr *attr, afi_t afi, safi_t safi)
  402. {
  403.   int ret;
  404.   char buf[SU_ADDRSTRLEN];
  405.   struct bgp_filter *filter;
  406.   struct bgp_info info;
  407.   struct peer *from;
  408.   struct bgp *bgp;
  409.   struct attr dummy_attr;
  410.   int transparent;
  411.   int reflect;
  412.   from = ri->peer;
  413.   filter = &peer->filter[afi][safi];
  414.   bgp = peer->bgp;
  415.   
  416. #ifdef DISABLE_BGP_ANNOUNCE
  417.   return 0;
  418. #endif
  419.   /* Do not send back route to sender. */
  420.   if (from == peer)
  421.     return 0;
  422.   /* Aggregate-address suppress check. */
  423.   if (ri->suppress)
  424.     if (! UNSUPPRESS_MAP_NAME (filter))
  425.       return 0;
  426.   /* Default route check.  */
  427.   if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
  428.     {
  429.       if (p->family == AF_INET && p->u.prefix4.s_addr == INADDR_ANY)
  430. return 0;
  431. #ifdef HAVE_IPV6
  432.       else if (p->family == AF_INET6 && p->prefixlen == 0)
  433. return 0;
  434. #endif /* HAVE_IPV6 */
  435.     }
  436.   /* Transparency check. */
  437.   if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT)
  438.       && CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_RSERVER_CLIENT))
  439.     transparent = 1;
  440.   else
  441.     transparent = 0;
  442.   /* If community is not disabled check the no-export and local. */
  443.   if (! transparent && bgp_community_filter (peer, ri->attr)) 
  444.     return 0;
  445.   /* If the attribute has originator-id and it is same as remote
  446.      peer's id. */
  447.   if (ri->attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID))
  448.     {
  449.       if (IPV4_ADDR_SAME (&peer->remote_id, &ri->attr->originator_id))
  450. {
  451.   if (BGP_DEBUG (filter, FILTER))  
  452.     zlog (peer->log, LOG_INFO,
  453.   "%s [Update:SEND] %s/%d originator-id is same as remote router-id",
  454.   peer->host,
  455.   inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
  456.   p->prefixlen);
  457.   return 0;
  458. }
  459.     }
  460.  
  461.   /* ORF prefix-list filter check */
  462.   if (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV)
  463.       && (CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_RCV)
  464.   || CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_OLD_RCV)))
  465.     if (peer->orf_plist[afi][safi])
  466.       {
  467. if (prefix_list_apply (peer->orf_plist[afi][safi], p) == PREFIX_DENY)
  468.           return 0;
  469.       }
  470.   /* Output filter check. */
  471.   if (bgp_output_filter (peer, p, ri->attr, afi, safi) == FILTER_DENY)
  472.     {
  473.       if (BGP_DEBUG (filter, FILTER))
  474. zlog (peer->log, LOG_INFO,
  475.       "%s [Update:SEND] %s/%d is filtered",
  476.       peer->host,
  477.       inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
  478.       p->prefixlen);
  479.       return 0;
  480.     }
  481. #ifdef BGP_SEND_ASPATH_CHECK
  482.   /* AS path loop check. */
  483.   if (aspath_loop_check (ri->attr->aspath, peer->as))
  484.     {
  485.       if (BGP_DEBUG (filter, FILTER))  
  486.         zlog (peer->log, LOG_INFO, 
  487.       "%s [Update:SEND] suppress announcement to peer AS %d is AS path.",
  488.       peer->host, peer->as);
  489.       return 0;
  490.     }
  491. #endif /* BGP_SEND_ASPATH_CHECK */
  492.   /* If we're a CONFED we need to loop check the CONFED ID too */
  493.   if (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION))
  494.     {
  495.       if (aspath_loop_check(ri->attr->aspath, bgp->confed_id))
  496. {
  497.   if (BGP_DEBUG (filter, FILTER))  
  498.     zlog (peer->log, LOG_INFO, 
  499.   "%s [Update:SEND] suppress announcement to peer AS %d is AS path.",
  500.   peer->host,
  501.   bgp->confed_id);
  502.   return 0;
  503. }      
  504.     }
  505.   /* Route-Reflect check. */
  506.   if (peer_sort (from) == BGP_PEER_IBGP && peer_sort (peer) == BGP_PEER_IBGP)
  507.     reflect = 1;
  508.   else
  509.     reflect = 0;
  510.   /* IBGP reflection check. */
  511.   if (reflect)
  512.     {
  513.       /* A route from a Client peer. */
  514.       if (CHECK_FLAG (from->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
  515. {
  516.   /* Reflect to all the Non-Client peers and also to the
  517.              Client peers other than the originator.  Originator check
  518.              is already done.  So there is noting to do. */
  519.   /* no bgp client-to-client reflection check. */
  520.   if (bgp_flag_check (bgp, BGP_FLAG_NO_CLIENT_TO_CLIENT))
  521.     if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
  522.       return 0;
  523. }
  524.       else
  525. {
  526.   /* A route from a Non-client peer. Reflect to all other
  527.      clients. */
  528.   if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_REFLECTOR_CLIENT))
  529.     return 0;
  530. }
  531.     }
  532.   /* For modify attribute, copy it to temporary structure. */
  533.   *attr = *ri->attr;
  534.   /* If local-preference is not set. */
  535.   if ((peer_sort (peer) == BGP_PEER_IBGP 
  536.        || peer_sort (peer) == BGP_PEER_CONFED) 
  537.       && (! (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF))))
  538.     {
  539.       attr->flag |= ATTR_FLAG_BIT (BGP_ATTR_LOCAL_PREF);
  540.       attr->local_pref = bgp->default_local_pref;
  541.     }
  542.   /* Remove MED if its an EBGP peer - will get overwritten by route-maps */
  543.   if (peer_sort (peer) == BGP_PEER_EBGP 
  544.       && attr->flag & ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC))
  545.     {
  546.       if (ri->peer != bgp->peer_self && ! transparent
  547.   && ! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MED_UNCHANGED))
  548. attr->flag &= ~(ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC));
  549.     }
  550.   /* next-hop-set */
  551.   if (transparent || reflect
  552.       || (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_UNCHANGED)
  553.   && ((p->family == AF_INET && attr->nexthop.s_addr)
  554. #ifdef HAVE_IPV6
  555.       || (p->family == AF_INET6 && ri->peer != bgp->peer_self)
  556. #endif /* HAVE_IPV6 */
  557.       )))
  558.     {
  559.       /* NEXT-HOP Unchanged. */
  560.     }
  561.   else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_NEXTHOP_SELF)
  562.    || (p->family == AF_INET && attr->nexthop.s_addr == 0)
  563. #ifdef HAVE_IPV6
  564.    || (p->family == AF_INET6 && ri->peer == bgp->peer_self)
  565. #endif /* HAVE_IPV6 */
  566.    || (peer_sort (peer) == BGP_PEER_EBGP
  567.        && bgp_multiaccess_check_v4 (attr->nexthop, peer->host) == 0))
  568.     {
  569.       /* Set IPv4 nexthop. */
  570.       if (p->family == AF_INET)
  571. {
  572.   if (safi == SAFI_MPLS_VPN)
  573.     memcpy (&attr->mp_nexthop_global_in, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
  574.   else
  575.     memcpy (&attr->nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
  576. }
  577. #ifdef HAVE_IPV6
  578.       /* Set IPv6 nexthop. */
  579.       if (p->family == AF_INET6)
  580. {
  581.   /* IPv6 global nexthop must be included. */
  582.   memcpy (&attr->mp_nexthop_global, &peer->nexthop.v6_global, 
  583.   IPV6_MAX_BYTELEN);
  584.   attr->mp_nexthop_len = 16;
  585. }
  586. #endif /* HAVE_IPV6 */
  587.     }
  588. #ifdef HAVE_IPV6
  589.   if (p->family == AF_INET6)
  590.     {
  591.       /* Link-local address should not be transit to different peer. */
  592.       attr->mp_nexthop_len = 16;
  593.       /* Set link-local address for shared network peer. */
  594.       if (peer->shared_network 
  595.   && ! IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
  596. {
  597.   memcpy (&attr->mp_nexthop_local, &peer->nexthop.v6_local, 
  598.   IPV6_MAX_BYTELEN);
  599.   attr->mp_nexthop_len = 32;
  600. }
  601.       /* If bgpd act as BGP-4+ route-reflector, do not send link-local
  602.  address.*/
  603.       if (reflect)
  604. attr->mp_nexthop_len = 16;
  605.       /* If BGP-4+ link-local nexthop is not link-local nexthop. */
  606.       if (! IN6_IS_ADDR_LINKLOCAL (&peer->nexthop.v6_local))
  607. attr->mp_nexthop_len = 16;
  608.     }
  609. #endif /* HAVE_IPV6 */
  610.   /* If this is EBGP peer and remove-private-AS is set.  */
  611.   if (peer_sort (peer) == BGP_PEER_EBGP
  612.       && peer_af_flag_check (peer, afi, safi, PEER_FLAG_REMOVE_PRIVATE_AS)
  613.       && aspath_private_as_check (attr->aspath))
  614.     attr->aspath = aspath_empty_get ();
  615.   /* Route map & unsuppress-map apply. */
  616.   if (ROUTE_MAP_OUT_NAME (filter)
  617.       || ri->suppress)
  618.     {
  619.       info.peer = peer;
  620.       info.attr = attr;
  621.       /* The route reflector is not allowed to modify the attributes
  622.  of the reflected IBGP routes. */
  623.       if (peer_sort (from) == BGP_PEER_IBGP 
  624.   && peer_sort (peer) == BGP_PEER_IBGP)
  625. {
  626.   dummy_attr = *attr;
  627.   info.attr = &dummy_attr;
  628. }
  629.       SET_FLAG (peer->rmap_type, PEER_RMAP_TYPE_OUT); 
  630.       if (ri->suppress)
  631. ret = route_map_apply (UNSUPPRESS_MAP (filter), p, RMAP_BGP, &info);
  632.       else
  633. ret = route_map_apply (ROUTE_MAP_OUT (filter), p, RMAP_BGP, &info);
  634.       peer->rmap_type = 0;
  635.       if (ret == RMAP_DENYMATCH)
  636. {
  637.   bgp_attr_flush (attr);
  638.   return 0;
  639. }
  640.     }
  641.   return 1;
  642. }
  643. int
  644. bgp_process (struct bgp *bgp, struct bgp_node *rn, afi_t afi, safi_t safi)
  645. {
  646.   struct prefix *p;
  647.   struct bgp_info *ri;
  648.   struct bgp_info *new_select;
  649.   struct bgp_info *old_select;
  650.   struct listnode *nn;
  651.   struct peer *peer;
  652.   struct attr attr;
  653.   struct bgp_info *ri1;
  654.   struct bgp_info *ri2;
  655.   p = &rn->p;
  656.   /* bgp deterministic-med */
  657.   new_select = NULL;
  658.   if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED))
  659.     for (ri1 = rn->info; ri1; ri1 = ri1->next)
  660.       {
  661. if (CHECK_FLAG (ri1->flags, BGP_INFO_DMED_CHECK))
  662.   continue;
  663. if (BGP_INFO_HOLDDOWN (ri1))
  664.   continue;
  665. new_select = ri1;
  666. if (ri1->next)
  667.   for (ri2 = ri1->next; ri2; ri2 = ri2->next)
  668.     {
  669.       if (CHECK_FLAG (ri2->flags, BGP_INFO_DMED_CHECK))
  670. continue;
  671.       if (BGP_INFO_HOLDDOWN (ri2))
  672. continue;
  673.       if (aspath_cmp_left (ri1->attr->aspath, ri2->attr->aspath)
  674.   || aspath_cmp_left_confed (ri1->attr->aspath,
  675.      ri2->attr->aspath))
  676. {
  677.   if (bgp_info_cmp (bgp, ri2, new_select))
  678.     {
  679.       UNSET_FLAG (new_select->flags, BGP_INFO_DMED_SELECTED);
  680.       new_select = ri2;
  681.     }
  682.   SET_FLAG (ri2->flags, BGP_INFO_DMED_CHECK);
  683. }
  684.     }
  685. SET_FLAG (new_select->flags, BGP_INFO_DMED_CHECK);
  686. SET_FLAG (new_select->flags, BGP_INFO_DMED_SELECTED);
  687.       }
  688.   /* Check old selected route and new selected route. */
  689.   old_select = NULL;
  690.   new_select = NULL;
  691.   for (ri = rn->info; ri; ri = ri->next)
  692.     {
  693.       if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED))
  694. old_select = ri;
  695.       if (BGP_INFO_HOLDDOWN (ri))
  696. continue;
  697.       if (bgp_flag_check (bgp, BGP_FLAG_DETERMINISTIC_MED)
  698.           && (! CHECK_FLAG (ri->flags, BGP_INFO_DMED_SELECTED)))
  699. {
  700.   UNSET_FLAG (ri->flags, BGP_INFO_DMED_CHECK);
  701.   continue;
  702.         }
  703.       UNSET_FLAG (ri->flags, BGP_INFO_DMED_CHECK);
  704.       UNSET_FLAG (ri->flags, BGP_INFO_DMED_SELECTED);
  705.       if (bgp_info_cmp (bgp, ri, new_select))
  706. new_select = ri;
  707.     }
  708.   /* Nothing to do. */
  709.   if (old_select && old_select == new_select)
  710.     {
  711.       if (! CHECK_FLAG (old_select->flags, BGP_INFO_ATTR_CHANGED))
  712. {
  713.   if (CHECK_FLAG (old_select->flags, BGP_INFO_IGP_CHANGED))
  714.     bgp_zebra_announce (p, old_select, bgp);
  715.   return 0;
  716. }
  717.     }
  718.   if (old_select)
  719.     UNSET_FLAG (old_select->flags, BGP_INFO_SELECTED);
  720.   if (new_select)
  721.     {
  722.       SET_FLAG (new_select->flags, BGP_INFO_SELECTED);
  723.       UNSET_FLAG (new_select->flags, BGP_INFO_ATTR_CHANGED);
  724.     }
  725.   /* Check each BGP peer. */
  726.   LIST_LOOP (bgp->peer, peer, nn)
  727.     {
  728.       /* Announce route to Established peer. */
  729.       if (peer->status != Established)
  730. continue;
  731.       /* Address family configuration check. */
  732.       if (! peer->afc_nego[afi][safi])
  733. continue;
  734.       /* First update is deferred until ORF or ROUTE-REFRESH is received */
  735.       if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
  736. continue;
  737.       /* Announcement to peer->conf.  If the route is filtered,
  738.          withdraw it. */
  739.       if (new_select 
  740.   && bgp_announce_check (new_select, peer, p, &attr, afi, safi))
  741. bgp_adj_out_set (rn, peer, p, &attr, afi, safi, new_select);
  742.       else
  743. bgp_adj_out_unset (rn, peer, p, afi, safi);
  744.     }
  745.   /* FIB update. */
  746.   if (safi == SAFI_UNICAST && ! bgp->name &&
  747.       ! bgp_option_check (BGP_OPT_NO_FIB))
  748.     {
  749.       if (new_select 
  750.   && new_select->type == ZEBRA_ROUTE_BGP 
  751.   && new_select->sub_type == BGP_ROUTE_NORMAL)
  752. bgp_zebra_announce (p, new_select, bgp);
  753.       else
  754. {
  755.   /* Withdraw the route from the kernel. */
  756.   if (old_select 
  757.       && old_select->type == ZEBRA_ROUTE_BGP
  758.       && old_select->sub_type == BGP_ROUTE_NORMAL)
  759.     bgp_zebra_withdraw (p, old_select);
  760. }
  761.     }
  762.   return 0;
  763. }
  764. int
  765. bgp_maximum_prefix_restart_timer (struct thread *thread)
  766. {
  767.   struct peer *peer;
  768.   peer = THREAD_ARG (thread);
  769.   peer->t_pmax_restart = NULL;
  770.   if (BGP_DEBUG (events, EVENTS))
  771.     zlog_info ("%s Maximum-prefix restart timer expired, restore peering", peer->host);
  772.   peer_clear (peer);
  773.   return 0;
  774. }
  775. int
  776. bgp_maximum_prefix_overflow (struct peer *peer, afi_t afi, safi_t safi, int always)
  777. {
  778.   if (! CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX))
  779.     return 0;
  780.   if (peer->pcount[afi][safi] > peer->pmax[afi][safi])
  781.     {
  782.       if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT)
  783.   && ! always)
  784. return 0;
  785.       zlog (peer->log, LOG_INFO,
  786.     "%%MAXPFXEXCEED: No. of %s prefix received from %s %ld exceed, limit %ld",
  787.     afi_safi_print (afi, safi), peer->host, peer->pcount[afi][safi],
  788.     peer->pmax[afi][safi]);
  789.       SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
  790.       if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_MAX_PREFIX_WARNING))
  791. return 0;
  792.       {
  793. char ndata[7];
  794. ndata[0] = (u_char)(afi >>  8);
  795. ndata[1] = (u_char) afi;
  796. ndata[3] = (u_char)(peer->pmax[afi][safi] >> 24);
  797. ndata[4] = (u_char)(peer->pmax[afi][safi] >> 16);
  798. ndata[5] = (u_char)(peer->pmax[afi][safi] >> 8);
  799. ndata[6] = (u_char)(peer->pmax[afi][safi]);
  800. if (safi == SAFI_MPLS_VPN)
  801.   safi = BGP_SAFI_VPNV4;
  802. ndata[2] = (u_char) safi;
  803. SET_FLAG (peer->sflags, PEER_STATUS_PREFIX_OVERFLOW);
  804. bgp_notify_send_with_data (peer, BGP_NOTIFY_CEASE,
  805.    BGP_NOTIFY_CEASE_MAX_PREFIX, ndata, 7);
  806.       }
  807.       /* restart timer start */
  808.       if (peer->pmax_restart[afi][safi])
  809. {
  810.   peer->v_pmax_restart = peer->pmax_restart[afi][safi] * 60;
  811.   if (BGP_DEBUG (events, EVENTS))
  812.     zlog_info ("%s Maximum-prefix restart timer started for %d secs",
  813.        peer->host, peer->v_pmax_restart);
  814.   BGP_TIMER_ON (peer->t_pmax_restart, bgp_maximum_prefix_restart_timer,
  815. peer->v_pmax_restart);
  816. }
  817.       return 1;
  818.     }
  819.   else
  820.     UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_LIMIT);
  821.   if (peer->pcount[afi][safi] > (peer->pmax[afi][safi] * peer->pmax_threshold[afi][safi] / 100))
  822.     {
  823.       if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD)
  824.   && ! always)
  825. return 0;
  826.       zlog (peer->log, LOG_INFO,
  827.     "%%MAXPFX: No. of %s prefix received from %s reaches %ld, max %ld",
  828.     afi_safi_print (afi, safi), peer->host, peer->pcount[afi][safi],
  829.     peer->pmax[afi][safi]);
  830.       SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
  831.     }
  832.   else
  833.     UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_PREFIX_THRESHOLD);
  834.   return 0;
  835. }
  836. void
  837. bgp_rib_remove (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
  838. afi_t afi, safi_t safi)
  839. {
  840.   if (! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
  841.     {
  842.       if (! CHECK_FLAG (ri->flags, BGP_INFO_STALE))
  843. peer->pcount[afi][safi]--;
  844.       bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
  845.       UNSET_FLAG (ri->flags, BGP_INFO_VALID);
  846.       bgp_process (peer->bgp, rn, afi, safi);
  847.     }
  848.   bgp_info_delete (rn, ri);
  849.   bgp_info_free (ri);
  850.   bgp_unlock_node (rn);
  851. }
  852. void
  853. bgp_rib_withdraw (struct bgp_node *rn, struct bgp_info *ri, struct peer *peer,
  854.   afi_t afi, safi_t safi, int force)
  855. {
  856.   int valid;
  857.   int status = BGP_DAMP_NONE;
  858.   if (! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
  859.     {
  860.       peer->pcount[afi][safi]--;
  861.       bgp_aggregate_decrement (peer->bgp, &rn->p, ri, afi, safi);
  862.     }
  863.   if (! force)
  864.     {
  865.       if (CHECK_FLAG (peer->bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
  866.   && peer_sort (peer) == BGP_PEER_EBGP)
  867. status = bgp_damp_withdraw (ri, rn, afi, safi, 0);
  868.       if (status == BGP_DAMP_SUPPRESSED)
  869. return;
  870.     }
  871.   valid = CHECK_FLAG (ri->flags, BGP_INFO_VALID);
  872.   UNSET_FLAG (ri->flags, BGP_INFO_VALID);
  873.   bgp_process (peer->bgp, rn, afi, safi);
  874.   if (valid)
  875.     SET_FLAG (ri->flags, BGP_INFO_VALID);
  876.   if (status != BGP_DAMP_USED)
  877.     {
  878.       bgp_info_delete (rn, ri);
  879.       bgp_info_free (ri);
  880.       bgp_unlock_node (rn);
  881.     }
  882. }
  883. int
  884. bgp_update (struct peer *peer, struct prefix *p, struct attr *attr, 
  885.     afi_t afi, safi_t safi, int type, int sub_type,
  886.     struct prefix_rd *prd, u_char *tag, int soft_reconfig)
  887. {
  888.   int ret;
  889.   int aspath_loop_count = 0;
  890.   struct bgp_node *rn;
  891.   struct bgp *bgp;
  892.   struct attr new_attr;
  893.   struct attr *attr_new;
  894.   struct bgp_info *ri;
  895.   struct bgp_info *new;
  896.   char *reason;
  897.   char buf[SU_ADDRSTRLEN];
  898.   bgp = peer->bgp;
  899.   rn = bgp_afi_node_get (bgp, afi, safi, p, prd);
  900.   /* When peer's soft reconfiguration enabled.  Record input packet in
  901.      Adj-RIBs-In.  */
  902.   if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
  903.       && peer != bgp->peer_self && ! soft_reconfig)
  904.     bgp_adj_in_set (rn, peer, attr);
  905.   /* Check previously received route. */
  906.   for (ri = rn->info; ri; ri = ri->next)
  907.     if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
  908.       break;
  909.   /* AS path local-as loop check. */
  910.   if (peer->change_local_as)
  911.     {
  912.       if (! CHECK_FLAG (peer->flags, PEER_FLAG_LOCAL_AS_NO_PREPEND))
  913. aspath_loop_count = 1;
  914.       if (aspath_loop_check (attr->aspath, peer->change_local_as) > aspath_loop_count) 
  915. {
  916.   reason = "as-path contains our own AS;";
  917.   goto filtered;
  918. }
  919.     }
  920.   /* AS path loop check. */
  921.   if (aspath_loop_check (attr->aspath, bgp->as) > peer->allowas_in[afi][safi]
  922.       || (CHECK_FLAG(bgp->config, BGP_CONFIG_CONFEDERATION)
  923.   && aspath_loop_check(attr->aspath, bgp->confed_id)
  924.   > peer->allowas_in[afi][safi]))
  925.     {
  926.       reason = "as-path contains our own AS;";
  927.       goto filtered;
  928.     }
  929.   /* Route reflector originator ID check.  */
  930.   if (attr->flag & ATTR_FLAG_BIT (BGP_ATTR_ORIGINATOR_ID)
  931.       && IPV4_ADDR_SAME (&bgp->router_id, &attr->originator_id))
  932.     {
  933.       reason = "originator is us;";
  934.       goto filtered;
  935.     }
  936.   /* Route reflector cluster ID check.  */
  937.   if (bgp_cluster_filter (peer, attr))
  938.     {
  939.       reason = "reflected from the same cluster;";
  940.       goto  filtered;
  941.     }
  942.   /* Apply incoming filter.  */
  943.   if (bgp_input_filter (peer, p, attr, afi, safi) == FILTER_DENY)
  944.     {
  945.       reason = "filter;";
  946.       goto filtered;
  947.     }
  948.   /* Apply incoming route-map. */
  949.   new_attr = *attr;
  950.   if (bgp_input_modifier (peer, p, &new_attr, afi, safi) == RMAP_DENY)
  951.     {
  952.       reason = "route-map;";
  953.       goto filtered;
  954.     }
  955.   /* IPv4 unicast next hop check.  */
  956.   if (afi == AFI_IP && safi == SAFI_UNICAST)
  957.     {
  958.       /* If the peer is EBGP and nexthop is not on connected route,
  959.  discard it.  */
  960.       if (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl == 1
  961.   && ! bgp_nexthop_check_ebgp (afi, &new_attr)
  962.   && ! CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK))
  963. {
  964.   reason = "non-connected next-hop;";
  965.   goto filtered;
  966. }
  967.       /* Next hop must not be 0.0.0.0 nor Class E address.  Next hop
  968.  must not be my own address.  */
  969.       if (bgp_nexthop_self (afi, &new_attr)
  970.   || new_attr.nexthop.s_addr == 0
  971.   || ntohl (new_attr.nexthop.s_addr) >= 0xe0000000)
  972. {
  973.   reason = "martian next-hop;";
  974.   goto filtered;
  975. }
  976.     }
  977.   attr_new = bgp_attr_intern (&new_attr);
  978.   /* If the update is implicit withdraw. */
  979.   if (ri)
  980.     {
  981.       ri->uptime = time (NULL);
  982.       /* Same attribute comes in. */
  983.       if (attrhash_cmp (ri->attr, attr_new))
  984. {
  985.   UNSET_FLAG (ri->flags, BGP_INFO_ATTR_CHANGED);
  986.   if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
  987.       && peer_sort (peer) == BGP_PEER_EBGP
  988.       && CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
  989.     {
  990.       if (BGP_DEBUG (update, UPDATE_IN))  
  991.   zlog (peer->log, LOG_INFO, "%s rcvd %s/%d",
  992.   peer->host,
  993.   inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
  994.   p->prefixlen);
  995.       peer->pcount[afi][safi]++;
  996.       ret = bgp_damp_update (ri, rn, afi, safi);
  997.       if (ret != BGP_DAMP_SUPPRESSED)
  998. {
  999.   bgp_aggregate_increment (bgp, p, ri, afi, safi);
  1000.   bgp_process (bgp, rn, afi, safi);
  1001. }
  1002.     }
  1003.   else
  1004.     {
  1005.       if (BGP_DEBUG (update, UPDATE_IN))  
  1006. zlog (peer->log, LOG_INFO,
  1007. "%s rcvd %s/%d...duplicate ignored",
  1008. peer->host,
  1009. inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
  1010. p->prefixlen);
  1011.       /* graceful restart STALE flag unset. */
  1012.       if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
  1013. {
  1014.   UNSET_FLAG (ri->flags, BGP_INFO_STALE);
  1015.   peer->pcount[afi][safi]++;
  1016. }
  1017.     }
  1018.   bgp_unlock_node (rn);
  1019.   bgp_attr_unintern (attr_new);
  1020.   return 0;
  1021. }
  1022.       /* Received Logging. */
  1023.       if (BGP_DEBUG (update, UPDATE_IN))  
  1024. zlog (peer->log, LOG_INFO, "%s rcvd %s/%d",
  1025.       peer->host,
  1026.       inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
  1027.       p->prefixlen);
  1028.       /* graceful restart STALE flag unset. */
  1029.       if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
  1030. {
  1031.   UNSET_FLAG (ri->flags, BGP_INFO_STALE);
  1032.   peer->pcount[afi][safi]++;
  1033. }
  1034.       /* The attribute is changed. */
  1035.       SET_FLAG (ri->flags, BGP_INFO_ATTR_CHANGED);
  1036.       /* Update bgp route dampening information.  */
  1037.       if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
  1038.   && peer_sort (peer) == BGP_PEER_EBGP)
  1039. {
  1040.   /* This is implicit withdraw so we should update dampening
  1041.      information.  */
  1042.   if (! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
  1043.     bgp_damp_withdraw (ri, rn, afi, safi, 1);  
  1044.   else
  1045.     peer->pcount[afi][safi]++;
  1046. }
  1047.       bgp_aggregate_decrement (bgp, p, ri, afi, safi);
  1048.       /* Update to new attribute.  */
  1049.       bgp_attr_unintern (ri->attr);
  1050.       ri->attr = attr_new;
  1051.       /* Update MPLS tag.  */
  1052.       if (safi == SAFI_MPLS_VPN)
  1053. memcpy (ri->tag, tag, 3);
  1054.       /* Update bgp route dampening information.  */
  1055.       if (CHECK_FLAG (bgp->af_flags[afi][safi], BGP_CONFIG_DAMPENING)
  1056.   && peer_sort (peer) == BGP_PEER_EBGP)
  1057. {
  1058.   /* Now we do normal update dampening.  */
  1059.   ret = bgp_damp_update (ri, rn, afi, safi);
  1060.   if (ret == BGP_DAMP_SUPPRESSED)
  1061.     {
  1062.       bgp_unlock_node (rn);
  1063.       return 0;
  1064.     }
  1065. }
  1066.       /* Nexthop reachability check. */
  1067.       if ((afi == AFI_IP || afi == AFI_IP6)
  1068.   && safi == SAFI_UNICAST 
  1069.   && (peer_sort (peer) == BGP_PEER_IBGP
  1070.       || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
  1071.       || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
  1072. {
  1073.   if (bgp_nexthop_lookup (afi, peer, ri, NULL, NULL))
  1074.     SET_FLAG (ri->flags, BGP_INFO_VALID);
  1075.   else
  1076.     UNSET_FLAG (ri->flags, BGP_INFO_VALID);
  1077. }
  1078.       else
  1079. SET_FLAG (ri->flags, BGP_INFO_VALID);
  1080.       /* Process change. */
  1081.       bgp_aggregate_increment (bgp, p, ri, afi, safi);
  1082.       bgp_process (bgp, rn, afi, safi);
  1083.       bgp_unlock_node (rn);
  1084.       return 0;
  1085.     }
  1086.   /* Received Logging. */
  1087.   if (BGP_DEBUG (update, UPDATE_IN))  
  1088.     {
  1089.       zlog (peer->log, LOG_INFO, "%s rcvd %s/%d",
  1090.     peer->host,
  1091.     inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
  1092.     p->prefixlen);
  1093.     }
  1094.   /* Increment prefix counter */
  1095.   peer->pcount[afi][safi]++;
  1096.   /* Make new BGP info. */
  1097.   new = bgp_info_new ();
  1098.   new->type = type;
  1099.   new->sub_type = sub_type;
  1100.   new->peer = peer;
  1101.   new->attr = attr_new;
  1102.   new->uptime = time (NULL);
  1103.   /* Update MPLS tag. */
  1104.   if (safi == SAFI_MPLS_VPN)
  1105.     memcpy (new->tag, tag, 3);
  1106.   /* Nexthop reachability check. */
  1107.   if ((afi == AFI_IP || afi == AFI_IP6)
  1108.       && safi == SAFI_UNICAST
  1109.       && (peer_sort (peer) == BGP_PEER_IBGP
  1110.   || (peer_sort (peer) == BGP_PEER_EBGP && peer->ttl != 1)
  1111.   || CHECK_FLAG (peer->flags, PEER_FLAG_DISABLE_CONNECTED_CHECK)))
  1112.     {
  1113.       if (bgp_nexthop_lookup (afi, peer, new, NULL, NULL))
  1114. SET_FLAG (new->flags, BGP_INFO_VALID);
  1115.       else
  1116. UNSET_FLAG (new->flags, BGP_INFO_VALID);
  1117.     }
  1118.   else
  1119.     SET_FLAG (new->flags, BGP_INFO_VALID);
  1120.   /* Aggregate address increment. */
  1121.   bgp_aggregate_increment (bgp, p, new, afi, safi);
  1122.   
  1123.   /* Register new BGP information. */
  1124.   bgp_info_add (rn, new);
  1125.   /* If maximum prefix count is configured and current prefix
  1126.      count exeed it. */
  1127.   if (bgp_maximum_prefix_overflow (peer, afi, safi, 0))
  1128.     return -1;
  1129.   /* Process change. */
  1130.   bgp_process (bgp, rn, afi, safi);
  1131.   return 0;
  1132.   /* This BGP update is filtered.  Log the reason then update BGP
  1133.      entry.  */
  1134.  filtered:
  1135.   if (BGP_DEBUG (update, UPDATE_IN))
  1136.     zlog (peer->log, LOG_INFO,
  1137.   "%s rcvd UPDATE about %s/%d -- DENIED due to: %s",
  1138.   peer->host,
  1139.   inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
  1140.   p->prefixlen, reason);
  1141.   if (ri)
  1142.     bgp_rib_withdraw (rn, ri, peer, afi, safi, 1);
  1143.   bgp_unlock_node (rn);
  1144.   return 0;
  1145. }
  1146. int
  1147. bgp_withdraw (struct peer *peer, struct prefix *p, struct attr *attr, 
  1148.      int afi, int safi, int type, int sub_type, struct prefix_rd *prd,
  1149.       u_char *tag)
  1150. {
  1151.   struct bgp *bgp;
  1152.   char buf[SU_ADDRSTRLEN];
  1153.   struct bgp_node *rn;
  1154.   struct bgp_info *ri;
  1155.   bgp = peer->bgp;
  1156.   /* Logging. */
  1157.   if (BGP_DEBUG (update, UPDATE_IN))  
  1158.     zlog (peer->log, LOG_INFO, "%s rcvd UPDATE about %s/%d -- withdrawn",
  1159.   peer->host,
  1160.   inet_ntop(p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
  1161.   p->prefixlen);
  1162.   /* Lookup node. */
  1163.   rn = bgp_afi_node_get (bgp, afi, safi, p, prd);
  1164.   /* If peer is soft reconfiguration enabled.  Record input packet for
  1165.      further calculation. */
  1166.   if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_SOFT_RECONFIG)
  1167.       && peer != bgp->peer_self)
  1168.     bgp_adj_in_unset (rn, peer);
  1169.   /* Lookup withdrawn route. */
  1170.   for (ri = rn->info; ri; ri = ri->next)
  1171.     if (ri->peer == peer && ri->type == type && ri->sub_type == sub_type)
  1172.       break;
  1173.   /* Withdraw specified route from routing table. */
  1174.   if (ri && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY))
  1175.     bgp_rib_withdraw (rn, ri, peer, afi, safi, 0);
  1176.   else if (BGP_DEBUG (update, UPDATE_IN))
  1177.     zlog (peer->log, LOG_INFO, 
  1178.   "%s Can't find the route %s/%d", peer->host,
  1179.   inet_ntop (p->family, &p->u.prefix, buf, SU_ADDRSTRLEN),
  1180.   p->prefixlen);
  1181.   /* Unlock bgp_node_get() lock. */
  1182.   bgp_unlock_node (rn);
  1183.   return 0;
  1184. }
  1185. void
  1186. bgp_default_originate (struct peer *peer, afi_t afi, safi_t safi, int withdraw)
  1187. {
  1188.   struct bgp *bgp;
  1189.   struct attr attr;
  1190.   struct aspath *aspath;
  1191.   struct prefix p;
  1192.   struct bgp_info binfo;
  1193.   struct peer *from;
  1194.   int ret = RMAP_DENYMATCH;
  1195.   bgp = peer->bgp;
  1196.   from = bgp->peer_self;
  1197.   bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
  1198.   aspath = attr.aspath;
  1199.   attr.local_pref = bgp->default_local_pref;
  1200.   memcpy (&attr.nexthop, &peer->nexthop.v4, IPV4_MAX_BYTELEN);
  1201.   if (afi == AFI_IP)
  1202.     str2prefix ("0.0.0.0/0", &p);
  1203. #ifdef HAVE_IPV6
  1204.   else if (afi == AFI_IP6)
  1205.     {
  1206.       str2prefix ("::/0", &p);
  1207.       /* IPv6 global nexthop must be included. */
  1208.       memcpy (&attr.mp_nexthop_global, &peer->nexthop.v6_global, 
  1209.       IPV6_MAX_BYTELEN);
  1210.       attr.mp_nexthop_len = 16;
  1211.  
  1212.       /* If the peer is on shared nextwork and we have link-local
  1213.  nexthop set it. */
  1214.       if (peer->shared_network 
  1215.   && !IN6_IS_ADDR_UNSPECIFIED (&peer->nexthop.v6_local))
  1216. {
  1217.   memcpy (&attr.mp_nexthop_local, &peer->nexthop.v6_local, 
  1218.   IPV6_MAX_BYTELEN);
  1219.   attr.mp_nexthop_len = 32;
  1220. }
  1221.     }
  1222. #endif /* HAVE_IPV6 */
  1223.   else
  1224.     return;
  1225.   if (peer->default_rmap[afi][safi].name)
  1226.     {
  1227.       binfo.peer = bgp->peer_self;
  1228.       binfo.attr = &attr;
  1229.       ret = route_map_apply (peer->default_rmap[afi][safi].map, &p,
  1230.      RMAP_BGP, &binfo);
  1231.       if (ret == RMAP_DENYMATCH)
  1232. {
  1233.   bgp_attr_flush (&attr);
  1234.   withdraw = 1;
  1235. }
  1236.     }
  1237.   if (withdraw)
  1238.     {
  1239.       if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE))
  1240. bgp_default_withdraw_send (peer, afi, safi);
  1241.       UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
  1242.     }
  1243.   else
  1244.     {
  1245.       SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_DEFAULT_ORIGINATE);
  1246.       bgp_default_update_send (peer, &attr, afi, safi, from);
  1247.     }
  1248.   aspath_unintern (aspath);
  1249. }
  1250. static void
  1251. bgp_announce_table (struct peer *peer, afi_t afi, safi_t safi,
  1252.     struct bgp_table *table)
  1253. {
  1254.   struct bgp_node *rn;
  1255.   struct bgp_info *ri;
  1256.   struct attr attr;
  1257.   if (! table)
  1258.     table = peer->bgp->rib[afi][safi];
  1259.   if (safi != SAFI_MPLS_VPN
  1260.       && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_DEFAULT_ORIGINATE))
  1261.     bgp_default_originate (peer, afi, safi, 0);
  1262.   for (rn = bgp_table_top (table); rn; rn = bgp_route_next(rn))
  1263.     for (ri = rn->info; ri; ri = ri->next)
  1264.       if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED) && ri->peer != peer)
  1265. {
  1266.   if (bgp_announce_check (ri, peer, &rn->p, &attr, afi, safi))
  1267.     bgp_adj_out_set (rn, peer, &rn->p, &attr, afi, safi, ri);
  1268.   else
  1269.     bgp_adj_out_unset (rn, peer, &rn->p, afi, safi);
  1270. }
  1271. }
  1272. void
  1273. bgp_announce_route (struct peer *peer, afi_t afi, safi_t safi)
  1274. {
  1275.   struct bgp_node *rn;
  1276.   struct bgp_table *table;
  1277.   if (peer->status != Established)
  1278.     return;
  1279.   if (! peer->afc_nego[afi][safi])
  1280.     return;
  1281.   /* First update is deferred until ORF or ROUTE-REFRESH is received */
  1282.   if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
  1283.     return;
  1284.   if (safi != SAFI_MPLS_VPN)
  1285.     bgp_announce_table (peer, afi, safi, NULL);
  1286.   else
  1287.     for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
  1288.  rn = bgp_route_next(rn))
  1289.       if ((table = (rn->info)) != NULL)
  1290. bgp_announce_table (peer, afi, safi, table);
  1291.   if (! peer->t_routeadv[afi][safi])
  1292.     bgp_routeadv_timer (peer, afi, safi);
  1293. }
  1294. void
  1295. bgp_announce_route_all (struct peer *peer)
  1296. {
  1297.   afi_t afi;
  1298.   safi_t safi;
  1299.   
  1300.   for (afi = AFI_IP; afi < AFI_MAX; afi++)
  1301.     for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
  1302.       bgp_announce_route (peer, afi, safi);
  1303. }
  1304. static void
  1305. bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi,
  1306.  struct bgp_table *table)
  1307. {
  1308.   int ret;
  1309.   struct bgp_node *rn;
  1310.   struct bgp_adj_in *ain;
  1311.   if (! table)
  1312.     table = peer->bgp->rib[afi][safi];
  1313.   for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
  1314.     for (ain = rn->adj_in; ain; ain = ain->next)
  1315.       {
  1316. if (ain->peer == peer)
  1317.   {
  1318.     ret = bgp_update (peer, &rn->p, ain->attr, afi, safi,
  1319.       ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
  1320.       NULL, NULL, 1);
  1321.     if (ret < 0)
  1322.       {
  1323. bgp_unlock_node (rn);
  1324. return;
  1325.       }
  1326.     continue;
  1327.   }
  1328.       }
  1329. }
  1330. void
  1331. bgp_soft_reconfig_in (struct peer *peer, afi_t afi, safi_t safi)
  1332. {
  1333.   struct bgp_node *rn;
  1334.   struct bgp_table *table;
  1335.   if (peer->status != Established)
  1336.     return;
  1337.   if (safi != SAFI_MPLS_VPN)
  1338.     bgp_soft_reconfig_table (peer, afi, safi, NULL);
  1339.   else
  1340.     for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
  1341.  rn = bgp_route_next (rn))
  1342.       if ((table = rn->info) != NULL)
  1343. bgp_soft_reconfig_table (peer, afi, safi, table);
  1344. }
  1345. static void
  1346. bgp_clear_route_table (struct peer *peer, afi_t afi, safi_t safi,
  1347.        struct bgp_table *table)
  1348. {
  1349.   struct bgp_node *rn;
  1350.   struct bgp_adj_in *ain;
  1351.   struct bgp_adj_out *aout;
  1352.   struct bgp_info *ri;
  1353.   if (! table)
  1354.     table = peer->bgp->rib[afi][safi];
  1355.   for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
  1356.     {
  1357.       for (ri = rn->info; ri; ri = ri->next)
  1358. if (ri->peer == peer)
  1359.   {
  1360.     /* graceful restart STALE flag set. */
  1361.     if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT)
  1362. && peer->nsf[afi][safi]
  1363. && ! CHECK_FLAG (ri->flags, BGP_INFO_STALE)
  1364. && ! CHECK_FLAG (ri->flags, BGP_INFO_HISTORY)
  1365. && ! CHECK_FLAG (ri->flags, BGP_INFO_DAMPED))
  1366.       {
  1367. SET_FLAG (ri->flags, BGP_INFO_STALE);
  1368. peer->pcount[afi][safi]--;
  1369.       }
  1370.     else
  1371.       bgp_rib_remove (rn, ri, peer, afi, safi);
  1372.     break;
  1373.   }
  1374.       for (ain = rn->adj_in; ain; ain = ain->next)
  1375. if (ain->peer == peer)
  1376.   {
  1377.     bgp_adj_in_remove (rn, ain);
  1378.     bgp_unlock_node (rn);
  1379.     break;
  1380.   }
  1381.       for (aout = rn->adj_out; aout; aout = aout->next)
  1382. if (aout->peer == peer)
  1383.   {
  1384.     bgp_adj_out_remove (rn, aout, peer, afi, safi);
  1385.     bgp_unlock_node (rn);
  1386.     break;
  1387.   }
  1388.     }
  1389. }
  1390. void
  1391. bgp_clear_route (struct peer *peer, afi_t afi, safi_t safi)
  1392. {
  1393.   struct bgp_node *rn;
  1394.   struct bgp_table *table;
  1395.   if (safi != SAFI_MPLS_VPN)
  1396.     bgp_clear_route_table (peer, afi, safi, NULL);
  1397.   else
  1398.     for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
  1399.  rn = bgp_route_next (rn))
  1400.       if ((table = rn->info) != NULL)
  1401. bgp_clear_route_table (peer, afi, safi, table);
  1402. }
  1403.   
  1404. void
  1405. bgp_clear_route_all (struct peer *peer)
  1406. {
  1407.   afi_t afi;
  1408.   safi_t safi;
  1409.   for (afi = AFI_IP; afi < AFI_MAX; afi++)
  1410.     for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
  1411.       bgp_clear_route (peer, afi, safi);
  1412. }
  1413. void
  1414. bgp_clear_adj_in (struct peer *peer, afi_t afi, safi_t safi)
  1415. {
  1416.   struct bgp_table *table;
  1417.   struct bgp_node *rn;
  1418.   struct bgp_adj_in *ain;
  1419.   table = peer->bgp->rib[afi][safi];
  1420.   for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
  1421.     for (ain = rn->adj_in; ain ; ain = ain->next)
  1422.       if (ain->peer == peer)
  1423. {
  1424.           bgp_adj_in_remove (rn, ain);
  1425.           bgp_unlock_node (rn);
  1426.           break;
  1427. }
  1428. }
  1429. void
  1430. bgp_clear_stale_route (struct peer *peer, afi_t afi, safi_t safi)
  1431. {
  1432.   struct bgp_node *rn;
  1433.   struct bgp_info *ri;
  1434.   struct bgp_table *table;
  1435.   table = peer->bgp->rib[afi][safi];
  1436.   for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
  1437.     {
  1438.       for (ri = rn->info; ri; ri = ri->next)
  1439. if (ri->peer == peer)
  1440.   {
  1441.     if (CHECK_FLAG (ri->flags, BGP_INFO_STALE))
  1442.       bgp_rib_remove (rn, ri, peer, afi, safi);
  1443.     break;
  1444.   }
  1445.     }
  1446. }
  1447. /* Delete all kernel routes. */
  1448. void
  1449. bgp_terminate ()
  1450. {
  1451.   struct bgp *bgp;
  1452.   struct listnode *nn;
  1453.   struct bgp_node *rn;
  1454.   struct bgp_table *table;
  1455.   struct bgp_info *ri;
  1456.   LIST_LOOP (bm->bgp, bgp, nn)
  1457.     {
  1458.       table = bgp->rib[AFI_IP][SAFI_UNICAST];
  1459.       for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
  1460. for (ri = rn->info; ri; ri = ri->next)
  1461.   if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
  1462.       && ri->type == ZEBRA_ROUTE_BGP 
  1463.       && ri->sub_type == BGP_ROUTE_NORMAL)
  1464.     bgp_zebra_withdraw (&rn->p, ri);
  1465.       table = bgp->rib[AFI_IP6][SAFI_UNICAST];
  1466.       for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
  1467. for (ri = rn->info; ri; ri = ri->next)
  1468.   if (CHECK_FLAG (ri->flags, BGP_INFO_SELECTED)
  1469.       && ri->type == ZEBRA_ROUTE_BGP 
  1470.       && ri->sub_type == BGP_ROUTE_NORMAL)
  1471.     bgp_zebra_withdraw (&rn->p, ri);
  1472.     }
  1473. }
  1474. void
  1475. bgp_reset ()
  1476. {
  1477.   vty_reset ();
  1478.   bgp_zclient_reset ();
  1479.   access_list_reset ();
  1480.   prefix_list_reset ();
  1481. }
  1482. /* Parse NLRI stream.  Withdraw NLRI is recognized by NULL attr
  1483.    value. */
  1484. int
  1485. bgp_nlri_parse (struct peer *peer, struct attr *attr, struct bgp_nlri *packet)
  1486. {
  1487.   u_char *pnt;
  1488.   u_char *lim;
  1489.   struct prefix p;
  1490.   int psize;
  1491.   int ret;
  1492.   /* Check peer status. */
  1493.   if (peer->status != Established)
  1494.     return 0;
  1495.   
  1496.   pnt = packet->nlri;
  1497.   lim = pnt + packet->length;
  1498.   for (; pnt < lim; pnt += psize)
  1499.     {
  1500.       /* Clear prefix structure. */
  1501.       memset (&p, 0, sizeof (struct prefix));
  1502.       /* Fetch prefix length. */
  1503.       p.prefixlen = *pnt++;
  1504.       p.family = afi2family (packet->afi);
  1505.       
  1506.       /* Already checked in nlri_sanity_check().  We do double check
  1507.          here. */
  1508.       if ((packet->afi == AFI_IP && p.prefixlen > 32)
  1509.   || (packet->afi == AFI_IP6 && p.prefixlen > 128))
  1510. return -1;
  1511.       /* Packet size overflow check. */
  1512.       psize = PSIZE (p.prefixlen);
  1513.       /* When packet overflow occur return immediately. */
  1514.       if (pnt + psize > lim)
  1515. return -1;
  1516.       /* Fetch prefix from NLRI packet. */
  1517.       memcpy (&p.u.prefix, pnt, psize);
  1518.       /* Check address. */
  1519.       if (packet->afi == AFI_IP && packet->safi == SAFI_UNICAST)
  1520. {
  1521.   if (IN_CLASSD (ntohl (p.u.prefix4.s_addr)))
  1522.     {
  1523.       zlog (peer->log, LOG_ERR, 
  1524.     "IPv4 unicast NLRI is multicast address %s",
  1525.     inet_ntoa (p.u.prefix4));
  1526.       bgp_notify_send (peer, 
  1527.        BGP_NOTIFY_UPDATE_ERR, 
  1528.        BGP_NOTIFY_UPDATE_INVAL_NETWORK);
  1529.       return -1;
  1530.     }
  1531. }
  1532. #ifdef HAVE_IPV6
  1533.       /* Check address. */
  1534.       if (packet->afi == AFI_IP6 && packet->safi == SAFI_UNICAST)
  1535. {
  1536.   if (IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
  1537.     {
  1538.       char buf[BUFSIZ];
  1539.       zlog (peer->log, LOG_WARNING, 
  1540.     "IPv6 link-local NLRI received %s ignore this NLRI",
  1541.     inet_ntop (AF_INET6, &p.u.prefix6, buf, BUFSIZ));
  1542.       continue;
  1543.     }
  1544. }
  1545. #endif /* HAVE_IPV6 */
  1546.       /* Normal process. */
  1547.       if (attr)
  1548. ret = bgp_update (peer, &p, attr, packet->afi, packet->safi, 
  1549.   ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL, 0);
  1550.       else
  1551. ret = bgp_withdraw (peer, &p, attr, packet->afi, packet->safi, 
  1552.     ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
  1553.       /* Address family configuration mismatch or maximum-prefix count
  1554.          overflow. */
  1555.       if (ret < 0)
  1556. return -1;
  1557.     }
  1558.   /* Packet length consistency check. */
  1559.   if (pnt != lim)
  1560.     return -1;
  1561.   return 0;
  1562. }
  1563. /* NLRI encode syntax check routine. */
  1564. int
  1565. bgp_nlri_sanity_check (struct peer *peer, int afi, u_char *pnt,
  1566.        bgp_size_t length)
  1567. {
  1568.   u_char *end;
  1569.   u_char prefixlen;
  1570.   int psize;
  1571.   end = pnt + length;
  1572.   /* RFC1771 6.3 The NLRI field in the UPDATE message is checked for
  1573.      syntactic validity.  If the field is syntactically incorrect,
  1574.      then the Error Subcode is set to Invalid Network Field. */
  1575.   while (pnt < end)
  1576.     {
  1577.       prefixlen = *pnt++;
  1578.       
  1579.       /* Prefix length check. */
  1580.       if ((afi == AFI_IP && prefixlen > 32)
  1581.   || (afi == AFI_IP6 && prefixlen > 128))
  1582. {
  1583.   plog_err (peer->log, 
  1584.     "%s [Error] Update packet error (wrong prefix length %d)",
  1585.     peer->host, prefixlen);
  1586.   bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR, 
  1587.    BGP_NOTIFY_UPDATE_INVAL_NETWORK);
  1588.   return -1;
  1589. }
  1590.       /* Packet size overflow check. */
  1591.       psize = PSIZE (prefixlen);
  1592.       if (pnt + psize > end)
  1593. {
  1594.   plog_err (peer->log, 
  1595.     "%s [Error] Update packet error"
  1596.     " (prefix data overflow prefix size is %d)",
  1597.     peer->host, psize);
  1598.   bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR, 
  1599.    BGP_NOTIFY_UPDATE_INVAL_NETWORK);
  1600.   return -1;
  1601. }
  1602.       pnt += psize;
  1603.     }
  1604.   /* Packet length consistency check. */
  1605.   if (pnt != end)
  1606.     {
  1607.       plog_err (peer->log,
  1608. "%s [Error] Update packet error"
  1609. " (prefix length mismatch with total length)",
  1610. peer->host);
  1611.       bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR, 
  1612.        BGP_NOTIFY_UPDATE_INVAL_NETWORK);
  1613.       return -1;
  1614.     }
  1615.   return 0;
  1616. }
  1617. struct bgp_static *
  1618. bgp_static_new ()
  1619. {
  1620.   struct bgp_static *new;
  1621.   new = XMALLOC (MTYPE_BGP_STATIC, sizeof (struct bgp_static));
  1622.   memset (new, 0, sizeof (struct bgp_static));
  1623.   return new;
  1624. }
  1625. void
  1626. bgp_static_free (struct bgp_static *bgp_static)
  1627. {
  1628.   if (bgp_static->rmap.name)
  1629.     free (bgp_static->rmap.name);
  1630.   XFREE (MTYPE_BGP_STATIC, bgp_static);
  1631. }
  1632. void
  1633. bgp_static_update (struct bgp *bgp, struct prefix *p,
  1634.    struct bgp_static *bgp_static, afi_t afi, safi_t safi)
  1635. {
  1636.   struct bgp_node *rn;
  1637.   struct bgp_info *ri;
  1638.   struct bgp_info *new;
  1639.   struct bgp_info info;
  1640.   struct attr attr;
  1641.   struct attr attr_tmp;
  1642.   struct attr *attr_new;
  1643.   int ret;
  1644.   rn = bgp_afi_node_get (bgp, afi, safi, p, NULL);
  1645.   bgp_attr_default_set (&attr, BGP_ORIGIN_IGP);
  1646.   if (bgp_static)
  1647.     {
  1648.       attr.nexthop = bgp_static->igpnexthop;
  1649.       attr.med = bgp_static->igpmetric;
  1650.       attr.flag |= ATTR_FLAG_BIT (BGP_ATTR_MULTI_EXIT_DISC);
  1651.     }
  1652.   /* Apply route-map. */
  1653.   if (bgp_static->rmap.name)
  1654.     {
  1655.       attr_tmp = attr;
  1656.       info.peer = bgp->peer_self;
  1657.       info.attr = &attr_tmp;
  1658.       ret = route_map_apply (bgp_static->rmap.map, p, RMAP_BGP, &info);
  1659.       if (ret == RMAP_DENYMATCH)
  1660. {    
  1661.   /* Free uninterned attribute. */
  1662.   bgp_attr_flush (&attr_tmp);
  1663.   /* Unintern original. */
  1664.   aspath_unintern (attr.aspath);
  1665.   bgp_static_withdraw (bgp, p, afi, safi);
  1666.   return;
  1667. }
  1668.       attr_new = bgp_attr_intern (&attr_tmp);
  1669.     }
  1670.   else
  1671.     attr_new = bgp_attr_intern (&attr);
  1672.   for (ri = rn->info; ri; ri = ri->next)
  1673.     if (ri->peer == bgp->peer_self && ri->type == ZEBRA_ROUTE_BGP
  1674. && ri->sub_type == BGP_ROUTE_STATIC)
  1675.       break;
  1676.   if (ri)
  1677.     {
  1678.       if (attrhash_cmp (ri->attr, attr_new))
  1679. {
  1680.   bgp_unlock_node (rn);
  1681.   bgp_attr_unintern (attr_new);
  1682.   aspath_unintern (attr.aspath);
  1683.   return;
  1684. }
  1685.       else
  1686. {
  1687.   /* The attribute is changed. */
  1688.   SET_FLAG (ri->flags, BGP_INFO_ATTR_CHANGED);
  1689.   /* Rewrite BGP route information. */
  1690.   bgp_aggregate_decrement (bgp, p, ri, afi, safi);
  1691.   bgp_attr_unintern (ri->attr);
  1692.   ri->attr = attr_new;
  1693.   ri->uptime = time (NULL);
  1694.   /* Process change. */
  1695.   bgp_aggregate_increment (bgp, p, ri, afi, safi);
  1696.   bgp_process (bgp, rn, afi, safi);
  1697.   bgp_unlock_node (rn);
  1698.   aspath_unintern (attr.aspath);
  1699.   return;
  1700. }
  1701.     }
  1702.   /* Make new BGP info. */
  1703.   new = bgp_info_new ();
  1704.   new->type = ZEBRA_ROUTE_BGP;
  1705.   new->sub_type = BGP_ROUTE_STATIC;
  1706.   new->peer = bgp->peer_self;
  1707.   SET_FLAG (new->flags, BGP_INFO_VALID);
  1708.   new->attr = attr_new;
  1709.   new->uptime = time (NULL);
  1710.   /* Aggregate address increment. */
  1711.   bgp_aggregate_increment (bgp, p, new, afi, safi);
  1712.   
  1713.   /* Register new BGP information. */
  1714.   bgp_info_add (rn, new);
  1715.   /* Process change. */
  1716.   bgp_process (bgp, rn, afi, safi);
  1717.   /* Unintern original. */
  1718.   aspath_unintern (attr.aspath);
  1719. }
  1720. void
  1721. bgp_static_update_vpnv4 (struct bgp *bgp, struct prefix *p, u_int16_t afi,
  1722.  u_char safi, struct prefix_rd *prd, u_char *tag)
  1723. {
  1724.   struct bgp_node *rn;
  1725.   struct bgp_info *new;
  1726.   rn = bgp_afi_node_get (bgp, afi, safi, p, prd);
  1727.   /* Make new BGP info. */
  1728.   new = bgp_info_new ();
  1729.   new->type = ZEBRA_ROUTE_BGP;
  1730.   new->sub_type = BGP_ROUTE_STATIC;
  1731.   new->peer = bgp->peer_self;
  1732.   new->attr = bgp_attr_default_intern (BGP_ORIGIN_IGP);
  1733.   SET_FLAG (new->flags, BGP_INFO_VALID);
  1734.   new->uptime = time (NULL);
  1735.   memcpy (new->tag, tag, 3);
  1736.   /* Aggregate address increment. */
  1737.   bgp_aggregate_increment (bgp, p, (struct bgp_info *) new, afi, safi);
  1738.   
  1739.   /* Register new BGP information. */
  1740.   bgp_info_add (rn, (struct bgp_info *) new);
  1741.   /* Process change. */
  1742.   bgp_process (bgp, rn, afi, safi);
  1743. }
  1744. void
  1745. bgp_static_withdraw (struct bgp *bgp, struct prefix *p, afi_t afi,
  1746.      safi_t safi)
  1747. {
  1748.   struct bgp_node *rn;
  1749.   struct bgp_info *ri;
  1750.   rn = bgp_afi_node_get (bgp, afi, safi, p, NULL);
  1751.   /* Check selected route and self inserted route. */
  1752.   for (ri = rn->info; ri; ri = ri->next)
  1753.     if (ri->peer == bgp->peer_self 
  1754. && ri->type == ZEBRA_ROUTE_BGP
  1755. && ri->sub_type == BGP_ROUTE_STATIC)
  1756.       break;
  1757.   /* Withdraw static BGP route from routing table. */
  1758.   if (ri)
  1759.     {
  1760.       bgp_aggregate_decrement (bgp, p, ri, afi, safi);
  1761.       UNSET_FLAG (ri->flags, BGP_INFO_VALID);
  1762.       bgp_process (bgp, rn, afi, safi);
  1763.       bgp_info_delete (rn, ri);
  1764.       bgp_info_free (ri);
  1765.       bgp_unlock_node (rn);
  1766.     }
  1767.   /* Unlock bgp_node_lookup. */
  1768.   bgp_unlock_node (rn);
  1769. }
  1770. void
  1771. bgp_static_withdraw_vpnv4 (struct bgp *bgp, struct prefix *p, u_int16_t afi,
  1772.    u_char safi, struct prefix_rd *prd, u_char *tag)
  1773. {
  1774.   struct bgp_node *rn;
  1775.   struct bgp_info *ri;
  1776.   rn = bgp_afi_node_get (bgp, afi, safi, p, prd);
  1777.   /* Check selected route and self inserted route. */
  1778.   for (ri = rn->info; ri; ri = ri->next)
  1779.     if (ri->peer == bgp->peer_self 
  1780. && ri->type == ZEBRA_ROUTE_BGP
  1781. && ri->sub_type == BGP_ROUTE_STATIC)
  1782.       break;
  1783.   /* Withdraw static BGP route from routing table. */
  1784.   if (ri)
  1785.     {
  1786.       bgp_aggregate_decrement (bgp, p, ri, afi, safi);
  1787.       UNSET_FLAG (ri->flags, BGP_INFO_VALID);
  1788.       bgp_process (bgp, rn, afi, safi);
  1789.       bgp_info_delete (rn, ri);
  1790.       bgp_info_free (ri);
  1791.       bgp_unlock_node (rn);
  1792.     }
  1793.   /* Unlock bgp_node_lookup. */
  1794.   bgp_unlock_node (rn);
  1795. }
  1796. /* Configure static BGP network.  When user don't run zebra, static
  1797.    route should be installed as valid.  */
  1798. int
  1799. bgp_static_set (struct vty *vty, struct bgp *bgp, char *ip_str, u_int16_t afi,
  1800. u_char safi, char *rmap, int backdoor)
  1801. {
  1802.   int ret;
  1803.   struct prefix p;
  1804.   struct bgp_static *bgp_static;
  1805.   struct bgp_node *rn;
  1806.   int need_update = 0;
  1807.   /* Convert IP prefix string to struct prefix. */
  1808.   ret = str2prefix (ip_str, &p);
  1809.   if (! ret)
  1810.     {
  1811.       vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
  1812.       return CMD_WARNING;
  1813.     }
  1814. #ifdef HAVE_IPV6
  1815.   if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
  1816.     {
  1817.       vty_out (vty, "%% Malformed prefix (link-local address)%s",
  1818.        VTY_NEWLINE);
  1819.       return CMD_WARNING;
  1820.     }
  1821. #endif /* HAVE_IPV6 */
  1822.   apply_mask (&p);
  1823.   /* Set BGP static route configuration. */
  1824.   rn = bgp_node_get (bgp->route[afi][safi], &p);
  1825.   if (rn->info)
  1826.     {
  1827.       /* Configuration change. */
  1828.       bgp_static = rn->info;
  1829.       /* Check previous routes are installed into BGP.  */
  1830.       if (! bgp_static->backdoor && bgp_static->valid)
  1831. need_update = 1;
  1832.       bgp_static->backdoor = backdoor;
  1833.       if (rmap)
  1834. {
  1835.   if (bgp_static->rmap.name)
  1836.     free (bgp_static->rmap.name);
  1837.   bgp_static->rmap.name = strdup (rmap);
  1838.   bgp_static->rmap.map = route_map_lookup_by_name (rmap);
  1839. }
  1840.       else
  1841. {
  1842.   if (bgp_static->rmap.name)
  1843.     free (bgp_static->rmap.name);
  1844.   bgp_static->rmap.name = NULL;
  1845.   bgp_static->rmap.map = NULL;
  1846.   bgp_static->valid = 0;
  1847. }
  1848.       bgp_unlock_node (rn);
  1849.     }
  1850.   else
  1851.     {
  1852.       /* New configuration. */
  1853.       bgp_static = bgp_static_new ();
  1854.       bgp_static->backdoor = backdoor;
  1855.       bgp_static->valid = 0;
  1856.       bgp_static->igpmetric = 0;
  1857.       bgp_static->igpnexthop.s_addr = 0;
  1858.       if (rmap)
  1859. {
  1860.   if (bgp_static->rmap.name)
  1861.     free (bgp_static->rmap.name);
  1862.   bgp_static->rmap.name = strdup (rmap);
  1863.   bgp_static->rmap.map = route_map_lookup_by_name (rmap);
  1864. }
  1865.       rn->info = bgp_static;
  1866.     }
  1867.   /* If BGP scan is not enabled, we should install this route here.  */
  1868.   if (! bgp_flag_check (bgp, BGP_FLAG_IMPORT_CHECK))
  1869.     {
  1870.       bgp_static->valid = 1;
  1871.       if (need_update)
  1872. bgp_static_withdraw (bgp, &p, afi, safi);
  1873.       if (! bgp_static->backdoor)
  1874. bgp_static_update (bgp, &p, bgp_static, afi, safi);
  1875.     }
  1876.   return CMD_SUCCESS;
  1877. }
  1878. /* Configure static BGP network. */
  1879. int
  1880. bgp_static_unset (struct vty *vty, struct bgp *bgp, char *ip_str,
  1881.   u_int16_t afi, u_char safi)
  1882. {
  1883.   int ret;
  1884.   struct prefix p;
  1885.   struct bgp_static *bgp_static;
  1886.   struct bgp_node *rn;
  1887.   /* Convert IP prefix string to struct prefix. */
  1888.   ret = str2prefix (ip_str, &p);
  1889.   if (! ret)
  1890.     {
  1891.       vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
  1892.       return CMD_WARNING;
  1893.     }
  1894. #ifdef HAVE_IPV6
  1895.   if (afi == AFI_IP6 && IN6_IS_ADDR_LINKLOCAL (&p.u.prefix6))
  1896.     {
  1897.       vty_out (vty, "%% Malformed prefix (link-local address)%s",
  1898.        VTY_NEWLINE);
  1899.       return CMD_WARNING;
  1900.     }
  1901. #endif /* HAVE_IPV6 */
  1902.   apply_mask (&p);
  1903.   rn = bgp_node_lookup (bgp->route[afi][safi], &p);
  1904.   if (! rn)
  1905.     {
  1906.       vty_out (vty, "%% Can't find specified static route configuration.%s",
  1907.        VTY_NEWLINE);
  1908.       return CMD_WARNING;
  1909.     }
  1910.   bgp_static = rn->info;
  1911.   /* Update BGP RIB. */
  1912.   if (! bgp_static->backdoor)
  1913.     bgp_static_withdraw (bgp, &p, afi, safi);
  1914.   /* Clear configuration. */
  1915.   bgp_static_free (bgp_static);
  1916.   rn->info = NULL;
  1917.   bgp_unlock_node (rn);
  1918.   bgp_unlock_node (rn);
  1919.   return CMD_SUCCESS;
  1920. }
  1921. /* Called from bgp_delete().  Delete all static routes from the BGP
  1922.    instance. */
  1923. void
  1924. bgp_static_delete (struct bgp *bgp)
  1925. {
  1926.   afi_t afi;
  1927.   safi_t safi;
  1928.   struct bgp_node *rn;
  1929.   struct bgp_node *rm;
  1930.   struct bgp_table *table;
  1931.   struct bgp_static *bgp_static;
  1932.   for (afi = AFI_IP; afi < AFI_MAX; afi++)
  1933.     for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
  1934.       for (rn = bgp_table_top (bgp->route[afi][safi]); rn; rn = bgp_route_next (rn))
  1935. if (rn->info != NULL)
  1936.   {      
  1937.     if (safi == SAFI_MPLS_VPN)
  1938.       {
  1939. table = rn->info;
  1940. for (rm = bgp_table_top (table); rm; rm = bgp_route_next (rm))
  1941.   {
  1942.     bgp_static = rn->info;
  1943.     bgp_static_withdraw_vpnv4 (bgp, &rm->p,
  1944.        AFI_IP, SAFI_MPLS_VPN,
  1945.        (struct prefix_rd *)&rn->p,
  1946.        bgp_static->tag);
  1947.     bgp_static_free (bgp_static);
  1948.     rn->info = NULL;
  1949.     bgp_unlock_node (rn);
  1950.   }
  1951.       }
  1952.     else
  1953.       {
  1954. bgp_static = rn->info;
  1955. bgp_static_withdraw (bgp, &rn->p, afi, safi);
  1956. bgp_static_free (bgp_static);
  1957. rn->info = NULL;
  1958. bgp_unlock_node (rn);
  1959.       }
  1960.   }
  1961. }
  1962. int
  1963. bgp_static_set_vpnv4 (struct vty *vty, char *ip_str, char *rd_str,
  1964.       char *tag_str)
  1965. {
  1966.   int ret;
  1967.   struct prefix p;
  1968.   struct prefix_rd prd;
  1969.   struct bgp *bgp;
  1970.   struct bgp_node *prn;
  1971.   struct bgp_node *rn;
  1972.   struct bgp_table *table;
  1973.   struct bgp_static *bgp_static;
  1974.   u_char tag[3];
  1975.   bgp = vty->index;
  1976.   ret = str2prefix (ip_str, &p);
  1977.   if (! ret)
  1978.     {
  1979.       vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
  1980.       return CMD_WARNING;
  1981.     }
  1982.   apply_mask (&p);
  1983.   ret = str2prefix_rd (rd_str, &prd);
  1984.   if (! ret)
  1985.     {
  1986.       vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
  1987.       return CMD_WARNING;
  1988.     }
  1989.   ret = str2tag (tag_str, tag);
  1990.   if (! ret)
  1991.     {
  1992.       vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
  1993.       return CMD_WARNING;
  1994.     }
  1995.   prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
  1996. (struct prefix *)&prd);
  1997.   if (prn->info == NULL)
  1998.     prn->info = bgp_table_init ();
  1999.   else
  2000.     bgp_unlock_node (prn);
  2001.   table = prn->info;
  2002.   rn = bgp_node_get (table, &p);
  2003.   if (rn->info)
  2004.     {
  2005.       vty_out (vty, "%% Same network configuration exists%s", VTY_NEWLINE);
  2006.       bgp_unlock_node (rn);
  2007.     }
  2008.   else
  2009.     {
  2010.       /* New configuration. */
  2011.       bgp_static = bgp_static_new ();
  2012.       bgp_static->valid = 1;
  2013.       memcpy (bgp_static->tag, tag, 3);
  2014.       rn->info = bgp_static;
  2015.       bgp_static_update_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
  2016.     }
  2017.   return CMD_SUCCESS;
  2018. }
  2019. /* Configure static BGP network. */
  2020. int
  2021. bgp_static_unset_vpnv4 (struct vty *vty, char *ip_str, char *rd_str,
  2022. char *tag_str)
  2023. {
  2024.   int ret;
  2025.   struct bgp *bgp;
  2026.   struct prefix p;
  2027.   struct prefix_rd prd;
  2028.   struct bgp_node *prn;
  2029.   struct bgp_node *rn;
  2030.   struct bgp_table *table;
  2031.   struct bgp_static *bgp_static;
  2032.   u_char tag[3];
  2033.   bgp = vty->index;
  2034.   /* Convert IP prefix string to struct prefix. */
  2035.   ret = str2prefix (ip_str, &p);
  2036.   if (! ret)
  2037.     {
  2038.       vty_out (vty, "%% Malformed prefix%s", VTY_NEWLINE);
  2039.       return CMD_WARNING;
  2040.     }
  2041.   apply_mask (&p);
  2042.   ret = str2prefix_rd (rd_str, &prd);
  2043.   if (! ret)
  2044.     {
  2045.       vty_out (vty, "%% Malformed rd%s", VTY_NEWLINE);
  2046.       return CMD_WARNING;
  2047.     }
  2048.   ret = str2tag (tag_str, tag);
  2049.   if (! ret)
  2050.     {
  2051.       vty_out (vty, "%% Malformed tag%s", VTY_NEWLINE);
  2052.       return CMD_WARNING;
  2053.     }
  2054.   prn = bgp_node_get (bgp->route[AFI_IP][SAFI_MPLS_VPN],
  2055. (struct prefix *)&prd);
  2056.   if (prn->info == NULL)
  2057.     prn->info = bgp_table_init ();
  2058.   else
  2059.     bgp_unlock_node (prn);
  2060.   table = prn->info;
  2061.   rn = bgp_node_lookup (table, &p);
  2062.   if (rn)
  2063.     {
  2064.       bgp_static_withdraw_vpnv4 (bgp, &p, AFI_IP, SAFI_MPLS_VPN, &prd, tag);
  2065.       bgp_static = rn->info;
  2066.       bgp_static_free (bgp_static);
  2067.       rn->info = NULL;
  2068.       bgp_unlock_node (rn);
  2069.       bgp_unlock_node (rn);
  2070.     }
  2071.   else
  2072.     vty_out (vty, "%% Can't find the route%s", VTY_NEWLINE);
  2073.   return CMD_SUCCESS;
  2074. }
  2075. DEFUN (bgp_network,
  2076.        bgp_network_cmd,
  2077.        "network A.B.C.D/M",
  2078.        "Specify a network to announce via BGPn"
  2079.        "IP prefix <network>/<length>, e.g., 35.0.0.0/8n")
  2080. {
  2081.   return bgp_static_set (vty, vty->index, argv[0],
  2082.  AFI_IP, bgp_node_safi (vty), NULL, 0);
  2083. }
  2084. DEFUN (bgp_network_route_map,
  2085.        bgp_network_route_map_cmd,
  2086.        "network A.B.C.D/M route-map WORD",
  2087.        "Specify a network to announce via BGPn"
  2088.        "IP prefix <network>/<length>, e.g., 35.0.0.0/8n"
  2089.        "Route-map to modify the attributesn"
  2090.        "Name of the route mapn")
  2091. {
  2092.   return bgp_static_set (vty, vty->index, argv[0],
  2093.  AFI_IP, bgp_node_safi (vty), argv[1], 0);
  2094. }
  2095. DEFUN (bgp_network_backdoor,
  2096.        bgp_network_backdoor_cmd,
  2097.        "network A.B.C.D/M backdoor",
  2098.        "Specify a network to announce via BGPn"
  2099.        "IP prefix <network>/<length>, e.g., 35.0.0.0/8n"
  2100.        "Specify a BGP backdoor routen")
  2101. {
  2102.   return bgp_static_set (vty, vty->index, argv[0], AFI_IP, SAFI_UNICAST, NULL, 1);
  2103. }
  2104. DEFUN (bgp_network_mask,
  2105.        bgp_network_mask_cmd,
  2106.        "network A.B.C.D mask A.B.C.D",
  2107.        "Specify a network to announce via BGPn"
  2108.        "Network numbern"
  2109.        "Network maskn"
  2110.        "Network maskn")
  2111. {
  2112.   int ret;
  2113.   char prefix_str[BUFSIZ];
  2114.   ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
  2115.   if (! ret)
  2116.     {
  2117.       vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
  2118.       return CMD_WARNING;
  2119.     }
  2120.   return bgp_static_set (vty, vty->index, prefix_str,
  2121.  AFI_IP, bgp_node_safi (vty), NULL, 0);
  2122. }
  2123. DEFUN (bgp_network_mask_route_map,
  2124.        bgp_network_mask_route_map_cmd,
  2125.        "network A.B.C.D mask A.B.C.D route-map WORD",
  2126.        "Specify a network to announce via BGPn"
  2127.        "Network numbern"
  2128.        "Network maskn"
  2129.        "Network maskn"
  2130.        "Route-map to modify the attributesn"
  2131.        "Name of the route mapn")
  2132. {
  2133.   int ret;
  2134.   char prefix_str[BUFSIZ];
  2135.   ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
  2136.   if (! ret)
  2137.     {
  2138.       vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
  2139.       return CMD_WARNING;
  2140.     }
  2141.   return bgp_static_set (vty, vty->index, prefix_str,
  2142.  AFI_IP, bgp_node_safi (vty), argv[2], 0);
  2143. }
  2144. DEFUN (bgp_network_mask_backdoor,
  2145.        bgp_network_mask_backdoor_cmd,
  2146.        "network A.B.C.D mask A.B.C.D backdoor",
  2147.        "Specify a network to announce via BGPn"
  2148.        "Network numbern"
  2149.        "Network maskn"
  2150.        "Network maskn"
  2151.        "Specify a BGP backdoor routen")
  2152. {
  2153.   int ret;
  2154.   char prefix_str[BUFSIZ];
  2155.   ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
  2156.   if (! ret)
  2157.     {
  2158.       vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
  2159.       return CMD_WARNING;
  2160.     }
  2161.   return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST, NULL, 1);
  2162. }
  2163. DEFUN (bgp_network_mask_natural,
  2164.        bgp_network_mask_natural_cmd,
  2165.        "network A.B.C.D",
  2166.        "Specify a network to announce via BGPn"
  2167.        "Network numbern")
  2168. {
  2169.   int ret;
  2170.   char prefix_str[BUFSIZ];
  2171.   ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
  2172.   if (! ret)
  2173.     {
  2174.       vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
  2175.       return CMD_WARNING;
  2176.     }
  2177.   return bgp_static_set (vty, vty->index, prefix_str,
  2178.  AFI_IP, bgp_node_safi (vty), NULL, 0);
  2179. }
  2180. DEFUN (bgp_network_mask_natural_route_map,
  2181.        bgp_network_mask_natural_route_map_cmd,
  2182.        "network A.B.C.D route-map WORD",
  2183.        "Specify a network to announce via BGPn"
  2184.        "Network numbern"
  2185.        "Route-map to modify the attributesn"
  2186.        "Name of the route mapn")
  2187. {
  2188.   int ret;
  2189.   char prefix_str[BUFSIZ];
  2190.   ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
  2191.   if (! ret)
  2192.     {
  2193.       vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
  2194.       return CMD_WARNING;
  2195.     }
  2196.   return bgp_static_set (vty, vty->index, prefix_str,
  2197.  AFI_IP, bgp_node_safi (vty), argv[1], 0);
  2198. }
  2199. DEFUN (bgp_network_mask_natural_backdoor,
  2200.        bgp_network_mask_natural_backdoor_cmd,
  2201.        "network A.B.C.D backdoor",
  2202.        "Specify a network to announce via BGPn"
  2203.        "Network numbern"
  2204.        "Specify a BGP backdoor routen")
  2205. {
  2206.   int ret;
  2207.   char prefix_str[BUFSIZ];
  2208.   ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
  2209.   if (! ret)
  2210.     {
  2211.       vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
  2212.       return CMD_WARNING;
  2213.     }
  2214.   return bgp_static_set (vty, vty->index, prefix_str, AFI_IP, SAFI_UNICAST, NULL, 1);
  2215. }
  2216. DEFUN (no_bgp_network,
  2217.        no_bgp_network_cmd,
  2218.        "no network A.B.C.D/M",
  2219.        NO_STR
  2220.        "Specify a network to announce via BGPn"
  2221.        "IP prefix <network>/<length>, e.g., 35.0.0.0/8n")
  2222. {
  2223.   return bgp_static_unset (vty, vty->index, argv[0], AFI_IP, 
  2224.    bgp_node_safi (vty));
  2225. }
  2226. ALIAS (no_bgp_network,
  2227.        no_bgp_network_route_map_cmd,
  2228.        "no network A.B.C.D/M route-map WORD",
  2229.        NO_STR
  2230.        "Specify a network to announce via BGPn"
  2231.        "IP prefix <network>/<length>, e.g., 35.0.0.0/8n"
  2232.        "Route-map to modify the attributesn"
  2233.        "Name of the route mapn");
  2234. ALIAS (no_bgp_network,
  2235.        no_bgp_network_backdoor_cmd,
  2236.        "no network A.B.C.D/M backdoor",
  2237.        NO_STR
  2238.        "Specify a network to announce via BGPn"
  2239.        "IP prefix <network>/<length>, e.g., 35.0.0.0/8n"
  2240.        "Specify a BGP backdoor routen");
  2241. DEFUN (no_bgp_network_mask,
  2242.        no_bgp_network_mask_cmd,
  2243.        "no network A.B.C.D mask A.B.C.D",
  2244.        NO_STR
  2245.        "Specify a network to announce via BGPn"
  2246.        "Network numbern"
  2247.        "Network maskn"
  2248.        "Network maskn")
  2249. {
  2250.   int ret;
  2251.   char prefix_str[BUFSIZ];
  2252.   ret = netmask_str2prefix_str (argv[0], argv[1], prefix_str);
  2253.   if (! ret)
  2254.     {
  2255.       vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
  2256.       return CMD_WARNING;
  2257.     }
  2258.   return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP, 
  2259.    bgp_node_safi (vty));
  2260. }
  2261. ALIAS (no_bgp_network_mask,
  2262.        no_bgp_network_mask_route_map_cmd,
  2263.        "no network A.B.C.D mask A.B.C.D route-map WORD",
  2264.        NO_STR
  2265.        "Specify a network to announce via BGPn"
  2266.        "Network numbern"
  2267.        "Network maskn"
  2268.        "Network maskn"
  2269.        "Route-map to modify the attributesn"
  2270.        "Name of the route mapn");
  2271. ALIAS (no_bgp_network_mask,
  2272.        no_bgp_network_mask_backdoor_cmd,
  2273.        "no network A.B.C.D mask A.B.C.D backdoor",
  2274.        NO_STR
  2275.        "Specify a network to announce via BGPn"
  2276.        "Network numbern"
  2277.        "Network maskn"
  2278.        "Network maskn"
  2279.        "Specify a BGP backdoor routen");
  2280. DEFUN (no_bgp_network_mask_natural,
  2281.        no_bgp_network_mask_natural_cmd,
  2282.        "no network A.B.C.D",
  2283.        NO_STR
  2284.        "Specify a network to announce via BGPn"
  2285.        "Network numbern")
  2286. {
  2287.   int ret;
  2288.   char prefix_str[BUFSIZ];
  2289.   ret = netmask_str2prefix_str (argv[0], NULL, prefix_str);
  2290.   if (! ret)
  2291.     {
  2292.       vty_out (vty, "%% Inconsistent address and mask%s", VTY_NEWLINE);
  2293.       return CMD_WARNING;
  2294.     }
  2295.   return bgp_static_unset (vty, vty->index, prefix_str, AFI_IP, 
  2296.    bgp_node_safi (vty));
  2297. }
  2298. ALIAS (no_bgp_network_mask_natural,
  2299.        no_bgp_network_mask_natural_route_map_cmd,
  2300.        "no network A.B.C.D route-map WORD",
  2301.        NO_STR
  2302.        "Specify a network to announce via BGPn"
  2303.        "Network numbern"
  2304.        "Route-map to modify the attributesn"
  2305.        "Name of the route mapn");
  2306. ALIAS (no_bgp_network_mask_natural,
  2307.        no_bgp_network_mask_natural_backdoor_cmd,
  2308.        "no network A.B.C.D backdoor",
  2309.        NO_STR
  2310.        "Specify a network to announce via BGPn"
  2311.        "Network numbern"
  2312.        "Specify a BGP backdoor routen");
  2313. #ifdef HAVE_IPV6
  2314. DEFUN (ipv6_bgp_network,
  2315.        ipv6_bgp_network_cmd,
  2316.        "network X:X::X:X/M",
  2317.        "Specify a network to announce via BGPn"
  2318.        "IPv6 prefix <network>/<length>n")
  2319. {
  2320.   return bgp_static_set (vty, vty->index, argv[0], AFI_IP6, SAFI_UNICAST, NULL, 0);
  2321. }
  2322. DEFUN (ipv6_bgp_network_route_map,
  2323.        ipv6_bgp_network_route_map_cmd,
  2324.        "network X:X::X:X/M route-map WORD",
  2325.        "Specify a network to announce via BGPn"
  2326.        "IPv6 prefix <network>/<length>n"
  2327.        "Route-map to modify the attributesn"
  2328.        "Name of the route mapn")
  2329. {
  2330.   return bgp_static_set (vty, vty->index, argv[0], AFI_IP6,
  2331.  bgp_node_safi (vty), argv[1], 0);
  2332. }
  2333. DEFUN (no_ipv6_bgp_network,
  2334.        no_ipv6_bgp_network_cmd,
  2335.        "no network X:X::X:X/M",
  2336.        NO_STR
  2337.        "Specify a network to announce via BGPn"
  2338.        "IPv6 prefix <network>/<length>n")
  2339. {
  2340.   return bgp_static_unset (vty, vty->index, argv[0], AFI_IP6, SAFI_UNICAST);
  2341. }
  2342. ALIAS (no_ipv6_bgp_network,
  2343.        no_ipv6_bgp_network_route_map_cmd,
  2344.        "no network X:X::X:X/M route-map WORD",
  2345.        NO_STR
  2346.        "Specify a network to announce via BGPn"
  2347.        "IPv6 prefix <network>/<length>n"
  2348.        "Route-map to modify the attributesn"
  2349.        "Name of the route mapn");
  2350. ALIAS (ipv6_bgp_network,
  2351.        old_ipv6_bgp_network_cmd,
  2352.        "ipv6 bgp network X:X::X:X/M",
  2353.        IPV6_STR
  2354.        BGP_STR
  2355.        "Specify a network to announce via BGPn"
  2356.        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16n");
  2357. ALIAS (no_ipv6_bgp_network,
  2358.        old_no_ipv6_bgp_network_cmd,
  2359.        "no ipv6 bgp network X:X::X:X/M",
  2360.        NO_STR
  2361.        IPV6_STR
  2362.        BGP_STR
  2363.        "Specify a network to announce via BGPn"
  2364.        "IPv6 prefix <network>/<length>, e.g., 3ffe::/16n");
  2365. #endif /* HAVE_IPV6 */
  2366. /* Aggreagete address:
  2367.   advertise-map  Set condition to advertise attribute
  2368.   as-set         Generate AS set path information
  2369.   attribute-map  Set attributes of aggregate
  2370.   route-map      Set parameters of aggregate
  2371.   summary-only   Filter more specific routes from updates
  2372.   suppress-map   Conditionally filter more specific routes from updates
  2373.   <cr>
  2374.  */
  2375. struct bgp_aggregate
  2376. {
  2377.   /* Summary-only flag. */
  2378.   u_char summary_only;
  2379.   /* AS set generation. */
  2380.   u_char as_set;
  2381.   /* Route-map for aggregated route. */
  2382.   struct route_map *map;
  2383.   /* Suppress-count. */
  2384.   unsigned long count;
  2385.   /* SAFI configuration. */
  2386.   safi_t safi;
  2387. };
  2388. struct bgp_aggregate *
  2389. bgp_aggregate_new ()
  2390. {
  2391.   struct bgp_aggregate *new;
  2392.   new = XMALLOC (MTYPE_BGP_AGGREGATE, sizeof (struct bgp_aggregate));
  2393.   memset (new, 0, sizeof (struct bgp_aggregate));
  2394.   return new;
  2395. }
  2396. void
  2397. bgp_aggregate_free (struct bgp_aggregate *aggregate)
  2398. {
  2399.   XFREE (MTYPE_BGP_AGGREGATE, aggregate);
  2400. }     
  2401. void
  2402. bgp_aggregate_route (struct bgp *bgp, struct prefix *p, struct bgp_info *rinew,
  2403.      afi_t afi, safi_t safi, struct bgp_info *del, 
  2404.      struct bgp_aggregate *aggregate)
  2405. {
  2406.   struct bgp_table *table;
  2407.   struct bgp_node *top;
  2408.   struct bgp_node *rn;
  2409.   u_char origin;
  2410.   struct aspath *aspath = NULL;
  2411.   struct aspath *asmerge = NULL;
  2412.   struct community *community = NULL;
  2413.   struct community *commerge = NULL;
  2414.   struct in_addr nexthop;
  2415.   u_int32_t med = 0;
  2416.   struct bgp_info *ri;
  2417.   struct bgp_info *new;
  2418.   int first = 1;
  2419.   unsigned long match = 0;
  2420.   /* Record adding route's nexthop and med. */
  2421.   if (rinew)
  2422.     {
  2423.       nexthop = rinew->attr->nexthop;
  2424.       med = rinew->attr->med;
  2425.     }
  2426.   /* ORIGIN attribute: If at least one route among routes that are
  2427.      aggregated has ORIGIN with the value INCOMPLETE, then the
  2428.      aggregated route must have the ORIGIN attribute with the value
  2429.      INCOMPLETE. Otherwise, if at least one route among routes that
  2430.      are aggregated has ORIGIN with the value EGP, then the aggregated
  2431.      route must have the origin attribute with the value EGP. In all
  2432.      other case the value of the ORIGIN attribute of the aggregated
  2433.      route is INTERNAL. */
  2434.   origin = BGP_ORIGIN_IGP;
  2435.   table = bgp->rib[afi][safi];
  2436.   top = bgp_node_get (table, p);
  2437.   for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
  2438.     if (rn->p.prefixlen > p->prefixlen)
  2439.       {
  2440. match = 0;
  2441. for (ri = rn->info; ri; ri = ri->next)
  2442.   {
  2443.     if (BGP_INFO_HOLDDOWN (ri))
  2444.       continue;
  2445.     if (del && ri == del)
  2446.       continue;
  2447.     if (! rinew && first)
  2448.       {
  2449. nexthop = ri->attr->nexthop;
  2450. med = ri->attr->med;
  2451. first = 0;
  2452.       }
  2453. #ifdef AGGREGATE_NEXTHOP_CHECK
  2454.     if (! IPV4_ADDR_SAME (&ri->attr->nexthop, &nexthop)
  2455. || ri->attr->med != med)
  2456.       {
  2457. if (aspath)
  2458.   aspath_free (aspath);
  2459. if (community)
  2460.   community_free (community);
  2461. bgp_unlock_node (rn);
  2462. bgp_unlock_node (top);
  2463. return;
  2464.       }
  2465. #endif /* AGGREGATE_NEXTHOP_CHECK */
  2466.     if (ri->sub_type != BGP_ROUTE_AGGREGATE)
  2467.       {
  2468. if (aggregate->summary_only)
  2469.   {
  2470.     ri->suppress++;
  2471.     SET_FLAG (ri->flags, BGP_INFO_ATTR_CHANGED);
  2472.     match++;
  2473.   }
  2474. aggregate->count++;
  2475. if (aggregate->as_set)
  2476.   {
  2477.     if (origin < ri->attr->origin)
  2478.       origin = ri->attr->origin;
  2479.     if (aspath)
  2480.       {
  2481. asmerge = aspath_aggregate (aspath, ri->attr->aspath);
  2482. aspath_free (aspath);
  2483. aspath = asmerge;
  2484.       }
  2485.     else
  2486.       aspath = aspath_dup (ri->attr->aspath);
  2487.     if (ri->attr->community)
  2488.       {
  2489. if (community)
  2490.   {
  2491.     commerge = community_merge (community,
  2492. ri->attr->community);
  2493.     community = community_uniq_sort (commerge);
  2494.     community_free (commerge);
  2495.   }
  2496. else
  2497.   community = community_dup (ri->attr->community);
  2498.       }
  2499.   }
  2500.       }
  2501.   }
  2502. if (match)
  2503.   bgp_process (bgp, rn, afi, safi);
  2504.       }
  2505.   bgp_unlock_node (top);
  2506.   if (rinew)
  2507.     {
  2508.       aggregate->count++;
  2509.       
  2510.       if (aggregate->summary_only)
  2511. rinew->suppress++;
  2512.       if (aggregate->as_set)
  2513. {
  2514.   if (origin < rinew->attr->origin)
  2515.     origin = rinew->attr->origin;
  2516.   if (aspath)
  2517.     {
  2518.       asmerge = aspath_aggregate (aspath, rinew->attr->aspath);
  2519.       aspath_free (aspath);
  2520.       aspath = asmerge;
  2521.     }
  2522.   else
  2523.     aspath = aspath_dup (rinew->attr->aspath);
  2524.   if (rinew->attr->community)
  2525.     {
  2526.       if (community)
  2527. {
  2528.   commerge = community_merge (community,
  2529.       rinew->attr->community);
  2530.   community = community_uniq_sort (commerge);
  2531.   community_free (commerge);
  2532. }
  2533.       else
  2534. community = community_dup (rinew->attr->community);
  2535.     }
  2536. }
  2537.     }
  2538.   if (aggregate->count > 0)
  2539.     {
  2540.       rn = bgp_node_get (table, p);
  2541.       new = bgp_info_new ();
  2542.       new->type = ZEBRA_ROUTE_BGP;
  2543.       new->sub_type = BGP_ROUTE_AGGREGATE;
  2544.       new->peer = bgp->peer_self;
  2545.       SET_FLAG (new->flags, BGP_INFO_VALID);
  2546.       new->attr = bgp_attr_aggregate_intern (bgp, origin, aspath, community, aggregate->as_set);
  2547.       new->uptime = time (NULL);
  2548.       bgp_info_add (rn, new);
  2549.       bgp_process (bgp, rn, afi, safi);
  2550.     }
  2551.   else
  2552.     {
  2553.       if (aspath)
  2554. aspath_free (aspath);
  2555.       if (community)
  2556. community_free (community);
  2557.     }
  2558. }
  2559. void bgp_aggregate_delete (struct bgp *, struct prefix *, afi_t, safi_t,
  2560.    struct bgp_aggregate *);
  2561. void
  2562. bgp_aggregate_increment (struct bgp *bgp, struct prefix *p,
  2563.  struct bgp_info *ri, afi_t afi, safi_t safi)
  2564. {
  2565.   struct bgp_node *child;
  2566.   struct bgp_node *rn;
  2567.   struct bgp_aggregate *aggregate;
  2568.   /* MPLS-VPN aggregation is not yet supported. */
  2569.   if (safi == SAFI_MPLS_VPN)
  2570.     return;
  2571.   if (p->prefixlen == 0)
  2572.     return;
  2573.   if (BGP_INFO_HOLDDOWN (ri))
  2574.     return;
  2575.   child = bgp_node_get (bgp->aggregate[afi][safi], p);
  2576.   /* Aggregate address configuration check. */
  2577.   for (rn = child; rn; rn = rn->parent)
  2578.     if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
  2579.       {
  2580. bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
  2581. bgp_aggregate_route (bgp, &rn->p, ri, afi, safi, NULL, aggregate);
  2582.       }
  2583.   bgp_unlock_node (child);
  2584. }
  2585. void
  2586. bgp_aggregate_decrement (struct bgp *bgp, struct prefix *p, 
  2587.  struct bgp_info *del, afi_t afi, safi_t safi)
  2588. {
  2589.   struct bgp_node *child;
  2590.   struct bgp_node *rn;
  2591.   struct bgp_aggregate *aggregate;
  2592.   /* MPLS-VPN aggregation is not yet supported. */
  2593.   if (safi == SAFI_MPLS_VPN)
  2594.     return;
  2595.   if (p->prefixlen == 0)
  2596.     return;
  2597.   child = bgp_node_get (bgp->aggregate[afi][safi], p);
  2598.   /* Aggregate address configuration check. */
  2599.   for (rn = child; rn; rn = rn->parent)
  2600.     if ((aggregate = rn->info) != NULL && rn->p.prefixlen < p->prefixlen)
  2601.       {
  2602. bgp_aggregate_delete (bgp, &rn->p, afi, safi, aggregate);
  2603. bgp_aggregate_route (bgp, &rn->p, NULL, afi, safi, del, aggregate);
  2604.       }
  2605.   bgp_unlock_node (child);
  2606. }
  2607. void
  2608. bgp_aggregate_add (struct bgp *bgp, struct prefix *p, afi_t afi, safi_t safi,
  2609.    struct bgp_aggregate *aggregate)
  2610. {
  2611.   struct bgp_table *table;
  2612.   struct bgp_node *top;
  2613.   struct bgp_node *rn;
  2614.   struct bgp_info *new;
  2615.   struct bgp_info *ri;
  2616.   unsigned long match;
  2617.   u_char origin = BGP_ORIGIN_IGP;
  2618.   struct aspath *aspath = NULL;
  2619.   struct aspath *asmerge = NULL;
  2620.   struct community *community = NULL;
  2621.   struct community *commerge = NULL;
  2622.   table = bgp->rib[afi][safi];
  2623.   /* Sanity check. */
  2624.   if (afi == AFI_IP && p->prefixlen == IPV4_MAX_BITLEN)
  2625.     return;
  2626.   if (afi == AFI_IP6 && p->prefixlen == IPV6_MAX_BITLEN)
  2627.     return;
  2628.     
  2629.   /* If routes exists below this node, generate aggregate routes. */
  2630.   top = bgp_node_get (table, p);
  2631.   for (rn = bgp_node_get (table, p); rn; rn = bgp_route_next_until (rn, top))
  2632.     if (rn->p.prefixlen > p->prefixlen)
  2633.       {
  2634. match = 0;
  2635. for (ri = rn->info; ri; ri = ri->next)
  2636.   {
  2637.     if (BGP_INFO_HOLDDOWN (ri))
  2638.       continue;
  2639.     if (ri->sub_type != BGP_ROUTE_AGGREGATE)
  2640.       {
  2641. /* summary-only aggregate route suppress aggregated
  2642.    route announcement.  */
  2643. if (aggregate->summary_only)
  2644.   {
  2645.     ri->suppress++;