2 import java.nio.ByteBuffer;
3 import java.util.HashSet;
6 * Entry for tracking messages that the server rejected. We have to
7 * make sure that all clients know that this message was rejected to
8 * prevent the server from reusing these messages in an attack.
14 class RejectedMessage extends Entry {
16 private long sequencenum;
19 /* Machine identifier */
20 private long machineid;
21 /* Oldest sequence number in range */
22 private long oldseqnum;
23 /* Newest sequence number in range */
24 private long newseqnum;
25 /* Is the machine identifier of the relevant slots equal to (or not
26 * equal to) the specified machine identifier. */
27 private boolean equalto;
28 /* Set of machines that have not received notification. */
29 private HashSet<Long> watchset;
31 RejectedMessage(Slot slot, long _sequencenum, long _machineid, long _oldseqnum, long _newseqnum, boolean _equalto) {
33 sequencenum = _sequencenum;
57 long getSequenceNumber() {
61 static Entry decode(Slot slot, ByteBuffer bb) {
62 long sequencenum=bb.getLong();
63 long machineid=bb.getLong();
64 long oldseqnum=bb.getLong();
65 long newseqnum=bb.getLong();
66 byte equalto=bb.get();
67 return new RejectedMessage(slot,sequencenum, machineid, oldseqnum, newseqnum, equalto==1);
70 void setWatchSet(HashSet<Long> _watchset) {
74 void removeWatcher(long machineid) {
75 if (watchset.remove(machineid))
76 if (watchset.isEmpty())
80 void encode(ByteBuffer bb) {
81 bb.put(Entry.TypeRejectedMessage);
82 bb.putLong(sequencenum);
83 bb.putLong(machineid);
84 bb.putLong(oldseqnum);
85 bb.putLong(newseqnum);
86 bb.put(equalto?(byte)1:(byte)0);
90 return 4*Long.BYTES + 2*Byte.BYTES;
94 return Entry.TypeRejectedMessage;
97 Entry getCopy(Slot s) {
98 return new RejectedMessage(s,sequencenum, machineid, oldseqnum, newseqnum, equalto);