Skip to content

Commit

Permalink
ANSN Check must be skipped if we reset the sequence number of a router
Browse files Browse the repository at this point in the history
  • Loading branch information
HRogge committed Jun 11, 2021
1 parent 06b8343 commit e1e49c0
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 7 deletions.
5 changes: 4 additions & 1 deletion include/oonf/base/oonf_duplicate_set.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ enum oonf_duplicate_result
/*! newer than the latest cached number */
OONF_DUPSET_NEWEST,

/*! sequence number was reset */
OONF_DUPSET_RESET,

/*! sequence number was the first tested with the duplicate set */
OONF_DUPSET_FIRST,
};
Expand Down Expand Up @@ -180,7 +183,7 @@ EXPORT const char *oonf_duplicate_get_result_str(enum oonf_duplicate_result);
*/
static INLINE bool
oonf_duplicate_is_new(enum oonf_duplicate_result result) {
return result == OONF_DUPSET_NEW || result == OONF_DUPSET_NEWEST || result == OONF_DUPSET_FIRST;
return result == OONF_DUPSET_NEW || result == OONF_DUPSET_NEWEST || result == OONF_DUPSET_RESET || result == OONF_DUPSET_FIRST;
}

#endif /* OONF_DUPLICATE_SET_H_ */
2 changes: 1 addition & 1 deletion include/oonf/olsrv2/olsrv2/olsrv2.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ EXPORT uint64_t olsrv2_get_tc_interval(void);
EXPORT uint64_t olsrv2_get_tc_validity(void);
EXPORT bool olsrv2_is_nhdp_routable(struct netaddr *addr);
EXPORT bool olsrv2_is_routable(struct netaddr *addr);
EXPORT bool olsrv2_mpr_shall_process(struct rfc5444_reader_tlvblock_context *, uint64_t vtime);
EXPORT bool olsrv2_mpr_shall_process(struct rfc5444_reader_tlvblock_context *, uint64_t vtime, bool *);
EXPORT bool olsrv2_mpr_shall_forwarding(
struct rfc5444_reader_tlvblock_context *context, struct netaddr *source_address, uint64_t vtime);
EXPORT void olsrv2_generate_tcs(bool);
Expand Down
2 changes: 1 addition & 1 deletion src/base/oonf_duplicate_set.c
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,7 @@ _test(struct oonf_duplicate_set *dupset, struct oonf_duplicate_entry *entry, uin
entry->too_old_count = 0;
entry->current = seqno;

return OONF_DUPSET_NEWEST;
return OONF_DUPSET_RESET;
}
return OONF_DUPSET_TOO_OLD;
}
Expand Down
6 changes: 5 additions & 1 deletion src/olsrv2/olsrv2/olsrv2.c
Original file line number Diff line number Diff line change
Expand Up @@ -384,10 +384,11 @@ olsrv2_is_routable(struct netaddr *addr) {
* to MPR settings.
* @param context RFC5444 tlvblock reader context
* @param vtime validity time for duplicate entry data
* @param reset pointer to boolean that will tell if the sequence number was reset
* @return true if TC should be processed, false otherwise
*/
bool
olsrv2_mpr_shall_process(struct rfc5444_reader_tlvblock_context *context, uint64_t vtime) {
olsrv2_mpr_shall_process(struct rfc5444_reader_tlvblock_context *context, uint64_t vtime, bool *reset) {
enum oonf_duplicate_result dup_result;
bool process;
#ifdef OONF_LOG_DEBUG_INFO
Expand All @@ -407,6 +408,9 @@ olsrv2_mpr_shall_process(struct rfc5444_reader_tlvblock_context *context, uint64
dup_result = oonf_duplicate_entry_add(&_protocol->processed_set, context->msg_type, &context->orig_addr,
context->seqno, vtime + _olsrv2_config.f_hold_time);
process = oonf_duplicate_is_new(dup_result);
if (reset != NULL) {
*reset = dup_result == OONF_DUPSET_RESET;
}

OONF_DEBUG(LOG_OLSRV2,
"Do %sprocess message type %u from %s"
Expand Down
8 changes: 5 additions & 3 deletions src/olsrv2/olsrv2/olsrv2_reader.c
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ _cb_messagetlvs(struct rfc5444_reader_tlvblock_context *context) {
uint16_t ansn;
uint8_t tmp;
int af_type;
bool seqno_reset;
#ifdef OONF_LOG_DEBUG_INFO
struct netaddr_str buf;
#endif
Expand Down Expand Up @@ -295,7 +296,8 @@ _cb_messagetlvs(struct rfc5444_reader_tlvblock_context *context) {
}

/* test if we already processed the message */
if (!olsrv2_mpr_shall_process(context, _current.vtime)) {
seqno_reset = false;
if (!olsrv2_mpr_shall_process(context, _current.vtime, &seqno_reset)) {
OONF_DEBUG(LOG_OLSRV2_R, "Processing set says 'do not process'");
return RFC5444_DROP_MSG_BUT_FORWARD;
}
Expand All @@ -309,13 +311,13 @@ _cb_messagetlvs(struct rfc5444_reader_tlvblock_context *context) {

/* check if the topology information is recent enough */
if (_current.complete_tc) {
if (rfc5444_seqno_is_smaller(ansn, _current.node->ansn)) {
if (!seqno_reset && rfc5444_seqno_is_smaller(ansn, _current.node->ansn)) {
OONF_DEBUG(LOG_OLSRV2_R, "ANSN %u is smaller than last stored ANSN %u", ansn, _current.node->ansn);
return RFC5444_DROP_MSG_BUT_FORWARD;
}
}
else {
if (!rfc5444_seqno_is_larger(ansn, _current.node->ansn)) {
if (!seqno_reset && !rfc5444_seqno_is_larger(ansn, _current.node->ansn)) {
OONF_DEBUG(LOG_OLSRV2_R, "ANSN %u is smaller than last stored ANSN %u", ansn, _current.node->ansn);
return RFC5444_DROP_MSG_BUT_FORWARD;
}
Expand Down

0 comments on commit e1e49c0

Please sign in to comment.