3 * Entry for tracking messages that the server rejected. We have to
4 * make sure that all clients know that this message was rejected to
5 * prevent the server from reusing these messages in an attack.
11 class RejectedMessage extends Entry {
13 private int64_t sequencenum;
16 /* Machine identifier */
17 private int64_t machineid;
18 /* Oldest sequence number in range */
19 private int64_t oldseqnum;
20 /* Newest sequence number in range */
21 private int64_t newseqnum;
22 /* Is the machine identifier of the relevant slots equal to (or not
23 * equal to) the specified machine identifier. */
25 /* Set of machines that have not received notification. */
26 private HashSet<Long> watchset;
28 RejectedMessage(Slot slot, int64_t _sequencenum, int64_t _machineid, int64_t _oldseqnum, int64_t _newseqnum, bool _equalto) {
30 sequencenum = _sequencenum;
37 int64_t getOldSeqNum() {
41 int64_t getNewSeqNum() {
49 int64_t getMachineID() {
54 int64_t getSequenceNumber() {
58 static Entry decode(Slot slot, ByteBuffer bb) {
59 int64_t sequencenum=bb.getLong();
60 int64_t machineid=bb.getLong();
61 int64_t oldseqnum=bb.getLong();
62 int64_t newseqnum=bb.getLong();
63 char equalto=bb.get();
64 return new RejectedMessage(slot,sequencenum, machineid, oldseqnum, newseqnum, equalto==1);
67 void setWatchSet(HashSet<Long> _watchset) {
71 void removeWatcher(int64_t machineid) {
72 if (watchset.remove(machineid))
73 if (watchset.isEmpty())
77 void encode(ByteBuffer bb) {
78 bb.put(Entry.TypeRejectedMessage);
79 bb.putLong(sequencenum);
80 bb.putLong(machineid);
81 bb.putLong(oldseqnum);
82 bb.putLong(newseqnum);
83 bb.put(equalto?(char)1:(char)0);
87 return 4*sizeof(int64_t) + 2*sizeof(char);
91 return Entry.TypeRejectedMessage;
94 Entry getCopy(Slot s) {
95 return new RejectedMessage(s,sequencenum, machineid, oldseqnum, newseqnum, equalto);