xref: /openbmc/linux/drivers/w1/w1_netlink.c (revision bc5aa3a0)
1 /*
2  * w1_netlink.c
3  *
4  * Copyright (c) 2003 Evgeniy Polyakov <zbr@ioremap.net>
5  *
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20  */
21 
22 #include <linux/slab.h>
23 #include <linux/skbuff.h>
24 #include <linux/netlink.h>
25 #include <linux/connector.h>
26 
27 #include "w1.h"
28 #include "w1_log.h"
29 #include "w1_netlink.h"
30 
31 #if defined(CONFIG_W1_CON) && (defined(CONFIG_CONNECTOR) || (defined(CONFIG_CONNECTOR_MODULE) && defined(CONFIG_W1_MODULE)))
32 
33 #define MIN(a, b)                   (((a) < (b)) ? (a) : (b))
34 
35 /* Bundle together everything required to process a request in one memory
36  * allocation.
37  */
38 struct w1_cb_block {
39 	atomic_t refcnt;
40 	u32 portid; /* Sending process port ID */
41 	/* maximum value for first_cn->len */
42 	u16 maxlen;
43 	/* pointers to building up the reply message */
44 	struct cn_msg *first_cn; /* fixed once the structure is populated */
45 	struct cn_msg *cn; /* advances as cn_msg is appeneded */
46 	struct w1_netlink_msg *msg; /* advances as w1_netlink_msg is appened */
47 	struct w1_netlink_cmd *cmd; /* advances as cmds are appened */
48 	struct w1_netlink_msg *cur_msg; /* currently message being processed */
49 	/* copy of the original request follows */
50 	struct cn_msg request_cn;
51 	/* followed by variable length:
52 	 * cn_msg, data (w1_netlink_msg and w1_netlink_cmd)
53 	 * one or more struct w1_cb_node
54 	 * reply first_cn, data (w1_netlink_msg and w1_netlink_cmd)
55 	 */
56 };
57 struct w1_cb_node {
58 	struct w1_async_cmd async;
59 	/* pointers within w1_cb_block and cn data */
60 	struct w1_cb_block *block;
61 	struct w1_netlink_msg *msg;
62 	struct w1_slave *sl;
63 	struct w1_master *dev;
64 };
65 
66 /**
67  * w1_reply_len() - calculate current reply length, compare to maxlen
68  * @block: block to calculate
69  *
70  * Calculates the current message length including possible multiple
71  * cn_msg and data, excludes the first sizeof(struct cn_msg).  Direclty
72  * compariable to maxlen and usable to send the message.
73  */
74 static u16 w1_reply_len(struct w1_cb_block *block)
75 {
76 	if (!block->cn)
77 		return 0;
78 	return (u8 *)block->cn - (u8 *)block->first_cn + block->cn->len;
79 }
80 
81 static void w1_unref_block(struct w1_cb_block *block)
82 {
83 	if (atomic_sub_return(1, &block->refcnt) == 0) {
84 		u16 len = w1_reply_len(block);
85 		if (len) {
86 			cn_netlink_send_mult(block->first_cn, len,
87 				block->portid, 0, GFP_KERNEL);
88 		}
89 		kfree(block);
90 	}
91 }
92 
93 /**
94  * w1_reply_make_space() - send message if needed to make space
95  * @block: block to make space on
96  * @space: how many bytes requested
97  *
98  * Verify there is enough room left for the caller to add "space" bytes to the
99  * message, if there isn't send the message and reset.
100  */
101 static void w1_reply_make_space(struct w1_cb_block *block, u16 space)
102 {
103 	u16 len = w1_reply_len(block);
104 	if (len + space >= block->maxlen) {
105 		cn_netlink_send_mult(block->first_cn, len, block->portid, 0, GFP_KERNEL);
106 		block->first_cn->len = 0;
107 		block->cn = NULL;
108 		block->msg = NULL;
109 		block->cmd = NULL;
110 	}
111 }
112 
113 /* Early send when replies aren't bundled. */
114 static void w1_netlink_check_send(struct w1_cb_block *block)
115 {
116 	if (!(block->request_cn.flags & W1_CN_BUNDLE) && block->cn)
117 		w1_reply_make_space(block, block->maxlen);
118 }
119 
120 /**
121  * w1_netlink_setup_msg() - prepare to write block->msg
122  * @block: block to operate on
123  * @ack: determines if cn can be reused
124  *
125  * block->cn will be setup with the correct ack, advancing if needed
126  * block->cn->len does not include space for block->msg
127  * block->msg advances but remains uninitialized
128  */
129 static void w1_netlink_setup_msg(struct w1_cb_block *block, u32 ack)
130 {
131 	if (block->cn && block->cn->ack == ack) {
132 		block->msg = (struct w1_netlink_msg *)(block->cn->data + block->cn->len);
133 	} else {
134 		/* advance or set to data */
135 		if (block->cn)
136 			block->cn = (struct cn_msg *)(block->cn->data +
137 				block->cn->len);
138 		else
139 			block->cn = block->first_cn;
140 
141 		memcpy(block->cn, &block->request_cn, sizeof(*block->cn));
142 		block->cn->len = 0;
143 		block->cn->ack = ack;
144 		block->msg = (struct w1_netlink_msg *)block->cn->data;
145 	}
146 }
147 
148 /* Append cmd to msg, include cmd->data as well.  This is because
149  * any following data goes with the command and in the case of a read is
150  * the results.
151  */
152 static void w1_netlink_queue_cmd(struct w1_cb_block *block,
153 	struct w1_netlink_cmd *cmd)
154 {
155 	u32 space;
156 	w1_reply_make_space(block, sizeof(struct cn_msg) +
157 		sizeof(struct w1_netlink_msg) + sizeof(*cmd) + cmd->len);
158 
159 	/* There's a status message sent after each command, so no point
160 	 * in trying to bundle this cmd after an existing one, because
161 	 * there won't be one.  Allocate and copy over a new cn_msg.
162 	 */
163 	w1_netlink_setup_msg(block, block->request_cn.seq + 1);
164 	memcpy(block->msg, block->cur_msg, sizeof(*block->msg));
165 	block->cn->len += sizeof(*block->msg);
166 	block->msg->len = 0;
167 	block->cmd = (struct w1_netlink_cmd *)(block->msg->data);
168 
169 	space = sizeof(*cmd) + cmd->len;
170 	if (block->cmd != cmd)
171 		memcpy(block->cmd, cmd, space);
172 	block->cn->len += space;
173 	block->msg->len += space;
174 }
175 
176 /* Append req_msg and req_cmd, no other commands and no data from req_cmd are
177  * copied.
178  */
179 static void w1_netlink_queue_status(struct w1_cb_block *block,
180 	struct w1_netlink_msg *req_msg, struct w1_netlink_cmd *req_cmd,
181 	int error)
182 {
183 	u16 space = sizeof(struct cn_msg) + sizeof(*req_msg) + sizeof(*req_cmd);
184 	w1_reply_make_space(block, space);
185 	w1_netlink_setup_msg(block, block->request_cn.ack);
186 
187 	memcpy(block->msg, req_msg, sizeof(*req_msg));
188 	block->cn->len += sizeof(*req_msg);
189 	block->msg->len = 0;
190 	block->msg->status = (u8)-error;
191 	if (req_cmd) {
192 		struct w1_netlink_cmd *cmd = (struct w1_netlink_cmd *)block->msg->data;
193 		memcpy(cmd, req_cmd, sizeof(*cmd));
194 		block->cn->len += sizeof(*cmd);
195 		block->msg->len += sizeof(*cmd);
196 		cmd->len = 0;
197 	}
198 	w1_netlink_check_send(block);
199 }
200 
201 /**
202  * w1_netlink_send_error() - sends the error message now
203  * @cn: original cn_msg
204  * @msg: original w1_netlink_msg
205  * @portid: where to send it
206  * @error: error status
207  *
208  * Use when a block isn't available to queue the message to and cn, msg
209  * might not be contiguous.
210  */
211 static void w1_netlink_send_error(struct cn_msg *cn, struct w1_netlink_msg *msg,
212 	int portid, int error)
213 {
214 	struct {
215 		struct cn_msg cn;
216 		struct w1_netlink_msg msg;
217 	} packet;
218 	memcpy(&packet.cn, cn, sizeof(packet.cn));
219 	memcpy(&packet.msg, msg, sizeof(packet.msg));
220 	packet.cn.len = sizeof(packet.msg);
221 	packet.msg.len = 0;
222 	packet.msg.status = (u8)-error;
223 	cn_netlink_send(&packet.cn, portid, 0, GFP_KERNEL);
224 }
225 
226 /**
227  * w1_netlink_send() - sends w1 netlink notifications
228  * @dev: w1_master the even is associated with or for
229  * @msg: w1_netlink_msg message to be sent
230  *
231  * This are notifications generated from the kernel.
232  */
233 void w1_netlink_send(struct w1_master *dev, struct w1_netlink_msg *msg)
234 {
235 	struct {
236 		struct cn_msg cn;
237 		struct w1_netlink_msg msg;
238 	} packet;
239 	memset(&packet, 0, sizeof(packet));
240 
241 	packet.cn.id.idx = CN_W1_IDX;
242 	packet.cn.id.val = CN_W1_VAL;
243 
244 	packet.cn.seq = dev->seq++;
245 	packet.cn.len = sizeof(*msg);
246 
247 	memcpy(&packet.msg, msg, sizeof(*msg));
248 	packet.msg.len = 0;
249 
250 	cn_netlink_send(&packet.cn, 0, 0, GFP_KERNEL);
251 }
252 
253 static void w1_send_slave(struct w1_master *dev, u64 rn)
254 {
255 	struct w1_cb_block *block = dev->priv;
256 	struct w1_netlink_cmd *cache_cmd = block->cmd;
257 	u64 *data;
258 
259 	w1_reply_make_space(block, sizeof(*data));
260 
261 	/* Add cmd back if the packet was sent */
262 	if (!block->cmd) {
263 		cache_cmd->len = 0;
264 		w1_netlink_queue_cmd(block, cache_cmd);
265 	}
266 
267 	data = (u64 *)(block->cmd->data + block->cmd->len);
268 
269 	*data = rn;
270 	block->cn->len += sizeof(*data);
271 	block->msg->len += sizeof(*data);
272 	block->cmd->len += sizeof(*data);
273 }
274 
275 static void w1_found_send_slave(struct w1_master *dev, u64 rn)
276 {
277 	/* update kernel slave list */
278 	w1_slave_found(dev, rn);
279 
280 	w1_send_slave(dev, rn);
281 }
282 
283 /* Get the current slave list, or search (with or without alarm) */
284 static int w1_get_slaves(struct w1_master *dev, struct w1_netlink_cmd *req_cmd)
285 {
286 	struct w1_slave *sl;
287 
288 	req_cmd->len = 0;
289 	w1_netlink_queue_cmd(dev->priv, req_cmd);
290 
291 	if (req_cmd->cmd == W1_CMD_LIST_SLAVES) {
292 		u64 rn;
293 		mutex_lock(&dev->list_mutex);
294 		list_for_each_entry(sl, &dev->slist, w1_slave_entry) {
295 			memcpy(&rn, &sl->reg_num, sizeof(rn));
296 			w1_send_slave(dev, rn);
297 		}
298 		mutex_unlock(&dev->list_mutex);
299 	} else {
300 		w1_search_process_cb(dev, req_cmd->cmd == W1_CMD_ALARM_SEARCH ?
301 			W1_ALARM_SEARCH : W1_SEARCH, w1_found_send_slave);
302 	}
303 
304 	return 0;
305 }
306 
307 static int w1_process_command_io(struct w1_master *dev,
308 	struct w1_netlink_cmd *cmd)
309 {
310 	int err = 0;
311 
312 	switch (cmd->cmd) {
313 	case W1_CMD_TOUCH:
314 		w1_touch_block(dev, cmd->data, cmd->len);
315 		w1_netlink_queue_cmd(dev->priv, cmd);
316 		break;
317 	case W1_CMD_READ:
318 		w1_read_block(dev, cmd->data, cmd->len);
319 		w1_netlink_queue_cmd(dev->priv, cmd);
320 		break;
321 	case W1_CMD_WRITE:
322 		w1_write_block(dev, cmd->data, cmd->len);
323 		break;
324 	default:
325 		err = -EINVAL;
326 		break;
327 	}
328 
329 	return err;
330 }
331 
332 static int w1_process_command_addremove(struct w1_master *dev,
333 	struct w1_netlink_cmd *cmd)
334 {
335 	struct w1_slave *sl;
336 	int err = 0;
337 	struct w1_reg_num *id;
338 
339 	if (cmd->len != sizeof(*id))
340 		return -EINVAL;
341 
342 	id = (struct w1_reg_num *)cmd->data;
343 
344 	sl = w1_slave_search_device(dev, id);
345 	switch (cmd->cmd) {
346 	case W1_CMD_SLAVE_ADD:
347 		if (sl)
348 			err = -EINVAL;
349 		else
350 			err = w1_attach_slave_device(dev, id);
351 		break;
352 	case W1_CMD_SLAVE_REMOVE:
353 		if (sl)
354 			w1_slave_detach(sl);
355 		else
356 			err = -EINVAL;
357 		break;
358 	default:
359 		err = -EINVAL;
360 		break;
361 	}
362 
363 	return err;
364 }
365 
366 static int w1_process_command_master(struct w1_master *dev,
367 	struct w1_netlink_cmd *req_cmd)
368 {
369 	int err = -EINVAL;
370 
371 	/* drop bus_mutex for search (does it's own locking), and add/remove
372 	 * which doesn't use the bus
373 	 */
374 	switch (req_cmd->cmd) {
375 	case W1_CMD_SEARCH:
376 	case W1_CMD_ALARM_SEARCH:
377 	case W1_CMD_LIST_SLAVES:
378 		mutex_unlock(&dev->bus_mutex);
379 		err = w1_get_slaves(dev, req_cmd);
380 		mutex_lock(&dev->bus_mutex);
381 		break;
382 	case W1_CMD_READ:
383 	case W1_CMD_WRITE:
384 	case W1_CMD_TOUCH:
385 		err = w1_process_command_io(dev, req_cmd);
386 		break;
387 	case W1_CMD_RESET:
388 		err = w1_reset_bus(dev);
389 		break;
390 	case W1_CMD_SLAVE_ADD:
391 	case W1_CMD_SLAVE_REMOVE:
392 		mutex_unlock(&dev->bus_mutex);
393 		mutex_lock(&dev->mutex);
394 		err = w1_process_command_addremove(dev, req_cmd);
395 		mutex_unlock(&dev->mutex);
396 		mutex_lock(&dev->bus_mutex);
397 		break;
398 	default:
399 		err = -EINVAL;
400 		break;
401 	}
402 
403 	return err;
404 }
405 
406 static int w1_process_command_slave(struct w1_slave *sl,
407 		struct w1_netlink_cmd *cmd)
408 {
409 	dev_dbg(&sl->master->dev, "%s: %02x.%012llx.%02x: cmd=%02x, len=%u.\n",
410 		__func__, sl->reg_num.family, (unsigned long long)sl->reg_num.id,
411 		sl->reg_num.crc, cmd->cmd, cmd->len);
412 
413 	return w1_process_command_io(sl->master, cmd);
414 }
415 
416 static int w1_process_command_root(struct cn_msg *req_cn, u32 portid)
417 {
418 	struct w1_master *dev;
419 	struct cn_msg *cn;
420 	struct w1_netlink_msg *msg;
421 	u32 *id;
422 
423 	cn = kmalloc(PAGE_SIZE, GFP_KERNEL);
424 	if (!cn)
425 		return -ENOMEM;
426 
427 	cn->id.idx = CN_W1_IDX;
428 	cn->id.val = CN_W1_VAL;
429 
430 	cn->seq = req_cn->seq;
431 	cn->ack = req_cn->seq + 1;
432 	cn->len = sizeof(struct w1_netlink_msg);
433 	msg = (struct w1_netlink_msg *)cn->data;
434 
435 	msg->type = W1_LIST_MASTERS;
436 	msg->status = 0;
437 	msg->len = 0;
438 	id = (u32 *)msg->data;
439 
440 	mutex_lock(&w1_mlock);
441 	list_for_each_entry(dev, &w1_masters, w1_master_entry) {
442 		if (cn->len + sizeof(*id) > PAGE_SIZE - sizeof(struct cn_msg)) {
443 			cn_netlink_send(cn, portid, 0, GFP_KERNEL);
444 			cn->len = sizeof(struct w1_netlink_msg);
445 			msg->len = 0;
446 			id = (u32 *)msg->data;
447 		}
448 
449 		*id = dev->id;
450 		msg->len += sizeof(*id);
451 		cn->len += sizeof(*id);
452 		id++;
453 	}
454 	cn_netlink_send(cn, portid, 0, GFP_KERNEL);
455 	mutex_unlock(&w1_mlock);
456 
457 	kfree(cn);
458 	return 0;
459 }
460 
461 static void w1_process_cb(struct w1_master *dev, struct w1_async_cmd *async_cmd)
462 {
463 	struct w1_cb_node *node = container_of(async_cmd, struct w1_cb_node,
464 		async);
465 	u16 mlen = node->msg->len;
466 	u16 len;
467 	int err = 0;
468 	struct w1_slave *sl = node->sl;
469 	struct w1_netlink_cmd *cmd = (struct w1_netlink_cmd *)node->msg->data;
470 
471 	mutex_lock(&dev->bus_mutex);
472 	dev->priv = node->block;
473 	if (sl && w1_reset_select_slave(sl))
474 		err = -ENODEV;
475 	node->block->cur_msg = node->msg;
476 
477 	while (mlen && !err) {
478 		if (cmd->len + sizeof(struct w1_netlink_cmd) > mlen) {
479 			err = -E2BIG;
480 			break;
481 		}
482 
483 		if (sl)
484 			err = w1_process_command_slave(sl, cmd);
485 		else
486 			err = w1_process_command_master(dev, cmd);
487 		w1_netlink_check_send(node->block);
488 
489 		w1_netlink_queue_status(node->block, node->msg, cmd, err);
490 		err = 0;
491 
492 		len = sizeof(*cmd) + cmd->len;
493 		cmd = (struct w1_netlink_cmd *)((u8 *)cmd + len);
494 		mlen -= len;
495 	}
496 
497 	if (!cmd || err)
498 		w1_netlink_queue_status(node->block, node->msg, cmd, err);
499 
500 	/* ref taken in w1_search_slave or w1_search_master_id when building
501 	 * the block
502 	 */
503 	if (sl)
504 		w1_unref_slave(sl);
505 	else
506 		atomic_dec(&dev->refcnt);
507 	dev->priv = NULL;
508 	mutex_unlock(&dev->bus_mutex);
509 
510 	mutex_lock(&dev->list_mutex);
511 	list_del(&async_cmd->async_entry);
512 	mutex_unlock(&dev->list_mutex);
513 
514 	w1_unref_block(node->block);
515 }
516 
517 static void w1_list_count_cmds(struct w1_netlink_msg *msg, int *cmd_count,
518 	u16 *slave_len)
519 {
520 	struct w1_netlink_cmd *cmd = (struct w1_netlink_cmd *)msg->data;
521 	u16 mlen = msg->len;
522 	u16 len;
523 	int slave_list = 0;
524 	while (mlen) {
525 		if (cmd->len + sizeof(struct w1_netlink_cmd) > mlen)
526 			break;
527 
528 		switch (cmd->cmd) {
529 		case W1_CMD_SEARCH:
530 		case W1_CMD_ALARM_SEARCH:
531 		case W1_CMD_LIST_SLAVES:
532 			++slave_list;
533 		}
534 		++*cmd_count;
535 		len = sizeof(*cmd) + cmd->len;
536 		cmd = (struct w1_netlink_cmd *)((u8 *)cmd + len);
537 		mlen -= len;
538 	}
539 
540 	if (slave_list) {
541 		struct w1_master *dev = w1_search_master_id(msg->id.mst.id);
542 		if (dev) {
543 			/* Bytes, and likely an overstimate, and if it isn't
544 			 * the results can still be split between packets.
545 			 */
546 			*slave_len += sizeof(struct w1_reg_num) * slave_list *
547 				(dev->slave_count + dev->max_slave_count);
548 			/* search incremented it */
549 			atomic_dec(&dev->refcnt);
550 		}
551 	}
552 }
553 
554 static void w1_cn_callback(struct cn_msg *cn, struct netlink_skb_parms *nsp)
555 {
556 	struct w1_netlink_msg *msg = (struct w1_netlink_msg *)(cn + 1);
557 	struct w1_slave *sl;
558 	struct w1_master *dev;
559 	u16 msg_len;
560 	u16 slave_len = 0;
561 	int err = 0;
562 	struct w1_cb_block *block = NULL;
563 	struct w1_cb_node *node = NULL;
564 	int node_count = 0;
565 	int cmd_count = 0;
566 
567 	/* If any unknown flag is set let the application know, that way
568 	 * applications can detect the absence of features in kernels that
569 	 * don't know about them.  http://lwn.net/Articles/587527/
570 	 */
571 	if (cn->flags & ~(W1_CN_BUNDLE)) {
572 		w1_netlink_send_error(cn, msg, nsp->portid, -EINVAL);
573 		return;
574 	}
575 
576 	/* Count the number of master or slave commands there are to allocate
577 	 * space for one cb_node each.
578 	 */
579 	msg_len = cn->len;
580 	while (msg_len && !err) {
581 		if (msg->len + sizeof(struct w1_netlink_msg) > msg_len) {
582 			err = -E2BIG;
583 			break;
584 		}
585 
586 		/* count messages for nodes and allocate any additional space
587 		 * required for slave lists
588 		 */
589 		if (msg->type == W1_MASTER_CMD || msg->type == W1_SLAVE_CMD) {
590 			++node_count;
591 			w1_list_count_cmds(msg, &cmd_count, &slave_len);
592 		}
593 
594 		msg_len -= sizeof(struct w1_netlink_msg) + msg->len;
595 		msg = (struct w1_netlink_msg *)(((u8 *)msg) +
596 			sizeof(struct w1_netlink_msg) + msg->len);
597 	}
598 	msg = (struct w1_netlink_msg *)(cn + 1);
599 	if (node_count) {
600 		int size;
601 		int reply_size = sizeof(*cn) + cn->len + slave_len;
602 		if (cn->flags & W1_CN_BUNDLE) {
603 			/* bundling duplicats some of the messages */
604 			reply_size += 2 * cmd_count * (sizeof(struct cn_msg) +
605 				sizeof(struct w1_netlink_msg) +
606 				sizeof(struct w1_netlink_cmd));
607 		}
608 		reply_size = MIN(CONNECTOR_MAX_MSG_SIZE, reply_size);
609 
610 		/* allocate space for the block, a copy of the original message,
611 		 * one node per cmd to point into the original message,
612 		 * space for replies which is the original message size plus
613 		 * space for any list slave data and status messages
614 		 * cn->len doesn't include itself which is part of the block
615 		 * */
616 		size =  /* block + original message */
617 			sizeof(struct w1_cb_block) + sizeof(*cn) + cn->len +
618 			/* space for nodes */
619 			node_count * sizeof(struct w1_cb_node) +
620 			/* replies */
621 			sizeof(struct cn_msg) + reply_size;
622 		block = kzalloc(size, GFP_KERNEL);
623 		if (!block) {
624 			/* if the system is already out of memory,
625 			 * (A) will this work, and (B) would it be better
626 			 * to not try?
627 			 */
628 			w1_netlink_send_error(cn, msg, nsp->portid, -ENOMEM);
629 			return;
630 		}
631 		atomic_set(&block->refcnt, 1);
632 		block->portid = nsp->portid;
633 		memcpy(&block->request_cn, cn, sizeof(*cn) + cn->len);
634 		node = (struct w1_cb_node *)(block->request_cn.data + cn->len);
635 
636 		/* Sneeky, when not bundling, reply_size is the allocated space
637 		 * required for the reply, cn_msg isn't part of maxlen so
638 		 * it should be reply_size - sizeof(struct cn_msg), however
639 		 * when checking if there is enough space, w1_reply_make_space
640 		 * is called with the full message size including cn_msg,
641 		 * because it isn't known at that time if an additional cn_msg
642 		 * will need to be allocated.  So an extra cn_msg is added
643 		 * above in "size".
644 		 */
645 		block->maxlen = reply_size;
646 		block->first_cn = (struct cn_msg *)(node + node_count);
647 		memset(block->first_cn, 0, sizeof(*block->first_cn));
648 	}
649 
650 	msg_len = cn->len;
651 	while (msg_len && !err) {
652 
653 		dev = NULL;
654 		sl = NULL;
655 
656 		if (msg->len + sizeof(struct w1_netlink_msg) > msg_len) {
657 			err = -E2BIG;
658 			break;
659 		}
660 
661 		/* execute on this thread, no need to process later */
662 		if (msg->type == W1_LIST_MASTERS) {
663 			err = w1_process_command_root(cn, nsp->portid);
664 			goto out_cont;
665 		}
666 
667 		/* All following message types require additional data,
668 		 * check here before references are taken.
669 		 */
670 		if (!msg->len) {
671 			err = -EPROTO;
672 			goto out_cont;
673 		}
674 
675 		/* both search calls take references */
676 		if (msg->type == W1_MASTER_CMD) {
677 			dev = w1_search_master_id(msg->id.mst.id);
678 		} else if (msg->type == W1_SLAVE_CMD) {
679 			sl = w1_search_slave((struct w1_reg_num *)msg->id.id);
680 			if (sl)
681 				dev = sl->master;
682 		} else {
683 			pr_notice("%s: cn: %x.%x, wrong type: %u, len: %u.\n",
684 				__func__, cn->id.idx, cn->id.val,
685 				msg->type, msg->len);
686 			err = -EPROTO;
687 			goto out_cont;
688 		}
689 
690 		if (!dev) {
691 			err = -ENODEV;
692 			goto out_cont;
693 		}
694 
695 		err = 0;
696 
697 		atomic_inc(&block->refcnt);
698 		node->async.cb = w1_process_cb;
699 		node->block = block;
700 		node->msg = (struct w1_netlink_msg *)((u8 *)&block->request_cn +
701 			(size_t)((u8 *)msg - (u8 *)cn));
702 		node->sl = sl;
703 		node->dev = dev;
704 
705 		mutex_lock(&dev->list_mutex);
706 		list_add_tail(&node->async.async_entry, &dev->async_list);
707 		wake_up_process(dev->thread);
708 		mutex_unlock(&dev->list_mutex);
709 		++node;
710 
711 out_cont:
712 		/* Can't queue because that modifies block and another
713 		 * thread could be processing the messages by now and
714 		 * there isn't a lock, send directly.
715 		 */
716 		if (err)
717 			w1_netlink_send_error(cn, msg, nsp->portid, err);
718 		msg_len -= sizeof(struct w1_netlink_msg) + msg->len;
719 		msg = (struct w1_netlink_msg *)(((u8 *)msg) +
720 			sizeof(struct w1_netlink_msg) + msg->len);
721 
722 		/*
723 		 * Let's allow requests for nonexisting devices.
724 		 */
725 		if (err == -ENODEV)
726 			err = 0;
727 	}
728 	if (block)
729 		w1_unref_block(block);
730 }
731 
732 int w1_init_netlink(void)
733 {
734 	struct cb_id w1_id = {.idx = CN_W1_IDX, .val = CN_W1_VAL};
735 
736 	return cn_add_callback(&w1_id, "w1", &w1_cn_callback);
737 }
738 
739 void w1_fini_netlink(void)
740 {
741 	struct cb_id w1_id = {.idx = CN_W1_IDX, .val = CN_W1_VAL};
742 
743 	cn_del_callback(&w1_id);
744 }
745 #else
746 void w1_netlink_send(struct w1_master *dev, struct w1_netlink_msg *cn)
747 {
748 }
749 
750 int w1_init_netlink(void)
751 {
752 	return 0;
753 }
754 
755 void w1_fini_netlink(void)
756 {
757 }
758 #endif
759