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

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

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