peer_event.c 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /* Peer event handling, typically ICMP messages.
  3. *
  4. * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
  5. * Written by David Howells (dhowells@redhat.com)
  6. */
  7. #include <linux/module.h>
  8. #include <linux/net.h>
  9. #include <linux/skbuff.h>
  10. #include <linux/errqueue.h>
  11. #include <linux/udp.h>
  12. #include <linux/in.h>
  13. #include <linux/in6.h>
  14. #include <linux/icmp.h>
  15. #include <net/sock.h>
  16. #include <net/af_rxrpc.h>
  17. #include <net/ip.h>
  18. #include "ar-internal.h"
  19. static void rxrpc_store_error(struct rxrpc_peer *, struct sk_buff *);
  20. static void rxrpc_distribute_error(struct rxrpc_peer *, struct sk_buff *,
  21. enum rxrpc_call_completion, int);
  22. /*
  23. * Find the peer associated with a local error.
  24. */
  25. static struct rxrpc_peer *rxrpc_lookup_peer_local_rcu(struct rxrpc_local *local,
  26. const struct sk_buff *skb,
  27. struct sockaddr_rxrpc *srx)
  28. {
  29. struct sock_exterr_skb *serr = SKB_EXT_ERR(skb);
  30. _enter("");
  31. memset(srx, 0, sizeof(*srx));
  32. srx->transport_type = local->srx.transport_type;
  33. srx->transport_len = local->srx.transport_len;
  34. srx->transport.family = local->srx.transport.family;
  35. /* Can we see an ICMP4 packet on an ICMP6 listening socket? and vice
  36. * versa?
  37. */
  38. switch (srx->transport.family) {
  39. case AF_INET:
  40. srx->transport_len = sizeof(srx->transport.sin);
  41. srx->transport.family = AF_INET;
  42. srx->transport.sin.sin_port = serr->port;
  43. switch (serr->ee.ee_origin) {
  44. case SO_EE_ORIGIN_ICMP:
  45. memcpy(&srx->transport.sin.sin_addr,
  46. skb_network_header(skb) + serr->addr_offset,
  47. sizeof(struct in_addr));
  48. break;
  49. case SO_EE_ORIGIN_ICMP6:
  50. memcpy(&srx->transport.sin.sin_addr,
  51. skb_network_header(skb) + serr->addr_offset + 12,
  52. sizeof(struct in_addr));
  53. break;
  54. default:
  55. memcpy(&srx->transport.sin.sin_addr, &ip_hdr(skb)->saddr,
  56. sizeof(struct in_addr));
  57. break;
  58. }
  59. break;
  60. #ifdef CONFIG_AF_RXRPC_IPV6
  61. case AF_INET6:
  62. switch (serr->ee.ee_origin) {
  63. case SO_EE_ORIGIN_ICMP6:
  64. srx->transport.sin6.sin6_port = serr->port;
  65. memcpy(&srx->transport.sin6.sin6_addr,
  66. skb_network_header(skb) + serr->addr_offset,
  67. sizeof(struct in6_addr));
  68. break;
  69. case SO_EE_ORIGIN_ICMP:
  70. srx->transport_len = sizeof(srx->transport.sin);
  71. srx->transport.family = AF_INET;
  72. srx->transport.sin.sin_port = serr->port;
  73. memcpy(&srx->transport.sin.sin_addr,
  74. skb_network_header(skb) + serr->addr_offset,
  75. sizeof(struct in_addr));
  76. break;
  77. default:
  78. memcpy(&srx->transport.sin6.sin6_addr,
  79. &ipv6_hdr(skb)->saddr,
  80. sizeof(struct in6_addr));
  81. break;
  82. }
  83. break;
  84. #endif
  85. default:
  86. BUG();
  87. }
  88. return rxrpc_lookup_peer_rcu(local, srx);
  89. }
  90. /*
  91. * Handle an MTU/fragmentation problem.
  92. */
  93. static void rxrpc_adjust_mtu(struct rxrpc_peer *peer, unsigned int mtu)
  94. {
  95. /* wind down the local interface MTU */
  96. if (mtu > 0 && peer->if_mtu == 65535 && mtu < peer->if_mtu)
  97. peer->if_mtu = mtu;
  98. if (mtu == 0) {
  99. /* they didn't give us a size, estimate one */
  100. mtu = peer->if_mtu;
  101. if (mtu > 1500) {
  102. mtu >>= 1;
  103. if (mtu < 1500)
  104. mtu = 1500;
  105. } else {
  106. mtu -= 100;
  107. if (mtu < peer->hdrsize)
  108. mtu = peer->hdrsize + 4;
  109. }
  110. }
  111. if (mtu < peer->mtu) {
  112. spin_lock(&peer->lock);
  113. peer->mtu = mtu;
  114. peer->maxdata = peer->mtu - peer->hdrsize;
  115. spin_unlock(&peer->lock);
  116. }
  117. }
  118. /*
  119. * Handle an error received on the local endpoint.
  120. */
  121. void rxrpc_input_error(struct rxrpc_local *local, struct sk_buff *skb)
  122. {
  123. struct sock_exterr_skb *serr = SKB_EXT_ERR(skb);
  124. struct sockaddr_rxrpc srx;
  125. struct rxrpc_peer *peer = NULL;
  126. _enter("L=%x", local->debug_id);
  127. if (!skb->len && serr->ee.ee_origin == SO_EE_ORIGIN_TIMESTAMPING) {
  128. _leave("UDP empty message");
  129. return;
  130. }
  131. rcu_read_lock();
  132. peer = rxrpc_lookup_peer_local_rcu(local, skb, &srx);
  133. if (peer && !rxrpc_get_peer_maybe(peer, rxrpc_peer_get_input_error))
  134. peer = NULL;
  135. rcu_read_unlock();
  136. if (!peer)
  137. return;
  138. trace_rxrpc_rx_icmp(peer, &serr->ee, &srx);
  139. if ((serr->ee.ee_origin == SO_EE_ORIGIN_ICMP &&
  140. serr->ee.ee_type == ICMP_DEST_UNREACH &&
  141. serr->ee.ee_code == ICMP_FRAG_NEEDED)) {
  142. rxrpc_adjust_mtu(peer, serr->ee.ee_info);
  143. goto out;
  144. }
  145. rxrpc_store_error(peer, skb);
  146. out:
  147. rxrpc_put_peer(peer, rxrpc_peer_put_input_error);
  148. }
  149. /*
  150. * Map an error report to error codes on the peer record.
  151. */
  152. static void rxrpc_store_error(struct rxrpc_peer *peer, struct sk_buff *skb)
  153. {
  154. enum rxrpc_call_completion compl = RXRPC_CALL_NETWORK_ERROR;
  155. struct sock_exterr_skb *serr = SKB_EXT_ERR(skb);
  156. struct sock_extended_err *ee = &serr->ee;
  157. int err = ee->ee_errno;
  158. _enter("");
  159. switch (ee->ee_origin) {
  160. case SO_EE_ORIGIN_NONE:
  161. case SO_EE_ORIGIN_LOCAL:
  162. compl = RXRPC_CALL_LOCAL_ERROR;
  163. break;
  164. case SO_EE_ORIGIN_ICMP6:
  165. if (err == EACCES)
  166. err = EHOSTUNREACH;
  167. fallthrough;
  168. case SO_EE_ORIGIN_ICMP:
  169. default:
  170. break;
  171. }
  172. rxrpc_distribute_error(peer, skb, compl, err);
  173. }
  174. /*
  175. * Distribute an error that occurred on a peer.
  176. */
  177. static void rxrpc_distribute_error(struct rxrpc_peer *peer, struct sk_buff *skb,
  178. enum rxrpc_call_completion compl, int err)
  179. {
  180. struct rxrpc_call *call;
  181. HLIST_HEAD(error_targets);
  182. spin_lock(&peer->lock);
  183. hlist_move_list(&peer->error_targets, &error_targets);
  184. while (!hlist_empty(&error_targets)) {
  185. call = hlist_entry(error_targets.first,
  186. struct rxrpc_call, error_link);
  187. hlist_del_init(&call->error_link);
  188. spin_unlock(&peer->lock);
  189. rxrpc_see_call(call, rxrpc_call_see_distribute_error);
  190. rxrpc_set_call_completion(call, compl, 0, -err);
  191. rxrpc_input_call_event(call, skb);
  192. spin_lock(&peer->lock);
  193. }
  194. spin_unlock(&peer->lock);
  195. }
  196. /*
  197. * Perform keep-alive pings.
  198. */
  199. static void rxrpc_peer_keepalive_dispatch(struct rxrpc_net *rxnet,
  200. struct list_head *collector,
  201. time64_t base,
  202. u8 cursor)
  203. {
  204. struct rxrpc_peer *peer;
  205. const u8 mask = ARRAY_SIZE(rxnet->peer_keepalive) - 1;
  206. time64_t keepalive_at;
  207. bool use;
  208. int slot;
  209. spin_lock_bh(&rxnet->peer_hash_lock);
  210. while (!list_empty(collector)) {
  211. peer = list_entry(collector->next,
  212. struct rxrpc_peer, keepalive_link);
  213. list_del_init(&peer->keepalive_link);
  214. if (!rxrpc_get_peer_maybe(peer, rxrpc_peer_get_keepalive))
  215. continue;
  216. use = __rxrpc_use_local(peer->local, rxrpc_local_use_peer_keepalive);
  217. spin_unlock_bh(&rxnet->peer_hash_lock);
  218. if (use) {
  219. keepalive_at = peer->last_tx_at + RXRPC_KEEPALIVE_TIME;
  220. slot = keepalive_at - base;
  221. _debug("%02x peer %u t=%d {%pISp}",
  222. cursor, peer->debug_id, slot, &peer->srx.transport);
  223. if (keepalive_at <= base ||
  224. keepalive_at > base + RXRPC_KEEPALIVE_TIME) {
  225. rxrpc_send_keepalive(peer);
  226. slot = RXRPC_KEEPALIVE_TIME;
  227. }
  228. /* A transmission to this peer occurred since last we
  229. * examined it so put it into the appropriate future
  230. * bucket.
  231. */
  232. slot += cursor;
  233. slot &= mask;
  234. spin_lock_bh(&rxnet->peer_hash_lock);
  235. list_add_tail(&peer->keepalive_link,
  236. &rxnet->peer_keepalive[slot & mask]);
  237. spin_unlock_bh(&rxnet->peer_hash_lock);
  238. rxrpc_unuse_local(peer->local, rxrpc_local_unuse_peer_keepalive);
  239. }
  240. rxrpc_put_peer(peer, rxrpc_peer_put_keepalive);
  241. spin_lock_bh(&rxnet->peer_hash_lock);
  242. }
  243. spin_unlock_bh(&rxnet->peer_hash_lock);
  244. }
  245. /*
  246. * Perform keep-alive pings with VERSION packets to keep any NAT alive.
  247. */
  248. void rxrpc_peer_keepalive_worker(struct work_struct *work)
  249. {
  250. struct rxrpc_net *rxnet =
  251. container_of(work, struct rxrpc_net, peer_keepalive_work);
  252. const u8 mask = ARRAY_SIZE(rxnet->peer_keepalive) - 1;
  253. time64_t base, now, delay;
  254. u8 cursor, stop;
  255. LIST_HEAD(collector);
  256. now = ktime_get_seconds();
  257. base = rxnet->peer_keepalive_base;
  258. cursor = rxnet->peer_keepalive_cursor;
  259. _enter("%lld,%u", base - now, cursor);
  260. if (!rxnet->live)
  261. return;
  262. /* Remove to a temporary list all the peers that are currently lodged
  263. * in expired buckets plus all new peers.
  264. *
  265. * Everything in the bucket at the cursor is processed this
  266. * second; the bucket at cursor + 1 goes at now + 1s and so
  267. * on...
  268. */
  269. spin_lock_bh(&rxnet->peer_hash_lock);
  270. list_splice_init(&rxnet->peer_keepalive_new, &collector);
  271. stop = cursor + ARRAY_SIZE(rxnet->peer_keepalive);
  272. while (base <= now && (s8)(cursor - stop) < 0) {
  273. list_splice_tail_init(&rxnet->peer_keepalive[cursor & mask],
  274. &collector);
  275. base++;
  276. cursor++;
  277. }
  278. base = now;
  279. spin_unlock_bh(&rxnet->peer_hash_lock);
  280. rxnet->peer_keepalive_base = base;
  281. rxnet->peer_keepalive_cursor = cursor;
  282. rxrpc_peer_keepalive_dispatch(rxnet, &collector, base, cursor);
  283. ASSERT(list_empty(&collector));
  284. /* Schedule the timer for the next occupied timeslot. */
  285. cursor = rxnet->peer_keepalive_cursor;
  286. stop = cursor + RXRPC_KEEPALIVE_TIME - 1;
  287. for (; (s8)(cursor - stop) < 0; cursor++) {
  288. if (!list_empty(&rxnet->peer_keepalive[cursor & mask]))
  289. break;
  290. base++;
  291. }
  292. now = ktime_get_seconds();
  293. delay = base - now;
  294. if (delay < 1)
  295. delay = 1;
  296. delay *= HZ;
  297. if (rxnet->live)
  298. timer_reduce(&rxnet->peer_keepalive_timer, jiffies + delay);
  299. _leave("");
  300. }