• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 Instituto Nokia de Tecnologia
3  *
4  * Authors:
5  *    Lauro Ramos Venancio <lauro.venancio@openbossa.org>
6  *    Aloisio Almeida Jr <aloisio.almeida@openbossa.org>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, see <http://www.gnu.org/licenses/>.
20  */
21 
22 #define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__
23 
24 #include <net/genetlink.h>
25 #include <linux/nfc.h>
26 #include <linux/slab.h>
27 
28 #include "nfc.h"
29 #include "llcp.h"
30 
31 static const struct genl_multicast_group nfc_genl_mcgrps[] = {
32 	{ .name = NFC_GENL_MCAST_EVENT_NAME, },
33 };
34 
35 static struct genl_family nfc_genl_family = {
36 	.id = GENL_ID_GENERATE,
37 	.hdrsize = 0,
38 	.name = NFC_GENL_NAME,
39 	.version = NFC_GENL_VERSION,
40 	.maxattr = NFC_ATTR_MAX,
41 };
42 
43 static const struct nla_policy nfc_genl_policy[NFC_ATTR_MAX + 1] = {
44 	[NFC_ATTR_DEVICE_INDEX] = { .type = NLA_U32 },
45 	[NFC_ATTR_DEVICE_NAME] = { .type = NLA_STRING,
46 				.len = NFC_DEVICE_NAME_MAXSIZE },
47 	[NFC_ATTR_PROTOCOLS] = { .type = NLA_U32 },
48 	[NFC_ATTR_COMM_MODE] = { .type = NLA_U8 },
49 	[NFC_ATTR_RF_MODE] = { .type = NLA_U8 },
50 	[NFC_ATTR_DEVICE_POWERED] = { .type = NLA_U8 },
51 	[NFC_ATTR_IM_PROTOCOLS] = { .type = NLA_U32 },
52 	[NFC_ATTR_TM_PROTOCOLS] = { .type = NLA_U32 },
53 	[NFC_ATTR_LLC_PARAM_LTO] = { .type = NLA_U8 },
54 	[NFC_ATTR_LLC_PARAM_RW] = { .type = NLA_U8 },
55 	[NFC_ATTR_LLC_PARAM_MIUX] = { .type = NLA_U16 },
56 	[NFC_ATTR_LLC_SDP] = { .type = NLA_NESTED },
57 	[NFC_ATTR_FIRMWARE_NAME] = { .type = NLA_STRING,
58 				     .len = NFC_FIRMWARE_NAME_MAXSIZE },
59 	[NFC_ATTR_SE_APDU] = { .type = NLA_BINARY },
60 };
61 
62 static const struct nla_policy nfc_sdp_genl_policy[NFC_SDP_ATTR_MAX + 1] = {
63 	[NFC_SDP_ATTR_URI] = { .type = NLA_STRING },
64 	[NFC_SDP_ATTR_SAP] = { .type = NLA_U8 },
65 };
66 
nfc_genl_send_target(struct sk_buff * msg,struct nfc_target * target,struct netlink_callback * cb,int flags)67 static int nfc_genl_send_target(struct sk_buff *msg, struct nfc_target *target,
68 				struct netlink_callback *cb, int flags)
69 {
70 	void *hdr;
71 
72 	hdr = genlmsg_put(msg, NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq,
73 			  &nfc_genl_family, flags, NFC_CMD_GET_TARGET);
74 	if (!hdr)
75 		return -EMSGSIZE;
76 
77 	genl_dump_check_consistent(cb, hdr, &nfc_genl_family);
78 
79 	if (nla_put_u32(msg, NFC_ATTR_TARGET_INDEX, target->idx) ||
80 	    nla_put_u32(msg, NFC_ATTR_PROTOCOLS, target->supported_protocols) ||
81 	    nla_put_u16(msg, NFC_ATTR_TARGET_SENS_RES, target->sens_res) ||
82 	    nla_put_u8(msg, NFC_ATTR_TARGET_SEL_RES, target->sel_res))
83 		goto nla_put_failure;
84 	if (target->nfcid1_len > 0 &&
85 	    nla_put(msg, NFC_ATTR_TARGET_NFCID1, target->nfcid1_len,
86 		    target->nfcid1))
87 		goto nla_put_failure;
88 	if (target->sensb_res_len > 0 &&
89 	    nla_put(msg, NFC_ATTR_TARGET_SENSB_RES, target->sensb_res_len,
90 		    target->sensb_res))
91 		goto nla_put_failure;
92 	if (target->sensf_res_len > 0 &&
93 	    nla_put(msg, NFC_ATTR_TARGET_SENSF_RES, target->sensf_res_len,
94 		    target->sensf_res))
95 		goto nla_put_failure;
96 
97 	if (target->is_iso15693) {
98 		if (nla_put_u8(msg, NFC_ATTR_TARGET_ISO15693_DSFID,
99 			       target->iso15693_dsfid) ||
100 		    nla_put(msg, NFC_ATTR_TARGET_ISO15693_UID,
101 			    sizeof(target->iso15693_uid), target->iso15693_uid))
102 			goto nla_put_failure;
103 	}
104 
105 	return genlmsg_end(msg, hdr);
106 
107 nla_put_failure:
108 	genlmsg_cancel(msg, hdr);
109 	return -EMSGSIZE;
110 }
111 
__get_device_from_cb(struct netlink_callback * cb)112 static struct nfc_dev *__get_device_from_cb(struct netlink_callback *cb)
113 {
114 	struct nfc_dev *dev;
115 	int rc;
116 	u32 idx;
117 
118 	rc = nlmsg_parse(cb->nlh, GENL_HDRLEN + nfc_genl_family.hdrsize,
119 			 nfc_genl_family.attrbuf,
120 			 nfc_genl_family.maxattr,
121 			 nfc_genl_policy);
122 	if (rc < 0)
123 		return ERR_PTR(rc);
124 
125 	if (!nfc_genl_family.attrbuf[NFC_ATTR_DEVICE_INDEX])
126 		return ERR_PTR(-EINVAL);
127 
128 	idx = nla_get_u32(nfc_genl_family.attrbuf[NFC_ATTR_DEVICE_INDEX]);
129 
130 	dev = nfc_get_device(idx);
131 	if (!dev)
132 		return ERR_PTR(-ENODEV);
133 
134 	return dev;
135 }
136 
nfc_genl_dump_targets(struct sk_buff * skb,struct netlink_callback * cb)137 static int nfc_genl_dump_targets(struct sk_buff *skb,
138 				 struct netlink_callback *cb)
139 {
140 	int i = cb->args[0];
141 	struct nfc_dev *dev = (struct nfc_dev *) cb->args[1];
142 	int rc;
143 
144 	if (!dev) {
145 		dev = __get_device_from_cb(cb);
146 		if (IS_ERR(dev))
147 			return PTR_ERR(dev);
148 
149 		cb->args[1] = (long) dev;
150 	}
151 
152 	device_lock(&dev->dev);
153 
154 	cb->seq = dev->targets_generation;
155 
156 	while (i < dev->n_targets) {
157 		rc = nfc_genl_send_target(skb, &dev->targets[i], cb,
158 					  NLM_F_MULTI);
159 		if (rc < 0)
160 			break;
161 
162 		i++;
163 	}
164 
165 	device_unlock(&dev->dev);
166 
167 	cb->args[0] = i;
168 
169 	return skb->len;
170 }
171 
nfc_genl_dump_targets_done(struct netlink_callback * cb)172 static int nfc_genl_dump_targets_done(struct netlink_callback *cb)
173 {
174 	struct nfc_dev *dev = (struct nfc_dev *) cb->args[1];
175 
176 	if (dev)
177 		nfc_put_device(dev);
178 
179 	return 0;
180 }
181 
nfc_genl_targets_found(struct nfc_dev * dev)182 int nfc_genl_targets_found(struct nfc_dev *dev)
183 {
184 	struct sk_buff *msg;
185 	void *hdr;
186 
187 	dev->genl_data.poll_req_portid = 0;
188 
189 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
190 	if (!msg)
191 		return -ENOMEM;
192 
193 	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
194 			  NFC_EVENT_TARGETS_FOUND);
195 	if (!hdr)
196 		goto free_msg;
197 
198 	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
199 		goto nla_put_failure;
200 
201 	genlmsg_end(msg, hdr);
202 
203 	return genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC);
204 
205 nla_put_failure:
206 	genlmsg_cancel(msg, hdr);
207 free_msg:
208 	nlmsg_free(msg);
209 	return -EMSGSIZE;
210 }
211 
nfc_genl_target_lost(struct nfc_dev * dev,u32 target_idx)212 int nfc_genl_target_lost(struct nfc_dev *dev, u32 target_idx)
213 {
214 	struct sk_buff *msg;
215 	void *hdr;
216 
217 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
218 	if (!msg)
219 		return -ENOMEM;
220 
221 	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
222 			  NFC_EVENT_TARGET_LOST);
223 	if (!hdr)
224 		goto free_msg;
225 
226 	if (nla_put_string(msg, NFC_ATTR_DEVICE_NAME, nfc_device_name(dev)) ||
227 	    nla_put_u32(msg, NFC_ATTR_TARGET_INDEX, target_idx))
228 		goto nla_put_failure;
229 
230 	genlmsg_end(msg, hdr);
231 
232 	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
233 
234 	return 0;
235 
236 nla_put_failure:
237 	genlmsg_cancel(msg, hdr);
238 free_msg:
239 	nlmsg_free(msg);
240 	return -EMSGSIZE;
241 }
242 
nfc_genl_tm_activated(struct nfc_dev * dev,u32 protocol)243 int nfc_genl_tm_activated(struct nfc_dev *dev, u32 protocol)
244 {
245 	struct sk_buff *msg;
246 	void *hdr;
247 
248 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
249 	if (!msg)
250 		return -ENOMEM;
251 
252 	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
253 			  NFC_EVENT_TM_ACTIVATED);
254 	if (!hdr)
255 		goto free_msg;
256 
257 	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
258 		goto nla_put_failure;
259 	if (nla_put_u32(msg, NFC_ATTR_TM_PROTOCOLS, protocol))
260 		goto nla_put_failure;
261 
262 	genlmsg_end(msg, hdr);
263 
264 	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
265 
266 	return 0;
267 
268 nla_put_failure:
269 	genlmsg_cancel(msg, hdr);
270 free_msg:
271 	nlmsg_free(msg);
272 	return -EMSGSIZE;
273 }
274 
nfc_genl_tm_deactivated(struct nfc_dev * dev)275 int nfc_genl_tm_deactivated(struct nfc_dev *dev)
276 {
277 	struct sk_buff *msg;
278 	void *hdr;
279 
280 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
281 	if (!msg)
282 		return -ENOMEM;
283 
284 	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
285 			  NFC_EVENT_TM_DEACTIVATED);
286 	if (!hdr)
287 		goto free_msg;
288 
289 	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
290 		goto nla_put_failure;
291 
292 	genlmsg_end(msg, hdr);
293 
294 	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
295 
296 	return 0;
297 
298 nla_put_failure:
299 	genlmsg_cancel(msg, hdr);
300 free_msg:
301 	nlmsg_free(msg);
302 	return -EMSGSIZE;
303 }
304 
nfc_genl_device_added(struct nfc_dev * dev)305 int nfc_genl_device_added(struct nfc_dev *dev)
306 {
307 	struct sk_buff *msg;
308 	void *hdr;
309 
310 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
311 	if (!msg)
312 		return -ENOMEM;
313 
314 	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
315 			  NFC_EVENT_DEVICE_ADDED);
316 	if (!hdr)
317 		goto free_msg;
318 
319 	if (nla_put_string(msg, NFC_ATTR_DEVICE_NAME, nfc_device_name(dev)) ||
320 	    nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
321 	    nla_put_u32(msg, NFC_ATTR_PROTOCOLS, dev->supported_protocols) ||
322 	    nla_put_u8(msg, NFC_ATTR_DEVICE_POWERED, dev->dev_up))
323 		goto nla_put_failure;
324 
325 	genlmsg_end(msg, hdr);
326 
327 	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
328 
329 	return 0;
330 
331 nla_put_failure:
332 	genlmsg_cancel(msg, hdr);
333 free_msg:
334 	nlmsg_free(msg);
335 	return -EMSGSIZE;
336 }
337 
nfc_genl_device_removed(struct nfc_dev * dev)338 int nfc_genl_device_removed(struct nfc_dev *dev)
339 {
340 	struct sk_buff *msg;
341 	void *hdr;
342 
343 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
344 	if (!msg)
345 		return -ENOMEM;
346 
347 	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
348 			  NFC_EVENT_DEVICE_REMOVED);
349 	if (!hdr)
350 		goto free_msg;
351 
352 	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
353 		goto nla_put_failure;
354 
355 	genlmsg_end(msg, hdr);
356 
357 	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
358 
359 	return 0;
360 
361 nla_put_failure:
362 	genlmsg_cancel(msg, hdr);
363 free_msg:
364 	nlmsg_free(msg);
365 	return -EMSGSIZE;
366 }
367 
nfc_genl_llc_send_sdres(struct nfc_dev * dev,struct hlist_head * sdres_list)368 int nfc_genl_llc_send_sdres(struct nfc_dev *dev, struct hlist_head *sdres_list)
369 {
370 	struct sk_buff *msg;
371 	struct nlattr *sdp_attr, *uri_attr;
372 	struct nfc_llcp_sdp_tlv *sdres;
373 	struct hlist_node *n;
374 	void *hdr;
375 	int rc = -EMSGSIZE;
376 	int i;
377 
378 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
379 	if (!msg)
380 		return -ENOMEM;
381 
382 	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
383 			  NFC_EVENT_LLC_SDRES);
384 	if (!hdr)
385 		goto free_msg;
386 
387 	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
388 		goto nla_put_failure;
389 
390 	sdp_attr = nla_nest_start(msg, NFC_ATTR_LLC_SDP);
391 	if (sdp_attr == NULL) {
392 		rc = -ENOMEM;
393 		goto nla_put_failure;
394 	}
395 
396 	i = 1;
397 	hlist_for_each_entry_safe(sdres, n, sdres_list, node) {
398 		pr_debug("uri: %s, sap: %d\n", sdres->uri, sdres->sap);
399 
400 		uri_attr = nla_nest_start(msg, i++);
401 		if (uri_attr == NULL) {
402 			rc = -ENOMEM;
403 			goto nla_put_failure;
404 		}
405 
406 		if (nla_put_u8(msg, NFC_SDP_ATTR_SAP, sdres->sap))
407 			goto nla_put_failure;
408 
409 		if (nla_put_string(msg, NFC_SDP_ATTR_URI, sdres->uri))
410 			goto nla_put_failure;
411 
412 		nla_nest_end(msg, uri_attr);
413 
414 		hlist_del(&sdres->node);
415 
416 		nfc_llcp_free_sdp_tlv(sdres);
417 	}
418 
419 	nla_nest_end(msg, sdp_attr);
420 
421 	genlmsg_end(msg, hdr);
422 
423 	return genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC);
424 
425 nla_put_failure:
426 	genlmsg_cancel(msg, hdr);
427 
428 free_msg:
429 	nlmsg_free(msg);
430 
431 	nfc_llcp_free_sdp_tlv_list(sdres_list);
432 
433 	return rc;
434 }
435 
nfc_genl_se_added(struct nfc_dev * dev,u32 se_idx,u16 type)436 int nfc_genl_se_added(struct nfc_dev *dev, u32 se_idx, u16 type)
437 {
438 	struct sk_buff *msg;
439 	void *hdr;
440 
441 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
442 	if (!msg)
443 		return -ENOMEM;
444 
445 	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
446 			  NFC_EVENT_SE_ADDED);
447 	if (!hdr)
448 		goto free_msg;
449 
450 	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
451 	    nla_put_u32(msg, NFC_ATTR_SE_INDEX, se_idx) ||
452 	    nla_put_u8(msg, NFC_ATTR_SE_TYPE, type))
453 		goto nla_put_failure;
454 
455 	genlmsg_end(msg, hdr);
456 
457 	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
458 
459 	return 0;
460 
461 nla_put_failure:
462 	genlmsg_cancel(msg, hdr);
463 free_msg:
464 	nlmsg_free(msg);
465 	return -EMSGSIZE;
466 }
467 
nfc_genl_se_removed(struct nfc_dev * dev,u32 se_idx)468 int nfc_genl_se_removed(struct nfc_dev *dev, u32 se_idx)
469 {
470 	struct sk_buff *msg;
471 	void *hdr;
472 
473 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
474 	if (!msg)
475 		return -ENOMEM;
476 
477 	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
478 			  NFC_EVENT_SE_REMOVED);
479 	if (!hdr)
480 		goto free_msg;
481 
482 	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
483 	    nla_put_u32(msg, NFC_ATTR_SE_INDEX, se_idx))
484 		goto nla_put_failure;
485 
486 	genlmsg_end(msg, hdr);
487 
488 	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
489 
490 	return 0;
491 
492 nla_put_failure:
493 	genlmsg_cancel(msg, hdr);
494 free_msg:
495 	nlmsg_free(msg);
496 	return -EMSGSIZE;
497 }
498 
nfc_genl_send_device(struct sk_buff * msg,struct nfc_dev * dev,u32 portid,u32 seq,struct netlink_callback * cb,int flags)499 static int nfc_genl_send_device(struct sk_buff *msg, struct nfc_dev *dev,
500 				u32 portid, u32 seq,
501 				struct netlink_callback *cb,
502 				int flags)
503 {
504 	void *hdr;
505 
506 	hdr = genlmsg_put(msg, portid, seq, &nfc_genl_family, flags,
507 			  NFC_CMD_GET_DEVICE);
508 	if (!hdr)
509 		return -EMSGSIZE;
510 
511 	if (cb)
512 		genl_dump_check_consistent(cb, hdr, &nfc_genl_family);
513 
514 	if (nla_put_string(msg, NFC_ATTR_DEVICE_NAME, nfc_device_name(dev)) ||
515 	    nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
516 	    nla_put_u32(msg, NFC_ATTR_PROTOCOLS, dev->supported_protocols) ||
517 	    nla_put_u8(msg, NFC_ATTR_DEVICE_POWERED, dev->dev_up) ||
518 	    nla_put_u8(msg, NFC_ATTR_RF_MODE, dev->rf_mode))
519 		goto nla_put_failure;
520 
521 	return genlmsg_end(msg, hdr);
522 
523 nla_put_failure:
524 	genlmsg_cancel(msg, hdr);
525 	return -EMSGSIZE;
526 }
527 
nfc_genl_dump_devices(struct sk_buff * skb,struct netlink_callback * cb)528 static int nfc_genl_dump_devices(struct sk_buff *skb,
529 				 struct netlink_callback *cb)
530 {
531 	struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0];
532 	struct nfc_dev *dev = (struct nfc_dev *) cb->args[1];
533 	bool first_call = false;
534 
535 	if (!iter) {
536 		first_call = true;
537 		iter = kmalloc(sizeof(struct class_dev_iter), GFP_KERNEL);
538 		if (!iter)
539 			return -ENOMEM;
540 		cb->args[0] = (long) iter;
541 	}
542 
543 	mutex_lock(&nfc_devlist_mutex);
544 
545 	cb->seq = nfc_devlist_generation;
546 
547 	if (first_call) {
548 		nfc_device_iter_init(iter);
549 		dev = nfc_device_iter_next(iter);
550 	}
551 
552 	while (dev) {
553 		int rc;
554 
555 		rc = nfc_genl_send_device(skb, dev, NETLINK_CB(cb->skb).portid,
556 					  cb->nlh->nlmsg_seq, cb, NLM_F_MULTI);
557 		if (rc < 0)
558 			break;
559 
560 		dev = nfc_device_iter_next(iter);
561 	}
562 
563 	mutex_unlock(&nfc_devlist_mutex);
564 
565 	cb->args[1] = (long) dev;
566 
567 	return skb->len;
568 }
569 
nfc_genl_dump_devices_done(struct netlink_callback * cb)570 static int nfc_genl_dump_devices_done(struct netlink_callback *cb)
571 {
572 	struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0];
573 
574 	nfc_device_iter_exit(iter);
575 	kfree(iter);
576 
577 	return 0;
578 }
579 
nfc_genl_dep_link_up_event(struct nfc_dev * dev,u32 target_idx,u8 comm_mode,u8 rf_mode)580 int nfc_genl_dep_link_up_event(struct nfc_dev *dev, u32 target_idx,
581 			       u8 comm_mode, u8 rf_mode)
582 {
583 	struct sk_buff *msg;
584 	void *hdr;
585 
586 	pr_debug("DEP link is up\n");
587 
588 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
589 	if (!msg)
590 		return -ENOMEM;
591 
592 	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0, NFC_CMD_DEP_LINK_UP);
593 	if (!hdr)
594 		goto free_msg;
595 
596 	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
597 		goto nla_put_failure;
598 	if (rf_mode == NFC_RF_INITIATOR &&
599 	    nla_put_u32(msg, NFC_ATTR_TARGET_INDEX, target_idx))
600 		goto nla_put_failure;
601 	if (nla_put_u8(msg, NFC_ATTR_COMM_MODE, comm_mode) ||
602 	    nla_put_u8(msg, NFC_ATTR_RF_MODE, rf_mode))
603 		goto nla_put_failure;
604 
605 	genlmsg_end(msg, hdr);
606 
607 	dev->dep_link_up = true;
608 
609 	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC);
610 
611 	return 0;
612 
613 nla_put_failure:
614 	genlmsg_cancel(msg, hdr);
615 free_msg:
616 	nlmsg_free(msg);
617 	return -EMSGSIZE;
618 }
619 
nfc_genl_dep_link_down_event(struct nfc_dev * dev)620 int nfc_genl_dep_link_down_event(struct nfc_dev *dev)
621 {
622 	struct sk_buff *msg;
623 	void *hdr;
624 
625 	pr_debug("DEP link is down\n");
626 
627 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
628 	if (!msg)
629 		return -ENOMEM;
630 
631 	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
632 			  NFC_CMD_DEP_LINK_DOWN);
633 	if (!hdr)
634 		goto free_msg;
635 
636 	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
637 		goto nla_put_failure;
638 
639 	genlmsg_end(msg, hdr);
640 
641 	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC);
642 
643 	return 0;
644 
645 nla_put_failure:
646 	genlmsg_cancel(msg, hdr);
647 free_msg:
648 	nlmsg_free(msg);
649 	return -EMSGSIZE;
650 }
651 
nfc_genl_get_device(struct sk_buff * skb,struct genl_info * info)652 static int nfc_genl_get_device(struct sk_buff *skb, struct genl_info *info)
653 {
654 	struct sk_buff *msg;
655 	struct nfc_dev *dev;
656 	u32 idx;
657 	int rc = -ENOBUFS;
658 
659 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
660 		return -EINVAL;
661 
662 	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
663 
664 	dev = nfc_get_device(idx);
665 	if (!dev)
666 		return -ENODEV;
667 
668 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
669 	if (!msg) {
670 		rc = -ENOMEM;
671 		goto out_putdev;
672 	}
673 
674 	rc = nfc_genl_send_device(msg, dev, info->snd_portid, info->snd_seq,
675 				  NULL, 0);
676 	if (rc < 0)
677 		goto out_free;
678 
679 	nfc_put_device(dev);
680 
681 	return genlmsg_reply(msg, info);
682 
683 out_free:
684 	nlmsg_free(msg);
685 out_putdev:
686 	nfc_put_device(dev);
687 	return rc;
688 }
689 
nfc_genl_dev_up(struct sk_buff * skb,struct genl_info * info)690 static int nfc_genl_dev_up(struct sk_buff *skb, struct genl_info *info)
691 {
692 	struct nfc_dev *dev;
693 	int rc;
694 	u32 idx;
695 
696 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
697 		return -EINVAL;
698 
699 	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
700 
701 	dev = nfc_get_device(idx);
702 	if (!dev)
703 		return -ENODEV;
704 
705 	rc = nfc_dev_up(dev);
706 
707 	nfc_put_device(dev);
708 	return rc;
709 }
710 
nfc_genl_dev_down(struct sk_buff * skb,struct genl_info * info)711 static int nfc_genl_dev_down(struct sk_buff *skb, struct genl_info *info)
712 {
713 	struct nfc_dev *dev;
714 	int rc;
715 	u32 idx;
716 
717 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
718 		return -EINVAL;
719 
720 	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
721 
722 	dev = nfc_get_device(idx);
723 	if (!dev)
724 		return -ENODEV;
725 
726 	rc = nfc_dev_down(dev);
727 
728 	nfc_put_device(dev);
729 	return rc;
730 }
731 
nfc_genl_start_poll(struct sk_buff * skb,struct genl_info * info)732 static int nfc_genl_start_poll(struct sk_buff *skb, struct genl_info *info)
733 {
734 	struct nfc_dev *dev;
735 	int rc;
736 	u32 idx;
737 	u32 im_protocols = 0, tm_protocols = 0;
738 
739 	pr_debug("Poll start\n");
740 
741 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
742 	    ((!info->attrs[NFC_ATTR_IM_PROTOCOLS] &&
743 	      !info->attrs[NFC_ATTR_PROTOCOLS]) &&
744 	      !info->attrs[NFC_ATTR_TM_PROTOCOLS]))
745 		return -EINVAL;
746 
747 	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
748 
749 	if (info->attrs[NFC_ATTR_TM_PROTOCOLS])
750 		tm_protocols = nla_get_u32(info->attrs[NFC_ATTR_TM_PROTOCOLS]);
751 
752 	if (info->attrs[NFC_ATTR_IM_PROTOCOLS])
753 		im_protocols = nla_get_u32(info->attrs[NFC_ATTR_IM_PROTOCOLS]);
754 	else if (info->attrs[NFC_ATTR_PROTOCOLS])
755 		im_protocols = nla_get_u32(info->attrs[NFC_ATTR_PROTOCOLS]);
756 
757 	dev = nfc_get_device(idx);
758 	if (!dev)
759 		return -ENODEV;
760 
761 	mutex_lock(&dev->genl_data.genl_data_mutex);
762 
763 	rc = nfc_start_poll(dev, im_protocols, tm_protocols);
764 	if (!rc)
765 		dev->genl_data.poll_req_portid = info->snd_portid;
766 
767 	mutex_unlock(&dev->genl_data.genl_data_mutex);
768 
769 	nfc_put_device(dev);
770 	return rc;
771 }
772 
nfc_genl_stop_poll(struct sk_buff * skb,struct genl_info * info)773 static int nfc_genl_stop_poll(struct sk_buff *skb, struct genl_info *info)
774 {
775 	struct nfc_dev *dev;
776 	int rc;
777 	u32 idx;
778 
779 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
780 		return -EINVAL;
781 
782 	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
783 
784 	dev = nfc_get_device(idx);
785 	if (!dev)
786 		return -ENODEV;
787 
788 	device_lock(&dev->dev);
789 
790 	if (!dev->polling) {
791 		device_unlock(&dev->dev);
792 		return -EINVAL;
793 	}
794 
795 	device_unlock(&dev->dev);
796 
797 	mutex_lock(&dev->genl_data.genl_data_mutex);
798 
799 	if (dev->genl_data.poll_req_portid != info->snd_portid) {
800 		rc = -EBUSY;
801 		goto out;
802 	}
803 
804 	rc = nfc_stop_poll(dev);
805 	dev->genl_data.poll_req_portid = 0;
806 
807 out:
808 	mutex_unlock(&dev->genl_data.genl_data_mutex);
809 	nfc_put_device(dev);
810 	return rc;
811 }
812 
nfc_genl_dep_link_up(struct sk_buff * skb,struct genl_info * info)813 static int nfc_genl_dep_link_up(struct sk_buff *skb, struct genl_info *info)
814 {
815 	struct nfc_dev *dev;
816 	int rc, tgt_idx;
817 	u32 idx;
818 	u8 comm;
819 
820 	pr_debug("DEP link up\n");
821 
822 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
823 	    !info->attrs[NFC_ATTR_COMM_MODE])
824 		return -EINVAL;
825 
826 	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
827 	if (!info->attrs[NFC_ATTR_TARGET_INDEX])
828 		tgt_idx = NFC_TARGET_IDX_ANY;
829 	else
830 		tgt_idx = nla_get_u32(info->attrs[NFC_ATTR_TARGET_INDEX]);
831 
832 	comm = nla_get_u8(info->attrs[NFC_ATTR_COMM_MODE]);
833 
834 	if (comm != NFC_COMM_ACTIVE && comm != NFC_COMM_PASSIVE)
835 		return -EINVAL;
836 
837 	dev = nfc_get_device(idx);
838 	if (!dev)
839 		return -ENODEV;
840 
841 	rc = nfc_dep_link_up(dev, tgt_idx, comm);
842 
843 	nfc_put_device(dev);
844 
845 	return rc;
846 }
847 
nfc_genl_dep_link_down(struct sk_buff * skb,struct genl_info * info)848 static int nfc_genl_dep_link_down(struct sk_buff *skb, struct genl_info *info)
849 {
850 	struct nfc_dev *dev;
851 	int rc;
852 	u32 idx;
853 
854 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
855 		return -EINVAL;
856 
857 	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
858 
859 	dev = nfc_get_device(idx);
860 	if (!dev)
861 		return -ENODEV;
862 
863 	rc = nfc_dep_link_down(dev);
864 
865 	nfc_put_device(dev);
866 	return rc;
867 }
868 
nfc_genl_send_params(struct sk_buff * msg,struct nfc_llcp_local * local,u32 portid,u32 seq)869 static int nfc_genl_send_params(struct sk_buff *msg,
870 				struct nfc_llcp_local *local,
871 				u32 portid, u32 seq)
872 {
873 	void *hdr;
874 
875 	hdr = genlmsg_put(msg, portid, seq, &nfc_genl_family, 0,
876 			  NFC_CMD_LLC_GET_PARAMS);
877 	if (!hdr)
878 		return -EMSGSIZE;
879 
880 	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, local->dev->idx) ||
881 	    nla_put_u8(msg, NFC_ATTR_LLC_PARAM_LTO, local->lto) ||
882 	    nla_put_u8(msg, NFC_ATTR_LLC_PARAM_RW, local->rw) ||
883 	    nla_put_u16(msg, NFC_ATTR_LLC_PARAM_MIUX, be16_to_cpu(local->miux)))
884 		goto nla_put_failure;
885 
886 	return genlmsg_end(msg, hdr);
887 
888 nla_put_failure:
889 
890 	genlmsg_cancel(msg, hdr);
891 	return -EMSGSIZE;
892 }
893 
nfc_genl_llc_get_params(struct sk_buff * skb,struct genl_info * info)894 static int nfc_genl_llc_get_params(struct sk_buff *skb, struct genl_info *info)
895 {
896 	struct nfc_dev *dev;
897 	struct nfc_llcp_local *local;
898 	int rc = 0;
899 	struct sk_buff *msg = NULL;
900 	u32 idx;
901 
902 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
903 	    !info->attrs[NFC_ATTR_TARGET_INDEX] ||
904 	    !info->attrs[NFC_ATTR_PROTOCOLS])
905 		return -EINVAL;
906 
907 	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
908 
909 	dev = nfc_get_device(idx);
910 	if (!dev)
911 		return -ENODEV;
912 
913 	device_lock(&dev->dev);
914 
915 	local = nfc_llcp_find_local(dev);
916 	if (!local) {
917 		rc = -ENODEV;
918 		goto exit;
919 	}
920 
921 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
922 	if (!msg) {
923 		rc = -ENOMEM;
924 		goto exit;
925 	}
926 
927 	rc = nfc_genl_send_params(msg, local, info->snd_portid, info->snd_seq);
928 
929 exit:
930 	device_unlock(&dev->dev);
931 
932 	nfc_put_device(dev);
933 
934 	if (rc < 0) {
935 		if (msg)
936 			nlmsg_free(msg);
937 
938 		return rc;
939 	}
940 
941 	return genlmsg_reply(msg, info);
942 }
943 
nfc_genl_llc_set_params(struct sk_buff * skb,struct genl_info * info)944 static int nfc_genl_llc_set_params(struct sk_buff *skb, struct genl_info *info)
945 {
946 	struct nfc_dev *dev;
947 	struct nfc_llcp_local *local;
948 	u8 rw = 0;
949 	u16 miux = 0;
950 	u32 idx;
951 	int rc = 0;
952 
953 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
954 	    (!info->attrs[NFC_ATTR_LLC_PARAM_LTO] &&
955 	     !info->attrs[NFC_ATTR_LLC_PARAM_RW] &&
956 	     !info->attrs[NFC_ATTR_LLC_PARAM_MIUX]))
957 		return -EINVAL;
958 
959 	if (info->attrs[NFC_ATTR_LLC_PARAM_RW]) {
960 		rw = nla_get_u8(info->attrs[NFC_ATTR_LLC_PARAM_RW]);
961 
962 		if (rw > LLCP_MAX_RW)
963 			return -EINVAL;
964 	}
965 
966 	if (info->attrs[NFC_ATTR_LLC_PARAM_MIUX]) {
967 		miux = nla_get_u16(info->attrs[NFC_ATTR_LLC_PARAM_MIUX]);
968 
969 		if (miux > LLCP_MAX_MIUX)
970 			return -EINVAL;
971 	}
972 
973 	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
974 
975 	dev = nfc_get_device(idx);
976 	if (!dev)
977 		return -ENODEV;
978 
979 	device_lock(&dev->dev);
980 
981 	local = nfc_llcp_find_local(dev);
982 	if (!local) {
983 		nfc_put_device(dev);
984 		rc = -ENODEV;
985 		goto exit;
986 	}
987 
988 	if (info->attrs[NFC_ATTR_LLC_PARAM_LTO]) {
989 		if (dev->dep_link_up) {
990 			rc = -EINPROGRESS;
991 			goto exit;
992 		}
993 
994 		local->lto = nla_get_u8(info->attrs[NFC_ATTR_LLC_PARAM_LTO]);
995 	}
996 
997 	if (info->attrs[NFC_ATTR_LLC_PARAM_RW])
998 		local->rw = rw;
999 
1000 	if (info->attrs[NFC_ATTR_LLC_PARAM_MIUX])
1001 		local->miux = cpu_to_be16(miux);
1002 
1003 exit:
1004 	device_unlock(&dev->dev);
1005 
1006 	nfc_put_device(dev);
1007 
1008 	return rc;
1009 }
1010 
nfc_genl_llc_sdreq(struct sk_buff * skb,struct genl_info * info)1011 static int nfc_genl_llc_sdreq(struct sk_buff *skb, struct genl_info *info)
1012 {
1013 	struct nfc_dev *dev;
1014 	struct nfc_llcp_local *local;
1015 	struct nlattr *attr, *sdp_attrs[NFC_SDP_ATTR_MAX+1];
1016 	u32 idx;
1017 	u8 tid;
1018 	char *uri;
1019 	int rc = 0, rem;
1020 	size_t uri_len, tlvs_len;
1021 	struct hlist_head sdreq_list;
1022 	struct nfc_llcp_sdp_tlv *sdreq;
1023 
1024 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
1025 	    !info->attrs[NFC_ATTR_LLC_SDP])
1026 		return -EINVAL;
1027 
1028 	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
1029 
1030 	dev = nfc_get_device(idx);
1031 	if (!dev) {
1032 		rc = -ENODEV;
1033 		goto exit;
1034 	}
1035 
1036 	device_lock(&dev->dev);
1037 
1038 	if (dev->dep_link_up == false) {
1039 		rc = -ENOLINK;
1040 		goto exit;
1041 	}
1042 
1043 	local = nfc_llcp_find_local(dev);
1044 	if (!local) {
1045 		nfc_put_device(dev);
1046 		rc = -ENODEV;
1047 		goto exit;
1048 	}
1049 
1050 	INIT_HLIST_HEAD(&sdreq_list);
1051 
1052 	tlvs_len = 0;
1053 
1054 	nla_for_each_nested(attr, info->attrs[NFC_ATTR_LLC_SDP], rem) {
1055 		rc = nla_parse_nested(sdp_attrs, NFC_SDP_ATTR_MAX, attr,
1056 				      nfc_sdp_genl_policy);
1057 
1058 		if (rc != 0) {
1059 			rc = -EINVAL;
1060 			goto exit;
1061 		}
1062 
1063 		if (!sdp_attrs[NFC_SDP_ATTR_URI])
1064 			continue;
1065 
1066 		uri_len = nla_len(sdp_attrs[NFC_SDP_ATTR_URI]);
1067 		if (uri_len == 0)
1068 			continue;
1069 
1070 		uri = nla_data(sdp_attrs[NFC_SDP_ATTR_URI]);
1071 		if (uri == NULL || *uri == 0)
1072 			continue;
1073 
1074 		tid = local->sdreq_next_tid++;
1075 
1076 		sdreq = nfc_llcp_build_sdreq_tlv(tid, uri, uri_len);
1077 		if (sdreq == NULL) {
1078 			rc = -ENOMEM;
1079 			goto exit;
1080 		}
1081 
1082 		tlvs_len += sdreq->tlv_len;
1083 
1084 		hlist_add_head(&sdreq->node, &sdreq_list);
1085 	}
1086 
1087 	if (hlist_empty(&sdreq_list)) {
1088 		rc = -EINVAL;
1089 		goto exit;
1090 	}
1091 
1092 	rc = nfc_llcp_send_snl_sdreq(local, &sdreq_list, tlvs_len);
1093 exit:
1094 	device_unlock(&dev->dev);
1095 
1096 	nfc_put_device(dev);
1097 
1098 	return rc;
1099 }
1100 
nfc_genl_fw_download(struct sk_buff * skb,struct genl_info * info)1101 static int nfc_genl_fw_download(struct sk_buff *skb, struct genl_info *info)
1102 {
1103 	struct nfc_dev *dev;
1104 	int rc;
1105 	u32 idx;
1106 	char firmware_name[NFC_FIRMWARE_NAME_MAXSIZE + 1];
1107 
1108 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX])
1109 		return -EINVAL;
1110 
1111 	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
1112 
1113 	dev = nfc_get_device(idx);
1114 	if (!dev)
1115 		return -ENODEV;
1116 
1117 	nla_strlcpy(firmware_name, info->attrs[NFC_ATTR_FIRMWARE_NAME],
1118 		    sizeof(firmware_name));
1119 
1120 	rc = nfc_fw_download(dev, firmware_name);
1121 
1122 	nfc_put_device(dev);
1123 	return rc;
1124 }
1125 
nfc_genl_fw_download_done(struct nfc_dev * dev,const char * firmware_name,u32 result)1126 int nfc_genl_fw_download_done(struct nfc_dev *dev, const char *firmware_name,
1127 			      u32 result)
1128 {
1129 	struct sk_buff *msg;
1130 	void *hdr;
1131 
1132 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
1133 	if (!msg)
1134 		return -ENOMEM;
1135 
1136 	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
1137 			  NFC_CMD_FW_DOWNLOAD);
1138 	if (!hdr)
1139 		goto free_msg;
1140 
1141 	if (nla_put_string(msg, NFC_ATTR_FIRMWARE_NAME, firmware_name) ||
1142 	    nla_put_u32(msg, NFC_ATTR_FIRMWARE_DOWNLOAD_STATUS, result) ||
1143 	    nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx))
1144 		goto nla_put_failure;
1145 
1146 	genlmsg_end(msg, hdr);
1147 
1148 	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
1149 
1150 	return 0;
1151 
1152 nla_put_failure:
1153 	genlmsg_cancel(msg, hdr);
1154 free_msg:
1155 	nlmsg_free(msg);
1156 	return -EMSGSIZE;
1157 }
1158 
nfc_genl_enable_se(struct sk_buff * skb,struct genl_info * info)1159 static int nfc_genl_enable_se(struct sk_buff *skb, struct genl_info *info)
1160 {
1161 	struct nfc_dev *dev;
1162 	int rc;
1163 	u32 idx, se_idx;
1164 
1165 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
1166 	    !info->attrs[NFC_ATTR_SE_INDEX])
1167 		return -EINVAL;
1168 
1169 	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
1170 	se_idx = nla_get_u32(info->attrs[NFC_ATTR_SE_INDEX]);
1171 
1172 	dev = nfc_get_device(idx);
1173 	if (!dev)
1174 		return -ENODEV;
1175 
1176 	rc = nfc_enable_se(dev, se_idx);
1177 
1178 	nfc_put_device(dev);
1179 	return rc;
1180 }
1181 
nfc_genl_disable_se(struct sk_buff * skb,struct genl_info * info)1182 static int nfc_genl_disable_se(struct sk_buff *skb, struct genl_info *info)
1183 {
1184 	struct nfc_dev *dev;
1185 	int rc;
1186 	u32 idx, se_idx;
1187 
1188 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
1189 	    !info->attrs[NFC_ATTR_SE_INDEX])
1190 		return -EINVAL;
1191 
1192 	idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
1193 	se_idx = nla_get_u32(info->attrs[NFC_ATTR_SE_INDEX]);
1194 
1195 	dev = nfc_get_device(idx);
1196 	if (!dev)
1197 		return -ENODEV;
1198 
1199 	rc = nfc_disable_se(dev, se_idx);
1200 
1201 	nfc_put_device(dev);
1202 	return rc;
1203 }
1204 
nfc_genl_send_se(struct sk_buff * msg,struct nfc_dev * dev,u32 portid,u32 seq,struct netlink_callback * cb,int flags)1205 static int nfc_genl_send_se(struct sk_buff *msg, struct nfc_dev *dev,
1206 				u32 portid, u32 seq,
1207 				struct netlink_callback *cb,
1208 				int flags)
1209 {
1210 	void *hdr;
1211 	struct nfc_se *se, *n;
1212 
1213 	list_for_each_entry_safe(se, n, &dev->secure_elements, list) {
1214 		hdr = genlmsg_put(msg, portid, seq, &nfc_genl_family, flags,
1215 				  NFC_CMD_GET_SE);
1216 		if (!hdr)
1217 			goto nla_put_failure;
1218 
1219 		if (cb)
1220 			genl_dump_check_consistent(cb, hdr, &nfc_genl_family);
1221 
1222 		if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) ||
1223 		    nla_put_u32(msg, NFC_ATTR_SE_INDEX, se->idx) ||
1224 		    nla_put_u8(msg, NFC_ATTR_SE_TYPE, se->type))
1225 			goto nla_put_failure;
1226 
1227 		if (genlmsg_end(msg, hdr) < 0)
1228 			goto nla_put_failure;
1229 	}
1230 
1231 	return 0;
1232 
1233 nla_put_failure:
1234 	genlmsg_cancel(msg, hdr);
1235 	return -EMSGSIZE;
1236 }
1237 
nfc_genl_dump_ses(struct sk_buff * skb,struct netlink_callback * cb)1238 static int nfc_genl_dump_ses(struct sk_buff *skb,
1239 				 struct netlink_callback *cb)
1240 {
1241 	struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0];
1242 	struct nfc_dev *dev = (struct nfc_dev *) cb->args[1];
1243 	bool first_call = false;
1244 
1245 	if (!iter) {
1246 		first_call = true;
1247 		iter = kmalloc(sizeof(struct class_dev_iter), GFP_KERNEL);
1248 		if (!iter)
1249 			return -ENOMEM;
1250 		cb->args[0] = (long) iter;
1251 	}
1252 
1253 	mutex_lock(&nfc_devlist_mutex);
1254 
1255 	cb->seq = nfc_devlist_generation;
1256 
1257 	if (first_call) {
1258 		nfc_device_iter_init(iter);
1259 		dev = nfc_device_iter_next(iter);
1260 	}
1261 
1262 	while (dev) {
1263 		int rc;
1264 
1265 		rc = nfc_genl_send_se(skb, dev, NETLINK_CB(cb->skb).portid,
1266 					  cb->nlh->nlmsg_seq, cb, NLM_F_MULTI);
1267 		if (rc < 0)
1268 			break;
1269 
1270 		dev = nfc_device_iter_next(iter);
1271 	}
1272 
1273 	mutex_unlock(&nfc_devlist_mutex);
1274 
1275 	cb->args[1] = (long) dev;
1276 
1277 	return skb->len;
1278 }
1279 
nfc_genl_dump_ses_done(struct netlink_callback * cb)1280 static int nfc_genl_dump_ses_done(struct netlink_callback *cb)
1281 {
1282 	struct class_dev_iter *iter = (struct class_dev_iter *) cb->args[0];
1283 
1284 	nfc_device_iter_exit(iter);
1285 	kfree(iter);
1286 
1287 	return 0;
1288 }
1289 
1290 struct se_io_ctx {
1291 	u32 dev_idx;
1292 	u32 se_idx;
1293 };
1294 
se_io_cb(void * context,u8 * apdu,size_t apdu_len,int err)1295 static void se_io_cb(void *context, u8 *apdu, size_t apdu_len, int err)
1296 {
1297 	struct se_io_ctx *ctx = context;
1298 	struct sk_buff *msg;
1299 	void *hdr;
1300 
1301 	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
1302 	if (!msg) {
1303 		kfree(ctx);
1304 		return;
1305 	}
1306 
1307 	hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0,
1308 			  NFC_CMD_SE_IO);
1309 	if (!hdr)
1310 		goto free_msg;
1311 
1312 	if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, ctx->dev_idx) ||
1313 	    nla_put_u32(msg, NFC_ATTR_SE_INDEX, ctx->se_idx) ||
1314 	    nla_put(msg, NFC_ATTR_SE_APDU, apdu_len, apdu))
1315 		goto nla_put_failure;
1316 
1317 	genlmsg_end(msg, hdr);
1318 
1319 	genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
1320 
1321 	kfree(ctx);
1322 
1323 	return;
1324 
1325 nla_put_failure:
1326 	genlmsg_cancel(msg, hdr);
1327 free_msg:
1328 	nlmsg_free(msg);
1329 	kfree(ctx);
1330 
1331 	return;
1332 }
1333 
nfc_genl_se_io(struct sk_buff * skb,struct genl_info * info)1334 static int nfc_genl_se_io(struct sk_buff *skb, struct genl_info *info)
1335 {
1336 	struct nfc_dev *dev;
1337 	struct se_io_ctx *ctx;
1338 	u32 dev_idx, se_idx;
1339 	u8 *apdu;
1340 	size_t apdu_len;
1341 
1342 	if (!info->attrs[NFC_ATTR_DEVICE_INDEX] ||
1343 	    !info->attrs[NFC_ATTR_SE_INDEX] ||
1344 	    !info->attrs[NFC_ATTR_SE_APDU])
1345 		return -EINVAL;
1346 
1347 	dev_idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]);
1348 	se_idx = nla_get_u32(info->attrs[NFC_ATTR_SE_INDEX]);
1349 
1350 	dev = nfc_get_device(dev_idx);
1351 	if (!dev)
1352 		return -ENODEV;
1353 
1354 	if (!dev->ops || !dev->ops->se_io)
1355 		return -ENOTSUPP;
1356 
1357 	apdu_len = nla_len(info->attrs[NFC_ATTR_SE_APDU]);
1358 	if (apdu_len == 0)
1359 		return -EINVAL;
1360 
1361 	apdu = nla_data(info->attrs[NFC_ATTR_SE_APDU]);
1362 	if (!apdu)
1363 		return -EINVAL;
1364 
1365 	ctx = kzalloc(sizeof(struct se_io_ctx), GFP_KERNEL);
1366 	if (!ctx)
1367 		return -ENOMEM;
1368 
1369 	ctx->dev_idx = dev_idx;
1370 	ctx->se_idx = se_idx;
1371 
1372 	return dev->ops->se_io(dev, se_idx, apdu, apdu_len, se_io_cb, ctx);
1373 }
1374 
1375 static const struct genl_ops nfc_genl_ops[] = {
1376 	{
1377 		.cmd = NFC_CMD_GET_DEVICE,
1378 		.doit = nfc_genl_get_device,
1379 		.dumpit = nfc_genl_dump_devices,
1380 		.done = nfc_genl_dump_devices_done,
1381 		.policy = nfc_genl_policy,
1382 	},
1383 	{
1384 		.cmd = NFC_CMD_DEV_UP,
1385 		.doit = nfc_genl_dev_up,
1386 		.policy = nfc_genl_policy,
1387 	},
1388 	{
1389 		.cmd = NFC_CMD_DEV_DOWN,
1390 		.doit = nfc_genl_dev_down,
1391 		.policy = nfc_genl_policy,
1392 	},
1393 	{
1394 		.cmd = NFC_CMD_START_POLL,
1395 		.doit = nfc_genl_start_poll,
1396 		.policy = nfc_genl_policy,
1397 	},
1398 	{
1399 		.cmd = NFC_CMD_STOP_POLL,
1400 		.doit = nfc_genl_stop_poll,
1401 		.policy = nfc_genl_policy,
1402 	},
1403 	{
1404 		.cmd = NFC_CMD_DEP_LINK_UP,
1405 		.doit = nfc_genl_dep_link_up,
1406 		.policy = nfc_genl_policy,
1407 	},
1408 	{
1409 		.cmd = NFC_CMD_DEP_LINK_DOWN,
1410 		.doit = nfc_genl_dep_link_down,
1411 		.policy = nfc_genl_policy,
1412 	},
1413 	{
1414 		.cmd = NFC_CMD_GET_TARGET,
1415 		.dumpit = nfc_genl_dump_targets,
1416 		.done = nfc_genl_dump_targets_done,
1417 		.policy = nfc_genl_policy,
1418 	},
1419 	{
1420 		.cmd = NFC_CMD_LLC_GET_PARAMS,
1421 		.doit = nfc_genl_llc_get_params,
1422 		.policy = nfc_genl_policy,
1423 	},
1424 	{
1425 		.cmd = NFC_CMD_LLC_SET_PARAMS,
1426 		.doit = nfc_genl_llc_set_params,
1427 		.policy = nfc_genl_policy,
1428 	},
1429 	{
1430 		.cmd = NFC_CMD_LLC_SDREQ,
1431 		.doit = nfc_genl_llc_sdreq,
1432 		.policy = nfc_genl_policy,
1433 	},
1434 	{
1435 		.cmd = NFC_CMD_FW_DOWNLOAD,
1436 		.doit = nfc_genl_fw_download,
1437 		.policy = nfc_genl_policy,
1438 	},
1439 	{
1440 		.cmd = NFC_CMD_ENABLE_SE,
1441 		.doit = nfc_genl_enable_se,
1442 		.policy = nfc_genl_policy,
1443 	},
1444 	{
1445 		.cmd = NFC_CMD_DISABLE_SE,
1446 		.doit = nfc_genl_disable_se,
1447 		.policy = nfc_genl_policy,
1448 	},
1449 	{
1450 		.cmd = NFC_CMD_GET_SE,
1451 		.dumpit = nfc_genl_dump_ses,
1452 		.done = nfc_genl_dump_ses_done,
1453 		.policy = nfc_genl_policy,
1454 	},
1455 	{
1456 		.cmd = NFC_CMD_SE_IO,
1457 		.doit = nfc_genl_se_io,
1458 		.policy = nfc_genl_policy,
1459 	},
1460 };
1461 
1462 
1463 struct urelease_work {
1464 	struct	work_struct w;
1465 	int	portid;
1466 };
1467 
nfc_urelease_event_work(struct work_struct * work)1468 static void nfc_urelease_event_work(struct work_struct *work)
1469 {
1470 	struct urelease_work *w = container_of(work, struct urelease_work, w);
1471 	struct class_dev_iter iter;
1472 	struct nfc_dev *dev;
1473 
1474 	pr_debug("portid %d\n", w->portid);
1475 
1476 	mutex_lock(&nfc_devlist_mutex);
1477 
1478 	nfc_device_iter_init(&iter);
1479 	dev = nfc_device_iter_next(&iter);
1480 
1481 	while (dev) {
1482 		mutex_lock(&dev->genl_data.genl_data_mutex);
1483 
1484 		if (dev->genl_data.poll_req_portid == w->portid) {
1485 			nfc_stop_poll(dev);
1486 			dev->genl_data.poll_req_portid = 0;
1487 		}
1488 
1489 		mutex_unlock(&dev->genl_data.genl_data_mutex);
1490 
1491 		dev = nfc_device_iter_next(&iter);
1492 	}
1493 
1494 	nfc_device_iter_exit(&iter);
1495 
1496 	mutex_unlock(&nfc_devlist_mutex);
1497 
1498 	kfree(w);
1499 }
1500 
nfc_genl_rcv_nl_event(struct notifier_block * this,unsigned long event,void * ptr)1501 static int nfc_genl_rcv_nl_event(struct notifier_block *this,
1502 				 unsigned long event, void *ptr)
1503 {
1504 	struct netlink_notify *n = ptr;
1505 	struct urelease_work *w;
1506 
1507 	if (event != NETLINK_URELEASE || n->protocol != NETLINK_GENERIC)
1508 		goto out;
1509 
1510 	pr_debug("NETLINK_URELEASE event from id %d\n", n->portid);
1511 
1512 	w = kmalloc(sizeof(*w), GFP_ATOMIC);
1513 	if (w) {
1514 		INIT_WORK((struct work_struct *) w, nfc_urelease_event_work);
1515 		w->portid = n->portid;
1516 		schedule_work((struct work_struct *) w);
1517 	}
1518 
1519 out:
1520 	return NOTIFY_DONE;
1521 }
1522 
nfc_genl_data_init(struct nfc_genl_data * genl_data)1523 void nfc_genl_data_init(struct nfc_genl_data *genl_data)
1524 {
1525 	genl_data->poll_req_portid = 0;
1526 	mutex_init(&genl_data->genl_data_mutex);
1527 }
1528 
nfc_genl_data_exit(struct nfc_genl_data * genl_data)1529 void nfc_genl_data_exit(struct nfc_genl_data *genl_data)
1530 {
1531 	mutex_destroy(&genl_data->genl_data_mutex);
1532 }
1533 
1534 static struct notifier_block nl_notifier = {
1535 	.notifier_call  = nfc_genl_rcv_nl_event,
1536 };
1537 
1538 /**
1539  * nfc_genl_init() - Initialize netlink interface
1540  *
1541  * This initialization function registers the nfc netlink family.
1542  */
nfc_genl_init(void)1543 int __init nfc_genl_init(void)
1544 {
1545 	int rc;
1546 
1547 	rc = genl_register_family_with_ops_groups(&nfc_genl_family,
1548 						  nfc_genl_ops,
1549 						  nfc_genl_mcgrps);
1550 	if (rc)
1551 		return rc;
1552 
1553 	netlink_register_notifier(&nl_notifier);
1554 
1555 	return 0;
1556 }
1557 
1558 /**
1559  * nfc_genl_exit() - Deinitialize netlink interface
1560  *
1561  * This exit function unregisters the nfc netlink family.
1562  */
nfc_genl_exit(void)1563 void nfc_genl_exit(void)
1564 {
1565 	netlink_unregister_notifier(&nl_notifier);
1566 	genl_unregister_family(&nfc_genl_family);
1567 }
1568