|
| | SequenceNumber ()=default |
| | SequenceNumber (NUMERIC_TYPE value) |
| | Constructs a SequenceNumber with the given value.
|
| constexpr NUMERIC_TYPE | GetValue () const |
| | Extracts the numeric value of the sequence number.
|
| bool | operator! () const =delete |
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator% (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete |
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator& (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete |
| bool | operator&& (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete |
| int | operator* ()=delete |
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator* (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete |
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator+ (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &other) const |
| | Operator defining addition of two sequence numbers.
|
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator+ (SIGNED_TYPE delta) const |
| | Addition operator for adding numeric value to sequence number.
|
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator++ () |
| | Prefix increment operator.
|
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator++ (int) |
| | Postfix increment operator.
|
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > & | operator+= (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &)=delete |
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > & | operator+= (SIGNED_TYPE value) |
| | Plus equals operator.
|
| int64_t | operator- (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &other) const |
| | Subtraction operator for subtracting a sequence number from another sequence number.
|
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator- (SIGNED_TYPE delta) const |
| | Subtraction operator for subtracting numeric value from sequence number.
|
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator-- () |
| | Prefix decrement operator.
|
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator-- (int) |
| | Postfix decrement operator.
|
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > & | operator-= (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &)=delete |
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > & | operator-= (SIGNED_TYPE value) |
| | Minus equals operator.
|
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator/ (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete |
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator<< (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete |
| constexpr std::strong_ordering | operator<=> (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &other) const |
| | Spaceship comparison operator.
|
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > & | operator= (NUMERIC_TYPE value) |
| | Constructs a SequenceNumber from an assignment of given value.
|
| constexpr bool | operator== (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &other) const |
| | Equality operator for comparing sequence number.
|
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator>> (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete |
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator^ (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete |
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator| (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete |
| bool | operator|| (const SequenceNumber< NUMERIC_TYPE, NUM_BITS > &) const =delete |
| SequenceNumber< NUMERIC_TYPE, NUM_BITS > | operator~ () const =delete |
template<typename NUMERIC_TYPE, uint8_t NUM_BITS = std::numeric_limits<NUMERIC_TYPE>::digits>
requires std::unsigned_integral<std::remove_cv_t<NUMERIC_TYPE>> && (NUM_BITS < 64) && (NUM_BITS <= std::numeric_limits<NUMERIC_TYPE>::digits)
class ns3::SequenceNumber< NUMERIC_TYPE, NUM_BITS >
Generic "sequence number" class.
This class can be used to handle sequence numbers. In networking protocols, sequence numbers are fixed precision integer numbers that are used to order events relative to each other. A sequence number is expected to increase over time but, since it has a limited number of bits, the number will "wrap around" from the maximum value that can represented with the given number of bits back to zero. For this reason, comparison of two sequence numbers, and subtraction, is non-trivial. The SequenceNumber class behaves like a number, with the usual arithmetic operators implemented, but knows how to correctly compare and subtract sequence numbers.
Sequence number operations are defined in RFC 1982. However, the RFC leaves as implementation-dependent the case of two sequence numbers whose difference is equal to half of the possible range (e.g., 0 and 128 for a 8-bit sequence number). RFC 3626 (OLSR) fixes this ambiguity by defining the relationship. This implementation follows the RFC 3626 definition. Hence, in this example, 128 is less than 0.
The relationship table for a 4-bit sequence number is the following:
- 4-bit sequence number value 0 = 0
- 4-bit sequence number value 1 > 0
- 4-bit sequence number value 2 > 0
- 4-bit sequence number value 3 > 0
- 4-bit sequence number value 4 > 0
- 4-bit sequence number value 5 > 0
- 4-bit sequence number value 6 > 0
- 4-bit sequence number value 7 > 0
- 4-bit sequence number value 8 < 0
- 4-bit sequence number value 9 < 0
- 4-bit sequence number value 10 < 0
- 4-bit sequence number value 11 < 0
- 4-bit sequence number value 12 < 0
- 4-bit sequence number value 13 < 0
- 4-bit sequence number value 14 < 0
- 4-bit sequence number value 15 < 0
This is a templated class. To use it you need to supply one fundamental type as a template parameter: NUMERIC_TYPE. The second parameter NUM_BITS is optional, and represents the number of bits used in the SequenceNumber. It must be equal or less than the number of available bits in the NUMERIC_TYPE.
For instance, SequenceNumber<uint32_t> gives you a 32-bit sequence number, while SequenceNumber<uint16_t, 10> is a 10-bit one.
For your convenience, SequenceNumber32, SequenceNumber16, and SequenceNumber8 are defined as typedefs.
You can safely assign a value to a sequence number, provided that it is in the allowed range. E.g, the following code will raise an assert:
Sequence numbers can be printed, but they can not be automatically converted to an integer type. Furthermore, the conversion from an integer type must be explicit, e.g., it is not possible to compare a sequence number and an integer:
seqNum2 = 2;
std::cout << "seqNum1 < seqNum2? " << std::boolalpha << (seqNum1 < seqNum2) << "\n";
Generic "sequence number" class.
The above limitation is to avoid mistakes, since integers and sequence numbers have very different comparison rules.
- Note
- Due to the internal representation and the semantics of operator - between two sequence numbers, SequenceNumber<uint64_t> are disallowed.
Definition at line 113 of file sequence-number.h.