This repository has been archived by the owner on Jun 28, 2023. It is now read-only.
forked from coolsnowwolf/routing
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
olsrd: import patch to prevent olsr storms
Fixes: OLSR/olsrd#106 Signed-off-by: Nick Hainke <vincent@systemli.org>
- Loading branch information
1 parent
15883ec
commit 5b489a7
Showing
1 changed file
with
79 additions
and
0 deletions.
There are no files selected for viewing
79 changes: 79 additions & 0 deletions
79
olsrd/patches/102-limit-valid-+ve-sequence-number-diff-to-avoid-storms.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
From 08faae831d9facf8bd42c66ba046ab081645efe1 Mon Sep 17 00:00:00 2001 | ||
From: Tim <tim@aredn-builder.home> | ||
Date: Mon, 6 Sep 2021 20:22:42 +0000 | ||
Subject: [PATCH] Limit valid +ve sequence number diff to avoid storms | ||
|
||
--- | ||
net/olsrd/patches/009-olsrd-seqnr.patch | 66 +++++++++++++++++++++++++ | ||
1 file changed, 66 insertions(+) | ||
create mode 100644 net/olsrd/patches/009-olsrd-seqnr.patch | ||
|
||
--- /dev/null | ||
+++ b/net/olsrd/patches/009-olsrd-seqnr.patch | ||
@@ -0,0 +1,66 @@ | ||
+--- a/src/duplicate_set.c | ||
++++ b/src/duplicate_set.c | ||
+@@ -70,7 +70,7 @@ void olsr_cleanup_duplicates(union olsr_ | ||
+ | ||
+ entry = (struct dup_entry *)avl_find(&duplicate_set, orig); | ||
+ if (entry != NULL) { | ||
+- entry->too_low_counter = DUP_MAX_TOO_LOW - 2; | ||
++ entry->out_of_bounds_counter = DUP_MAX_OUT_OF_BOUNDS - 2; | ||
+ } | ||
+ } | ||
+ | ||
+@@ -82,7 +82,7 @@ olsr_create_duplicate_entry(void *ip, ui | ||
+ if (entry != NULL) { | ||
+ memcpy(&entry->ip, ip, olsr_cnf->ip_version == AF_INET ? sizeof(entry->ip.v4) : sizeof(entry->ip.v6)); | ||
+ entry->seqnr = seqnr; | ||
+- entry->too_low_counter = 0; | ||
++ entry->out_of_bounds_counter = 0; | ||
+ entry->avl.key = &entry->ip; | ||
+ entry->array = 0; | ||
+ } | ||
+@@ -160,12 +160,12 @@ olsr_message_is_duplicate(union olsr_mes | ||
+ } | ||
+ | ||
+ diff = olsr_seqno_diff(seqnr, entry->seqnr); | ||
+- if (diff < -31) { | ||
+- entry->too_low_counter++; | ||
++ if (diff < -31 || diff > DUP_SEQNR_DIFF_HIGH_LIMIT) { | ||
++ entry->out_of_bounds_counter++; | ||
+ | ||
+- // client did restart with a lower number ? | ||
+- if (entry->too_low_counter > DUP_MAX_TOO_LOW) { | ||
+- entry->too_low_counter = 0; | ||
++ // client did restart with a too low or too high number ? | ||
++ if (entry->out_of_bounds_counter > DUP_MAX_OUT_OF_BOUNDS) { | ||
++ entry->out_of_bounds_counter = 0; | ||
+ entry->seqnr = seqnr; | ||
+ entry->array = 1; | ||
+ return false; /* start with a new sequence number, so NO duplicate */ | ||
+@@ -174,7 +174,7 @@ olsr_message_is_duplicate(union olsr_mes | ||
+ return true; /* duplicate ! */ | ||
+ } | ||
+ | ||
+- entry->too_low_counter = 0; | ||
++ entry->out_of_bounds_counter = 0; | ||
+ if (diff <= 0) { | ||
+ uint32_t bitmask = 1u << ((uint32_t) (-diff)); | ||
+ | ||
+--- a/src/duplicate_set.h | ||
++++ b/src/duplicate_set.h | ||
+@@ -54,13 +54,14 @@ | ||
+ #define DUPLICATE_CLEANUP_INTERVAL 15000 | ||
+ #define DUPLICATE_CLEANUP_JITTER 25 | ||
+ #define DUPLICATE_VTIME 120000 | ||
+-#define DUP_MAX_TOO_LOW 16 | ||
++#define DUP_MAX_OUT_OF_BOUNDS 16 | ||
++#define DUP_SEQNR_DIFF_HIGH_LIMIT 0x2000 | ||
+ | ||
+ struct dup_entry { | ||
+ struct avl_node avl; | ||
+ union olsr_ip_addr ip; | ||
+ uint16_t seqnr; | ||
+- uint16_t too_low_counter; | ||
++ uint16_t out_of_bounds_counter; | ||
+ uint32_t array; | ||
+ uint32_t valid_until; | ||
+ }; |