/* removing all acknowledged entries from ack */ bool reliable_ack_write(struct reliable_ack *ack, struct buffer *buf, const struct session_id *sid, int max, bool prepend) { int i, j; uint8_t n; struct buffer sub; n = ack->len; if (n > max) { n = max; } sub = buf_sub(buf, ACK_SIZE(n), prepend); if (!BDEF(&sub)) { goto error; } ASSERT(buf_write(&sub, &n, sizeof(n))); for (i = 0; i < n; ++i) { packet_id_type pid = ack->packet_id[i]; packet_id_type net_pid = htonpid(pid); ASSERT(buf_write(&sub, &net_pid, sizeof(net_pid))); dmsg(D_REL_DEBUG, "ACK write ID " packet_id_format " (ack->len=%d, n=%d)", (packet_id_print_type)pid, ack->len, n); } if (n) { ASSERT(session_id_defined(sid)); ASSERT(session_id_write(sid, &sub)); for (i = 0, j = n; j < ack->len; ) ack->packet_id[i++] = ack->packet_id[j++]; ack->len = i; } return true; error: return false; }
/* add to extra_frame the maximum number of bytes we will need for reliable_ack_write */ void reliable_ack_adjust_frame_parameters (struct frame* frame, int max) { frame_add_to_extra_frame (frame, ACK_SIZE (max)); }