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