back to topotato report
topotato coverage report
Current view: top level - bgpd - bgp_advertise.h (source / functions) Hit Total Coverage
Test: test_bgp_set_aspath_replace.py::BGPSetAspathReplace Lines: 2 2 100.0 %
Date: 2023-02-24 18:37:49 Functions: 1 1 100.0 %

          Line data    Source code
       1             : /* BGP advertisement and adjacency
       2             :  * Copyright (C) 1996, 97, 98, 99, 2000 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 along
      17             :  * with this program; see the file COPYING; if not, write to the Free Software
      18             :  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
      19             :  */
      20             : 
      21             : #ifndef _QUAGGA_BGP_ADVERTISE_H
      22             : #define _QUAGGA_BGP_ADVERTISE_H
      23             : 
      24             : #include "lib/typesafe.h"
      25             : 
      26             : PREDECL_DLIST(bgp_adv_fifo);
      27             : 
      28             : struct update_subgroup;
      29             : 
      30             : /* BGP advertise attribute.  */
      31             : struct bgp_advertise_attr {
      32             :         /* Head of advertisement pointer. */
      33             :         struct bgp_advertise *adv;
      34             : 
      35             :         /* Reference counter.  */
      36             :         unsigned long refcnt;
      37             : 
      38             :         /* Attribute pointer to be announced.  */
      39             :         struct attr *attr;
      40             : };
      41             : 
      42             : struct bgp_advertise {
      43             :         /* FIFO for advertisement.  */
      44             :         struct bgp_adv_fifo_item fifo;
      45             : 
      46             :         /* Link list for same attribute advertise.  */
      47             :         struct bgp_advertise *next;
      48             :         struct bgp_advertise *prev;
      49             : 
      50             :         /* Prefix information.  */
      51             :         struct bgp_dest *dest;
      52             : 
      53             :         /* Reference pointer.  */
      54             :         struct bgp_adj_out *adj;
      55             : 
      56             :         /* Advertisement attribute.  */
      57             :         struct bgp_advertise_attr *baa;
      58             : 
      59             :         /* BGP info.  */
      60             :         struct bgp_path_info *pathi;
      61             : };
      62             : 
      63         826 : DECLARE_DLIST(bgp_adv_fifo, struct bgp_advertise, fifo);
      64             : 
      65             : /* BGP adjacency out.  */
      66             : struct bgp_adj_out {
      67             :         /* RB Tree of adjacency entries */
      68             :         RB_ENTRY(bgp_adj_out) adj_entry;
      69             : 
      70             :         /* Advertised subgroup.  */
      71             :         struct update_subgroup *subgroup;
      72             : 
      73             :         /* Threading that makes the adj part of subgroup's adj queue */
      74             :         TAILQ_ENTRY(bgp_adj_out) subgrp_adj_train;
      75             : 
      76             :         /* Prefix information.  */
      77             :         struct bgp_dest *dest;
      78             : 
      79             :         uint32_t addpath_tx_id;
      80             : 
      81             :         /* Advertised attribute.  */
      82             :         struct attr *attr;
      83             : 
      84             :         /* Advertisement information.  */
      85             :         struct bgp_advertise *adv;
      86             : 
      87             :         /* Attribute hash */
      88             :         uint32_t attr_hash;
      89             : };
      90             : 
      91             : RB_HEAD(bgp_adj_out_rb, bgp_adj_out);
      92         119 : RB_PROTOTYPE(bgp_adj_out_rb, bgp_adj_out, adj_entry,
      93             :              bgp_adj_out_compare);
      94             : 
      95             : /* BGP adjacency in. */
      96             : struct bgp_adj_in {
      97             :         /* Linked list pointer.  */
      98             :         struct bgp_adj_in *next;
      99             :         struct bgp_adj_in *prev;
     100             : 
     101             :         /* Received peer.  */
     102             :         struct peer *peer;
     103             : 
     104             :         /* Received attribute.  */
     105             :         struct attr *attr;
     106             : 
     107             :         /* timestamp (monotime) */
     108             :         time_t uptime;
     109             : 
     110             :         /* Addpath identifier */
     111             :         uint32_t addpath_rx_id;
     112             : };
     113             : 
     114             : /* BGP advertisement list.  */
     115             : struct bgp_synchronize {
     116             :         struct bgp_adv_fifo_head update;
     117             :         struct bgp_adv_fifo_head withdraw;
     118             :         struct bgp_adv_fifo_head withdraw_low;
     119             : };
     120             : 
     121             : /* BGP adjacency linked list.  */
     122             : #define BGP_PATH_INFO_ADD(N, A, TYPE)                                          \
     123             :         do {                                                                   \
     124             :                 (A)->prev = NULL;                                              \
     125             :                 (A)->next = (N)->TYPE;                                         \
     126             :                 if ((N)->TYPE)                                                 \
     127             :                         (N)->TYPE->prev = (A);                                 \
     128             :                 (N)->TYPE = (A);                                               \
     129             :         } while (0)
     130             : 
     131             : #define BGP_PATH_INFO_DEL(N, A, TYPE)                                          \
     132             :         do {                                                                   \
     133             :                 if ((A)->next)                                                 \
     134             :                         (A)->next->prev = (A)->prev;                           \
     135             :                 if ((A)->prev)                                                 \
     136             :                         (A)->prev->next = (A)->next;                           \
     137             :                 else                                                           \
     138             :                         (N)->TYPE = (A)->next;                                 \
     139             :         } while (0)
     140             : 
     141             : #define BGP_ADJ_IN_ADD(N, A) BGP_PATH_INFO_ADD(N, A, adj_in)
     142             : #define BGP_ADJ_IN_DEL(N, A) BGP_PATH_INFO_DEL(N, A, adj_in)
     143             : 
     144             : /* Prototypes.  */
     145             : extern bool bgp_adj_out_lookup(struct peer *peer, struct bgp_dest *dest,
     146             :                                uint32_t addpath_tx_id);
     147             : extern void bgp_adj_in_set(struct bgp_dest *dest, struct peer *peer,
     148             :                            struct attr *attr, uint32_t addpath_id);
     149             : extern bool bgp_adj_in_unset(struct bgp_dest *dest, struct peer *peer,
     150             :                              uint32_t addpath_id);
     151             : extern void bgp_adj_in_remove(struct bgp_dest *dest, struct bgp_adj_in *bai);
     152             : 
     153             : extern void bgp_sync_init(struct peer *peer);
     154             : extern void bgp_sync_delete(struct peer *peer);
     155             : extern unsigned int bgp_advertise_attr_hash_key(const void *p);
     156             : extern bool bgp_advertise_attr_hash_cmp(const void *p1, const void *p2);
     157             : extern void bgp_advertise_add(struct bgp_advertise_attr *baa,
     158             :                               struct bgp_advertise *adv);
     159             : extern struct bgp_advertise *bgp_advertise_new(void);
     160             : extern void bgp_advertise_free(struct bgp_advertise *adv);
     161             : extern struct bgp_advertise_attr *bgp_advertise_attr_intern(struct hash *hash,
     162             :                                                             struct attr *attr);
     163             : extern struct bgp_advertise_attr *bgp_advertise_attr_new(void);
     164             : extern void bgp_advertise_delete(struct bgp_advertise_attr *baa,
     165             :                                  struct bgp_advertise *adv);
     166             : extern void bgp_advertise_attr_unintern(struct hash *hash,
     167             :                                         struct bgp_advertise_attr *baa);
     168             : extern void bgp_advertise_attr_free(struct bgp_advertise_attr *baa);
     169             : 
     170             : #endif /* _QUAGGA_BGP_ADVERTISE_H */

Generated by: LCOV version v1.16-topotato