Lines Matching refs:sec

33 void mac802154_llsec_init(struct mac802154_llsec *sec)  in mac802154_llsec_init()  argument
35 memset(sec, 0, sizeof(*sec)); in mac802154_llsec_init()
37 memset(&sec->params.default_key_source, 0xFF, IEEE802154_ADDR_LEN); in mac802154_llsec_init()
39 INIT_LIST_HEAD(&sec->table.security_levels); in mac802154_llsec_init()
40 INIT_LIST_HEAD(&sec->table.devices); in mac802154_llsec_init()
41 INIT_LIST_HEAD(&sec->table.keys); in mac802154_llsec_init()
42 hash_init(sec->devices_short); in mac802154_llsec_init()
43 hash_init(sec->devices_hw); in mac802154_llsec_init()
44 rwlock_init(&sec->lock); in mac802154_llsec_init()
47 void mac802154_llsec_destroy(struct mac802154_llsec *sec) in mac802154_llsec_destroy() argument
53 list_for_each_entry_safe(sl, sn, &sec->table.security_levels, list) { in mac802154_llsec_destroy()
61 list_for_each_entry_safe(dev, dn, &sec->table.devices, list) { in mac802154_llsec_destroy()
69 list_for_each_entry_safe(key, kn, &sec->table.keys, list) { in mac802154_llsec_destroy()
79 int mac802154_llsec_get_params(struct mac802154_llsec *sec, in mac802154_llsec_get_params() argument
82 read_lock_bh(&sec->lock); in mac802154_llsec_get_params()
83 *params = sec->params; in mac802154_llsec_get_params()
84 read_unlock_bh(&sec->lock); in mac802154_llsec_get_params()
89 int mac802154_llsec_set_params(struct mac802154_llsec *sec, in mac802154_llsec_set_params() argument
93 write_lock_bh(&sec->lock); in mac802154_llsec_set_params()
96 sec->params.enabled = params->enabled; in mac802154_llsec_set_params()
98 sec->params.frame_counter = params->frame_counter; in mac802154_llsec_set_params()
100 sec->params.out_level = params->out_level; in mac802154_llsec_set_params()
102 sec->params.out_key = params->out_key; in mac802154_llsec_set_params()
104 sec->params.default_key_source = params->default_key_source; in mac802154_llsec_set_params()
106 sec->params.pan_id = params->pan_id; in mac802154_llsec_set_params()
108 sec->params.hwaddr = params->hwaddr; in mac802154_llsec_set_params()
110 sec->params.coord_hwaddr = params->coord_hwaddr; in mac802154_llsec_set_params()
112 sec->params.coord_shortaddr = params->coord_shortaddr; in mac802154_llsec_set_params()
114 write_unlock_bh(&sec->lock); in mac802154_llsec_set_params()
218 int mac802154_llsec_key_add(struct mac802154_llsec *sec, in mac802154_llsec_key_add() argument
229 list_for_each_entry(pos, &sec->table.keys, list) { in mac802154_llsec_key_add()
265 list_add_rcu(&new->list, &sec->table.keys); in mac802154_llsec_key_add()
274 int mac802154_llsec_key_del(struct mac802154_llsec *sec, in mac802154_llsec_key_del() argument
279 list_for_each_entry(pos, &sec->table.keys, list) { in mac802154_llsec_key_del()
311 llsec_dev_find_short(struct mac802154_llsec *sec, __le16 short_addr, in llsec_dev_find_short() argument
317 hash_for_each_possible_rcu(sec->devices_short, dev, bucket_s, key) { in llsec_dev_find_short()
327 llsec_dev_find_long(struct mac802154_llsec *sec, __le64 hwaddr) in llsec_dev_find_long() argument
332 hash_for_each_possible_rcu(sec->devices_hw, dev, bucket_hw, key) { in llsec_dev_find_long()
356 int mac802154_llsec_dev_add(struct mac802154_llsec *sec, in mac802154_llsec_dev_add() argument
366 llsec_dev_find_short(sec, dev->short_addr, dev->pan_id)) || in mac802154_llsec_dev_add()
367 llsec_dev_find_long(sec, dev->hwaddr)) in mac802154_llsec_dev_add()
379 hash_add_rcu(sec->devices_short, &entry->bucket_s, skey); in mac802154_llsec_dev_add()
383 hash_add_rcu(sec->devices_hw, &entry->bucket_hw, hwkey); in mac802154_llsec_dev_add()
384 list_add_tail_rcu(&entry->dev.list, &sec->table.devices); in mac802154_llsec_dev_add()
394 int mac802154_llsec_dev_del(struct mac802154_llsec *sec, __le64 device_addr) in mac802154_llsec_dev_del() argument
398 pos = llsec_dev_find_long(sec, device_addr); in mac802154_llsec_dev_del()
427 int mac802154_llsec_devkey_add(struct mac802154_llsec *sec, in mac802154_llsec_devkey_add() argument
434 dev = llsec_dev_find_long(sec, dev_addr); in mac802154_llsec_devkey_add()
451 int mac802154_llsec_devkey_del(struct mac802154_llsec *sec, in mac802154_llsec_devkey_del() argument
458 dev = llsec_dev_find_long(sec, dev_addr); in mac802154_llsec_devkey_del()
473 llsec_find_seclevel(const struct mac802154_llsec *sec, in llsec_find_seclevel() argument
478 list_for_each_entry(pos, &sec->table.security_levels, list) { in llsec_find_seclevel()
493 int mac802154_llsec_seclevel_add(struct mac802154_llsec *sec, in mac802154_llsec_seclevel_add() argument
498 if (llsec_find_seclevel(sec, sl)) in mac802154_llsec_seclevel_add()
507 list_add_tail_rcu(&entry->level.list, &sec->table.security_levels); in mac802154_llsec_seclevel_add()
512 int mac802154_llsec_seclevel_del(struct mac802154_llsec *sec, in mac802154_llsec_seclevel_del() argument
517 pos = llsec_find_seclevel(sec, sl); in mac802154_llsec_seclevel_del()
527 static int llsec_recover_addr(struct mac802154_llsec *sec, in llsec_recover_addr() argument
530 __le16 caddr = sec->params.coord_shortaddr; in llsec_recover_addr()
532 addr->pan_id = sec->params.pan_id; in llsec_recover_addr()
537 addr->extended_addr = sec->params.coord_hwaddr; in llsec_recover_addr()
540 addr->short_addr = sec->params.coord_shortaddr; in llsec_recover_addr()
548 llsec_lookup_key(struct mac802154_llsec *sec, in llsec_lookup_key() argument
554 u8 key_id_mode = hdr->sec.key_id_mode; in llsec_lookup_key()
561 devaddr.extended_addr = sec->params.coord_hwaddr; in llsec_lookup_key()
563 } else if (llsec_recover_addr(sec, &devaddr) < 0) { in llsec_lookup_key()
568 list_for_each_entry_rcu(key_entry, &sec->table.keys, list) { in llsec_lookup_key()
581 if (id->id != hdr->sec.key_id) in llsec_lookup_key()
586 id->short_source == hdr->sec.short_src) || in llsec_lookup_key()
588 id->extended_source == hdr->sec.extended_src)) in llsec_lookup_key()
603 const struct ieee802154_sechdr *sec) in llsec_geniv() argument
606 __be32 frame_counter = (__force __be32) swab32((__force u32) sec->frame_counter); in llsec_geniv()
611 iv[13] = sec->level; in llsec_geniv()
617 llsec_do_encrypt_unauth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_encrypt_unauth() argument
629 llsec_geniv(iv, sec->params.hwaddr, &hdr->sec); in llsec_do_encrypt_unauth()
647 llsec_do_encrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_encrypt_auth() argument
657 authlen = ieee802154_sechdr_authtag_len(&hdr->sec); in llsec_do_encrypt_auth()
658 llsec_geniv(iv, sec->params.hwaddr, &hdr->sec); in llsec_do_encrypt_auth()
673 if (!(hdr->sec.level & IEEE802154_SCF_SECLEVEL_ENC)) { in llsec_do_encrypt_auth()
690 const struct mac802154_llsec *sec, in llsec_do_encrypt() argument
694 if (hdr->sec.level == IEEE802154_SCF_SECLEVEL_ENC) in llsec_do_encrypt()
695 return llsec_do_encrypt_unauth(skb, sec, hdr, key); in llsec_do_encrypt()
697 return llsec_do_encrypt_auth(skb, sec, hdr, key); in llsec_do_encrypt()
700 int mac802154_llsec_encrypt(struct mac802154_llsec *sec, struct sk_buff *skb) in mac802154_llsec_encrypt() argument
712 if (!hdr.fc.security_enabled || hdr.sec.level == 0) { in mac802154_llsec_encrypt()
717 authlen = ieee802154_sechdr_authtag_len(&hdr.sec); in mac802154_llsec_encrypt()
724 read_lock_bh(&sec->lock); in mac802154_llsec_encrypt()
726 if (!sec->params.enabled) { in mac802154_llsec_encrypt()
731 key = llsec_lookup_key(sec, &hdr, &hdr.dest, NULL); in mac802154_llsec_encrypt()
737 read_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
739 write_lock_bh(&sec->lock); in mac802154_llsec_encrypt()
741 frame_ctr = be32_to_cpu(sec->params.frame_counter); in mac802154_llsec_encrypt()
742 hdr.sec.frame_counter = cpu_to_le32(frame_ctr); in mac802154_llsec_encrypt()
744 write_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
750 sec->params.frame_counter = cpu_to_be32(frame_ctr + 1); in mac802154_llsec_encrypt()
752 write_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
759 rc = llsec_do_encrypt(skb, sec, &hdr, key); in mac802154_llsec_encrypt()
765 read_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
772 llsec_lookup_dev(struct mac802154_llsec *sec, in llsec_lookup_dev() argument
779 llsec_recover_addr(sec, &devaddr) < 0) in llsec_lookup_dev()
786 hash_for_each_possible_rcu(sec->devices_short, dev, in llsec_lookup_dev()
795 hash_for_each_possible_rcu(sec->devices_hw, dev, in llsec_lookup_dev()
806 llsec_lookup_seclevel(const struct mac802154_llsec *sec, in llsec_lookup_seclevel() argument
812 list_for_each_entry_rcu(level, &sec->table.security_levels, list) { in llsec_lookup_seclevel()
825 llsec_do_decrypt_unauth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_decrypt_unauth() argument
839 llsec_geniv(iv, dev_addr, &hdr->sec); in llsec_do_decrypt_unauth()
849 llsec_do_decrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_decrypt_auth() argument
859 authlen = ieee802154_sechdr_authtag_len(&hdr->sec); in llsec_do_decrypt_auth()
860 llsec_geniv(iv, dev_addr, &hdr->sec); in llsec_do_decrypt_auth()
873 if (!(hdr->sec.level & IEEE802154_SCF_SECLEVEL_ENC)) { in llsec_do_decrypt_auth()
891 llsec_do_decrypt(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_decrypt() argument
895 if (hdr->sec.level == IEEE802154_SCF_SECLEVEL_ENC) in llsec_do_decrypt()
896 return llsec_do_decrypt_unauth(skb, sec, hdr, key, dev_addr); in llsec_do_decrypt()
898 return llsec_do_decrypt_auth(skb, sec, hdr, key, dev_addr); in llsec_do_decrypt()
970 int mac802154_llsec_decrypt(struct mac802154_llsec *sec, struct sk_buff *skb) in mac802154_llsec_decrypt() argument
988 read_lock_bh(&sec->lock); in mac802154_llsec_decrypt()
989 if (!sec->params.enabled) { in mac802154_llsec_decrypt()
990 read_unlock_bh(&sec->lock); in mac802154_llsec_decrypt()
993 read_unlock_bh(&sec->lock); in mac802154_llsec_decrypt()
997 key = llsec_lookup_key(sec, &hdr, &hdr.source, &key_id); in mac802154_llsec_decrypt()
1003 dev = llsec_lookup_dev(sec, &hdr.source); in mac802154_llsec_decrypt()
1009 if (llsec_lookup_seclevel(sec, hdr.fc.type, 0, &seclevel) < 0) { in mac802154_llsec_decrypt()
1014 if (!(seclevel.sec_levels & BIT(hdr.sec.level)) && in mac802154_llsec_decrypt()
1015 (hdr.sec.level == 0 && seclevel.device_override && in mac802154_llsec_decrypt()
1021 frame_ctr = le32_to_cpu(hdr.sec.frame_counter); in mac802154_llsec_decrypt()
1036 err = llsec_do_decrypt(skb, sec, &hdr, key, dev_addr); in mac802154_llsec_decrypt()