package net.i2p.router.tunnel; import net.i2p.data.Hash; import net.i2p.data.TunnelId; import net.i2p.data.i2np.*; import net.i2p.router.util.CDPQEntry; /** * Stores all the state for an unsent or partially-sent message * * @since 0.9.3 */ class OutboundGatewayMessage extends PendingGatewayMessage implements CDPQEntry { private long _seqNum; private final int _priority; public OutboundGatewayMessage(I2NPMessage message, Hash toRouter, TunnelId toTunnel) { super(message, toRouter, toTunnel); _priority = getPriority(message); } /** * For CDPQ */ public void setSeqNum(long num) { _seqNum = num; } /** * For CDPQ */ public long getSeqNum() { return _seqNum; } /** * For CDPQ */ public int getPriority() { return _priority; } /** * This is just for priority in the queue waiting for the fragmenter. * After the fragmenter, they will be OutNetMessages with priority 400. * We use the same 100-500 priority as OutNetMessage so the stats * in CoDelPriorityBlockingQueue work. * * We could - perhaps - have BatchedPreprocessor pass the max priority of * any message fragment in a TunnelDataMessage to the OutboundReceiver, to * set the OutNetMessage priority - but that may just make more of an * out-of-order mess and failed reconstruction of fragments. */ private static int getPriority(I2NPMessage message) { switch (message.getType()) { // tagset/LS reply case DeliveryStatusMessage.MESSAGE_TYPE: return 1000; // building new IB tunnel case TunnelBuildMessage.MESSAGE_TYPE: case VariableTunnelBuildMessage.MESSAGE_TYPE: return 500; // LS store case DatabaseStoreMessage.MESSAGE_TYPE: return 400; // LS verify case DatabaseLookupMessage.MESSAGE_TYPE: return 300; // regular data case GarlicMessage.MESSAGE_TYPE: return 200; // these shouldn't go into a OBGW case DatabaseSearchReplyMessage.MESSAGE_TYPE: case DataMessage.MESSAGE_TYPE: case TunnelBuildReplyMessage.MESSAGE_TYPE: case TunnelDataMessage.MESSAGE_TYPE: case TunnelGatewayMessage.MESSAGE_TYPE: case VariableTunnelBuildReplyMessage.MESSAGE_TYPE: default: return 100; } } }