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                dev_put(dev);
 596                release_sock(sk);
 597                rtnl_unlock();
 598
 599                break;
 600
 601        case CAN_RAW_ERR_FILTER:
 602                if (optlen != sizeof(err_mask))
 603                        return -EINVAL;
 604
 605                if (copy_from_sockptr(&err_mask, optval, optlen))
 606                        return -EFAULT;
 607
 608                err_mask &= CAN_ERR_MASK;
 609
 610                rtnl_lock();
 611                lock_sock(sk);
 612
 613                if (ro->bound && ro->ifindex) {
 614                        dev = dev_get_by_index(sock_net(sk), ro->ifindex);
 615                        if (!dev) {
 616                                err = -ENODEV;
 617                                goto out_err;
 618                        }
 619                }
 620
 621                /* remove current error mask */
 622                if (ro->bound) {
 623                        /* (try to) register the new err_mask */
 624                        err = raw_enable_errfilter(sock_net(sk), dev, sk,
 625                                                   err_mask);
 626
 627                        if (err)
 628                                goto out_err;
 629
 630                        /* remove old err_mask registration */
 631                        raw_disable_errfilter(sock_net(sk), dev, sk,
 632                                              ro->err_mask);
 633                }
 634
 635                /* link new err_mask to the socket */
 636                ro->err_mask = err_mask;
 637
 638 out_err:
 639                dev_put(dev);
 640                release_sock(sk);
 641                rtnl_unlock();
 642
 643                break;
 644
 645        case CAN_RAW_LOOPBACK:
 646                if (optlen != sizeof(ro->loopback))
 647                        return -EINVAL;
 648
 649                if (copy_from_sockptr(&ro->loopback, optval, optlen))
 650                        return -EFAULT;
 651
 652                break;
 653
 654        case CAN_RAW_RECV_OWN_MSGS:
 655                if (optlen != sizeof(ro->recv_own_msgs))
 656                        return -EINVAL;
 657
 658                if (copy_from_sockptr(&ro->recv_own_msgs, optval, optlen))
 659                        return -EFAULT;
 660
 661                break;
 662
 663        case CAN_RAW_FD_FRAMES:
 664                if (optlen != sizeof(ro->fd_frames))
 665                        return -EINVAL;
 666
 667                if (copy_from_sockptr(&ro->fd_frames, optval, optlen))
 668                        return -EFAULT;
 669
 670                break;
 671
 672        case CAN_RAW_JOIN_FILTERS:
 673                if (optlen != sizeof(ro->join_filters))
 674                        return -EINVAL;
 675
 676                if (copy_from_sockptr(&ro->join_filters, optval, optlen))
 677                        return -EFAULT;
 678
 679                break;
 680
 681        default:
 682                return -ENOPROTOOPT;
 683        }
 684        return err;
 685}
 686
 687static int raw_getsockopt(struct socket *sock, int level, int optname,
 688                          char __user *optval, int __user *optlen)
 689{
 690        struct sock *sk = sock->sk;
 691        struct raw_sock *ro = raw_sk(sk);
 692        int len;
 693        void *val;
 694        int err = 0;
 695
 696        if (level != SOL_CAN_RAW)
 697                return -EINVAL;
 698        if (get_user(len, optlen))
 699                return -EFAULT;
 700        if (len < 0)
 701                return -EINVAL;
 702
 703        switch (optname) {
 704        case CAN_RAW_FILTER:
 705                lock_sock(sk);
 706                if (ro->count > 0) {
 707                        int fsize = ro->count * sizeof(struct can_filter);
 708
 709                        /* user space buffer to small for filter list? */
 710                        if (len < fsize) {
 711                                /* return -ERANGE and needed space in optlen */
 712                                err = -ERANGE;
 713                                if (put_user(fsize, optlen))
 714                                        err = -EFAULT;
 715                        } else {
 716                                if (len > fsize)
 717                                        len = fsize;
 718                                if (copy_to_user(optval, ro->filter, len))
 719                                        err = -EFAULT;
 720                        }
 721                } else {
 722                        len = 0;
 723                }
 724                release_sock(sk);
 725
 726                if (!err)
 727                        err = put_user(len, optlen);
 728                return err;
 729
 730        case CAN_RAW_ERR_FILTER:
 731                if (len > sizeof(can_err_mask_t))
 732                        len = sizeof(can_err_mask_t);
 733                val = &ro->err_mask;
 734                break;
 735
 736        case CAN_RAW_LOOPBACK:
 737                if (len > sizeof(int))
 738                        len = sizeof(int);
 739                val = &ro->loopback;
 740                break;
 741
 742        case CAN_RAW_RECV_OWN_MSGS:
 743                if (len > sizeof(int))
 744                        len = sizeof(int);
 745                val = &ro->recv_own_msgs;
 746                break;
 747
 748        case CAN_RAW_FD_FRAMES:
 749                if (len > sizeof(int))
 750                        len = sizeof(int);
 751                val = &ro->fd_frames;
 752                break;
 753
 754        case CAN_RAW_JOIN_FILTERS:
 755                if (len > sizeof(int))
 756                        len = sizeof(int);
 757                val = &ro->join_filters;
 758                break;
 759
 760        default:
 761                return -ENOPROTOOPT;
 762        }
 763
 764        if (put_user(len, optlen))
 765                return -EFAULT;
 766        if (copy_to_user(optval, val, len))
 767                return -EFAULT;
 768        return 0;
 769}
 770
 771static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
 772{
 773        struct sock *sk = sock->sk;
 774        struct raw_sock *ro = raw_sk(sk);
 775        struct sk_buff *skb;
 776        struct net_device *dev;
 777        int ifindex;
 778        int err;
 779
 780        if (msg->msg_name) {
 781                DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
 782
 783                if (msg->msg_namelen < RAW_MIN_NAMELEN)
 784                        return -EINVAL;
 785
 786                if (addr->can_family != AF_CAN)
 787                        return -EINVAL;
 788
 789                ifindex = addr->can_ifindex;
 790        } else {
 791                ifindex = ro->ifindex;
 792        }
 793
 794        dev = dev_get_by_index(sock_net(sk), ifindex);
 795        if (!dev)
 796                return -ENXIO;
 797
 798        err = -EINVAL;
 799        if (ro->fd_frames && dev->mtu == CANFD_MTU) {
 800                if (unlikely(size != CANFD_MTU && size != CAN_MTU))
 801                        goto put_dev;
 802        } else {
 803                if (unlikely(size != CAN_MTU))
 804                        goto put_dev;
 805        }
 806
 807        skb = sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv),
 808                                  msg->msg_flags & MSG_DONTWAIT, &err);
 809        if (!skb)
 810                goto put_dev;
 811
 812        can_skb_reserve(skb);
 813        can_skb_prv(skb)->ifindex = dev->ifindex;
 814        can_skb_prv(skb)->skbcnt = 0;
 815
 816        err = memcpy_from_msg(skb_put(skb, size), msg, size);
 817        if (err < 0)
 818                goto free_skb;
 819
 820        skb_setup_tx_timestamp(skb, sk->sk_tsflags);
 821
 822        skb->dev = dev;
 823        skb->sk = sk;
 824        skb->priority = sk->sk_priority;
 825
 826        err = can_send(skb, ro->loopback);
 827
 828        dev_put(dev);
 829
 830        if (err)
 831                goto send_failed;
 832
 833        return size;
 834
 835free_skb:
 836        kfree_skb(skb);
 837put_dev:
 838        dev_put(dev);
 839send_failed:
 840        return err;
 841}
 842
 843static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
 844                       int flags)
 845{
 846        struct sock *sk = sock->sk;
 847        struct sk_buff *skb;
 848        int err = 0;
 849        int noblock;
 850
 851        noblock = flags & MSG_DONTWAIT;
 852        flags &= ~MSG_DONTWAIT;
 853
 854        if (flags & MSG_ERRQUEUE)
 855                return sock_recv_errqueue(sk, msg, size,
 856                                          SOL_CAN_RAW, SCM_CAN_RAW_ERRQUEUE);
 857
 858        skb = skb_recv_datagram(sk, flags, noblock, &err);
 859        if (!skb)
 860                return err;
 861
 862        if (size < skb->len)
 863                msg->msg_flags |= MSG_TRUNC;
 864        else
 865                size = skb->len;
 866
 867        err = memcpy_to_msg(msg, skb->data, size);
 868        if (err < 0) {
 869                skb_free_datagram(sk, skb);
 870                return err;
 871        }
 872
 873        sock_recv_ts_and_drops(msg, sk, skb);
 874
 875        if (msg->msg_name) {
 876                __sockaddr_check_size(RAW_MIN_NAMELEN);
 877                msg->msg_namelen = RAW_MIN_NAMELEN;
 878                memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
 879        }
 880
 881        /* assign the flags that have been recorded in raw_rcv() */
 882        msg->msg_flags |= *(raw_flags(skb));
 883
 884        skb_free_datagram(sk, skb);
 885
 886        return size;
 887}
 888
 889static int raw_sock_no_ioctlcmd(struct socket *sock, unsigned int cmd,
 890                                unsigned long arg)
 891{
 892        /* no ioctls for socket layer -> hand it down to NIC layer */
 893        return -ENOIOCTLCMD;
 894}
 895
 896static const struct proto_ops raw_ops = {
 897        .family        = PF_CAN,
 898        .release       = raw_release,
 899        .bind          = raw_bind,
 900        .connect       = sock_no_connect,
 901        .socketpair    = sock_no_socketpair,
 902        .accept        = sock_no_accept,
 903        .getname       = raw_getname,
 904        .poll          = datagram_poll,
 905        .ioctl         = raw_sock_no_ioctlcmd,
 906        .gettstamp     = sock_gettstamp,
 907        .listen        = sock_no_listen,
 908        .shutdown      = sock_no_shutdown,
 909        .setsockopt    = raw_setsockopt,
 910        .getsockopt    = raw_getsockopt,
 911        .sendmsg       = raw_sendmsg,
 912        .recvmsg       = raw_recvmsg,
 913        .mmap          = sock_no_mmap,
 914        .sendpage      = sock_no_sendpage,
 915};
 916
 917static struct proto raw_proto __read_mostly = {
 918        .name       = "CAN_RAW",
 919        .owner      = THIS_MODULE,
 920        .obj_size   = sizeof(struct raw_sock),
 921        .init       = raw_init,
 922};
 923
 924static const struct can_proto raw_can_proto = {
 925        .type       = SOCK_RAW,
 926        .protocol   = CAN_RAW,
 927        .ops        = &raw_ops,
 928        .prot       = &raw_proto,
 929};
 930
 931static struct notifier_block canraw_notifier = {
 932        .notifier_call = raw_notifier
 933};
 934
 935static __init int raw_module_init(void)
 936{
 937        int err;
 938
 939        pr_info("can: raw protocol\n");
 940
 941        err = can_proto_register(&raw_can_proto);
 942        if (err < 0)
 943                pr_err("can: registration of raw protocol failed\n");
 944        else
 945                register_netdevice_notifier(&canraw_notifier);
 946
 947        return err;
 948}
 949
 950static __exit void raw_module_exit(void)
 951{
 952        can_proto_unregister(&raw_can_proto);
 953        unregister_netdevice_notifier(&canraw_notifier);
 954}
 955
 956module_init(raw_module_init);
 957module_exit(raw_module_exit);
 958