Lines Matching +full:keep +full:- +full:a +full:- +full:live
1 // SPDX-License-Identifier: GPL-2.0-or-later
19 #include "ar-internal.h"
26 * Find the peer associated with a local error.
37 srx->transport_type = local->srx.transport_type; in rxrpc_lookup_peer_local_rcu()
38 srx->transport_len = local->srx.transport_len; in rxrpc_lookup_peer_local_rcu()
39 srx->transport.family = local->srx.transport.family; in rxrpc_lookup_peer_local_rcu()
44 switch (srx->transport.family) { in rxrpc_lookup_peer_local_rcu()
46 srx->transport_len = sizeof(srx->transport.sin); in rxrpc_lookup_peer_local_rcu()
47 srx->transport.family = AF_INET; in rxrpc_lookup_peer_local_rcu()
48 srx->transport.sin.sin_port = serr->port; in rxrpc_lookup_peer_local_rcu()
49 switch (serr->ee.ee_origin) { in rxrpc_lookup_peer_local_rcu()
51 memcpy(&srx->transport.sin.sin_addr, in rxrpc_lookup_peer_local_rcu()
52 skb_network_header(skb) + serr->addr_offset, in rxrpc_lookup_peer_local_rcu()
56 memcpy(&srx->transport.sin.sin_addr, in rxrpc_lookup_peer_local_rcu()
57 skb_network_header(skb) + serr->addr_offset + 12, in rxrpc_lookup_peer_local_rcu()
61 memcpy(&srx->transport.sin.sin_addr, &ip_hdr(skb)->saddr, in rxrpc_lookup_peer_local_rcu()
69 switch (serr->ee.ee_origin) { in rxrpc_lookup_peer_local_rcu()
71 srx->transport.sin6.sin6_port = serr->port; in rxrpc_lookup_peer_local_rcu()
72 memcpy(&srx->transport.sin6.sin6_addr, in rxrpc_lookup_peer_local_rcu()
73 skb_network_header(skb) + serr->addr_offset, in rxrpc_lookup_peer_local_rcu()
77 srx->transport_len = sizeof(srx->transport.sin); in rxrpc_lookup_peer_local_rcu()
78 srx->transport.family = AF_INET; in rxrpc_lookup_peer_local_rcu()
79 srx->transport.sin.sin_port = serr->port; in rxrpc_lookup_peer_local_rcu()
80 memcpy(&srx->transport.sin.sin_addr, in rxrpc_lookup_peer_local_rcu()
81 skb_network_header(skb) + serr->addr_offset, in rxrpc_lookup_peer_local_rcu()
85 memcpy(&srx->transport.sin6.sin6_addr, in rxrpc_lookup_peer_local_rcu()
86 &ipv6_hdr(skb)->saddr, in rxrpc_lookup_peer_local_rcu()
108 if (mtu > 0 && peer->if_mtu == 65535 && mtu < peer->if_mtu) in rxrpc_adjust_mtu()
109 peer->if_mtu = mtu; in rxrpc_adjust_mtu()
112 /* they didn't give us a size, estimate one */ in rxrpc_adjust_mtu()
113 mtu = peer->if_mtu; in rxrpc_adjust_mtu()
119 mtu -= 100; in rxrpc_adjust_mtu()
120 if (mtu < peer->hdrsize) in rxrpc_adjust_mtu()
121 mtu = peer->hdrsize + 4; in rxrpc_adjust_mtu()
125 max_data = max_t(int, mtu - peer->hdrsize, 500); in rxrpc_adjust_mtu()
126 if (max_data < peer->max_data) { in rxrpc_adjust_mtu()
127 if (peer->pmtud_good > max_data) in rxrpc_adjust_mtu()
128 peer->pmtud_good = max_data; in rxrpc_adjust_mtu()
129 if (peer->pmtud_bad > max_data + 1) in rxrpc_adjust_mtu()
130 peer->pmtud_bad = max_data + 1; in rxrpc_adjust_mtu()
133 peer->max_data = max_data; in rxrpc_adjust_mtu()
146 _enter("L=%x", local->debug_id); in rxrpc_input_error()
148 if (!skb->len && serr->ee.ee_origin == SO_EE_ORIGIN_TIMESTAMPING) { in rxrpc_input_error()
161 trace_rxrpc_rx_icmp(peer, &serr->ee, &srx); in rxrpc_input_error()
163 if ((serr->ee.ee_origin == SO_EE_ORIGIN_ICMP && in rxrpc_input_error()
164 serr->ee.ee_type == ICMP_DEST_UNREACH && in rxrpc_input_error()
165 serr->ee.ee_code == ICMP_FRAG_NEEDED)) { in rxrpc_input_error()
166 rxrpc_adjust_mtu(peer, serr->ee.ee_info); in rxrpc_input_error()
170 if ((serr->ee.ee_origin == SO_EE_ORIGIN_ICMP6 && in rxrpc_input_error()
171 serr->ee.ee_type == ICMPV6_PKT_TOOBIG && in rxrpc_input_error()
172 serr->ee.ee_code == 0)) { in rxrpc_input_error()
173 rxrpc_adjust_mtu(peer, serr->ee.ee_info); in rxrpc_input_error()
189 struct sock_extended_err *ee = &serr->ee; in rxrpc_store_error()
190 int err = ee->ee_errno; in rxrpc_store_error()
194 switch (ee->ee_origin) { in rxrpc_store_error()
213 * Distribute an error that occurred on a peer.
221 spin_lock_irq(&peer->lock); in rxrpc_distribute_error()
222 hlist_move_list(&peer->error_targets, &error_targets); in rxrpc_distribute_error()
227 hlist_del_init(&call->error_link); in rxrpc_distribute_error()
228 spin_unlock_irq(&peer->lock); in rxrpc_distribute_error()
231 rxrpc_set_call_completion(call, compl, 0, -err); in rxrpc_distribute_error()
234 spin_lock_irq(&peer->lock); in rxrpc_distribute_error()
237 spin_unlock_irq(&peer->lock); in rxrpc_distribute_error()
241 * Perform keep-alive pings.
249 const u8 mask = ARRAY_SIZE(rxnet->peer_keepalive) - 1; in rxrpc_peer_keepalive_dispatch()
254 spin_lock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
257 peer = list_entry(collector->next, in rxrpc_peer_keepalive_dispatch()
260 list_del_init(&peer->keepalive_link); in rxrpc_peer_keepalive_dispatch()
264 use = __rxrpc_use_local(peer->local, rxrpc_local_use_peer_keepalive); in rxrpc_peer_keepalive_dispatch()
265 spin_unlock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
268 keepalive_at = peer->last_tx_at + RXRPC_KEEPALIVE_TIME; in rxrpc_peer_keepalive_dispatch()
269 slot = keepalive_at - base; in rxrpc_peer_keepalive_dispatch()
271 cursor, peer->debug_id, slot, &peer->srx.transport); in rxrpc_peer_keepalive_dispatch()
279 /* A transmission to this peer occurred since last we in rxrpc_peer_keepalive_dispatch()
285 spin_lock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
286 list_add_tail(&peer->keepalive_link, in rxrpc_peer_keepalive_dispatch()
287 &rxnet->peer_keepalive[slot & mask]); in rxrpc_peer_keepalive_dispatch()
288 spin_unlock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
289 rxrpc_unuse_local(peer->local, rxrpc_local_unuse_peer_keepalive); in rxrpc_peer_keepalive_dispatch()
292 spin_lock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
295 spin_unlock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
299 * Perform keep-alive pings with VERSION packets to keep any NAT alive.
305 const u8 mask = ARRAY_SIZE(rxnet->peer_keepalive) - 1; in rxrpc_peer_keepalive_worker()
311 base = rxnet->peer_keepalive_base; in rxrpc_peer_keepalive_worker()
312 cursor = rxnet->peer_keepalive_cursor; in rxrpc_peer_keepalive_worker()
313 _enter("%lld,%u", base - now, cursor); in rxrpc_peer_keepalive_worker()
315 if (!rxnet->live) in rxrpc_peer_keepalive_worker()
318 /* Remove to a temporary list all the peers that are currently lodged in rxrpc_peer_keepalive_worker()
325 spin_lock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_worker()
326 list_splice_init(&rxnet->peer_keepalive_new, &collector); in rxrpc_peer_keepalive_worker()
328 stop = cursor + ARRAY_SIZE(rxnet->peer_keepalive); in rxrpc_peer_keepalive_worker()
329 while (base <= now && (s8)(cursor - stop) < 0) { in rxrpc_peer_keepalive_worker()
330 list_splice_tail_init(&rxnet->peer_keepalive[cursor & mask], in rxrpc_peer_keepalive_worker()
337 spin_unlock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_worker()
339 rxnet->peer_keepalive_base = base; in rxrpc_peer_keepalive_worker()
340 rxnet->peer_keepalive_cursor = cursor; in rxrpc_peer_keepalive_worker()
345 cursor = rxnet->peer_keepalive_cursor; in rxrpc_peer_keepalive_worker()
346 stop = cursor + RXRPC_KEEPALIVE_TIME - 1; in rxrpc_peer_keepalive_worker()
347 for (; (s8)(cursor - stop) < 0; cursor++) { in rxrpc_peer_keepalive_worker()
348 if (!list_empty(&rxnet->peer_keepalive[cursor & mask])) in rxrpc_peer_keepalive_worker()
354 delay = base - now; in rxrpc_peer_keepalive_worker()
358 if (rxnet->live) in rxrpc_peer_keepalive_worker()
359 timer_reduce(&rxnet->peer_keepalive_timer, jiffies + delay); in rxrpc_peer_keepalive_worker()
370 struct rxrpc_peer *peer = conn->peer; in rxrpc_input_probe_for_pmtud()
371 unsigned int max_data = peer->max_data; in rxrpc_input_probe_for_pmtud()
374 good = peer->pmtud_good; in rxrpc_input_probe_for_pmtud()
375 trial = peer->pmtud_trial; in rxrpc_input_probe_for_pmtud()
376 bad = peer->pmtud_bad; in rxrpc_input_probe_for_pmtud()
377 if (good >= bad - 1) { in rxrpc_input_probe_for_pmtud()
378 conn->pmtud_probe = 0; in rxrpc_input_probe_for_pmtud()
379 peer->pmtud_lost = false; in rxrpc_input_probe_for_pmtud()
383 if (!peer->pmtud_probing) in rxrpc_input_probe_for_pmtud()
386 if (sendmsg_fail || after(acked_serial, conn->pmtud_probe)) { in rxrpc_input_probe_for_pmtud()
387 /* Retry a lost probe. */ in rxrpc_input_probe_for_pmtud()
388 if (!peer->pmtud_lost) { in rxrpc_input_probe_for_pmtud()
390 conn->pmtud_probe = 0; in rxrpc_input_probe_for_pmtud()
391 peer->pmtud_lost = true; in rxrpc_input_probe_for_pmtud()
397 peer->pmtud_bad = bad; in rxrpc_input_probe_for_pmtud()
399 max_data = bad - 1; in rxrpc_input_probe_for_pmtud()
403 peer->pmtud_good = good; in rxrpc_input_probe_for_pmtud()
408 max_data = umin(max_data, peer->ackr_max_data); in rxrpc_input_probe_for_pmtud()
409 if (max_data != peer->max_data) in rxrpc_input_probe_for_pmtud()
410 peer->max_data = max_data; in rxrpc_input_probe_for_pmtud()
414 peer->pmtud_jumbo = jumbo; in rxrpc_input_probe_for_pmtud()
417 conn->pmtud_probe = 0; in rxrpc_input_probe_for_pmtud()
418 peer->pmtud_lost = false; in rxrpc_input_probe_for_pmtud()
436 peer->pmtud_trial = trial; in rxrpc_input_probe_for_pmtud()
442 peer->pmtud_pending = true; in rxrpc_input_probe_for_pmtud()