2022-05-27 21:52:29 +02:00
|
|
|
#include "utility/sequencenumber.h"
|
2021-03-17 14:49:07 +01:00
|
|
|
|
2021-05-14 00:31:14 +02:00
|
|
|
#define SN_MASK 0xffffff
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Mask a given sequence number to get rid of MSB.
|
|
|
|
*/
|
|
|
|
#define GET_MASKED_SN(x) (x & SN_MASK)
|
|
|
|
|
2021-05-25 20:22:19 +02:00
|
|
|
bool sn_equal(record_sequence_number_t a, record_sequence_number_t b) {
|
2021-05-03 21:47:02 +02:00
|
|
|
return GET_MASKED_SN(a) == GET_MASKED_SN(b);
|
2021-03-17 14:49:07 +01:00
|
|
|
}
|
|
|
|
|
2021-03-24 15:52:02 +01:00
|
|
|
record_sequence_number_t sn_increment(record_sequence_number_t sn) {
|
2021-05-03 21:47:02 +02:00
|
|
|
return GET_MASKED_SN(++sn);
|
2021-05-14 00:31:14 +02:00
|
|
|
}
|
|
|
|
|
2021-05-25 20:22:19 +02:00
|
|
|
record_sequence_number_t sn_decrement(record_sequence_number_t sn) {
|
|
|
|
if (sn > 0) {
|
|
|
|
return GET_MASKED_SN((sn-1));
|
|
|
|
} else {
|
|
|
|
return SN_MASK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-14 00:31:14 +02:00
|
|
|
record_sequence_number_t sn_increment_by(record_sequence_number_t sn, uint32_t amount) {
|
|
|
|
return GET_MASKED_SN((sn + amount));
|
|
|
|
}
|
|
|
|
|
|
|
|
record_sequence_number_t sn_get_middle_sn(record_sequence_number_t older, record_sequence_number_t newer) {
|
2021-05-25 17:50:11 +02:00
|
|
|
if (older <= newer) {
|
2021-05-18 21:28:12 +02:00
|
|
|
return GET_MASKED_SN(((older + newer) / 2));
|
|
|
|
} else {
|
|
|
|
return GET_MASKED_SN(((older + newer + SN_MASK) / 2));
|
2021-05-14 00:31:14 +02:00
|
|
|
}
|
2021-05-25 17:50:11 +02:00
|
|
|
}
|