]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
BGP: split tx explicitly
authorMaria Jan Matejka <mq@jmq.cz>
Tue, 11 Jun 2019 09:35:25 +0000 (09:35 +0000)
committerMaria Matejka <mq@ucw.cz>
Mon, 1 Jul 2019 07:05:50 +0000 (09:05 +0200)
If BGP has too many data to send and BIRD is slower than the link, TX is
always possible until all data is sent. This patch limits maximum number
of generated BGP messages in one iteration of TX hook.

proto/bgp/packets.c

index c7cc1d0108c0412378240c55903580ae100195ea..01a23d5aeb86337cd8a8f56c008c805bc58e4f1b 100644 (file)
@@ -2789,15 +2789,18 @@ bgp_schedule_packet(struct bgp_conn *conn, struct bgp_channel *c, int type)
   if ((conn->sk->tpos == conn->sk->tbuf) && !ev_active(conn->tx_ev))
     ev_schedule(conn->tx_ev);
 }
-
 void
 bgp_kick_tx(void *vconn)
 {
   struct bgp_conn *conn = vconn;
 
   DBG("BGP: kicking TX\n");
-  while (bgp_fire_tx(conn) > 0)
+  uint max = 1024;
+  while (--max && (bgp_fire_tx(conn) > 0))
     ;
+
+  if (!max && !ev_active(conn->tx_ev))
+    ev_schedule(conn->tx_ev);
 }
 
 void
@@ -2806,8 +2809,12 @@ bgp_tx(sock *sk)
   struct bgp_conn *conn = sk->data;
 
   DBG("BGP: TX hook\n");
-  while (bgp_fire_tx(conn) > 0)
+  uint max = 1024;
+  while (--max && (bgp_fire_tx(conn) > 0))
     ;
+
+  if (!max && !ev_active(conn->tx_ev))
+    ev_schedule(conn->tx_ev);
 }