]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: Fix the number of SAs pushed into one MSDP SA-TLV
authoranuradhak <anuradhak@cumulusnetworks.com>
Thu, 1 Dec 2016 00:14:20 +0000 (16:14 -0800)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Thu, 22 Dec 2016 01:26:17 +0000 (20:26 -0500)
The entry_cnt in a SA TLV is one byte. I was trying to push 765 SAs into
each TLV resulting in strange problems in a scale setup.

Signed-off-by: Anuradha Karuppiah <anuradhak@cumulusnetworks.com>
pimd/pim_msdp_packet.c
pimd/pim_msdp_packet.h

index 71dd00beca771e63c00d510f9f1961d39c063dd3..8ee45813ca3624a008c7c6fb951f9d134e65c289 100644 (file)
@@ -194,6 +194,7 @@ pim_msdp_write(struct thread *thread)
   enum pim_msdp_tlv type;
   int len;
   int work_cnt = 0;
+  int work_max_cnt = 1;
 
   mp = THREAD_ARG(thread);
   mp->t_write = NULL;
@@ -273,8 +274,11 @@ pim_msdp_write(struct thread *thread)
     pim_msdp_pkt_delete(mp);
 
     ++work_cnt;
-    /* XXX - may need to pause if we have done too much work in this
+    /* may need to pause if we have done too much work in this
      * loop */
+    if (work_cnt >= work_max_cnt) {
+      break;
+    }
   } while ((s = stream_fifo_head(mp->obuf)) != NULL);
   pim_msdp_write_proceed_actions(mp);
 
@@ -380,6 +384,10 @@ pim_msdp_pkt_sa_gen(struct pim_msdp_peer *mp)
   int local_cnt = msdp->local_cnt;
 
   sa_count = 0;
+  if (PIM_DEBUG_MSDP_INTERNAL) {
+    zlog_debug("  sa gen  %d", local_cnt);
+  }
+
   local_cnt = pim_msdp_pkt_sa_fill_hdr(local_cnt);
 
   for (ALL_LIST_ELEMENTS_RO(msdp->sa_list, sanode, sa)) {
@@ -395,6 +403,9 @@ pim_msdp_pkt_sa_gen(struct pim_msdp_peer *mp)
       pim_msdp_pkt_sa_push(mp);
       /* reset headers */
       sa_count = 0;
+      if (PIM_DEBUG_MSDP_INTERNAL) {
+          zlog_debug("  sa gen for remainder %d", local_cnt);
+      }
       local_cnt = pim_msdp_pkt_sa_fill_hdr(local_cnt);
     }
   }
index a362ff11d549a72f30d4377ebbc6bfe2cf6eca29..f6fcfee6bb7f0d5d61d07cedf5f7cea9470177be 100644 (file)
@@ -55,7 +55,9 @@
                                     PIM_MSDP_SA_Y_SIZE(entry_cnt))
 /* SA TLV has to have atleast only one entry in it so x=8 + y=12 */
 #define PIM_MSDP_SA_TLV_MIN_SIZE PIM_MSDP_SA_ENTRY_CNT2SIZE(1)
-#define PIM_MSDP_SA_MAX_ENTRY_CNT ((PIM_MSDP_SA_TLV_MAX_SIZE - PIM_MSDP_SA_X_SIZE)/PIM_MSDP_SA_ONE_ENTRY_SIZE)
+/* XXX: theoretically we can fix a max of 255 but that may result in packet
+ * fragmentation */
+#define PIM_MSDP_SA_MAX_ENTRY_CNT 120
 
 #define PIM_MSDP_MAX_PACKET_SIZE max(PIM_MSDP_SA_TLV_MAX_SIZE, PIM_MSDP_KA_TLV_MAX_SIZE)