linux/net/rxrpc/local_object.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/* Local endpoint object management
   3 *
   4 * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved.
   5 * Written by David Howells (dhowells@redhat.com)
   6 */
   7
   8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   9
  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>
  15#include <linux/ip.h>
  16#include <linux/hashtable.h>
  17#include <net/sock.h>
  18#include <net/udp.h>
  19#include <net/udp_tunnel.h>
  20#include <net/af_rxrpc.h>
  21#include "ar-internal.h"
  22
  23static void rxrpc_local_processor(struct work_struct *);
  24static void rxrpc_local_rcu(struct rcu_head *);
  25
  26/*
  27 * Compare a local to an address.  Return -ve, 0 or +ve to indicate less than,
  28 * same or greater than.
  29 *
  30 * We explicitly don't compare the RxRPC service ID as we want to reject
  31 * conflicting uses by differing services.  Further, we don't want to share
  32 * addresses with different options (IPv6), so we don't compare those bits
  33 * either.
  34 */
  35static long rxrpc_local_cmp_key(const struct rxrpc_local *local,
  36                                const struct sockaddr_rxrpc *srx)
  37{
  38        long diff;
  39
  40        diff = ((local->srx.transport_type - srx->transport_type) ?:
  41                (local->srx.transport_len - srx->transport_len) ?:
  42                (local->srx.transport.family - srx->transport.family));
  43        if (diff != 0)
  44                return diff;
  45
  46        switch (srx->transport.family) {
  47        case AF_INET:
  48                /* If the choice of UDP port is left up to the transport, then
  49                 * the endpoint record doesn't match.
  50                 */
  51                return ((u16 __force)local->srx.transport.sin.sin_port -
  52                        (u16 __force)srx->transport.sin.sin_port) ?:
  53                        memcmp(&local->srx.transport.sin.sin_addr,
  54                               &srx->transport.sin.sin_addr,
  55                               sizeof(struct in_addr));
  56#ifdef CONFIG_AF_RXRPC_IPV6
  57        case AF_INET6:
  58                /* If the choice of UDP6 port is left up to the transport, then
  59                 * the endpoint record doesn't match.
  60                 */
  61                return ((u16 __force)local->srx.transport.sin6.sin6_port -
  62                        (u16 __force)srx->transport.sin6.sin6_port) ?:
  63                        memcmp(&local->srx.transport.sin6.sin6_addr,
  64                               &srx->transport.sin6.sin6_addr,
  65                               sizeof(struct in6_addr));
  66#endif
  67        default:
  68                BUG();
  69        }
  70}
  71
  72/*
  73 * Allocate a new local endpoint.
  74 */
  75static struct rxrpc_local *rxrpc_alloc_local(struct rxrpc_net *rxnet,
  76                                             const struct sockaddr_rxrpc *srx)
  77{
  78        struct rxrpc_local *local;
  79
  80        local = kzalloc(sizeof(struct rxrpc_local), GFP_KERNEL);
  81        if (local) {
  82                atomic_set(&local->usage, 1);
  83                atomic_set(&local->active_users, 1);
  84                local->rxnet = rxnet;
  85                INIT_LIST_HEAD(&local->link);
  86                INIT_WORK(&local->processor, rxrpc_local_processor);
  87                init_rwsem(&local->defrag_sem);
  88                skb_queue_head_init(&local->reject_queue);
  89                skb_queue_head_init(&local->event_queue);
  90                local->client_bundles = RB_ROOT;
  91                spin_lock_init(&local->client_bundles_lock);
  92                spin_lock_init(&local->lock);
  93                rwlock_init(&local->services_lock);
  94                local->debug_id = atomic_inc_return(&rxrpc_debug_id);
  95                memcpy(&local->srx, srx, sizeof(*srx));
  96                local->srx.srx_service = 0;
  97                trace_rxrpc_local(local->debug_id, rxrpc_local_new, 1, NULL);
  98        }
  99
 100        _leave(" = %p", local);
 101        return local;
 102}
 103
 104/*
 105 * create the local socket
 106 * - must be called with rxrpc_local_mutex locked
 107 */
 108static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)
 109{
 110        struct udp_tunnel_sock_cfg tuncfg = {NULL};
 111        struct sockaddr_rxrpc *srx = &local->srx;
 112        struct udp_port_cfg udp_conf = {0};
 113        struct sock *usk;
 114        int ret;
 115
 116        _enter("%p{%d,%d}",
 117               local, srx->transport_type, srx->transport.family);
 118
 119        udp_conf.family = srx->transport.family;
 120        if (udp_conf.family == AF_INET) {
 121                udp_conf.local_ip = srx->transport.sin.sin_addr;
 122                udp_conf.local_udp_port = srx->transport.sin.sin_port;
 123#if IS_ENABLED(CONFIG_AF_RXRPC_IPV6)
 124        } else {
 125                udp_conf.local_ip6 = srx->transport.sin6.sin6_addr;
 126                udp_conf.local_udp_port = srx->transport.sin6.sin6_port;
 127#endif
 128        }
 129        ret = udp_sock_create(net, &udp_conf, &local->socket);
 130        if (ret < 0) {
 131                _leave(" = %d [socket]", ret);
 132                return ret;
 133        }
 134
 135        tuncfg.encap_type = UDP_ENCAP_RXRPC;
 136        tuncfg.encap_rcv = rxrpc_input_packet;
 137        tuncfg.sk_user_data = local;
 138        setup_udp_tunnel_sock(net, local->socket, &tuncfg);
 139
 140        /* set the socket up */
 141        usk = local->socket->sk;
 142        usk->sk_error_report = rxrpc_error_report;
 143
 144        switch (srx->transport.family) {
 145        case AF_INET6:
 146                /* we want to receive ICMPv6 errors */
 147                ip6_sock_set_recverr(usk);
 148
 149                /* Fall through and set IPv4 options too otherwise we don't get
 150                 * errors from IPv4 packets sent through the IPv6 socket.
 151                 */
 152                fallthrough;
 153        case AF_INET:
 154                /* we want to receive ICMP errors */
 155                ip_sock_set_recverr(usk);
 156
 157                /* we want to set the don't fragment bit */
 158                ip_sock_set_mtu_discover(usk, IP_PMTUDISC_DO);
 159
 160                /* We want receive timestamps. */
 161                sock_enable_timestamps(usk);
 162                break;
 163
 164        default:
 165                BUG();
 166        }
 167
 168        _leave(" = 0");
 169        return 0;
 170}
 171
 172/*
 173 * Look up or create a new local endpoint using the specified local address.
 174 */
 175struct rxrpc_local *rxrpc_lookup_local(struct net *net,
 176                                       const struct sockaddr_rxrpc *srx)
 177{
 178        struct rxrpc_local *local;
 179        struct rxrpc_net *rxnet = rxrpc_net(net);
 180        struct list_head *cursor;
 181        const char *age;
 182        long diff;
 183        int ret;
 184
 185        _enter("{%d,%d,%pISp}",
 186               srx->transport_type, srx->transport.family, &srx->transport);
 187
 188        mutex_lock(&rxnet->local_mutex);
 189
 190        for (cursor = rxnet->local_endpoints.next;
 191             cursor != &rxnet->local_endpoints;
 192             cursor = cursor->next) {
 193                local = list_entry(cursor, struct rxrpc_local, link);
 194
 195                diff = rxrpc_local_cmp_key(local, srx);
 196                if (diff < 0)
 197                        continue;
 198                if (diff > 0)
 199                        break;
 200
 201                /* Services aren't allowed to share transport sockets, so
 202                 * reject that here.  It is possible that the object is dying -
 203                 * but it may also still have the local transport address that
 204                 * we want bound.
 205                 */
 206                if (srx->srx_service) {
 207                        local = NULL;
 208                        goto addr_in_use;
 209                }
 210
 211                /* Found a match.  We replace a dying object.  Attempting to
 212                 * bind the transport socket may still fail if we're attempting
 213                 * to use a local address that the dying object is still using.
 214                 */
 215                if (!rxrpc_use_local(local))
 216                        break;
 217
 218                age = "old";
 219                goto found;
 220        }
 221
 222        local = rxrpc_alloc_local(rxnet, srx);
 223        if (!local)
 224                goto nomem;
 225
 226        ret = rxrpc_open_socket(local, net);
 227        if (ret < 0)
 228                goto sock_error;
 229
 230        if (cursor != &rxnet->local_endpoints)
 231                list_replace_init(cursor, &local->link);
 232        else
 233                list_add_tail(&local->link, cursor);
 234        age = "new";
 235
 236found:
 237        mutex_unlock(&rxnet->local_mutex);
 238
 239        _net("LOCAL %s %d {%pISp}",
 240             age, local->debug_id, &local->srx.transport);
 241
 242        _leave(" = %p", local);
 243        return local;
 244
 245nomem:
 246        ret = -ENOMEM;
 247sock_error:
 248        mutex_unlock(&rxnet->local_mutex);
 249        if (local)
 250                call_rcu(&local->rcu, rxrpc_local_rcu);
 251        _leave(" = %d", ret);
 252        return ERR_PTR(ret);
 253
 254addr_in_use:
 255        mutex_unlock(&rxnet->local_mutex);
 256        _leave(" = -EADDRINUSE");
 257        return ERR_PTR(-EADDRINUSE);
 258}
 259
 260/*
 261 * Get a ref on a local endpoint.
 262 */
 263struct rxrpc_local *rxrpc_get_local(struct rxrpc_local *local)
 264{
 265        const void *here = __builtin_return_address(0);
 266        int n;
 267
 268        n = atomic_inc_return(&local->usage);
 269        trace_rxrpc_local(local->debug_id, rxrpc_local_got, n, here);
 270        return local;
 271}
 272
 273/*
 274 * Get a ref on a local endpoint unless its usage has already reached 0.
 275 */
 276struct rxrpc_local *rxrpc_get_local_maybe(struct rxrpc_local *local)
 277{
 278        const void *here = __builtin_return_address(0);
 279
 280        if (local) {
 281                int n = atomic_fetch_add_unless(&local->usage, 1, 0);
 282                if (n > 0)
 283                        trace_rxrpc_local(local->debug_id, rxrpc_local_got,
 284                                          n + 1, here);
 285                else
 286                        local = NULL;
 287        }
 288        return local;
 289}
 290
 291/*
 292 * Queue a local endpoint and pass the caller's reference to the work item.
 293 */
 294void rxrpc_queue_local(struct rxrpc_local *local)
 295{
 296        const void *here = __builtin_return_address(0);
 297        unsigned int debug_id = local->debug_id;
 298        int n = atomic_read(&local->usage);
 299
 300        if (rxrpc_queue_work(&local->processor))
 301                trace_rxrpc_local(debug_id, rxrpc_local_queued, n, here);
 302        else
 303                rxrpc_put_local(local);
 304}
 305
 306/*
 307 * Drop a ref on a local endpoint.
 308 */
 309void rxrpc_put_local(struct rxrpc_local *local)
 310{
 311        const void *here = __builtin_return_address(0);
 312        unsigned int debug_id;
 313        int n;
 314
 315        if (local) {
 316                debug_id = local->debug_id;
 317
 318                n = atomic_dec_return(&local->usage);
 319                trace_rxrpc_local(debug_id, rxrpc_local_put, n, here);
 320
 321                if (n == 0)
 322                        call_rcu(&local->rcu, rxrpc_local_rcu);
 323        }
 324}
 325
 326/*
 327 * Start using a local endpoint.
 328 */
 329struct rxrpc_local *rxrpc_use_local(struct rxrpc_local *local)
 330{
 331        local = rxrpc_get_local_maybe(local);
 332        if (!local)
 333                return NULL;
 334
 335        if (!__rxrpc_use_local(local)) {
 336                rxrpc_put_local(local);
 337                return NULL;
 338        }
 339
 340        return local;
 341}
 342
 343/*
 344 * Cease using a local endpoint.  Once the number of active users reaches 0, we
 345 * start the closure of the transport in the work processor.
 346 */
 347void rxrpc_unuse_local(struct rxrpc_local *local)
 348{
 349        if (local) {
 350                if (__rxrpc_unuse_local(local)) {
 351                        rxrpc_get_local(local);
 352                        rxrpc_queue_local(local);
 353                }
 354        }
 355}
 356
 357/*
 358 * Destroy a local endpoint's socket and then hand the record to RCU to dispose
 359 * of.
 360 *
 361 * Closing the socket cannot be done from bottom half context or RCU callback
 362 * context because it might sleep.
 363 */
 364static void rxrpc_local_destroyer(struct rxrpc_local *local)
 365{
 366        struct socket *socket = local->socket;
 367        struct rxrpc_net *rxnet = local->rxnet;
 368
 369        _enter("%d", local->debug_id);
 370
 371        local->dead = true;
 372
 373        mutex_lock(&rxnet->local_mutex);
 374        list_del_init(&local->link);
 375        mutex_unlock(&rxnet->local_mutex);
 376
 377        rxrpc_clean_up_local_conns(local);
 378        rxrpc_service_connection_reaper(&rxnet->service_conn_reaper);
 379        ASSERT(!local->service);
 380
 381        if (socket) {
 382                local->socket = NULL;
 383                kernel_sock_shutdown(socket, SHUT_RDWR);
 384                socket->sk->sk_user_data = NULL;
 385                sock_release(socket);
 386        }
 387
 388        /* At this point, there should be no more packets coming in to the
 389         * local endpoint.
 390         */
 391        rxrpc_purge_queue(&local->reject_queue);
 392        rxrpc_purge_queue(&local->event_queue);
 393}
 394
 395/*
 396 * Process events on an endpoint.  The work item carries a ref which
 397 * we must release.
 398 */
 399static void rxrpc_local_processor(struct work_struct *work)
 400{
 401        struct rxrpc_local *local =
 402                container_of(work, struct rxrpc_local, processor);
 403        bool again;
 404
 405        trace_rxrpc_local(local->debug_id, rxrpc_local_processing,
 406                          atomic_read(&local->usage), NULL);
 407
 408        do {
 409                again = false;
 410                if (!__rxrpc_use_local(local)) {
 411                        rxrpc_local_destroyer(local);
 412                        break;
 413                }
 414
 415                if (!skb_queue_empty(&local->reject_queue)) {
 416                        rxrpc_reject_packets(local);
 417                        again = true;
 418                }
 419
 420                if (!skb_queue_empty(&local->event_queue)) {
 421                        rxrpc_process_local_events(local);
 422                        again = true;
 423                }
 424
 425                __rxrpc_unuse_local(local);
 426        } while (again);
 427
 428        rxrpc_put_local(local);
 429}
 430
 431/*
 432 * Destroy a local endpoint after the RCU grace period expires.
 433 */
 434static void rxrpc_local_rcu(struct rcu_head *rcu)
 435{
 436        struct rxrpc_local *local = container_of(rcu, struct rxrpc_local, rcu);
 437
 438        _enter("%d", local->debug_id);
 439
 440        ASSERT(!work_pending(&local->processor));
 441
 442        _net("DESTROY LOCAL %d", local->debug_id);
 443        kfree(local);
 444        _leave("");
 445}
 446
 447/*
 448 * Verify the local endpoint list is empty by this point.
 449 */
 450void rxrpc_destroy_all_locals(struct rxrpc_net *rxnet)
 451{
 452        struct rxrpc_local *local;
 453
 454        _enter("");
 455
 456        flush_workqueue(rxrpc_workqueue);
 457
 458        if (!list_empty(&rxnet->local_endpoints)) {
 459                mutex_lock(&rxnet->local_mutex);
 460                list_for_each_entry(local, &rxnet->local_endpoints, link) {
 461                        pr_err("AF_RXRPC: Leaked local %p {%d}\n",
 462                               local, atomic_read(&local->usage));
 463                }
 464                mutex_unlock(&rxnet->local_mutex);
 465                BUG();
 466        }
 467}
 468