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