cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

raw.c (22518B)


      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 sockcm_cookie sockc;
    776	struct sk_buff *skb;
    777	struct net_device *dev;
    778	int ifindex;
    779	int err;
    780
    781	if (msg->msg_name) {
    782		DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
    783
    784		if (msg->msg_namelen < RAW_MIN_NAMELEN)
    785			return -EINVAL;
    786
    787		if (addr->can_family != AF_CAN)
    788			return -EINVAL;
    789
    790		ifindex = addr->can_ifindex;
    791	} else {
    792		ifindex = ro->ifindex;
    793	}
    794
    795	dev = dev_get_by_index(sock_net(sk), ifindex);
    796	if (!dev)
    797		return -ENXIO;
    798
    799	err = -EINVAL;
    800	if (ro->fd_frames && dev->mtu == CANFD_MTU) {
    801		if (unlikely(size != CANFD_MTU && size != CAN_MTU))
    802			goto put_dev;
    803	} else {
    804		if (unlikely(size != CAN_MTU))
    805			goto put_dev;
    806	}
    807
    808	skb = sock_alloc_send_skb(sk, size + sizeof(struct can_skb_priv),
    809				  msg->msg_flags & MSG_DONTWAIT, &err);
    810	if (!skb)
    811		goto put_dev;
    812
    813	can_skb_reserve(skb);
    814	can_skb_prv(skb)->ifindex = dev->ifindex;
    815	can_skb_prv(skb)->skbcnt = 0;
    816
    817	err = memcpy_from_msg(skb_put(skb, size), msg, size);
    818	if (err < 0)
    819		goto free_skb;
    820
    821	sockcm_init(&sockc, sk);
    822	if (msg->msg_controllen) {
    823		err = sock_cmsg_send(sk, msg, &sockc);
    824		if (unlikely(err))
    825			goto free_skb;
    826	}
    827
    828	skb->dev = dev;
    829	skb->priority = sk->sk_priority;
    830	skb->tstamp = sockc.transmit_time;
    831
    832	skb_setup_tx_timestamp(skb, sockc.tsflags);
    833
    834	err = can_send(skb, ro->loopback);
    835
    836	dev_put(dev);
    837
    838	if (err)
    839		goto send_failed;
    840
    841	return size;
    842
    843free_skb:
    844	kfree_skb(skb);
    845put_dev:
    846	dev_put(dev);
    847send_failed:
    848	return err;
    849}
    850
    851static int raw_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
    852		       int flags)
    853{
    854	struct sock *sk = sock->sk;
    855	struct sk_buff *skb;
    856	int err = 0;
    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, &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_cmsgs(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);