[Click] Implementing a packet cache for selective ACKs and ReTx

Ashish Sharma ashishs.sharma at gmail.com
Wed Oct 28 06:08:13 EDT 2009


Hi,

I am trying to implement a bulk acknowledgement scheme with selective
retransmits for wireless. I have implemented a TDMA based MAC for wireless
wherein a node sends multiple packets during its slot. Instead of per-packet
802.11 acks, I am trying to implement a piggy-backed bulk ACK scheme where
the recipient responds with a bitmap of the received packets that it is
trying to acknowledge. For this I have implemented my own sequence number
management in a separate header.

The issue is, that after I assign it my custom sequence number, I need to
create a copy of the packet along with all the headers and data so that it
can be retransmitted at a later time if it is not ACKed by the recipient.

My question is how do I do this, since Packet::clone shares the data with
the original packet (which is killed after being send to ToDevice ?) and
with Packet::uniqueify() I can only create one copy? Documentation in
packet.cc mentions that

Packet *p = ...;
if (WritablePacket *q = p->uniqueify()) {
            Packet *p2 = q->clone();
            assert(p2);
}
is buggy and WritablePacket::clone() is discouraged.

My function looks something like this:

Packet * BulkAckManager::handle_outgoing_pkt(Packet *p,..) {
 WritablePacket *p_out = p->uniqueify();
     if (p_out) {
             // Put sequence number in p_out->bulk_ack_hdr;
            * WritablePacket *q_copy = p_out->clone();   *or *
p_out->uniqueify()*or *p->uniqueify(*);
            insert_in_cache(seq_num, q_copy);
            return p_out;
     }
  }

Packet * BulkAckManager::Retransmit(seq_num) {
  Packet* p_retx = fetch_from_cache(seq_num);
  return p_retx;
}

I have tried p_out->clone(), p_out->uniqueify and p->uniqueify  and each
time I get a Seg Fault when trying to retransmit this packet at a later
stage.

I will be grateful for any suggestions. Thanks for your time.

Ashish

P.S. : I looked at snooptcp.cc  and it also maintains a packet cache,
however I believe it never modifies the packets, so
WritablePacket->uniqueify followed by another copy is not required there.


More information about the click mailing list