package iotcloud;
import java.nio.ByteBuffer;
+import java.util.HashSet;
+
+/**
+ * Entry for tracking messages that the server rejected. We have to
+ * make sure that all clients know that this message was rejected to
+ * prevent the server from reusing these messages in an attack.
+ * @author Brian Demsky
+ * @version 1.0
+ */
+
class RejectedMessage extends Entry {
+ /* Machine identifier */
private long machineid;
- private long oldseqnum; //Oldest seqnum in range
- private long newseqnum; //Newest seqnum in range (inclusive)
- private boolean equalto; //Is message sent or not sent by machineid
+ /* Oldest sequence number in range */
+ private long oldseqnum;
+ /* Newest sequence number in range */
+ private long newseqnum;
+ /* Is the machine identifier of the relevant slots equal to (or not
+ * equal to) the specified machine identifier. */
+ private boolean equalto;
+ /* Set of machines that have not received notification. */
+ private HashSet<Long> watchset;
RejectedMessage(Slot slot, long _machineid, long _oldseqnum, long _newseqnum, boolean _equalto) {
super(slot);
return new RejectedMessage(slot, machineid, oldseqnum, newseqnum, equalto==1);
}
+ void setWatchSet(HashSet<Long> _watchset) {
+ watchset=_watchset;
+ }
+
+ void removeWatcher(long machineid) {
+ if (watchset.remove(machineid))
+ if (watchset.isEmpty())
+ setDead();
+ }
+
void encode(ByteBuffer bb) {
bb.put(Entry.TypeRejectedMessage);
bb.putLong(machineid);
byte getType() {
return Entry.TypeRejectedMessage;
}
+
+ Entry getCopy(Slot s) {
+ return new RejectedMessage(s, machineid, oldseqnum, newseqnum, equalto);
+ }
}