1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* Local endpoint object management
4 * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10 #include <linux/module.h>
11 #include <linux/net.h>
12 #include <linux/skbuff.h>
13 #include <linux/slab.h>
14 #include <linux/udp.h>
16 #include <linux/hashtable.h>
19 #include <net/af_rxrpc.h>
20 #include "ar-internal.h"
22 static void rxrpc_local_processor(struct work_struct
*);
23 static void rxrpc_local_rcu(struct rcu_head
*);
26 * Compare a local to an address. Return -ve, 0 or +ve to indicate less than,
27 * same or greater than.
29 * We explicitly don't compare the RxRPC service ID as we want to reject
30 * conflicting uses by differing services. Further, we don't want to share
31 * addresses with different options (IPv6), so we don't compare those bits
34 static long rxrpc_local_cmp_key(const struct rxrpc_local
*local
,
35 const struct sockaddr_rxrpc
*srx
)
39 diff
= ((local
->srx
.transport_type
- srx
->transport_type
) ?:
40 (local
->srx
.transport_len
- srx
->transport_len
) ?:
41 (local
->srx
.transport
.family
- srx
->transport
.family
));
45 switch (srx
->transport
.family
) {
47 /* If the choice of UDP port is left up to the transport, then
48 * the endpoint record doesn't match.
50 return ((u16 __force
)local
->srx
.transport
.sin
.sin_port
-
51 (u16 __force
)srx
->transport
.sin
.sin_port
) ?:
52 memcmp(&local
->srx
.transport
.sin
.sin_addr
,
53 &srx
->transport
.sin
.sin_addr
,
54 sizeof(struct in_addr
));
55 #ifdef CONFIG_AF_RXRPC_IPV6
57 /* If the choice of UDP6 port is left up to the transport, then
58 * the endpoint record doesn't match.
60 return ((u16 __force
)local
->srx
.transport
.sin6
.sin6_port
-
61 (u16 __force
)srx
->transport
.sin6
.sin6_port
) ?:
62 memcmp(&local
->srx
.transport
.sin6
.sin6_addr
,
63 &srx
->transport
.sin6
.sin6_addr
,
64 sizeof(struct in6_addr
));
72 * Allocate a new local endpoint.
74 static struct rxrpc_local
*rxrpc_alloc_local(struct rxrpc_net
*rxnet
,
75 const struct sockaddr_rxrpc
*srx
)
77 struct rxrpc_local
*local
;
79 local
= kzalloc(sizeof(struct rxrpc_local
), GFP_KERNEL
);
81 atomic_set(&local
->usage
, 1);
82 atomic_set(&local
->active_users
, 1);
84 INIT_LIST_HEAD(&local
->link
);
85 INIT_WORK(&local
->processor
, rxrpc_local_processor
);
86 init_rwsem(&local
->defrag_sem
);
87 skb_queue_head_init(&local
->reject_queue
);
88 skb_queue_head_init(&local
->event_queue
);
89 local
->client_conns
= RB_ROOT
;
90 spin_lock_init(&local
->client_conns_lock
);
91 spin_lock_init(&local
->lock
);
92 rwlock_init(&local
->services_lock
);
93 local
->debug_id
= atomic_inc_return(&rxrpc_debug_id
);
94 memcpy(&local
->srx
, srx
, sizeof(*srx
));
95 local
->srx
.srx_service
= 0;
96 trace_rxrpc_local(local
->debug_id
, rxrpc_local_new
, 1, NULL
);
99 _leave(" = %p", local
);
104 * create the local socket
105 * - must be called with rxrpc_local_mutex locked
107 static int rxrpc_open_socket(struct rxrpc_local
*local
, struct net
*net
)
113 local
, local
->srx
.transport_type
, local
->srx
.transport
.family
);
115 /* create a socket to represent the local endpoint */
116 ret
= sock_create_kern(net
, local
->srx
.transport
.family
,
117 local
->srx
.transport_type
, 0, &local
->socket
);
119 _leave(" = %d [socket]", ret
);
123 /* set the socket up */
124 usk
= local
->socket
->sk
;
125 inet_sk(usk
)->mc_loop
= 0;
127 /* Enable CHECKSUM_UNNECESSARY to CHECKSUM_COMPLETE conversion */
128 inet_inc_convert_csum(usk
);
130 rcu_assign_sk_user_data(usk
, local
);
132 udp_sk(usk
)->encap_type
= UDP_ENCAP_RXRPC
;
133 udp_sk(usk
)->encap_rcv
= rxrpc_input_packet
;
134 udp_sk(usk
)->encap_destroy
= NULL
;
135 udp_sk(usk
)->gro_receive
= NULL
;
136 udp_sk(usk
)->gro_complete
= NULL
;
139 #if IS_ENABLED(CONFIG_AF_RXRPC_IPV6)
140 if (local
->srx
.transport
.family
== AF_INET6
)
141 udpv6_encap_enable();
143 usk
->sk_error_report
= rxrpc_error_report
;
145 /* if a local address was supplied then bind it */
146 if (local
->srx
.transport_len
> sizeof(sa_family_t
)) {
148 ret
= kernel_bind(local
->socket
,
149 (struct sockaddr
*)&local
->srx
.transport
,
150 local
->srx
.transport_len
);
152 _debug("bind failed %d", ret
);
157 switch (local
->srx
.transport
.family
) {
159 /* we want to receive ICMPv6 errors */
161 ret
= kernel_setsockopt(local
->socket
, SOL_IPV6
, IPV6_RECVERR
,
162 (char *) &opt
, sizeof(opt
));
164 _debug("setsockopt failed");
168 /* we want to set the don't fragment bit */
169 opt
= IPV6_PMTUDISC_DO
;
170 ret
= kernel_setsockopt(local
->socket
, SOL_IPV6
, IPV6_MTU_DISCOVER
,
171 (char *) &opt
, sizeof(opt
));
173 _debug("setsockopt failed");
177 /* Fall through and set IPv4 options too otherwise we don't get
178 * errors from IPv4 packets sent through the IPv6 socket.
182 /* we want to receive ICMP errors */
184 ret
= kernel_setsockopt(local
->socket
, SOL_IP
, IP_RECVERR
,
185 (char *) &opt
, sizeof(opt
));
187 _debug("setsockopt failed");
191 /* we want to set the don't fragment bit */
192 opt
= IP_PMTUDISC_DO
;
193 ret
= kernel_setsockopt(local
->socket
, SOL_IP
, IP_MTU_DISCOVER
,
194 (char *) &opt
, sizeof(opt
));
196 _debug("setsockopt failed");
200 /* We want receive timestamps. */
202 ret
= kernel_setsockopt(local
->socket
, SOL_SOCKET
, SO_TIMESTAMPNS_OLD
,
203 (char *)&opt
, sizeof(opt
));
205 _debug("setsockopt failed");
218 kernel_sock_shutdown(local
->socket
, SHUT_RDWR
);
219 local
->socket
->sk
->sk_user_data
= NULL
;
220 sock_release(local
->socket
);
221 local
->socket
= NULL
;
223 _leave(" = %d", ret
);
228 * Look up or create a new local endpoint using the specified local address.
230 struct rxrpc_local
*rxrpc_lookup_local(struct net
*net
,
231 const struct sockaddr_rxrpc
*srx
)
233 struct rxrpc_local
*local
;
234 struct rxrpc_net
*rxnet
= rxrpc_net(net
);
235 struct list_head
*cursor
;
240 _enter("{%d,%d,%pISp}",
241 srx
->transport_type
, srx
->transport
.family
, &srx
->transport
);
243 mutex_lock(&rxnet
->local_mutex
);
245 for (cursor
= rxnet
->local_endpoints
.next
;
246 cursor
!= &rxnet
->local_endpoints
;
247 cursor
= cursor
->next
) {
248 local
= list_entry(cursor
, struct rxrpc_local
, link
);
250 diff
= rxrpc_local_cmp_key(local
, srx
);
256 /* Services aren't allowed to share transport sockets, so
257 * reject that here. It is possible that the object is dying -
258 * but it may also still have the local transport address that
261 if (srx
->srx_service
) {
266 /* Found a match. We replace a dying object. Attempting to
267 * bind the transport socket may still fail if we're attempting
268 * to use a local address that the dying object is still using.
270 if (!rxrpc_use_local(local
))
277 local
= rxrpc_alloc_local(rxnet
, srx
);
281 ret
= rxrpc_open_socket(local
, net
);
285 if (cursor
!= &rxnet
->local_endpoints
)
286 list_replace_init(cursor
, &local
->link
);
288 list_add_tail(&local
->link
, cursor
);
292 mutex_unlock(&rxnet
->local_mutex
);
294 _net("LOCAL %s %d {%pISp}",
295 age
, local
->debug_id
, &local
->srx
.transport
);
297 _leave(" = %p", local
);
303 mutex_unlock(&rxnet
->local_mutex
);
305 call_rcu(&local
->rcu
, rxrpc_local_rcu
);
306 _leave(" = %d", ret
);
310 mutex_unlock(&rxnet
->local_mutex
);
311 _leave(" = -EADDRINUSE");
312 return ERR_PTR(-EADDRINUSE
);
316 * Get a ref on a local endpoint.
318 struct rxrpc_local
*rxrpc_get_local(struct rxrpc_local
*local
)
320 const void *here
= __builtin_return_address(0);
323 n
= atomic_inc_return(&local
->usage
);
324 trace_rxrpc_local(local
->debug_id
, rxrpc_local_got
, n
, here
);
329 * Get a ref on a local endpoint unless its usage has already reached 0.
331 struct rxrpc_local
*rxrpc_get_local_maybe(struct rxrpc_local
*local
)
333 const void *here
= __builtin_return_address(0);
336 int n
= atomic_fetch_add_unless(&local
->usage
, 1, 0);
338 trace_rxrpc_local(local
->debug_id
, rxrpc_local_got
,
347 * Queue a local endpoint and pass the caller's reference to the work item.
349 void rxrpc_queue_local(struct rxrpc_local
*local
)
351 const void *here
= __builtin_return_address(0);
352 unsigned int debug_id
= local
->debug_id
;
353 int n
= atomic_read(&local
->usage
);
355 if (rxrpc_queue_work(&local
->processor
))
356 trace_rxrpc_local(debug_id
, rxrpc_local_queued
, n
, here
);
358 rxrpc_put_local(local
);
362 * Drop a ref on a local endpoint.
364 void rxrpc_put_local(struct rxrpc_local
*local
)
366 const void *here
= __builtin_return_address(0);
370 n
= atomic_dec_return(&local
->usage
);
371 trace_rxrpc_local(local
->debug_id
, rxrpc_local_put
, n
, here
);
374 call_rcu(&local
->rcu
, rxrpc_local_rcu
);
379 * Start using a local endpoint.
381 struct rxrpc_local
*rxrpc_use_local(struct rxrpc_local
*local
)
385 local
= rxrpc_get_local_maybe(local
);
389 au
= atomic_fetch_add_unless(&local
->active_users
, 1, 0);
391 rxrpc_put_local(local
);
399 * Cease using a local endpoint. Once the number of active users reaches 0, we
400 * start the closure of the transport in the work processor.
402 void rxrpc_unuse_local(struct rxrpc_local
*local
)
407 au
= atomic_dec_return(&local
->active_users
);
409 rxrpc_queue_local(local
);
411 rxrpc_put_local(local
);
416 * Destroy a local endpoint's socket and then hand the record to RCU to dispose
419 * Closing the socket cannot be done from bottom half context or RCU callback
420 * context because it might sleep.
422 static void rxrpc_local_destroyer(struct rxrpc_local
*local
)
424 struct socket
*socket
= local
->socket
;
425 struct rxrpc_net
*rxnet
= local
->rxnet
;
427 _enter("%d", local
->debug_id
);
431 mutex_lock(&rxnet
->local_mutex
);
432 list_del_init(&local
->link
);
433 mutex_unlock(&rxnet
->local_mutex
);
435 rxrpc_clean_up_local_conns(local
);
436 rxrpc_service_connection_reaper(&rxnet
->service_conn_reaper
);
437 ASSERT(!local
->service
);
440 local
->socket
= NULL
;
441 kernel_sock_shutdown(socket
, SHUT_RDWR
);
442 socket
->sk
->sk_user_data
= NULL
;
443 sock_release(socket
);
446 /* At this point, there should be no more packets coming in to the
449 rxrpc_purge_queue(&local
->reject_queue
);
450 rxrpc_purge_queue(&local
->event_queue
);
454 * Process events on an endpoint. The work item carries a ref which
457 static void rxrpc_local_processor(struct work_struct
*work
)
459 struct rxrpc_local
*local
=
460 container_of(work
, struct rxrpc_local
, processor
);
463 trace_rxrpc_local(local
->debug_id
, rxrpc_local_processing
,
464 atomic_read(&local
->usage
), NULL
);
468 if (atomic_read(&local
->active_users
) == 0) {
469 rxrpc_local_destroyer(local
);
473 if (!skb_queue_empty(&local
->reject_queue
)) {
474 rxrpc_reject_packets(local
);
478 if (!skb_queue_empty(&local
->event_queue
)) {
479 rxrpc_process_local_events(local
);
484 rxrpc_put_local(local
);
488 * Destroy a local endpoint after the RCU grace period expires.
490 static void rxrpc_local_rcu(struct rcu_head
*rcu
)
492 struct rxrpc_local
*local
= container_of(rcu
, struct rxrpc_local
, rcu
);
494 _enter("%d", local
->debug_id
);
496 ASSERT(!work_pending(&local
->processor
));
498 _net("DESTROY LOCAL %d", local
->debug_id
);
504 * Verify the local endpoint list is empty by this point.
506 void rxrpc_destroy_all_locals(struct rxrpc_net
*rxnet
)
508 struct rxrpc_local
*local
;
512 flush_workqueue(rxrpc_workqueue
);
514 if (!list_empty(&rxnet
->local_endpoints
)) {
515 mutex_lock(&rxnet
->local_mutex
);
516 list_for_each_entry(local
, &rxnet
->local_endpoints
, link
) {
517 pr_err("AF_RXRPC: Leaked local %p {%d}\n",
518 local
, atomic_read(&local
->usage
));
520 mutex_unlock(&rxnet
->local_mutex
);