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();
 }