#include "bgpd/bgp_updgrp.h"
#include "bgpd/bgp_route.h"
#include "bgpd/bgp_filter.h"
+#include "bgpd/bgp_io.h"
/********************
* PRIVATE FUNCTIONS
subgrp->peer_count - 1);
}
+void subgroup_trigger_write(struct update_subgroup *subgrp)
+{
+ struct peer_af *paf;
+
+ /* For each peer in the subgroup, schedule a job to pull packets from
+ * the
+ * subgroup output queue into their own output queue. This action will
+ * trigger a write job on the I/O thread. */
+ SUBGRP_FOREACH_PEER(subgrp, paf)
+ if (paf->peer->status == Established)
+ thread_add_timer_msec(bm->master, bgp_generate_updgrp_packets,
+ paf->peer, 0,
+ &paf->peer->t_generate_updgrp_packets);
+}
+
int update_group_clear_update_dbg(struct update_group *updgrp, void *arg)
{
UPDGRP_PEER_DBG_OFF(updgrp);
char withdraw, u_int32_t addpath_tx_id);
void subgroup_announce_table(struct update_subgroup *subgrp,
struct bgp_table *table);
+extern void subgroup_trigger_write(struct update_subgroup *subgrp);
extern int update_group_clear_update_dbg(struct update_group *updgrp,
void *arg);
{
struct bgp_adj_out *adj;
struct bgp_advertise *adv;
+ bool trigger_write;
if (DISABLE_BGP_ANNOUNCE)
return;
adv->rn = rn;
adv->adj = adj;
+ /* Note if we need to trigger a packet write */
+ trigger_write =
+ BGP_ADV_FIFO_EMPTY(&subgrp->sync->withdraw);
+
/* Add to synchronization entry for withdraw
* announcement. */
BGP_ADV_FIFO_ADD(&subgrp->sync->withdraw, &adv->fifo);
+
+ if (trigger_write)
+ subgroup_trigger_write(subgrp);
} else {
/* Remove myself from adjacency. */
BGP_ADJ_OUT_DEL(rn, adj);
bgp_packet_set_size(s);
(void)bpacket_queue_add(SUBGRP_PKTQ(subgrp), s, &vecarr);
+ subgroup_trigger_write(subgrp);
}
void subgroup_default_withdraw_packet(struct update_subgroup *subgrp)
bgp_packet_set_size(s);
(void)bpacket_queue_add(SUBGRP_PKTQ(subgrp), s, NULL);
+ subgroup_trigger_write(subgrp);
}
static void