Lines Matching refs:av
22 struct dccp_ackvec *av = kmem_cache_zalloc(dccp_ackvec_slab, priority); in dccp_ackvec_alloc() local
24 if (av != NULL) { in dccp_ackvec_alloc()
25 av->av_buf_head = av->av_buf_tail = DCCPAV_MAX_ACKVEC_LEN - 1; in dccp_ackvec_alloc()
26 INIT_LIST_HEAD(&av->av_records); in dccp_ackvec_alloc()
28 return av; in dccp_ackvec_alloc()
31 static void dccp_ackvec_purge_records(struct dccp_ackvec *av) in dccp_ackvec_purge_records() argument
35 list_for_each_entry_safe(cur, next, &av->av_records, avr_node) in dccp_ackvec_purge_records()
37 INIT_LIST_HEAD(&av->av_records); in dccp_ackvec_purge_records()
40 void dccp_ackvec_free(struct dccp_ackvec *av) in dccp_ackvec_free() argument
42 if (likely(av != NULL)) { in dccp_ackvec_free()
43 dccp_ackvec_purge_records(av); in dccp_ackvec_free()
44 kmem_cache_free(dccp_ackvec_slab, av); in dccp_ackvec_free()
54 int dccp_ackvec_update_records(struct dccp_ackvec *av, u64 seqno, u8 nonce_sum) in dccp_ackvec_update_records() argument
63 avr->avr_ack_ptr = av->av_buf_head; in dccp_ackvec_update_records()
64 avr->avr_ack_ackno = av->av_buf_ackno; in dccp_ackvec_update_records()
66 avr->avr_ack_runlen = dccp_ackvec_runlen(av->av_buf + av->av_buf_head); in dccp_ackvec_update_records()
73 if (av->av_overflow) in dccp_ackvec_update_records()
74 dccp_ackvec_purge_records(av); in dccp_ackvec_update_records()
79 list_add(&avr->avr_node, &av->av_records); in dccp_ackvec_update_records()
120 u16 dccp_ackvec_buflen(const struct dccp_ackvec *av) in dccp_ackvec_buflen() argument
122 if (unlikely(av->av_overflow)) in dccp_ackvec_buflen()
124 return __ackvec_idx_sub(av->av_buf_tail, av->av_buf_head); in dccp_ackvec_buflen()
134 static void dccp_ackvec_update_old(struct dccp_ackvec *av, s64 distance, in dccp_ackvec_update_old() argument
137 u16 ptr = av->av_buf_head; in dccp_ackvec_update_old()
140 if (unlikely(dccp_ackvec_is_empty(av))) in dccp_ackvec_update_old()
144 u8 runlen = dccp_ackvec_runlen(av->av_buf + ptr); in dccp_ackvec_update_old()
162 if (av->av_buf[ptr] == DCCPAV_NOT_RECEIVED) in dccp_ackvec_update_old()
163 av->av_buf[ptr] = state; in dccp_ackvec_update_old()
173 } while (ptr != av->av_buf_tail); in dccp_ackvec_update_old()
177 static void dccp_ackvec_reserve_seats(struct dccp_ackvec *av, u16 num) in dccp_ackvec_reserve_seats() argument
179 u16 start = __ackvec_idx_add(av->av_buf_head, 1), in dccp_ackvec_reserve_seats()
184 memset(av->av_buf + start, DCCPAV_NOT_RECEIVED, len); in dccp_ackvec_reserve_seats()
189 memset(av->av_buf + start, DCCPAV_NOT_RECEIVED, num); in dccp_ackvec_reserve_seats()
199 static void dccp_ackvec_add_new(struct dccp_ackvec *av, u32 num_packets, in dccp_ackvec_add_new() argument
223 av->av_buf_head = __ackvec_idx_sub(av->av_buf_head, 1); in dccp_ackvec_add_new()
224 av->av_buf[av->av_buf_head] = DCCPAV_NOT_RECEIVED | len; in dccp_ackvec_add_new()
230 if (num_cells + dccp_ackvec_buflen(av) >= DCCPAV_MAX_ACKVEC_LEN) { in dccp_ackvec_add_new()
232 av->av_overflow = true; in dccp_ackvec_add_new()
235 av->av_buf_head = __ackvec_idx_sub(av->av_buf_head, num_packets); in dccp_ackvec_add_new()
236 if (av->av_overflow) in dccp_ackvec_add_new()
237 av->av_buf_tail = av->av_buf_head; in dccp_ackvec_add_new()
239 av->av_buf[av->av_buf_head] = state; in dccp_ackvec_add_new()
240 av->av_buf_ackno = seqno; in dccp_ackvec_add_new()
243 dccp_ackvec_reserve_seats(av, num_packets - 1); in dccp_ackvec_add_new()
249 void dccp_ackvec_input(struct dccp_ackvec *av, struct sk_buff *skb) in dccp_ackvec_input() argument
254 if (dccp_ackvec_is_empty(av)) { in dccp_ackvec_input()
255 dccp_ackvec_add_new(av, 1, seqno, state); in dccp_ackvec_input()
256 av->av_tail_ackno = seqno; in dccp_ackvec_input()
259 s64 num_packets = dccp_delta_seqno(av->av_buf_ackno, seqno); in dccp_ackvec_input()
260 u8 *current_head = av->av_buf + av->av_buf_head; in dccp_ackvec_input()
267 av->av_buf_ackno = seqno; in dccp_ackvec_input()
270 dccp_ackvec_add_new(av, num_packets, seqno, state); in dccp_ackvec_input()
272 dccp_ackvec_update_old(av, num_packets, seqno, state); in dccp_ackvec_input()
285 void dccp_ackvec_clear_state(struct dccp_ackvec *av, const u64 ackno) in dccp_ackvec_clear_state() argument
291 avr = dccp_ackvec_lookup(&av->av_records, ackno); in dccp_ackvec_clear_state()
299 delta = dccp_delta_seqno(av->av_tail_ackno, avr->avr_ack_ackno); in dccp_ackvec_clear_state()
308 runlen_now = dccp_ackvec_runlen(av->av_buf + avr->avr_ack_ptr); in dccp_ackvec_clear_state()
318 av->av_buf[avr->avr_ack_ptr] -= eff_runlen + 1; in dccp_ackvec_clear_state()
319 av->av_buf_tail = __ackvec_idx_add(avr->avr_ack_ptr, 1); in dccp_ackvec_clear_state()
322 if (av->av_overflow) in dccp_ackvec_clear_state()
323 av->av_overflow = (av->av_buf_head == av->av_buf_tail); in dccp_ackvec_clear_state()
325 av->av_buf_tail = avr->avr_ack_ptr; in dccp_ackvec_clear_state()
331 av->av_overflow = 0; in dccp_ackvec_clear_state()
338 av->av_tail_ackno = ADD48(avr->avr_ack_ackno, 1); in dccp_ackvec_clear_state()
341 list_for_each_entry_safe_from(avr, next, &av->av_records, avr_node) { in dccp_ackvec_clear_state()