Lines Matching refs:tp_vars
142 static void batadv_tp_update_cwnd(struct batadv_tp_vars *tp_vars, u32 mss) in batadv_tp_update_cwnd() argument
144 spin_lock_bh(&tp_vars->cwnd_lock); in batadv_tp_update_cwnd()
147 if (tp_vars->cwnd <= tp_vars->ss_threshold) { in batadv_tp_update_cwnd()
148 tp_vars->dec_cwnd = 0; in batadv_tp_update_cwnd()
149 tp_vars->cwnd = batadv_tp_cwnd(tp_vars->cwnd, mss, mss); in batadv_tp_update_cwnd()
150 spin_unlock_bh(&tp_vars->cwnd_lock); in batadv_tp_update_cwnd()
155 tp_vars->dec_cwnd += max_t(u32, 1U << 3, in batadv_tp_update_cwnd()
156 ((mss * mss) << 6) / (tp_vars->cwnd << 3)); in batadv_tp_update_cwnd()
157 if (tp_vars->dec_cwnd < (mss << 3)) { in batadv_tp_update_cwnd()
158 spin_unlock_bh(&tp_vars->cwnd_lock); in batadv_tp_update_cwnd()
162 tp_vars->cwnd = batadv_tp_cwnd(tp_vars->cwnd, mss, mss); in batadv_tp_update_cwnd()
163 tp_vars->dec_cwnd = 0; in batadv_tp_update_cwnd()
165 spin_unlock_bh(&tp_vars->cwnd_lock); in batadv_tp_update_cwnd()
173 static void batadv_tp_update_rto(struct batadv_tp_vars *tp_vars, in batadv_tp_update_rto() argument
184 if (tp_vars->srtt != 0) { in batadv_tp_update_rto()
185 m -= (tp_vars->srtt >> 3); /* m is now error in rtt est */ in batadv_tp_update_rto()
186 tp_vars->srtt += m; /* rtt = 7/8 srtt + 1/8 new */ in batadv_tp_update_rto()
190 m -= (tp_vars->rttvar >> 2); in batadv_tp_update_rto()
191 tp_vars->rttvar += m; /* mdev ~= 3/4 rttvar + 1/4 new */ in batadv_tp_update_rto()
194 tp_vars->srtt = m << 3; /* take the measured time to be srtt */ in batadv_tp_update_rto()
195 tp_vars->rttvar = m << 1; /* new_rtt / 2 */ in batadv_tp_update_rto()
201 tp_vars->rto = (tp_vars->srtt >> 3) + tp_vars->rttvar; in batadv_tp_update_rto()
264 struct batadv_tp_vars *pos, *tp_vars = NULL; in batadv_tp_list_find() local
278 tp_vars = pos; in batadv_tp_list_find()
283 return tp_vars; in batadv_tp_list_find()
303 struct batadv_tp_vars *pos, *tp_vars = NULL; in batadv_tp_list_find_session() local
320 tp_vars = pos; in batadv_tp_list_find_session()
325 return tp_vars; in batadv_tp_list_find_session()
335 struct batadv_tp_vars *tp_vars; in batadv_tp_vars_release() local
338 tp_vars = container_of(ref, struct batadv_tp_vars, refcount); in batadv_tp_vars_release()
343 spin_lock_bh(&tp_vars->unacked_lock); in batadv_tp_vars_release()
344 list_for_each_entry_safe(un, safe, &tp_vars->unacked_list, list) { in batadv_tp_vars_release()
348 spin_unlock_bh(&tp_vars->unacked_lock); in batadv_tp_vars_release()
350 kfree_rcu(tp_vars, rcu); in batadv_tp_vars_release()
358 static void batadv_tp_vars_put(struct batadv_tp_vars *tp_vars) in batadv_tp_vars_put() argument
360 kref_put(&tp_vars->refcount, batadv_tp_vars_release); in batadv_tp_vars_put()
369 struct batadv_tp_vars *tp_vars) in batadv_tp_sender_cleanup() argument
371 cancel_delayed_work(&tp_vars->finish_work); in batadv_tp_sender_cleanup()
373 spin_lock_bh(&tp_vars->bat_priv->tp_list_lock); in batadv_tp_sender_cleanup()
374 hlist_del_rcu(&tp_vars->list); in batadv_tp_sender_cleanup()
375 spin_unlock_bh(&tp_vars->bat_priv->tp_list_lock); in batadv_tp_sender_cleanup()
378 batadv_tp_vars_put(tp_vars); in batadv_tp_sender_cleanup()
380 atomic_dec(&tp_vars->bat_priv->tp_num); in batadv_tp_sender_cleanup()
383 del_timer_sync(&tp_vars->timer); in batadv_tp_sender_cleanup()
389 del_timer(&tp_vars->timer); in batadv_tp_sender_cleanup()
390 batadv_tp_vars_put(tp_vars); in batadv_tp_sender_cleanup()
399 struct batadv_tp_vars *tp_vars) in batadv_tp_sender_end() argument
405 tp_vars->other_end, tp_vars->reason); in batadv_tp_sender_end()
409 tp_vars->srtt >> 3, tp_vars->rttvar >> 2, tp_vars->rto); in batadv_tp_sender_end()
413 tp_vars->cwnd, tp_vars->ss_threshold); in batadv_tp_sender_end()
415 session_cookie = batadv_tp_session_cookie(tp_vars->session, in batadv_tp_sender_end()
416 tp_vars->icmp_uid); in batadv_tp_sender_end()
418 batadv_tp_batctl_notify(tp_vars->reason, in batadv_tp_sender_end()
419 tp_vars->other_end, in batadv_tp_sender_end()
421 tp_vars->start_time, in batadv_tp_sender_end()
422 atomic64_read(&tp_vars->tot_sent), in batadv_tp_sender_end()
431 static void batadv_tp_sender_shutdown(struct batadv_tp_vars *tp_vars, in batadv_tp_sender_shutdown() argument
434 if (!atomic_dec_and_test(&tp_vars->sending)) in batadv_tp_sender_shutdown()
437 tp_vars->reason = reason; in batadv_tp_sender_shutdown()
447 struct batadv_tp_vars *tp_vars; in batadv_tp_sender_finish() local
450 tp_vars = container_of(delayed_work, struct batadv_tp_vars, in batadv_tp_sender_finish()
453 batadv_tp_sender_shutdown(tp_vars, BATADV_TP_REASON_COMPLETE); in batadv_tp_sender_finish()
462 static void batadv_tp_reset_sender_timer(struct batadv_tp_vars *tp_vars) in batadv_tp_reset_sender_timer() argument
467 if (unlikely(atomic_read(&tp_vars->sending) == 0)) in batadv_tp_reset_sender_timer()
471 mod_timer(&tp_vars->timer, jiffies + msecs_to_jiffies(tp_vars->rto)); in batadv_tp_reset_sender_timer()
484 struct batadv_tp_vars *tp_vars = from_timer(tp_vars, t, timer); in batadv_tp_sender_timeout() local
485 struct batadv_priv *bat_priv = tp_vars->bat_priv; in batadv_tp_sender_timeout()
487 if (atomic_read(&tp_vars->sending) == 0) in batadv_tp_sender_timeout()
491 if (unlikely(tp_vars->rto >= BATADV_TP_MAX_RTO)) { in batadv_tp_sender_timeout()
492 batadv_tp_sender_shutdown(tp_vars, in batadv_tp_sender_timeout()
500 tp_vars->rto <<= 1; in batadv_tp_sender_timeout()
502 spin_lock_bh(&tp_vars->cwnd_lock); in batadv_tp_sender_timeout()
504 tp_vars->ss_threshold = tp_vars->cwnd >> 1; in batadv_tp_sender_timeout()
505 if (tp_vars->ss_threshold < BATADV_TP_PLEN * 2) in batadv_tp_sender_timeout()
506 tp_vars->ss_threshold = BATADV_TP_PLEN * 2; in batadv_tp_sender_timeout()
510 tp_vars->other_end, tp_vars->cwnd, tp_vars->ss_threshold, in batadv_tp_sender_timeout()
511 atomic_read(&tp_vars->last_acked)); in batadv_tp_sender_timeout()
513 tp_vars->cwnd = BATADV_TP_PLEN * 3; in batadv_tp_sender_timeout()
515 spin_unlock_bh(&tp_vars->cwnd_lock); in batadv_tp_sender_timeout()
518 tp_vars->last_sent = atomic_read(&tp_vars->last_acked); in batadv_tp_sender_timeout()
519 wake_up(&tp_vars->more_bytes); in batadv_tp_sender_timeout()
521 batadv_tp_reset_sender_timer(tp_vars); in batadv_tp_sender_timeout()
530 static void batadv_tp_fill_prerandom(struct batadv_tp_vars *tp_vars, in batadv_tp_fill_prerandom() argument
538 spin_lock_bh(&tp_vars->prerandom_lock); in batadv_tp_fill_prerandom()
539 local_offset = tp_vars->prerandom_offset; in batadv_tp_fill_prerandom()
540 tp_vars->prerandom_offset += nbytes; in batadv_tp_fill_prerandom()
541 tp_vars->prerandom_offset %= sizeof(batadv_tp_prerandom); in batadv_tp_fill_prerandom()
542 spin_unlock_bh(&tp_vars->prerandom_lock); in batadv_tp_fill_prerandom()
573 static int batadv_tp_send_msg(struct batadv_tp_vars *tp_vars, const u8 *src, in batadv_tp_send_msg() argument
607 batadv_tp_fill_prerandom(tp_vars, data, data_len); in batadv_tp_send_msg()
629 struct batadv_tp_vars *tp_vars; in batadv_tp_recv_ack() local
641 tp_vars = batadv_tp_list_find_session(bat_priv, icmp->orig, in batadv_tp_recv_ack()
643 if (unlikely(!tp_vars)) in batadv_tp_recv_ack()
646 if (unlikely(atomic_read(&tp_vars->sending) == 0)) in batadv_tp_recv_ack()
651 (u32)atomic_read(&tp_vars->last_acked))) in batadv_tp_recv_ack()
665 batadv_tp_update_rto(tp_vars, rtt); in batadv_tp_recv_ack()
668 batadv_tp_reset_sender_timer(tp_vars); in batadv_tp_recv_ack()
673 if (atomic_read(&tp_vars->last_acked) == recv_ack) { in batadv_tp_recv_ack()
674 atomic_inc(&tp_vars->dup_acks); in batadv_tp_recv_ack()
675 if (atomic_read(&tp_vars->dup_acks) != 3) in batadv_tp_recv_ack()
678 if (recv_ack >= tp_vars->recover) in batadv_tp_recv_ack()
682 batadv_tp_send_msg(tp_vars, primary_if->net_dev->dev_addr, in batadv_tp_recv_ack()
687 spin_lock_bh(&tp_vars->cwnd_lock); in batadv_tp_recv_ack()
690 tp_vars->fast_recovery = true; in batadv_tp_recv_ack()
694 tp_vars->recover = tp_vars->last_sent; in batadv_tp_recv_ack()
695 tp_vars->ss_threshold = tp_vars->cwnd >> 1; in batadv_tp_recv_ack()
698 tp_vars->cwnd, tp_vars->ss_threshold, in batadv_tp_recv_ack()
699 tp_vars->last_sent, recv_ack); in batadv_tp_recv_ack()
700 tp_vars->cwnd = batadv_tp_cwnd(tp_vars->ss_threshold, 3 * mss, in batadv_tp_recv_ack()
702 tp_vars->dec_cwnd = 0; in batadv_tp_recv_ack()
703 tp_vars->last_sent = recv_ack; in batadv_tp_recv_ack()
705 spin_unlock_bh(&tp_vars->cwnd_lock); in batadv_tp_recv_ack()
708 atomic64_add(recv_ack - atomic_read(&tp_vars->last_acked), in batadv_tp_recv_ack()
709 &tp_vars->tot_sent); in batadv_tp_recv_ack()
711 atomic_set(&tp_vars->dup_acks, 0); in batadv_tp_recv_ack()
713 if (tp_vars->fast_recovery) { in batadv_tp_recv_ack()
715 if (batadv_seq_before(recv_ack, tp_vars->recover)) { in batadv_tp_recv_ack()
721 batadv_tp_send_msg(tp_vars, dev_addr, in batadv_tp_recv_ack()
726 tp_vars->cwnd = batadv_tp_cwnd(tp_vars->cwnd, in batadv_tp_recv_ack()
729 tp_vars->fast_recovery = false; in batadv_tp_recv_ack()
734 cwnd = batadv_tp_cwnd(tp_vars->ss_threshold, 0, in batadv_tp_recv_ack()
736 tp_vars->cwnd = cwnd; in batadv_tp_recv_ack()
741 if (recv_ack - atomic_read(&tp_vars->last_acked) >= mss) in batadv_tp_recv_ack()
742 batadv_tp_update_cwnd(tp_vars, mss); in batadv_tp_recv_ack()
745 atomic_set(&tp_vars->last_acked, recv_ack); in batadv_tp_recv_ack()
748 wake_up(&tp_vars->more_bytes); in batadv_tp_recv_ack()
754 if (likely(tp_vars)) in batadv_tp_recv_ack()
755 batadv_tp_vars_put(tp_vars); in batadv_tp_recv_ack()
765 static bool batadv_tp_avail(struct batadv_tp_vars *tp_vars, in batadv_tp_avail() argument
770 win_limit = atomic_read(&tp_vars->last_acked) + tp_vars->cwnd; in batadv_tp_avail()
771 win_left = win_limit - tp_vars->last_sent; in batadv_tp_avail()
787 static int batadv_tp_wait_available(struct batadv_tp_vars *tp_vars, size_t plen) in batadv_tp_wait_available() argument
791 ret = wait_event_interruptible_timeout(tp_vars->more_bytes, in batadv_tp_wait_available()
792 batadv_tp_avail(tp_vars, plen), in batadv_tp_wait_available()
806 struct batadv_tp_vars *tp_vars = arg; in batadv_tp_send() local
807 struct batadv_priv *bat_priv = tp_vars->bat_priv; in batadv_tp_send()
813 if (unlikely(tp_vars->role != BATADV_TP_SENDER)) { in batadv_tp_send()
815 tp_vars->reason = err; in batadv_tp_send()
819 orig_node = batadv_orig_hash_find(bat_priv, tp_vars->other_end); in batadv_tp_send()
822 tp_vars->reason = err; in batadv_tp_send()
829 tp_vars->reason = err; in batadv_tp_send()
842 batadv_tp_reset_sender_timer(tp_vars); in batadv_tp_send()
845 queue_delayed_work(batadv_event_workqueue, &tp_vars->finish_work, in batadv_tp_send()
846 msecs_to_jiffies(tp_vars->test_length)); in batadv_tp_send()
848 while (atomic_read(&tp_vars->sending) != 0) { in batadv_tp_send()
849 if (unlikely(!batadv_tp_avail(tp_vars, payload_len))) { in batadv_tp_send()
850 batadv_tp_wait_available(tp_vars, payload_len); in batadv_tp_send()
859 err = batadv_tp_send_msg(tp_vars, primary_if->net_dev->dev_addr, in batadv_tp_send()
860 orig_node, tp_vars->last_sent, in batadv_tp_send()
862 tp_vars->session, tp_vars->icmp_uid, in batadv_tp_send()
871 if (atomic_dec_and_test(&tp_vars->sending)) in batadv_tp_send()
872 tp_vars->reason = err; in batadv_tp_send()
878 tp_vars->last_sent += payload_len; in batadv_tp_send()
889 batadv_tp_sender_end(bat_priv, tp_vars); in batadv_tp_send()
890 batadv_tp_sender_cleanup(bat_priv, tp_vars); in batadv_tp_send()
892 batadv_tp_vars_put(tp_vars); in batadv_tp_send()
902 static void batadv_tp_start_kthread(struct batadv_tp_vars *tp_vars) in batadv_tp_start_kthread() argument
905 struct batadv_priv *bat_priv = tp_vars->bat_priv; in batadv_tp_start_kthread()
908 kref_get(&tp_vars->refcount); in batadv_tp_start_kthread()
909 kthread = kthread_create(batadv_tp_send, tp_vars, "kbatadv_tp_meter"); in batadv_tp_start_kthread()
911 session_cookie = batadv_tp_session_cookie(tp_vars->session, in batadv_tp_start_kthread()
912 tp_vars->icmp_uid); in batadv_tp_start_kthread()
915 tp_vars->other_end, in batadv_tp_start_kthread()
919 batadv_tp_vars_put(tp_vars); in batadv_tp_start_kthread()
922 batadv_tp_sender_cleanup(bat_priv, tp_vars); in batadv_tp_start_kthread()
939 struct batadv_tp_vars *tp_vars; in batadv_tp_start() local
951 tp_vars = batadv_tp_list_find(bat_priv, dst); in batadv_tp_start()
952 if (tp_vars) { in batadv_tp_start()
954 batadv_tp_vars_put(tp_vars); in batadv_tp_start()
971 tp_vars = kmalloc(sizeof(*tp_vars), GFP_ATOMIC); in batadv_tp_start()
972 if (!tp_vars) { in batadv_tp_start()
983 ether_addr_copy(tp_vars->other_end, dst); in batadv_tp_start()
984 kref_init(&tp_vars->refcount); in batadv_tp_start()
985 tp_vars->role = BATADV_TP_SENDER; in batadv_tp_start()
986 atomic_set(&tp_vars->sending, 1); in batadv_tp_start()
987 memcpy(tp_vars->session, session_id, sizeof(session_id)); in batadv_tp_start()
988 tp_vars->icmp_uid = icmp_uid; in batadv_tp_start()
990 tp_vars->last_sent = BATADV_TP_FIRST_SEQ; in batadv_tp_start()
991 atomic_set(&tp_vars->last_acked, BATADV_TP_FIRST_SEQ); in batadv_tp_start()
992 tp_vars->fast_recovery = false; in batadv_tp_start()
993 tp_vars->recover = BATADV_TP_FIRST_SEQ; in batadv_tp_start()
999 tp_vars->cwnd = BATADV_TP_PLEN * 3; in batadv_tp_start()
1003 tp_vars->ss_threshold = BATADV_TP_AWND; in batadv_tp_start()
1008 tp_vars->rto = 1000; in batadv_tp_start()
1009 tp_vars->srtt = 0; in batadv_tp_start()
1010 tp_vars->rttvar = 0; in batadv_tp_start()
1012 atomic64_set(&tp_vars->tot_sent, 0); in batadv_tp_start()
1014 kref_get(&tp_vars->refcount); in batadv_tp_start()
1015 timer_setup(&tp_vars->timer, batadv_tp_sender_timeout, 0); in batadv_tp_start()
1017 tp_vars->bat_priv = bat_priv; in batadv_tp_start()
1018 tp_vars->start_time = jiffies; in batadv_tp_start()
1020 init_waitqueue_head(&tp_vars->more_bytes); in batadv_tp_start()
1022 spin_lock_init(&tp_vars->unacked_lock); in batadv_tp_start()
1023 INIT_LIST_HEAD(&tp_vars->unacked_list); in batadv_tp_start()
1025 spin_lock_init(&tp_vars->cwnd_lock); in batadv_tp_start()
1027 tp_vars->prerandom_offset = 0; in batadv_tp_start()
1028 spin_lock_init(&tp_vars->prerandom_lock); in batadv_tp_start()
1030 kref_get(&tp_vars->refcount); in batadv_tp_start()
1031 hlist_add_head_rcu(&tp_vars->list, &bat_priv->tp_list); in batadv_tp_start()
1034 tp_vars->test_length = test_length; in batadv_tp_start()
1035 if (!tp_vars->test_length) in batadv_tp_start()
1036 tp_vars->test_length = BATADV_TP_DEF_TEST_LENGTH; in batadv_tp_start()
1043 INIT_DELAYED_WORK(&tp_vars->finish_work, batadv_tp_sender_finish); in batadv_tp_start()
1048 batadv_tp_start_kthread(tp_vars); in batadv_tp_start()
1051 batadv_tp_vars_put(tp_vars); in batadv_tp_start()
1064 struct batadv_tp_vars *tp_vars; in batadv_tp_stop() local
1073 tp_vars = batadv_tp_list_find(bat_priv, orig_node->orig); in batadv_tp_stop()
1074 if (!tp_vars) { in batadv_tp_stop()
1080 batadv_tp_sender_shutdown(tp_vars, return_value); in batadv_tp_stop()
1081 batadv_tp_vars_put(tp_vars); in batadv_tp_stop()
1092 static void batadv_tp_reset_receiver_timer(struct batadv_tp_vars *tp_vars) in batadv_tp_reset_receiver_timer() argument
1094 mod_timer(&tp_vars->timer, in batadv_tp_reset_receiver_timer()
1105 struct batadv_tp_vars *tp_vars = from_timer(tp_vars, t, timer); in batadv_tp_receiver_shutdown() local
1109 bat_priv = tp_vars->bat_priv; in batadv_tp_receiver_shutdown()
1112 if (!batadv_has_timed_out(tp_vars->last_recv_time, in batadv_tp_receiver_shutdown()
1115 batadv_tp_reset_receiver_timer(tp_vars); in batadv_tp_receiver_shutdown()
1121 BATADV_TP_RECV_TIMEOUT, tp_vars->other_end); in batadv_tp_receiver_shutdown()
1123 spin_lock_bh(&tp_vars->bat_priv->tp_list_lock); in batadv_tp_receiver_shutdown()
1124 hlist_del_rcu(&tp_vars->list); in batadv_tp_receiver_shutdown()
1125 spin_unlock_bh(&tp_vars->bat_priv->tp_list_lock); in batadv_tp_receiver_shutdown()
1128 batadv_tp_vars_put(tp_vars); in batadv_tp_receiver_shutdown()
1132 spin_lock_bh(&tp_vars->unacked_lock); in batadv_tp_receiver_shutdown()
1133 list_for_each_entry_safe(un, safe, &tp_vars->unacked_list, list) { in batadv_tp_receiver_shutdown()
1137 spin_unlock_bh(&tp_vars->unacked_lock); in batadv_tp_receiver_shutdown()
1140 batadv_tp_vars_put(tp_vars); in batadv_tp_receiver_shutdown()
1226 static bool batadv_tp_handle_out_of_order(struct batadv_tp_vars *tp_vars, in batadv_tp_handle_out_of_order() argument
1244 spin_lock_bh(&tp_vars->unacked_lock); in batadv_tp_handle_out_of_order()
1246 if (list_empty(&tp_vars->unacked_list)) { in batadv_tp_handle_out_of_order()
1247 list_add(&new->list, &tp_vars->unacked_list); in batadv_tp_handle_out_of_order()
1258 list_for_each_entry_reverse(un, &tp_vars->unacked_list, list) { in batadv_tp_handle_out_of_order()
1283 list_add(&new->list, &tp_vars->unacked_list); in batadv_tp_handle_out_of_order()
1286 spin_unlock_bh(&tp_vars->unacked_lock); in batadv_tp_handle_out_of_order()
1296 static void batadv_tp_ack_unordered(struct batadv_tp_vars *tp_vars) in batadv_tp_ack_unordered() argument
1304 spin_lock_bh(&tp_vars->unacked_lock); in batadv_tp_ack_unordered()
1305 list_for_each_entry_safe(un, safe, &tp_vars->unacked_list, list) { in batadv_tp_ack_unordered()
1310 if (batadv_seq_before(tp_vars->last_recv, un->seqno)) in batadv_tp_ack_unordered()
1313 to_ack = un->seqno + un->len - tp_vars->last_recv; in batadv_tp_ack_unordered()
1315 if (batadv_seq_before(tp_vars->last_recv, un->seqno + un->len)) in batadv_tp_ack_unordered()
1316 tp_vars->last_recv += to_ack; in batadv_tp_ack_unordered()
1321 spin_unlock_bh(&tp_vars->unacked_lock); in batadv_tp_ack_unordered()
1335 struct batadv_tp_vars *tp_vars; in batadv_tp_init_recv() local
1338 tp_vars = batadv_tp_list_find_session(bat_priv, icmp->orig, in batadv_tp_init_recv()
1340 if (tp_vars) in batadv_tp_init_recv()
1349 tp_vars = kmalloc(sizeof(*tp_vars), GFP_ATOMIC); in batadv_tp_init_recv()
1350 if (!tp_vars) in batadv_tp_init_recv()
1353 ether_addr_copy(tp_vars->other_end, icmp->orig); in batadv_tp_init_recv()
1354 tp_vars->role = BATADV_TP_RECEIVER; in batadv_tp_init_recv()
1355 memcpy(tp_vars->session, icmp->session, sizeof(tp_vars->session)); in batadv_tp_init_recv()
1356 tp_vars->last_recv = BATADV_TP_FIRST_SEQ; in batadv_tp_init_recv()
1357 tp_vars->bat_priv = bat_priv; in batadv_tp_init_recv()
1358 kref_init(&tp_vars->refcount); in batadv_tp_init_recv()
1360 spin_lock_init(&tp_vars->unacked_lock); in batadv_tp_init_recv()
1361 INIT_LIST_HEAD(&tp_vars->unacked_list); in batadv_tp_init_recv()
1363 kref_get(&tp_vars->refcount); in batadv_tp_init_recv()
1364 hlist_add_head_rcu(&tp_vars->list, &bat_priv->tp_list); in batadv_tp_init_recv()
1366 kref_get(&tp_vars->refcount); in batadv_tp_init_recv()
1367 timer_setup(&tp_vars->timer, batadv_tp_receiver_shutdown, 0); in batadv_tp_init_recv()
1369 batadv_tp_reset_receiver_timer(tp_vars); in batadv_tp_init_recv()
1374 return tp_vars; in batadv_tp_init_recv()
1388 struct batadv_tp_vars *tp_vars; in batadv_tp_recv_msg() local
1399 tp_vars = batadv_tp_init_recv(bat_priv, icmp); in batadv_tp_recv_msg()
1400 if (!tp_vars) { in batadv_tp_recv_msg()
1406 tp_vars = batadv_tp_list_find_session(bat_priv, icmp->orig, in batadv_tp_recv_msg()
1408 if (!tp_vars) { in batadv_tp_recv_msg()
1416 if (unlikely(tp_vars->role != BATADV_TP_RECEIVER)) { in batadv_tp_recv_msg()
1419 tp_vars->role); in batadv_tp_recv_msg()
1423 tp_vars->last_recv_time = jiffies; in batadv_tp_recv_msg()
1428 if (batadv_seq_before(seqno, tp_vars->last_recv)) in batadv_tp_recv_msg()
1432 if (ntohl(icmp->seqno) != tp_vars->last_recv) { in batadv_tp_recv_msg()
1436 if (!batadv_tp_handle_out_of_order(tp_vars, skb)) in batadv_tp_recv_msg()
1445 tp_vars->last_recv += packet_size; in batadv_tp_recv_msg()
1448 batadv_tp_ack_unordered(tp_vars); in batadv_tp_recv_msg()
1455 batadv_tp_send_ack(bat_priv, icmp->orig, tp_vars->last_recv, in batadv_tp_recv_msg()
1458 if (likely(tp_vars)) in batadv_tp_recv_msg()
1459 batadv_tp_vars_put(tp_vars); in batadv_tp_recv_msg()