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        udp_conf.use_udp_checksums = true;
 121        if (udp_conf.family == AF_INET) {
 122                udp_conf.local_ip = srx->transport.sin.sin_addr;
 123                udp_conf.local_udp_port = srx->transport.sin.sin_port;
 124#if IS_ENABLED(CONFIG_AF_RXRPC_IPV6)
 125        } else {
 126                udp_conf.local_ip6 = srx->transport.sin6.sin6_addr;
 127                udp_conf.local_udp_port = srx->transport.sin6.sin6_port;
 128                udp_conf.use_udp6_tx_checksums = true;
 129                udp_conf.use_udp6_rx_checksums = true;
 130#endif
 131        }
 132        ret = udp_sock_create(net, &udp_conf, &local->socket);
 133        if (ret < 0) {
 134                _leave(" = %d [socket]", ret);
 135                return ret;
 136        }
 137
 138        tuncfg.encap_type = UDP_ENCAP_RXRPC;
 139        tuncfg.encap_rcv = rxrpc_input_packet;
 140        tuncfg.sk_user_data = local;
 141        setup_udp_tunnel_sock(net, local->socket, &tuncfg);
 142
 143        /* set the socket up */
 144        usk = local->socket->sk;
 145        usk->sk_error_report = rxrpc_error_report;
 146
 147        switch (srx->transport.family) {
 148        case AF_INET6:
 149                /* we want to receive ICMPv6 errors */
 150                ip6_sock_set_recverr(usk);
 151
 152                /* Fall through and set IPv4 options too otherwise we don't get
 153                 * errors from IPv4 packets sent through the IPv6 socket.
 154                 */
 155                fallthrough;
 156        case AF_INET:
 157                /* we want to receive ICMP errors */
 158                ip_sock_set_recverr(usk);
 159
 160                /* we want to set the don't fragment bit */
 161                ip_sock_set_mtu_discover(usk, IP_PMTUDISC_DO);
 162
 163                /* We want receive timestamps. */
 164                sock_enable_timestamps(usk);
 165                break;
 166
 167        default:
 168                BUG();
 169        }
 170
 171        _leave(" = 0");
 172        return 0;
 173}
 174
 175/*
 176 * Look up or create a new local endpoint using the specified local address.
 177 */
 178struct rxrpc_local *rxrpc_lookup_local(struct net *net,
 179                                       const struct sockaddr_rxrpc *srx)
 180{
 181        struct rxrpc_local *local;
 182        struct rxrpc_net *rxnet = rxrpc_net(net);
 183        struct list_head *cursor;
 184        const char *age;
 185        long diff;
 186        int ret;
 187
 188        _enter("{%d,%d,%pISp}",
 189               srx->transport_type, srx->transport.family, &srx->transport);
 190
 191        mutex_lock(&rxnet->local_mutex);
 192
 193        for (cursor = rxnet->local_endpoints.next;
 194             cursor != &rxnet->local_endpoints;
 195             cursor = cursor->next) {
 196                local = list_entry(cursor, struct rxrpc_local, link);
 197
 198                diff = rxrpc_local_cmp_key(local, srx);
 199                if (diff < 0)
 200                        continue;
 201                if (diff > 0)
 202                        break;
 203
 204                /* Services aren't allowed to share transport sockets, so
 205                 * reject that here.  It is possible that the object is dying -
 206                 * but it may also still have the local transport address that
 207                 * we want bound.
 208                 */
 209                if (srx->srx_service) {
 210                        local = NULL;
 211                        goto addr_in_use;
 212                }
 213
 214                /* Found a match.  We replace a dying object.  Attempting to
 215                 * bind the transport socket may still fail if we're attempting
 216                 * to use a local address that the dying object is still using.
 217                 */
 218                if (!rxrpc_use_local(local))
 219                        break;
 220
 221                age = "old";
 222                goto found;
 223        }
 224
 225        local = rxrpc_alloc_local(rxnet, srx);
 226        if (!local)
 227                goto nomem;
 228
 229        ret = rxrpc_open_socket(local, net);
 230        if (ret < 0)
 231                goto sock_error;
 232
 233        if (cursor != &rxnet->local_endpoints)
 234                list_replace_init(cursor, &local->link);
 235        else
 236                list_add_tail(&local->link, cursor);
 237        age = "new";
 238
 239found:
 240        mutex_unlock(&rxnet->local_mutex);
 241
 242        _net("LOCAL %s %d {%pISp}",
 243             age, local->debug_id, &local->srx.transport);
 244
 245        _leave(" = %p", local);
 246        return local;
 247
 248nomem:
 249        ret = -ENOMEM;
 250sock_error:
 251        mutex_unlock(&rxnet->local_mutex);
 252        if (local)
 253                call_rcu(&local->rcu, rxrpc_local_rcu);
 254        _leave(" = %d", ret);
 255        return ERR_PTR(ret);
 256
 257addr_in_use:
 258        mutex_unlock(&rxnet->local_mutex);
 259        _leave(" = -EADDRINUSE");
 260        return ERR_PTR(-EADDRINUSE);
 261}
 262
 263/*
 264 * Get a ref on a local endpoint.
 265 */
 266struct rxrpc_local *rxrpc_get_local(struct rxrpc_local *local)
 267{
 268        const void *here = __builtin_return_address(0);
 269        int n;
 270
 271        n = atomic_inc_return(&local->usage);
 272        trace_rxrpc_local(local->debug_id, rxrpc_local_got, n, here);
 273        return local;
 274}
 275
 276/*
 277 * Get a ref on a local endpoint unless its usage has already reached 0.
 278 */
 279struct rxrpc_local *rxrpc_get_local_maybe(struct rxrpc_local *local)
 280{
 281        const void *here = __builtin_return_address(0);
 282
 283        if (local) {
 284                int n = atomic_fetch_add_unless(&local->usage, 1, 0);
 285                if (n > 0)
 286                        trace_rxrpc_local(local->debug_id, rxrpc_local_got,
 287                                          n + 1, here);
 288                else
 289                        local = NULL;
 290        }
 291        return local;
 292}
 293
 294/*
 295 * Queue a local endpoint and pass the caller's reference to the work item.
 296 */
 297void rxrpc_queue_local(struct rxrpc_local *local)
 298{
 299        const void *here = __builtin_return_address(0);
 300        unsigned int debug_id = local->debug_id;
 301        int n = atomic_read(&local->usage);
 302
 303        if (rxrpc_queue_work(&local->processor))
 304                trace_rxrpc_local(debug_id, rxrpc_local_queued, n, here);
 305        else
 306                rxrpc_put_local(local);
 307}
 308
 309/*
 310 * Drop a ref on a local endpoint.
 311 */
 312void rxrpc_put_local(struct rxrpc_local *local)
 313{
 314        const void *here = __builtin_return_address(0);
 315        unsigned int debug_id;
 316        int n;
 317
 318        if (local) {
 319                debug_id = local->debug_id;
 320
 321                n = atomic_dec_return(&local->usage);
 322                trace_rxrpc_local(debug_id, rxrpc_local_put, n, here);
 323
 324                if (n == 0)
 325                        call_rcu(&local->rcu, rxrpc_local_rcu);
 326        }
 327}
 328
 329/*
 330 * Start using a local endpoint.
 331 */
 332struct rxrpc_local *rxrpc_use_local(struct rxrpc_local *local)
 333{
 334        local = rxrpc_get_local_maybe(local);
 335        if (!local)
 336                return NULL;
 337
 338        if (!__rxrpc_use_local(local)) {
 339                rxrpc_put_local(local);
 340                return NULL;
 341        }
 342
 343        return local;
 344}
 345
 346/*
 347 * Cease using a local endpoint.  Once the number of active users reaches 0, we
 348 * start the closure of the transport in the work processor.
 349 */
 350void rxrpc_unuse_local(struct rxrpc_local *local)
 351{
 352        if (local) {
 353                if (__rxrpc_unuse_local(local)) {
 354                        rxrpc_get_local(local);
 355                        rxrpc_queue_local(local);
 356                }
 357        }
 358}
 359
 360/*
 361 * Destroy a local endpoint's socket and then hand the record to RCU to dispose
 362 * of.
 363 *
 364 * Closing the socket cannot be done from bottom half context or RCU callback
 365 * context because it might sleep.
 366 */
 367static void rxrpc_local_destroyer(struct rxrpc_local *local)
 368{
 369        struct socket *socket = local->socket;
 370        struct rxrpc_net *rxnet = local->rxnet;
 371
 372        _enter("%d", local->debug_id);
 373
 374        local->dead = true;
 375
 376        mutex_lock(&rxnet->local_mutex);
 377        list_del_init(&local->link);
 378        mutex_unlock(&rxnet->local_mutex);
 379
 380        rxrpc_clean_up_local_conns(local);
 381        rxrpc_service_connection_reaper(&rxnet->service_conn_reaper);
 382        ASSERT(!local->service);
 383
 384        if (socket) {
 385                local->socket = NULL;
 386                kernel_sock_shutdown(socket, SHUT_RDWR);
 387                socket->sk->sk_user_data = NULL;
 388                sock_release(socket);
 389        }
 390
 391        /* At this point, there should be no more packets coming in to the
 392         * local endpoint.
 393         */
 394        rxrpc_purge_queue(&local->reject_queue);
 395        rxrpc_purge_queue(&local->event_queue);
 396}
 397
 398/*
 399 * Process events on an endpoint.  The work item carries a ref which
 400 * we must release.
 401 */
 402static void rxrpc_local_processor(struct work_struct *work)
 403{
 404        struct rxrpc_local *local =
 405                container_of(work, struct rxrpc_local, processor);
 406        bool again;
 407
 408        trace_rxrpc_local(local->debug_id, rxrpc_local_processing,
 409                          atomic_read(&local->usage), NULL);
 410
 411        do {
 412                again = false;
 413                if (!__rxrpc_use_local(local)) {
 414                        rxrpc_local_destroyer(local);
 415                        break;
 416                }
 417
 418                if (!skb_queue_empty(&local->reject_queue)) {
 419                        rxrpc_reject_packets(local);
 420                        again = true;
 421                }
 422
 423                if (!skb_queue_empty(&local->event_queue)) {
 424                        rxrpc_process_local_events(local);
 425                        again = true;
 426                }
 427
 428                __rxrpc_unuse_local(local);
 429        } while (again);
 430
 431        rxrpc_put_local(local);
 432}
 433
 434/*
 435 * Destroy a local endpoint after the RCU grace period expires.
 436 */
 437static void rxrpc_local_rcu(struct rcu_head *rcu)
 438{
 439        struct rxrpc_local *local = container_of(rcu, struct rxrpc_local, rcu);
 440
 441        _enter("%d", local->debug_id);
 442
 443        ASSERT(!work_pending(&local->processor));
 444
 445        _net("DESTROY LOCAL %d", local->debug_id);
 446        kfree(local);
 447        _leave("");
 448}
 449
 450/*
 451 * Verify the local endpoint list is empty by this point.
 452 */
 453void rxrpc_destroy_all_locals(struct rxrpc_net *rxnet)
 454{
 455        struct rxrpc_local *local;
 456
 457        _enter("");
 458
 459        flush_workqueue(rxrpc_workqueue);
 460
 461        if (!list_empty(&rxnet->local_endpoints)) {
 462                mutex_lock(&rxnet->local_mutex);
 463                list_for_each_entry(local, &rxnet->local_endpoints, link) {
 464                        pr_err("AF_RXRPC: Leaked local %p {%d}\n",
 465                               local, atomic_read(&local->usage));
 466                }
 467                mutex_unlock(&rxnet->local_mutex);
 468                BUG();
 469        }
 470}
 471