package com.netifera.platform.net.packets.tcpip; public class TCPSequenceNumber implements Comparable<TCPSequenceNumber> { private final int value; public TCPSequenceNumber(int value) { this.value = value; } public int toInteger() { return value; } @Override public int hashCode() { return value; } @Override public boolean equals(Object o) { if (o instanceof TCPSequenceNumber) { return value == ((TCPSequenceNumber) o).value; } return false; } /** * Return true if this sequence number is greater than the * sequence number specified as an argument. * * @param another Sequence number to compare. * @return True if this sequence number is greater than argument. */ public boolean greater(TCPSequenceNumber another) { return compareTo(another) > 0; } /** * Return true if this sequence number is less than the * sequence number specified as an argument. * * @param another Sequence number to compare. * @return True if this sequence number is less than argument. */ public boolean less(TCPSequenceNumber another) { return compareTo(another) < 0; } public boolean greaterOrEqual(TCPSequenceNumber another) { return compareTo(another) >= 0; } public boolean lessOrEqual(TCPSequenceNumber another) { return compareTo(another) <= 0; } public int compareTo(TCPSequenceNumber another) { return (-distance(this.value, another.value)); } public int distanceTo(TCPSequenceNumber another) { return (distance(this.value, another.value)); } private int distance(int a, int b) { /* if the values sign is different then add 2**30 to both, add nothing otherwise*/ int shift = ((a >> 1 & 0x40000000)) ^ ((b >> 1 & 0x40000000)); return (b + shift) - (a + shift); } public TCPSequenceNumber add(int n) { return new TCPSequenceNumber(value + n); } public TCPSequenceNumber next() { return add(1); } public TCPSequenceNumber previous() { return add(-1); } @Override public String toString() { return Long.toString(value & 0xffffffffL); } }