Coverage Report

Created: 2025-11-11 06:17

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/frr/bgpd/bgp_updgrp.h
Line
Count
Source
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
/**
3
 * bgp_updgrp.c: BGP update group structures
4
 *
5
 * @copyright Copyright (C) 2014 Cumulus Networks, Inc.
6
 *
7
 * @author Avneesh Sachdev <avneesh@sproute.net>
8
 * @author Rajesh Varadarajan <rajesh@sproute.net>
9
 * @author Pradosh Mohapatra <pradosh@sproute.net>
10
 */
11
12
#ifndef _QUAGGA_BGP_UPDGRP_H
13
#define _QUAGGA_BGP_UPDGRP_H
14
15
#include "bgp_advertise.h"
16
17
/*
18
 * The following three heuristic constants determine how long advertisement to
19
 * a subgroup will be delayed after it is created. The intent is to allow
20
 * transient changes in peer state (primarily session establishment) to settle,
21
 * so that more peers can be grouped together and benefit from sharing
22
 * advertisement computations with the subgroup.
23
 *
24
 * These values have a very large impact on initial convergence time; any
25
 * changes should be accompanied by careful performance testing at all scales.
26
 *
27
 * The coalesce time 'C' for a new subgroup within a particular BGP instance
28
 * 'B' with total number of known peers 'P', established or not, is computed as
29
 * follows:
30
 *
31
 * C = MIN(BGP_MAX_SUBGROUP_COALESCE_TIME,
32
 *         BGP_DEFAULT_SUBGROUP_COALESCE_TIME +
33
 *         (P*BGP_PEER_ADJUST_SUBGROUP_COALESCE_TIME))
34
 */
35
2
#define BGP_DEFAULT_SUBGROUP_COALESCE_TIME 1000
36
#define BGP_MAX_SUBGROUP_COALESCE_TIME 10000
37
1
#define BGP_PEER_ADJUST_SUBGROUP_COALESCE_TIME 50
38
39
#define PEER_UPDGRP_FLAGS                                                      \
40
0
  (PEER_FLAG_LOCAL_AS_NO_PREPEND | PEER_FLAG_LOCAL_AS_REPLACE_AS)
41
42
#define PEER_UPDGRP_AF_FLAGS                                                   \
43
0
  (PEER_FLAG_SEND_COMMUNITY | PEER_FLAG_SEND_EXT_COMMUNITY               \
44
0
   | PEER_FLAG_SEND_LARGE_COMMUNITY                                      \
45
0
   | PEER_FLAG_DEFAULT_ORIGINATE | PEER_FLAG_REFLECTOR_CLIENT            \
46
0
   | PEER_FLAG_RSERVER_CLIENT | PEER_FLAG_NEXTHOP_SELF                   \
47
0
   | PEER_FLAG_NEXTHOP_UNCHANGED | PEER_FLAG_FORCE_NEXTHOP_SELF          \
48
0
   | PEER_FLAG_AS_PATH_UNCHANGED | PEER_FLAG_MED_UNCHANGED               \
49
0
   | PEER_FLAG_NEXTHOP_LOCAL_UNCHANGED | PEER_FLAG_REMOVE_PRIVATE_AS     \
50
0
   | PEER_FLAG_REMOVE_PRIVATE_AS_ALL                                     \
51
0
   | PEER_FLAG_REMOVE_PRIVATE_AS_REPLACE                                 \
52
0
   | PEER_FLAG_REMOVE_PRIVATE_AS_ALL_REPLACE                             \
53
0
   | PEER_FLAG_AS_OVERRIDE)
54
55
0
#define PEER_UPDGRP_CAP_FLAGS (PEER_CAP_AS4_RCV)
56
57
#define PEER_UPDGRP_AF_CAP_FLAGS                                               \
58
0
  (PEER_CAP_ORF_PREFIX_SM_RCV | PEER_CAP_ORF_PREFIX_SM_OLD_RCV           \
59
0
   | PEER_CAP_ADDPATH_AF_TX_ADV | PEER_CAP_ADDPATH_AF_RX_RCV             \
60
0
   | PEER_CAP_ENHE_AF_NEGO)
61
62
enum bpacket_attr_vec_type { BGP_ATTR_VEC_NH = 0, BGP_ATTR_VEC_MAX };
63
64
typedef struct {
65
  uint32_t flags;
66
  unsigned long offset;
67
} bpacket_attr_vec;
68
69
#define BPKT_ATTRVEC_FLAGS_UPDATED        (1 << 0)
70
#define BPKT_ATTRVEC_FLAGS_RMAP_NH_PEER_ADDRESS   (1 << 1)
71
#define BPKT_ATTRVEC_FLAGS_REFLECTED (1 << 2)
72
#define BPKT_ATTRVEC_FLAGS_RMAP_NH_UNCHANGED   (1 << 3)
73
#define BPKT_ATTRVEC_FLAGS_RMAP_IPV4_NH_CHANGED   (1 << 4)
74
#define BPKT_ATTRVEC_FLAGS_RMAP_IPV6_GNH_CHANGED  (1 << 5)
75
#define BPKT_ATTRVEC_FLAGS_RMAP_IPV6_LNH_CHANGED  (1 << 6)
76
#define BPKT_ATTRVEC_FLAGS_RMAP_VPNV4_NH_CHANGED  (1 << 7)
77
#define BPKT_ATTRVEC_FLAGS_RMAP_VPNV6_GNH_CHANGED (1 << 8)
78
79
typedef struct bpacket_attr_vec_arr {
80
  bpacket_attr_vec entries[BGP_ATTR_VEC_MAX];
81
} bpacket_attr_vec_arr;
82
83
struct bpacket {
84
  /* for being part of an update subgroup's message list */
85
  TAILQ_ENTRY(bpacket) pkt_train;
86
87
  /* list of peers (well, peer_afs) that the packet needs to be sent to */
88
  LIST_HEAD(pkt_peer_list, peer_af) peers;
89
90
  struct stream *buffer;
91
  bpacket_attr_vec_arr arr;
92
93
  unsigned int ver;
94
};
95
96
struct bpacket_queue {
97
  TAILQ_HEAD(pkt_queue, bpacket) pkts;
98
99
  unsigned int conf_max_count;
100
  unsigned int curr_count;
101
  unsigned int hwm_count;
102
  unsigned int max_count_reached_count;
103
};
104
105
struct update_group {
106
  /* back pointer to the BGP instance */
107
  struct bgp *bgp;
108
109
  /* list of subgroups that belong to the update group */
110
  LIST_HEAD(subgrp_list, update_subgroup) subgrps;
111
112
  /* lazy way to store configuration common to all peers
113
     hash function will compute from this data */
114
  struct peer *conf;
115
116
  afi_t afi;
117
  safi_t safi;
118
  int afid;
119
120
  uint64_t id;
121
  time_t uptime;
122
123
  uint32_t join_events;
124
  uint32_t prune_events;
125
  uint32_t merge_events;
126
  uint32_t updgrp_switch_events;
127
  uint32_t peer_refreshes_combined;
128
  uint32_t adj_count;
129
  uint32_t split_events;
130
  uint32_t merge_checks_triggered;
131
132
  uint32_t subgrps_created;
133
  uint32_t subgrps_deleted;
134
135
  uint32_t num_dbg_en_peers;
136
};
137
138
/*
139
 * Shorthand for a global statistics counter.
140
 */
141
#define UPDGRP_GLOBAL_STAT(updgrp, stat)                                       \
142
0
  ((updgrp)->bgp->update_group_stats.stat)
143
144
/*
145
 * Add the given value to a counter on an update group and the bgp
146
 * instance.
147
 */
148
#define UPDGRP_INCR_STAT_BY(updgrp, stat, value)                               \
149
0
  do {                                                                   \
150
0
    (updgrp)->stat += (value);                                     \
151
0
    UPDGRP_GLOBAL_STAT(updgrp, stat) += (value);                   \
152
0
  } while (0)
153
154
/*
155
 * Increment a counter on a update group and its parent structures.
156
 */
157
0
#define UPDGRP_INCR_STAT(subgrp, stat) UPDGRP_INCR_STAT_BY(subgrp, stat, 1)
158
159
struct update_subgroup {
160
  /* back pointer to the parent update group */
161
  struct update_group *update_group;
162
163
  /* list of peers that belong to the subgroup */
164
  LIST_HEAD(peer_list, peer_af) peers;
165
  int peer_count;
166
167
  /* for being part of an update group's subgroup list */
168
  LIST_ENTRY(update_subgroup) updgrp_train;
169
170
  struct bpacket_queue pkt_queue;
171
172
  /*
173
   * List of adj-out structures for this subgroup.
174
   * It essentially represents the snapshot of every prefix that
175
   * has been advertised to the members of the subgroup
176
   */
177
  TAILQ_HEAD(adjout_queue, bgp_adj_out) adjq;
178
179
  /* packet buffer for update generation */
180
  struct stream *work;
181
182
  /* We use a separate stream to encode MP_REACH_NLRI for efficient
183
   * NLRI packing. peer->obuf_work stores all the other attributes. The
184
   * actual packet is then constructed by concatenating the two.
185
   */
186
  struct stream *scratch;
187
188
  /* synchronization list and time */
189
  struct bgp_synchronize *sync;
190
191
  /* send prefix count */
192
  uint32_t scount;
193
194
  /* send prefix count prior to packet update */
195
  uint32_t pscount;
196
197
  /* announcement attribute hash */
198
  struct hash *hash;
199
200
  struct event *t_coalesce;
201
  uint32_t v_coalesce;
202
203
  struct event *t_merge_check;
204
205
  /* table version that the subgroup has caught up to. */
206
  uint64_t version;
207
208
  /* version maintained to record adj changes */
209
  uint64_t adj_version;
210
211
  time_t uptime;
212
213
  /*
214
   * Identifying information about the subgroup that this subgroup was
215
   * split
216
   * from, if any.
217
   */
218
  struct {
219
    uint64_t update_group_id;
220
    uint64_t subgroup_id;
221
  } split_from;
222
223
  uint32_t join_events;
224
  uint32_t prune_events;
225
226
  /*
227
   * This is bumped up when another subgroup merges into this one.
228
   */
229
  uint32_t merge_events;
230
  uint32_t updgrp_switch_events;
231
  uint32_t peer_refreshes_combined;
232
  uint32_t adj_count;
233
  uint32_t split_events;
234
  uint32_t merge_checks_triggered;
235
236
  uint64_t id;
237
238
  uint16_t sflags;
239
#define SUBGRP_STATUS_DEFAULT_ORIGINATE (1 << 0)
240
#define SUBGRP_STATUS_FORCE_UPDATES (1 << 1)
241
#define SUBGRP_STATUS_TABLE_REPARSING (1 << 2)
242
/*
243
 * This flag has been added to ensure that the SNT counters
244
 * gets incremented and decremented only during the creation
245
 * and deletion workflows of default originate,
246
 * not during the update workflow.
247
 */
248
#define SUBGRP_STATUS_PEER_DEFAULT_ORIGINATED (1 << 3)
249
250
  uint16_t flags;
251
#define SUBGRP_FLAG_NEEDS_REFRESH (1 << 0)
252
};
253
254
/*
255
 * Add the given value to the specified counter on a subgroup and its
256
 * parent structures.
257
 */
258
#define SUBGRP_INCR_STAT_BY(subgrp, stat, value)                               \
259
0
  do {                                                                   \
260
0
    (subgrp)->stat += (value);                                     \
261
0
    if ((subgrp)->update_group)                                    \
262
0
      UPDGRP_INCR_STAT_BY((subgrp)->update_group, stat,      \
263
0
              value);                            \
264
0
  } while (0)
265
266
/*
267
 * Increment a counter on a subgroup and its parent structures.
268
 */
269
0
#define SUBGRP_INCR_STAT(subgrp, stat) SUBGRP_INCR_STAT_BY(subgrp, stat, 1)
270
271
/*
272
 * Decrement a counter on a subgroup and its parent structures.
273
 */
274
0
#define SUBGRP_DECR_STAT(subgrp, stat) SUBGRP_INCR_STAT_BY(subgrp, stat, -1)
275
276
typedef int (*updgrp_walkcb)(struct update_group *updgrp, void *ctx);
277
278
/* really a private structure */
279
struct updwalk_context {
280
  struct vty *vty;
281
  struct bgp_dest *dest;
282
  struct bgp_path_info *pi;
283
  uint64_t updgrp_id;
284
  uint64_t subgrp_id;
285
  enum bgp_policy_type policy_type;
286
  const char *policy_name;
287
  int policy_event_start_flag;
288
  bool policy_route_update;
289
  updgrp_walkcb cb;
290
  void *context;
291
  uint8_t flags;
292
  bool uj;
293
  json_object *json_updategrps;
294
295
0
#define UPDWALK_FLAGS_ADVQUEUE   (1 << 0)
296
0
#define UPDWALK_FLAGS_ADVERTISED (1 << 1)
297
};
298
299
0
#define UPDWALK_CONTINUE HASHWALK_CONTINUE
300
#define UPDWALK_ABORT HASHWALK_ABORT
301
302
0
#define PAF_PEER(p)        ((p)->peer)
303
30
#define PAF_SUBGRP(p)      ((p)->subgroup)
304
0
#define PAF_UPDGRP(p)      ((p)->subgroup->update_group)
305
0
#define PAF_PKTQ(f)        SUBGRP_PKTQ((f)->subgroup)
306
307
0
#define UPDGRP_PEER(u)     ((u)->conf)
308
0
#define UPDGRP_AFI(u)      ((u)->afi)
309
0
#define UPDGRP_SAFI(u)     ((u)->safi)
310
0
#define UPDGRP_INST(u)     ((u)->bgp)
311
#define UPDGRP_AFFLAGS(u) ((u)->conf->af_flags[UPDGRP_AFI(u)][UPDGRP_SAFI(u)])
312
0
#define UPDGRP_DBG_ON(u)   ((u)->num_dbg_en_peers)
313
0
#define UPDGRP_PEER_DBG_EN(u)  (((u)->num_dbg_en_peers)++)
314
0
#define UPDGRP_PEER_DBG_DIS(u) (((u)->num_dbg_en_peers)--)
315
0
#define UPDGRP_PEER_DBG_OFF(u) (u)->num_dbg_en_peers = 0
316
317
0
#define SUBGRP_AFI(s)      UPDGRP_AFI((s)->update_group)
318
0
#define SUBGRP_SAFI(s)     UPDGRP_SAFI((s)->update_group)
319
0
#define SUBGRP_PEER(s)     UPDGRP_PEER((s)->update_group)
320
0
#define SUBGRP_PCOUNT(s)   ((s)->peer_count)
321
0
#define SUBGRP_PFIRST(s)   LIST_FIRST(&((s)->peers))
322
0
#define SUBGRP_PKTQ(s)     &((s)->pkt_queue)
323
0
#define SUBGRP_INST(s)     UPDGRP_INST((s)->update_group)
324
#define SUBGRP_AFFLAGS(s)  UPDGRP_AFFLAGS((s)->update_group)
325
#define SUBGRP_UPDGRP(s)   ((s)->update_group)
326
327
/*
328
 * Walk all subgroups in an update group.
329
 */
330
#define UPDGRP_FOREACH_SUBGRP(updgrp, subgrp)                                  \
331
0
  LIST_FOREACH (subgrp, &((updgrp)->subgrps), updgrp_train)
332
333
#define UPDGRP_FOREACH_SUBGRP_SAFE(updgrp, subgrp, tmp_subgrp)                 \
334
0
  LIST_FOREACH_SAFE (subgrp, &((updgrp)->subgrps), updgrp_train,         \
335
0
         tmp_subgrp)
336
337
#define SUBGRP_FOREACH_PEER(subgrp, paf)                                       \
338
0
  LIST_FOREACH (paf, &(subgrp->peers), subgrp_train)
339
340
#define SUBGRP_FOREACH_PEER_SAFE(subgrp, paf, temp_paf)                        \
341
  LIST_FOREACH_SAFE (paf, &(subgrp->peers), subgrp_train, temp_paf)
342
343
#define SUBGRP_FOREACH_ADJ(subgrp, adj)                                        \
344
0
  TAILQ_FOREACH (adj, &(subgrp->adjq), subgrp_adj_train)
345
346
#define SUBGRP_FOREACH_ADJ_SAFE(subgrp, adj, adj_temp)                         \
347
0
  TAILQ_FOREACH_SAFE (adj, &(subgrp->adjq), subgrp_adj_train, adj_temp)
348
349
/* Prototypes.  */
350
/* bgp_updgrp.c */
351
extern void update_bgp_group_init(struct bgp *);
352
extern void udpate_bgp_group_free(struct bgp *);
353
354
extern void update_group_show(struct bgp *bgp, afi_t afi, safi_t safi,
355
            struct vty *vty, uint64_t subgrp_id, bool uj);
356
extern void update_group_show_stats(struct bgp *bgp, struct vty *vty);
357
extern void update_group_adjust_peer(struct peer_af *paf);
358
extern int update_group_adjust_soloness(struct peer *peer, int set);
359
360
extern void update_subgroup_remove_peer(struct update_subgroup *,
361
          struct peer_af *);
362
extern struct bgp_table *update_subgroup_rib(struct update_subgroup *);
363
extern void update_subgroup_split_peer(struct peer_af *, struct update_group *);
364
extern bool update_subgroup_check_merge(struct update_subgroup *, const char *);
365
extern bool update_subgroup_trigger_merge_check(struct update_subgroup *,
366
            int force);
367
extern void update_group_policy_update(struct bgp *bgp,
368
               enum bgp_policy_type ptype,
369
               const char *pname, bool route_update,
370
               int start_event);
371
extern void update_group_af_walk(struct bgp *bgp, afi_t afi, safi_t safi,
372
         updgrp_walkcb cb, void *ctx);
373
extern void update_group_walk(struct bgp *bgp, updgrp_walkcb cb, void *ctx);
374
extern void update_group_periodic_merge(struct bgp *bgp);
375
extern void
376
update_group_refresh_default_originate_route_map(struct event *thread);
377
extern void update_group_start_advtimer(struct bgp *bgp);
378
379
extern void update_subgroup_inherit_info(struct update_subgroup *to,
380
           struct update_subgroup *from);
381
382
/* bgp_updgrp_packet.c */
383
extern struct bpacket *bpacket_alloc(void);
384
extern void bpacket_free(struct bpacket *pkt);
385
extern void bpacket_queue_init(struct bpacket_queue *q);
386
extern void bpacket_queue_cleanup(struct bpacket_queue *q);
387
extern void bpacket_queue_sanity_check(struct bpacket_queue *q);
388
extern struct bpacket *bpacket_queue_add(struct bpacket_queue *q,
389
           struct stream *s,
390
           struct bpacket_attr_vec_arr *vecarr);
391
struct bpacket *bpacket_queue_remove(struct bpacket_queue *q);
392
extern struct bpacket *bpacket_queue_first(struct bpacket_queue *q);
393
struct bpacket *bpacket_queue_last(struct bpacket_queue *q);
394
unsigned int bpacket_queue_length(struct bpacket_queue *q);
395
unsigned int bpacket_queue_hwm_length(struct bpacket_queue *q);
396
bool bpacket_queue_is_full(struct bgp *bgp, struct bpacket_queue *q);
397
extern void bpacket_queue_advance_peer(struct peer_af *paf);
398
extern void bpacket_queue_remove_peer(struct peer_af *paf);
399
extern void bpacket_add_peer(struct bpacket *pkt, struct peer_af *paf);
400
unsigned int bpacket_queue_virtual_length(struct peer_af *paf);
401
extern void bpacket_queue_show_vty(struct bpacket_queue *q, struct vty *vty);
402
bool subgroup_packets_to_build(struct update_subgroup *subgrp);
403
extern struct bpacket *subgroup_update_packet(struct update_subgroup *s);
404
extern struct bpacket *subgroup_withdraw_packet(struct update_subgroup *s);
405
extern struct stream *bpacket_reformat_for_peer(struct bpacket *pkt,
406
            struct peer_af *paf);
407
extern void bpacket_attr_vec_arr_reset(struct bpacket_attr_vec_arr *vecarr);
408
extern void bpacket_attr_vec_arr_set_vec(struct bpacket_attr_vec_arr *vecarr,
409
           enum bpacket_attr_vec_type type,
410
           struct stream *s, struct attr *attr);
411
extern void subgroup_default_update_packet(struct update_subgroup *subgrp,
412
             struct attr *attr,
413
             struct peer *from);
414
extern void subgroup_default_withdraw_packet(struct update_subgroup *subgrp);
415
416
/* bgp_updgrp_adv.c */
417
extern struct bgp_advertise *
418
bgp_advertise_clean_subgroup(struct update_subgroup *subgrp,
419
           struct bgp_adj_out *adj);
420
extern void update_group_show_adj_queue(struct bgp *bgp, afi_t afi, safi_t safi,
421
          struct vty *vty, uint64_t id);
422
extern void update_group_show_advertised(struct bgp *bgp, afi_t afi,
423
           safi_t safi, struct vty *vty,
424
           uint64_t id);
425
extern void update_group_show_packet_queue(struct bgp *bgp, afi_t afi,
426
             safi_t safi, struct vty *vty,
427
             uint64_t id);
428
extern void subgroup_announce_route(struct update_subgroup *subgrp);
429
extern void subgroup_announce_all(struct update_subgroup *subgrp);
430
431
extern void subgroup_default_originate(struct update_subgroup *subgrp,
432
               int withdraw);
433
extern void group_announce_route(struct bgp *bgp, afi_t afi, safi_t safi,
434
         struct bgp_dest *dest,
435
         struct bgp_path_info *pi);
436
extern void subgroup_clear_table(struct update_subgroup *subgrp);
437
extern void update_group_announce(struct bgp *bgp);
438
extern void update_group_announce_rrclients(struct bgp *bgp);
439
extern void peer_af_announce_route(struct peer_af *paf, int combine);
440
extern struct bgp_adj_out *bgp_adj_out_alloc(struct update_subgroup *subgrp,
441
               struct bgp_dest *dest,
442
               uint32_t addpath_tx_id);
443
extern void bgp_adj_out_remove_subgroup(struct bgp_dest *dest,
444
          struct bgp_adj_out *adj,
445
          struct update_subgroup *subgrp);
446
extern void bgp_adj_out_set_subgroup(struct bgp_dest *dest,
447
             struct update_subgroup *subgrp,
448
             struct attr *attr,
449
             struct bgp_path_info *path);
450
extern void bgp_adj_out_unset_subgroup(struct bgp_dest *dest,
451
               struct update_subgroup *subgrp,
452
               char withdraw, uint32_t addpath_tx_id);
453
void subgroup_announce_table(struct update_subgroup *subgrp,
454
           struct bgp_table *table);
455
extern void subgroup_trigger_write(struct update_subgroup *subgrp);
456
457
extern int update_group_clear_update_dbg(struct update_group *updgrp,
458
           void *arg);
459
460
extern void update_bgp_group_free(struct bgp *bgp);
461
extern bool bgp_addpath_encode_tx(struct peer *peer, afi_t afi, safi_t safi);
462
extern bool bgp_check_selected(struct bgp_path_info *bpi, struct peer *peer,
463
             bool addpath_capable, afi_t afi, safi_t safi);
464
extern bool bgp_addpath_capable(struct bgp_path_info *bpi, struct peer *peer,
465
        afi_t afi, safi_t safi);
466
467
/*
468
 * Inline functions
469
 */
470
471
/*
472
 * bpacket_queue_is_empty
473
 */
474
static inline int bpacket_queue_is_empty(struct bpacket_queue *queue)
475
0
{
476
477
  /*
478
   * The packet queue is empty if it only contains a sentinel.
479
   */
480
0
  if (queue->curr_count != 1)
481
0
    return 0;
482
483
0
  assert(bpacket_queue_first(queue)->buffer == NULL);
484
0
  return 1;
485
0
}
Unexecuted instantiation: bgp_main.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_attr.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_debug.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_evpn.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_evpn_mh.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_flowspec_vty.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_fsm.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_io.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_keepalives.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_labelpool.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_mac.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_mpath.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_mplsvpn.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_network.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_nexthop.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_nht.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_packet.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_pbr.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_route.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_routemap.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_updgrp.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_updgrp_adv.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_updgrp_packet.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_vpn.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_vty.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_zebra.c:bpacket_queue_is_empty
Unexecuted instantiation: bgpd.c:bpacket_queue_is_empty
Unexecuted instantiation: vnc_zebra.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_advertise.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_aspath.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_bfd.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_conditional_adv.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_flowspec.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_label.c:bpacket_queue_is_empty
Unexecuted instantiation: bgp_open.c:bpacket_queue_is_empty
486
487
/*
488
 * bpacket_next
489
 *
490
 * Returns the packet after the given packet in a bpacket queue.
491
 */
492
static inline struct bpacket *bpacket_next(struct bpacket *pkt)
493
0
{
494
0
  return TAILQ_NEXT(pkt, pkt_train);
495
0
}
Unexecuted instantiation: bgp_main.c:bpacket_next
Unexecuted instantiation: bgp_attr.c:bpacket_next
Unexecuted instantiation: bgp_debug.c:bpacket_next
Unexecuted instantiation: bgp_evpn.c:bpacket_next
Unexecuted instantiation: bgp_evpn_mh.c:bpacket_next
Unexecuted instantiation: bgp_flowspec_vty.c:bpacket_next
Unexecuted instantiation: bgp_fsm.c:bpacket_next
Unexecuted instantiation: bgp_io.c:bpacket_next
Unexecuted instantiation: bgp_keepalives.c:bpacket_next
Unexecuted instantiation: bgp_labelpool.c:bpacket_next
Unexecuted instantiation: bgp_mac.c:bpacket_next
Unexecuted instantiation: bgp_mpath.c:bpacket_next
Unexecuted instantiation: bgp_mplsvpn.c:bpacket_next
Unexecuted instantiation: bgp_network.c:bpacket_next
Unexecuted instantiation: bgp_nexthop.c:bpacket_next
Unexecuted instantiation: bgp_nht.c:bpacket_next
Unexecuted instantiation: bgp_packet.c:bpacket_next
Unexecuted instantiation: bgp_pbr.c:bpacket_next
Unexecuted instantiation: bgp_route.c:bpacket_next
Unexecuted instantiation: bgp_routemap.c:bpacket_next
Unexecuted instantiation: bgp_updgrp.c:bpacket_next
Unexecuted instantiation: bgp_updgrp_adv.c:bpacket_next
Unexecuted instantiation: bgp_updgrp_packet.c:bpacket_next
Unexecuted instantiation: bgp_vpn.c:bpacket_next
Unexecuted instantiation: bgp_vty.c:bpacket_next
Unexecuted instantiation: bgp_zebra.c:bpacket_next
Unexecuted instantiation: bgpd.c:bpacket_next
Unexecuted instantiation: vnc_zebra.c:bpacket_next
Unexecuted instantiation: bgp_advertise.c:bpacket_next
Unexecuted instantiation: bgp_aspath.c:bpacket_next
Unexecuted instantiation: bgp_bfd.c:bpacket_next
Unexecuted instantiation: bgp_conditional_adv.c:bpacket_next
Unexecuted instantiation: bgp_flowspec.c:bpacket_next
Unexecuted instantiation: bgp_label.c:bpacket_next
Unexecuted instantiation: bgp_open.c:bpacket_next
496
497
/*
498
 * update_group_adjust_peer_afs
499
 *
500
 * Adjust all peer_af structures for the given peer.
501
 */
502
static inline void update_group_adjust_peer_afs(struct peer *peer)
503
0
{
504
0
  struct peer_af *paf;
505
0
  int afidx;
506
507
0
  for (afidx = BGP_AF_START; afidx < BGP_AF_MAX; afidx++) {
508
0
    paf = peer->peer_af_array[afidx];
509
0
    if (paf != NULL)
510
0
      update_group_adjust_peer(paf);
511
0
  }
512
0
}
Unexecuted instantiation: bgp_main.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_attr.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_debug.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_evpn.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_evpn_mh.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_flowspec_vty.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_fsm.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_io.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_keepalives.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_labelpool.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_mac.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_mpath.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_mplsvpn.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_network.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_nexthop.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_nht.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_packet.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_pbr.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_route.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_routemap.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_updgrp.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_updgrp_adv.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_updgrp_packet.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_vpn.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_vty.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_zebra.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgpd.c:update_group_adjust_peer_afs
Unexecuted instantiation: vnc_zebra.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_advertise.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_aspath.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_bfd.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_conditional_adv.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_flowspec.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_label.c:update_group_adjust_peer_afs
Unexecuted instantiation: bgp_open.c:update_group_adjust_peer_afs
513
514
/*
515
 * update_group_remove_peer_afs
516
 *
517
 * Remove all peer_af structures for the given peer from their subgroups.
518
 */
519
static inline void update_group_remove_peer_afs(struct peer *peer)
520
0
{
521
0
  struct peer_af *paf;
522
0
  int afidx;
523
524
0
  for (afidx = BGP_AF_START; afidx < BGP_AF_MAX; afidx++) {
525
0
    paf = peer->peer_af_array[afidx];
526
0
    if (paf != NULL)
527
0
      update_subgroup_remove_peer(PAF_SUBGRP(paf), paf);
528
0
  }
529
0
}
Unexecuted instantiation: bgp_main.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_attr.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_debug.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_evpn.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_evpn_mh.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_flowspec_vty.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_fsm.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_io.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_keepalives.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_labelpool.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_mac.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_mpath.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_mplsvpn.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_network.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_nexthop.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_nht.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_packet.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_pbr.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_route.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_routemap.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_updgrp.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_updgrp_adv.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_updgrp_packet.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_vpn.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_vty.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_zebra.c:update_group_remove_peer_afs
Unexecuted instantiation: bgpd.c:update_group_remove_peer_afs
Unexecuted instantiation: vnc_zebra.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_advertise.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_aspath.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_bfd.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_conditional_adv.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_flowspec.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_label.c:update_group_remove_peer_afs
Unexecuted instantiation: bgp_open.c:update_group_remove_peer_afs
530
531
/*
532
 * update_subgroup_needs_refresh
533
 */
534
static inline int
535
update_subgroup_needs_refresh(const struct update_subgroup *subgrp)
536
0
{
537
0
  if (CHECK_FLAG(subgrp->flags, SUBGRP_FLAG_NEEDS_REFRESH))
538
0
    return 1;
539
0
  else
540
0
    return 0;
541
0
}
Unexecuted instantiation: bgp_main.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_attr.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_debug.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_evpn.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_evpn_mh.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_flowspec_vty.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_fsm.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_io.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_keepalives.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_labelpool.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_mac.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_mpath.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_mplsvpn.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_network.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_nexthop.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_nht.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_packet.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_pbr.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_route.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_routemap.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_updgrp.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_updgrp_adv.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_updgrp_packet.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_vpn.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_vty.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_zebra.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgpd.c:update_subgroup_needs_refresh
Unexecuted instantiation: vnc_zebra.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_advertise.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_aspath.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_bfd.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_conditional_adv.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_flowspec.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_label.c:update_subgroup_needs_refresh
Unexecuted instantiation: bgp_open.c:update_subgroup_needs_refresh
542
543
/*
544
 * update_subgroup_set_needs_refresh
545
 */
546
static inline void
547
update_subgroup_set_needs_refresh(struct update_subgroup *subgrp, int value)
548
0
{
549
0
  if (value)
550
0
    SET_FLAG(subgrp->flags, SUBGRP_FLAG_NEEDS_REFRESH);
551
0
  else
552
0
    UNSET_FLAG(subgrp->flags, SUBGRP_FLAG_NEEDS_REFRESH);
553
0
}
Unexecuted instantiation: bgp_main.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_attr.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_debug.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_evpn.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_evpn_mh.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_flowspec_vty.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_fsm.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_io.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_keepalives.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_labelpool.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_mac.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_mpath.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_mplsvpn.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_network.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_nexthop.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_nht.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_packet.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_pbr.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_route.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_routemap.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_updgrp.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_updgrp_adv.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_updgrp_packet.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_vpn.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_vty.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_zebra.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgpd.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: vnc_zebra.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_advertise.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_aspath.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_bfd.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_conditional_adv.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_flowspec.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_label.c:update_subgroup_set_needs_refresh
Unexecuted instantiation: bgp_open.c:update_subgroup_set_needs_refresh
554
555
static inline struct update_subgroup *peer_subgroup(struct peer *peer,
556
                afi_t afi, safi_t safi)
557
0
{
558
0
  struct peer_af *paf;
559
560
0
  paf = peer_af_find(peer, afi, safi);
561
0
  if (paf)
562
0
    return PAF_SUBGRP(paf);
563
0
  return NULL;
564
0
}
Unexecuted instantiation: bgp_main.c:peer_subgroup
Unexecuted instantiation: bgp_attr.c:peer_subgroup
Unexecuted instantiation: bgp_debug.c:peer_subgroup
Unexecuted instantiation: bgp_evpn.c:peer_subgroup
Unexecuted instantiation: bgp_evpn_mh.c:peer_subgroup
Unexecuted instantiation: bgp_flowspec_vty.c:peer_subgroup
Unexecuted instantiation: bgp_fsm.c:peer_subgroup
Unexecuted instantiation: bgp_io.c:peer_subgroup
Unexecuted instantiation: bgp_keepalives.c:peer_subgroup
Unexecuted instantiation: bgp_labelpool.c:peer_subgroup
Unexecuted instantiation: bgp_mac.c:peer_subgroup
Unexecuted instantiation: bgp_mpath.c:peer_subgroup
Unexecuted instantiation: bgp_mplsvpn.c:peer_subgroup
Unexecuted instantiation: bgp_network.c:peer_subgroup
Unexecuted instantiation: bgp_nexthop.c:peer_subgroup
Unexecuted instantiation: bgp_nht.c:peer_subgroup
Unexecuted instantiation: bgp_packet.c:peer_subgroup
Unexecuted instantiation: bgp_pbr.c:peer_subgroup
Unexecuted instantiation: bgp_route.c:peer_subgroup
Unexecuted instantiation: bgp_routemap.c:peer_subgroup
Unexecuted instantiation: bgp_updgrp.c:peer_subgroup
Unexecuted instantiation: bgp_updgrp_adv.c:peer_subgroup
Unexecuted instantiation: bgp_updgrp_packet.c:peer_subgroup
Unexecuted instantiation: bgp_vpn.c:peer_subgroup
Unexecuted instantiation: bgp_vty.c:peer_subgroup
Unexecuted instantiation: bgp_zebra.c:peer_subgroup
Unexecuted instantiation: bgpd.c:peer_subgroup
Unexecuted instantiation: vnc_zebra.c:peer_subgroup
Unexecuted instantiation: bgp_advertise.c:peer_subgroup
Unexecuted instantiation: bgp_aspath.c:peer_subgroup
Unexecuted instantiation: bgp_bfd.c:peer_subgroup
Unexecuted instantiation: bgp_conditional_adv.c:peer_subgroup
Unexecuted instantiation: bgp_flowspec.c:peer_subgroup
Unexecuted instantiation: bgp_label.c:peer_subgroup
Unexecuted instantiation: bgp_open.c:peer_subgroup
565
566
/*
567
 * update_group_adjust_peer_afs
568
 *
569
 * Adjust all peer_af structures for the given peer.
570
 */
571
static inline void bgp_announce_peer(struct peer *peer)
572
0
{
573
0
  struct peer_af *paf;
574
0
  int afidx;
575
576
0
  for (afidx = BGP_AF_START; afidx < BGP_AF_MAX; afidx++) {
577
0
    paf = peer->peer_af_array[afidx];
578
0
    if (paf != NULL)
579
0
      subgroup_announce_all(PAF_SUBGRP(paf));
580
0
  }
581
0
}
Unexecuted instantiation: bgp_main.c:bgp_announce_peer
Unexecuted instantiation: bgp_attr.c:bgp_announce_peer
Unexecuted instantiation: bgp_debug.c:bgp_announce_peer
Unexecuted instantiation: bgp_evpn.c:bgp_announce_peer
Unexecuted instantiation: bgp_evpn_mh.c:bgp_announce_peer
Unexecuted instantiation: bgp_flowspec_vty.c:bgp_announce_peer
Unexecuted instantiation: bgp_fsm.c:bgp_announce_peer
Unexecuted instantiation: bgp_io.c:bgp_announce_peer
Unexecuted instantiation: bgp_keepalives.c:bgp_announce_peer
Unexecuted instantiation: bgp_labelpool.c:bgp_announce_peer
Unexecuted instantiation: bgp_mac.c:bgp_announce_peer
Unexecuted instantiation: bgp_mpath.c:bgp_announce_peer
Unexecuted instantiation: bgp_mplsvpn.c:bgp_announce_peer
Unexecuted instantiation: bgp_network.c:bgp_announce_peer
Unexecuted instantiation: bgp_nexthop.c:bgp_announce_peer
Unexecuted instantiation: bgp_nht.c:bgp_announce_peer
Unexecuted instantiation: bgp_packet.c:bgp_announce_peer
Unexecuted instantiation: bgp_pbr.c:bgp_announce_peer
Unexecuted instantiation: bgp_route.c:bgp_announce_peer
Unexecuted instantiation: bgp_routemap.c:bgp_announce_peer
Unexecuted instantiation: bgp_updgrp.c:bgp_announce_peer
Unexecuted instantiation: bgp_updgrp_adv.c:bgp_announce_peer
Unexecuted instantiation: bgp_updgrp_packet.c:bgp_announce_peer
Unexecuted instantiation: bgp_vpn.c:bgp_announce_peer
Unexecuted instantiation: bgp_vty.c:bgp_announce_peer
Unexecuted instantiation: bgp_zebra.c:bgp_announce_peer
Unexecuted instantiation: bgpd.c:bgp_announce_peer
Unexecuted instantiation: vnc_zebra.c:bgp_announce_peer
Unexecuted instantiation: bgp_advertise.c:bgp_announce_peer
Unexecuted instantiation: bgp_aspath.c:bgp_announce_peer
Unexecuted instantiation: bgp_bfd.c:bgp_announce_peer
Unexecuted instantiation: bgp_conditional_adv.c:bgp_announce_peer
Unexecuted instantiation: bgp_flowspec.c:bgp_announce_peer
Unexecuted instantiation: bgp_label.c:bgp_announce_peer
Unexecuted instantiation: bgp_open.c:bgp_announce_peer
582
583
/**
584
 * advertise_list_is_empty
585
 */
586
static inline int advertise_list_is_empty(struct update_subgroup *subgrp)
587
0
{
588
0
  if (bgp_adv_fifo_count(&subgrp->sync->update) ||
589
0
      bgp_adv_fifo_count(&subgrp->sync->withdraw))
590
0
    return 0;
591
592
0
  return 1;
593
0
}
Unexecuted instantiation: bgp_main.c:advertise_list_is_empty
Unexecuted instantiation: bgp_attr.c:advertise_list_is_empty
Unexecuted instantiation: bgp_debug.c:advertise_list_is_empty
Unexecuted instantiation: bgp_evpn.c:advertise_list_is_empty
Unexecuted instantiation: bgp_evpn_mh.c:advertise_list_is_empty
Unexecuted instantiation: bgp_flowspec_vty.c:advertise_list_is_empty
Unexecuted instantiation: bgp_fsm.c:advertise_list_is_empty
Unexecuted instantiation: bgp_io.c:advertise_list_is_empty
Unexecuted instantiation: bgp_keepalives.c:advertise_list_is_empty
Unexecuted instantiation: bgp_labelpool.c:advertise_list_is_empty
Unexecuted instantiation: bgp_mac.c:advertise_list_is_empty
Unexecuted instantiation: bgp_mpath.c:advertise_list_is_empty
Unexecuted instantiation: bgp_mplsvpn.c:advertise_list_is_empty
Unexecuted instantiation: bgp_network.c:advertise_list_is_empty
Unexecuted instantiation: bgp_nexthop.c:advertise_list_is_empty
Unexecuted instantiation: bgp_nht.c:advertise_list_is_empty
Unexecuted instantiation: bgp_packet.c:advertise_list_is_empty
Unexecuted instantiation: bgp_pbr.c:advertise_list_is_empty
Unexecuted instantiation: bgp_route.c:advertise_list_is_empty
Unexecuted instantiation: bgp_routemap.c:advertise_list_is_empty
Unexecuted instantiation: bgp_updgrp.c:advertise_list_is_empty
Unexecuted instantiation: bgp_updgrp_adv.c:advertise_list_is_empty
Unexecuted instantiation: bgp_updgrp_packet.c:advertise_list_is_empty
Unexecuted instantiation: bgp_vpn.c:advertise_list_is_empty
Unexecuted instantiation: bgp_vty.c:advertise_list_is_empty
Unexecuted instantiation: bgp_zebra.c:advertise_list_is_empty
Unexecuted instantiation: bgpd.c:advertise_list_is_empty
Unexecuted instantiation: vnc_zebra.c:advertise_list_is_empty
Unexecuted instantiation: bgp_advertise.c:advertise_list_is_empty
Unexecuted instantiation: bgp_aspath.c:advertise_list_is_empty
Unexecuted instantiation: bgp_bfd.c:advertise_list_is_empty
Unexecuted instantiation: bgp_conditional_adv.c:advertise_list_is_empty
Unexecuted instantiation: bgp_flowspec.c:advertise_list_is_empty
Unexecuted instantiation: bgp_label.c:advertise_list_is_empty
Unexecuted instantiation: bgp_open.c:advertise_list_is_empty
594
595
#endif /* _QUAGGA_BGP_UPDGRP_H */