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

网络

开发平台:

Unix_Linux

  1. /* BGP open message handling
  2.    Copyright (C) 1998, 1999 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 "linklist.h"
  18. #include "prefix.h"
  19. #include "stream.h"
  20. #include "thread.h"
  21. #include "log.h"
  22. #include "command.h"
  23. #include "bgpd/bgpd.h"
  24. #include "bgpd/bgp_attr.h"
  25. #include "bgpd/bgp_debug.h"
  26. #include "bgpd/bgp_fsm.h"
  27. #include "bgpd/bgp_packet.h"
  28. #include "bgpd/bgp_open.h"
  29. #include "bgpd/bgp_vty.h"
  30. /* BGP-4 Multiprotocol Extentions lead us to the complex world. We can
  31.    negotiate remote peer supports extentions or not. But if
  32.    remote-peer doesn't supports negotiation process itself.  We would
  33.    like to do manual configuration.
  34.    So there is many configurable point.  First of all we want set each
  35.    peer whether we send capability negotiation to the peer or not.
  36.    Next, if we send capability to the peer we want to set my capabilty
  37.    inforation at each peer. */
  38. void
  39. bgp_capability_vty_out (struct vty *vty, struct peer *peer)
  40. {
  41.   u_char *pnt;
  42.   u_char *end;
  43.   struct capability cap;
  44.   pnt = peer->notify.data;
  45.   end = pnt + peer->notify.length;
  46.   while (pnt < end)
  47.     {
  48.       memcpy(&cap, pnt, sizeof(struct capability));
  49.       if (pnt + 2 > end)
  50. return;
  51.       if (pnt + (cap.length + 2) > end)
  52. return;
  53.       if (cap.code == CAPABILITY_CODE_MP)
  54. {
  55.   vty_out (vty, "  Capability error for: Multi protocol ");
  56.   switch (ntohs (cap.mpc.afi))
  57.     {
  58.     case AFI_IP:
  59.       vty_out (vty, "AFI IPv4, ");
  60.       break;
  61.     case AFI_IP6:
  62.       vty_out (vty, "AFI IPv6, ");
  63.       break;
  64.     default:
  65.       vty_out (vty, "AFI Unknown %d, ", ntohs (cap.mpc.afi));
  66.       break;
  67.     }
  68.   switch (cap.mpc.safi)
  69.     {
  70.     case SAFI_UNICAST:
  71.       vty_out (vty, "SAFI Unicast");
  72.       break;
  73.     case SAFI_MULTICAST:
  74.       vty_out (vty, "SAFI Multicast");
  75.       break;
  76.     case SAFI_UNICAST_MULTICAST:
  77.       vty_out (vty, "SAFI Unicast Multicast");
  78.       break;
  79.     case BGP_SAFI_VPNV4:
  80.       vty_out (vty, "SAFI MPLS-VPN");
  81.       break;
  82.     default:
  83.       vty_out (vty, "SAFI Unknown %d ", cap.mpc.safi);
  84.       break;
  85.     }
  86.   vty_out (vty, "%s", VTY_NEWLINE);
  87. }
  88.       else if (cap.code >= 128)
  89. vty_out (vty, "  Capability error: vendor specific capability code %d",
  90.  cap.code);
  91.       else
  92. vty_out (vty, "  Capability error: unknown capability code %d", 
  93.  cap.code);
  94.       pnt += cap.length + 2;
  95.     }
  96. }
  97. /* Set negotiated capability value. */
  98. int
  99. bgp_capability_mp (struct peer *peer, struct capability *cap)
  100. {
  101.   if (ntohs (cap->mpc.afi) == AFI_IP)
  102.     {
  103.       if (cap->mpc.safi == SAFI_UNICAST)
  104. {
  105.   peer->afc_recv[AFI_IP][SAFI_UNICAST] = 1;
  106.   if (peer->afc[AFI_IP][SAFI_UNICAST])
  107.     peer->afc_nego[AFI_IP][SAFI_UNICAST] = 1;
  108.   else
  109.     return -1;
  110. }
  111.       else if (cap->mpc.safi == SAFI_MULTICAST) 
  112. {
  113.   peer->afc_recv[AFI_IP][SAFI_MULTICAST] = 1;
  114.   if (peer->afc[AFI_IP][SAFI_MULTICAST])
  115.     peer->afc_nego[AFI_IP][SAFI_MULTICAST] = 1;
  116.   else
  117.     return -1;
  118. }
  119.       else if (cap->mpc.safi == BGP_SAFI_VPNV4)
  120. {
  121.   peer->afc_recv[AFI_IP][SAFI_MPLS_VPN] = 1;
  122.   if (peer->afc[AFI_IP][SAFI_MPLS_VPN])
  123.     peer->afc_nego[AFI_IP][SAFI_MPLS_VPN] = 1;
  124.   else
  125.     return -1;
  126. }
  127.       else
  128. return -1;
  129.     }
  130. #ifdef HAVE_IPV6
  131.   else if (ntohs (cap->mpc.afi) == AFI_IP6)
  132.     {
  133.       if (cap->mpc.safi == SAFI_UNICAST)
  134. {
  135.   peer->afc_recv[AFI_IP6][SAFI_UNICAST] = 1;
  136.   if (peer->afc[AFI_IP6][SAFI_UNICAST])
  137.     peer->afc_nego[AFI_IP6][SAFI_UNICAST] = 1;
  138.   else
  139.     return -1;
  140. }
  141.       else if (cap->mpc.safi == SAFI_MULTICAST)
  142. {
  143.   peer->afc_recv[AFI_IP6][SAFI_MULTICAST] = 1;
  144.   if (peer->afc[AFI_IP6][SAFI_MULTICAST])
  145.     peer->afc_nego[AFI_IP6][SAFI_MULTICAST] = 1;
  146.   else
  147.     return -1;
  148. }
  149.       else
  150. return -1;
  151.     }
  152. #endif /* HAVE_IPV6 */
  153.   else
  154.     {
  155.       /* Unknown Address Family. */
  156.       return -1;
  157.     }
  158.   return 0;
  159. }
  160. void
  161. bgp_capability_orf_not_support (struct peer *peer, afi_t afi, safi_t safi,
  162. u_char type, u_char mode)
  163. {
  164.   if (BGP_DEBUG (normal, NORMAL))
  165.     zlog_info ("%s Addr-family %d/%d has ORF type/mode %d/%d not supported",
  166.        peer->host, afi, safi, type, mode);
  167. }
  168. int
  169. bgp_capability_orf (struct peer *peer, struct capability *cap,
  170.     u_char *pnt)
  171. {
  172.   afi_t afi = ntohs(cap->mpc.afi);
  173.   safi_t safi = cap->mpc.safi;
  174.   u_char number_of_orfs;
  175.   u_char type;
  176.   u_char mode;
  177.   u_int16_t sm_cap = 0; /* capability send-mode receive */
  178.   u_int16_t rm_cap = 0; /* capability receive-mode receive */ 
  179.   int i;
  180.   /* Check length. */
  181.   if (cap->length < 7)
  182.     {
  183.       zlog_info ("%s ORF Capability length error %d",
  184.  peer->host, cap->length);
  185.  bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
  186.       return -1;
  187.     }
  188.   if (BGP_DEBUG (normal, NORMAL))
  189.     zlog_info ("%s OPEN has ORF CAP(%s) for afi/safi: %u/%u",
  190.        peer->host, (cap->code == CAPABILITY_CODE_ORF ?
  191.                        "new" : "old"), afi, safi);
  192.   /* Check AFI and SAFI. */
  193.   if ((afi != AFI_IP && afi != AFI_IP6)
  194.       || (safi != SAFI_UNICAST && safi != SAFI_MULTICAST
  195.   && safi != BGP_SAFI_VPNV4))
  196.     {
  197.       zlog_info ("%s Addr-family %d/%d not supported. Ignoring the ORF capability",
  198.                  peer->host, afi, safi);
  199.       return -1;
  200.     }
  201.   number_of_orfs = *pnt++;
  202.   for (i = 0 ; i < number_of_orfs ; i++)
  203.     {
  204.       type = *pnt++;
  205.       mode = *pnt++;
  206.       /* ORF Mode error check */
  207.       if (mode != ORF_MODE_BOTH && mode != ORF_MODE_SEND
  208.   && mode != ORF_MODE_RECEIVE)
  209. {
  210.   bgp_capability_orf_not_support (peer, afi, safi, type, mode);
  211.   continue;
  212. }
  213.       /* ORF Type and afi/safi error check */
  214.       if (cap->code == CAPABILITY_CODE_ORF)
  215. {
  216.   if (type == ORF_TYPE_PREFIX &&
  217.       ((afi == AFI_IP && safi == SAFI_UNICAST)
  218. || (afi == AFI_IP && safi == SAFI_MULTICAST)
  219. || (afi == AFI_IP6 && safi == SAFI_UNICAST)))
  220.     {
  221.       sm_cap = PEER_CAP_ORF_PREFIX_SM_RCV;
  222.       rm_cap = PEER_CAP_ORF_PREFIX_RM_RCV;
  223.       if (BGP_DEBUG (normal, NORMAL))
  224. zlog_info ("%s OPEN has Prefixlist ORF(%d) capability as %s for afi/safi: %d/%d",
  225.    peer->host, ORF_TYPE_PREFIX, (mode == ORF_MODE_SEND ? "SEND" :
  226.    mode == ORF_MODE_RECEIVE ? "RECEIVE" : "BOTH") , afi, safi);
  227.     }
  228.   else
  229.     {
  230.       bgp_capability_orf_not_support (peer, afi, safi, type, mode);
  231.       continue;
  232.     }
  233. }
  234.       else if (cap->code == CAPABILITY_CODE_ORF_OLD)
  235. {
  236.   if (type == ORF_TYPE_PREFIX_OLD &&
  237.       ((afi == AFI_IP && safi == SAFI_UNICAST)
  238. || (afi == AFI_IP && safi == SAFI_MULTICAST)
  239. || (afi == AFI_IP6 && safi == SAFI_UNICAST)))
  240.     {
  241.       sm_cap = PEER_CAP_ORF_PREFIX_SM_OLD_RCV;
  242.       rm_cap = PEER_CAP_ORF_PREFIX_RM_OLD_RCV;
  243.       if (BGP_DEBUG (normal, NORMAL))
  244. zlog_info ("%s OPEN has Prefixlist ORF(%d) capability as %s for afi/safi: %d/%d",
  245.    peer->host, ORF_TYPE_PREFIX_OLD, (mode == ORF_MODE_SEND ? "SEND" :
  246.    mode == ORF_MODE_RECEIVE ? "RECEIVE" : "BOTH") , afi, safi);
  247.     }
  248.   else
  249.     {
  250.       bgp_capability_orf_not_support (peer, afi, safi, type, mode);
  251.       continue;
  252.     }
  253. }
  254.       else
  255. {
  256.   bgp_capability_orf_not_support (peer, afi, safi, type, mode);
  257.   continue;
  258. }
  259.       switch (mode)
  260. {
  261.   case ORF_MODE_BOTH:
  262.     SET_FLAG (peer->af_cap[afi][safi], sm_cap);
  263.     SET_FLAG (peer->af_cap[afi][safi], rm_cap);
  264.     break;
  265.   case ORF_MODE_SEND:
  266.     SET_FLAG (peer->af_cap[afi][safi], sm_cap);
  267.     break;
  268.   case ORF_MODE_RECEIVE:
  269.     SET_FLAG (peer->af_cap[afi][safi], rm_cap);
  270.     break;
  271. }
  272.     }
  273.   return 0;
  274. }
  275. /* Parse given capability. */
  276. int
  277. bgp_capability_parse (struct peer *peer, u_char *pnt, u_char length,
  278.       u_char **error)
  279. {
  280.   int ret;
  281.   u_char *end;
  282.   struct capability cap;
  283.   end = pnt + length;
  284.   while (pnt < end)
  285.     {
  286.       afi_t afi;
  287.       safi_t safi;
  288.       /* Fetch structure to the byte stream. */
  289.       memcpy (&cap, pnt, sizeof (struct capability));
  290.       afi = ntohs(cap.mpc.afi);
  291.       safi = cap.mpc.safi;
  292.       if (BGP_DEBUG (normal, NORMAL))
  293. zlog_info ("%s OPEN has CAPABILITY code: %d, length %d",
  294.    peer->host, cap.code, cap.length);
  295.       /* We need at least capability code and capability length. */
  296.       if (pnt + 2 > end)
  297. {
  298.   zlog_info ("%s Capability length error", peer->host);
  299.   bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
  300.   return -1;
  301. }
  302.       /* Capability length check. */
  303.       if (pnt + (cap.length + 2) > end)
  304. {
  305.   zlog_info ("%s Capability length error", peer->host);
  306.   bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
  307.   return -1;
  308. }
  309.       /* We know MP Capability Code. */
  310.       if (cap.code == CAPABILITY_CODE_MP)
  311. {
  312.   if (BGP_DEBUG (normal, NORMAL))
  313.     zlog_info ("%s OPEN has MP_EXT CAP for afi/safi: %u/%u",
  314.        peer->host, afi, safi);
  315.   /* Ignore capability when override-capability is set. */
  316.   if (! CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
  317.     {
  318.       /* Set negotiated value. */
  319.       ret = bgp_capability_mp (peer, &cap);
  320.       /* Unsupported Capability. */
  321.       if (ret < 0)
  322. {
  323.   /* Store return data. */
  324.   memcpy (*error, &cap, cap.length + 2);
  325.   *error += cap.length + 2;
  326. }
  327.     }
  328. }
  329.       else if (cap.code == CAPABILITY_CODE_REFRESH
  330.        || cap.code == CAPABILITY_CODE_REFRESH_OLD)
  331. {
  332.   /* Check length. */
  333.   if (cap.length != CAPABILITY_CODE_REFRESH_LEN)
  334.     {
  335.       zlog_info ("%s Route Refresh Capability length error %d",
  336.  peer->host, cap.length);
  337.       bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
  338.       return -1;
  339.     }
  340.   if (BGP_DEBUG (normal, NORMAL))
  341.     zlog_info ("%s OPEN has ROUTE-REFRESH capability(%s) for all address-families",
  342.        peer->host,
  343.        cap.code == CAPABILITY_CODE_REFRESH_OLD ? "old" : "new");
  344.   /* BGP refresh capability */
  345.   if (cap.code == CAPABILITY_CODE_REFRESH_OLD)
  346.     SET_FLAG (peer->cap, PEER_CAP_REFRESH_OLD_RCV);
  347.   else
  348.     SET_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV);
  349. }
  350.       else if (cap.code == CAPABILITY_CODE_ORF
  351.        || cap.code == CAPABILITY_CODE_ORF_OLD)
  352. bgp_capability_orf (peer, &cap, pnt + sizeof (struct capability));
  353.       else if (cap.code == CAPABILITY_CODE_RESTART)
  354. {
  355.   struct graceful_restart_af graf;
  356.   u_int16_t restart_flag_time;
  357.   int restart_bit = 0;
  358.   u_char *restart_pnt;
  359.   u_char *restart_end;
  360.   /* Check length. */
  361.   if (cap.length < CAPABILITY_CODE_RESTART_LEN)
  362.     {
  363.       zlog_info ("%s Graceful Restart Capability length error %d",
  364.  peer->host, cap.length);
  365.       bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
  366.       return -1;
  367.     }
  368.   SET_FLAG (peer->cap, PEER_CAP_RESTART_RCV);
  369.   restart_flag_time = ntohs(cap.mpc.afi);
  370.   if (CHECK_FLAG (restart_flag_time, RESTART_R_BIT))
  371.     restart_bit = 1;
  372.   UNSET_FLAG (restart_flag_time, 0xF000); 
  373.   peer->v_gr_restart = restart_flag_time;
  374.   if (BGP_DEBUG (normal, NORMAL))
  375.     {
  376.       zlog_info ("%s OPEN has Graceful Restart capability", peer->host);
  377.       zlog_info ("%s Peer has%srestarted. Restart Time : %d",
  378.  peer->host, restart_bit ? " " : " not ",
  379.  peer->v_gr_restart);
  380.     }
  381.   restart_pnt = pnt + 4;
  382.   restart_end = pnt + cap.length + 2;
  383.   while (restart_pnt < restart_end)
  384.     {
  385.       memcpy (&graf, restart_pnt, sizeof (struct graceful_restart_af));
  386.       afi = ntohs(graf.afi);
  387.       safi = graf.safi;
  388.       if (CHECK_FLAG (graf.flag, RESTART_F_BIT))
  389. SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV);
  390.       if (strcmp (afi_safi_print (afi, safi), "Unknown") == 0)
  391. {
  392.    if (BGP_DEBUG (normal, NORMAL))
  393.      zlog_info ("%s Addr-family %d/%d(afi/safi) not supported. Ignore the Graceful Restart capability",
  394. peer->host, afi, safi);
  395. }
  396.       else if (! peer->afc[afi][safi])
  397. {
  398.    if (BGP_DEBUG (normal, NORMAL))
  399.       zlog_info ("%s Addr-family %d/%d(afi/safi) not enabled. Ignore the Graceful Restart capability",
  400.  peer->host, afi, safi);
  401. }
  402.       else
  403. {
  404.   if (BGP_DEBUG (normal, NORMAL))
  405.     zlog_info ("%s Address family %s is%spreserved", peer->host,
  406.        afi_safi_print (afi, safi),
  407.        CHECK_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_PRESERVE_RCV)
  408.  ? " " : " not ");
  409.     SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_RESTART_AF_RCV);
  410. }
  411.       restart_pnt += 4;
  412.     }
  413. }
  414.       else if (cap.code == CAPABILITY_CODE_DYNAMIC)
  415. {
  416.   /* Check length. */
  417.   if (cap.length != CAPABILITY_CODE_DYNAMIC_LEN)
  418.     {
  419.       zlog_info ("%s Dynamic Capability length error %d",
  420.  peer->host, cap.length);
  421.       bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
  422.       return -1;
  423.     }
  424.   if (BGP_DEBUG (normal, NORMAL))
  425.     zlog_info ("%s OPEN has DYNAMIC capability", peer->host);
  426.   SET_FLAG (peer->cap, PEER_CAP_DYNAMIC_RCV);
  427. }
  428.       else if (cap.code > 128)
  429. {
  430.   /* We don't send Notification for unknown vendor specific
  431.      capabilities.  It seems reasonable for now...  */
  432.   zlog_warn ("%s Vendor specific capability %d",
  433.      peer->host, cap.code);
  434. }
  435.       else
  436. {
  437.   zlog_warn ("%s unrecognized capability code: %d - ignored",
  438.      peer->host, cap.code);
  439.   memcpy (*error, &cap, cap.length + 2);
  440.   *error += cap.length + 2;
  441. }
  442.       pnt += cap.length + 2;
  443.     }
  444.   return 0;
  445. }
  446. int
  447. bgp_auth_parse (struct peer *peer, u_char *pnt, size_t length)
  448. {
  449.   bgp_notify_send (peer, 
  450.    BGP_NOTIFY_OPEN_ERR, 
  451.    BGP_NOTIFY_OPEN_AUTH_FAILURE); 
  452.   return -1;
  453. }
  454. int
  455. strict_capability_same (struct peer *peer)
  456. {
  457.   int i, j;
  458.   for (i = AFI_IP; i < AFI_MAX; i++)
  459.     for (j = SAFI_UNICAST; j < SAFI_MAX; j++)
  460.       if (peer->afc[i][j] != peer->afc_nego[i][j])
  461. return 0;
  462.   return 1;
  463. }
  464. /* Parse open option */
  465. int
  466. bgp_open_option_parse (struct peer *peer, u_char length, int *capability)
  467. {
  468.   int ret;
  469.   u_char *end;
  470.   u_char opt_type;
  471.   u_char opt_length;
  472.   u_char *pnt;
  473.   u_char *error;
  474.   u_char error_data[BGP_MAX_PACKET_SIZE];
  475.   /* Fetch pointer. */
  476.   pnt = stream_pnt (peer->ibuf);
  477.   ret = 0;
  478.   opt_type = 0;
  479.   opt_length = 0;
  480.   end = pnt + length;
  481.   error = error_data;
  482.   if (BGP_DEBUG (normal, NORMAL))
  483.     zlog_info ("%s rcv OPEN w/ OPTION parameter len: %u",
  484.        peer->host, length);
  485.   
  486.   while (pnt < end) 
  487.     {
  488.       /* Check the length. */
  489.       if (pnt + 2 > end)
  490. {
  491.   zlog_info ("%s Option length error", peer->host);
  492.   bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
  493.   return -1;
  494. }
  495.       /* Fetch option type and length. */
  496.       opt_type = *pnt++;
  497.       opt_length = *pnt++;
  498.       
  499.       /* Option length check. */
  500.       if (pnt + opt_length > end)
  501. {
  502.   zlog_info ("%s Option length error", peer->host);
  503.   bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
  504.   return -1;
  505. }
  506.       if (BGP_DEBUG (normal, NORMAL))
  507. zlog_info ("%s rcvd OPEN w/ optional parameter type %u (%s) len %u",
  508.    peer->host, opt_type,
  509.    opt_type == BGP_OPEN_OPT_AUTH ? "Authentication" :
  510.    opt_type == BGP_OPEN_OPT_CAP ? "Capability" : "Unknown",
  511.    opt_length);
  512.   
  513.       switch (opt_type)
  514. {
  515. case BGP_OPEN_OPT_AUTH:
  516.   ret = bgp_auth_parse (peer, pnt, opt_length);
  517.   break;
  518. case BGP_OPEN_OPT_CAP:
  519.   ret = bgp_capability_parse (peer, pnt, opt_length, &error);
  520.   *capability = 1;
  521.   break;
  522. default:
  523.   bgp_notify_send (peer, 
  524.    BGP_NOTIFY_OPEN_ERR, 
  525.    BGP_NOTIFY_OPEN_UNSUP_PARAM); 
  526.   ret = -1;
  527.   break;
  528. }
  529.       /* Parse error.  To accumulate all unsupported capability codes,
  530.          bgp_capability_parse does not return -1 when encounter
  531.          unsupported capability code.  To detect that, please check
  532.          error and erro_data pointer, like below.  */
  533.       if (ret < 0)
  534. return -1;
  535.       /* Forward pointer. */
  536.       pnt += opt_length;
  537.     }
  538.   /* All OPEN option is parsed.  Check capability when strict compare
  539.      flag is enabled.*/
  540.   if (CHECK_FLAG (peer->flags, PEER_FLAG_STRICT_CAP_MATCH))
  541.     {
  542.       /* If Unsupported Capability exists. */
  543.       if (error != error_data)
  544. {
  545.   bgp_notify_send_with_data (peer, 
  546.      BGP_NOTIFY_OPEN_ERR, 
  547.      BGP_NOTIFY_OPEN_UNSUP_CAPBL, 
  548.      error_data, error - error_data);
  549.   return -1;
  550. }
  551.       /* Check local capability does not negotiated with remote
  552.          peer. */
  553.       if (! strict_capability_same (peer))
  554. {
  555.   bgp_notify_send (peer, 
  556.    BGP_NOTIFY_OPEN_ERR, 
  557.    BGP_NOTIFY_OPEN_UNSUP_CAPBL);
  558.   return -1;
  559. }
  560.     }
  561.   /* Check there is no common capability send Unsupported Capability
  562.      error. */
  563.   if (*capability && ! CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
  564.     {
  565.       if (! peer->afc_nego[AFI_IP][SAFI_UNICAST] 
  566.   && ! peer->afc_nego[AFI_IP][SAFI_MULTICAST]
  567.   && ! peer->afc_nego[AFI_IP][SAFI_MPLS_VPN]
  568.   && ! peer->afc_nego[AFI_IP6][SAFI_UNICAST]
  569.   && ! peer->afc_nego[AFI_IP6][SAFI_MULTICAST])
  570. {
  571.   plog_err (peer->log, "%s [Error] No common capability", peer->host);
  572.   if (error != error_data)
  573.     bgp_notify_send_with_data (peer, 
  574.        BGP_NOTIFY_OPEN_ERR, 
  575.        BGP_NOTIFY_OPEN_UNSUP_CAPBL, 
  576.        error_data, error - error_data);
  577.   else
  578.     bgp_notify_send (peer, 
  579.      BGP_NOTIFY_OPEN_ERR, 
  580.      BGP_NOTIFY_OPEN_UNSUP_CAPBL);
  581.   return -1;
  582. }
  583.     }
  584.   return 0;
  585. }
  586. void
  587. bgp_open_capability_orf (struct stream *s, struct peer *peer,
  588.                          afi_t afi, safi_t safi, u_char code)
  589. {
  590.   u_char cap_len;
  591.   u_char orf_len;
  592.   unsigned long capp;
  593.   unsigned long orfp;
  594.   unsigned long numberp;
  595.   int number_of_orfs = 0;
  596.   if (safi == SAFI_MPLS_VPN)
  597.     safi = BGP_SAFI_VPNV4;
  598.   stream_putc (s, BGP_OPEN_OPT_CAP);
  599.   capp = stream_get_putp (s);           /* Set Capability Len Pointer */
  600.   stream_putc (s, 0);                   /* Capability Length */
  601.   stream_putc (s, code);                /* Capability Code */
  602.   orfp = stream_get_putp (s);           /* Set ORF Len Pointer */
  603.   stream_putc (s, 0);                   /* ORF Length */
  604.   stream_putw (s, afi);
  605.   stream_putc (s, 0);
  606.   stream_putc (s, safi);
  607.   numberp = stream_get_putp (s);        /* Set Number Pointer */
  608.   stream_putc (s, 0);                   /* Number of ORFs */
  609.   /* Address Prefix ORF */
  610.   if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
  611.       || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
  612.     {
  613.       stream_putc (s, (code == CAPABILITY_CODE_ORF ?
  614.    ORF_TYPE_PREFIX : ORF_TYPE_PREFIX_OLD));
  615.       if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
  616.   && CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
  617. {
  618.   SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV);
  619.   SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV);
  620.   stream_putc (s, ORF_MODE_BOTH);
  621. }
  622.       else if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM))
  623. {
  624.   SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_SM_ADV);
  625.   stream_putc (s, ORF_MODE_SEND);
  626. }
  627.       else
  628. {
  629.   SET_FLAG (peer->af_cap[afi][safi], PEER_CAP_ORF_PREFIX_RM_ADV);
  630.   stream_putc (s, ORF_MODE_RECEIVE);
  631. }
  632.       number_of_orfs++;
  633.     }
  634.   /* Total Number of ORFs. */
  635.   stream_putc_at (s, numberp, number_of_orfs);
  636.   /* Total ORF Len. */
  637.   orf_len = stream_get_putp (s) - orfp - 1;
  638.   stream_putc_at (s, orfp, orf_len);
  639.   /* Total Capability Len. */
  640.   cap_len = stream_get_putp (s) - capp - 1;
  641.   stream_putc_at (s, capp, cap_len);
  642. }
  643. /* Fill in capability open option to the packet. */
  644. void
  645. bgp_open_capability (struct stream *s, struct peer *peer)
  646. {
  647.   u_char len;
  648.   unsigned long cp;
  649.   afi_t afi;
  650.   safi_t safi;
  651.   /* Remember current pointer for Opt Parm Len. */
  652.   cp = stream_get_putp (s);
  653.   /* Opt Parm Len. */
  654.   stream_putc (s, 0);
  655.   /* Do not send capability. */
  656.   if (! CHECK_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN) 
  657.       || CHECK_FLAG (peer->flags, PEER_FLAG_DONT_CAPABILITY))
  658.     return;
  659.   /* IPv4 unicast. */
  660.   if (peer->afc[AFI_IP][SAFI_UNICAST])
  661.     {
  662.       peer->afc_adv[AFI_IP][SAFI_UNICAST] = 1;
  663.       stream_putc (s, BGP_OPEN_OPT_CAP);
  664.       stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
  665.       stream_putc (s, CAPABILITY_CODE_MP);
  666.       stream_putc (s, CAPABILITY_CODE_MP_LEN);
  667.       stream_putw (s, AFI_IP);
  668.       stream_putc (s, 0);
  669.       stream_putc (s, SAFI_UNICAST);
  670.     }
  671.   /* IPv4 multicast. */
  672.   if (peer->afc[AFI_IP][SAFI_MULTICAST])
  673.     {
  674.       peer->afc_adv[AFI_IP][SAFI_MULTICAST] = 1;
  675.       stream_putc (s, BGP_OPEN_OPT_CAP);
  676.       stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
  677.       stream_putc (s, CAPABILITY_CODE_MP);
  678.       stream_putc (s, CAPABILITY_CODE_MP_LEN);
  679.       stream_putw (s, AFI_IP);
  680.       stream_putc (s, 0);
  681.       stream_putc (s, SAFI_MULTICAST);
  682.     }
  683.   /* IPv4 VPN */
  684.   if (peer->afc[AFI_IP][SAFI_MPLS_VPN])
  685.     {
  686.       peer->afc_adv[AFI_IP][SAFI_MPLS_VPN] = 1;
  687.       stream_putc (s, BGP_OPEN_OPT_CAP);
  688.       stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
  689.       stream_putc (s, CAPABILITY_CODE_MP);
  690.       stream_putc (s, CAPABILITY_CODE_MP_LEN);
  691.       stream_putw (s, AFI_IP);
  692.       stream_putc (s, 0);
  693.       stream_putc (s, BGP_SAFI_VPNV4);
  694.     }
  695. #ifdef HAVE_IPV6
  696.   /* IPv6 unicast. */
  697.   if (peer->afc[AFI_IP6][SAFI_UNICAST])
  698.     {
  699.       peer->afc_adv[AFI_IP6][SAFI_UNICAST] = 1;
  700.       stream_putc (s, BGP_OPEN_OPT_CAP);
  701.       stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
  702.       stream_putc (s, CAPABILITY_CODE_MP);
  703.       stream_putc (s, CAPABILITY_CODE_MP_LEN);
  704.       stream_putw (s, AFI_IP6);
  705.       stream_putc (s, 0);
  706.       stream_putc (s, SAFI_UNICAST);
  707.     }
  708.   /* IPv6 multicast. */
  709.   if (peer->afc[AFI_IP6][SAFI_MULTICAST])
  710.     {
  711.       peer->afc_adv[AFI_IP6][SAFI_MULTICAST] = 1;
  712.       stream_putc (s, BGP_OPEN_OPT_CAP);
  713.       stream_putc (s, CAPABILITY_CODE_MP_LEN + 2);
  714.       stream_putc (s, CAPABILITY_CODE_MP);
  715.       stream_putc (s, CAPABILITY_CODE_MP_LEN);
  716.       stream_putw (s, AFI_IP6);
  717.       stream_putc (s, 0);
  718.       stream_putc (s, SAFI_MULTICAST);
  719.     }
  720. #endif /* HAVE_IPV6 */
  721.   /* Route refresh. */
  722.   SET_FLAG (peer->cap, PEER_CAP_REFRESH_ADV);
  723.   stream_putc (s, BGP_OPEN_OPT_CAP);
  724.   stream_putc (s, CAPABILITY_CODE_REFRESH_LEN + 2);
  725.   stream_putc (s, CAPABILITY_CODE_REFRESH_OLD);
  726.   stream_putc (s, CAPABILITY_CODE_REFRESH_LEN);
  727.   stream_putc (s, BGP_OPEN_OPT_CAP);
  728.   stream_putc (s, CAPABILITY_CODE_REFRESH_LEN + 2);
  729.   stream_putc (s, CAPABILITY_CODE_REFRESH);
  730.   stream_putc (s, CAPABILITY_CODE_REFRESH_LEN);
  731.   /* ORF capability. */
  732.   for (afi = AFI_IP ; afi < AFI_MAX ; afi++)
  733.     for (safi = SAFI_UNICAST ; safi < SAFI_MAX ; safi++)
  734.       if (CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_SM)
  735.   || CHECK_FLAG (peer->af_flags[afi][safi], PEER_FLAG_ORF_PREFIX_RM))
  736. {
  737.   bgp_open_capability_orf (s, peer, afi, safi, CAPABILITY_CODE_ORF_OLD);
  738.   bgp_open_capability_orf (s, peer, afi, safi, CAPABILITY_CODE_ORF);
  739. }
  740.   /* Dynamic capability. */
  741.   if (CHECK_FLAG (peer->flags, PEER_FLAG_DYNAMIC_CAPABILITY))
  742.     {
  743.       SET_FLAG (peer->cap, PEER_CAP_DYNAMIC_ADV);
  744.       stream_putc (s, BGP_OPEN_OPT_CAP);
  745.       stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN + 2);
  746.       stream_putc (s, CAPABILITY_CODE_DYNAMIC);
  747.       stream_putc (s, CAPABILITY_CODE_DYNAMIC_LEN);
  748.     }
  749.   /* Graceful restart capability */
  750.   if (bgp_flag_check (peer->bgp, BGP_FLAG_GRACEFUL_RESTART))
  751.     {
  752.       SET_FLAG (peer->cap, PEER_CAP_RESTART_ADV);
  753.       stream_putc (s, BGP_OPEN_OPT_CAP);
  754.       stream_putc (s, CAPABILITY_CODE_RESTART_LEN + 2);
  755.       stream_putc (s, CAPABILITY_CODE_RESTART);
  756.       stream_putc (s, CAPABILITY_CODE_RESTART_LEN);
  757.       stream_putw (s, peer->bgp->restart_time);
  758.     }
  759.   /* Total Opt Parm Len. */
  760.   len = stream_get_putp (s) - cp - 1;
  761.   stream_putc_at (s, cp, len);
  762. }