X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=src%2Frfid_proto_mifare_ul.c;h=7243c89eb1ee4b24194f92fcba6f173fc4912591;hb=da107e125605438c7cf739ad34bb6204b3d4b85e;hp=0ea55d2671881a562ec0211077a8dc8e51f04d6e;hpb=e404cccecd20a2418c2429cd182c18218e54bd28;p=librfid diff --git a/src/rfid_proto_mifare_ul.c b/src/rfid_proto_mifare_ul.c index 0ea55d2..7243c89 100644 --- a/src/rfid_proto_mifare_ul.c +++ b/src/rfid_proto_mifare_ul.c @@ -108,10 +108,45 @@ mful_transceive(struct rfid_protocol_handle *ph, return -EINVAL; } +static int +mful_getopt(struct rfid_protocol_handle *ph, int optname, void *optval, + unsigned int *optlen) +{ + int ret = -EINVAL; + u_int16_t atqa; + unsigned int *size = optval; + + switch (optname) { + case RFID_OPT_PROTO_SIZE: + ret = 0; + *size = 512; + break; + } + + return ret; +} + + static struct rfid_protocol_handle * mful_init(struct rfid_layer2_handle *l2h) { struct rfid_protocol_handle *ph; + u_int16_t atqa; + unsigned int atqa_len = sizeof(atqa); + + if (l2h->l2->id != RFID_LAYER2_ISO14443A) + return NULL; + + /* According to "Type Identification Procedure Rev. 1.3" */ + rfid_layer2_getopt(l2h, RFID_OPT_14443A_ATQA, + &atqa, &atqa_len); + if (atqa != 0x0044) + return NULL; + + /* according to "Functional Specification Rev. 3.0 */ + if (l2h->uid_len != 7) + return NULL; + ph = malloc_protocol_handle(sizeof(struct rfid_protocol_handle)); return ph; } @@ -130,6 +165,7 @@ const struct rfid_protocol rfid_protocol_mful = { .read = &mful_read, .write = &mful_write, .fini = &mful_fini, + .getopt = &mful_getopt, }, };