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 /* Fall through and set IPv4 options too otherwise we don't get
169 * errors from IPv4 packets sent through the IPv6 socket.
173 /* we want to receive ICMP errors */
175 ret
= kernel_setsockopt(local
->socket
, SOL_IP
, IP_RECVERR
,
176 (char *) &opt
, sizeof(opt
));
178 _debug("setsockopt failed");
182 /* we want to set the don't fragment bit */
183 opt
= IP_PMTUDISC_DO
;
184 ret
= kernel_setsockopt(local
->socket
, SOL_IP
, IP_MTU_DISCOVER
,
185 (char *) &opt
, sizeof(opt
));
187 _debug("setsockopt failed");
191 /* We want receive timestamps. */
193 ret
= kernel_setsockopt(local
->socket
, SOL_SOCKET
, SO_TIMESTAMPNS_OLD
,
194 (char *)&opt
, sizeof(opt
));
196 _debug("setsockopt failed");
209 kernel_sock_shutdown(local
->socket
, SHUT_RDWR
);
210 local
->socket
->sk
->sk_user_data
= NULL
;
211 sock_release(local
->socket
);
212 local
->socket
= NULL
;
214 _leave(" = %d", ret
);
219 * Look up or create a new local endpoint using the specified local address.
221 struct rxrpc_local
*rxrpc_lookup_local(struct net
*net
,
222 const struct sockaddr_rxrpc
*srx
)
224 struct rxrpc_local
*local
;
225 struct rxrpc_net
*rxnet
= rxrpc_net(net
);
226 struct list_head
*cursor
;
231 _enter("{%d,%d,%pISp}",
232 srx
->transport_type
, srx
->transport
.family
, &srx
->transport
);
234 mutex_lock(&rxnet
->local_mutex
);
236 for (cursor
= rxnet
->local_endpoints
.next
;
237 cursor
!= &rxnet
->local_endpoints
;
238 cursor
= cursor
->next
) {
239 local
= list_entry(cursor
, struct rxrpc_local
, link
);
241 diff
= rxrpc_local_cmp_key(local
, srx
);
247 /* Services aren't allowed to share transport sockets, so
248 * reject that here. It is possible that the object is dying -
249 * but it may also still have the local transport address that
252 if (srx
->srx_service
) {
257 /* Found a match. We replace a dying object. Attempting to
258 * bind the transport socket may still fail if we're attempting
259 * to use a local address that the dying object is still using.
261 if (!rxrpc_use_local(local
))
268 local
= rxrpc_alloc_local(rxnet
, srx
);
272 ret
= rxrpc_open_socket(local
, net
);
276 if (cursor
!= &rxnet
->local_endpoints
)
277 list_replace_init(cursor
, &local
->link
);
279 list_add_tail(&local
->link
, cursor
);
283 mutex_unlock(&rxnet
->local_mutex
);
285 _net("LOCAL %s %d {%pISp}",
286 age
, local
->debug_id
, &local
->srx
.transport
);
288 _leave(" = %p", local
);
294 mutex_unlock(&rxnet
->local_mutex
);
296 call_rcu(&local
->rcu
, rxrpc_local_rcu
);
297 _leave(" = %d", ret
);
301 mutex_unlock(&rxnet
->local_mutex
);
302 _leave(" = -EADDRINUSE");
303 return ERR_PTR(-EADDRINUSE
);
307 * Get a ref on a local endpoint.
309 struct rxrpc_local
*rxrpc_get_local(struct rxrpc_local
*local
)
311 const void *here
= __builtin_return_address(0);
314 n
= atomic_inc_return(&local
->usage
);
315 trace_rxrpc_local(local
->debug_id
, rxrpc_local_got
, n
, here
);
320 * Get a ref on a local endpoint unless its usage has already reached 0.
322 struct rxrpc_local
*rxrpc_get_local_maybe(struct rxrpc_local
*local
)
324 const void *here
= __builtin_return_address(0);
327 int n
= atomic_fetch_add_unless(&local
->usage
, 1, 0);
329 trace_rxrpc_local(local
->debug_id
, rxrpc_local_got
,
338 * Queue a local endpoint and pass the caller's reference to the work item.
340 void rxrpc_queue_local(struct rxrpc_local
*local
)
342 const void *here
= __builtin_return_address(0);
343 unsigned int debug_id
= local
->debug_id
;
344 int n
= atomic_read(&local
->usage
);
346 if (rxrpc_queue_work(&local
->processor
))
347 trace_rxrpc_local(debug_id
, rxrpc_local_queued
, n
, here
);
349 rxrpc_put_local(local
);
353 * Drop a ref on a local endpoint.
355 void rxrpc_put_local(struct rxrpc_local
*local
)
357 const void *here
= __builtin_return_address(0);
358 unsigned int debug_id
;
362 debug_id
= local
->debug_id
;
364 n
= atomic_dec_return(&local
->usage
);
365 trace_rxrpc_local(debug_id
, rxrpc_local_put
, n
, here
);
368 call_rcu(&local
->rcu
, rxrpc_local_rcu
);
373 * Start using a local endpoint.
375 struct rxrpc_local
*rxrpc_use_local(struct rxrpc_local
*local
)
377 local
= rxrpc_get_local_maybe(local
);
381 if (!__rxrpc_use_local(local
)) {
382 rxrpc_put_local(local
);
390 * Cease using a local endpoint. Once the number of active users reaches 0, we
391 * start the closure of the transport in the work processor.
393 void rxrpc_unuse_local(struct rxrpc_local
*local
)
396 if (__rxrpc_unuse_local(local
)) {
397 rxrpc_get_local(local
);
398 rxrpc_queue_local(local
);
404 * Destroy a local endpoint's socket and then hand the record to RCU to dispose
407 * Closing the socket cannot be done from bottom half context or RCU callback
408 * context because it might sleep.
410 static void rxrpc_local_destroyer(struct rxrpc_local
*local
)
412 struct socket
*socket
= local
->socket
;
413 struct rxrpc_net
*rxnet
= local
->rxnet
;
415 _enter("%d", local
->debug_id
);
419 mutex_lock(&rxnet
->local_mutex
);
420 list_del_init(&local
->link
);
421 mutex_unlock(&rxnet
->local_mutex
);
423 rxrpc_clean_up_local_conns(local
);
424 rxrpc_service_connection_reaper(&rxnet
->service_conn_reaper
);
425 ASSERT(!local
->service
);
428 local
->socket
= NULL
;
429 kernel_sock_shutdown(socket
, SHUT_RDWR
);
430 socket
->sk
->sk_user_data
= NULL
;
431 sock_release(socket
);
434 /* At this point, there should be no more packets coming in to the
437 rxrpc_purge_queue(&local
->reject_queue
);
438 rxrpc_purge_queue(&local
->event_queue
);
442 * Process events on an endpoint. The work item carries a ref which
445 static void rxrpc_local_processor(struct work_struct
*work
)
447 struct rxrpc_local
*local
=
448 container_of(work
, struct rxrpc_local
, processor
);
451 trace_rxrpc_local(local
->debug_id
, rxrpc_local_processing
,
452 atomic_read(&local
->usage
), NULL
);
456 if (!__rxrpc_use_local(local
)) {
457 rxrpc_local_destroyer(local
);
461 if (!skb_queue_empty(&local
->reject_queue
)) {
462 rxrpc_reject_packets(local
);
466 if (!skb_queue_empty(&local
->event_queue
)) {
467 rxrpc_process_local_events(local
);
471 __rxrpc_unuse_local(local
);
474 rxrpc_put_local(local
);
478 * Destroy a local endpoint after the RCU grace period expires.
480 static void rxrpc_local_rcu(struct rcu_head
*rcu
)
482 struct rxrpc_local
*local
= container_of(rcu
, struct rxrpc_local
, rcu
);
484 _enter("%d", local
->debug_id
);
486 ASSERT(!work_pending(&local
->processor
));
488 _net("DESTROY LOCAL %d", local
->debug_id
);
494 * Verify the local endpoint list is empty by this point.
496 void rxrpc_destroy_all_locals(struct rxrpc_net
*rxnet
)
498 struct rxrpc_local
*local
;
502 flush_workqueue(rxrpc_workqueue
);
504 if (!list_empty(&rxnet
->local_endpoints
)) {
505 mutex_lock(&rxnet
->local_mutex
);
506 list_for_each_entry(local
, &rxnet
->local_endpoints
, link
) {
507 pr_err("AF_RXRPC: Leaked local %p {%d}\n",
508 local
, atomic_read(&local
->usage
));
510 mutex_unlock(&rxnet
->local_mutex
);