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

bcm.c (43660B)


      1// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
      2/*
      3 * bcm.c - Broadcast Manager to filter/send (cyclic) CAN content
      4 *
      5 * Copyright (c) 2002-2017 Volkswagen Group Electronic Research
      6 * All rights reserved.
      7 *
      8 * Redistribution and use in source and binary forms, with or without
      9 * modification, are permitted provided that the following conditions
     10 * are met:
     11 * 1. Redistributions of source code must retain the above copyright
     12 *    notice, this list of conditions and the following disclaimer.
     13 * 2. Redistributions in binary form must reproduce the above copyright
     14 *    notice, this list of conditions and the following disclaimer in the
     15 *    documentation and/or other materials provided with the distribution.
     16 * 3. Neither the name of Volkswagen nor the names of its contributors
     17 *    may be used to endorse or promote products derived from this software
     18 *    without specific prior written permission.
     19 *
     20 * Alternatively, provided that this notice is retained in full, this
     21 * software may be distributed under the terms of the GNU General
     22 * Public License ("GPL") version 2, in which case the provisions of the
     23 * GPL apply INSTEAD OF those given above.
     24 *
     25 * The provided data structures and external interfaces from this code
     26 * are not restricted to be used by modules with a GPL compatible license.
     27 *
     28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
     39 * DAMAGE.
     40 *
     41 */
     42
     43#include <linux/module.h>
     44#include <linux/init.h>
     45#include <linux/interrupt.h>
     46#include <linux/hrtimer.h>
     47#include <linux/list.h>
     48#include <linux/proc_fs.h>
     49#include <linux/seq_file.h>
     50#include <linux/uio.h>
     51#include <linux/net.h>
     52#include <linux/netdevice.h>
     53#include <linux/socket.h>
     54#include <linux/if_arp.h>
     55#include <linux/skbuff.h>
     56#include <linux/can.h>
     57#include <linux/can/core.h>
     58#include <linux/can/skb.h>
     59#include <linux/can/bcm.h>
     60#include <linux/slab.h>
     61#include <net/sock.h>
     62#include <net/net_namespace.h>
     63
     64/*
     65 * To send multiple CAN frame content within TX_SETUP or to filter
     66 * CAN messages with multiplex index within RX_SETUP, the number of
     67 * different filters is limited to 256 due to the one byte index value.
     68 */
     69#define MAX_NFRAMES 256
     70
     71/* limit timers to 400 days for sending/timeouts */
     72#define BCM_TIMER_SEC_MAX (400 * 24 * 60 * 60)
     73
     74/* use of last_frames[index].flags */
     75#define RX_RECV    0x40 /* received data for this element */
     76#define RX_THR     0x80 /* element not been sent due to throttle feature */
     77#define BCM_CAN_FLAGS_MASK 0x3F /* to clean private flags after usage */
     78
     79/* get best masking value for can_rx_register() for a given single can_id */
     80#define REGMASK(id) ((id & CAN_EFF_FLAG) ? \
     81		     (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG) : \
     82		     (CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG))
     83
     84MODULE_DESCRIPTION("PF_CAN broadcast manager protocol");
     85MODULE_LICENSE("Dual BSD/GPL");
     86MODULE_AUTHOR("Oliver Hartkopp <oliver.hartkopp@volkswagen.de>");
     87MODULE_ALIAS("can-proto-2");
     88
     89#define BCM_MIN_NAMELEN CAN_REQUIRED_SIZE(struct sockaddr_can, can_ifindex)
     90
     91/*
     92 * easy access to the first 64 bit of can(fd)_frame payload. cp->data is
     93 * 64 bit aligned so the offset has to be multiples of 8 which is ensured
     94 * by the only callers in bcm_rx_cmp_to_index() bcm_rx_handler().
     95 */
     96static inline u64 get_u64(const struct canfd_frame *cp, int offset)
     97{
     98	return *(u64 *)(cp->data + offset);
     99}
    100
    101struct bcm_op {
    102	struct list_head list;
    103	struct rcu_head rcu;
    104	int ifindex;
    105	canid_t can_id;
    106	u32 flags;
    107	unsigned long frames_abs, frames_filtered;
    108	struct bcm_timeval ival1, ival2;
    109	struct hrtimer timer, thrtimer;
    110	ktime_t rx_stamp, kt_ival1, kt_ival2, kt_lastmsg;
    111	int rx_ifindex;
    112	int cfsiz;
    113	u32 count;
    114	u32 nframes;
    115	u32 currframe;
    116	/* void pointers to arrays of struct can[fd]_frame */
    117	void *frames;
    118	void *last_frames;
    119	struct canfd_frame sframe;
    120	struct canfd_frame last_sframe;
    121	struct sock *sk;
    122	struct net_device *rx_reg_dev;
    123};
    124
    125struct bcm_sock {
    126	struct sock sk;
    127	int bound;
    128	int ifindex;
    129	struct list_head notifier;
    130	struct list_head rx_ops;
    131	struct list_head tx_ops;
    132	unsigned long dropped_usr_msgs;
    133	struct proc_dir_entry *bcm_proc_read;
    134	char procname [32]; /* inode number in decimal with \0 */
    135};
    136
    137static LIST_HEAD(bcm_notifier_list);
    138static DEFINE_SPINLOCK(bcm_notifier_lock);
    139static struct bcm_sock *bcm_busy_notifier;
    140
    141static inline struct bcm_sock *bcm_sk(const struct sock *sk)
    142{
    143	return (struct bcm_sock *)sk;
    144}
    145
    146static inline ktime_t bcm_timeval_to_ktime(struct bcm_timeval tv)
    147{
    148	return ktime_set(tv.tv_sec, tv.tv_usec * NSEC_PER_USEC);
    149}
    150
    151/* check limitations for timeval provided by user */
    152static bool bcm_is_invalid_tv(struct bcm_msg_head *msg_head)
    153{
    154	if ((msg_head->ival1.tv_sec < 0) ||
    155	    (msg_head->ival1.tv_sec > BCM_TIMER_SEC_MAX) ||
    156	    (msg_head->ival1.tv_usec < 0) ||
    157	    (msg_head->ival1.tv_usec >= USEC_PER_SEC) ||
    158	    (msg_head->ival2.tv_sec < 0) ||
    159	    (msg_head->ival2.tv_sec > BCM_TIMER_SEC_MAX) ||
    160	    (msg_head->ival2.tv_usec < 0) ||
    161	    (msg_head->ival2.tv_usec >= USEC_PER_SEC))
    162		return true;
    163
    164	return false;
    165}
    166
    167#define CFSIZ(flags) ((flags & CAN_FD_FRAME) ? CANFD_MTU : CAN_MTU)
    168#define OPSIZ sizeof(struct bcm_op)
    169#define MHSIZ sizeof(struct bcm_msg_head)
    170
    171/*
    172 * procfs functions
    173 */
    174#if IS_ENABLED(CONFIG_PROC_FS)
    175static char *bcm_proc_getifname(struct net *net, char *result, int ifindex)
    176{
    177	struct net_device *dev;
    178
    179	if (!ifindex)
    180		return "any";
    181
    182	rcu_read_lock();
    183	dev = dev_get_by_index_rcu(net, ifindex);
    184	if (dev)
    185		strcpy(result, dev->name);
    186	else
    187		strcpy(result, "???");
    188	rcu_read_unlock();
    189
    190	return result;
    191}
    192
    193static int bcm_proc_show(struct seq_file *m, void *v)
    194{
    195	char ifname[IFNAMSIZ];
    196	struct net *net = m->private;
    197	struct sock *sk = (struct sock *)pde_data(m->file->f_inode);
    198	struct bcm_sock *bo = bcm_sk(sk);
    199	struct bcm_op *op;
    200
    201	seq_printf(m, ">>> socket %pK", sk->sk_socket);
    202	seq_printf(m, " / sk %pK", sk);
    203	seq_printf(m, " / bo %pK", bo);
    204	seq_printf(m, " / dropped %lu", bo->dropped_usr_msgs);
    205	seq_printf(m, " / bound %s", bcm_proc_getifname(net, ifname, bo->ifindex));
    206	seq_printf(m, " <<<\n");
    207
    208	list_for_each_entry(op, &bo->rx_ops, list) {
    209
    210		unsigned long reduction;
    211
    212		/* print only active entries & prevent division by zero */
    213		if (!op->frames_abs)
    214			continue;
    215
    216		seq_printf(m, "rx_op: %03X %-5s ", op->can_id,
    217			   bcm_proc_getifname(net, ifname, op->ifindex));
    218
    219		if (op->flags & CAN_FD_FRAME)
    220			seq_printf(m, "(%u)", op->nframes);
    221		else
    222			seq_printf(m, "[%u]", op->nframes);
    223
    224		seq_printf(m, "%c ", (op->flags & RX_CHECK_DLC) ? 'd' : ' ');
    225
    226		if (op->kt_ival1)
    227			seq_printf(m, "timeo=%lld ",
    228				   (long long)ktime_to_us(op->kt_ival1));
    229
    230		if (op->kt_ival2)
    231			seq_printf(m, "thr=%lld ",
    232				   (long long)ktime_to_us(op->kt_ival2));
    233
    234		seq_printf(m, "# recv %ld (%ld) => reduction: ",
    235			   op->frames_filtered, op->frames_abs);
    236
    237		reduction = 100 - (op->frames_filtered * 100) / op->frames_abs;
    238
    239		seq_printf(m, "%s%ld%%\n",
    240			   (reduction == 100) ? "near " : "", reduction);
    241	}
    242
    243	list_for_each_entry(op, &bo->tx_ops, list) {
    244
    245		seq_printf(m, "tx_op: %03X %s ", op->can_id,
    246			   bcm_proc_getifname(net, ifname, op->ifindex));
    247
    248		if (op->flags & CAN_FD_FRAME)
    249			seq_printf(m, "(%u) ", op->nframes);
    250		else
    251			seq_printf(m, "[%u] ", op->nframes);
    252
    253		if (op->kt_ival1)
    254			seq_printf(m, "t1=%lld ",
    255				   (long long)ktime_to_us(op->kt_ival1));
    256
    257		if (op->kt_ival2)
    258			seq_printf(m, "t2=%lld ",
    259				   (long long)ktime_to_us(op->kt_ival2));
    260
    261		seq_printf(m, "# sent %ld\n", op->frames_abs);
    262	}
    263	seq_putc(m, '\n');
    264	return 0;
    265}
    266#endif /* CONFIG_PROC_FS */
    267
    268/*
    269 * bcm_can_tx - send the (next) CAN frame to the appropriate CAN interface
    270 *              of the given bcm tx op
    271 */
    272static void bcm_can_tx(struct bcm_op *op)
    273{
    274	struct sk_buff *skb;
    275	struct net_device *dev;
    276	struct canfd_frame *cf = op->frames + op->cfsiz * op->currframe;
    277
    278	/* no target device? => exit */
    279	if (!op->ifindex)
    280		return;
    281
    282	dev = dev_get_by_index(sock_net(op->sk), op->ifindex);
    283	if (!dev) {
    284		/* RFC: should this bcm_op remove itself here? */
    285		return;
    286	}
    287
    288	skb = alloc_skb(op->cfsiz + sizeof(struct can_skb_priv), gfp_any());
    289	if (!skb)
    290		goto out;
    291
    292	can_skb_reserve(skb);
    293	can_skb_prv(skb)->ifindex = dev->ifindex;
    294	can_skb_prv(skb)->skbcnt = 0;
    295
    296	skb_put_data(skb, cf, op->cfsiz);
    297
    298	/* send with loopback */
    299	skb->dev = dev;
    300	can_skb_set_owner(skb, op->sk);
    301	can_send(skb, 1);
    302
    303	/* update statistics */
    304	op->currframe++;
    305	op->frames_abs++;
    306
    307	/* reached last frame? */
    308	if (op->currframe >= op->nframes)
    309		op->currframe = 0;
    310out:
    311	dev_put(dev);
    312}
    313
    314/*
    315 * bcm_send_to_user - send a BCM message to the userspace
    316 *                    (consisting of bcm_msg_head + x CAN frames)
    317 */
    318static void bcm_send_to_user(struct bcm_op *op, struct bcm_msg_head *head,
    319			     struct canfd_frame *frames, int has_timestamp)
    320{
    321	struct sk_buff *skb;
    322	struct canfd_frame *firstframe;
    323	struct sockaddr_can *addr;
    324	struct sock *sk = op->sk;
    325	unsigned int datalen = head->nframes * op->cfsiz;
    326	int err;
    327
    328	skb = alloc_skb(sizeof(*head) + datalen, gfp_any());
    329	if (!skb)
    330		return;
    331
    332	skb_put_data(skb, head, sizeof(*head));
    333
    334	if (head->nframes) {
    335		/* CAN frames starting here */
    336		firstframe = (struct canfd_frame *)skb_tail_pointer(skb);
    337
    338		skb_put_data(skb, frames, datalen);
    339
    340		/*
    341		 * the BCM uses the flags-element of the canfd_frame
    342		 * structure for internal purposes. This is only
    343		 * relevant for updates that are generated by the
    344		 * BCM, where nframes is 1
    345		 */
    346		if (head->nframes == 1)
    347			firstframe->flags &= BCM_CAN_FLAGS_MASK;
    348	}
    349
    350	if (has_timestamp) {
    351		/* restore rx timestamp */
    352		skb->tstamp = op->rx_stamp;
    353	}
    354
    355	/*
    356	 *  Put the datagram to the queue so that bcm_recvmsg() can
    357	 *  get it from there.  We need to pass the interface index to
    358	 *  bcm_recvmsg().  We pass a whole struct sockaddr_can in skb->cb
    359	 *  containing the interface index.
    360	 */
    361
    362	sock_skb_cb_check_size(sizeof(struct sockaddr_can));
    363	addr = (struct sockaddr_can *)skb->cb;
    364	memset(addr, 0, sizeof(*addr));
    365	addr->can_family  = AF_CAN;
    366	addr->can_ifindex = op->rx_ifindex;
    367
    368	err = sock_queue_rcv_skb(sk, skb);
    369	if (err < 0) {
    370		struct bcm_sock *bo = bcm_sk(sk);
    371
    372		kfree_skb(skb);
    373		/* don't care about overflows in this statistic */
    374		bo->dropped_usr_msgs++;
    375	}
    376}
    377
    378static bool bcm_tx_set_expiry(struct bcm_op *op, struct hrtimer *hrt)
    379{
    380	ktime_t ival;
    381
    382	if (op->kt_ival1 && op->count)
    383		ival = op->kt_ival1;
    384	else if (op->kt_ival2)
    385		ival = op->kt_ival2;
    386	else
    387		return false;
    388
    389	hrtimer_set_expires(hrt, ktime_add(ktime_get(), ival));
    390	return true;
    391}
    392
    393static void bcm_tx_start_timer(struct bcm_op *op)
    394{
    395	if (bcm_tx_set_expiry(op, &op->timer))
    396		hrtimer_start_expires(&op->timer, HRTIMER_MODE_ABS_SOFT);
    397}
    398
    399/* bcm_tx_timeout_handler - performs cyclic CAN frame transmissions */
    400static enum hrtimer_restart bcm_tx_timeout_handler(struct hrtimer *hrtimer)
    401{
    402	struct bcm_op *op = container_of(hrtimer, struct bcm_op, timer);
    403	struct bcm_msg_head msg_head;
    404
    405	if (op->kt_ival1 && (op->count > 0)) {
    406		op->count--;
    407		if (!op->count && (op->flags & TX_COUNTEVT)) {
    408
    409			/* create notification to user */
    410			memset(&msg_head, 0, sizeof(msg_head));
    411			msg_head.opcode  = TX_EXPIRED;
    412			msg_head.flags   = op->flags;
    413			msg_head.count   = op->count;
    414			msg_head.ival1   = op->ival1;
    415			msg_head.ival2   = op->ival2;
    416			msg_head.can_id  = op->can_id;
    417			msg_head.nframes = 0;
    418
    419			bcm_send_to_user(op, &msg_head, NULL, 0);
    420		}
    421		bcm_can_tx(op);
    422
    423	} else if (op->kt_ival2) {
    424		bcm_can_tx(op);
    425	}
    426
    427	return bcm_tx_set_expiry(op, &op->timer) ?
    428		HRTIMER_RESTART : HRTIMER_NORESTART;
    429}
    430
    431/*
    432 * bcm_rx_changed - create a RX_CHANGED notification due to changed content
    433 */
    434static void bcm_rx_changed(struct bcm_op *op, struct canfd_frame *data)
    435{
    436	struct bcm_msg_head head;
    437
    438	/* update statistics */
    439	op->frames_filtered++;
    440
    441	/* prevent statistics overflow */
    442	if (op->frames_filtered > ULONG_MAX/100)
    443		op->frames_filtered = op->frames_abs = 0;
    444
    445	/* this element is not throttled anymore */
    446	data->flags &= (BCM_CAN_FLAGS_MASK|RX_RECV);
    447
    448	memset(&head, 0, sizeof(head));
    449	head.opcode  = RX_CHANGED;
    450	head.flags   = op->flags;
    451	head.count   = op->count;
    452	head.ival1   = op->ival1;
    453	head.ival2   = op->ival2;
    454	head.can_id  = op->can_id;
    455	head.nframes = 1;
    456
    457	bcm_send_to_user(op, &head, data, 1);
    458}
    459
    460/*
    461 * bcm_rx_update_and_send - process a detected relevant receive content change
    462 *                          1. update the last received data
    463 *                          2. send a notification to the user (if possible)
    464 */
    465static void bcm_rx_update_and_send(struct bcm_op *op,
    466				   struct canfd_frame *lastdata,
    467				   const struct canfd_frame *rxdata)
    468{
    469	memcpy(lastdata, rxdata, op->cfsiz);
    470
    471	/* mark as used and throttled by default */
    472	lastdata->flags |= (RX_RECV|RX_THR);
    473
    474	/* throttling mode inactive ? */
    475	if (!op->kt_ival2) {
    476		/* send RX_CHANGED to the user immediately */
    477		bcm_rx_changed(op, lastdata);
    478		return;
    479	}
    480
    481	/* with active throttling timer we are just done here */
    482	if (hrtimer_active(&op->thrtimer))
    483		return;
    484
    485	/* first reception with enabled throttling mode */
    486	if (!op->kt_lastmsg)
    487		goto rx_changed_settime;
    488
    489	/* got a second frame inside a potential throttle period? */
    490	if (ktime_us_delta(ktime_get(), op->kt_lastmsg) <
    491	    ktime_to_us(op->kt_ival2)) {
    492		/* do not send the saved data - only start throttle timer */
    493		hrtimer_start(&op->thrtimer,
    494			      ktime_add(op->kt_lastmsg, op->kt_ival2),
    495			      HRTIMER_MODE_ABS_SOFT);
    496		return;
    497	}
    498
    499	/* the gap was that big, that throttling was not needed here */
    500rx_changed_settime:
    501	bcm_rx_changed(op, lastdata);
    502	op->kt_lastmsg = ktime_get();
    503}
    504
    505/*
    506 * bcm_rx_cmp_to_index - (bit)compares the currently received data to formerly
    507 *                       received data stored in op->last_frames[]
    508 */
    509static void bcm_rx_cmp_to_index(struct bcm_op *op, unsigned int index,
    510				const struct canfd_frame *rxdata)
    511{
    512	struct canfd_frame *cf = op->frames + op->cfsiz * index;
    513	struct canfd_frame *lcf = op->last_frames + op->cfsiz * index;
    514	int i;
    515
    516	/*
    517	 * no one uses the MSBs of flags for comparison,
    518	 * so we use it here to detect the first time of reception
    519	 */
    520
    521	if (!(lcf->flags & RX_RECV)) {
    522		/* received data for the first time => send update to user */
    523		bcm_rx_update_and_send(op, lcf, rxdata);
    524		return;
    525	}
    526
    527	/* do a real check in CAN frame data section */
    528	for (i = 0; i < rxdata->len; i += 8) {
    529		if ((get_u64(cf, i) & get_u64(rxdata, i)) !=
    530		    (get_u64(cf, i) & get_u64(lcf, i))) {
    531			bcm_rx_update_and_send(op, lcf, rxdata);
    532			return;
    533		}
    534	}
    535
    536	if (op->flags & RX_CHECK_DLC) {
    537		/* do a real check in CAN frame length */
    538		if (rxdata->len != lcf->len) {
    539			bcm_rx_update_and_send(op, lcf, rxdata);
    540			return;
    541		}
    542	}
    543}
    544
    545/*
    546 * bcm_rx_starttimer - enable timeout monitoring for CAN frame reception
    547 */
    548static void bcm_rx_starttimer(struct bcm_op *op)
    549{
    550	if (op->flags & RX_NO_AUTOTIMER)
    551		return;
    552
    553	if (op->kt_ival1)
    554		hrtimer_start(&op->timer, op->kt_ival1, HRTIMER_MODE_REL_SOFT);
    555}
    556
    557/* bcm_rx_timeout_handler - when the (cyclic) CAN frame reception timed out */
    558static enum hrtimer_restart bcm_rx_timeout_handler(struct hrtimer *hrtimer)
    559{
    560	struct bcm_op *op = container_of(hrtimer, struct bcm_op, timer);
    561	struct bcm_msg_head msg_head;
    562
    563	/* if user wants to be informed, when cyclic CAN-Messages come back */
    564	if ((op->flags & RX_ANNOUNCE_RESUME) && op->last_frames) {
    565		/* clear received CAN frames to indicate 'nothing received' */
    566		memset(op->last_frames, 0, op->nframes * op->cfsiz);
    567	}
    568
    569	/* create notification to user */
    570	memset(&msg_head, 0, sizeof(msg_head));
    571	msg_head.opcode  = RX_TIMEOUT;
    572	msg_head.flags   = op->flags;
    573	msg_head.count   = op->count;
    574	msg_head.ival1   = op->ival1;
    575	msg_head.ival2   = op->ival2;
    576	msg_head.can_id  = op->can_id;
    577	msg_head.nframes = 0;
    578
    579	bcm_send_to_user(op, &msg_head, NULL, 0);
    580
    581	return HRTIMER_NORESTART;
    582}
    583
    584/*
    585 * bcm_rx_do_flush - helper for bcm_rx_thr_flush
    586 */
    587static inline int bcm_rx_do_flush(struct bcm_op *op, unsigned int index)
    588{
    589	struct canfd_frame *lcf = op->last_frames + op->cfsiz * index;
    590
    591	if ((op->last_frames) && (lcf->flags & RX_THR)) {
    592		bcm_rx_changed(op, lcf);
    593		return 1;
    594	}
    595	return 0;
    596}
    597
    598/*
    599 * bcm_rx_thr_flush - Check for throttled data and send it to the userspace
    600 */
    601static int bcm_rx_thr_flush(struct bcm_op *op)
    602{
    603	int updated = 0;
    604
    605	if (op->nframes > 1) {
    606		unsigned int i;
    607
    608		/* for MUX filter we start at index 1 */
    609		for (i = 1; i < op->nframes; i++)
    610			updated += bcm_rx_do_flush(op, i);
    611
    612	} else {
    613		/* for RX_FILTER_ID and simple filter */
    614		updated += bcm_rx_do_flush(op, 0);
    615	}
    616
    617	return updated;
    618}
    619
    620/*
    621 * bcm_rx_thr_handler - the time for blocked content updates is over now:
    622 *                      Check for throttled data and send it to the userspace
    623 */
    624static enum hrtimer_restart bcm_rx_thr_handler(struct hrtimer *hrtimer)
    625{
    626	struct bcm_op *op = container_of(hrtimer, struct bcm_op, thrtimer);
    627
    628	if (bcm_rx_thr_flush(op)) {
    629		hrtimer_forward_now(hrtimer, op->kt_ival2);
    630		return HRTIMER_RESTART;
    631	} else {
    632		/* rearm throttle handling */
    633		op->kt_lastmsg = 0;
    634		return HRTIMER_NORESTART;
    635	}
    636}
    637
    638/*
    639 * bcm_rx_handler - handle a CAN frame reception
    640 */
    641static void bcm_rx_handler(struct sk_buff *skb, void *data)
    642{
    643	struct bcm_op *op = (struct bcm_op *)data;
    644	const struct canfd_frame *rxframe = (struct canfd_frame *)skb->data;
    645	unsigned int i;
    646
    647	if (op->can_id != rxframe->can_id)
    648		return;
    649
    650	/* make sure to handle the correct frame type (CAN / CAN FD) */
    651	if (skb->len != op->cfsiz)
    652		return;
    653
    654	/* disable timeout */
    655	hrtimer_cancel(&op->timer);
    656
    657	/* save rx timestamp */
    658	op->rx_stamp = skb->tstamp;
    659	/* save originator for recvfrom() */
    660	op->rx_ifindex = skb->dev->ifindex;
    661	/* update statistics */
    662	op->frames_abs++;
    663
    664	if (op->flags & RX_RTR_FRAME) {
    665		/* send reply for RTR-request (placed in op->frames[0]) */
    666		bcm_can_tx(op);
    667		return;
    668	}
    669
    670	if (op->flags & RX_FILTER_ID) {
    671		/* the easiest case */
    672		bcm_rx_update_and_send(op, op->last_frames, rxframe);
    673		goto rx_starttimer;
    674	}
    675
    676	if (op->nframes == 1) {
    677		/* simple compare with index 0 */
    678		bcm_rx_cmp_to_index(op, 0, rxframe);
    679		goto rx_starttimer;
    680	}
    681
    682	if (op->nframes > 1) {
    683		/*
    684		 * multiplex compare
    685		 *
    686		 * find the first multiplex mask that fits.
    687		 * Remark: The MUX-mask is stored in index 0 - but only the
    688		 * first 64 bits of the frame data[] are relevant (CAN FD)
    689		 */
    690
    691		for (i = 1; i < op->nframes; i++) {
    692			if ((get_u64(op->frames, 0) & get_u64(rxframe, 0)) ==
    693			    (get_u64(op->frames, 0) &
    694			     get_u64(op->frames + op->cfsiz * i, 0))) {
    695				bcm_rx_cmp_to_index(op, i, rxframe);
    696				break;
    697			}
    698		}
    699	}
    700
    701rx_starttimer:
    702	bcm_rx_starttimer(op);
    703}
    704
    705/*
    706 * helpers for bcm_op handling: find & delete bcm [rx|tx] op elements
    707 */
    708static struct bcm_op *bcm_find_op(struct list_head *ops,
    709				  struct bcm_msg_head *mh, int ifindex)
    710{
    711	struct bcm_op *op;
    712
    713	list_for_each_entry(op, ops, list) {
    714		if ((op->can_id == mh->can_id) && (op->ifindex == ifindex) &&
    715		    (op->flags & CAN_FD_FRAME) == (mh->flags & CAN_FD_FRAME))
    716			return op;
    717	}
    718
    719	return NULL;
    720}
    721
    722static void bcm_free_op_rcu(struct rcu_head *rcu_head)
    723{
    724	struct bcm_op *op = container_of(rcu_head, struct bcm_op, rcu);
    725
    726	if ((op->frames) && (op->frames != &op->sframe))
    727		kfree(op->frames);
    728
    729	if ((op->last_frames) && (op->last_frames != &op->last_sframe))
    730		kfree(op->last_frames);
    731
    732	kfree(op);
    733}
    734
    735static void bcm_remove_op(struct bcm_op *op)
    736{
    737	hrtimer_cancel(&op->timer);
    738	hrtimer_cancel(&op->thrtimer);
    739
    740	call_rcu(&op->rcu, bcm_free_op_rcu);
    741}
    742
    743static void bcm_rx_unreg(struct net_device *dev, struct bcm_op *op)
    744{
    745	if (op->rx_reg_dev == dev) {
    746		can_rx_unregister(dev_net(dev), dev, op->can_id,
    747				  REGMASK(op->can_id), bcm_rx_handler, op);
    748
    749		/* mark as removed subscription */
    750		op->rx_reg_dev = NULL;
    751	} else
    752		printk(KERN_ERR "can-bcm: bcm_rx_unreg: registered device "
    753		       "mismatch %p %p\n", op->rx_reg_dev, dev);
    754}
    755
    756/*
    757 * bcm_delete_rx_op - find and remove a rx op (returns number of removed ops)
    758 */
    759static int bcm_delete_rx_op(struct list_head *ops, struct bcm_msg_head *mh,
    760			    int ifindex)
    761{
    762	struct bcm_op *op, *n;
    763
    764	list_for_each_entry_safe(op, n, ops, list) {
    765		if ((op->can_id == mh->can_id) && (op->ifindex == ifindex) &&
    766		    (op->flags & CAN_FD_FRAME) == (mh->flags & CAN_FD_FRAME)) {
    767
    768			/* disable automatic timer on frame reception */
    769			op->flags |= RX_NO_AUTOTIMER;
    770
    771			/*
    772			 * Don't care if we're bound or not (due to netdev
    773			 * problems) can_rx_unregister() is always a save
    774			 * thing to do here.
    775			 */
    776			if (op->ifindex) {
    777				/*
    778				 * Only remove subscriptions that had not
    779				 * been removed due to NETDEV_UNREGISTER
    780				 * in bcm_notifier()
    781				 */
    782				if (op->rx_reg_dev) {
    783					struct net_device *dev;
    784
    785					dev = dev_get_by_index(sock_net(op->sk),
    786							       op->ifindex);
    787					if (dev) {
    788						bcm_rx_unreg(dev, op);
    789						dev_put(dev);
    790					}
    791				}
    792			} else
    793				can_rx_unregister(sock_net(op->sk), NULL,
    794						  op->can_id,
    795						  REGMASK(op->can_id),
    796						  bcm_rx_handler, op);
    797
    798			list_del(&op->list);
    799			bcm_remove_op(op);
    800			return 1; /* done */
    801		}
    802	}
    803
    804	return 0; /* not found */
    805}
    806
    807/*
    808 * bcm_delete_tx_op - find and remove a tx op (returns number of removed ops)
    809 */
    810static int bcm_delete_tx_op(struct list_head *ops, struct bcm_msg_head *mh,
    811			    int ifindex)
    812{
    813	struct bcm_op *op, *n;
    814
    815	list_for_each_entry_safe(op, n, ops, list) {
    816		if ((op->can_id == mh->can_id) && (op->ifindex == ifindex) &&
    817		    (op->flags & CAN_FD_FRAME) == (mh->flags & CAN_FD_FRAME)) {
    818			list_del(&op->list);
    819			bcm_remove_op(op);
    820			return 1; /* done */
    821		}
    822	}
    823
    824	return 0; /* not found */
    825}
    826
    827/*
    828 * bcm_read_op - read out a bcm_op and send it to the user (for bcm_sendmsg)
    829 */
    830static int bcm_read_op(struct list_head *ops, struct bcm_msg_head *msg_head,
    831		       int ifindex)
    832{
    833	struct bcm_op *op = bcm_find_op(ops, msg_head, ifindex);
    834
    835	if (!op)
    836		return -EINVAL;
    837
    838	/* put current values into msg_head */
    839	msg_head->flags   = op->flags;
    840	msg_head->count   = op->count;
    841	msg_head->ival1   = op->ival1;
    842	msg_head->ival2   = op->ival2;
    843	msg_head->nframes = op->nframes;
    844
    845	bcm_send_to_user(op, msg_head, op->frames, 0);
    846
    847	return MHSIZ;
    848}
    849
    850/*
    851 * bcm_tx_setup - create or update a bcm tx op (for bcm_sendmsg)
    852 */
    853static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
    854			int ifindex, struct sock *sk)
    855{
    856	struct bcm_sock *bo = bcm_sk(sk);
    857	struct bcm_op *op;
    858	struct canfd_frame *cf;
    859	unsigned int i;
    860	int err;
    861
    862	/* we need a real device to send frames */
    863	if (!ifindex)
    864		return -ENODEV;
    865
    866	/* check nframes boundaries - we need at least one CAN frame */
    867	if (msg_head->nframes < 1 || msg_head->nframes > MAX_NFRAMES)
    868		return -EINVAL;
    869
    870	/* check timeval limitations */
    871	if ((msg_head->flags & SETTIMER) && bcm_is_invalid_tv(msg_head))
    872		return -EINVAL;
    873
    874	/* check the given can_id */
    875	op = bcm_find_op(&bo->tx_ops, msg_head, ifindex);
    876	if (op) {
    877		/* update existing BCM operation */
    878
    879		/*
    880		 * Do we need more space for the CAN frames than currently
    881		 * allocated? -> This is a _really_ unusual use-case and
    882		 * therefore (complexity / locking) it is not supported.
    883		 */
    884		if (msg_head->nframes > op->nframes)
    885			return -E2BIG;
    886
    887		/* update CAN frames content */
    888		for (i = 0; i < msg_head->nframes; i++) {
    889
    890			cf = op->frames + op->cfsiz * i;
    891			err = memcpy_from_msg((u8 *)cf, msg, op->cfsiz);
    892
    893			if (op->flags & CAN_FD_FRAME) {
    894				if (cf->len > 64)
    895					err = -EINVAL;
    896			} else {
    897				if (cf->len > 8)
    898					err = -EINVAL;
    899			}
    900
    901			if (err < 0)
    902				return err;
    903
    904			if (msg_head->flags & TX_CP_CAN_ID) {
    905				/* copy can_id into frame */
    906				cf->can_id = msg_head->can_id;
    907			}
    908		}
    909		op->flags = msg_head->flags;
    910
    911	} else {
    912		/* insert new BCM operation for the given can_id */
    913
    914		op = kzalloc(OPSIZ, GFP_KERNEL);
    915		if (!op)
    916			return -ENOMEM;
    917
    918		op->can_id = msg_head->can_id;
    919		op->cfsiz = CFSIZ(msg_head->flags);
    920		op->flags = msg_head->flags;
    921
    922		/* create array for CAN frames and copy the data */
    923		if (msg_head->nframes > 1) {
    924			op->frames = kmalloc_array(msg_head->nframes,
    925						   op->cfsiz,
    926						   GFP_KERNEL);
    927			if (!op->frames) {
    928				kfree(op);
    929				return -ENOMEM;
    930			}
    931		} else
    932			op->frames = &op->sframe;
    933
    934		for (i = 0; i < msg_head->nframes; i++) {
    935
    936			cf = op->frames + op->cfsiz * i;
    937			err = memcpy_from_msg((u8 *)cf, msg, op->cfsiz);
    938
    939			if (op->flags & CAN_FD_FRAME) {
    940				if (cf->len > 64)
    941					err = -EINVAL;
    942			} else {
    943				if (cf->len > 8)
    944					err = -EINVAL;
    945			}
    946
    947			if (err < 0) {
    948				if (op->frames != &op->sframe)
    949					kfree(op->frames);
    950				kfree(op);
    951				return err;
    952			}
    953
    954			if (msg_head->flags & TX_CP_CAN_ID) {
    955				/* copy can_id into frame */
    956				cf->can_id = msg_head->can_id;
    957			}
    958		}
    959
    960		/* tx_ops never compare with previous received messages */
    961		op->last_frames = NULL;
    962
    963		/* bcm_can_tx / bcm_tx_timeout_handler needs this */
    964		op->sk = sk;
    965		op->ifindex = ifindex;
    966
    967		/* initialize uninitialized (kzalloc) structure */
    968		hrtimer_init(&op->timer, CLOCK_MONOTONIC,
    969			     HRTIMER_MODE_REL_SOFT);
    970		op->timer.function = bcm_tx_timeout_handler;
    971
    972		/* currently unused in tx_ops */
    973		hrtimer_init(&op->thrtimer, CLOCK_MONOTONIC,
    974			     HRTIMER_MODE_REL_SOFT);
    975
    976		/* add this bcm_op to the list of the tx_ops */
    977		list_add(&op->list, &bo->tx_ops);
    978
    979	} /* if ((op = bcm_find_op(&bo->tx_ops, msg_head->can_id, ifindex))) */
    980
    981	if (op->nframes != msg_head->nframes) {
    982		op->nframes   = msg_head->nframes;
    983		/* start multiple frame transmission with index 0 */
    984		op->currframe = 0;
    985	}
    986
    987	/* check flags */
    988
    989	if (op->flags & TX_RESET_MULTI_IDX) {
    990		/* start multiple frame transmission with index 0 */
    991		op->currframe = 0;
    992	}
    993
    994	if (op->flags & SETTIMER) {
    995		/* set timer values */
    996		op->count = msg_head->count;
    997		op->ival1 = msg_head->ival1;
    998		op->ival2 = msg_head->ival2;
    999		op->kt_ival1 = bcm_timeval_to_ktime(msg_head->ival1);
   1000		op->kt_ival2 = bcm_timeval_to_ktime(msg_head->ival2);
   1001
   1002		/* disable an active timer due to zero values? */
   1003		if (!op->kt_ival1 && !op->kt_ival2)
   1004			hrtimer_cancel(&op->timer);
   1005	}
   1006
   1007	if (op->flags & STARTTIMER) {
   1008		hrtimer_cancel(&op->timer);
   1009		/* spec: send CAN frame when starting timer */
   1010		op->flags |= TX_ANNOUNCE;
   1011	}
   1012
   1013	if (op->flags & TX_ANNOUNCE) {
   1014		bcm_can_tx(op);
   1015		if (op->count)
   1016			op->count--;
   1017	}
   1018
   1019	if (op->flags & STARTTIMER)
   1020		bcm_tx_start_timer(op);
   1021
   1022	return msg_head->nframes * op->cfsiz + MHSIZ;
   1023}
   1024
   1025/*
   1026 * bcm_rx_setup - create or update a bcm rx op (for bcm_sendmsg)
   1027 */
   1028static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
   1029			int ifindex, struct sock *sk)
   1030{
   1031	struct bcm_sock *bo = bcm_sk(sk);
   1032	struct bcm_op *op;
   1033	int do_rx_register;
   1034	int err = 0;
   1035
   1036	if ((msg_head->flags & RX_FILTER_ID) || (!(msg_head->nframes))) {
   1037		/* be robust against wrong usage ... */
   1038		msg_head->flags |= RX_FILTER_ID;
   1039		/* ignore trailing garbage */
   1040		msg_head->nframes = 0;
   1041	}
   1042
   1043	/* the first element contains the mux-mask => MAX_NFRAMES + 1  */
   1044	if (msg_head->nframes > MAX_NFRAMES + 1)
   1045		return -EINVAL;
   1046
   1047	if ((msg_head->flags & RX_RTR_FRAME) &&
   1048	    ((msg_head->nframes != 1) ||
   1049	     (!(msg_head->can_id & CAN_RTR_FLAG))))
   1050		return -EINVAL;
   1051
   1052	/* check timeval limitations */
   1053	if ((msg_head->flags & SETTIMER) && bcm_is_invalid_tv(msg_head))
   1054		return -EINVAL;
   1055
   1056	/* check the given can_id */
   1057	op = bcm_find_op(&bo->rx_ops, msg_head, ifindex);
   1058	if (op) {
   1059		/* update existing BCM operation */
   1060
   1061		/*
   1062		 * Do we need more space for the CAN frames than currently
   1063		 * allocated? -> This is a _really_ unusual use-case and
   1064		 * therefore (complexity / locking) it is not supported.
   1065		 */
   1066		if (msg_head->nframes > op->nframes)
   1067			return -E2BIG;
   1068
   1069		if (msg_head->nframes) {
   1070			/* update CAN frames content */
   1071			err = memcpy_from_msg(op->frames, msg,
   1072					      msg_head->nframes * op->cfsiz);
   1073			if (err < 0)
   1074				return err;
   1075
   1076			/* clear last_frames to indicate 'nothing received' */
   1077			memset(op->last_frames, 0, msg_head->nframes * op->cfsiz);
   1078		}
   1079
   1080		op->nframes = msg_head->nframes;
   1081		op->flags = msg_head->flags;
   1082
   1083		/* Only an update -> do not call can_rx_register() */
   1084		do_rx_register = 0;
   1085
   1086	} else {
   1087		/* insert new BCM operation for the given can_id */
   1088		op = kzalloc(OPSIZ, GFP_KERNEL);
   1089		if (!op)
   1090			return -ENOMEM;
   1091
   1092		op->can_id = msg_head->can_id;
   1093		op->nframes = msg_head->nframes;
   1094		op->cfsiz = CFSIZ(msg_head->flags);
   1095		op->flags = msg_head->flags;
   1096
   1097		if (msg_head->nframes > 1) {
   1098			/* create array for CAN frames and copy the data */
   1099			op->frames = kmalloc_array(msg_head->nframes,
   1100						   op->cfsiz,
   1101						   GFP_KERNEL);
   1102			if (!op->frames) {
   1103				kfree(op);
   1104				return -ENOMEM;
   1105			}
   1106
   1107			/* create and init array for received CAN frames */
   1108			op->last_frames = kcalloc(msg_head->nframes,
   1109						  op->cfsiz,
   1110						  GFP_KERNEL);
   1111			if (!op->last_frames) {
   1112				kfree(op->frames);
   1113				kfree(op);
   1114				return -ENOMEM;
   1115			}
   1116
   1117		} else {
   1118			op->frames = &op->sframe;
   1119			op->last_frames = &op->last_sframe;
   1120		}
   1121
   1122		if (msg_head->nframes) {
   1123			err = memcpy_from_msg(op->frames, msg,
   1124					      msg_head->nframes * op->cfsiz);
   1125			if (err < 0) {
   1126				if (op->frames != &op->sframe)
   1127					kfree(op->frames);
   1128				if (op->last_frames != &op->last_sframe)
   1129					kfree(op->last_frames);
   1130				kfree(op);
   1131				return err;
   1132			}
   1133		}
   1134
   1135		/* bcm_can_tx / bcm_tx_timeout_handler needs this */
   1136		op->sk = sk;
   1137		op->ifindex = ifindex;
   1138
   1139		/* ifindex for timeout events w/o previous frame reception */
   1140		op->rx_ifindex = ifindex;
   1141
   1142		/* initialize uninitialized (kzalloc) structure */
   1143		hrtimer_init(&op->timer, CLOCK_MONOTONIC,
   1144			     HRTIMER_MODE_REL_SOFT);
   1145		op->timer.function = bcm_rx_timeout_handler;
   1146
   1147		hrtimer_init(&op->thrtimer, CLOCK_MONOTONIC,
   1148			     HRTIMER_MODE_REL_SOFT);
   1149		op->thrtimer.function = bcm_rx_thr_handler;
   1150
   1151		/* add this bcm_op to the list of the rx_ops */
   1152		list_add(&op->list, &bo->rx_ops);
   1153
   1154		/* call can_rx_register() */
   1155		do_rx_register = 1;
   1156
   1157	} /* if ((op = bcm_find_op(&bo->rx_ops, msg_head->can_id, ifindex))) */
   1158
   1159	/* check flags */
   1160
   1161	if (op->flags & RX_RTR_FRAME) {
   1162		struct canfd_frame *frame0 = op->frames;
   1163
   1164		/* no timers in RTR-mode */
   1165		hrtimer_cancel(&op->thrtimer);
   1166		hrtimer_cancel(&op->timer);
   1167
   1168		/*
   1169		 * funny feature in RX(!)_SETUP only for RTR-mode:
   1170		 * copy can_id into frame BUT without RTR-flag to
   1171		 * prevent a full-load-loopback-test ... ;-]
   1172		 */
   1173		if ((op->flags & TX_CP_CAN_ID) ||
   1174		    (frame0->can_id == op->can_id))
   1175			frame0->can_id = op->can_id & ~CAN_RTR_FLAG;
   1176
   1177	} else {
   1178		if (op->flags & SETTIMER) {
   1179
   1180			/* set timer value */
   1181			op->ival1 = msg_head->ival1;
   1182			op->ival2 = msg_head->ival2;
   1183			op->kt_ival1 = bcm_timeval_to_ktime(msg_head->ival1);
   1184			op->kt_ival2 = bcm_timeval_to_ktime(msg_head->ival2);
   1185
   1186			/* disable an active timer due to zero value? */
   1187			if (!op->kt_ival1)
   1188				hrtimer_cancel(&op->timer);
   1189
   1190			/*
   1191			 * In any case cancel the throttle timer, flush
   1192			 * potentially blocked msgs and reset throttle handling
   1193			 */
   1194			op->kt_lastmsg = 0;
   1195			hrtimer_cancel(&op->thrtimer);
   1196			bcm_rx_thr_flush(op);
   1197		}
   1198
   1199		if ((op->flags & STARTTIMER) && op->kt_ival1)
   1200			hrtimer_start(&op->timer, op->kt_ival1,
   1201				      HRTIMER_MODE_REL_SOFT);
   1202	}
   1203
   1204	/* now we can register for can_ids, if we added a new bcm_op */
   1205	if (do_rx_register) {
   1206		if (ifindex) {
   1207			struct net_device *dev;
   1208
   1209			dev = dev_get_by_index(sock_net(sk), ifindex);
   1210			if (dev) {
   1211				err = can_rx_register(sock_net(sk), dev,
   1212						      op->can_id,
   1213						      REGMASK(op->can_id),
   1214						      bcm_rx_handler, op,
   1215						      "bcm", sk);
   1216
   1217				op->rx_reg_dev = dev;
   1218				dev_put(dev);
   1219			}
   1220
   1221		} else
   1222			err = can_rx_register(sock_net(sk), NULL, op->can_id,
   1223					      REGMASK(op->can_id),
   1224					      bcm_rx_handler, op, "bcm", sk);
   1225		if (err) {
   1226			/* this bcm rx op is broken -> remove it */
   1227			list_del(&op->list);
   1228			bcm_remove_op(op);
   1229			return err;
   1230		}
   1231	}
   1232
   1233	return msg_head->nframes * op->cfsiz + MHSIZ;
   1234}
   1235
   1236/*
   1237 * bcm_tx_send - send a single CAN frame to the CAN interface (for bcm_sendmsg)
   1238 */
   1239static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk,
   1240		       int cfsiz)
   1241{
   1242	struct sk_buff *skb;
   1243	struct net_device *dev;
   1244	int err;
   1245
   1246	/* we need a real device to send frames */
   1247	if (!ifindex)
   1248		return -ENODEV;
   1249
   1250	skb = alloc_skb(cfsiz + sizeof(struct can_skb_priv), GFP_KERNEL);
   1251	if (!skb)
   1252		return -ENOMEM;
   1253
   1254	can_skb_reserve(skb);
   1255
   1256	err = memcpy_from_msg(skb_put(skb, cfsiz), msg, cfsiz);
   1257	if (err < 0) {
   1258		kfree_skb(skb);
   1259		return err;
   1260	}
   1261
   1262	dev = dev_get_by_index(sock_net(sk), ifindex);
   1263	if (!dev) {
   1264		kfree_skb(skb);
   1265		return -ENODEV;
   1266	}
   1267
   1268	can_skb_prv(skb)->ifindex = dev->ifindex;
   1269	can_skb_prv(skb)->skbcnt = 0;
   1270	skb->dev = dev;
   1271	can_skb_set_owner(skb, sk);
   1272	err = can_send(skb, 1); /* send with loopback */
   1273	dev_put(dev);
   1274
   1275	if (err)
   1276		return err;
   1277
   1278	return cfsiz + MHSIZ;
   1279}
   1280
   1281/*
   1282 * bcm_sendmsg - process BCM commands (opcodes) from the userspace
   1283 */
   1284static int bcm_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
   1285{
   1286	struct sock *sk = sock->sk;
   1287	struct bcm_sock *bo = bcm_sk(sk);
   1288	int ifindex = bo->ifindex; /* default ifindex for this bcm_op */
   1289	struct bcm_msg_head msg_head;
   1290	int cfsiz;
   1291	int ret; /* read bytes or error codes as return value */
   1292
   1293	if (!bo->bound)
   1294		return -ENOTCONN;
   1295
   1296	/* check for valid message length from userspace */
   1297	if (size < MHSIZ)
   1298		return -EINVAL;
   1299
   1300	/* read message head information */
   1301	ret = memcpy_from_msg((u8 *)&msg_head, msg, MHSIZ);
   1302	if (ret < 0)
   1303		return ret;
   1304
   1305	cfsiz = CFSIZ(msg_head.flags);
   1306	if ((size - MHSIZ) % cfsiz)
   1307		return -EINVAL;
   1308
   1309	/* check for alternative ifindex for this bcm_op */
   1310
   1311	if (!ifindex && msg->msg_name) {
   1312		/* no bound device as default => check msg_name */
   1313		DECLARE_SOCKADDR(struct sockaddr_can *, addr, msg->msg_name);
   1314
   1315		if (msg->msg_namelen < BCM_MIN_NAMELEN)
   1316			return -EINVAL;
   1317
   1318		if (addr->can_family != AF_CAN)
   1319			return -EINVAL;
   1320
   1321		/* ifindex from sendto() */
   1322		ifindex = addr->can_ifindex;
   1323
   1324		if (ifindex) {
   1325			struct net_device *dev;
   1326
   1327			dev = dev_get_by_index(sock_net(sk), ifindex);
   1328			if (!dev)
   1329				return -ENODEV;
   1330
   1331			if (dev->type != ARPHRD_CAN) {
   1332				dev_put(dev);
   1333				return -ENODEV;
   1334			}
   1335
   1336			dev_put(dev);
   1337		}
   1338	}
   1339
   1340	lock_sock(sk);
   1341
   1342	switch (msg_head.opcode) {
   1343
   1344	case TX_SETUP:
   1345		ret = bcm_tx_setup(&msg_head, msg, ifindex, sk);
   1346		break;
   1347
   1348	case RX_SETUP:
   1349		ret = bcm_rx_setup(&msg_head, msg, ifindex, sk);
   1350		break;
   1351
   1352	case TX_DELETE:
   1353		if (bcm_delete_tx_op(&bo->tx_ops, &msg_head, ifindex))
   1354			ret = MHSIZ;
   1355		else
   1356			ret = -EINVAL;
   1357		break;
   1358
   1359	case RX_DELETE:
   1360		if (bcm_delete_rx_op(&bo->rx_ops, &msg_head, ifindex))
   1361			ret = MHSIZ;
   1362		else
   1363			ret = -EINVAL;
   1364		break;
   1365
   1366	case TX_READ:
   1367		/* reuse msg_head for the reply to TX_READ */
   1368		msg_head.opcode  = TX_STATUS;
   1369		ret = bcm_read_op(&bo->tx_ops, &msg_head, ifindex);
   1370		break;
   1371
   1372	case RX_READ:
   1373		/* reuse msg_head for the reply to RX_READ */
   1374		msg_head.opcode  = RX_STATUS;
   1375		ret = bcm_read_op(&bo->rx_ops, &msg_head, ifindex);
   1376		break;
   1377
   1378	case TX_SEND:
   1379		/* we need exactly one CAN frame behind the msg head */
   1380		if ((msg_head.nframes != 1) || (size != cfsiz + MHSIZ))
   1381			ret = -EINVAL;
   1382		else
   1383			ret = bcm_tx_send(msg, ifindex, sk, cfsiz);
   1384		break;
   1385
   1386	default:
   1387		ret = -EINVAL;
   1388		break;
   1389	}
   1390
   1391	release_sock(sk);
   1392
   1393	return ret;
   1394}
   1395
   1396/*
   1397 * notification handler for netdevice status changes
   1398 */
   1399static void bcm_notify(struct bcm_sock *bo, unsigned long msg,
   1400		       struct net_device *dev)
   1401{
   1402	struct sock *sk = &bo->sk;
   1403	struct bcm_op *op;
   1404	int notify_enodev = 0;
   1405
   1406	if (!net_eq(dev_net(dev), sock_net(sk)))
   1407		return;
   1408
   1409	switch (msg) {
   1410
   1411	case NETDEV_UNREGISTER:
   1412		lock_sock(sk);
   1413
   1414		/* remove device specific receive entries */
   1415		list_for_each_entry(op, &bo->rx_ops, list)
   1416			if (op->rx_reg_dev == dev)
   1417				bcm_rx_unreg(dev, op);
   1418
   1419		/* remove device reference, if this is our bound device */
   1420		if (bo->bound && bo->ifindex == dev->ifindex) {
   1421			bo->bound   = 0;
   1422			bo->ifindex = 0;
   1423			notify_enodev = 1;
   1424		}
   1425
   1426		release_sock(sk);
   1427
   1428		if (notify_enodev) {
   1429			sk->sk_err = ENODEV;
   1430			if (!sock_flag(sk, SOCK_DEAD))
   1431				sk_error_report(sk);
   1432		}
   1433		break;
   1434
   1435	case NETDEV_DOWN:
   1436		if (bo->bound && bo->ifindex == dev->ifindex) {
   1437			sk->sk_err = ENETDOWN;
   1438			if (!sock_flag(sk, SOCK_DEAD))
   1439				sk_error_report(sk);
   1440		}
   1441	}
   1442}
   1443
   1444static int bcm_notifier(struct notifier_block *nb, unsigned long msg,
   1445			void *ptr)
   1446{
   1447	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
   1448
   1449	if (dev->type != ARPHRD_CAN)
   1450		return NOTIFY_DONE;
   1451	if (msg != NETDEV_UNREGISTER && msg != NETDEV_DOWN)
   1452		return NOTIFY_DONE;
   1453	if (unlikely(bcm_busy_notifier)) /* Check for reentrant bug. */
   1454		return NOTIFY_DONE;
   1455
   1456	spin_lock(&bcm_notifier_lock);
   1457	list_for_each_entry(bcm_busy_notifier, &bcm_notifier_list, notifier) {
   1458		spin_unlock(&bcm_notifier_lock);
   1459		bcm_notify(bcm_busy_notifier, msg, dev);
   1460		spin_lock(&bcm_notifier_lock);
   1461	}
   1462	bcm_busy_notifier = NULL;
   1463	spin_unlock(&bcm_notifier_lock);
   1464	return NOTIFY_DONE;
   1465}
   1466
   1467/*
   1468 * initial settings for all BCM sockets to be set at socket creation time
   1469 */
   1470static int bcm_init(struct sock *sk)
   1471{
   1472	struct bcm_sock *bo = bcm_sk(sk);
   1473
   1474	bo->bound            = 0;
   1475	bo->ifindex          = 0;
   1476	bo->dropped_usr_msgs = 0;
   1477	bo->bcm_proc_read    = NULL;
   1478
   1479	INIT_LIST_HEAD(&bo->tx_ops);
   1480	INIT_LIST_HEAD(&bo->rx_ops);
   1481
   1482	/* set notifier */
   1483	spin_lock(&bcm_notifier_lock);
   1484	list_add_tail(&bo->notifier, &bcm_notifier_list);
   1485	spin_unlock(&bcm_notifier_lock);
   1486
   1487	return 0;
   1488}
   1489
   1490/*
   1491 * standard socket functions
   1492 */
   1493static int bcm_release(struct socket *sock)
   1494{
   1495	struct sock *sk = sock->sk;
   1496	struct net *net;
   1497	struct bcm_sock *bo;
   1498	struct bcm_op *op, *next;
   1499
   1500	if (!sk)
   1501		return 0;
   1502
   1503	net = sock_net(sk);
   1504	bo = bcm_sk(sk);
   1505
   1506	/* remove bcm_ops, timer, rx_unregister(), etc. */
   1507
   1508	spin_lock(&bcm_notifier_lock);
   1509	while (bcm_busy_notifier == bo) {
   1510		spin_unlock(&bcm_notifier_lock);
   1511		schedule_timeout_uninterruptible(1);
   1512		spin_lock(&bcm_notifier_lock);
   1513	}
   1514	list_del(&bo->notifier);
   1515	spin_unlock(&bcm_notifier_lock);
   1516
   1517	lock_sock(sk);
   1518
   1519	list_for_each_entry_safe(op, next, &bo->tx_ops, list)
   1520		bcm_remove_op(op);
   1521
   1522	list_for_each_entry_safe(op, next, &bo->rx_ops, list) {
   1523		/*
   1524		 * Don't care if we're bound or not (due to netdev problems)
   1525		 * can_rx_unregister() is always a save thing to do here.
   1526		 */
   1527		if (op->ifindex) {
   1528			/*
   1529			 * Only remove subscriptions that had not
   1530			 * been removed due to NETDEV_UNREGISTER
   1531			 * in bcm_notifier()
   1532			 */
   1533			if (op->rx_reg_dev) {
   1534				struct net_device *dev;
   1535
   1536				dev = dev_get_by_index(net, op->ifindex);
   1537				if (dev) {
   1538					bcm_rx_unreg(dev, op);
   1539					dev_put(dev);
   1540				}
   1541			}
   1542		} else
   1543			can_rx_unregister(net, NULL, op->can_id,
   1544					  REGMASK(op->can_id),
   1545					  bcm_rx_handler, op);
   1546
   1547	}
   1548
   1549	synchronize_rcu();
   1550
   1551	list_for_each_entry_safe(op, next, &bo->rx_ops, list)
   1552		bcm_remove_op(op);
   1553
   1554#if IS_ENABLED(CONFIG_PROC_FS)
   1555	/* remove procfs entry */
   1556	if (net->can.bcmproc_dir && bo->bcm_proc_read)
   1557		remove_proc_entry(bo->procname, net->can.bcmproc_dir);
   1558#endif /* CONFIG_PROC_FS */
   1559
   1560	/* remove device reference */
   1561	if (bo->bound) {
   1562		bo->bound   = 0;
   1563		bo->ifindex = 0;
   1564	}
   1565
   1566	sock_orphan(sk);
   1567	sock->sk = NULL;
   1568
   1569	release_sock(sk);
   1570	sock_put(sk);
   1571
   1572	return 0;
   1573}
   1574
   1575static int bcm_connect(struct socket *sock, struct sockaddr *uaddr, int len,
   1576		       int flags)
   1577{
   1578	struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
   1579	struct sock *sk = sock->sk;
   1580	struct bcm_sock *bo = bcm_sk(sk);
   1581	struct net *net = sock_net(sk);
   1582	int ret = 0;
   1583
   1584	if (len < BCM_MIN_NAMELEN)
   1585		return -EINVAL;
   1586
   1587	lock_sock(sk);
   1588
   1589	if (bo->bound) {
   1590		ret = -EISCONN;
   1591		goto fail;
   1592	}
   1593
   1594	/* bind a device to this socket */
   1595	if (addr->can_ifindex) {
   1596		struct net_device *dev;
   1597
   1598		dev = dev_get_by_index(net, addr->can_ifindex);
   1599		if (!dev) {
   1600			ret = -ENODEV;
   1601			goto fail;
   1602		}
   1603		if (dev->type != ARPHRD_CAN) {
   1604			dev_put(dev);
   1605			ret = -ENODEV;
   1606			goto fail;
   1607		}
   1608
   1609		bo->ifindex = dev->ifindex;
   1610		dev_put(dev);
   1611
   1612	} else {
   1613		/* no interface reference for ifindex = 0 ('any' CAN device) */
   1614		bo->ifindex = 0;
   1615	}
   1616
   1617#if IS_ENABLED(CONFIG_PROC_FS)
   1618	if (net->can.bcmproc_dir) {
   1619		/* unique socket address as filename */
   1620		sprintf(bo->procname, "%lu", sock_i_ino(sk));
   1621		bo->bcm_proc_read = proc_create_net_single(bo->procname, 0644,
   1622						     net->can.bcmproc_dir,
   1623						     bcm_proc_show, sk);
   1624		if (!bo->bcm_proc_read) {
   1625			ret = -ENOMEM;
   1626			goto fail;
   1627		}
   1628	}
   1629#endif /* CONFIG_PROC_FS */
   1630
   1631	bo->bound = 1;
   1632
   1633fail:
   1634	release_sock(sk);
   1635
   1636	return ret;
   1637}
   1638
   1639static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
   1640		       int flags)
   1641{
   1642	struct sock *sk = sock->sk;
   1643	struct sk_buff *skb;
   1644	int error = 0;
   1645	int err;
   1646
   1647	skb = skb_recv_datagram(sk, flags, &error);
   1648	if (!skb)
   1649		return error;
   1650
   1651	if (skb->len < size)
   1652		size = skb->len;
   1653
   1654	err = memcpy_to_msg(msg, skb->data, size);
   1655	if (err < 0) {
   1656		skb_free_datagram(sk, skb);
   1657		return err;
   1658	}
   1659
   1660	sock_recv_cmsgs(msg, sk, skb);
   1661
   1662	if (msg->msg_name) {
   1663		__sockaddr_check_size(BCM_MIN_NAMELEN);
   1664		msg->msg_namelen = BCM_MIN_NAMELEN;
   1665		memcpy(msg->msg_name, skb->cb, msg->msg_namelen);
   1666	}
   1667
   1668	skb_free_datagram(sk, skb);
   1669
   1670	return size;
   1671}
   1672
   1673static int bcm_sock_no_ioctlcmd(struct socket *sock, unsigned int cmd,
   1674				unsigned long arg)
   1675{
   1676	/* no ioctls for socket layer -> hand it down to NIC layer */
   1677	return -ENOIOCTLCMD;
   1678}
   1679
   1680static const struct proto_ops bcm_ops = {
   1681	.family        = PF_CAN,
   1682	.release       = bcm_release,
   1683	.bind          = sock_no_bind,
   1684	.connect       = bcm_connect,
   1685	.socketpair    = sock_no_socketpair,
   1686	.accept        = sock_no_accept,
   1687	.getname       = sock_no_getname,
   1688	.poll          = datagram_poll,
   1689	.ioctl         = bcm_sock_no_ioctlcmd,
   1690	.gettstamp     = sock_gettstamp,
   1691	.listen        = sock_no_listen,
   1692	.shutdown      = sock_no_shutdown,
   1693	.sendmsg       = bcm_sendmsg,
   1694	.recvmsg       = bcm_recvmsg,
   1695	.mmap          = sock_no_mmap,
   1696	.sendpage      = sock_no_sendpage,
   1697};
   1698
   1699static struct proto bcm_proto __read_mostly = {
   1700	.name       = "CAN_BCM",
   1701	.owner      = THIS_MODULE,
   1702	.obj_size   = sizeof(struct bcm_sock),
   1703	.init       = bcm_init,
   1704};
   1705
   1706static const struct can_proto bcm_can_proto = {
   1707	.type       = SOCK_DGRAM,
   1708	.protocol   = CAN_BCM,
   1709	.ops        = &bcm_ops,
   1710	.prot       = &bcm_proto,
   1711};
   1712
   1713static int canbcm_pernet_init(struct net *net)
   1714{
   1715#if IS_ENABLED(CONFIG_PROC_FS)
   1716	/* create /proc/net/can-bcm directory */
   1717	net->can.bcmproc_dir = proc_net_mkdir(net, "can-bcm", net->proc_net);
   1718#endif /* CONFIG_PROC_FS */
   1719
   1720	return 0;
   1721}
   1722
   1723static void canbcm_pernet_exit(struct net *net)
   1724{
   1725#if IS_ENABLED(CONFIG_PROC_FS)
   1726	/* remove /proc/net/can-bcm directory */
   1727	if (net->can.bcmproc_dir)
   1728		remove_proc_entry("can-bcm", net->proc_net);
   1729#endif /* CONFIG_PROC_FS */
   1730}
   1731
   1732static struct pernet_operations canbcm_pernet_ops __read_mostly = {
   1733	.init = canbcm_pernet_init,
   1734	.exit = canbcm_pernet_exit,
   1735};
   1736
   1737static struct notifier_block canbcm_notifier = {
   1738	.notifier_call = bcm_notifier
   1739};
   1740
   1741static int __init bcm_module_init(void)
   1742{
   1743	int err;
   1744
   1745	pr_info("can: broadcast manager protocol\n");
   1746
   1747	err = can_proto_register(&bcm_can_proto);
   1748	if (err < 0) {
   1749		printk(KERN_ERR "can: registration of bcm protocol failed\n");
   1750		return err;
   1751	}
   1752
   1753	register_pernet_subsys(&canbcm_pernet_ops);
   1754	register_netdevice_notifier(&canbcm_notifier);
   1755	return 0;
   1756}
   1757
   1758static void __exit bcm_module_exit(void)
   1759{
   1760	can_proto_unregister(&bcm_can_proto);
   1761	unregister_netdevice_notifier(&canbcm_notifier);
   1762	unregister_pernet_subsys(&canbcm_pernet_ops);
   1763}
   1764
   1765module_init(bcm_module_init);
   1766module_exit(bcm_module_exit);