Lines Matching refs:sec

27 void mac802154_llsec_init(struct mac802154_llsec *sec)  in mac802154_llsec_init()  argument
29 memset(sec, 0, sizeof(*sec)); in mac802154_llsec_init()
31 memset(&sec->params.default_key_source, 0xFF, IEEE802154_ADDR_LEN); in mac802154_llsec_init()
33 INIT_LIST_HEAD(&sec->table.security_levels); in mac802154_llsec_init()
34 INIT_LIST_HEAD(&sec->table.devices); in mac802154_llsec_init()
35 INIT_LIST_HEAD(&sec->table.keys); in mac802154_llsec_init()
36 hash_init(sec->devices_short); in mac802154_llsec_init()
37 hash_init(sec->devices_hw); in mac802154_llsec_init()
38 rwlock_init(&sec->lock); in mac802154_llsec_init()
41 void mac802154_llsec_destroy(struct mac802154_llsec *sec) in mac802154_llsec_destroy() argument
47 list_for_each_entry_safe(sl, sn, &sec->table.security_levels, list) { in mac802154_llsec_destroy()
55 list_for_each_entry_safe(dev, dn, &sec->table.devices, list) { in mac802154_llsec_destroy()
63 list_for_each_entry_safe(key, kn, &sec->table.keys, list) { in mac802154_llsec_destroy()
73 int mac802154_llsec_get_params(struct mac802154_llsec *sec, in mac802154_llsec_get_params() argument
76 read_lock_bh(&sec->lock); in mac802154_llsec_get_params()
77 *params = sec->params; in mac802154_llsec_get_params()
78 read_unlock_bh(&sec->lock); in mac802154_llsec_get_params()
83 int mac802154_llsec_set_params(struct mac802154_llsec *sec, in mac802154_llsec_set_params() argument
87 write_lock_bh(&sec->lock); in mac802154_llsec_set_params()
90 sec->params.enabled = params->enabled; in mac802154_llsec_set_params()
92 sec->params.frame_counter = params->frame_counter; in mac802154_llsec_set_params()
94 sec->params.out_level = params->out_level; in mac802154_llsec_set_params()
96 sec->params.out_key = params->out_key; in mac802154_llsec_set_params()
98 sec->params.default_key_source = params->default_key_source; in mac802154_llsec_set_params()
100 sec->params.pan_id = params->pan_id; in mac802154_llsec_set_params()
102 sec->params.hwaddr = params->hwaddr; in mac802154_llsec_set_params()
104 sec->params.coord_hwaddr = params->coord_hwaddr; in mac802154_llsec_set_params()
106 sec->params.coord_shortaddr = params->coord_shortaddr; in mac802154_llsec_set_params()
108 write_unlock_bh(&sec->lock); in mac802154_llsec_set_params()
212 int mac802154_llsec_key_add(struct mac802154_llsec *sec, in mac802154_llsec_key_add() argument
223 list_for_each_entry(pos, &sec->table.keys, list) { in mac802154_llsec_key_add()
259 list_add_rcu(&new->list, &sec->table.keys); in mac802154_llsec_key_add()
268 int mac802154_llsec_key_del(struct mac802154_llsec *sec, in mac802154_llsec_key_del() argument
273 list_for_each_entry(pos, &sec->table.keys, list) { in mac802154_llsec_key_del()
305 llsec_dev_find_short(struct mac802154_llsec *sec, __le16 short_addr, in llsec_dev_find_short() argument
311 hash_for_each_possible_rcu(sec->devices_short, dev, bucket_s, key) { in llsec_dev_find_short()
321 llsec_dev_find_long(struct mac802154_llsec *sec, __le64 hwaddr) in llsec_dev_find_long() argument
326 hash_for_each_possible_rcu(sec->devices_hw, dev, bucket_hw, key) { in llsec_dev_find_long()
350 int mac802154_llsec_dev_add(struct mac802154_llsec *sec, in mac802154_llsec_dev_add() argument
360 llsec_dev_find_short(sec, dev->short_addr, dev->pan_id)) || in mac802154_llsec_dev_add()
361 llsec_dev_find_long(sec, dev->hwaddr)) in mac802154_llsec_dev_add()
373 hash_add_rcu(sec->devices_short, &entry->bucket_s, skey); in mac802154_llsec_dev_add()
377 hash_add_rcu(sec->devices_hw, &entry->bucket_hw, hwkey); in mac802154_llsec_dev_add()
378 list_add_tail_rcu(&entry->dev.list, &sec->table.devices); in mac802154_llsec_dev_add()
388 int mac802154_llsec_dev_del(struct mac802154_llsec *sec, __le64 device_addr) in mac802154_llsec_dev_del() argument
392 pos = llsec_dev_find_long(sec, device_addr); in mac802154_llsec_dev_del()
421 int mac802154_llsec_devkey_add(struct mac802154_llsec *sec, in mac802154_llsec_devkey_add() argument
428 dev = llsec_dev_find_long(sec, dev_addr); in mac802154_llsec_devkey_add()
445 int mac802154_llsec_devkey_del(struct mac802154_llsec *sec, in mac802154_llsec_devkey_del() argument
452 dev = llsec_dev_find_long(sec, dev_addr); in mac802154_llsec_devkey_del()
467 llsec_find_seclevel(const struct mac802154_llsec *sec, in llsec_find_seclevel() argument
472 list_for_each_entry(pos, &sec->table.security_levels, list) { in llsec_find_seclevel()
487 int mac802154_llsec_seclevel_add(struct mac802154_llsec *sec, in mac802154_llsec_seclevel_add() argument
492 if (llsec_find_seclevel(sec, sl)) in mac802154_llsec_seclevel_add()
501 list_add_tail_rcu(&entry->level.list, &sec->table.security_levels); in mac802154_llsec_seclevel_add()
506 int mac802154_llsec_seclevel_del(struct mac802154_llsec *sec, in mac802154_llsec_seclevel_del() argument
511 pos = llsec_find_seclevel(sec, sl); in mac802154_llsec_seclevel_del()
521 static int llsec_recover_addr(struct mac802154_llsec *sec, in llsec_recover_addr() argument
524 __le16 caddr = sec->params.coord_shortaddr; in llsec_recover_addr()
526 addr->pan_id = sec->params.pan_id; in llsec_recover_addr()
531 addr->extended_addr = sec->params.coord_hwaddr; in llsec_recover_addr()
534 addr->short_addr = sec->params.coord_shortaddr; in llsec_recover_addr()
542 llsec_lookup_key(struct mac802154_llsec *sec, in llsec_lookup_key() argument
548 u8 key_id_mode = hdr->sec.key_id_mode; in llsec_lookup_key()
555 devaddr.extended_addr = sec->params.coord_hwaddr; in llsec_lookup_key()
557 } else if (llsec_recover_addr(sec, &devaddr) < 0) { in llsec_lookup_key()
562 list_for_each_entry_rcu(key_entry, &sec->table.keys, list) { in llsec_lookup_key()
575 if (id->id != hdr->sec.key_id) in llsec_lookup_key()
580 id->short_source == hdr->sec.short_src) || in llsec_lookup_key()
582 id->extended_source == hdr->sec.extended_src)) in llsec_lookup_key()
597 const struct ieee802154_sechdr *sec) in llsec_geniv() argument
600 __be32 frame_counter = (__force __be32) swab32((__force u32) sec->frame_counter); in llsec_geniv()
605 iv[13] = sec->level; in llsec_geniv()
611 llsec_do_encrypt_unauth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_encrypt_unauth() argument
621 llsec_geniv(iv, sec->params.hwaddr, &hdr->sec); in llsec_do_encrypt_unauth()
648 llsec_do_encrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_encrypt_auth() argument
658 authlen = ieee802154_sechdr_authtag_len(&hdr->sec); in llsec_do_encrypt_auth()
659 llsec_geniv(iv, sec->params.hwaddr, &hdr->sec); in llsec_do_encrypt_auth()
674 if (!(hdr->sec.level & IEEE802154_SCF_SECLEVEL_ENC)) { in llsec_do_encrypt_auth()
691 const struct mac802154_llsec *sec, in llsec_do_encrypt() argument
695 if (hdr->sec.level == IEEE802154_SCF_SECLEVEL_ENC) in llsec_do_encrypt()
696 return llsec_do_encrypt_unauth(skb, sec, hdr, key); in llsec_do_encrypt()
698 return llsec_do_encrypt_auth(skb, sec, hdr, key); in llsec_do_encrypt()
701 int mac802154_llsec_encrypt(struct mac802154_llsec *sec, struct sk_buff *skb) in mac802154_llsec_encrypt() argument
717 (hdr.sec.level == IEEE802154_SCF_SECLEVEL_NONE)) { in mac802154_llsec_encrypt()
722 authlen = ieee802154_sechdr_authtag_len(&hdr.sec); in mac802154_llsec_encrypt()
729 read_lock_bh(&sec->lock); in mac802154_llsec_encrypt()
731 if (!sec->params.enabled) { in mac802154_llsec_encrypt()
736 key = llsec_lookup_key(sec, &hdr, &hdr.dest, NULL); in mac802154_llsec_encrypt()
742 read_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
744 write_lock_bh(&sec->lock); in mac802154_llsec_encrypt()
746 frame_ctr = be32_to_cpu(sec->params.frame_counter); in mac802154_llsec_encrypt()
747 hdr.sec.frame_counter = cpu_to_le32(frame_ctr); in mac802154_llsec_encrypt()
749 write_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
755 sec->params.frame_counter = cpu_to_be32(frame_ctr + 1); in mac802154_llsec_encrypt()
757 write_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
764 rc = llsec_do_encrypt(skb, sec, &hdr, key); in mac802154_llsec_encrypt()
770 read_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
777 llsec_lookup_dev(struct mac802154_llsec *sec, in llsec_lookup_dev() argument
784 llsec_recover_addr(sec, &devaddr) < 0) in llsec_lookup_dev()
791 hash_for_each_possible_rcu(sec->devices_short, dev, in llsec_lookup_dev()
800 hash_for_each_possible_rcu(sec->devices_hw, dev, in llsec_lookup_dev()
811 llsec_lookup_seclevel(const struct mac802154_llsec *sec, in llsec_lookup_seclevel() argument
817 list_for_each_entry_rcu(level, &sec->table.security_levels, list) { in llsec_lookup_seclevel()
830 llsec_do_decrypt_unauth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_decrypt_unauth() argument
841 llsec_geniv(iv, dev_addr, &hdr->sec); in llsec_do_decrypt_unauth()
857 llsec_do_decrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_decrypt_auth() argument
867 authlen = ieee802154_sechdr_authtag_len(&hdr->sec); in llsec_do_decrypt_auth()
868 llsec_geniv(iv, dev_addr, &hdr->sec); in llsec_do_decrypt_auth()
881 if (!(hdr->sec.level & IEEE802154_SCF_SECLEVEL_ENC)) { in llsec_do_decrypt_auth()
899 llsec_do_decrypt(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_decrypt() argument
903 if (hdr->sec.level == IEEE802154_SCF_SECLEVEL_ENC) in llsec_do_decrypt()
904 return llsec_do_decrypt_unauth(skb, sec, hdr, key, dev_addr); in llsec_do_decrypt()
906 return llsec_do_decrypt_auth(skb, sec, hdr, key, dev_addr); in llsec_do_decrypt()
978 int mac802154_llsec_decrypt(struct mac802154_llsec *sec, struct sk_buff *skb) in mac802154_llsec_decrypt() argument
996 read_lock_bh(&sec->lock); in mac802154_llsec_decrypt()
997 if (!sec->params.enabled) { in mac802154_llsec_decrypt()
998 read_unlock_bh(&sec->lock); in mac802154_llsec_decrypt()
1001 read_unlock_bh(&sec->lock); in mac802154_llsec_decrypt()
1005 key = llsec_lookup_key(sec, &hdr, &hdr.source, &key_id); in mac802154_llsec_decrypt()
1011 dev = llsec_lookup_dev(sec, &hdr.source); in mac802154_llsec_decrypt()
1017 if (llsec_lookup_seclevel(sec, hdr.fc.type, 0, &seclevel) < 0) { in mac802154_llsec_decrypt()
1022 if (!(seclevel.sec_levels & BIT(hdr.sec.level)) && in mac802154_llsec_decrypt()
1023 (hdr.sec.level == 0 && seclevel.device_override && in mac802154_llsec_decrypt()
1029 frame_ctr = le32_to_cpu(hdr.sec.frame_counter); in mac802154_llsec_decrypt()
1044 err = llsec_do_decrypt(skb, sec, &hdr, key, dev_addr); in mac802154_llsec_decrypt()