diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2013-05-10 09:47:37 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2013-06-14 07:44:59 -0400 |
commit | 2757c3723c3d2b13e3a8bfaa034826f64e9cca43 (patch) | |
tree | 05a2c978fc9edbc973f1f6b55afbddf6ccb79f55 /net/nfc/netlink.c | |
parent | fed7c25ec0d4894edfc36bbe5c5231e52f45483a (diff) |
NFC: Send netlink events for secure elements additions and removals
When an NFC driver or host controller stack discovers a secure element,
it will call nfc_add_se(). In order for userspace applications to use
these secure elements, a netlink event will then be sent with the SE
index and its type. With that information userspace applications can
decide wether or not to enable SEs, through their indexes.
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'net/nfc/netlink.c')
-rw-r--r-- | net/nfc/netlink.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c index fdbc662c564a..8a11a3a27e69 100644 --- a/net/nfc/netlink.c +++ b/net/nfc/netlink.c | |||
@@ -426,6 +426,69 @@ free_msg: | |||
426 | return rc; | 426 | return rc; |
427 | } | 427 | } |
428 | 428 | ||
429 | int nfc_genl_se_added(struct nfc_dev *dev, u32 se_idx, u16 type) | ||
430 | { | ||
431 | struct sk_buff *msg; | ||
432 | void *hdr; | ||
433 | |||
434 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | ||
435 | if (!msg) | ||
436 | return -ENOMEM; | ||
437 | |||
438 | hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0, | ||
439 | NFC_EVENT_SE_ADDED); | ||
440 | if (!hdr) | ||
441 | goto free_msg; | ||
442 | |||
443 | if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) || | ||
444 | nla_put_u32(msg, NFC_ATTR_SE_INDEX, se_idx) || | ||
445 | nla_put_u8(msg, NFC_ATTR_SE_TYPE, type)) | ||
446 | goto nla_put_failure; | ||
447 | |||
448 | genlmsg_end(msg, hdr); | ||
449 | |||
450 | genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_KERNEL); | ||
451 | |||
452 | return 0; | ||
453 | |||
454 | nla_put_failure: | ||
455 | genlmsg_cancel(msg, hdr); | ||
456 | free_msg: | ||
457 | nlmsg_free(msg); | ||
458 | return -EMSGSIZE; | ||
459 | } | ||
460 | |||
461 | int nfc_genl_se_removed(struct nfc_dev *dev, u32 se_idx) | ||
462 | { | ||
463 | struct sk_buff *msg; | ||
464 | void *hdr; | ||
465 | |||
466 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | ||
467 | if (!msg) | ||
468 | return -ENOMEM; | ||
469 | |||
470 | hdr = genlmsg_put(msg, 0, 0, &nfc_genl_family, 0, | ||
471 | NFC_EVENT_SE_REMOVED); | ||
472 | if (!hdr) | ||
473 | goto free_msg; | ||
474 | |||
475 | if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx) || | ||
476 | nla_put_u32(msg, NFC_ATTR_SE_INDEX, se_idx)) | ||
477 | goto nla_put_failure; | ||
478 | |||
479 | genlmsg_end(msg, hdr); | ||
480 | |||
481 | genlmsg_multicast(msg, 0, nfc_genl_event_mcgrp.id, GFP_KERNEL); | ||
482 | |||
483 | return 0; | ||
484 | |||
485 | nla_put_failure: | ||
486 | genlmsg_cancel(msg, hdr); | ||
487 | free_msg: | ||
488 | nlmsg_free(msg); | ||
489 | return -EMSGSIZE; | ||
490 | } | ||
491 | |||
429 | static int nfc_genl_send_device(struct sk_buff *msg, struct nfc_dev *dev, | 492 | static int nfc_genl_send_device(struct sk_buff *msg, struct nfc_dev *dev, |
430 | u32 portid, u32 seq, | 493 | u32 portid, u32 seq, |
431 | struct netlink_callback *cb, | 494 | struct netlink_callback *cb, |