public void up(MessageBatch batch) {
   for (Message msg : batch) {
     NakAckHeader2 hdr = (NakAckHeader2) msg.getHeader(ID);
     if (hdr != null && hdr.getType() == NakAckHeader2.MSG) {
       long seqno = hdr.getSeqno();
       msgs.add(seqno);
       System.out.println("-- received message #" + seqno + " from " + msg.getSrc());
     }
   }
 }
 public Object up(Event evt) {
   switch (evt.getType()) {
     case Event.MSG:
       Message msg = (Message) evt.getArg();
       NakAckHeader2 hdr = (NakAckHeader2) msg.getHeader(ID);
       if (hdr != null && hdr.getType() == NakAckHeader2.MSG) {
         long seqno = hdr.getSeqno();
         msgs.add(seqno);
         System.out.println("-- received message #" + seqno + " from " + msg.getSrc());
       }
       break;
   }
   return null;
 }
 public Object down(Event evt) {
   switch (evt.getType()) {
     case Event.MSG:
       Message msg = (Message) evt.getArg();
       NakAckHeader2 hdr = (NakAckHeader2) msg.getHeader(ID);
       if (hdr == null) break;
       if (hdr.getType() == NakAckHeader2.XMIT_REQ) {
         SeqnoList seqnos = (SeqnoList) msg.getObject();
         System.out.println("-- XMIT-REQ: request retransmission for " + seqnos);
         for (Long seqno : seqnos) xmit_requests.add(seqno);
       }
       break;
   }
   return null;
 }
 /** Makes NAKACK2 receive a message with the given seqno */
 protected void injectMessage(long seqno) {
   Message msg = new Message(null, B, null);
   NakAckHeader2 hdr = NakAckHeader2.createMessageHeader(seqno);
   msg.putHeader(ID, hdr);
   nak.up(new Event(Event.MSG, msg));
 }