Lines Matching refs:av

19 	struct dccp_ackvec *av = kmem_cache_zalloc(dccp_ackvec_slab, priority);
21 if (av != NULL) {
22 av->av_buf_head = av->av_buf_tail = DCCPAV_MAX_ACKVEC_LEN - 1;
23 INIT_LIST_HEAD(&av->av_records);
25 return av;
28 static void dccp_ackvec_purge_records(struct dccp_ackvec *av)
32 list_for_each_entry_safe(cur, next, &av->av_records, avr_node)
34 INIT_LIST_HEAD(&av->av_records);
37 void dccp_ackvec_free(struct dccp_ackvec *av)
39 if (likely(av != NULL)) {
40 dccp_ackvec_purge_records(av);
41 kmem_cache_free(dccp_ackvec_slab, av);
47 * @av: Ack Vector records to update
51 int dccp_ackvec_update_records(struct dccp_ackvec *av, u64 seqno, u8 nonce_sum)
60 avr->avr_ack_ptr = av->av_buf_head;
61 avr->avr_ack_ackno = av->av_buf_ackno;
63 avr->avr_ack_runlen = dccp_ackvec_runlen(av->av_buf + av->av_buf_head);
70 if (av->av_overflow)
71 dccp_ackvec_purge_records(av);
76 list_add(&avr->avr_node, &av->av_records);
117 u16 dccp_ackvec_buflen(const struct dccp_ackvec *av)
119 if (unlikely(av->av_overflow))
121 return __ackvec_idx_sub(av->av_buf_tail, av->av_buf_head);
126 * @av: non-empty buffer to update
131 static void dccp_ackvec_update_old(struct dccp_ackvec *av, s64 distance,
134 u16 ptr = av->av_buf_head;
137 if (unlikely(dccp_ackvec_is_empty(av)))
141 u8 runlen = dccp_ackvec_runlen(av->av_buf + ptr);
159 if (av->av_buf[ptr] == DCCPAV_NOT_RECEIVED)
160 av->av_buf[ptr] = state;
170 } while (ptr != av->av_buf_tail);
174 static void dccp_ackvec_reserve_seats(struct dccp_ackvec *av, u16 num)
176 u16 start = __ackvec_idx_add(av->av_buf_head, 1),
181 memset(av->av_buf + start, DCCPAV_NOT_RECEIVED, len);
186 memset(av->av_buf + start, DCCPAV_NOT_RECEIVED, num);
191 * @av: container of buffer to update (can be empty or non-empty)
196 static void dccp_ackvec_add_new(struct dccp_ackvec *av, u32 num_packets,
220 av->av_buf_head = __ackvec_idx_sub(av->av_buf_head, 1);
221 av->av_buf[av->av_buf_head] = DCCPAV_NOT_RECEIVED | len;
227 if (num_cells + dccp_ackvec_buflen(av) >= DCCPAV_MAX_ACKVEC_LEN) {
229 av->av_overflow = true;
232 av->av_buf_head = __ackvec_idx_sub(av->av_buf_head, num_packets);
233 if (av->av_overflow)
234 av->av_buf_tail = av->av_buf_head;
236 av->av_buf[av->av_buf_head] = state;
237 av->av_buf_ackno = seqno;
240 dccp_ackvec_reserve_seats(av, num_packets - 1);
245 * @av: Ack Vector to register packet to
248 void dccp_ackvec_input(struct dccp_ackvec *av, struct sk_buff *skb)
253 if (dccp_ackvec_is_empty(av)) {
254 dccp_ackvec_add_new(av, 1, seqno, state);
255 av->av_tail_ackno = seqno;
258 s64 num_packets = dccp_delta_seqno(av->av_buf_ackno, seqno);
259 u8 *current_head = av->av_buf + av->av_buf_head;
266 av->av_buf_ackno = seqno;
269 dccp_ackvec_add_new(av, num_packets, seqno, state);
271 dccp_ackvec_update_old(av, num_packets, seqno, state);
278 * @av: Ack Vector record to clean
287 void dccp_ackvec_clear_state(struct dccp_ackvec *av, const u64 ackno)
293 avr = dccp_ackvec_lookup(&av->av_records, ackno);
301 delta = dccp_delta_seqno(av->av_tail_ackno, avr->avr_ack_ackno);
310 runlen_now = dccp_ackvec_runlen(av->av_buf + avr->avr_ack_ptr);
320 av->av_buf[avr->avr_ack_ptr] -= eff_runlen + 1;
321 av->av_buf_tail = __ackvec_idx_add(avr->avr_ack_ptr, 1);
324 if (av->av_overflow)
325 av->av_overflow = (av->av_buf_head == av->av_buf_tail);
327 av->av_buf_tail = avr->avr_ack_ptr;
333 av->av_overflow = 0;
340 av->av_tail_ackno = ADD48(avr->avr_ack_ackno, 1);
343 list_for_each_entry_safe_from(avr, next, &av->av_records, avr_node) {