Annotation of embedaddon/quagga/bgpd/bgp_packet.c, revision 1.1.1.2

1.1       misho       1: /* BGP packet management routine.
                      2:    Copyright (C) 1999 Kunihiro Ishiguro
                      3: 
                      4: This file is part of GNU Zebra.
                      5: 
                      6: GNU Zebra is free software; you can redistribute it and/or modify it
                      7: under the terms of the GNU General Public License as published by the
                      8: Free Software Foundation; either version 2, or (at your option) any
                      9: later version.
                     10: 
                     11: GNU Zebra is distributed in the hope that it will be useful, but
                     12: WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     14: General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU Zebra; see the file COPYING.  If not, write to the Free
                     18: Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
                     19: 02111-1307, USA.  */
                     20: 
                     21: #include <zebra.h>
                     22: 
                     23: #include "thread.h"
                     24: #include "stream.h"
                     25: #include "network.h"
                     26: #include "prefix.h"
                     27: #include "command.h"
                     28: #include "log.h"
                     29: #include "memory.h"
                     30: #include "sockunion.h"         /* for inet_ntop () */
                     31: #include "linklist.h"
                     32: #include "plist.h"
                     33: 
                     34: #include "bgpd/bgpd.h"
                     35: #include "bgpd/bgp_table.h"
                     36: #include "bgpd/bgp_dump.h"
                     37: #include "bgpd/bgp_attr.h"
                     38: #include "bgpd/bgp_debug.h"
                     39: #include "bgpd/bgp_fsm.h"
                     40: #include "bgpd/bgp_route.h"
                     41: #include "bgpd/bgp_packet.h"
                     42: #include "bgpd/bgp_open.h"
                     43: #include "bgpd/bgp_aspath.h"
                     44: #include "bgpd/bgp_community.h"
                     45: #include "bgpd/bgp_ecommunity.h"
                     46: #include "bgpd/bgp_network.h"
                     47: #include "bgpd/bgp_mplsvpn.h"
                     48: #include "bgpd/bgp_advertise.h"
                     49: #include "bgpd/bgp_vty.h"
                     50: 
                     51: int stream_put_prefix (struct stream *, struct prefix *);
                     52: 
                     53: /* Set up BGP packet marker and packet type. */
                     54: static int
                     55: bgp_packet_set_marker (struct stream *s, u_char type)
                     56: {
                     57:   int i;
                     58: 
                     59:   /* Fill in marker. */
                     60:   for (i = 0; i < BGP_MARKER_SIZE; i++)
                     61:     stream_putc (s, 0xff);
                     62: 
                     63:   /* Dummy total length. This field is should be filled in later on. */
                     64:   stream_putw (s, 0);
                     65: 
                     66:   /* BGP packet type. */
                     67:   stream_putc (s, type);
                     68: 
                     69:   /* Return current stream size. */
                     70:   return stream_get_endp (s);
                     71: }
                     72: 
                     73: /* Set BGP packet header size entry.  If size is zero then use current
                     74:    stream size. */
                     75: static int
                     76: bgp_packet_set_size (struct stream *s)
                     77: {
                     78:   int cp;
                     79: 
                     80:   /* Preserve current pointer. */
                     81:   cp = stream_get_endp (s);
                     82:   stream_putw_at (s, BGP_MARKER_SIZE, cp);
                     83: 
                     84:   return cp;
                     85: }
                     86: 
                     87: /* Add new packet to the peer. */
                     88: static void
                     89: bgp_packet_add (struct peer *peer, struct stream *s)
                     90: {
                     91:   /* Add packet to the end of list. */
                     92:   stream_fifo_push (peer->obuf, s);
                     93: }
                     94: 
                     95: /* Free first packet. */
                     96: static void
                     97: bgp_packet_delete (struct peer *peer)
                     98: {
                     99:   stream_free (stream_fifo_pop (peer->obuf));
                    100: }
                    101: 
                    102: /* Check file descriptor whether connect is established. */
                    103: static void
                    104: bgp_connect_check (struct peer *peer)
                    105: {
                    106:   int status;
                    107:   socklen_t slen;
                    108:   int ret;
                    109: 
                    110:   /* Anyway I have to reset read and write thread. */
                    111:   BGP_READ_OFF (peer->t_read);
                    112:   BGP_WRITE_OFF (peer->t_write);
                    113: 
                    114:   /* Check file descriptor. */
                    115:   slen = sizeof (status);
                    116:   ret = getsockopt(peer->fd, SOL_SOCKET, SO_ERROR, (void *) &status, &slen);
                    117: 
                    118:   /* If getsockopt is fail, this is fatal error. */
                    119:   if (ret < 0)
                    120:     {
                    121:       zlog (peer->log, LOG_INFO, "can't get sockopt for nonblocking connect");
                    122:       BGP_EVENT_ADD (peer, TCP_fatal_error);
                    123:       return;
                    124:     }      
                    125: 
                    126:   /* When status is 0 then TCP connection is established. */
                    127:   if (status == 0)
                    128:     {
                    129:       BGP_EVENT_ADD (peer, TCP_connection_open);
                    130:     }
                    131:   else
                    132:     {
                    133:       if (BGP_DEBUG (events, EVENTS))
                    134:          plog_debug (peer->log, "%s [Event] Connect failed (%s)",
                    135:                     peer->host, safe_strerror (errno));
                    136:       BGP_EVENT_ADD (peer, TCP_connection_open_failed);
                    137:     }
                    138: }
                    139: 
                    140: /* Make BGP update packet.  */
                    141: static struct stream *
                    142: bgp_update_packet (struct peer *peer, afi_t afi, safi_t safi)
                    143: {
                    144:   struct stream *s;
                    145:   struct bgp_adj_out *adj;
                    146:   struct bgp_advertise *adv;
                    147:   struct stream *packet;
                    148:   struct bgp_node *rn = NULL;
                    149:   struct bgp_info *binfo = NULL;
                    150:   bgp_size_t total_attr_len = 0;
                    151:   unsigned long pos;
                    152:   char buf[BUFSIZ];
                    153: 
                    154:   s = peer->work;
                    155:   stream_reset (s);
                    156: 
                    157:   adv = FIFO_HEAD (&peer->sync[afi][safi]->update);
                    158: 
                    159:   while (adv)
                    160:     {
                    161:       assert (adv->rn);
                    162:       rn = adv->rn;
                    163:       adj = adv->adj;
                    164:       if (adv->binfo)
                    165:         binfo = adv->binfo;
                    166: 
                    167:       /* When remaining space can't include NLRI and it's length.  */
                    168:       if (STREAM_REMAIN (s) <= BGP_NLRI_LENGTH + PSIZE (rn->p.prefixlen))
                    169:        break;
                    170: 
                    171:       /* If packet is empty, set attribute. */
                    172:       if (stream_empty (s))
                    173:        {
                    174:          struct prefix_rd *prd = NULL;
                    175:          u_char *tag = NULL;
                    176:          struct peer *from = NULL;
                    177:          
                    178:          if (rn->prn)
                    179:            prd = (struct prefix_rd *) &rn->prn->p;
                    180:           if (binfo)
                    181:             {
                    182:               from = binfo->peer;
                    183:               if (binfo->extra)
                    184:                 tag = binfo->extra->tag;
                    185:             }
                    186:           
                    187:          bgp_packet_set_marker (s, BGP_MSG_UPDATE);
                    188:          stream_putw (s, 0);           
                    189:          pos = stream_get_endp (s);
                    190:          stream_putw (s, 0);
                    191:          total_attr_len = bgp_packet_attribute (NULL, peer, s, 
                    192:                                                 adv->baa->attr,
                    193:                                                 &rn->p, afi, safi, 
                    194:                                                 from, prd, tag);
                    195:          stream_putw_at (s, pos, total_attr_len);
                    196:        }
                    197: 
                    198:       if (afi == AFI_IP && safi == SAFI_UNICAST)
                    199:        stream_put_prefix (s, &rn->p);
                    200:       
                    201:       if (BGP_DEBUG (update, UPDATE_OUT))
                    202:        zlog (peer->log, LOG_DEBUG, "%s send UPDATE %s/%d",
                    203:              peer->host,
                    204:              inet_ntop (rn->p.family, &(rn->p.u.prefix), buf, BUFSIZ),
                    205:              rn->p.prefixlen);
                    206: 
                    207:       /* Synchnorize attribute.  */
                    208:       if (adj->attr)
                    209:        bgp_attr_unintern (&adj->attr);
                    210:       else
                    211:        peer->scount[afi][safi]++;
                    212: 
                    213:       adj->attr = bgp_attr_intern (adv->baa->attr);
                    214: 
                    215:       adv = bgp_advertise_clean (peer, adj, afi, safi);
                    216: 
                    217:       if (! (afi == AFI_IP && safi == SAFI_UNICAST))
                    218:        break;
                    219:     }
                    220:         
                    221:   if (! stream_empty (s))
                    222:     {
                    223:       bgp_packet_set_size (s);
                    224:       packet = stream_dup (s);
                    225:       bgp_packet_add (peer, packet);
                    226:       BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
                    227:       stream_reset (s);
                    228:       return packet;
                    229:     }
                    230:   return NULL;
                    231: }
                    232: 
                    233: static struct stream *
                    234: bgp_update_packet_eor (struct peer *peer, afi_t afi, safi_t safi)
                    235: {
                    236:   struct stream *s;
                    237:   struct stream *packet;
                    238: 
                    239:   if (DISABLE_BGP_ANNOUNCE)
                    240:     return NULL;
                    241: 
                    242:   if (BGP_DEBUG (normal, NORMAL))
                    243:     zlog_debug ("send End-of-RIB for %s to %s", afi_safi_print (afi, safi), peer->host);
                    244: 
                    245:   s = stream_new (BGP_MAX_PACKET_SIZE);
                    246: 
                    247:   /* Make BGP update packet. */
                    248:   bgp_packet_set_marker (s, BGP_MSG_UPDATE);
                    249: 
                    250:   /* Unfeasible Routes Length */
                    251:   stream_putw (s, 0);
                    252: 
                    253:   if (afi == AFI_IP && safi == SAFI_UNICAST)
                    254:     {
                    255:       /* Total Path Attribute Length */
                    256:       stream_putw (s, 0);
                    257:     }
                    258:   else
                    259:     {
                    260:       /* Total Path Attribute Length */
                    261:       stream_putw (s, 6);
                    262:       stream_putc (s, BGP_ATTR_FLAG_OPTIONAL);
                    263:       stream_putc (s, BGP_ATTR_MP_UNREACH_NLRI);
                    264:       stream_putc (s, 3);
                    265:       stream_putw (s, afi);
                    266:       stream_putc (s, safi);
                    267:     }
                    268: 
                    269:   bgp_packet_set_size (s);
                    270:   packet = stream_dup (s);
                    271:   bgp_packet_add (peer, packet);
                    272:   stream_free (s);
                    273:   return packet;
                    274: }
                    275: 
                    276: /* Make BGP withdraw packet.  */
                    277: static struct stream *
                    278: bgp_withdraw_packet (struct peer *peer, afi_t afi, safi_t safi)
                    279: {
                    280:   struct stream *s;
                    281:   struct stream *packet;
                    282:   struct bgp_adj_out *adj;
                    283:   struct bgp_advertise *adv;
                    284:   struct bgp_node *rn;
                    285:   unsigned long pos;
                    286:   bgp_size_t unfeasible_len;
                    287:   bgp_size_t total_attr_len;
                    288:   char buf[BUFSIZ];
                    289: 
                    290:   s = peer->work;
                    291:   stream_reset (s);
                    292: 
                    293:   while ((adv = FIFO_HEAD (&peer->sync[afi][safi]->withdraw)) != NULL)
                    294:     {
                    295:       assert (adv->rn);
                    296:       adj = adv->adj;
                    297:       rn = adv->rn;
                    298: 
                    299:       if (STREAM_REMAIN (s) 
                    300:          < (BGP_NLRI_LENGTH + BGP_TOTAL_ATTR_LEN + PSIZE (rn->p.prefixlen)))
                    301:        break;
                    302: 
                    303:       if (stream_empty (s))
                    304:        {
                    305:          bgp_packet_set_marker (s, BGP_MSG_UPDATE);
                    306:          stream_putw (s, 0);
                    307:        }
                    308: 
                    309:       if (afi == AFI_IP && safi == SAFI_UNICAST)
                    310:        stream_put_prefix (s, &rn->p);
                    311:       else
                    312:        {
                    313:          struct prefix_rd *prd = NULL;
                    314:          
                    315:          if (rn->prn)
                    316:            prd = (struct prefix_rd *) &rn->prn->p;
                    317:          pos = stream_get_endp (s);
                    318:          stream_putw (s, 0);
                    319:          total_attr_len
                    320:            = bgp_packet_withdraw (peer, s, &rn->p, afi, safi, prd, NULL);
                    321:       
                    322:          /* Set total path attribute length. */
                    323:          stream_putw_at (s, pos, total_attr_len);
                    324:        }
                    325: 
                    326:       if (BGP_DEBUG (update, UPDATE_OUT))
                    327:        zlog (peer->log, LOG_DEBUG, "%s send UPDATE %s/%d -- unreachable",
                    328:              peer->host,
                    329:              inet_ntop (rn->p.family, &(rn->p.u.prefix), buf, BUFSIZ),
                    330:              rn->p.prefixlen);
                    331: 
                    332:       peer->scount[afi][safi]--;
                    333: 
                    334:       bgp_adj_out_remove (rn, adj, peer, afi, safi);
                    335:       bgp_unlock_node (rn);
                    336: 
                    337:       if (! (afi == AFI_IP && safi == SAFI_UNICAST))
                    338:        break;
                    339:     }
                    340: 
                    341:   if (! stream_empty (s))
                    342:     {
                    343:       if (afi == AFI_IP && safi == SAFI_UNICAST)
                    344:        {
                    345:          unfeasible_len 
                    346:            = stream_get_endp (s) - BGP_HEADER_SIZE - BGP_UNFEASIBLE_LEN;
                    347:          stream_putw_at (s, BGP_HEADER_SIZE, unfeasible_len);
                    348:          stream_putw (s, 0);
                    349:        }
                    350:       bgp_packet_set_size (s);
                    351:       packet = stream_dup (s);
                    352:       bgp_packet_add (peer, packet);
                    353:       stream_reset (s);
                    354:       return packet;
                    355:     }
                    356: 
                    357:   return NULL;
                    358: }
                    359: 
                    360: void
                    361: bgp_default_update_send (struct peer *peer, struct attr *attr,
                    362:                         afi_t afi, safi_t safi, struct peer *from)
                    363: {
                    364:   struct stream *s;
                    365:   struct stream *packet;
                    366:   struct prefix p;
                    367:   unsigned long pos;
                    368:   bgp_size_t total_attr_len;
                    369:   char attrstr[BUFSIZ];
                    370:   char buf[BUFSIZ];
                    371: 
                    372:   if (DISABLE_BGP_ANNOUNCE)
                    373:     return;
                    374: 
                    375:   if (afi == AFI_IP)
                    376:     str2prefix ("0.0.0.0/0", &p);
                    377: #ifdef HAVE_IPV6
                    378:   else 
                    379:     str2prefix ("::/0", &p);
                    380: #endif /* HAVE_IPV6 */
                    381: 
                    382:   /* Logging the attribute. */
                    383:   if (BGP_DEBUG (update, UPDATE_OUT))
                    384:     {
                    385:       bgp_dump_attr (peer, attr, attrstr, BUFSIZ);
                    386:       zlog (peer->log, LOG_DEBUG, "%s send UPDATE %s/%d %s",
                    387:            peer->host, inet_ntop(p.family, &(p.u.prefix), buf, BUFSIZ),
                    388:            p.prefixlen, attrstr);
                    389:     }
                    390: 
                    391:   s = stream_new (BGP_MAX_PACKET_SIZE);
                    392: 
                    393:   /* Make BGP update packet. */
                    394:   bgp_packet_set_marker (s, BGP_MSG_UPDATE);
                    395: 
                    396:   /* Unfeasible Routes Length. */
                    397:   stream_putw (s, 0);
                    398: 
                    399:   /* Make place for total attribute length.  */
                    400:   pos = stream_get_endp (s);
                    401:   stream_putw (s, 0);
                    402:   total_attr_len = bgp_packet_attribute (NULL, peer, s, attr, &p, afi, safi, from, NULL, NULL);
                    403: 
                    404:   /* Set Total Path Attribute Length. */
                    405:   stream_putw_at (s, pos, total_attr_len);
                    406: 
                    407:   /* NLRI set. */
                    408:   if (p.family == AF_INET && safi == SAFI_UNICAST)
                    409:     stream_put_prefix (s, &p);
                    410: 
                    411:   /* Set size. */
                    412:   bgp_packet_set_size (s);
                    413: 
                    414:   packet = stream_dup (s);
                    415:   stream_free (s);
                    416: 
                    417:   /* Dump packet if debug option is set. */
                    418: #ifdef DEBUG
                    419:   /* bgp_packet_dump (packet); */
                    420: #endif /* DEBUG */
                    421: 
                    422:   /* Add packet to the peer. */
                    423:   bgp_packet_add (peer, packet);
                    424: 
                    425:   BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
                    426: }
                    427: 
                    428: void
                    429: bgp_default_withdraw_send (struct peer *peer, afi_t afi, safi_t safi)
                    430: {
                    431:   struct stream *s;
                    432:   struct stream *packet;
                    433:   struct prefix p;
                    434:   unsigned long pos;
                    435:   unsigned long cp;
                    436:   bgp_size_t unfeasible_len;
                    437:   bgp_size_t total_attr_len;
                    438:   char buf[BUFSIZ];
                    439: 
                    440:   if (DISABLE_BGP_ANNOUNCE)
                    441:     return;
                    442: 
                    443:   if (afi == AFI_IP)
                    444:     str2prefix ("0.0.0.0/0", &p);
                    445: #ifdef HAVE_IPV6
                    446:   else 
                    447:     str2prefix ("::/0", &p);
                    448: #endif /* HAVE_IPV6 */
                    449: 
                    450:   total_attr_len = 0;
                    451:   pos = 0;
                    452: 
                    453:   if (BGP_DEBUG (update, UPDATE_OUT))
                    454:     zlog (peer->log, LOG_DEBUG, "%s send UPDATE %s/%d -- unreachable",
                    455:           peer->host, inet_ntop(p.family, &(p.u.prefix), buf, BUFSIZ),
                    456:           p.prefixlen);
                    457: 
                    458:   s = stream_new (BGP_MAX_PACKET_SIZE);
                    459: 
                    460:   /* Make BGP update packet. */
                    461:   bgp_packet_set_marker (s, BGP_MSG_UPDATE);
                    462: 
                    463:   /* Unfeasible Routes Length. */;
                    464:   cp = stream_get_endp (s);
                    465:   stream_putw (s, 0);
                    466: 
                    467:   /* Withdrawn Routes. */
                    468:   if (p.family == AF_INET && safi == SAFI_UNICAST)
                    469:     {
                    470:       stream_put_prefix (s, &p);
                    471: 
                    472:       unfeasible_len = stream_get_endp (s) - cp - 2;
                    473: 
                    474:       /* Set unfeasible len.  */
                    475:       stream_putw_at (s, cp, unfeasible_len);
                    476: 
                    477:       /* Set total path attribute length. */
                    478:       stream_putw (s, 0);
                    479:     }
                    480:   else
                    481:     {
                    482:       pos = stream_get_endp (s);
                    483:       stream_putw (s, 0);
                    484:       total_attr_len = bgp_packet_withdraw (peer, s, &p, afi, safi, NULL, NULL);
                    485: 
                    486:       /* Set total path attribute length. */
                    487:       stream_putw_at (s, pos, total_attr_len);
                    488:     }
                    489: 
                    490:   bgp_packet_set_size (s);
                    491: 
                    492:   packet = stream_dup (s);
                    493:   stream_free (s);
                    494: 
                    495:   /* Add packet to the peer. */
                    496:   bgp_packet_add (peer, packet);
                    497: 
                    498:   BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
                    499: }
                    500: 
                    501: /* Get next packet to be written.  */
                    502: static struct stream *
                    503: bgp_write_packet (struct peer *peer)
                    504: {
                    505:   afi_t afi;
                    506:   safi_t safi;
                    507:   struct stream *s = NULL;
                    508:   struct bgp_advertise *adv;
                    509: 
                    510:   s = stream_fifo_head (peer->obuf);
                    511:   if (s)
                    512:     return s;
                    513: 
                    514:   for (afi = AFI_IP; afi < AFI_MAX; afi++)
                    515:     for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
                    516:       {
                    517:        adv = FIFO_HEAD (&peer->sync[afi][safi]->withdraw);
                    518:        if (adv)
                    519:          {
                    520:            s = bgp_withdraw_packet (peer, afi, safi);
                    521:            if (s)
                    522:              return s;
                    523:          }
                    524:       }
                    525:     
                    526:   for (afi = AFI_IP; afi < AFI_MAX; afi++)
                    527:     for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
                    528:       {
                    529:        adv = FIFO_HEAD (&peer->sync[afi][safi]->update);
                    530:        if (adv)
                    531:          {
                    532:             if (adv->binfo && adv->binfo->uptime < peer->synctime)
                    533:              {
                    534:                if (CHECK_FLAG (adv->binfo->peer->cap, PEER_CAP_RESTART_RCV)
                    535:                    && CHECK_FLAG (adv->binfo->peer->cap, PEER_CAP_RESTART_ADV)
                    536:                    && ! CHECK_FLAG (adv->binfo->flags, BGP_INFO_STALE)
                    537:                    && safi != SAFI_MPLS_VPN)
                    538:                  {
                    539:                    if (CHECK_FLAG (adv->binfo->peer->af_sflags[afi][safi],
                    540:                        PEER_STATUS_EOR_RECEIVED))
                    541:                      s = bgp_update_packet (peer, afi, safi);
                    542:                  }
                    543:                else
                    544:                  s = bgp_update_packet (peer, afi, safi);
                    545:              }
                    546: 
                    547:            if (s)
                    548:              return s;
                    549:          }
                    550: 
                    551:        if (CHECK_FLAG (peer->cap, PEER_CAP_RESTART_RCV))
                    552:          {
                    553:            if (peer->afc_nego[afi][safi] && peer->synctime
                    554:                && ! CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_EOR_SEND)
                    555:                && safi != SAFI_MPLS_VPN)
                    556:              {
                    557:                SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_EOR_SEND);
                    558:                return bgp_update_packet_eor (peer, afi, safi);
                    559:              }
                    560:          }
                    561:       }
                    562: 
                    563:   return NULL;
                    564: }
                    565: 
                    566: /* Is there partially written packet or updates we can send right
                    567:    now.  */
                    568: static int
                    569: bgp_write_proceed (struct peer *peer)
                    570: {
                    571:   afi_t afi;
                    572:   safi_t safi;
                    573:   struct bgp_advertise *adv;
                    574: 
                    575:   if (stream_fifo_head (peer->obuf))
                    576:     return 1;
                    577: 
                    578:   for (afi = AFI_IP; afi < AFI_MAX; afi++)
                    579:     for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
                    580:       if (FIFO_HEAD (&peer->sync[afi][safi]->withdraw))
                    581:        return 1;
                    582: 
                    583:   for (afi = AFI_IP; afi < AFI_MAX; afi++)
                    584:     for (safi = SAFI_UNICAST; safi < SAFI_MAX; safi++)
                    585:       if ((adv = FIFO_HEAD (&peer->sync[afi][safi]->update)) != NULL)
                    586:        if (adv->binfo->uptime < peer->synctime)
                    587:          return 1;
                    588: 
                    589:   return 0;
                    590: }
                    591: 
                    592: /* Write packet to the peer. */
                    593: int
                    594: bgp_write (struct thread *thread)
                    595: {
                    596:   struct peer *peer;
                    597:   u_char type;
                    598:   struct stream *s; 
                    599:   int num;
                    600:   unsigned int count = 0;
                    601: 
                    602:   /* Yes first of all get peer pointer. */
                    603:   peer = THREAD_ARG (thread);
                    604:   peer->t_write = NULL;
                    605: 
                    606:   /* For non-blocking IO check. */
                    607:   if (peer->status == Connect)
                    608:     {
                    609:       bgp_connect_check (peer);
                    610:       return 0;
                    611:     }
                    612: 
                    613:   s = bgp_write_packet (peer);
                    614:   if (!s)
                    615:     return 0;  /* nothing to send */
                    616: 
                    617:   sockopt_cork (peer->fd, 1);
                    618: 
                    619:   /* Nonblocking write until TCP output buffer is full.  */
                    620:   do
                    621:     {
                    622:       int writenum;
                    623: 
                    624:       /* Number of bytes to be sent.  */
                    625:       writenum = stream_get_endp (s) - stream_get_getp (s);
                    626: 
                    627:       /* Call write() system call.  */
                    628:       num = write (peer->fd, STREAM_PNT (s), writenum);
                    629:       if (num < 0)
                    630:        {
                    631:          /* write failed either retry needed or error */
                    632:          if (ERRNO_IO_RETRY(errno))
                    633:                break;
                    634: 
                    635:           BGP_EVENT_ADD (peer, TCP_fatal_error);
                    636:          return 0;
                    637:        }
                    638: 
                    639:       if (num != writenum)
                    640:        {
                    641:          /* Partial write */
                    642:          stream_forward_getp (s, num);
                    643:          break;
                    644:        }
                    645: 
                    646:       /* Retrieve BGP packet type. */
                    647:       stream_set_getp (s, BGP_MARKER_SIZE + 2);
                    648:       type = stream_getc (s);
                    649: 
                    650:       switch (type)
                    651:        {
                    652:        case BGP_MSG_OPEN:
                    653:          peer->open_out++;
                    654:          break;
                    655:        case BGP_MSG_UPDATE:
                    656:          peer->update_out++;
                    657:          break;
                    658:        case BGP_MSG_NOTIFY:
                    659:          peer->notify_out++;
                    660:          /* Double start timer. */
                    661:          peer->v_start *= 2;
                    662: 
                    663:          /* Overflow check. */
                    664:          if (peer->v_start >= (60 * 2))
                    665:            peer->v_start = (60 * 2);
                    666: 
                    667:          /* Flush any existing events */
                    668:          BGP_EVENT_ADD (peer, BGP_Stop);
                    669:          return 0;
                    670:        case BGP_MSG_KEEPALIVE:
                    671:          peer->keepalive_out++;
                    672:          break;
                    673:        case BGP_MSG_ROUTE_REFRESH_NEW:
                    674:        case BGP_MSG_ROUTE_REFRESH_OLD:
                    675:          peer->refresh_out++;
                    676:          break;
                    677:        case BGP_MSG_CAPABILITY:
                    678:          peer->dynamic_cap_out++;
                    679:          break;
                    680:        }
                    681: 
                    682:       /* OK we send packet so delete it. */
                    683:       bgp_packet_delete (peer);
                    684:     }
                    685:   while (++count < BGP_WRITE_PACKET_MAX &&
                    686:         (s = bgp_write_packet (peer)) != NULL);
                    687:   
                    688:   if (bgp_write_proceed (peer))
                    689:     BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
                    690:   else
                    691:     sockopt_cork (peer->fd, 0);
                    692:   
                    693:   return 0;
                    694: }
                    695: 
                    696: /* This is only for sending NOTIFICATION message to neighbor. */
                    697: static int
                    698: bgp_write_notify (struct peer *peer)
                    699: {
                    700:   int ret, val;
                    701:   u_char type;
                    702:   struct stream *s; 
                    703: 
                    704:   /* There should be at least one packet. */
                    705:   s = stream_fifo_head (peer->obuf);
                    706:   if (!s)
                    707:     return 0;
                    708:   assert (stream_get_endp (s) >= BGP_HEADER_SIZE);
                    709: 
                    710:   /* Put socket in blocking mode. */
                    711:   val = fcntl (peer->fd, F_GETFL, 0);
                    712:   fcntl (peer->fd, F_SETFL, val & ~O_NONBLOCK);
                    713: 
                    714:   ret = writen (peer->fd, STREAM_DATA (s), stream_get_endp (s));
                    715:   if (ret <= 0)
                    716:     {
                    717:       BGP_EVENT_ADD (peer, TCP_fatal_error);
                    718:       return 0;
                    719:     }
                    720: 
                    721:   /* Retrieve BGP packet type. */
                    722:   stream_set_getp (s, BGP_MARKER_SIZE + 2);
                    723:   type = stream_getc (s);
                    724: 
                    725:   assert (type == BGP_MSG_NOTIFY);
                    726: 
                    727:   /* Type should be notify. */
                    728:   peer->notify_out++;
                    729: 
                    730:   /* Double start timer. */
                    731:   peer->v_start *= 2;
                    732: 
                    733:   /* Overflow check. */
                    734:   if (peer->v_start >= (60 * 2))
                    735:     peer->v_start = (60 * 2);
                    736: 
                    737:   BGP_EVENT_ADD (peer, BGP_Stop);
                    738: 
                    739:   return 0;
                    740: }
                    741: 
                    742: /* Make keepalive packet and send it to the peer. */
                    743: void
                    744: bgp_keepalive_send (struct peer *peer)
                    745: {
                    746:   struct stream *s;
                    747:   int length;
                    748: 
                    749:   s = stream_new (BGP_MAX_PACKET_SIZE);
                    750: 
                    751:   /* Make keepalive packet. */
                    752:   bgp_packet_set_marker (s, BGP_MSG_KEEPALIVE);
                    753: 
                    754:   /* Set packet size. */
                    755:   length = bgp_packet_set_size (s);
                    756: 
                    757:   /* Dump packet if debug option is set. */
                    758:   /* bgp_packet_dump (s); */
                    759:  
                    760:   if (BGP_DEBUG (keepalive, KEEPALIVE))  
                    761:     zlog_debug ("%s sending KEEPALIVE", peer->host); 
                    762:   if (BGP_DEBUG (normal, NORMAL))
                    763:     zlog_debug ("%s send message type %d, length (incl. header) %d",
                    764:                peer->host, BGP_MSG_KEEPALIVE, length);
                    765: 
                    766:   /* Add packet to the peer. */
                    767:   bgp_packet_add (peer, s);
                    768: 
                    769:   BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
                    770: }
                    771: 
                    772: /* Make open packet and send it to the peer. */
                    773: void
                    774: bgp_open_send (struct peer *peer)
                    775: {
                    776:   struct stream *s;
                    777:   int length;
                    778:   u_int16_t send_holdtime;
                    779:   as_t local_as;
                    780: 
                    781:   if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER))
                    782:     send_holdtime = peer->holdtime;
                    783:   else
                    784:     send_holdtime = peer->bgp->default_holdtime;
                    785: 
                    786:   /* local-as Change */
                    787:   if (peer->change_local_as)
                    788:     local_as = peer->change_local_as; 
                    789:   else
                    790:     local_as = peer->local_as; 
                    791: 
                    792:   s = stream_new (BGP_MAX_PACKET_SIZE);
                    793: 
                    794:   /* Make open packet. */
                    795:   bgp_packet_set_marker (s, BGP_MSG_OPEN);
                    796: 
                    797:   /* Set open packet values. */
                    798:   stream_putc (s, BGP_VERSION_4);        /* BGP version */
                    799:   stream_putw (s, (local_as <= BGP_AS_MAX) ? (u_int16_t) local_as 
                    800:                                            : BGP_AS_TRANS);
                    801:   stream_putw (s, send_holdtime);       /* Hold Time */
                    802:   stream_put_in_addr (s, &peer->local_id); /* BGP Identifier */
                    803: 
                    804:   /* Set capability code. */
                    805:   bgp_open_capability (s, peer);
                    806: 
                    807:   /* Set BGP packet length. */
                    808:   length = bgp_packet_set_size (s);
                    809: 
                    810:   if (BGP_DEBUG (normal, NORMAL))
                    811:     zlog_debug ("%s sending OPEN, version %d, my as %u, holdtime %d, id %s", 
                    812:               peer->host, BGP_VERSION_4, local_as,
                    813:               send_holdtime, inet_ntoa (peer->local_id));
                    814: 
                    815:   if (BGP_DEBUG (normal, NORMAL))
                    816:     zlog_debug ("%s send message type %d, length (incl. header) %d",
                    817:               peer->host, BGP_MSG_OPEN, length);
                    818: 
                    819:   /* Dump packet if debug option is set. */
                    820:   /* bgp_packet_dump (s); */
                    821: 
                    822:   /* Add packet to the peer. */
                    823:   bgp_packet_add (peer, s);
                    824: 
                    825:   BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
                    826: }
                    827: 
                    828: /* Send BGP notify packet with data potion. */
                    829: void
                    830: bgp_notify_send_with_data (struct peer *peer, u_char code, u_char sub_code,
                    831:                           u_char *data, size_t datalen)
                    832: {
                    833:   struct stream *s;
                    834:   int length;
                    835: 
                    836:   /* Allocate new stream. */
                    837:   s = stream_new (BGP_MAX_PACKET_SIZE);
                    838: 
                    839:   /* Make nitify packet. */
                    840:   bgp_packet_set_marker (s, BGP_MSG_NOTIFY);
                    841: 
                    842:   /* Set notify packet values. */
                    843:   stream_putc (s, code);        /* BGP notify code */
                    844:   stream_putc (s, sub_code);   /* BGP notify sub_code */
                    845: 
                    846:   /* If notify data is present. */
                    847:   if (data)
                    848:     stream_write (s, data, datalen);
                    849:   
                    850:   /* Set BGP packet length. */
                    851:   length = bgp_packet_set_size (s);
                    852:   
                    853:   /* Add packet to the peer. */
                    854:   stream_fifo_clean (peer->obuf);
                    855:   bgp_packet_add (peer, s);
                    856: 
                    857:   /* For debug */
                    858:   {
                    859:     struct bgp_notify bgp_notify;
                    860:     int first = 0;
                    861:     int i;
                    862:     char c[4];
                    863: 
                    864:     bgp_notify.code = code;
                    865:     bgp_notify.subcode = sub_code;
                    866:     bgp_notify.data = NULL;
                    867:     bgp_notify.length = length - BGP_MSG_NOTIFY_MIN_SIZE;
                    868:     
                    869:     if (bgp_notify.length)
                    870:       {
                    871:        bgp_notify.data = XMALLOC (MTYPE_TMP, bgp_notify.length * 3);
                    872:        for (i = 0; i < bgp_notify.length; i++)
                    873:          if (first)
                    874:            {
                    875:              sprintf (c, " %02x", data[i]);
                    876:              strcat (bgp_notify.data, c);
                    877:            }
                    878:          else
                    879:            {
                    880:              first = 1;
                    881:              sprintf (c, "%02x", data[i]);
                    882:              strcpy (bgp_notify.data, c);
                    883:            }
                    884:       }
                    885:     bgp_notify_print (peer, &bgp_notify, "sending");
                    886:     if (bgp_notify.data)
                    887:       XFREE (MTYPE_TMP, bgp_notify.data);
                    888:   }
                    889: 
                    890:   if (BGP_DEBUG (normal, NORMAL))
                    891:     zlog_debug ("%s send message type %d, length (incl. header) %d",
                    892:               peer->host, BGP_MSG_NOTIFY, length);
                    893: 
                    894:   /* peer reset cause */
                    895:   if (sub_code != BGP_NOTIFY_CEASE_CONFIG_CHANGE)
                    896:     {
                    897:       if (sub_code == BGP_NOTIFY_CEASE_ADMIN_RESET)
                    898:       {
                    899:         peer->last_reset = PEER_DOWN_USER_RESET;
                    900:         zlog_info ("Notification sent to neighbor %s: User reset", peer->host);
                    901:       }
                    902:       else if (sub_code == BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN)
                    903:       {
                    904:         peer->last_reset = PEER_DOWN_USER_SHUTDOWN;
                    905:         zlog_info ("Notification sent to neighbor %s: shutdown", peer->host);
                    906:       }
                    907:       else
                    908:       {
                    909:         peer->last_reset = PEER_DOWN_NOTIFY_SEND;
                    910:         zlog_info ("Notification sent to neighbor %s: type %u/%u",
                    911:                    peer->host, code, sub_code);
                    912:       }
                    913:     }
                    914:   else
                    915:      zlog_info ("Notification sent to neighbor %s: configuration change",
                    916:                 peer->host);
                    917: 
                    918:   /* Call immediately. */
                    919:   BGP_WRITE_OFF (peer->t_write);
                    920: 
                    921:   bgp_write_notify (peer);
                    922: }
                    923: 
                    924: /* Send BGP notify packet. */
                    925: void
                    926: bgp_notify_send (struct peer *peer, u_char code, u_char sub_code)
                    927: {
                    928:   bgp_notify_send_with_data (peer, code, sub_code, NULL, 0);
                    929: }
                    930: 
                    931: /* Send route refresh message to the peer. */
                    932: void
                    933: bgp_route_refresh_send (struct peer *peer, afi_t afi, safi_t safi,
                    934:                        u_char orf_type, u_char when_to_refresh, int remove)
                    935: {
                    936:   struct stream *s;
                    937:   struct stream *packet;
                    938:   int length;
                    939:   struct bgp_filter *filter;
                    940:   int orf_refresh = 0;
                    941: 
                    942:   if (DISABLE_BGP_ANNOUNCE)
                    943:     return;
                    944: 
                    945:   filter = &peer->filter[afi][safi];
                    946: 
                    947:   /* Adjust safi code. */
                    948:   if (safi == SAFI_MPLS_VPN)
                    949:     safi = BGP_SAFI_VPNV4;
                    950:   
                    951:   s = stream_new (BGP_MAX_PACKET_SIZE);
                    952: 
                    953:   /* Make BGP update packet. */
                    954:   if (CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV))
                    955:     bgp_packet_set_marker (s, BGP_MSG_ROUTE_REFRESH_NEW);
                    956:   else
                    957:     bgp_packet_set_marker (s, BGP_MSG_ROUTE_REFRESH_OLD);
                    958: 
                    959:   /* Encode Route Refresh message. */
                    960:   stream_putw (s, afi);
                    961:   stream_putc (s, 0);
                    962:   stream_putc (s, safi);
                    963:  
                    964:   if (orf_type == ORF_TYPE_PREFIX
                    965:       || orf_type == ORF_TYPE_PREFIX_OLD)
                    966:     if (remove || filter->plist[FILTER_IN].plist)
                    967:       {
                    968:        u_int16_t orf_len;
                    969:        unsigned long orfp;
                    970: 
                    971:        orf_refresh = 1; 
                    972:        stream_putc (s, when_to_refresh);
                    973:        stream_putc (s, orf_type);
                    974:        orfp = stream_get_endp (s);
                    975:        stream_putw (s, 0);
                    976: 
                    977:        if (remove)
                    978:          {
                    979:            UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND);
                    980:            stream_putc (s, ORF_COMMON_PART_REMOVE_ALL);
                    981:            if (BGP_DEBUG (normal, NORMAL))
                    982:              zlog_debug ("%s sending REFRESH_REQ to remove ORF(%d) (%s) for afi/safi: %d/%d", 
                    983:                         peer->host, orf_type,
                    984:                         (when_to_refresh == REFRESH_DEFER ? "defer" : "immediate"),
                    985:                         afi, safi);
                    986:          }
                    987:        else
                    988:          {
                    989:            SET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_PREFIX_SEND);
                    990:            prefix_bgp_orf_entry (s, filter->plist[FILTER_IN].plist,
                    991:                                  ORF_COMMON_PART_ADD, ORF_COMMON_PART_PERMIT,
                    992:                                  ORF_COMMON_PART_DENY);
                    993:            if (BGP_DEBUG (normal, NORMAL))
                    994:              zlog_debug ("%s sending REFRESH_REQ with pfxlist ORF(%d) (%s) for afi/safi: %d/%d", 
                    995:                         peer->host, orf_type,
                    996:                         (when_to_refresh == REFRESH_DEFER ? "defer" : "immediate"),
                    997:                         afi, safi);
                    998:          }
                    999: 
                   1000:        /* Total ORF Entry Len. */
                   1001:        orf_len = stream_get_endp (s) - orfp - 2;
                   1002:        stream_putw_at (s, orfp, orf_len);
                   1003:       }
                   1004: 
                   1005:   /* Set packet size. */
                   1006:   length = bgp_packet_set_size (s);
                   1007: 
                   1008:   if (BGP_DEBUG (normal, NORMAL))
                   1009:     {
                   1010:       if (! orf_refresh)
                   1011:        zlog_debug ("%s sending REFRESH_REQ for afi/safi: %d/%d", 
                   1012:                   peer->host, afi, safi);
                   1013:       zlog_debug ("%s send message type %d, length (incl. header) %d",
                   1014:                 peer->host, CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_NEW_RCV) ?
                   1015:                 BGP_MSG_ROUTE_REFRESH_NEW : BGP_MSG_ROUTE_REFRESH_OLD, length);
                   1016:     }
                   1017: 
                   1018:   /* Make real packet. */
                   1019:   packet = stream_dup (s);
                   1020:   stream_free (s);
                   1021: 
                   1022:   /* Add packet to the peer. */
                   1023:   bgp_packet_add (peer, packet);
                   1024: 
                   1025:   BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
                   1026: }
                   1027: 
                   1028: /* Send capability message to the peer. */
                   1029: void
                   1030: bgp_capability_send (struct peer *peer, afi_t afi, safi_t safi,
                   1031:                     int capability_code, int action)
                   1032: {
                   1033:   struct stream *s;
                   1034:   struct stream *packet;
                   1035:   int length;
                   1036: 
                   1037:   /* Adjust safi code. */
                   1038:   if (safi == SAFI_MPLS_VPN)
                   1039:     safi = BGP_SAFI_VPNV4;
                   1040: 
                   1041:   s = stream_new (BGP_MAX_PACKET_SIZE);
                   1042: 
                   1043:   /* Make BGP update packet. */
                   1044:   bgp_packet_set_marker (s, BGP_MSG_CAPABILITY);
                   1045: 
                   1046:   /* Encode MP_EXT capability. */
                   1047:   if (capability_code == CAPABILITY_CODE_MP)
                   1048:     {
                   1049:       stream_putc (s, action);
                   1050:       stream_putc (s, CAPABILITY_CODE_MP);
                   1051:       stream_putc (s, CAPABILITY_CODE_MP_LEN);
                   1052:       stream_putw (s, afi);
                   1053:       stream_putc (s, 0);
                   1054:       stream_putc (s, safi);
                   1055: 
                   1056:       if (BGP_DEBUG (normal, NORMAL))
                   1057:         zlog_debug ("%s sending CAPABILITY has %s MP_EXT CAP for afi/safi: %d/%d",
                   1058:                   peer->host, action == CAPABILITY_ACTION_SET ?
                   1059:                   "Advertising" : "Removing", afi, safi);
                   1060:     }
                   1061: 
                   1062:   /* Set packet size. */
                   1063:   length = bgp_packet_set_size (s);
                   1064: 
                   1065:   /* Make real packet. */
                   1066:   packet = stream_dup (s);
                   1067:   stream_free (s);
                   1068: 
                   1069:   /* Add packet to the peer. */
                   1070:   bgp_packet_add (peer, packet);
                   1071: 
                   1072:   if (BGP_DEBUG (normal, NORMAL))
                   1073:     zlog_debug ("%s send message type %d, length (incl. header) %d",
                   1074:               peer->host, BGP_MSG_CAPABILITY, length);
                   1075: 
                   1076:   BGP_WRITE_ON (peer->t_write, bgp_write, peer->fd);
                   1077: }
                   1078: 
                   1079: /* RFC1771 6.8 Connection collision detection. */
                   1080: static int
                   1081: bgp_collision_detect (struct peer *new, struct in_addr remote_id)
                   1082: {
                   1083:   struct peer *peer;
                   1084:   struct listnode *node, *nnode;
                   1085:   struct bgp *bgp;
                   1086: 
                   1087:   bgp = bgp_get_default ();
                   1088:   if (! bgp)
                   1089:     return 0;
                   1090:   
                   1091:   /* Upon receipt of an OPEN message, the local system must examine
                   1092:      all of its connections that are in the OpenConfirm state.  A BGP
                   1093:      speaker may also examine connections in an OpenSent state if it
                   1094:      knows the BGP Identifier of the peer by means outside of the
                   1095:      protocol.  If among these connections there is a connection to a
                   1096:      remote BGP speaker whose BGP Identifier equals the one in the
                   1097:      OPEN message, then the local system performs the following
                   1098:      collision resolution procedure: */
                   1099: 
                   1100:   for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
                   1101:     {
                   1102:       /* Under OpenConfirm status, local peer structure already hold
                   1103:          remote router ID. */
                   1104: 
                   1105:       if (peer != new
                   1106:          && (peer->status == OpenConfirm || peer->status == OpenSent)
                   1107:          && sockunion_same (&peer->su, &new->su))
                   1108:        {
                   1109:          /* 1. The BGP Identifier of the local system is compared to
                   1110:             the BGP Identifier of the remote system (as specified in
                   1111:             the OPEN message). */
                   1112: 
                   1113:          if (ntohl (peer->local_id.s_addr) < ntohl (remote_id.s_addr))
                   1114:            {
                   1115:              /* 2. If the value of the local BGP Identifier is less
                   1116:                 than the remote one, the local system closes BGP
                   1117:                 connection that already exists (the one that is
                   1118:                 already in the OpenConfirm state), and accepts BGP
                   1119:                 connection initiated by the remote system. */
                   1120: 
                   1121:              if (peer->fd >= 0)
                   1122:                bgp_notify_send (peer, BGP_NOTIFY_CEASE, BGP_NOTIFY_CEASE_COLLISION_RESOLUTION);
                   1123:              return 1;
                   1124:            }
                   1125:          else
                   1126:            {
                   1127:              /* 3. Otherwise, the local system closes newly created
                   1128:                 BGP connection (the one associated with the newly
                   1129:                 received OPEN message), and continues to use the
                   1130:                 existing one (the one that is already in the
                   1131:                 OpenConfirm state). */
                   1132: 
                   1133:              if (new->fd >= 0)
                   1134:                bgp_notify_send (new, BGP_NOTIFY_CEASE, 
                   1135:                                 BGP_NOTIFY_CEASE_COLLISION_RESOLUTION);
                   1136:              return -1;
                   1137:            }
                   1138:        }
                   1139:     }
                   1140:   return 0;
                   1141: }
                   1142: 
                   1143: static int
                   1144: bgp_open_receive (struct peer *peer, bgp_size_t size)
                   1145: {
                   1146:   int ret;
                   1147:   u_char version;
                   1148:   u_char optlen;
                   1149:   u_int16_t holdtime;
                   1150:   u_int16_t send_holdtime;
                   1151:   as_t remote_as;
                   1152:   as_t as4 = 0;
                   1153:   struct peer *realpeer;
                   1154:   struct in_addr remote_id;
                   1155:   int capability;
                   1156:   u_int8_t notify_data_remote_as[2];
                   1157:   u_int8_t notify_data_remote_id[4];
                   1158: 
                   1159:   realpeer = NULL;
                   1160:   
                   1161:   /* Parse open packet. */
                   1162:   version = stream_getc (peer->ibuf);
                   1163:   memcpy (notify_data_remote_as, stream_pnt (peer->ibuf), 2);
                   1164:   remote_as  = stream_getw (peer->ibuf);
                   1165:   holdtime = stream_getw (peer->ibuf);
                   1166:   memcpy (notify_data_remote_id, stream_pnt (peer->ibuf), 4);
                   1167:   remote_id.s_addr = stream_get_ipv4 (peer->ibuf);
                   1168: 
                   1169:   /* Receive OPEN message log  */
                   1170:   if (BGP_DEBUG (normal, NORMAL))
                   1171:     zlog_debug ("%s rcv OPEN, version %d, remote-as (in open) %u,"
                   1172:                 " holdtime %d, id %s",
                   1173:                peer->host, version, remote_as, holdtime,
                   1174:                inet_ntoa (remote_id));
                   1175:   
                   1176:   /* BEGIN to read the capability here, but dont do it yet */
                   1177:   capability = 0;
                   1178:   optlen = stream_getc (peer->ibuf);
                   1179:   
                   1180:   if (optlen != 0)
                   1181:     {
                   1182:       /* We need the as4 capability value *right now* because
                   1183:        * if it is there, we have not got the remote_as yet, and without
                   1184:        * that we do not know which peer is connecting to us now.
                   1185:        */ 
                   1186:       as4 = peek_for_as4_capability (peer, optlen);
                   1187:     }
                   1188:   
                   1189:   /* Just in case we have a silly peer who sends AS4 capability set to 0 */
                   1190:   if (CHECK_FLAG (peer->cap, PEER_CAP_AS4_RCV) && !as4)
                   1191:     {
                   1192:       zlog_err ("%s bad OPEN, got AS4 capability, but AS4 set to 0",
                   1193:                 peer->host);
                   1194:       bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR,
                   1195:                        BGP_NOTIFY_OPEN_BAD_PEER_AS);
                   1196:       return -1;
                   1197:     }
                   1198:   
                   1199:   if (remote_as == BGP_AS_TRANS)
                   1200:     {
                   1201:          /* Take the AS4 from the capability.  We must have received the
                   1202:           * capability now!  Otherwise we have a asn16 peer who uses
                   1203:           * BGP_AS_TRANS, for some unknown reason.
                   1204:           */
                   1205:       if (as4 == BGP_AS_TRANS)
                   1206:         {
                   1207:           zlog_err ("%s [AS4] NEW speaker using AS_TRANS for AS4, not allowed",
                   1208:                     peer->host);
                   1209:           bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR,
                   1210:                  BGP_NOTIFY_OPEN_BAD_PEER_AS);
                   1211:           return -1;
                   1212:         }
                   1213:       
                   1214:       if (!as4 && BGP_DEBUG (as4, AS4))
                   1215:         zlog_debug ("%s [AS4] OPEN remote_as is AS_TRANS, but no AS4."
                   1216:                     " Odd, but proceeding.", peer->host);
                   1217:       else if (as4 < BGP_AS_MAX && BGP_DEBUG (as4, AS4))
                   1218:         zlog_debug ("%s [AS4] OPEN remote_as is AS_TRANS, but AS4 (%u) fits "
                   1219:                     "in 2-bytes, very odd peer.", peer->host, as4);
                   1220:       if (as4)
                   1221:         remote_as = as4;
                   1222:     } 
                   1223:   else 
                   1224:     {
                   1225:       /* We may have a partner with AS4 who has an asno < BGP_AS_MAX */
                   1226:       /* If we have got the capability, peer->as4cap must match remote_as */
                   1227:       if (CHECK_FLAG (peer->cap, PEER_CAP_AS4_RCV)
                   1228:           && as4 != remote_as)
                   1229:         {
                   1230:          /* raise error, log this, close session */
                   1231:          zlog_err ("%s bad OPEN, got AS4 capability, but remote_as %u"
                   1232:                    " mismatch with 16bit 'myasn' %u in open",
                   1233:                    peer->host, as4, remote_as);
                   1234:          bgp_notify_send (peer, BGP_NOTIFY_OPEN_ERR,
                   1235:                           BGP_NOTIFY_OPEN_BAD_PEER_AS);
                   1236:          return -1;
                   1237:        }
                   1238:     }
                   1239: 
                   1240:   /* Lookup peer from Open packet. */
                   1241:   if (CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
                   1242:     {
                   1243:       int as = 0;
                   1244: 
                   1245:       realpeer = peer_lookup_with_open (&peer->su, remote_as, &remote_id, &as);
                   1246: 
                   1247:       if (! realpeer)
                   1248:        {
                   1249:          /* Peer's source IP address is check in bgp_accept(), so this
                   1250:             must be AS number mismatch or remote-id configuration
                   1251:             mismatch. */
                   1252:          if (as)
                   1253:            {
                   1254:              if (BGP_DEBUG (normal, NORMAL))
                   1255:                zlog_debug ("%s bad OPEN, wrong router identifier %s",
                   1256:                            peer->host, inet_ntoa (remote_id));
                   1257:              bgp_notify_send_with_data (peer, BGP_NOTIFY_OPEN_ERR, 
                   1258:                                         BGP_NOTIFY_OPEN_BAD_BGP_IDENT,
                   1259:                                         notify_data_remote_id, 4);
                   1260:            }
                   1261:          else
                   1262:            {
                   1263:              if (BGP_DEBUG (normal, NORMAL))
                   1264:                zlog_debug ("%s bad OPEN, remote AS is %u, expected %u",
                   1265:                            peer->host, remote_as, peer->as);
                   1266:              bgp_notify_send_with_data (peer, BGP_NOTIFY_OPEN_ERR,
                   1267:                                         BGP_NOTIFY_OPEN_BAD_PEER_AS,
                   1268:                                         notify_data_remote_as, 2);
                   1269:            }
                   1270:          return -1;
                   1271:        }
                   1272:     }
                   1273: 
                   1274:   /* When collision is detected and this peer is closed.  Retrun
                   1275:      immidiately. */
                   1276:   ret = bgp_collision_detect (peer, remote_id);
                   1277:   if (ret < 0)
                   1278:     return ret;
                   1279: 
                   1280:   /* Hack part. */
                   1281:   if (CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
                   1282:     {
                   1283:        if (realpeer->status == Established
                   1284:            && CHECK_FLAG (realpeer->sflags, PEER_STATUS_NSF_MODE))
                   1285:        {
                   1286:          realpeer->last_reset = PEER_DOWN_NSF_CLOSE_SESSION;
                   1287:          SET_FLAG (realpeer->sflags, PEER_STATUS_NSF_WAIT);
                   1288:        }
                   1289:        else if (ret == 0 && realpeer->status != Active
                   1290:                 && realpeer->status != OpenSent
                   1291:                 && realpeer->status != OpenConfirm
                   1292:                 && realpeer->status != Connect)
                   1293:        {
                   1294:          /* XXX: This is an awful problem.. 
                   1295:           *
                   1296:           * According to the RFC we should just let this connection (of the
                   1297:           * accepted 'peer') continue on to Established if the other
                   1298:           * connection (the 'realpeer' one) is in state Connect, and deal
                   1299:           * with the more larval FSM as/when it gets far enough to receive
                   1300:           * an Open. We don't do that though, we instead close the (more
                   1301:           * developed) accepted connection.
                   1302:           *
                   1303:           * This means there's a race, which if hit, can loop:
                   1304:           *
                   1305:           *       FSM for A                        FSM for B
                   1306:           *  realpeer     accept-peer       realpeer     accept-peer
                   1307:           *
                   1308:           *  Connect                        Connect
                   1309:           *               Active
                   1310:           *               OpenSent          OpenSent
                   1311:           *               <arrive here,
                   1312:           *               Notify, delete>   
                   1313:           *                                 Idle         Active
                   1314:           *   OpenSent                                   OpenSent
                   1315:           *                                              <arrive here,
                   1316:           *                                              Notify, delete>
                   1317:           *   Idle
                   1318:           *   <wait>                        <wait>
                   1319:           *   Connect                       Connect
                   1320:           *
                   1321:            *
                   1322:           * If both sides are Quagga, they're almost certain to wait for
                   1323:           * the same amount of time of course (which doesn't preclude other
                   1324:           * implementations also waiting for same time). The race is
                   1325:           * exacerbated by high-latency (in bgpd and/or the network).
                   1326:           *
                   1327:           * The reason we do this is because our FSM is tied to our peer
                   1328:           * structure, which carries our configuration information, etc. 
                   1329:           * I.e. we can't let the accepted-peer FSM continue on as it is,
                   1330:           * cause it's not associated with any actual peer configuration -
                   1331:           * it's just a dummy.
                   1332:           *
                   1333:           * It's possible we could hack-fix this by just bgp_stop'ing the
                   1334:           * realpeer and continueing on with the 'transfer FSM' below. 
                   1335:           * Ideally, we need to seperate FSMs from struct peer.
                   1336:           *
                   1337:           * Setting one side to passive avoids the race, as a workaround.
                   1338:           */
                   1339:          if (BGP_DEBUG (events, EVENTS))
                   1340:            zlog_debug ("%s peer status is %s close connection",
                   1341:                        realpeer->host, LOOKUP (bgp_status_msg,
                   1342:                        realpeer->status));
                   1343:          bgp_notify_send (peer, BGP_NOTIFY_CEASE,
                   1344:                           BGP_NOTIFY_CEASE_CONNECT_REJECT);
                   1345: 
                   1346:          return -1;
                   1347:        }
                   1348: 
                   1349:       if (BGP_DEBUG (events, EVENTS))
                   1350:        zlog_debug ("%s [Event] Transfer accept BGP peer to real (state %s)",
                   1351:                   peer->host, 
                   1352:                   LOOKUP (bgp_status_msg, realpeer->status));
                   1353: 
                   1354:       bgp_stop (realpeer);
                   1355:       
                   1356:       /* Transfer file descriptor. */
                   1357:       realpeer->fd = peer->fd;
                   1358:       peer->fd = -1;
                   1359: 
                   1360:       /* Transfer input buffer. */
                   1361:       stream_free (realpeer->ibuf);
                   1362:       realpeer->ibuf = peer->ibuf;
                   1363:       realpeer->packet_size = peer->packet_size;
                   1364:       peer->ibuf = NULL;
                   1365: 
                   1366:       /* Transfer status. */
                   1367:       realpeer->status = peer->status;
                   1368:       bgp_stop (peer);
                   1369:       
                   1370:       /* peer pointer change. Open packet send to neighbor. */
                   1371:       peer = realpeer;
                   1372:       bgp_open_send (peer);
                   1373:       if (peer->fd < 0)
                   1374:        {
                   1375:          zlog_err ("bgp_open_receive peer's fd is negative value %d",
                   1376:                    peer->fd);
                   1377:          return -1;
                   1378:        }
                   1379:       BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
                   1380:     }
                   1381: 
                   1382:   /* remote router-id check. */
                   1383:   if (remote_id.s_addr == 0
                   1384:       || ntohl (remote_id.s_addr) >= 0xe0000000
                   1385:       || ntohl (peer->local_id.s_addr) == ntohl (remote_id.s_addr))
                   1386:     {
                   1387:       if (BGP_DEBUG (normal, NORMAL))
                   1388:        zlog_debug ("%s bad OPEN, wrong router identifier %s",
                   1389:                   peer->host, inet_ntoa (remote_id));
                   1390:       bgp_notify_send_with_data (peer, 
                   1391:                                 BGP_NOTIFY_OPEN_ERR, 
                   1392:                                 BGP_NOTIFY_OPEN_BAD_BGP_IDENT,
                   1393:                                 notify_data_remote_id, 4);
                   1394:       return -1;
                   1395:     }
                   1396: 
                   1397:   /* Set remote router-id */
                   1398:   peer->remote_id = remote_id;
                   1399: 
                   1400:   /* Peer BGP version check. */
                   1401:   if (version != BGP_VERSION_4)
                   1402:     {
                   1403:       u_int8_t maxver = BGP_VERSION_4;
                   1404:       if (BGP_DEBUG (normal, NORMAL))
                   1405:        zlog_debug ("%s bad protocol version, remote requested %d, local request %d",
                   1406:                   peer->host, version, BGP_VERSION_4);
                   1407:       bgp_notify_send_with_data (peer, 
                   1408:                                 BGP_NOTIFY_OPEN_ERR, 
                   1409:                                 BGP_NOTIFY_OPEN_UNSUP_VERSION,
                   1410:                                 &maxver, 1);
                   1411:       return -1;
                   1412:     }
                   1413: 
                   1414:   /* Check neighbor as number. */
                   1415:   if (remote_as != peer->as)
                   1416:     {
                   1417:       if (BGP_DEBUG (normal, NORMAL))
                   1418:        zlog_debug ("%s bad OPEN, remote AS is %u, expected %u",
                   1419:                   peer->host, remote_as, peer->as);
                   1420:       bgp_notify_send_with_data (peer, 
                   1421:                                 BGP_NOTIFY_OPEN_ERR, 
                   1422:                                 BGP_NOTIFY_OPEN_BAD_PEER_AS,
                   1423:                                 notify_data_remote_as, 2);
                   1424:       return -1;
                   1425:     }
                   1426: 
                   1427:   /* From the rfc: Upon receipt of an OPEN message, a BGP speaker MUST
                   1428:      calculate the value of the Hold Timer by using the smaller of its
                   1429:      configured Hold Time and the Hold Time received in the OPEN message.
                   1430:      The Hold Time MUST be either zero or at least three seconds.  An
                   1431:      implementation may reject connections on the basis of the Hold Time. */
                   1432: 
                   1433:   if (holdtime < 3 && holdtime != 0)
                   1434:     {
                   1435:       bgp_notify_send (peer,
                   1436:                       BGP_NOTIFY_OPEN_ERR, 
                   1437:                       BGP_NOTIFY_OPEN_UNACEP_HOLDTIME);
                   1438:       return -1;
                   1439:     }
                   1440:     
                   1441:   /* From the rfc: A reasonable maximum time between KEEPALIVE messages
                   1442:      would be one third of the Hold Time interval.  KEEPALIVE messages
                   1443:      MUST NOT be sent more frequently than one per second.  An
                   1444:      implementation MAY adjust the rate at which it sends KEEPALIVE
                   1445:      messages as a function of the Hold Time interval. */
                   1446: 
                   1447:   if (CHECK_FLAG (peer->config, PEER_CONFIG_TIMER))
                   1448:     send_holdtime = peer->holdtime;
                   1449:   else
                   1450:     send_holdtime = peer->bgp->default_holdtime;
                   1451: 
                   1452:   if (holdtime < send_holdtime)
                   1453:     peer->v_holdtime = holdtime;
                   1454:   else
                   1455:     peer->v_holdtime = send_holdtime;
                   1456: 
                   1457:   peer->v_keepalive = peer->v_holdtime / 3;
                   1458: 
                   1459:   /* Open option part parse. */
                   1460:   if (optlen != 0) 
                   1461:     {
1.1.1.2 ! misho    1462:       if ((ret = bgp_open_option_parse (peer, optlen, &capability)) < 0)
        !          1463:         {
        !          1464:           bgp_notify_send (peer,
        !          1465:                  BGP_NOTIFY_OPEN_ERR,
        !          1466:                  BGP_NOTIFY_OPEN_UNACEP_HOLDTIME);
        !          1467:          return ret;
        !          1468:         }
1.1       misho    1469:     }
                   1470:   else
                   1471:     {
                   1472:       if (BGP_DEBUG (normal, NORMAL))
                   1473:        zlog_debug ("%s rcvd OPEN w/ OPTION parameter len: 0",
                   1474:                   peer->host);
                   1475:     }
                   1476: 
                   1477:   /* Override capability. */
                   1478:   if (! capability || CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
                   1479:     {
                   1480:       peer->afc_nego[AFI_IP][SAFI_UNICAST] = peer->afc[AFI_IP][SAFI_UNICAST];
                   1481:       peer->afc_nego[AFI_IP][SAFI_MULTICAST] = peer->afc[AFI_IP][SAFI_MULTICAST];
                   1482:       peer->afc_nego[AFI_IP6][SAFI_UNICAST] = peer->afc[AFI_IP6][SAFI_UNICAST];
                   1483:       peer->afc_nego[AFI_IP6][SAFI_MULTICAST] = peer->afc[AFI_IP6][SAFI_MULTICAST];
                   1484:     }
                   1485: 
                   1486:   /* Get sockname. */
                   1487:   bgp_getsockname (peer);
                   1488: 
                   1489:   BGP_EVENT_ADD (peer, Receive_OPEN_message);
                   1490: 
                   1491:   peer->packet_size = 0;
                   1492:   if (peer->ibuf)
                   1493:     stream_reset (peer->ibuf);
                   1494: 
                   1495:   return 0;
                   1496: }
                   1497: 
                   1498: /* Parse BGP Update packet and make attribute object. */
                   1499: static int
                   1500: bgp_update_receive (struct peer *peer, bgp_size_t size)
                   1501: {
                   1502:   int ret;
                   1503:   u_char *end;
                   1504:   struct stream *s;
                   1505:   struct attr attr;
                   1506:   bgp_size_t attribute_len;
                   1507:   bgp_size_t update_len;
                   1508:   bgp_size_t withdraw_len;
                   1509:   struct bgp_nlri update;
                   1510:   struct bgp_nlri withdraw;
                   1511:   struct bgp_nlri mp_update;
                   1512:   struct bgp_nlri mp_withdraw;
                   1513:   char attrstr[BUFSIZ] = "";
                   1514: 
                   1515:   /* Status must be Established. */
                   1516:   if (peer->status != Established) 
                   1517:     {
                   1518:       zlog_err ("%s [FSM] Update packet received under status %s",
                   1519:                peer->host, LOOKUP (bgp_status_msg, peer->status));
                   1520:       bgp_notify_send (peer, BGP_NOTIFY_FSM_ERR, 0);
                   1521:       return -1;
                   1522:     }
                   1523: 
                   1524:   /* Set initial values. */
                   1525:   memset (&attr, 0, sizeof (struct attr));
                   1526:   memset (&update, 0, sizeof (struct bgp_nlri));
                   1527:   memset (&withdraw, 0, sizeof (struct bgp_nlri));
                   1528:   memset (&mp_update, 0, sizeof (struct bgp_nlri));
                   1529:   memset (&mp_withdraw, 0, sizeof (struct bgp_nlri));
                   1530: 
                   1531:   s = peer->ibuf;
                   1532:   end = stream_pnt (s) + size;
                   1533: 
                   1534:   /* RFC1771 6.3 If the Unfeasible Routes Length or Total Attribute
                   1535:      Length is too large (i.e., if Unfeasible Routes Length + Total
                   1536:      Attribute Length + 23 exceeds the message Length), then the Error
                   1537:      Subcode is set to Malformed Attribute List.  */
                   1538:   if (stream_pnt (s) + 2 > end)
                   1539:     {
                   1540:       zlog_err ("%s [Error] Update packet error"
                   1541:                " (packet length is short for unfeasible length)",
                   1542:                peer->host);
                   1543:       bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR, 
                   1544:                       BGP_NOTIFY_UPDATE_MAL_ATTR);
                   1545:       return -1;
                   1546:     }
                   1547: 
                   1548:   /* Unfeasible Route Length. */
                   1549:   withdraw_len = stream_getw (s);
                   1550: 
                   1551:   /* Unfeasible Route Length check. */
                   1552:   if (stream_pnt (s) + withdraw_len > end)
                   1553:     {
                   1554:       zlog_err ("%s [Error] Update packet error"
                   1555:                " (packet unfeasible length overflow %d)",
                   1556:                peer->host, withdraw_len);
                   1557:       bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR, 
                   1558:                       BGP_NOTIFY_UPDATE_MAL_ATTR);
                   1559:       return -1;
                   1560:     }
                   1561: 
                   1562:   /* Unfeasible Route packet format check. */
                   1563:   if (withdraw_len > 0)
                   1564:     {
                   1565:       ret = bgp_nlri_sanity_check (peer, AFI_IP, stream_pnt (s), withdraw_len);
                   1566:       if (ret < 0)
                   1567:        return -1;
                   1568: 
                   1569:       if (BGP_DEBUG (packet, PACKET_RECV))
                   1570:        zlog_debug ("%s [Update:RECV] Unfeasible NLRI received", peer->host);
                   1571: 
                   1572:       withdraw.afi = AFI_IP;
                   1573:       withdraw.safi = SAFI_UNICAST;
                   1574:       withdraw.nlri = stream_pnt (s);
                   1575:       withdraw.length = withdraw_len;
                   1576:       stream_forward_getp (s, withdraw_len);
                   1577:     }
                   1578:   
                   1579:   /* Attribute total length check. */
                   1580:   if (stream_pnt (s) + 2 > end)
                   1581:     {
                   1582:       zlog_warn ("%s [Error] Packet Error"
                   1583:                 " (update packet is short for attribute length)",
                   1584:                 peer->host);
                   1585:       bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR, 
                   1586:                       BGP_NOTIFY_UPDATE_MAL_ATTR);
                   1587:       return -1;
                   1588:     }
                   1589: 
                   1590:   /* Fetch attribute total length. */
                   1591:   attribute_len = stream_getw (s);
                   1592: 
                   1593:   /* Attribute length check. */
                   1594:   if (stream_pnt (s) + attribute_len > end)
                   1595:     {
                   1596:       zlog_warn ("%s [Error] Packet Error"
                   1597:                 " (update packet attribute length overflow %d)",
                   1598:                 peer->host, attribute_len);
                   1599:       bgp_notify_send (peer, BGP_NOTIFY_UPDATE_ERR, 
                   1600:                       BGP_NOTIFY_UPDATE_MAL_ATTR);
                   1601:       return -1;
                   1602:     }
                   1603:   
                   1604:   /* Certain attribute parsing errors should not be considered bad enough
                   1605:    * to reset the session for, most particularly any partial/optional
                   1606:    * attributes that have 'tunneled' over speakers that don't understand
                   1607:    * them. Instead we withdraw only the prefix concerned.
                   1608:    * 
                   1609:    * Complicates the flow a little though..
                   1610:    */
                   1611:   bgp_attr_parse_ret_t attr_parse_ret = BGP_ATTR_PARSE_PROCEED;
                   1612:   /* This define morphs the update case into a withdraw when lower levels
                   1613:    * have signalled an error condition where this is best.
                   1614:    */
                   1615: #define NLRI_ATTR_ARG (attr_parse_ret != BGP_ATTR_PARSE_WITHDRAW ? &attr : NULL)
                   1616: 
                   1617:   /* Parse attribute when it exists. */
                   1618:   if (attribute_len)
                   1619:     {
                   1620:       attr_parse_ret = bgp_attr_parse (peer, &attr, attribute_len, 
                   1621:                            &mp_update, &mp_withdraw);
                   1622:       if (attr_parse_ret == BGP_ATTR_PARSE_ERROR)
                   1623:        return -1;
                   1624:     }
                   1625:   
                   1626:   /* Logging the attribute. */
                   1627:   if (attr_parse_ret == BGP_ATTR_PARSE_WITHDRAW
                   1628:       || BGP_DEBUG (update, UPDATE_IN))
                   1629:     {
                   1630:       ret= bgp_dump_attr (peer, &attr, attrstr, BUFSIZ);
                   1631:       int lvl = (attr_parse_ret == BGP_ATTR_PARSE_WITHDRAW)
                   1632:                  ? LOG_ERR : LOG_DEBUG;
                   1633:       
                   1634:       if (attr_parse_ret == BGP_ATTR_PARSE_WITHDRAW)
                   1635:         zlog (peer->log, LOG_ERR,
                   1636:               "%s rcvd UPDATE with errors in attr(s)!! Withdrawing route.",
                   1637:               peer->host);
                   1638: 
                   1639:       if (ret)
                   1640:        zlog (peer->log, lvl, "%s rcvd UPDATE w/ attr: %s",
                   1641:              peer->host, attrstr);
                   1642:     }
                   1643:   
                   1644:   /* Network Layer Reachability Information. */
                   1645:   update_len = end - stream_pnt (s);
                   1646: 
                   1647:   if (update_len)
                   1648:     {
                   1649:       /* Check NLRI packet format and prefix length. */
                   1650:       ret = bgp_nlri_sanity_check (peer, AFI_IP, stream_pnt (s), update_len);
                   1651:       if (ret < 0)
                   1652:         {
                   1653:           bgp_attr_unintern_sub (&attr);
                   1654:           if (attr.extra)
                   1655:             bgp_attr_extra_free (&attr);
                   1656:          return -1;
                   1657:        }
                   1658: 
                   1659:       /* Set NLRI portion to structure. */
                   1660:       update.afi = AFI_IP;
                   1661:       update.safi = SAFI_UNICAST;
                   1662:       update.nlri = stream_pnt (s);
                   1663:       update.length = update_len;
                   1664:       stream_forward_getp (s, update_len);
                   1665:     }
                   1666: 
                   1667:   /* NLRI is processed only when the peer is configured specific
                   1668:      Address Family and Subsequent Address Family. */
                   1669:   if (peer->afc[AFI_IP][SAFI_UNICAST])
                   1670:     {
                   1671:       if (withdraw.length)
                   1672:        bgp_nlri_parse (peer, NULL, &withdraw);
                   1673: 
                   1674:       if (update.length)
                   1675:        {
                   1676:          /* We check well-known attribute only for IPv4 unicast
                   1677:             update. */
                   1678:          ret = bgp_attr_check (peer, &attr);
                   1679:          if (ret < 0)
                   1680:            {
                   1681:              bgp_attr_unintern_sub (&attr);
                   1682:               if (attr.extra)
                   1683:                 bgp_attr_extra_free (&attr);
                   1684:              return -1;
                   1685:             }
                   1686: 
                   1687:          bgp_nlri_parse (peer, NLRI_ATTR_ARG, &update);
                   1688:        }
                   1689: 
                   1690:       if (mp_update.length
                   1691:          && mp_update.afi == AFI_IP 
                   1692:          && mp_update.safi == SAFI_UNICAST)
                   1693:        bgp_nlri_parse (peer, NLRI_ATTR_ARG, &mp_update);
                   1694: 
                   1695:       if (mp_withdraw.length
                   1696:          && mp_withdraw.afi == AFI_IP 
                   1697:          && mp_withdraw.safi == SAFI_UNICAST)
                   1698:        bgp_nlri_parse (peer, NULL, &mp_withdraw);
                   1699: 
                   1700:       if (! attribute_len && ! withdraw_len)
                   1701:        {
                   1702:          /* End-of-RIB received */
                   1703:          SET_FLAG (peer->af_sflags[AFI_IP][SAFI_UNICAST],
                   1704:                    PEER_STATUS_EOR_RECEIVED);
                   1705: 
                   1706:          /* NSF delete stale route */
                   1707:          if (peer->nsf[AFI_IP][SAFI_UNICAST])
                   1708:            bgp_clear_stale_route (peer, AFI_IP, SAFI_UNICAST);
                   1709: 
                   1710:          if (BGP_DEBUG (normal, NORMAL))
                   1711:            zlog (peer->log, LOG_DEBUG, "rcvd End-of-RIB for IPv4 Unicast from %s",
                   1712:                  peer->host);
                   1713:        }
                   1714:     }
                   1715:   if (peer->afc[AFI_IP][SAFI_MULTICAST])
                   1716:     {
                   1717:       if (mp_update.length
                   1718:          && mp_update.afi == AFI_IP 
                   1719:          && mp_update.safi == SAFI_MULTICAST)
                   1720:        bgp_nlri_parse (peer, NLRI_ATTR_ARG, &mp_update);
                   1721: 
                   1722:       if (mp_withdraw.length
                   1723:          && mp_withdraw.afi == AFI_IP 
                   1724:          && mp_withdraw.safi == SAFI_MULTICAST)
                   1725:        bgp_nlri_parse (peer, NULL, &mp_withdraw);
                   1726: 
                   1727:       if (! withdraw_len
                   1728:          && mp_withdraw.afi == AFI_IP
                   1729:          && mp_withdraw.safi == SAFI_MULTICAST
                   1730:          && mp_withdraw.length == 0)
                   1731:        {
                   1732:          /* End-of-RIB received */
                   1733:          SET_FLAG (peer->af_sflags[AFI_IP][SAFI_MULTICAST],
                   1734:                    PEER_STATUS_EOR_RECEIVED);
                   1735: 
                   1736:          /* NSF delete stale route */
                   1737:          if (peer->nsf[AFI_IP][SAFI_MULTICAST])
                   1738:            bgp_clear_stale_route (peer, AFI_IP, SAFI_MULTICAST);
                   1739: 
                   1740:          if (BGP_DEBUG (normal, NORMAL))
                   1741:            zlog (peer->log, LOG_DEBUG, "rcvd End-of-RIB for IPv4 Multicast from %s",
                   1742:                  peer->host);
                   1743:        }
                   1744:     }
                   1745:   if (peer->afc[AFI_IP6][SAFI_UNICAST])
                   1746:     {
                   1747:       if (mp_update.length 
                   1748:          && mp_update.afi == AFI_IP6 
                   1749:          && mp_update.safi == SAFI_UNICAST)
                   1750:        bgp_nlri_parse (peer, NLRI_ATTR_ARG, &mp_update);
                   1751: 
                   1752:       if (mp_withdraw.length 
                   1753:          && mp_withdraw.afi == AFI_IP6 
                   1754:          && mp_withdraw.safi == SAFI_UNICAST)
                   1755:        bgp_nlri_parse (peer, NULL, &mp_withdraw);
                   1756: 
                   1757:       if (! withdraw_len
                   1758:          && mp_withdraw.afi == AFI_IP6
                   1759:          && mp_withdraw.safi == SAFI_UNICAST
                   1760:          && mp_withdraw.length == 0)
                   1761:        {
                   1762:          /* End-of-RIB received */
                   1763:          SET_FLAG (peer->af_sflags[AFI_IP6][SAFI_UNICAST], PEER_STATUS_EOR_RECEIVED);
                   1764: 
                   1765:          /* NSF delete stale route */
                   1766:          if (peer->nsf[AFI_IP6][SAFI_UNICAST])
                   1767:            bgp_clear_stale_route (peer, AFI_IP6, SAFI_UNICAST);
                   1768: 
                   1769:          if (BGP_DEBUG (normal, NORMAL))
                   1770:            zlog (peer->log, LOG_DEBUG, "rcvd End-of-RIB for IPv6 Unicast from %s",
                   1771:                  peer->host);
                   1772:        }
                   1773:     }
                   1774:   if (peer->afc[AFI_IP6][SAFI_MULTICAST])
                   1775:     {
                   1776:       if (mp_update.length 
                   1777:          && mp_update.afi == AFI_IP6 
                   1778:          && mp_update.safi == SAFI_MULTICAST)
                   1779:        bgp_nlri_parse (peer, NLRI_ATTR_ARG, &mp_update);
                   1780: 
                   1781:       if (mp_withdraw.length 
                   1782:          && mp_withdraw.afi == AFI_IP6 
                   1783:          && mp_withdraw.safi == SAFI_MULTICAST)
                   1784:        bgp_nlri_parse (peer, NULL, &mp_withdraw);
                   1785: 
                   1786:       if (! withdraw_len
                   1787:          && mp_withdraw.afi == AFI_IP6
                   1788:          && mp_withdraw.safi == SAFI_MULTICAST
                   1789:          && mp_withdraw.length == 0)
                   1790:        {
                   1791:          /* End-of-RIB received */
                   1792: 
                   1793:          /* NSF delete stale route */
                   1794:          if (peer->nsf[AFI_IP6][SAFI_MULTICAST])
                   1795:            bgp_clear_stale_route (peer, AFI_IP6, SAFI_MULTICAST);
                   1796: 
                   1797:          if (BGP_DEBUG (update, UPDATE_IN))
                   1798:            zlog (peer->log, LOG_DEBUG, "rcvd End-of-RIB for IPv6 Multicast from %s",
                   1799:                  peer->host);
                   1800:        }
                   1801:     }
                   1802:   if (peer->afc[AFI_IP][SAFI_MPLS_VPN])
                   1803:     {
                   1804:       if (mp_update.length 
                   1805:          && mp_update.afi == AFI_IP 
                   1806:          && mp_update.safi == BGP_SAFI_VPNV4)
                   1807:        bgp_nlri_parse_vpnv4 (peer, NLRI_ATTR_ARG, &mp_update);
                   1808: 
                   1809:       if (mp_withdraw.length 
                   1810:          && mp_withdraw.afi == AFI_IP 
                   1811:          && mp_withdraw.safi == BGP_SAFI_VPNV4)
                   1812:        bgp_nlri_parse_vpnv4 (peer, NULL, &mp_withdraw);
                   1813: 
                   1814:       if (! withdraw_len
                   1815:          && mp_withdraw.afi == AFI_IP
                   1816:          && mp_withdraw.safi == BGP_SAFI_VPNV4
                   1817:          && mp_withdraw.length == 0)
                   1818:        {
                   1819:          /* End-of-RIB received */
                   1820: 
                   1821:          if (BGP_DEBUG (update, UPDATE_IN))
                   1822:            zlog (peer->log, LOG_DEBUG, "rcvd End-of-RIB for VPNv4 Unicast from %s",
                   1823:                  peer->host);
                   1824:        }
                   1825:     }
                   1826: 
                   1827:   /* Everything is done.  We unintern temporary structures which
                   1828:      interned in bgp_attr_parse(). */
                   1829:   bgp_attr_unintern_sub (&attr);
                   1830:   if (attr.extra)
                   1831:     bgp_attr_extra_free (&attr);
                   1832:   
                   1833:   /* If peering is stopped due to some reason, do not generate BGP
                   1834:      event.  */
                   1835:   if (peer->status != Established)
                   1836:     return 0;
                   1837: 
                   1838:   /* Increment packet counter. */
                   1839:   peer->update_in++;
                   1840:   peer->update_time = bgp_clock ();
                   1841: 
                   1842:   /* Generate BGP event. */
                   1843:   BGP_EVENT_ADD (peer, Receive_UPDATE_message);
                   1844: 
                   1845:   return 0;
                   1846: }
                   1847: 
                   1848: /* Notify message treatment function. */
                   1849: static void
                   1850: bgp_notify_receive (struct peer *peer, bgp_size_t size)
                   1851: {
                   1852:   struct bgp_notify bgp_notify;
                   1853: 
                   1854:   if (peer->notify.data)
                   1855:     {
                   1856:       XFREE (MTYPE_TMP, peer->notify.data);
                   1857:       peer->notify.data = NULL;
                   1858:       peer->notify.length = 0;
                   1859:     }
                   1860: 
                   1861:   bgp_notify.code = stream_getc (peer->ibuf);
                   1862:   bgp_notify.subcode = stream_getc (peer->ibuf);
                   1863:   bgp_notify.length = size - 2;
                   1864:   bgp_notify.data = NULL;
                   1865: 
                   1866:   /* Preserv notify code and sub code. */
                   1867:   peer->notify.code = bgp_notify.code;
                   1868:   peer->notify.subcode = bgp_notify.subcode;
                   1869:   /* For further diagnostic record returned Data. */
                   1870:   if (bgp_notify.length)
                   1871:     {
                   1872:       peer->notify.length = size - 2;
                   1873:       peer->notify.data = XMALLOC (MTYPE_TMP, size - 2);
                   1874:       memcpy (peer->notify.data, stream_pnt (peer->ibuf), size - 2);
                   1875:     }
                   1876: 
                   1877:   /* For debug */
                   1878:   {
                   1879:     int i;
                   1880:     int first = 0;
                   1881:     char c[4];
                   1882: 
                   1883:     if (bgp_notify.length)
                   1884:       {
                   1885:        bgp_notify.data = XMALLOC (MTYPE_TMP, bgp_notify.length * 3);
                   1886:        for (i = 0; i < bgp_notify.length; i++)
                   1887:          if (first)
                   1888:            {
                   1889:              sprintf (c, " %02x", stream_getc (peer->ibuf));
                   1890:              strcat (bgp_notify.data, c);
                   1891:            }
                   1892:          else
                   1893:            {
                   1894:              first = 1;
                   1895:              sprintf (c, "%02x", stream_getc (peer->ibuf));
                   1896:              strcpy (bgp_notify.data, c);
                   1897:            }
                   1898:       }
                   1899: 
                   1900:     bgp_notify_print(peer, &bgp_notify, "received");
                   1901:     if (bgp_notify.data)
                   1902:       XFREE (MTYPE_TMP, bgp_notify.data);
                   1903:   }
                   1904: 
                   1905:   /* peer count update */
                   1906:   peer->notify_in++;
                   1907: 
                   1908:   if (peer->status == Established)
                   1909:     peer->last_reset = PEER_DOWN_NOTIFY_RECEIVED;
                   1910: 
                   1911:   /* We have to check for Notify with Unsupported Optional Parameter.
                   1912:      in that case we fallback to open without the capability option.
                   1913:      But this done in bgp_stop. We just mark it here to avoid changing
                   1914:      the fsm tables.  */
                   1915:   if (bgp_notify.code == BGP_NOTIFY_OPEN_ERR &&
                   1916:       bgp_notify.subcode == BGP_NOTIFY_OPEN_UNSUP_PARAM )
                   1917:     UNSET_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
                   1918: 
                   1919:   BGP_EVENT_ADD (peer, Receive_NOTIFICATION_message);
                   1920: }
                   1921: 
                   1922: /* Keepalive treatment function -- get keepalive send keepalive */
                   1923: static void
                   1924: bgp_keepalive_receive (struct peer *peer, bgp_size_t size)
                   1925: {
                   1926:   if (BGP_DEBUG (keepalive, KEEPALIVE))  
                   1927:     zlog_debug ("%s KEEPALIVE rcvd", peer->host); 
                   1928:   
                   1929:   BGP_EVENT_ADD (peer, Receive_KEEPALIVE_message);
                   1930: }
                   1931: 
                   1932: /* Route refresh message is received. */
                   1933: static void
                   1934: bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
                   1935: {
                   1936:   afi_t afi;
                   1937:   safi_t safi;
                   1938:   u_char reserved;
                   1939:   struct stream *s;
                   1940: 
                   1941:   /* If peer does not have the capability, send notification. */
                   1942:   if (! CHECK_FLAG (peer->cap, PEER_CAP_REFRESH_ADV))
                   1943:     {
                   1944:       plog_err (peer->log, "%s [Error] BGP route refresh is not enabled",
                   1945:                peer->host);
                   1946:       bgp_notify_send (peer,
                   1947:                       BGP_NOTIFY_HEADER_ERR,
                   1948:                       BGP_NOTIFY_HEADER_BAD_MESTYPE);
                   1949:       return;
                   1950:     }
                   1951: 
                   1952:   /* Status must be Established. */
                   1953:   if (peer->status != Established) 
                   1954:     {
                   1955:       plog_err (peer->log,
                   1956:                "%s [Error] Route refresh packet received under status %s",
                   1957:                peer->host, LOOKUP (bgp_status_msg, peer->status));
                   1958:       bgp_notify_send (peer, BGP_NOTIFY_FSM_ERR, 0);
                   1959:       return;
                   1960:     }
                   1961: 
                   1962:   s = peer->ibuf;
                   1963:   
                   1964:   /* Parse packet. */
                   1965:   afi = stream_getw (s);
                   1966:   reserved = stream_getc (s);
                   1967:   safi = stream_getc (s);
                   1968: 
                   1969:   if (BGP_DEBUG (normal, NORMAL))
                   1970:     zlog_debug ("%s rcvd REFRESH_REQ for afi/safi: %d/%d",
                   1971:               peer->host, afi, safi);
                   1972: 
                   1973:   /* Check AFI and SAFI. */
                   1974:   if ((afi != AFI_IP && afi != AFI_IP6)
                   1975:       || (safi != SAFI_UNICAST && safi != SAFI_MULTICAST
                   1976:          && safi != BGP_SAFI_VPNV4))
                   1977:     {
                   1978:       if (BGP_DEBUG (normal, NORMAL))
                   1979:        {
                   1980:          zlog_debug ("%s REFRESH_REQ for unrecognized afi/safi: %d/%d - ignored",
                   1981:                     peer->host, afi, safi);
                   1982:        }
                   1983:       return;
                   1984:     }
                   1985: 
                   1986:   /* Adjust safi code. */
                   1987:   if (safi == BGP_SAFI_VPNV4)
                   1988:     safi = SAFI_MPLS_VPN;
                   1989: 
                   1990:   if (size != BGP_MSG_ROUTE_REFRESH_MIN_SIZE - BGP_HEADER_SIZE)
                   1991:     {
                   1992:       u_char *end;
                   1993:       u_char when_to_refresh;
                   1994:       u_char orf_type;
                   1995:       u_int16_t orf_len;
                   1996: 
                   1997:       if (size - (BGP_MSG_ROUTE_REFRESH_MIN_SIZE - BGP_HEADER_SIZE) < 5)
                   1998:         {
                   1999:           zlog_info ("%s ORF route refresh length error", peer->host);
                   2000:           bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
                   2001:           return;
                   2002:         }
                   2003: 
                   2004:       when_to_refresh = stream_getc (s);
                   2005:       end = stream_pnt (s) + (size - 5);
                   2006: 
                   2007:       while ((stream_pnt (s) + 2) < end)
                   2008:        {
                   2009:          orf_type = stream_getc (s); 
                   2010:          orf_len = stream_getw (s);
                   2011:          
                   2012:          /* orf_len in bounds? */
                   2013:          if ((stream_pnt (s) + orf_len) > end)
                   2014:            break; /* XXX: Notify instead?? */
                   2015:          if (orf_type == ORF_TYPE_PREFIX
                   2016:              || orf_type == ORF_TYPE_PREFIX_OLD)
                   2017:            {
                   2018:              u_char *p_pnt = stream_pnt (s);
                   2019:              u_char *p_end = stream_pnt (s) + orf_len;
                   2020:              struct orf_prefix orfp;
                   2021:              u_char common = 0;
                   2022:              u_int32_t seq;
                   2023:              int psize;
                   2024:              char name[BUFSIZ];
                   2025:              char buf[BUFSIZ];
                   2026:              int ret;
                   2027: 
                   2028:              if (BGP_DEBUG (normal, NORMAL))
                   2029:                {
                   2030:                  zlog_debug ("%s rcvd Prefixlist ORF(%d) length %d",
                   2031:                             peer->host, orf_type, orf_len);
                   2032:                }
                   2033: 
                   2034:               /* we're going to read at least 1 byte of common ORF header,
                   2035:                * and 7 bytes of ORF Address-filter entry from the stream
                   2036:                */
                   2037:               if (orf_len < 7)
                   2038:                 break; 
                   2039:                 
                   2040:              /* ORF prefix-list name */
                   2041:              sprintf (name, "%s.%d.%d", peer->host, afi, safi);
                   2042: 
                   2043:              while (p_pnt < p_end)
                   2044:                {
                   2045:                   /* If the ORF entry is malformed, want to read as much of it
                   2046:                    * as possible without going beyond the bounds of the entry,
                   2047:                    * to maximise debug information.
                   2048:                    */
                   2049:                  int ok;
                   2050:                  memset (&orfp, 0, sizeof (struct orf_prefix));
                   2051:                  common = *p_pnt++;
                   2052:                  /* after ++: p_pnt <= p_end */
                   2053:                  if (common & ORF_COMMON_PART_REMOVE_ALL)
                   2054:                    {
                   2055:                      if (BGP_DEBUG (normal, NORMAL))
                   2056:                        zlog_debug ("%s rcvd Remove-All pfxlist ORF request", peer->host);
                   2057:                      prefix_bgp_orf_remove_all (name);
                   2058:                      break;
                   2059:                    }
                   2060:                  ok = ((p_end - p_pnt) >= sizeof(u_int32_t)) ;
                   2061:                  if (!ok)
                   2062:                    {
                   2063:                      memcpy (&seq, p_pnt, sizeof (u_int32_t));
                   2064:                       p_pnt += sizeof (u_int32_t);
                   2065:                       orfp.seq = ntohl (seq);
                   2066:                    }
                   2067:                  else
                   2068:                    p_pnt = p_end ;
                   2069: 
                   2070:                  if ((ok = (p_pnt < p_end)))
                   2071:                    orfp.ge = *p_pnt++ ;      /* value checked in prefix_bgp_orf_set() */
                   2072:                  if ((ok = (p_pnt < p_end)))
                   2073:                    orfp.le = *p_pnt++ ;      /* value checked in prefix_bgp_orf_set() */
                   2074:                  if ((ok = (p_pnt < p_end)))
                   2075:                    orfp.p.prefixlen = *p_pnt++ ;
                   2076:                  orfp.p.family = afi2family (afi);   /* afi checked already  */
                   2077: 
                   2078:                  psize = PSIZE (orfp.p.prefixlen);   /* 0 if not ok          */
                   2079:                  if (psize > prefix_blen(&orfp.p))   /* valid for family ?   */
                   2080:                    {
                   2081:                      ok = 0 ;
                   2082:                      psize = prefix_blen(&orfp.p) ;
                   2083:                    }
                   2084:                  if (psize > (p_end - p_pnt))        /* valid for packet ?   */
                   2085:                    {
                   2086:                      ok = 0 ;
                   2087:                      psize = p_end - p_pnt ;
                   2088:                    }
                   2089: 
                   2090:                  if (psize > 0)
                   2091:                    memcpy (&orfp.p.u.prefix, p_pnt, psize);
                   2092:                  p_pnt += psize;
                   2093: 
                   2094:                  if (BGP_DEBUG (normal, NORMAL))
                   2095:                    zlog_debug ("%s rcvd %s %s seq %u %s/%d ge %d le %d%s",
                   2096:                               peer->host,
                   2097:                               (common & ORF_COMMON_PART_REMOVE ? "Remove" : "Add"), 
                   2098:                               (common & ORF_COMMON_PART_DENY ? "deny" : "permit"),
                   2099:                               orfp.seq, 
                   2100:                               inet_ntop (orfp.p.family, &orfp.p.u.prefix, buf, BUFSIZ),
                   2101:                               orfp.p.prefixlen, orfp.ge, orfp.le,
                   2102:                               ok ? "" : " MALFORMED");
                   2103:                   
                   2104:                  if (ok)
                   2105:                    ret = prefix_bgp_orf_set (name, afi, &orfp,
                   2106:                                   (common & ORF_COMMON_PART_DENY ? 0 : 1 ),
                   2107:                                   (common & ORF_COMMON_PART_REMOVE ? 0 : 1));
                   2108: 
                   2109:                  if (!ok || (ret != CMD_SUCCESS))
                   2110:                    {
                   2111:                      if (BGP_DEBUG (normal, NORMAL))
                   2112:                        zlog_debug ("%s Received misformatted prefixlist ORF."
                   2113:                                    " Remove All pfxlist", peer->host);
                   2114:                      prefix_bgp_orf_remove_all (name);
                   2115:                      break;
                   2116:                    }
                   2117:                }
                   2118:              peer->orf_plist[afi][safi] =
                   2119:                         prefix_list_lookup (AFI_ORF_PREFIX, name);
                   2120:            }
                   2121:          stream_forward_getp (s, orf_len);
                   2122:        }
                   2123:       if (BGP_DEBUG (normal, NORMAL))
                   2124:        zlog_debug ("%s rcvd Refresh %s ORF request", peer->host,
                   2125:                   when_to_refresh == REFRESH_DEFER ? "Defer" : "Immediate");
                   2126:       if (when_to_refresh == REFRESH_DEFER)
                   2127:        return;
                   2128:     }
                   2129: 
                   2130:   /* First update is deferred until ORF or ROUTE-REFRESH is received */
                   2131:   if (CHECK_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH))
                   2132:     UNSET_FLAG (peer->af_sflags[afi][safi], PEER_STATUS_ORF_WAIT_REFRESH);
                   2133: 
                   2134:   /* Perform route refreshment to the peer */
                   2135:   bgp_announce_route (peer, afi, safi);
                   2136: }
                   2137: 
                   2138: static int
                   2139: bgp_capability_msg_parse (struct peer *peer, u_char *pnt, bgp_size_t length)
                   2140: {
                   2141:   u_char *end;
                   2142:   struct capability_mp_data mpc;
                   2143:   struct capability_header *hdr;
                   2144:   u_char action;
                   2145:   struct bgp *bgp;
                   2146:   afi_t afi;
                   2147:   safi_t safi;
                   2148: 
                   2149:   bgp = peer->bgp;
                   2150:   end = pnt + length;
                   2151: 
                   2152:   while (pnt < end)
                   2153:     {      
                   2154:       /* We need at least action, capability code and capability length. */
                   2155:       if (pnt + 3 > end)
                   2156:         {
                   2157:           zlog_info ("%s Capability length error", peer->host);
                   2158:           bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
                   2159:           return -1;
                   2160:         }
                   2161:       action = *pnt;
                   2162:       hdr = (struct capability_header *)(pnt + 1);
                   2163:       
                   2164:       /* Action value check.  */
                   2165:       if (action != CAPABILITY_ACTION_SET
                   2166:          && action != CAPABILITY_ACTION_UNSET)
                   2167:         {
                   2168:           zlog_info ("%s Capability Action Value error %d",
                   2169:                     peer->host, action);
                   2170:           bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
                   2171:           return -1;
                   2172:         }
                   2173: 
                   2174:       if (BGP_DEBUG (normal, NORMAL))
                   2175:        zlog_debug ("%s CAPABILITY has action: %d, code: %u, length %u",
                   2176:                   peer->host, action, hdr->code, hdr->length);
                   2177: 
                   2178:       /* Capability length check. */
                   2179:       if ((pnt + hdr->length + 3) > end)
                   2180:         {
                   2181:           zlog_info ("%s Capability length error", peer->host);
                   2182:           bgp_notify_send (peer, BGP_NOTIFY_CEASE, 0);
                   2183:           return -1;
                   2184:         }
                   2185: 
                   2186:       /* Fetch structure to the byte stream. */
                   2187:       memcpy (&mpc, pnt + 3, sizeof (struct capability_mp_data));
                   2188: 
                   2189:       /* We know MP Capability Code. */
                   2190:       if (hdr->code == CAPABILITY_CODE_MP)
                   2191:         {
                   2192:          afi = ntohs (mpc.afi);
                   2193:          safi = mpc.safi;
                   2194: 
                   2195:           /* Ignore capability when override-capability is set. */
                   2196:           if (CHECK_FLAG (peer->flags, PEER_FLAG_OVERRIDE_CAPABILITY))
                   2197:            continue;
                   2198:           
                   2199:           if (!bgp_afi_safi_valid_indices (afi, &safi))
                   2200:             {
                   2201:               if (BGP_DEBUG (normal, NORMAL))
                   2202:                 zlog_debug ("%s Dynamic Capability MP_EXT afi/safi invalid "
                   2203:                             "(%u/%u)", peer->host, afi, safi);
                   2204:               continue;
                   2205:             }
                   2206:           
                   2207:          /* Address family check.  */
                   2208:           if (BGP_DEBUG (normal, NORMAL))
                   2209:             zlog_debug ("%s CAPABILITY has %s MP_EXT CAP for afi/safi: %u/%u",
                   2210:                        peer->host,
                   2211:                        action == CAPABILITY_ACTION_SET 
                   2212:                        ? "Advertising" : "Removing",
                   2213:                        ntohs(mpc.afi) , mpc.safi);
                   2214:               
                   2215:           if (action == CAPABILITY_ACTION_SET)
                   2216:             {
                   2217:               peer->afc_recv[afi][safi] = 1;
                   2218:               if (peer->afc[afi][safi])
                   2219:                 {
                   2220:                   peer->afc_nego[afi][safi] = 1;
                   2221:                   bgp_announce_route (peer, afi, safi);
                   2222:                 }
                   2223:             }
                   2224:           else
                   2225:             {
                   2226:               peer->afc_recv[afi][safi] = 0;
                   2227:               peer->afc_nego[afi][safi] = 0;
                   2228: 
                   2229:               if (peer_active_nego (peer))
                   2230:                 bgp_clear_route (peer, afi, safi, BGP_CLEAR_ROUTE_NORMAL);
                   2231:               else
                   2232:                 BGP_EVENT_ADD (peer, BGP_Stop);
                   2233:             }
                   2234:         }
                   2235:       else
                   2236:         {
                   2237:           zlog_warn ("%s unrecognized capability code: %d - ignored",
                   2238:                      peer->host, hdr->code);
                   2239:         }
                   2240:       pnt += hdr->length + 3;
                   2241:     }
                   2242:   return 0;
                   2243: }
                   2244: 
                   2245: /* Dynamic Capability is received. 
                   2246:  *
                   2247:  * This is exported for unit-test purposes
                   2248:  */
                   2249: int
                   2250: bgp_capability_receive (struct peer *peer, bgp_size_t size)
                   2251: {
                   2252:   u_char *pnt;
                   2253: 
                   2254:   /* Fetch pointer. */
                   2255:   pnt = stream_pnt (peer->ibuf);
                   2256: 
                   2257:   if (BGP_DEBUG (normal, NORMAL))
                   2258:     zlog_debug ("%s rcv CAPABILITY", peer->host);
                   2259: 
                   2260:   /* If peer does not have the capability, send notification. */
                   2261:   if (! CHECK_FLAG (peer->cap, PEER_CAP_DYNAMIC_ADV))
                   2262:     {
                   2263:       plog_err (peer->log, "%s [Error] BGP dynamic capability is not enabled",
                   2264:                peer->host);
                   2265:       bgp_notify_send (peer,
                   2266:                       BGP_NOTIFY_HEADER_ERR,
                   2267:                       BGP_NOTIFY_HEADER_BAD_MESTYPE);
                   2268:       return -1;
                   2269:     }
                   2270: 
                   2271:   /* Status must be Established. */
                   2272:   if (peer->status != Established)
                   2273:     {
                   2274:       plog_err (peer->log,
                   2275:                "%s [Error] Dynamic capability packet received under status %s", peer->host, LOOKUP (bgp_status_msg, peer->status));
                   2276:       bgp_notify_send (peer, BGP_NOTIFY_FSM_ERR, 0);
                   2277:       return -1;
                   2278:     }
                   2279: 
                   2280:   /* Parse packet. */
                   2281:   return bgp_capability_msg_parse (peer, pnt, size);
                   2282: }
                   2283: 
                   2284: /* BGP read utility function. */
                   2285: static int
                   2286: bgp_read_packet (struct peer *peer)
                   2287: {
                   2288:   int nbytes;
                   2289:   int readsize;
                   2290: 
                   2291:   readsize = peer->packet_size - stream_get_endp (peer->ibuf);
                   2292: 
                   2293:   /* If size is zero then return. */
                   2294:   if (! readsize)
                   2295:     return 0;
                   2296: 
                   2297:   /* Read packet from fd. */
                   2298:   nbytes = stream_read_try (peer->ibuf, peer->fd, readsize);
                   2299: 
                   2300:   /* If read byte is smaller than zero then error occured. */
                   2301:   if (nbytes < 0) 
                   2302:     {
                   2303:       /* Transient error should retry */
                   2304:       if (nbytes == -2)
                   2305:        return -1;
                   2306: 
                   2307:       plog_err (peer->log, "%s [Error] bgp_read_packet error: %s",
                   2308:                 peer->host, safe_strerror (errno));
                   2309: 
                   2310:       if (peer->status == Established) 
                   2311:        {
                   2312:          if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_MODE))
                   2313:            {
                   2314:              peer->last_reset = PEER_DOWN_NSF_CLOSE_SESSION;
                   2315:              SET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT);
                   2316:            }
                   2317:          else
                   2318:            peer->last_reset = PEER_DOWN_CLOSE_SESSION;
                   2319:        }
                   2320: 
                   2321:       BGP_EVENT_ADD (peer, TCP_fatal_error);
                   2322:       return -1;
                   2323:     }  
                   2324: 
                   2325:   /* When read byte is zero : clear bgp peer and return */
                   2326:   if (nbytes == 0) 
                   2327:     {
                   2328:       if (BGP_DEBUG (events, EVENTS))
                   2329:        plog_debug (peer->log, "%s [Event] BGP connection closed fd %d",
                   2330:                   peer->host, peer->fd);
                   2331: 
                   2332:       if (peer->status == Established) 
                   2333:        {
                   2334:          if (CHECK_FLAG (peer->sflags, PEER_STATUS_NSF_MODE))
                   2335:            {
                   2336:              peer->last_reset = PEER_DOWN_NSF_CLOSE_SESSION;
                   2337:              SET_FLAG (peer->sflags, PEER_STATUS_NSF_WAIT);
                   2338:            }
                   2339:          else
                   2340:            peer->last_reset = PEER_DOWN_CLOSE_SESSION;
                   2341:        }
                   2342: 
                   2343:       BGP_EVENT_ADD (peer, TCP_connection_closed);
                   2344:       return -1;
                   2345:     }
                   2346: 
                   2347:   /* We read partial packet. */
                   2348:   if (stream_get_endp (peer->ibuf) != peer->packet_size)
                   2349:     return -1;
                   2350: 
                   2351:   return 0;
                   2352: }
                   2353: 
                   2354: /* Marker check. */
                   2355: static int
                   2356: bgp_marker_all_one (struct stream *s, int length)
                   2357: {
                   2358:   int i;
                   2359: 
                   2360:   for (i = 0; i < length; i++)
                   2361:     if (s->data[i] != 0xff)
                   2362:       return 0;
                   2363: 
                   2364:   return 1;
                   2365: }
                   2366: 
                   2367: /* Starting point of packet process function. */
                   2368: int
                   2369: bgp_read (struct thread *thread)
                   2370: {
                   2371:   int ret;
                   2372:   u_char type = 0;
                   2373:   struct peer *peer;
                   2374:   bgp_size_t size;
                   2375:   char notify_data_length[2];
                   2376: 
                   2377:   /* Yes first of all get peer pointer. */
                   2378:   peer = THREAD_ARG (thread);
                   2379:   peer->t_read = NULL;
                   2380: 
                   2381:   /* For non-blocking IO check. */
                   2382:   if (peer->status == Connect)
                   2383:     {
                   2384:       bgp_connect_check (peer);
                   2385:       goto done;
                   2386:     }
                   2387:   else
                   2388:     {
                   2389:       if (peer->fd < 0)
                   2390:        {
                   2391:          zlog_err ("bgp_read peer's fd is negative value %d", peer->fd);
                   2392:          return -1;
                   2393:        }
                   2394:       BGP_READ_ON (peer->t_read, bgp_read, peer->fd);
                   2395:     }
                   2396: 
                   2397:   /* Read packet header to determine type of the packet */
                   2398:   if (peer->packet_size == 0)
                   2399:     peer->packet_size = BGP_HEADER_SIZE;
                   2400: 
                   2401:   if (stream_get_endp (peer->ibuf) < BGP_HEADER_SIZE)
                   2402:     {
                   2403:       ret = bgp_read_packet (peer);
                   2404: 
                   2405:       /* Header read error or partial read packet. */
                   2406:       if (ret < 0) 
                   2407:        goto done;
                   2408: 
                   2409:       /* Get size and type. */
                   2410:       stream_forward_getp (peer->ibuf, BGP_MARKER_SIZE);
                   2411:       memcpy (notify_data_length, stream_pnt (peer->ibuf), 2);
                   2412:       size = stream_getw (peer->ibuf);
                   2413:       type = stream_getc (peer->ibuf);
                   2414: 
                   2415:       if (BGP_DEBUG (normal, NORMAL) && type != 2 && type != 0)
                   2416:        zlog_debug ("%s rcv message type %d, length (excl. header) %d",
                   2417:                   peer->host, type, size - BGP_HEADER_SIZE);
                   2418: 
                   2419:       /* Marker check */
                   2420:       if (((type == BGP_MSG_OPEN) || (type == BGP_MSG_KEEPALIVE))
                   2421:          && ! bgp_marker_all_one (peer->ibuf, BGP_MARKER_SIZE))
                   2422:        {
                   2423:          bgp_notify_send (peer,
                   2424:                           BGP_NOTIFY_HEADER_ERR, 
                   2425:                           BGP_NOTIFY_HEADER_NOT_SYNC);
                   2426:          goto done;
                   2427:        }
                   2428: 
                   2429:       /* BGP type check. */
                   2430:       if (type != BGP_MSG_OPEN && type != BGP_MSG_UPDATE 
                   2431:          && type != BGP_MSG_NOTIFY && type != BGP_MSG_KEEPALIVE 
                   2432:          && type != BGP_MSG_ROUTE_REFRESH_NEW
                   2433:          && type != BGP_MSG_ROUTE_REFRESH_OLD
                   2434:          && type != BGP_MSG_CAPABILITY)
                   2435:        {
                   2436:          if (BGP_DEBUG (normal, NORMAL))
                   2437:            plog_debug (peer->log,
                   2438:                      "%s unknown message type 0x%02x",
                   2439:                      peer->host, type);
                   2440:          bgp_notify_send_with_data (peer,
                   2441:                                     BGP_NOTIFY_HEADER_ERR,
                   2442:                                     BGP_NOTIFY_HEADER_BAD_MESTYPE,
                   2443:                                     &type, 1);
                   2444:          goto done;
                   2445:        }
                   2446:       /* Mimimum packet length check. */
                   2447:       if ((size < BGP_HEADER_SIZE)
                   2448:          || (size > BGP_MAX_PACKET_SIZE)
                   2449:          || (type == BGP_MSG_OPEN && size < BGP_MSG_OPEN_MIN_SIZE)
                   2450:          || (type == BGP_MSG_UPDATE && size < BGP_MSG_UPDATE_MIN_SIZE)
                   2451:          || (type == BGP_MSG_NOTIFY && size < BGP_MSG_NOTIFY_MIN_SIZE)
                   2452:          || (type == BGP_MSG_KEEPALIVE && size != BGP_MSG_KEEPALIVE_MIN_SIZE)
                   2453:          || (type == BGP_MSG_ROUTE_REFRESH_NEW && size < BGP_MSG_ROUTE_REFRESH_MIN_SIZE)
                   2454:          || (type == BGP_MSG_ROUTE_REFRESH_OLD && size < BGP_MSG_ROUTE_REFRESH_MIN_SIZE)
                   2455:          || (type == BGP_MSG_CAPABILITY && size < BGP_MSG_CAPABILITY_MIN_SIZE))
                   2456:        {
                   2457:          if (BGP_DEBUG (normal, NORMAL))
                   2458:            plog_debug (peer->log,
                   2459:                      "%s bad message length - %d for %s",
                   2460:                      peer->host, size, 
                   2461:                      type == 128 ? "ROUTE-REFRESH" :
                   2462:                      bgp_type_str[(int) type]);
                   2463:          bgp_notify_send_with_data (peer,
                   2464:                                     BGP_NOTIFY_HEADER_ERR,
                   2465:                                     BGP_NOTIFY_HEADER_BAD_MESLEN,
                   2466:                                     (u_char *) notify_data_length, 2);
                   2467:          goto done;
                   2468:        }
                   2469: 
                   2470:       /* Adjust size to message length. */
                   2471:       peer->packet_size = size;
                   2472:     }
                   2473: 
                   2474:   ret = bgp_read_packet (peer);
                   2475:   if (ret < 0) 
                   2476:     goto done;
                   2477: 
                   2478:   /* Get size and type again. */
                   2479:   size = stream_getw_from (peer->ibuf, BGP_MARKER_SIZE);
                   2480:   type = stream_getc_from (peer->ibuf, BGP_MARKER_SIZE + 2);
                   2481: 
                   2482:   /* BGP packet dump function. */
                   2483:   bgp_dump_packet (peer, type, peer->ibuf);
                   2484:   
                   2485:   size = (peer->packet_size - BGP_HEADER_SIZE);
                   2486: 
                   2487:   /* Read rest of the packet and call each sort of packet routine */
                   2488:   switch (type) 
                   2489:     {
                   2490:     case BGP_MSG_OPEN:
                   2491:       peer->open_in++;
                   2492:       bgp_open_receive (peer, size); /* XXX return value ignored! */
                   2493:       break;
                   2494:     case BGP_MSG_UPDATE:
                   2495:       peer->readtime = time(NULL);    /* Last read timer reset */
                   2496:       bgp_update_receive (peer, size);
                   2497:       break;
                   2498:     case BGP_MSG_NOTIFY:
                   2499:       bgp_notify_receive (peer, size);
                   2500:       break;
                   2501:     case BGP_MSG_KEEPALIVE:
                   2502:       peer->readtime = time(NULL);    /* Last read timer reset */
                   2503:       bgp_keepalive_receive (peer, size);
                   2504:       break;
                   2505:     case BGP_MSG_ROUTE_REFRESH_NEW:
                   2506:     case BGP_MSG_ROUTE_REFRESH_OLD:
                   2507:       peer->refresh_in++;
                   2508:       bgp_route_refresh_receive (peer, size);
                   2509:       break;
                   2510:     case BGP_MSG_CAPABILITY:
                   2511:       peer->dynamic_cap_in++;
                   2512:       bgp_capability_receive (peer, size);
                   2513:       break;
                   2514:     }
                   2515: 
                   2516:   /* Clear input buffer. */
                   2517:   peer->packet_size = 0;
                   2518:   if (peer->ibuf)
                   2519:     stream_reset (peer->ibuf);
                   2520: 
                   2521:  done:
                   2522:   if (CHECK_FLAG (peer->sflags, PEER_STATUS_ACCEPT_PEER))
                   2523:     {
                   2524:       if (BGP_DEBUG (events, EVENTS))
                   2525:        zlog_debug ("%s [Event] Accepting BGP peer delete", peer->host);
                   2526:       peer_delete (peer);
                   2527:     }
                   2528:   return 0;
                   2529: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>