linux/net/can/raw.c
<<
>>
Prefs
   1// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
   2/* raw.c - Raw sockets for protocol family CAN
   3 *
   4 * Copyright (c) 2002-2007 Volkswagen Group Electronic Research
   5 * All rights reserved.
   6 *
   7 * Redistribution and use in source and binary forms, with or without
   8 * modification, are permitted provided that the following conditions
   9 * are met:
  10 * 1. Redistributions of source code must retain the above copyright
  11 *    notice, this list of conditions and the following disclaimer.
  12 * 2. Redistributions in binary form must reproduce the above copyright
  13 *    notice, this list of conditions and the following disclaimer in the
  14 *    documentation and/or other materials provided with the distribution.
  15 * 3. Neither the name of Volkswagen nor the names of its contributors
  16 *    may be used to endorse or promote products derived from this software
  17 *    without specific prior written permission.
  18 *
  19 * Alternatively, provided that this notice is retained in full, this
  20 * software may be distributed under the terms of the GNU General
  21 * Public License ("GPL") version 2, in which case the provisions of the
  22 * GPL apply INSTEAD OF those given above.
  23 *
  24 * The provided data structures and external interfaces from this code
  25 * are not restricted to be used by modules with a GPL compatible license.
  26 *
  27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  28 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  29 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  30 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  31 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  32 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  33 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  34 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  35 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  36 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  37 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  38 * DAMAGE.
  39 *
  40 */
  41
  42#include <linux/module.h>
  43#include <linux/init.h>
  44#include <linux/uio.h>
  45#include <linux/net.h>
  46#include <linux/slab.h>
  47#include <linux/netdevice.h>
  48#include <linux/socket.h>
  49#include <linux/if_arp.h>
  50#include <linux/skbuff.h>
  51#include <linux/can.h>
  52#include <linux/can/core.h>
  53#include <linux/can/skb.h>
  54#include <linux/can/raw.h>
  55#include <net/sock.h>
  56#include <net/net_namespace.h>
  57
  58MODULE_DESCRIPTION("PF_CAN raw protocol");
  59MODULE_LICENSE("Dual BSD/GPL");
  60MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
  61MODULE_ALIAS("can-proto-1");
  62
  63#define RAW_MIN_NAMELEN CAN_REQUIRED_SIZE(struct sockaddr_can, can_ifindex)
  64
  65#define MASK_ALL 0
  66
  67/* A raw socket has a list of can_filters attached to it, each receiving
  68 * the CAN frames matching that filter.  If the filter list is empty,
  69 * no CAN frames will be received by the socket.  The default after
  70 * opening the socket, is to have one filter which receives all frames.
  71 * The filter list is allocated dynamically with the exception of the
  72 * list containing only one item.  This common case is optimized by
  73 * storing the single filter in dfilter, to avoid using dynamic memory.
  74 */
  75
  76struct uniqframe {
  77        int skbcnt;
  78        const struct sk_buff *skb;
  79        unsigned int join_rx_count;
  80};
  81
  82struct raw_sock {
  83        struct sock sk;
  84        int bound;
  85        int ifindex;
  86        struct list_head notifier;
  87        int loopback;
  88        int recv_own_msgs;
  89        int fd_frames;
  90        int join_filters;
  91        int count;                 /* number of active filters */
  92        struct can_filter dfilter; /* default/single filter */
  93        struct can_filter *filter; /* pointer to filter(s) */
  94        can_err_mask_t err_mask;
  95        struct uniqframe __percpu *uniq;
  96};
  97
  98static LIST_HEAD(raw_notifier_list);
  99static DEFINE_SPINLOCK(raw_notifier_lock);
 100static struct raw_sock *raw_busy_notifier;
 101
 102/* Return pointer to store the extra msg flags for raw_recvmsg().
 103 * We use the space of one unsigned int beyond the 'struct sockaddr_can'
 104 * in skb->cb.
 105 */
 106static inline unsigned int *raw_flags(struct sk_buff *skb)
 107{
 108        sock_skb_cb_check_size(sizeof(struct sockaddr_can) +
 109                               sizeof(unsigned int));
 110
 111        /* return pointer after struct sockaddr_can */
 112        return (unsigned int *)(&((struct sockaddr_can *)skb->cb)[1]);
 113}
 114
 115static inline struct raw_sock *raw_sk(const struct sock *sk)
 116{
 117        return (struct raw_sock *)sk;
 118}
 119
 120static void raw_rcv(struct sk_buff *oskb, void *data)
 121{
 122        struct sock *sk = (struct sock *)data;
 123        struct raw_sock *ro = raw_sk(sk);
 124        struct sockaddr_can *addr;
 125        struct sk_buff *skb;
 126        unsigned int *pflags;
 127
 128        /* check the received tx sock reference */
 129        if (!ro->recv_own_msgs && oskb->sk == sk)
 130                return;
 131
 132        /* do not pass non-CAN2.0 frames to a legacy socket */
 133        if (!ro->fd_frames && oskb->len != CAN_MTU)
 134                return;
 135
 136        /* eliminate multiple filter matches for the same skb */
 137        if (this_cpu_ptr(ro->uniq)->skb == oskb &&
 138            this_cpu_ptr(ro->uniq)->skbcnt == can_skb_prv(oskb)->skbcnt) {
 139                if (ro->join_filters) {
 140                        this_cpu_inc(ro->uniq->join_rx_count);
 141                        /* drop frame until all enabled filters matched */
 142                        if (this_cpu_ptr(ro->uniq)->join_rx_count < ro->count)
 143                                return;
 144                } else {
 145                        return;
 146                }
 147        } else {
 148                this_cpu_ptr(ro->uniq)->skb = oskb;
 149                this_cpu_ptr(ro->uniq)->skbcnt = can_skb_prv(oskb)->skbcnt;
 150                this_cpu_ptr(ro->uniq)->join_rx_count = 1;
 151                /* drop first frame to check all enabled filters? */
 152                if (ro->join_filters && ro->count > 1)
 153                        return;
 154        }
 155
 156        /* clone the given skb to be able to enqueue it into the rcv queue */
 157        skb = skb_clone(oskb, GFP_ATOMIC);
 158        if (!skb)
 159                return;
 160
 161        /* Put the datagram to the queue so that raw_recvmsg() can get
 162         * it from there. We need to pass the interface index to
 163         * raw_recvmsg(). We pass a whole struct sockaddr_can in
 164         * skb->cb containing the interface index.
 165         */
 166
 167        sock_skb_cb_check_size(sizeof(struct sockaddr_can));
 168        addr = (struct sockaddr_can *)skb->cb;
 169        memset(addr, 0, sizeof(*addr));
 170        addr->can_family = AF_CAN;
 171        addr->can_ifindex = skb->dev->ifindex;
 172
 173        /* add CAN specific message flags for raw_recvmsg() */
 174        pflags = raw_flags(skb);
 175        *pflags = 0;
 176        if (oskb->sk)
 177                *pflags |= MSG_DONTROUTE;
 178        if (oskb->sk == sk)
 179                *pflags |= MSG_CONFIRM;
 180
 181        if (sock_queue_rcv_skb(sk, skb) < 0)
 182                kfree_skb(skb);
 183}
 184
 185static int raw_enable_filters(struct net *net, struct net_device *dev,
 186                              struct sock *sk, struct can_filter *filter,
 187                              int count)
 188{
 189        int err = 0;
 190        int i;
 191
 192        for (i = 0; i < count; i++) {
 193                err = can_rx_register(net, dev, filter[i].can_id,
 194                                      filter[i].can_mask,
 195                                      raw_rcv, sk, "raw", sk);
 196                if (err) {
 197                        /* clean up successfully registered filters */
 198                        while (--i >= 0)
 199                                can_rx_unregister(net, dev, filter[i].can_id,
 200                                                  filter[i].can_mask,
 201                                                  raw_rcv, sk);
 202                        break;
 203                }
 204        }
 205
 206        return err;
 207}
 208
 209static int raw_enable_errfilter(struct net *net, struct net_device *dev,
 210                                struct sock *sk, can_err_mask_t err_mask)
 211{
 212        int err = 0;
 213
 214        if (err_mask)
 215                err = can_rx_register(net, dev, 0, err_mask | CAN_ERR_FLAG,
 216                                      raw_rcv, sk, "raw", sk);
 217
 218        return err;
 219}
 220
 221static void raw_disable_filters(struct net *net, struct net_device *dev,
 222                                struct sock *sk, struct can_filter *filter,
 223                                int count)
 224{
 225        int i;
 226
 227        for (i = 0; i < count; i++)
 228                can_rx_unregister(net, dev, filter[i].can_id,
 229                                  filter[i].can_mask, raw_rcv, sk);
 230}
 231
 232static inline void raw_disable_errfilter(struct net *net,
 233                                         struct net_device *dev,
 234                                         struct sock *sk,
 235                                         can_err_mask_t err_mask)
 236
 237{
 238        if (err_mask)
 239                can_rx_unregister(net, dev, 0, err_mask | CAN_ERR_FLAG,
 240                                  raw_rcv, sk);
 241}
 242
 243static inline void raw_disable_allfilters(struct net *net,
 244                                          struct net_device *dev,
 245                                          struct sock *sk)
 246{
 247        struct raw_sock *ro = raw_sk(sk);
 248
 249        raw_disable_filters(net, dev, sk, ro->filter, ro->count);
 250        raw_disable_errfilter(net, dev, sk, ro->err_mask);
 251}
 252
 253static int raw_enable_allfilters(struct net *net, struct net_device *dev,
 254                                 struct sock *sk)
 255{
 256        struct raw_sock *ro = raw_sk(sk);
 257        int err;
 258
 259        err = raw_enable_filters(net, dev, sk, ro->filter, ro->count);
 260        if (!err) {
 261                err = raw_enable_errfilter(net, dev, sk, ro->err_mask);
 262                if (err)
 263                        raw_disable_filters(net, dev, sk, ro->filter,
 264                                            ro->count);
 265        }
 266
 267        return err;
 268}
 269
 270static void raw_notify(struct raw_sock *ro, unsigned long msg,
 271                       struct net_device *dev)
 272{
 273        struct sock *sk = &ro->sk;
 274
 275        if (!net_eq(dev_net(dev), sock_net(sk)))
 276                return;
 277
 278        if (ro->ifindex != dev->ifindex)
 279                return;
 280
 281        switch (msg) {
 282        case NETDEV_UNREGISTER:
 283                lock_sock(sk);
 284                /* remove current filters & unregister */
 285                if (ro->bound)
 286                        raw_disable_allfilters(dev_net(dev), dev, sk);
 287
 288                if (ro->count > 1)
 289                        kfree(ro->filter);
 290
 291                ro->ifindex = 0;
 292                ro->bound = 0;
 293                ro->count = 0;
 294                release_sock(sk);
 295
 296                sk->sk_err = ENODEV;
 297                if (!sock_flag(sk, SOCK_DEAD))
 298                        sk_error_report(sk);
 299                break;
 300
 301        case NETDEV_DOWN:
 302                sk->sk_err = ENETDOWN;
 303                if (!sock_flag(sk, SOCK_DEAD))
 304                        sk_error_report(sk);
 305                break;
 306        }
 307}
 308
 309static int raw_notifier(struct notifier_block *nb, unsigned long msg,
 310                        void *ptr)
 311{
 312        struct net_device *dev = netdev_notifier_info_to_dev(ptr);
 313
 314        if (dev->type != ARPHRD_CAN)
 315                return NOTIFY_DONE;
 316        if (msg != NETDEV_UNREGISTER && msg != NETDEV_DOWN)
 317                return NOTIFY_DONE;
 318        if (unlikely(raw_busy_notifier)) /* Check for reentrant bug. */
 319                return NOTIFY_DONE;
 320
 321        spin_lock(&raw_notifier_lock);
 322        list_for_each_entry(raw_busy_notifier, &raw_notifier_list, notifier) {
 323                spin_unlock(&raw_notifier_lock);
 324                raw_notify(raw_busy_notifier, msg, dev);
 325                spin_lock(&raw_notifier_lock);
 326        }
 327        raw_busy_notifier = NULL;
 328        spin_unlock(&raw_notifier_lock);
 329        return NOTIFY_DONE;
 330}
 331
 332static int raw_init(struct sock *sk)
 333{
 334        struct raw_sock *ro = raw_sk(sk);
 335
 336        ro->bound            = 0;
 337        ro->ifindex          = 0;
 338
 339        /* set default filter to single entry dfilter */
 340        ro->dfilter.can_id   = 0;
 341        ro->dfilter.can_mask = MASK_ALL;
 342        ro->filter           = &ro->dfilter;
 343        ro->count            = 1;
 344
 345        /* set default loopback behaviour */
 346        ro->loopback         = 1;
 347        ro->recv_own_msgs    = 0;
 348        ro->fd_frames        = 0;
 349        ro->join_filters     = 0;
 350
 351        /* alloc_percpu provides zero'ed memory */
 352        ro->uniq = alloc_percpu(struct uniqframe);
 353        if (unlikely(!ro->uniq))
 354                return -ENOMEM;
 355
 356        /* set notifier */
 357        spin_lock(&raw_notifier_lock);
 358        list_add_tail(&ro->notifier, &raw_notifier_list);
 359        spin_unlock(&raw_notifier_lock);
 360
 361        return 0;
 362}
 363
 364static int raw_release(struct socket *sock)
 365{
 366        struct sock *sk = sock->sk;
 367        struct raw_sock *ro;
 368
 369        if (!sk)
 370                return 0;
 371
 372        ro = raw_sk(sk);
 373
 374        spin_lock(&raw_notifier_lock);
 375        while (raw_busy_notifier == ro) {
 376                spin_unlock(&raw_notifier_lock);
 377                schedule_timeout_uninterruptible(1);
 378                spin_lock(&raw_notifier_lock);
 379        }
 380        list_del(&ro->notifier);
 381        spin_unlock(&raw_notifier_lock);
 382
 383        lock_sock(sk);
 384
 385        /* remove current filters & unregister */
 386        if (ro->bound) {
 387                if (ro->ifindex) {
 388                        struct net_device *dev;
 389
 390                        dev = dev_get_by_index(sock_net(sk), ro->ifindex);
 391                        if (dev) {
 392                                raw_disable_allfilters(dev_net(dev), dev, sk);
 393                                dev_put(dev);
 394                        }
 395                } else {
 396                        raw_disable_allfilters(sock_net(sk), NULL, sk);
 397                }
 398        }
 399
 400        if (ro->count > 1)
 401                kfree(ro->filter);
 402
 403        ro->ifindex = 0;
 404        ro->bound = 0;
 405        ro->count = 0;
 406        free_percpu(ro->uniq);
 407
 408        sock_orphan(sk);
 409        sock->sk = NULL;
 410
 411        release_sock(sk);
 412        sock_put(sk);
 413
 414        return 0;
 415}
 416
 417static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
 418{
 419        struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
 420        struct sock *sk = sock->sk;
 421        struct raw_sock *ro = raw_sk(sk);
 422        int ifindex;
 423        int err = 0;
 424        int notify_enetdown = 0;
 425
 426        if (len < RAW_MIN_NAMELEN)
 427                return -EINVAL;
 428        if (addr->can_family != AF_CAN)
 429                return -EINVAL;
 430
 431        lock_sock(sk);
 432
 433        if (ro->bound && addr->can_ifindex == ro->ifindex)
 434                goto out;
 435
 436        if (addr->can_ifindex) {
 437                struct net_device *dev;
 438
 439                dev = dev_get_by_index(sock_net(sk), addr->can_ifindex);
 440                if (!dev) {
 441                        err = -ENODEV;
 442                        goto out;
 443                }
 444                if (dev->type != ARPHRD_CAN) {
 445                        dev_put(dev);
 446                        err = -ENODEV;
 447                        goto out;
 448                }
 449                if (!(dev->flags & IFF_UP))
 450                        notify_enetdown = 1;
 451
 452                ifindex = dev->ifindex;
 453
 454                /* filters set by default/setsockopt */
 455                err = raw_enable_allfilters(sock_net(sk), dev, sk);
 456                dev_put(dev);
 457        } else {
 458                ifindex = 0;
 459
 460                /* filters set by default/setsockopt */
 461                err = raw_enable_allfilters(sock_net(sk), NULL, sk);
 462        }
 463
 464        if (!err) {
 465                if (ro->bound) {
 466                        /* unregister old filters */
 467                        if (ro->ifindex) {
 468                                struct net_device *dev;
 469
 470                                dev = dev_get_by_index(sock_net(sk),
 471                                                       ro->ifindex);
 472                                if (dev) {
 473                                        raw_disable_allfilters(dev_net(dev),
 474                                                               dev, sk);
 475                                        dev_put(dev);
 476                                }
 477                        } else {
 478                                raw_disable_allfilters(sock_net(sk), NULL, sk);
 479                        }
 480                }
 481                ro->ifindex = ifindex;
 482                ro->bound = 1;
 483        }
 484
 485 out:
 486        release_sock(sk);
 487
 488        if (notify_enetdown) {
 489                sk->sk_err = ENETDOWN;
 490                if (!sock_flag(sk, SOCK_DEAD))
 491                        sk_error_report(sk);
 492        }
 493
 494        return err;
 495}
 496
 497static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
 498                       int peer)
 499{
 500        struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
 501        struct sock *sk = sock->sk;
 502        struct raw_sock *ro = raw_sk(sk);
 503
 504        if (peer)
 505                return -EOPNOTSUPP;
 506
 507        memset(addr, 0, RAW_MIN_NAMELEN);
 508        addr->can_family  = AF_CAN;
 509        addr->can_ifindex = ro->ifindex;
 510
 511        return RAW_MIN_NAMELEN;
 512}
 513
 514static int raw_setsockopt(struct socket *sock, int level, int optname,
 515                          sockptr_t optval, unsigned int optlen)
 516{
 517        struct sock *sk = sock->sk;
 518        struct raw_sock *ro = raw_sk(sk);
 519        struct can_filter *filter = NULL;  /* dyn. alloc'ed filters */
 520        struct can_filter sfilter;         /* single filter */
 521        struct net_device *dev = NULL;
 522        can_err_mask_t err_mask = 0;
 523        int count = 0;
 524        int err = 0;
 525
 526        if (level != SOL_CAN_RAW)
 527                return -EINVAL;
 528
 529        switch (optname) {
 530        case CAN_RAW_FILTER:
 531                if (optlen % sizeof(struct can_filter) != 0)
 532                        return -EINVAL;
 533
 534                if (optlen > CAN_RAW_FILTER_MAX * sizeof(struct can_filter))
 535                        return -EINVAL;
 536
 537                count = optlen / sizeof(struct can_filter);
 538
 539                if (count > 1) {
 540                        /* filter does not fit into dfilter => alloc space */
 541                        filter = memdup_sockptr(optval, optlen);
 542                        if (IS_ERR(filter))
 543                                return PTR_ERR(filter);
 544                } else if (count == 1) {
 545                        if (copy_from_sockptr(&sfilter, optval, sizeof(sfilter)))
 546                                return -EFAULT;
 547                }
 548
 549                rtnl_lock();
 550                lock_sock(sk);
 551
 552                if (ro->bound && ro->ifindex) {
 553                        dev = dev_get_by_index(sock_net(sk), ro->ifindex);
 554                        if (!dev) {
 555                                if (count > 1)
 556                                        kfree(filter);
 557                                err = -ENODEV;
 558                                goto out_fil;
 559                        }
 560                }
 561
 562                if (ro->bound) {
 563                        /* (try to) register the new filters */
 564                        if (count == 1)
 565                                err = raw_enable_filters(sock_net(sk), dev, sk,
 566                                                         &sfilter, 1);
 567                        else
 568                                err = raw_enable_filters(sock_net(sk), dev, sk,
 569                                                         filter, count);
 570                        if (err) {
 571                                if (count > 1)
 572                                        kfree(filter);
 573                                goto out_fil;
 574                        }
 575
 576                        /* remove old filter registrations */
 577                        raw_disable_filters(sock_net(sk), dev, sk, ro->filter,
 578                                            ro->count);
 579                }
 580
 581                /* remove old filter space */
 582                if (ro->count > 1)
 583                        kfree(ro->filter);
 584
 585                /* link new filters to the socket */
 586                if (count == 1) {
 587                        /* copy filter data for single filter */
 588                        ro->dfilter = sfilter;
 589                        filter = &ro->dfilter;
 590                }
 591                ro->filter = filter;
 592                ro->count  = count;
 593
 594 out_fil:
 595                if (dev)
 596                        dev_put(dev);
 597
 598                release_sock(sk);
 599                rtnl_unlock();
 600
 601                break;
 602
 603        case CAN_RAW_ERR_FILTER:
 604                if (optlen != sizeof(err_mask))
 605                        return -EINVAL;
 606
 607                if (copy_from_sockptr(&err_mask, optval, optlen))
 608                        return -EFAULT;
 609
 610                err_mask &= CAN_ERR_MASK;
 611
 612                rtnl_lock();
 613                lock_sock(sk);
 614
 615                if (ro->bound && ro->ifindex) {
 616                        dev = dev_get_by_index(sock_net(sk), ro->ifindex);
 617                        if (!dev) {
 618                                err = -ENODEV;
 619                                goto out_err;
 620                        }
 621                }
 622
 623                /* remove current error mask */
 624                if (ro->bound) {
 625                        /* (try to) register the new err_mask */
 626                        err = raw_enable_errfilter(sock_net(sk), dev, sk,
 627                                                   err_mask);
 628
 629                        if (err)
 630                                goto out_err;
 631
 632                        /* remove old err_mask registration */
 633                        raw_disable_errfilter(sock_net(sk), dev, sk,
 634                                              ro->err_mask);
 635                }
 636
 637                /* link new err_mask to the socket */
 638                ro->err_mask = err_mask;
 639
 640 out_err:
 641                if (dev)
 642                        dev_put(dev);
 643
 644                release_sock(sk);
 645                rtnl_unlock();
 646
 647                break;
 648
 649        case CAN_RAW_LOOPBACK:
 650                if (optlen != sizeof(ro->loopback))
 651                        return -EINVAL;
 652
 653                if (copy_from_sockptr(&ro->loopback, optval, optlen))
 654                        return -EFAULT;
 655
 656                break;
 657
 658        case CAN_RAW_RECV_OWN_MSGS:
 659                if (optlen != sizeof(ro->recv_own_msgs))
 660                        return -EINVAL;
 661
 662                if (copy_from_sockptr(&ro->recv_own_msgs, optval, optlen))
 663                        return -EFAULT;
 664
 665                break;
 666
 667        case CAN_RAW_FD_FRAMES:
 668                if (optlen != sizeof(ro->fd_frames))
 669                        return -EINVAL;
 670
 671                if (copy_from_sockptr(&ro->fd_frames, optval, optlen))
 672                        return -EFAULT;
 673
 674                break;
 675
 676        case CAN_RAW_JOIN_FILTERS:
 677                if (optlen != sizeof(ro->join_filters))
 678                        return -EINVAL;
 679
 680                if (copy_from_sockptr(&ro->join_filters, optval, optlen))
 681                        return -EFAULT;
 682
 683                break;
 684
 685        default:
 686                return -ENOPROTOOPT;
 687        }
 688        return err;
 689}
 690
 691static int raw_getsockopt(struct socket *sock, int level, int optname,
 692                          char __user *optval, int __user *optlen)
 693{
 694        struct sock *sk = sock->sk;
 695        struct raw_sock *ro = raw_sk(sk);
 696        int len;
 697        void *val;
 698        int err = 0;
 699
 700        if (level != SOL_CAN_RAW)
 701                return -EINVAL;
 702        if (get_user(len, optlen))
 703                return -EFAULT;
 704        if (len < 0)
 705                return -EINVAL;
 706
 707        switch (optname) {
 708        case CAN_RAW_FILTER:
 709                lock_sock(sk);
 710                if (ro->count > 0) {
 711                        int fsize = ro->count * sizeof(struct can_filter);
 712
 713                        /* user space buffer to small for filter list? */
 714                        if (len < fsize) {
 715                                /* return -ERANGE and needed space in optlen */
 716                                err = -ERANGE;
 717                                if (put_user(fsize, optlen))
 718                                        err = -EFAULT;
 719                        } else {
 720                                if (len > fsize)
 721                                        len = fsize;
 722                                if (copy_to_user(optval, ro->filter, len))
 723                                        err = -EFAULT;
 724                        }
 725                } else {
 726                        len = 0;
 727                }
 728                release_sock(sk);
 729
 730                if (!err)
 731                        err = put_user(len, optlen);
 732                return err;
 733
 734        case CAN_RAW_ERR_FILTER:
 735                if (len > sizeof(can_err_mask_t))
 736                        len = sizeof(can_err_mask_t);
 737                val = &ro->err_mask;
 738                break;
 739
 740        case CAN_RAW_LOOPBACK:
 741                if (len > sizeof(int))
 742                        len = sizeof(int);
 743                val = &ro->loopback;
 744                break;
 745
 746        case CAN_RAW_RECV_OWN_MSGS:
 747                if (len > sizeof(int))
 748                        len = sizeof(int);
 749                val = &ro->recv_own_msgs;
 750                break;
 751
 752        case CAN_RAW_FD_FRAMES:
 753                if (len > sizeof(int))
 754                        len = sizeof(int);
 755                val = &ro->fd_frames;
 756                break;
 757
 758        case CAN_RAW_JOIN_FILTERS:
 759                if (len > sizeof(int))
 760                        len = sizeof(int);
 761                val = &ro->join_filters;
 762                break;
 763
 764        default:
 765                return -ENOPROTOOPT;
 766        }
 767
 768        if (put_user(len, optlen))
 769                return -EFAULT;
 770        if (copy_to_user(optval, val, len))
 771                return -EFAULT;
 772        return 0;
 773}
 774
 775static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
 776{
 777        struct sock *sk = sock->sk;
 778        struct raw_sock *ro = raw_sk(sk);
 779        struct sk_buff *skb;
 780        struct net_device *dev;
 781        int ifindex;
 782        int err;
 783
 784        if (msg->msg_name) {
 785                DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
 786
 787                if (msg->msg_namelen < RAW_MIN_NAMELEN)
 788                        return -EINVAL;
 789
 790                if (addr->can_family != AF_CAN)
 791                        return -EINVAL;
 792
 793                ifindex = addr->can_ifindex;
 794        } else {
 795                ifindex = ro->ifindex;
 796        }
 797
 798        dev = dev_get_by_index(sock_net(sk), ifindex);
 799        if (!dev)
 800                return -ENXIO;
 801
 802        err = -EINVAL;
 803        if (ro->fd_frames && dev->mtu == CANFD_MTU) {
 804                if (unlikely(size != CANFD_MTU && size != CAN_MTU))
 805                        goto put_dev;
 806        } else {
 807                if (unlikely(size != CAN_MTU))
 808                        goto put_dev;
 809        }
 810
 811        skb = sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv),
 812                                  msg->msg_flags & MSG_DONTWAIT, &err);
 813        if (!skb)
 814                goto put_dev;
 815
 816        can_skb_reserve(skb);
 817        can_skb_prv(skb)->ifindex = dev->ifindex;
 818        can_skb_prv(skb)->skbcnt = 0;
 819
 820        err = memcpy_from_msg(skb_put(skb, size), msg, size);
 821        if (err < 0)
 822                goto free_skb;
 823
 824        skb_setup_tx_timestamp(skb, sk->sk_tsflags);
 825
 826        skb->dev = dev;
 827        skb->sk = sk;
 828        skb->priority = sk->sk_priority;
 829
 830        err = can_send(skb, ro->loopback);
 831
 832        dev_put(dev);
 833
 834        if (err)
 835                goto send_failed;
 836
 837        return size;
 838
 839free_skb:
 840        kfree_skb(skb);
 841put_dev:
 842        dev_put(dev);
 843send_failed:
 844        return err;
 845}
 846
 847static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
 848                       int flags)
 849{
 850        struct sock *sk = sock->sk;
 851        struct sk_buff *skb;
 852        int err = 0;
 853        int noblock;
 854
 855        noblock = flags & MSG_DONTWAIT;
 856        flags &= ~MSG_DONTWAIT;
 857
 858        if (flags & MSG_ERRQUEUE)
 859                return sock_recv_errqueue(sk, msg, size,
 860                                          SOL_CAN_RAW, SCM_CAN_RAW_ERRQUEUE);
 861
 862        skb = skb_recv_datagram(sk, flags, noblock, &err);
 863        if (!skb)
 864                return err;
 865
 866        if (size < skb->len)
 867                msg->msg_flags |= MSG_TRUNC;
 868        else
 869                size = skb->len;
 870
 871        err = memcpy_to_msg(msg, skb->data, size);
 872        if (err < 0) {
 873                skb_free_datagram(sk, skb);
 874                return err;
 875        }
 876
 877        sock_recv_ts_and_drops(msg, sk, skb);
 878
 879        if (msg->msg_name) {
 880                __sockaddr_check_size(RAW_MIN_NAMELEN);
 881                msg->msg_namelen = RAW_MIN_NAMELEN;
 882                memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
 883        }
 884
 885        /* assign the flags that have been recorded in raw_rcv() */
 886        msg->msg_flags |= *(raw_flags(skb));
 887
 888        skb_free_datagram(sk, skb);
 889
 890        return size;
 891}
 892
 893static int raw_sock_no_ioctlcmd(struct socket *sock, unsigned int cmd,
 894                                unsigned long arg)
 895{
 896        /* no ioctls for socket layer -> hand it down to NIC layer */
 897        return -ENOIOCTLCMD;
 898}
 899
 900static const struct proto_ops raw_ops = {
 901        .family        = PF_CAN,
 902        .release       = raw_release,
 903        .bind          = raw_bind,
 904        .connect       = sock_no_connect,
 905        .socketpair    = sock_no_socketpair,
 906        .accept        = sock_no_accept,
 907        .getname       = raw_getname,
 908        .poll          = datagram_poll,
 909        .ioctl         = raw_sock_no_ioctlcmd,
 910        .gettstamp     = sock_gettstamp,
 911        .listen        = sock_no_listen,
 912        .shutdown      = sock_no_shutdown,
 913        .setsockopt    = raw_setsockopt,
 914        .getsockopt    = raw_getsockopt,
 915        .sendmsg       = raw_sendmsg,
 916        .recvmsg       = raw_recvmsg,
 917        .mmap          = sock_no_mmap,
 918        .sendpage      = sock_no_sendpage,
 919};
 920
 921static struct proto raw_proto __read_mostly = {
 922        .name       = "CAN_RAW",
 923        .owner      = THIS_MODULE,
 924        .obj_size   = sizeof(struct raw_sock),
 925        .init       = raw_init,
 926};
 927
 928static const struct can_proto raw_can_proto = {
 929        .type       = SOCK_RAW,
 930        .protocol   = CAN_RAW,
 931        .ops        = &raw_ops,
 932        .prot       = &raw_proto,
 933};
 934
 935static struct notifier_block canraw_notifier = {
 936        .notifier_call = raw_notifier
 937};
 938
 939static __init int raw_module_init(void)
 940{
 941        int err;
 942
 943        pr_info("can: raw protocol\n");
 944
 945        err = can_proto_register(&raw_can_proto);
 946        if (err < 0)
 947                pr_err("can: registration of raw protocol failed\n");
 948        else
 949                register_netdevice_notifier(&canraw_notifier);
 950
 951        return err;
 952}
 953
 954static __exit void raw_module_exit(void)
 955{
 956        can_proto_unregister(&raw_can_proto);
 957        unregister_netdevice_notifier(&canraw_notifier);
 958}
 959
 960module_init(raw_module_init);
 961module_exit(raw_module_exit);
 962