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 if (!tp_vars) in batadv_tp_vars_put()
363 kref_put(&tp_vars->refcount, batadv_tp_vars_release); in batadv_tp_vars_put()
372 struct batadv_tp_vars *tp_vars) in batadv_tp_sender_cleanup() argument
374 cancel_delayed_work(&tp_vars->finish_work); in batadv_tp_sender_cleanup()
376 spin_lock_bh(&tp_vars->bat_priv->tp_list_lock); in batadv_tp_sender_cleanup()
377 hlist_del_rcu(&tp_vars->list); in batadv_tp_sender_cleanup()
378 spin_unlock_bh(&tp_vars->bat_priv->tp_list_lock); in batadv_tp_sender_cleanup()
381 batadv_tp_vars_put(tp_vars); in batadv_tp_sender_cleanup()
383 atomic_dec(&tp_vars->bat_priv->tp_num); in batadv_tp_sender_cleanup()
386 del_timer_sync(&tp_vars->timer); in batadv_tp_sender_cleanup()
392 del_timer(&tp_vars->timer); in batadv_tp_sender_cleanup()
393 batadv_tp_vars_put(tp_vars); in batadv_tp_sender_cleanup()
402 struct batadv_tp_vars *tp_vars) in batadv_tp_sender_end() argument
408 tp_vars->other_end, tp_vars->reason); in batadv_tp_sender_end()
412 tp_vars->srtt >> 3, tp_vars->rttvar >> 2, tp_vars->rto); in batadv_tp_sender_end()
416 tp_vars->cwnd, tp_vars->ss_threshold); in batadv_tp_sender_end()
418 session_cookie = batadv_tp_session_cookie(tp_vars->session, in batadv_tp_sender_end()
419 tp_vars->icmp_uid); in batadv_tp_sender_end()
421 batadv_tp_batctl_notify(tp_vars->reason, in batadv_tp_sender_end()
422 tp_vars->other_end, in batadv_tp_sender_end()
424 tp_vars->start_time, in batadv_tp_sender_end()
425 atomic64_read(&tp_vars->tot_sent), in batadv_tp_sender_end()
434 static void batadv_tp_sender_shutdown(struct batadv_tp_vars *tp_vars, in batadv_tp_sender_shutdown() argument
437 if (!atomic_dec_and_test(&tp_vars->sending)) in batadv_tp_sender_shutdown()
440 tp_vars->reason = reason; in batadv_tp_sender_shutdown()
450 struct batadv_tp_vars *tp_vars; in batadv_tp_sender_finish() local
453 tp_vars = container_of(delayed_work, struct batadv_tp_vars, in batadv_tp_sender_finish()
456 batadv_tp_sender_shutdown(tp_vars, BATADV_TP_REASON_COMPLETE); in batadv_tp_sender_finish()
465 static void batadv_tp_reset_sender_timer(struct batadv_tp_vars *tp_vars) in batadv_tp_reset_sender_timer() argument
470 if (unlikely(atomic_read(&tp_vars->sending) == 0)) in batadv_tp_reset_sender_timer()
474 mod_timer(&tp_vars->timer, jiffies + msecs_to_jiffies(tp_vars->rto)); in batadv_tp_reset_sender_timer()
487 struct batadv_tp_vars *tp_vars = from_timer(tp_vars, t, timer); in batadv_tp_sender_timeout() local
488 struct batadv_priv *bat_priv = tp_vars->bat_priv; in batadv_tp_sender_timeout()
490 if (atomic_read(&tp_vars->sending) == 0) in batadv_tp_sender_timeout()
494 if (unlikely(tp_vars->rto >= BATADV_TP_MAX_RTO)) { in batadv_tp_sender_timeout()
495 batadv_tp_sender_shutdown(tp_vars, in batadv_tp_sender_timeout()
503 tp_vars->rto <<= 1; in batadv_tp_sender_timeout()
505 spin_lock_bh(&tp_vars->cwnd_lock); in batadv_tp_sender_timeout()
507 tp_vars->ss_threshold = tp_vars->cwnd >> 1; in batadv_tp_sender_timeout()
508 if (tp_vars->ss_threshold < BATADV_TP_PLEN * 2) in batadv_tp_sender_timeout()
509 tp_vars->ss_threshold = BATADV_TP_PLEN * 2; in batadv_tp_sender_timeout()
513 tp_vars->other_end, tp_vars->cwnd, tp_vars->ss_threshold, in batadv_tp_sender_timeout()
514 atomic_read(&tp_vars->last_acked)); in batadv_tp_sender_timeout()
516 tp_vars->cwnd = BATADV_TP_PLEN * 3; in batadv_tp_sender_timeout()
518 spin_unlock_bh(&tp_vars->cwnd_lock); in batadv_tp_sender_timeout()
521 tp_vars->last_sent = atomic_read(&tp_vars->last_acked); in batadv_tp_sender_timeout()
522 wake_up(&tp_vars->more_bytes); in batadv_tp_sender_timeout()
524 batadv_tp_reset_sender_timer(tp_vars); in batadv_tp_sender_timeout()
533 static void batadv_tp_fill_prerandom(struct batadv_tp_vars *tp_vars, in batadv_tp_fill_prerandom() argument
541 spin_lock_bh(&tp_vars->prerandom_lock); in batadv_tp_fill_prerandom()
542 local_offset = tp_vars->prerandom_offset; in batadv_tp_fill_prerandom()
543 tp_vars->prerandom_offset += nbytes; in batadv_tp_fill_prerandom()
544 tp_vars->prerandom_offset %= sizeof(batadv_tp_prerandom); in batadv_tp_fill_prerandom()
545 spin_unlock_bh(&tp_vars->prerandom_lock); in batadv_tp_fill_prerandom()
576 static int batadv_tp_send_msg(struct batadv_tp_vars *tp_vars, const u8 *src, in batadv_tp_send_msg() argument
610 batadv_tp_fill_prerandom(tp_vars, data, data_len); in batadv_tp_send_msg()
632 struct batadv_tp_vars *tp_vars; in batadv_tp_recv_ack() local
644 tp_vars = batadv_tp_list_find_session(bat_priv, icmp->orig, in batadv_tp_recv_ack()
646 if (unlikely(!tp_vars)) in batadv_tp_recv_ack()
649 if (unlikely(atomic_read(&tp_vars->sending) == 0)) in batadv_tp_recv_ack()
654 (u32)atomic_read(&tp_vars->last_acked))) in batadv_tp_recv_ack()
668 batadv_tp_update_rto(tp_vars, rtt); in batadv_tp_recv_ack()
671 batadv_tp_reset_sender_timer(tp_vars); in batadv_tp_recv_ack()
676 if (atomic_read(&tp_vars->last_acked) == recv_ack) { in batadv_tp_recv_ack()
677 atomic_inc(&tp_vars->dup_acks); in batadv_tp_recv_ack()
678 if (atomic_read(&tp_vars->dup_acks) != 3) in batadv_tp_recv_ack()
681 if (recv_ack >= tp_vars->recover) in batadv_tp_recv_ack()
685 batadv_tp_send_msg(tp_vars, primary_if->net_dev->dev_addr, in batadv_tp_recv_ack()
690 spin_lock_bh(&tp_vars->cwnd_lock); in batadv_tp_recv_ack()
693 tp_vars->fast_recovery = true; in batadv_tp_recv_ack()
697 tp_vars->recover = tp_vars->last_sent; in batadv_tp_recv_ack()
698 tp_vars->ss_threshold = tp_vars->cwnd >> 1; in batadv_tp_recv_ack()
701 tp_vars->cwnd, tp_vars->ss_threshold, in batadv_tp_recv_ack()
702 tp_vars->last_sent, recv_ack); in batadv_tp_recv_ack()
703 tp_vars->cwnd = batadv_tp_cwnd(tp_vars->ss_threshold, 3 * mss, in batadv_tp_recv_ack()
705 tp_vars->dec_cwnd = 0; in batadv_tp_recv_ack()
706 tp_vars->last_sent = recv_ack; in batadv_tp_recv_ack()
708 spin_unlock_bh(&tp_vars->cwnd_lock); in batadv_tp_recv_ack()
711 atomic64_add(recv_ack - atomic_read(&tp_vars->last_acked), in batadv_tp_recv_ack()
712 &tp_vars->tot_sent); in batadv_tp_recv_ack()
714 atomic_set(&tp_vars->dup_acks, 0); in batadv_tp_recv_ack()
716 if (tp_vars->fast_recovery) { in batadv_tp_recv_ack()
718 if (batadv_seq_before(recv_ack, tp_vars->recover)) { in batadv_tp_recv_ack()
724 batadv_tp_send_msg(tp_vars, dev_addr, in batadv_tp_recv_ack()
729 tp_vars->cwnd = batadv_tp_cwnd(tp_vars->cwnd, in batadv_tp_recv_ack()
732 tp_vars->fast_recovery = false; in batadv_tp_recv_ack()
737 cwnd = batadv_tp_cwnd(tp_vars->ss_threshold, 0, in batadv_tp_recv_ack()
739 tp_vars->cwnd = cwnd; in batadv_tp_recv_ack()
744 if (recv_ack - atomic_read(&tp_vars->last_acked) >= mss) in batadv_tp_recv_ack()
745 batadv_tp_update_cwnd(tp_vars, mss); in batadv_tp_recv_ack()
748 atomic_set(&tp_vars->last_acked, recv_ack); in batadv_tp_recv_ack()
751 wake_up(&tp_vars->more_bytes); in batadv_tp_recv_ack()
757 if (likely(tp_vars)) in batadv_tp_recv_ack()
758 batadv_tp_vars_put(tp_vars); in batadv_tp_recv_ack()
768 static bool batadv_tp_avail(struct batadv_tp_vars *tp_vars, in batadv_tp_avail() argument
773 win_limit = atomic_read(&tp_vars->last_acked) + tp_vars->cwnd; in batadv_tp_avail()
774 win_left = win_limit - tp_vars->last_sent; in batadv_tp_avail()
790 static int batadv_tp_wait_available(struct batadv_tp_vars *tp_vars, size_t plen) in batadv_tp_wait_available() argument
794 ret = wait_event_interruptible_timeout(tp_vars->more_bytes, in batadv_tp_wait_available()
795 batadv_tp_avail(tp_vars, plen), in batadv_tp_wait_available()
809 struct batadv_tp_vars *tp_vars = arg; in batadv_tp_send() local
810 struct batadv_priv *bat_priv = tp_vars->bat_priv; in batadv_tp_send()
816 if (unlikely(tp_vars->role != BATADV_TP_SENDER)) { in batadv_tp_send()
818 tp_vars->reason = err; in batadv_tp_send()
822 orig_node = batadv_orig_hash_find(bat_priv, tp_vars->other_end); in batadv_tp_send()
825 tp_vars->reason = err; in batadv_tp_send()
832 tp_vars->reason = err; in batadv_tp_send()
845 batadv_tp_reset_sender_timer(tp_vars); in batadv_tp_send()
848 queue_delayed_work(batadv_event_workqueue, &tp_vars->finish_work, in batadv_tp_send()
849 msecs_to_jiffies(tp_vars->test_length)); in batadv_tp_send()
851 while (atomic_read(&tp_vars->sending) != 0) { in batadv_tp_send()
852 if (unlikely(!batadv_tp_avail(tp_vars, payload_len))) { in batadv_tp_send()
853 batadv_tp_wait_available(tp_vars, payload_len); in batadv_tp_send()
862 err = batadv_tp_send_msg(tp_vars, primary_if->net_dev->dev_addr, in batadv_tp_send()
863 orig_node, tp_vars->last_sent, in batadv_tp_send()
865 tp_vars->session, tp_vars->icmp_uid, in batadv_tp_send()
874 if (atomic_dec_and_test(&tp_vars->sending)) in batadv_tp_send()
875 tp_vars->reason = err; in batadv_tp_send()
881 tp_vars->last_sent += payload_len; in batadv_tp_send()
892 batadv_tp_sender_end(bat_priv, tp_vars); in batadv_tp_send()
893 batadv_tp_sender_cleanup(bat_priv, tp_vars); in batadv_tp_send()
895 batadv_tp_vars_put(tp_vars); in batadv_tp_send()
905 static void batadv_tp_start_kthread(struct batadv_tp_vars *tp_vars) in batadv_tp_start_kthread() argument
908 struct batadv_priv *bat_priv = tp_vars->bat_priv; in batadv_tp_start_kthread()
911 kref_get(&tp_vars->refcount); in batadv_tp_start_kthread()
912 kthread = kthread_create(batadv_tp_send, tp_vars, "kbatadv_tp_meter"); in batadv_tp_start_kthread()
914 session_cookie = batadv_tp_session_cookie(tp_vars->session, in batadv_tp_start_kthread()
915 tp_vars->icmp_uid); in batadv_tp_start_kthread()
918 tp_vars->other_end, in batadv_tp_start_kthread()
922 batadv_tp_vars_put(tp_vars); in batadv_tp_start_kthread()
925 batadv_tp_sender_cleanup(bat_priv, tp_vars); in batadv_tp_start_kthread()
942 struct batadv_tp_vars *tp_vars; in batadv_tp_start() local
954 tp_vars = batadv_tp_list_find(bat_priv, dst); in batadv_tp_start()
955 if (tp_vars) { in batadv_tp_start()
957 batadv_tp_vars_put(tp_vars); in batadv_tp_start()
974 tp_vars = kmalloc(sizeof(*tp_vars), GFP_ATOMIC); in batadv_tp_start()
975 if (!tp_vars) { in batadv_tp_start()
986 ether_addr_copy(tp_vars->other_end, dst); in batadv_tp_start()
987 kref_init(&tp_vars->refcount); in batadv_tp_start()
988 tp_vars->role = BATADV_TP_SENDER; in batadv_tp_start()
989 atomic_set(&tp_vars->sending, 1); in batadv_tp_start()
990 memcpy(tp_vars->session, session_id, sizeof(session_id)); in batadv_tp_start()
991 tp_vars->icmp_uid = icmp_uid; in batadv_tp_start()
993 tp_vars->last_sent = BATADV_TP_FIRST_SEQ; in batadv_tp_start()
994 atomic_set(&tp_vars->last_acked, BATADV_TP_FIRST_SEQ); in batadv_tp_start()
995 tp_vars->fast_recovery = false; in batadv_tp_start()
996 tp_vars->recover = BATADV_TP_FIRST_SEQ; in batadv_tp_start()
1002 tp_vars->cwnd = BATADV_TP_PLEN * 3; in batadv_tp_start()
1006 tp_vars->ss_threshold = BATADV_TP_AWND; in batadv_tp_start()
1011 tp_vars->rto = 1000; in batadv_tp_start()
1012 tp_vars->srtt = 0; in batadv_tp_start()
1013 tp_vars->rttvar = 0; in batadv_tp_start()
1015 atomic64_set(&tp_vars->tot_sent, 0); in batadv_tp_start()
1017 kref_get(&tp_vars->refcount); in batadv_tp_start()
1018 timer_setup(&tp_vars->timer, batadv_tp_sender_timeout, 0); in batadv_tp_start()
1020 tp_vars->bat_priv = bat_priv; in batadv_tp_start()
1021 tp_vars->start_time = jiffies; in batadv_tp_start()
1023 init_waitqueue_head(&tp_vars->more_bytes); in batadv_tp_start()
1025 spin_lock_init(&tp_vars->unacked_lock); in batadv_tp_start()
1026 INIT_LIST_HEAD(&tp_vars->unacked_list); in batadv_tp_start()
1028 spin_lock_init(&tp_vars->cwnd_lock); in batadv_tp_start()
1030 tp_vars->prerandom_offset = 0; in batadv_tp_start()
1031 spin_lock_init(&tp_vars->prerandom_lock); in batadv_tp_start()
1033 kref_get(&tp_vars->refcount); in batadv_tp_start()
1034 hlist_add_head_rcu(&tp_vars->list, &bat_priv->tp_list); in batadv_tp_start()
1037 tp_vars->test_length = test_length; in batadv_tp_start()
1038 if (!tp_vars->test_length) in batadv_tp_start()
1039 tp_vars->test_length = BATADV_TP_DEF_TEST_LENGTH; in batadv_tp_start()
1046 INIT_DELAYED_WORK(&tp_vars->finish_work, batadv_tp_sender_finish); in batadv_tp_start()
1051 batadv_tp_start_kthread(tp_vars); in batadv_tp_start()
1054 batadv_tp_vars_put(tp_vars); in batadv_tp_start()
1067 struct batadv_tp_vars *tp_vars; in batadv_tp_stop() local
1076 tp_vars = batadv_tp_list_find(bat_priv, orig_node->orig); in batadv_tp_stop()
1077 if (!tp_vars) { in batadv_tp_stop()
1083 batadv_tp_sender_shutdown(tp_vars, return_value); in batadv_tp_stop()
1084 batadv_tp_vars_put(tp_vars); in batadv_tp_stop()
1095 static void batadv_tp_reset_receiver_timer(struct batadv_tp_vars *tp_vars) in batadv_tp_reset_receiver_timer() argument
1097 mod_timer(&tp_vars->timer, in batadv_tp_reset_receiver_timer()
1108 struct batadv_tp_vars *tp_vars = from_timer(tp_vars, t, timer); in batadv_tp_receiver_shutdown() local
1112 bat_priv = tp_vars->bat_priv; in batadv_tp_receiver_shutdown()
1115 if (!batadv_has_timed_out(tp_vars->last_recv_time, in batadv_tp_receiver_shutdown()
1118 batadv_tp_reset_receiver_timer(tp_vars); in batadv_tp_receiver_shutdown()
1124 BATADV_TP_RECV_TIMEOUT, tp_vars->other_end); in batadv_tp_receiver_shutdown()
1126 spin_lock_bh(&tp_vars->bat_priv->tp_list_lock); in batadv_tp_receiver_shutdown()
1127 hlist_del_rcu(&tp_vars->list); in batadv_tp_receiver_shutdown()
1128 spin_unlock_bh(&tp_vars->bat_priv->tp_list_lock); in batadv_tp_receiver_shutdown()
1131 batadv_tp_vars_put(tp_vars); in batadv_tp_receiver_shutdown()
1135 spin_lock_bh(&tp_vars->unacked_lock); in batadv_tp_receiver_shutdown()
1136 list_for_each_entry_safe(un, safe, &tp_vars->unacked_list, list) { in batadv_tp_receiver_shutdown()
1140 spin_unlock_bh(&tp_vars->unacked_lock); in batadv_tp_receiver_shutdown()
1143 batadv_tp_vars_put(tp_vars); in batadv_tp_receiver_shutdown()
1229 static bool batadv_tp_handle_out_of_order(struct batadv_tp_vars *tp_vars, in batadv_tp_handle_out_of_order() argument
1247 spin_lock_bh(&tp_vars->unacked_lock); in batadv_tp_handle_out_of_order()
1249 if (list_empty(&tp_vars->unacked_list)) { in batadv_tp_handle_out_of_order()
1250 list_add(&new->list, &tp_vars->unacked_list); in batadv_tp_handle_out_of_order()
1261 list_for_each_entry_reverse(un, &tp_vars->unacked_list, list) { in batadv_tp_handle_out_of_order()
1286 list_add(&new->list, &tp_vars->unacked_list); in batadv_tp_handle_out_of_order()
1289 spin_unlock_bh(&tp_vars->unacked_lock); in batadv_tp_handle_out_of_order()
1299 static void batadv_tp_ack_unordered(struct batadv_tp_vars *tp_vars) in batadv_tp_ack_unordered() argument
1307 spin_lock_bh(&tp_vars->unacked_lock); in batadv_tp_ack_unordered()
1308 list_for_each_entry_safe(un, safe, &tp_vars->unacked_list, list) { in batadv_tp_ack_unordered()
1313 if (batadv_seq_before(tp_vars->last_recv, un->seqno)) in batadv_tp_ack_unordered()
1316 to_ack = un->seqno + un->len - tp_vars->last_recv; in batadv_tp_ack_unordered()
1318 if (batadv_seq_before(tp_vars->last_recv, un->seqno + un->len)) in batadv_tp_ack_unordered()
1319 tp_vars->last_recv += to_ack; in batadv_tp_ack_unordered()
1324 spin_unlock_bh(&tp_vars->unacked_lock); in batadv_tp_ack_unordered()
1338 struct batadv_tp_vars *tp_vars; in batadv_tp_init_recv() local
1341 tp_vars = batadv_tp_list_find_session(bat_priv, icmp->orig, in batadv_tp_init_recv()
1343 if (tp_vars) in batadv_tp_init_recv()
1352 tp_vars = kmalloc(sizeof(*tp_vars), GFP_ATOMIC); in batadv_tp_init_recv()
1353 if (!tp_vars) in batadv_tp_init_recv()
1356 ether_addr_copy(tp_vars->other_end, icmp->orig); in batadv_tp_init_recv()
1357 tp_vars->role = BATADV_TP_RECEIVER; in batadv_tp_init_recv()
1358 memcpy(tp_vars->session, icmp->session, sizeof(tp_vars->session)); in batadv_tp_init_recv()
1359 tp_vars->last_recv = BATADV_TP_FIRST_SEQ; in batadv_tp_init_recv()
1360 tp_vars->bat_priv = bat_priv; in batadv_tp_init_recv()
1361 kref_init(&tp_vars->refcount); in batadv_tp_init_recv()
1363 spin_lock_init(&tp_vars->unacked_lock); in batadv_tp_init_recv()
1364 INIT_LIST_HEAD(&tp_vars->unacked_list); in batadv_tp_init_recv()
1366 kref_get(&tp_vars->refcount); in batadv_tp_init_recv()
1367 hlist_add_head_rcu(&tp_vars->list, &bat_priv->tp_list); in batadv_tp_init_recv()
1369 kref_get(&tp_vars->refcount); in batadv_tp_init_recv()
1370 timer_setup(&tp_vars->timer, batadv_tp_receiver_shutdown, 0); in batadv_tp_init_recv()
1372 batadv_tp_reset_receiver_timer(tp_vars); in batadv_tp_init_recv()
1377 return tp_vars; in batadv_tp_init_recv()
1391 struct batadv_tp_vars *tp_vars; in batadv_tp_recv_msg() local
1402 tp_vars = batadv_tp_init_recv(bat_priv, icmp); in batadv_tp_recv_msg()
1403 if (!tp_vars) { in batadv_tp_recv_msg()
1409 tp_vars = batadv_tp_list_find_session(bat_priv, icmp->orig, in batadv_tp_recv_msg()
1411 if (!tp_vars) { in batadv_tp_recv_msg()
1419 if (unlikely(tp_vars->role != BATADV_TP_RECEIVER)) { in batadv_tp_recv_msg()
1422 tp_vars->role); in batadv_tp_recv_msg()
1426 tp_vars->last_recv_time = jiffies; in batadv_tp_recv_msg()
1431 if (batadv_seq_before(seqno, tp_vars->last_recv)) in batadv_tp_recv_msg()
1435 if (ntohl(icmp->seqno) != tp_vars->last_recv) { in batadv_tp_recv_msg()
1439 if (!batadv_tp_handle_out_of_order(tp_vars, skb)) in batadv_tp_recv_msg()
1448 tp_vars->last_recv += packet_size; in batadv_tp_recv_msg()
1451 batadv_tp_ack_unordered(tp_vars); in batadv_tp_recv_msg()
1458 batadv_tp_send_ack(bat_priv, icmp->orig, tp_vars->last_recv, in batadv_tp_recv_msg()
1461 if (likely(tp_vars)) in batadv_tp_recv_msg()
1462 batadv_tp_vars_put(tp_vars); in batadv_tp_recv_msg()