Lines Matching +full:local +full:- +full:timer +full:- +full:stop

1 // SPDX-License-Identifier: GPL-2.0-or-later
19 #include "ar-internal.h"
28 static struct rxrpc_peer *rxrpc_lookup_peer_icmp_rcu(struct rxrpc_local *local, in rxrpc_lookup_peer_icmp_rcu() argument
37 srx->transport_type = local->srx.transport_type; in rxrpc_lookup_peer_icmp_rcu()
38 srx->transport_len = local->srx.transport_len; in rxrpc_lookup_peer_icmp_rcu()
39 srx->transport.family = local->srx.transport.family; in rxrpc_lookup_peer_icmp_rcu()
44 switch (srx->transport.family) { in rxrpc_lookup_peer_icmp_rcu()
46 srx->transport_len = sizeof(srx->transport.sin); in rxrpc_lookup_peer_icmp_rcu()
47 srx->transport.family = AF_INET; in rxrpc_lookup_peer_icmp_rcu()
48 srx->transport.sin.sin_port = serr->port; in rxrpc_lookup_peer_icmp_rcu()
49 switch (serr->ee.ee_origin) { in rxrpc_lookup_peer_icmp_rcu()
52 memcpy(&srx->transport.sin.sin_addr, in rxrpc_lookup_peer_icmp_rcu()
53 skb_network_header(skb) + serr->addr_offset, in rxrpc_lookup_peer_icmp_rcu()
58 memcpy(&srx->transport.sin.sin_addr, in rxrpc_lookup_peer_icmp_rcu()
59 skb_network_header(skb) + serr->addr_offset + 12, in rxrpc_lookup_peer_icmp_rcu()
63 memcpy(&srx->transport.sin.sin_addr, &ip_hdr(skb)->saddr, in rxrpc_lookup_peer_icmp_rcu()
71 switch (serr->ee.ee_origin) { in rxrpc_lookup_peer_icmp_rcu()
74 srx->transport.sin6.sin6_port = serr->port; in rxrpc_lookup_peer_icmp_rcu()
75 memcpy(&srx->transport.sin6.sin6_addr, in rxrpc_lookup_peer_icmp_rcu()
76 skb_network_header(skb) + serr->addr_offset, in rxrpc_lookup_peer_icmp_rcu()
81 srx->transport_len = sizeof(srx->transport.sin); in rxrpc_lookup_peer_icmp_rcu()
82 srx->transport.family = AF_INET; in rxrpc_lookup_peer_icmp_rcu()
83 srx->transport.sin.sin_port = serr->port; in rxrpc_lookup_peer_icmp_rcu()
84 memcpy(&srx->transport.sin.sin_addr, in rxrpc_lookup_peer_icmp_rcu()
85 skb_network_header(skb) + serr->addr_offset, in rxrpc_lookup_peer_icmp_rcu()
89 memcpy(&srx->transport.sin6.sin6_addr, in rxrpc_lookup_peer_icmp_rcu()
90 &ipv6_hdr(skb)->saddr, in rxrpc_lookup_peer_icmp_rcu()
101 return rxrpc_lookup_peer_rcu(local, srx); in rxrpc_lookup_peer_icmp_rcu()
109 u32 mtu = serr->ee.ee_info; in rxrpc_adjust_mtu()
113 /* wind down the local interface MTU */ in rxrpc_adjust_mtu()
114 if (mtu > 0 && peer->if_mtu == 65535 && mtu < peer->if_mtu) { in rxrpc_adjust_mtu()
115 peer->if_mtu = mtu; in rxrpc_adjust_mtu()
121 mtu = peer->if_mtu; in rxrpc_adjust_mtu()
127 mtu -= 100; in rxrpc_adjust_mtu()
128 if (mtu < peer->hdrsize) in rxrpc_adjust_mtu()
129 mtu = peer->hdrsize + 4; in rxrpc_adjust_mtu()
133 if (mtu < peer->mtu) { in rxrpc_adjust_mtu()
134 spin_lock_bh(&peer->lock); in rxrpc_adjust_mtu()
135 peer->mtu = mtu; in rxrpc_adjust_mtu()
136 peer->maxdata = peer->mtu - peer->hdrsize; in rxrpc_adjust_mtu()
137 spin_unlock_bh(&peer->lock); in rxrpc_adjust_mtu()
139 peer->mtu, peer->maxdata); in rxrpc_adjust_mtu()
144 * Handle an error received on the local endpoint.
150 struct rxrpc_local *local; in rxrpc_error_report() local
155 local = rcu_dereference_sk_user_data(sk); in rxrpc_error_report()
156 if (unlikely(!local)) { in rxrpc_error_report()
160 _enter("%p{%d}", sk, local->debug_id); in rxrpc_error_report()
175 if (!skb->len && serr->ee.ee_origin == SO_EE_ORIGIN_TIMESTAMPING) { in rxrpc_error_report()
182 peer = rxrpc_lookup_peer_icmp_rcu(local, skb, &srx); in rxrpc_error_report()
192 trace_rxrpc_rx_icmp(peer, &serr->ee, &srx); in rxrpc_error_report()
194 if ((serr->ee.ee_origin == SO_EE_ORIGIN_ICMP && in rxrpc_error_report()
195 serr->ee.ee_type == ICMP_DEST_UNREACH && in rxrpc_error_report()
196 serr->ee.ee_code == ICMP_FRAG_NEEDED)) { in rxrpc_error_report()
225 ee = &serr->ee; in rxrpc_store_error()
227 err = ee->ee_errno; in rxrpc_store_error()
229 switch (ee->ee_origin) { in rxrpc_store_error()
231 switch (ee->ee_type) { in rxrpc_store_error()
233 switch (ee->ee_code) { in rxrpc_store_error()
251 ee->ee_code); in rxrpc_store_error()
262 ee->ee_type, ee->ee_code); in rxrpc_store_error()
269 _proto("Rx Received local error { error=%d }", err); in rxrpc_store_error()
278 _proto("Rx Received error report { orig=%u }", ee->ee_origin); in rxrpc_store_error()
293 hlist_for_each_entry_rcu(call, &peer->error_targets, error_link) { in rxrpc_distribute_error()
295 rxrpc_set_call_completion(call, compl, 0, -error); in rxrpc_distribute_error()
300 * Perform keep-alive pings.
308 const u8 mask = ARRAY_SIZE(rxnet->peer_keepalive) - 1; in rxrpc_peer_keepalive_dispatch()
312 spin_lock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
315 peer = list_entry(collector->next, in rxrpc_peer_keepalive_dispatch()
318 list_del_init(&peer->keepalive_link); in rxrpc_peer_keepalive_dispatch()
322 if (__rxrpc_use_local(peer->local)) { in rxrpc_peer_keepalive_dispatch()
323 spin_unlock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
325 keepalive_at = peer->last_tx_at + RXRPC_KEEPALIVE_TIME; in rxrpc_peer_keepalive_dispatch()
326 slot = keepalive_at - base; in rxrpc_peer_keepalive_dispatch()
328 cursor, peer->debug_id, slot, &peer->srx.transport); in rxrpc_peer_keepalive_dispatch()
342 spin_lock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
343 list_add_tail(&peer->keepalive_link, in rxrpc_peer_keepalive_dispatch()
344 &rxnet->peer_keepalive[slot & mask]); in rxrpc_peer_keepalive_dispatch()
345 rxrpc_unuse_local(peer->local); in rxrpc_peer_keepalive_dispatch()
350 spin_unlock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
354 * Perform keep-alive pings with VERSION packets to keep any NAT alive.
360 const u8 mask = ARRAY_SIZE(rxnet->peer_keepalive) - 1; in rxrpc_peer_keepalive_worker()
362 u8 cursor, stop; in rxrpc_peer_keepalive_worker() local
366 base = rxnet->peer_keepalive_base; in rxrpc_peer_keepalive_worker()
367 cursor = rxnet->peer_keepalive_cursor; in rxrpc_peer_keepalive_worker()
368 _enter("%lld,%u", base - now, cursor); in rxrpc_peer_keepalive_worker()
370 if (!rxnet->live) in rxrpc_peer_keepalive_worker()
380 spin_lock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_worker()
381 list_splice_init(&rxnet->peer_keepalive_new, &collector); in rxrpc_peer_keepalive_worker()
383 stop = cursor + ARRAY_SIZE(rxnet->peer_keepalive); in rxrpc_peer_keepalive_worker()
384 while (base <= now && (s8)(cursor - stop) < 0) { in rxrpc_peer_keepalive_worker()
385 list_splice_tail_init(&rxnet->peer_keepalive[cursor & mask], in rxrpc_peer_keepalive_worker()
392 spin_unlock_bh(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_worker()
394 rxnet->peer_keepalive_base = base; in rxrpc_peer_keepalive_worker()
395 rxnet->peer_keepalive_cursor = cursor; in rxrpc_peer_keepalive_worker()
399 /* Schedule the timer for the next occupied timeslot. */ in rxrpc_peer_keepalive_worker()
400 cursor = rxnet->peer_keepalive_cursor; in rxrpc_peer_keepalive_worker()
401 stop = cursor + RXRPC_KEEPALIVE_TIME - 1; in rxrpc_peer_keepalive_worker()
402 for (; (s8)(cursor - stop) < 0; cursor++) { in rxrpc_peer_keepalive_worker()
403 if (!list_empty(&rxnet->peer_keepalive[cursor & mask])) in rxrpc_peer_keepalive_worker()
409 delay = base - now; in rxrpc_peer_keepalive_worker()
413 if (rxnet->live) in rxrpc_peer_keepalive_worker()
414 timer_reduce(&rxnet->peer_keepalive_timer, jiffies + delay); in rxrpc_peer_keepalive_worker()