linux/net/can/raw.c
<<
>>
Prefs
   1/*
   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 * Send feedback to <socketcan-users@lists.berlios.de>
  41 *
  42 */
  43
  44#include <linux/module.h>
  45#include <linux/init.h>
  46#include <linux/uio.h>
  47#include <linux/net.h>
  48#include <linux/netdevice.h>
  49#include <linux/socket.h>
  50#include <linux/if_arp.h>
  51#include <linux/skbuff.h>
  52#include <linux/can.h>
  53#include <linux/can/core.h>
  54#include <linux/can/raw.h>
  55#include <net/sock.h>
  56#include <net/net_namespace.h>
  57
  58#define CAN_RAW_VERSION CAN_VERSION
  59static __initdata const char banner[] =
  60        KERN_INFO "can: raw protocol (rev " CAN_RAW_VERSION ")\n";
  61
  62MODULE_DESCRIPTION("PF_CAN raw protocol");
  63MODULE_LICENSE("Dual BSD/GPL");
  64MODULE_AUTHOR("Urs Thuermann <urs.thuermann@volkswagen.de>");
  65
  66#define MASK_ALL 0
  67
  68/*
  69 * A raw socket has a list of can_filters attached to it, each receiving
  70 * the CAN frames matching that filter.  If the filter list is empty,
  71 * no CAN frames will be received by the socket.  The default after
  72 * opening the socket, is to have one filter which receives all frames.
  73 * The filter list is allocated dynamically with the exception of the
  74 * list containing only one item.  This common case is optimized by
  75 * storing the single filter in dfilter, to avoid using dynamic memory.
  76 */
  77
  78struct raw_sock {
  79        struct sock sk;
  80        int bound;
  81        int ifindex;
  82        struct notifier_block notifier;
  83        int loopback;
  84        int recv_own_msgs;
  85        int count;                 /* number of active filters */
  86        struct can_filter dfilter; /* default/single filter */
  87        struct can_filter *filter; /* pointer to filter(s) */
  88        can_err_mask_t err_mask;
  89};
  90
  91static inline struct raw_sock *raw_sk(const struct sock *sk)
  92{
  93        return (struct raw_sock *)sk;
  94}
  95
  96static void raw_rcv(struct sk_buff *skb, void *data)
  97{
  98        struct sock *sk = (struct sock *)data;
  99        struct raw_sock *ro = raw_sk(sk);
 100        struct sockaddr_can *addr;
 101
 102        if (!ro->recv_own_msgs) {
 103                /* check the received tx sock reference */
 104                if (skb->sk == sk) {
 105                        kfree_skb(skb);
 106                        return;
 107                }
 108        }
 109
 110        /*
 111         *  Put the datagram to the queue so that raw_recvmsg() can
 112         *  get it from there.  We need to pass the interface index to
 113         *  raw_recvmsg().  We pass a whole struct sockaddr_can in skb->cb
 114         *  containing the interface index.
 115         */
 116
 117        BUILD_BUG_ON(sizeof(skb->cb) < sizeof(struct sockaddr_can));
 118        addr = (struct sockaddr_can *)skb->cb;
 119        memset(addr, 0, sizeof(*addr));
 120        addr->can_family  = AF_CAN;
 121        addr->can_ifindex = skb->dev->ifindex;
 122
 123        if (sock_queue_rcv_skb(sk, skb) < 0)
 124                kfree_skb(skb);
 125}
 126
 127static int raw_enable_filters(struct net_device *dev, struct sock *sk,
 128                              struct can_filter *filter, int count)
 129{
 130        int err = 0;
 131        int i;
 132
 133        for (i = 0; i < count; i++) {
 134                err = can_rx_register(dev, filter[i].can_id,
 135                                      filter[i].can_mask,
 136                                      raw_rcv, sk, "raw");
 137                if (err) {
 138                        /* clean up successfully registered filters */
 139                        while (--i >= 0)
 140                                can_rx_unregister(dev, filter[i].can_id,
 141                                                  filter[i].can_mask,
 142                                                  raw_rcv, sk);
 143                        break;
 144                }
 145        }
 146
 147        return err;
 148}
 149
 150static int raw_enable_errfilter(struct net_device *dev, struct sock *sk,
 151                                can_err_mask_t err_mask)
 152{
 153        int err = 0;
 154
 155        if (err_mask)
 156                err = can_rx_register(dev, 0, err_mask | CAN_ERR_FLAG,
 157                                      raw_rcv, sk, "raw");
 158
 159        return err;
 160}
 161
 162static void raw_disable_filters(struct net_device *dev, struct sock *sk,
 163                              struct can_filter *filter, int count)
 164{
 165        int i;
 166
 167        for (i = 0; i < count; i++)
 168                can_rx_unregister(dev, filter[i].can_id, filter[i].can_mask,
 169                                  raw_rcv, sk);
 170}
 171
 172static inline void raw_disable_errfilter(struct net_device *dev,
 173                                         struct sock *sk,
 174                                         can_err_mask_t err_mask)
 175
 176{
 177        if (err_mask)
 178                can_rx_unregister(dev, 0, err_mask | CAN_ERR_FLAG,
 179                                  raw_rcv, sk);
 180}
 181
 182static inline void raw_disable_allfilters(struct net_device *dev,
 183                                          struct sock *sk)
 184{
 185        struct raw_sock *ro = raw_sk(sk);
 186
 187        raw_disable_filters(dev, sk, ro->filter, ro->count);
 188        raw_disable_errfilter(dev, sk, ro->err_mask);
 189}
 190
 191static int raw_enable_allfilters(struct net_device *dev, struct sock *sk)
 192{
 193        struct raw_sock *ro = raw_sk(sk);
 194        int err;
 195
 196        err = raw_enable_filters(dev, sk, ro->filter, ro->count);
 197        if (!err) {
 198                err = raw_enable_errfilter(dev, sk, ro->err_mask);
 199                if (err)
 200                        raw_disable_filters(dev, sk, ro->filter, ro->count);
 201        }
 202
 203        return err;
 204}
 205
 206static int raw_notifier(struct notifier_block *nb,
 207                        unsigned long msg, void *data)
 208{
 209        struct net_device *dev = (struct net_device *)data;
 210        struct raw_sock *ro = container_of(nb, struct raw_sock, notifier);
 211        struct sock *sk = &ro->sk;
 212
 213        if (!net_eq(dev_net(dev), &init_net))
 214                return NOTIFY_DONE;
 215
 216        if (dev->type != ARPHRD_CAN)
 217                return NOTIFY_DONE;
 218
 219        if (ro->ifindex != dev->ifindex)
 220                return NOTIFY_DONE;
 221
 222        switch (msg) {
 223
 224        case NETDEV_UNREGISTER:
 225                lock_sock(sk);
 226                /* remove current filters & unregister */
 227                if (ro->bound)
 228                        raw_disable_allfilters(dev, sk);
 229
 230                if (ro->count > 1)
 231                        kfree(ro->filter);
 232
 233                ro->ifindex = 0;
 234                ro->bound   = 0;
 235                ro->count   = 0;
 236                release_sock(sk);
 237
 238                sk->sk_err = ENODEV;
 239                if (!sock_flag(sk, SOCK_DEAD))
 240                        sk->sk_error_report(sk);
 241                break;
 242
 243        case NETDEV_DOWN:
 244                sk->sk_err = ENETDOWN;
 245                if (!sock_flag(sk, SOCK_DEAD))
 246                        sk->sk_error_report(sk);
 247                break;
 248        }
 249
 250        return NOTIFY_DONE;
 251}
 252
 253static int raw_init(struct sock *sk)
 254{
 255        struct raw_sock *ro = raw_sk(sk);
 256
 257        ro->bound            = 0;
 258        ro->ifindex          = 0;
 259
 260        /* set default filter to single entry dfilter */
 261        ro->dfilter.can_id   = 0;
 262        ro->dfilter.can_mask = MASK_ALL;
 263        ro->filter           = &ro->dfilter;
 264        ro->count            = 1;
 265
 266        /* set default loopback behaviour */
 267        ro->loopback         = 1;
 268        ro->recv_own_msgs    = 0;
 269
 270        /* set notifier */
 271        ro->notifier.notifier_call = raw_notifier;
 272
 273        register_netdevice_notifier(&ro->notifier);
 274
 275        return 0;
 276}
 277
 278static int raw_release(struct socket *sock)
 279{
 280        struct sock *sk = sock->sk;
 281        struct raw_sock *ro = raw_sk(sk);
 282
 283        unregister_netdevice_notifier(&ro->notifier);
 284
 285        lock_sock(sk);
 286
 287        /* remove current filters & unregister */
 288        if (ro->bound) {
 289                if (ro->ifindex) {
 290                        struct net_device *dev;
 291
 292                        dev = dev_get_by_index(&init_net, ro->ifindex);
 293                        if (dev) {
 294                                raw_disable_allfilters(dev, sk);
 295                                dev_put(dev);
 296                        }
 297                } else
 298                        raw_disable_allfilters(NULL, sk);
 299        }
 300
 301        if (ro->count > 1)
 302                kfree(ro->filter);
 303
 304        ro->ifindex = 0;
 305        ro->bound   = 0;
 306        ro->count   = 0;
 307
 308        release_sock(sk);
 309        sock_put(sk);
 310
 311        return 0;
 312}
 313
 314static int raw_bind(struct socket *sock, struct sockaddr *uaddr, int len)
 315{
 316        struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
 317        struct sock *sk = sock->sk;
 318        struct raw_sock *ro = raw_sk(sk);
 319        int ifindex;
 320        int err = 0;
 321        int notify_enetdown = 0;
 322
 323        if (len < sizeof(*addr))
 324                return -EINVAL;
 325
 326        lock_sock(sk);
 327
 328        if (ro->bound && addr->can_ifindex == ro->ifindex)
 329                goto out;
 330
 331        if (addr->can_ifindex) {
 332                struct net_device *dev;
 333
 334                dev = dev_get_by_index(&init_net, addr->can_ifindex);
 335                if (!dev) {
 336                        err = -ENODEV;
 337                        goto out;
 338                }
 339                if (dev->type != ARPHRD_CAN) {
 340                        dev_put(dev);
 341                        err = -ENODEV;
 342                        goto out;
 343                }
 344                if (!(dev->flags & IFF_UP))
 345                        notify_enetdown = 1;
 346
 347                ifindex = dev->ifindex;
 348
 349                /* filters set by default/setsockopt */
 350                err = raw_enable_allfilters(dev, sk);
 351                dev_put(dev);
 352        } else {
 353                ifindex = 0;
 354
 355                /* filters set by default/setsockopt */
 356                err = raw_enable_allfilters(NULL, sk);
 357        }
 358
 359        if (!err) {
 360                if (ro->bound) {
 361                        /* unregister old filters */
 362                        if (ro->ifindex) {
 363                                struct net_device *dev;
 364
 365                                dev = dev_get_by_index(&init_net, ro->ifindex);
 366                                if (dev) {
 367                                        raw_disable_allfilters(dev, sk);
 368                                        dev_put(dev);
 369                                }
 370                        } else
 371                                raw_disable_allfilters(NULL, sk);
 372                }
 373                ro->ifindex = ifindex;
 374                ro->bound = 1;
 375        }
 376
 377 out:
 378        release_sock(sk);
 379
 380        if (notify_enetdown) {
 381                sk->sk_err = ENETDOWN;
 382                if (!sock_flag(sk, SOCK_DEAD))
 383                        sk->sk_error_report(sk);
 384        }
 385
 386        return err;
 387}
 388
 389static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
 390                       int *len, int peer)
 391{
 392        struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
 393        struct sock *sk = sock->sk;
 394        struct raw_sock *ro = raw_sk(sk);
 395
 396        if (peer)
 397                return -EOPNOTSUPP;
 398
 399        memset(addr, 0, sizeof(*addr));
 400        addr->can_family  = AF_CAN;
 401        addr->can_ifindex = ro->ifindex;
 402
 403        *len = sizeof(*addr);
 404
 405        return 0;
 406}
 407
 408static int raw_setsockopt(struct socket *sock, int level, int optname,
 409                          char __user *optval, int optlen)
 410{
 411        struct sock *sk = sock->sk;
 412        struct raw_sock *ro = raw_sk(sk);
 413        struct can_filter *filter = NULL;  /* dyn. alloc'ed filters */
 414        struct can_filter sfilter;         /* single filter */
 415        struct net_device *dev = NULL;
 416        can_err_mask_t err_mask = 0;
 417        int count = 0;
 418        int err = 0;
 419
 420        if (level != SOL_CAN_RAW)
 421                return -EINVAL;
 422        if (optlen < 0)
 423                return -EINVAL;
 424
 425        switch (optname) {
 426
 427        case CAN_RAW_FILTER:
 428                if (optlen % sizeof(struct can_filter) != 0)
 429                        return -EINVAL;
 430
 431                count = optlen / sizeof(struct can_filter);
 432
 433                if (count > 1) {
 434                        /* filter does not fit into dfilter => alloc space */
 435                        filter = kmalloc(optlen, GFP_KERNEL);
 436                        if (!filter)
 437                                return -ENOMEM;
 438
 439                        if (copy_from_user(filter, optval, optlen)) {
 440                                kfree(filter);
 441                                return -EFAULT;
 442                        }
 443                } else if (count == 1) {
 444                        if (copy_from_user(&sfilter, optval, optlen))
 445                                return -EFAULT;
 446                }
 447
 448                lock_sock(sk);
 449
 450                if (ro->bound && ro->ifindex)
 451                        dev = dev_get_by_index(&init_net, ro->ifindex);
 452
 453                if (ro->bound) {
 454                        /* (try to) register the new filters */
 455                        if (count == 1)
 456                                err = raw_enable_filters(dev, sk, &sfilter, 1);
 457                        else
 458                                err = raw_enable_filters(dev, sk, filter,
 459                                                         count);
 460                        if (err) {
 461                                if (count > 1)
 462                                        kfree(filter);
 463                                goto out_fil;
 464                        }
 465
 466                        /* remove old filter registrations */
 467                        raw_disable_filters(dev, sk, ro->filter, ro->count);
 468                }
 469
 470                /* remove old filter space */
 471                if (ro->count > 1)
 472                        kfree(ro->filter);
 473
 474                /* link new filters to the socket */
 475                if (count == 1) {
 476                        /* copy filter data for single filter */
 477                        ro->dfilter = sfilter;
 478                        filter = &ro->dfilter;
 479                }
 480                ro->filter = filter;
 481                ro->count  = count;
 482
 483 out_fil:
 484                if (dev)
 485                        dev_put(dev);
 486
 487                release_sock(sk);
 488
 489                break;
 490
 491        case CAN_RAW_ERR_FILTER:
 492                if (optlen != sizeof(err_mask))
 493                        return -EINVAL;
 494
 495                if (copy_from_user(&err_mask, optval, optlen))
 496                        return -EFAULT;
 497
 498                err_mask &= CAN_ERR_MASK;
 499
 500                lock_sock(sk);
 501
 502                if (ro->bound && ro->ifindex)
 503                        dev = dev_get_by_index(&init_net, ro->ifindex);
 504
 505                /* remove current error mask */
 506                if (ro->bound) {
 507                        /* (try to) register the new err_mask */
 508                        err = raw_enable_errfilter(dev, sk, err_mask);
 509
 510                        if (err)
 511                                goto out_err;
 512
 513                        /* remove old err_mask registration */
 514                        raw_disable_errfilter(dev, sk, ro->err_mask);
 515                }
 516
 517                /* link new err_mask to the socket */
 518                ro->err_mask = err_mask;
 519
 520 out_err:
 521                if (dev)
 522                        dev_put(dev);
 523
 524                release_sock(sk);
 525
 526                break;
 527
 528        case CAN_RAW_LOOPBACK:
 529                if (optlen != sizeof(ro->loopback))
 530                        return -EINVAL;
 531
 532                if (copy_from_user(&ro->loopback, optval, optlen))
 533                        return -EFAULT;
 534
 535                break;
 536
 537        case CAN_RAW_RECV_OWN_MSGS:
 538                if (optlen != sizeof(ro->recv_own_msgs))
 539                        return -EINVAL;
 540
 541                if (copy_from_user(&ro->recv_own_msgs, optval, optlen))
 542                        return -EFAULT;
 543
 544                break;
 545
 546        default:
 547                return -ENOPROTOOPT;
 548        }
 549        return err;
 550}
 551
 552static int raw_getsockopt(struct socket *sock, int level, int optname,
 553                          char __user *optval, int __user *optlen)
 554{
 555        struct sock *sk = sock->sk;
 556        struct raw_sock *ro = raw_sk(sk);
 557        int len;
 558        void *val;
 559        int err = 0;
 560
 561        if (level != SOL_CAN_RAW)
 562                return -EINVAL;
 563        if (get_user(len, optlen))
 564                return -EFAULT;
 565        if (len < 0)
 566                return -EINVAL;
 567
 568        switch (optname) {
 569
 570        case CAN_RAW_FILTER:
 571                lock_sock(sk);
 572                if (ro->count > 0) {
 573                        int fsize = ro->count * sizeof(struct can_filter);
 574                        if (len > fsize)
 575                                len = fsize;
 576                        if (copy_to_user(optval, ro->filter, len))
 577                                err = -EFAULT;
 578                } else
 579                        len = 0;
 580                release_sock(sk);
 581
 582                if (!err)
 583                        err = put_user(len, optlen);
 584                return err;
 585
 586        case CAN_RAW_ERR_FILTER:
 587                if (len > sizeof(can_err_mask_t))
 588                        len = sizeof(can_err_mask_t);
 589                val = &ro->err_mask;
 590                break;
 591
 592        case CAN_RAW_LOOPBACK:
 593                if (len > sizeof(int))
 594                        len = sizeof(int);
 595                val = &ro->loopback;
 596                break;
 597
 598        case CAN_RAW_RECV_OWN_MSGS:
 599                if (len > sizeof(int))
 600                        len = sizeof(int);
 601                val = &ro->recv_own_msgs;
 602                break;
 603
 604        default:
 605                return -ENOPROTOOPT;
 606        }
 607
 608        if (put_user(len, optlen))
 609                return -EFAULT;
 610        if (copy_to_user(optval, val, len))
 611                return -EFAULT;
 612        return 0;
 613}
 614
 615static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
 616                       struct msghdr *msg, size_t size)
 617{
 618        struct sock *sk = sock->sk;
 619        struct raw_sock *ro = raw_sk(sk);
 620        struct sk_buff *skb;
 621        struct net_device *dev;
 622        int ifindex;
 623        int err;
 624
 625        if (msg->msg_name) {
 626                struct sockaddr_can *addr =
 627                        (struct sockaddr_can *)msg->msg_name;
 628
 629                if (addr->can_family != AF_CAN)
 630                        return -EINVAL;
 631
 632                ifindex = addr->can_ifindex;
 633        } else
 634                ifindex = ro->ifindex;
 635
 636        if (size != sizeof(struct can_frame))
 637                return -EINVAL;
 638
 639        dev = dev_get_by_index(&init_net, ifindex);
 640        if (!dev)
 641                return -ENXIO;
 642
 643        skb = sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT,
 644                                  &err);
 645        if (!skb) {
 646                dev_put(dev);
 647                return err;
 648        }
 649
 650        err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size);
 651        if (err < 0) {
 652                kfree_skb(skb);
 653                dev_put(dev);
 654                return err;
 655        }
 656        skb->dev = dev;
 657        skb->sk  = sk;
 658
 659        err = can_send(skb, ro->loopback);
 660
 661        dev_put(dev);
 662
 663        if (err)
 664                return err;
 665
 666        return size;
 667}
 668
 669static int raw_recvmsg(struct kiocb *iocb, struct socket *sock,
 670                       struct msghdr *msg, size_t size, int flags)
 671{
 672        struct sock *sk = sock->sk;
 673        struct sk_buff *skb;
 674        int err = 0;
 675        int noblock;
 676
 677        noblock =  flags & MSG_DONTWAIT;
 678        flags   &= ~MSG_DONTWAIT;
 679
 680        skb = skb_recv_datagram(sk, flags, noblock, &err);
 681        if (!skb)
 682                return err;
 683
 684        if (size < skb->len)
 685                msg->msg_flags |= MSG_TRUNC;
 686        else
 687                size = skb->len;
 688
 689        err = memcpy_toiovec(msg->msg_iov, skb->data, size);
 690        if (err < 0) {
 691                skb_free_datagram(sk, skb);
 692                return err;
 693        }
 694
 695        sock_recv_timestamp(msg, sk, skb);
 696
 697        if (msg->msg_name) {
 698                msg->msg_namelen = sizeof(struct sockaddr_can);
 699                memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
 700        }
 701
 702        skb_free_datagram(sk, skb);
 703
 704        return size;
 705}
 706
 707static struct proto_ops raw_ops __read_mostly = {
 708        .family        = PF_CAN,
 709        .release       = raw_release,
 710        .bind          = raw_bind,
 711        .connect       = sock_no_connect,
 712        .socketpair    = sock_no_socketpair,
 713        .accept        = sock_no_accept,
 714        .getname       = raw_getname,
 715        .poll          = datagram_poll,
 716        .ioctl         = NULL,          /* use can_ioctl() from af_can.c */
 717        .listen        = sock_no_listen,
 718        .shutdown      = sock_no_shutdown,
 719        .setsockopt    = raw_setsockopt,
 720        .getsockopt    = raw_getsockopt,
 721        .sendmsg       = raw_sendmsg,
 722        .recvmsg       = raw_recvmsg,
 723        .mmap          = sock_no_mmap,
 724        .sendpage      = sock_no_sendpage,
 725};
 726
 727static struct proto raw_proto __read_mostly = {
 728        .name       = "CAN_RAW",
 729        .owner      = THIS_MODULE,
 730        .obj_size   = sizeof(struct raw_sock),
 731        .init       = raw_init,
 732};
 733
 734static struct can_proto raw_can_proto __read_mostly = {
 735        .type       = SOCK_RAW,
 736        .protocol   = CAN_RAW,
 737        .capability = -1,
 738        .ops        = &raw_ops,
 739        .prot       = &raw_proto,
 740};
 741
 742static __init int raw_module_init(void)
 743{
 744        int err;
 745
 746        printk(banner);
 747
 748        err = can_proto_register(&raw_can_proto);
 749        if (err < 0)
 750                printk(KERN_ERR "can: registration of raw protocol failed\n");
 751
 752        return err;
 753}
 754
 755static __exit void raw_module_exit(void)
 756{
 757        can_proto_unregister(&raw_can_proto);
 758}
 759
 760module_init(raw_module_init);
 761module_exit(raw_module_exit);
 762