public void toByteBuffer(ByteBuffer buf) { // Source Port buf.put((byte) ((sourceEP.getEonPort() & 0xFF00) >> 8)); buf.put((byte) (sourceEP.getEonPort() & 0xFF)); // Destination Port buf.put((byte) ((destEP.getEonPort() & 0xFF00) >> 8)); buf.put((byte) (destEP.getEonPort() & 0xFF)); // Protocol buf.put((byte) 0x2); // S-EON is protocol 2 // Flags int flagsAndSack = 0; if (ack) flagsAndSack += 0x80; if (rst) flagsAndSack += 0x40; if (syn) flagsAndSack += 0x20; if (fin) flagsAndSack += 0x10; // Number of sack regions goes in bits 4-5 of byte 5 int numSackRegions = (sackBegins == null) ? 0 : sackBegins.length; if (numSackRegions > MAX_SACK_BLOCKS) numSackRegions = MAX_SACK_BLOCKS; if (numSackRegions > 0) flagsAndSack += ((numSackRegions & 0x3) << 2); buf.put((byte) flagsAndSack); // Sequence Number buf.put((byte) ((seqNum >> 24) & 0xFF)); buf.put((byte) ((seqNum >> 16) & 0xFF)); buf.put((byte) ((seqNum >> 8) & 0xFF)); buf.put((byte) ((seqNum) & 0xFF)); // Ack Number buf.put((byte) ((ackNum >> 24) & 0xFF)); buf.put((byte) ((ackNum >> 16) & 0xFF)); buf.put((byte) ((ackNum >> 8) & 0xFF)); buf.put((byte) ((ackNum) & 0xFF)); // Sack blocks for (int i = 0; i < numSackRegions; i++) { long begin = sackBegins[i]; buf.put((byte) ((begin >> 24) & 0xFF)); buf.put((byte) ((begin >> 16) & 0xFF)); buf.put((byte) ((begin >> 8) & 0xFF)); buf.put((byte) ((begin) & 0xFF)); long end = sackEnds[i]; buf.put((byte) ((end >> 24) & 0xFF)); buf.put((byte) ((end >> 16) & 0xFF)); buf.put((byte) ((end >> 8) & 0xFF)); buf.put((byte) ((end) & 0xFF)); } // Packet payload if (payload != null) { payload.position(0); buf.put(payload); } }
public String toString() { StringBuffer sb = new StringBuffer(); sb.append("SEONPacket: "); sb.append("Source ") .append(sourceEP.toString()) .append(", Dest ") .append(destEP.toString()) .append(" "); sb.append("SN ") .append(String.valueOf(seqNum)) .append(" AN ") .append(String.valueOf(ackNum)) .append(" "); if (isSYN()) { sb.append("SYN "); } if (isACK()) { sb.append("ACK "); } if (isRST()) { sb.append("RST "); } if (isFIN()) { sb.append("FIN "); } if (payload != null && payload.limit() > 0) { sb.append(payload.limit()).append(" bytes data"); } else { sb.append("no data"); } if (sackBegins != null && sackBegins.length > 0) { sb.append(" SACK["); for (int i = 0; i < sackBegins.length; i++) { if (i > 0) sb.append(":"); sb.append(sackBegins[i]).append(",").append(sackEnds[i]); } sb.append("]"); } return sb.toString(); }