Lines Matching +full:local +full:- +full:timer +full:- +full:stop
1 // SPDX-License-Identifier: GPL-2.0-or-later
19 #include "ar-internal.h"
26 * Find the peer associated with a local error.
28 static struct rxrpc_peer *rxrpc_lookup_peer_local_rcu(struct rxrpc_local *local, in rxrpc_lookup_peer_local_rcu() argument
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()
97 return rxrpc_lookup_peer_rcu(local, srx); in rxrpc_lookup_peer_local_rcu()
105 /* wind down the local interface MTU */ in rxrpc_adjust_mtu()
106 if (mtu > 0 && peer->if_mtu == 65535 && mtu < peer->if_mtu) in rxrpc_adjust_mtu()
107 peer->if_mtu = mtu; in rxrpc_adjust_mtu()
111 mtu = peer->if_mtu; in rxrpc_adjust_mtu()
117 mtu -= 100; in rxrpc_adjust_mtu()
118 if (mtu < peer->hdrsize) in rxrpc_adjust_mtu()
119 mtu = peer->hdrsize + 4; in rxrpc_adjust_mtu()
123 if (mtu < peer->mtu) { in rxrpc_adjust_mtu()
124 spin_lock(&peer->lock); in rxrpc_adjust_mtu()
125 peer->mtu = mtu; in rxrpc_adjust_mtu()
126 peer->maxdata = peer->mtu - peer->hdrsize; in rxrpc_adjust_mtu()
127 spin_unlock(&peer->lock); in rxrpc_adjust_mtu()
132 * Handle an error received on the local endpoint.
134 void rxrpc_input_error(struct rxrpc_local *local, struct sk_buff *skb) in rxrpc_input_error() argument
140 _enter("L=%x", local->debug_id); in rxrpc_input_error()
142 if (!skb->len && serr->ee.ee_origin == SO_EE_ORIGIN_TIMESTAMPING) { in rxrpc_input_error()
148 peer = rxrpc_lookup_peer_local_rcu(local, skb, &srx); in rxrpc_input_error()
155 trace_rxrpc_rx_icmp(peer, &serr->ee, &srx); in rxrpc_input_error()
157 if ((serr->ee.ee_origin == SO_EE_ORIGIN_ICMP && in rxrpc_input_error()
158 serr->ee.ee_type == ICMP_DEST_UNREACH && in rxrpc_input_error()
159 serr->ee.ee_code == ICMP_FRAG_NEEDED)) { in rxrpc_input_error()
160 rxrpc_adjust_mtu(peer, serr->ee.ee_info); in rxrpc_input_error()
176 struct sock_extended_err *ee = &serr->ee; in rxrpc_store_error()
177 int err = ee->ee_errno; in rxrpc_store_error()
181 switch (ee->ee_origin) { in rxrpc_store_error()
208 spin_lock(&peer->lock); in rxrpc_distribute_error()
209 hlist_move_list(&peer->error_targets, &error_targets); in rxrpc_distribute_error()
214 hlist_del_init(&call->error_link); in rxrpc_distribute_error()
215 spin_unlock(&peer->lock); in rxrpc_distribute_error()
218 rxrpc_set_call_completion(call, compl, 0, -err); in rxrpc_distribute_error()
221 spin_lock(&peer->lock); in rxrpc_distribute_error()
224 spin_unlock(&peer->lock); in rxrpc_distribute_error()
228 * Perform keep-alive pings.
236 const u8 mask = ARRAY_SIZE(rxnet->peer_keepalive) - 1; in rxrpc_peer_keepalive_dispatch()
241 spin_lock(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
244 peer = list_entry(collector->next, in rxrpc_peer_keepalive_dispatch()
247 list_del_init(&peer->keepalive_link); in rxrpc_peer_keepalive_dispatch()
251 use = __rxrpc_use_local(peer->local, rxrpc_local_use_peer_keepalive); in rxrpc_peer_keepalive_dispatch()
252 spin_unlock(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
255 keepalive_at = peer->last_tx_at + RXRPC_KEEPALIVE_TIME; in rxrpc_peer_keepalive_dispatch()
256 slot = keepalive_at - base; in rxrpc_peer_keepalive_dispatch()
258 cursor, peer->debug_id, slot, &peer->srx.transport); in rxrpc_peer_keepalive_dispatch()
272 spin_lock(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
273 list_add_tail(&peer->keepalive_link, in rxrpc_peer_keepalive_dispatch()
274 &rxnet->peer_keepalive[slot & mask]); in rxrpc_peer_keepalive_dispatch()
275 spin_unlock(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
276 rxrpc_unuse_local(peer->local, rxrpc_local_unuse_peer_keepalive); in rxrpc_peer_keepalive_dispatch()
279 spin_lock(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
282 spin_unlock(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_dispatch()
286 * Perform keep-alive pings with VERSION packets to keep any NAT alive.
292 const u8 mask = ARRAY_SIZE(rxnet->peer_keepalive) - 1; in rxrpc_peer_keepalive_worker()
294 u8 cursor, stop; in rxrpc_peer_keepalive_worker() local
298 base = rxnet->peer_keepalive_base; in rxrpc_peer_keepalive_worker()
299 cursor = rxnet->peer_keepalive_cursor; in rxrpc_peer_keepalive_worker()
300 _enter("%lld,%u", base - now, cursor); in rxrpc_peer_keepalive_worker()
302 if (!rxnet->live) in rxrpc_peer_keepalive_worker()
312 spin_lock(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_worker()
313 list_splice_init(&rxnet->peer_keepalive_new, &collector); in rxrpc_peer_keepalive_worker()
315 stop = cursor + ARRAY_SIZE(rxnet->peer_keepalive); in rxrpc_peer_keepalive_worker()
316 while (base <= now && (s8)(cursor - stop) < 0) { in rxrpc_peer_keepalive_worker()
317 list_splice_tail_init(&rxnet->peer_keepalive[cursor & mask], in rxrpc_peer_keepalive_worker()
324 spin_unlock(&rxnet->peer_hash_lock); in rxrpc_peer_keepalive_worker()
326 rxnet->peer_keepalive_base = base; in rxrpc_peer_keepalive_worker()
327 rxnet->peer_keepalive_cursor = cursor; in rxrpc_peer_keepalive_worker()
331 /* Schedule the timer for the next occupied timeslot. */ in rxrpc_peer_keepalive_worker()
332 cursor = rxnet->peer_keepalive_cursor; in rxrpc_peer_keepalive_worker()
333 stop = cursor + RXRPC_KEEPALIVE_TIME - 1; in rxrpc_peer_keepalive_worker()
334 for (; (s8)(cursor - stop) < 0; cursor++) { in rxrpc_peer_keepalive_worker()
335 if (!list_empty(&rxnet->peer_keepalive[cursor & mask])) in rxrpc_peer_keepalive_worker()
341 delay = base - now; in rxrpc_peer_keepalive_worker()
345 if (rxnet->live) in rxrpc_peer_keepalive_worker()
346 timer_reduce(&rxnet->peer_keepalive_timer, jiffies + delay); in rxrpc_peer_keepalive_worker()