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()
280 int mac802154_llsec_key_del(struct mac802154_llsec *sec, in mac802154_llsec_key_del() argument
285 list_for_each_entry(pos, &sec->table.keys, list) { in mac802154_llsec_key_del()
313 llsec_dev_find_short(struct mac802154_llsec *sec, __le16 short_addr, in llsec_dev_find_short() argument
319 hash_for_each_possible_rcu(sec->devices_short, dev, bucket_s, key) { in llsec_dev_find_short()
329 llsec_dev_find_long(struct mac802154_llsec *sec, __le64 hwaddr) in llsec_dev_find_long() argument
334 hash_for_each_possible_rcu(sec->devices_hw, dev, bucket_hw, key) { in llsec_dev_find_long()
358 int mac802154_llsec_dev_add(struct mac802154_llsec *sec, in mac802154_llsec_dev_add() argument
368 llsec_dev_find_short(sec, dev->short_addr, dev->pan_id)) || in mac802154_llsec_dev_add()
369 llsec_dev_find_long(sec, dev->hwaddr)) in mac802154_llsec_dev_add()
381 hash_add_rcu(sec->devices_short, &entry->bucket_s, skey); in mac802154_llsec_dev_add()
385 hash_add_rcu(sec->devices_hw, &entry->bucket_hw, hwkey); in mac802154_llsec_dev_add()
386 list_add_tail_rcu(&entry->dev.list, &sec->table.devices); in mac802154_llsec_dev_add()
396 int mac802154_llsec_dev_del(struct mac802154_llsec *sec, __le64 device_addr) in mac802154_llsec_dev_del() argument
400 pos = llsec_dev_find_long(sec, device_addr); in mac802154_llsec_dev_del()
429 int mac802154_llsec_devkey_add(struct mac802154_llsec *sec, in mac802154_llsec_devkey_add() argument
436 dev = llsec_dev_find_long(sec, dev_addr); in mac802154_llsec_devkey_add()
453 int mac802154_llsec_devkey_del(struct mac802154_llsec *sec, in mac802154_llsec_devkey_del() argument
460 dev = llsec_dev_find_long(sec, dev_addr); in mac802154_llsec_devkey_del()
475 llsec_find_seclevel(const struct mac802154_llsec *sec, in llsec_find_seclevel() argument
480 list_for_each_entry(pos, &sec->table.security_levels, list) { in llsec_find_seclevel()
495 int mac802154_llsec_seclevel_add(struct mac802154_llsec *sec, in mac802154_llsec_seclevel_add() argument
500 if (llsec_find_seclevel(sec, sl)) in mac802154_llsec_seclevel_add()
509 list_add_tail_rcu(&entry->level.list, &sec->table.security_levels); in mac802154_llsec_seclevel_add()
514 int mac802154_llsec_seclevel_del(struct mac802154_llsec *sec, in mac802154_llsec_seclevel_del() argument
519 pos = llsec_find_seclevel(sec, sl); in mac802154_llsec_seclevel_del()
529 static int llsec_recover_addr(struct mac802154_llsec *sec, in llsec_recover_addr() argument
532 __le16 caddr = sec->params.coord_shortaddr; in llsec_recover_addr()
534 addr->pan_id = sec->params.pan_id; in llsec_recover_addr()
539 addr->extended_addr = sec->params.coord_hwaddr; in llsec_recover_addr()
542 addr->short_addr = sec->params.coord_shortaddr; in llsec_recover_addr()
550 llsec_lookup_key(struct mac802154_llsec *sec, in llsec_lookup_key() argument
556 u8 key_id_mode = hdr->sec.key_id_mode; in llsec_lookup_key()
563 devaddr.extended_addr = sec->params.coord_hwaddr; in llsec_lookup_key()
565 } else if (llsec_recover_addr(sec, &devaddr) < 0) { in llsec_lookup_key()
570 list_for_each_entry_rcu(key_entry, &sec->table.keys, list) { in llsec_lookup_key()
583 if (id->id != hdr->sec.key_id) in llsec_lookup_key()
588 id->short_source == hdr->sec.short_src) || in llsec_lookup_key()
590 id->extended_source == hdr->sec.extended_src)) in llsec_lookup_key()
605 const struct ieee802154_sechdr *sec) in llsec_geniv() argument
608 __be32 frame_counter = (__force __be32) swab32((__force u32) sec->frame_counter); in llsec_geniv()
613 iv[13] = sec->level; in llsec_geniv()
619 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()
656 llsec_do_encrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_encrypt_auth() argument
666 authlen = ieee802154_sechdr_authtag_len(&hdr->sec); in llsec_do_encrypt_auth()
667 llsec_geniv(iv, sec->params.hwaddr, &hdr->sec); in llsec_do_encrypt_auth()
682 if (!(hdr->sec.level & IEEE802154_SCF_SECLEVEL_ENC)) { in llsec_do_encrypt_auth()
699 const struct mac802154_llsec *sec, in llsec_do_encrypt() argument
703 if (hdr->sec.level == IEEE802154_SCF_SECLEVEL_ENC) in llsec_do_encrypt()
704 return llsec_do_encrypt_unauth(skb, sec, hdr, key); in llsec_do_encrypt()
706 return llsec_do_encrypt_auth(skb, sec, hdr, key); in llsec_do_encrypt()
709 int mac802154_llsec_encrypt(struct mac802154_llsec *sec, struct sk_buff *skb) in mac802154_llsec_encrypt() argument
725 (hdr.sec.level == IEEE802154_SCF_SECLEVEL_NONE)) { in mac802154_llsec_encrypt()
730 authlen = ieee802154_sechdr_authtag_len(&hdr.sec); in mac802154_llsec_encrypt()
737 read_lock_bh(&sec->lock); in mac802154_llsec_encrypt()
739 if (!sec->params.enabled) { in mac802154_llsec_encrypt()
744 key = llsec_lookup_key(sec, &hdr, &hdr.dest, NULL); in mac802154_llsec_encrypt()
750 read_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
752 write_lock_bh(&sec->lock); in mac802154_llsec_encrypt()
754 frame_ctr = be32_to_cpu(sec->params.frame_counter); in mac802154_llsec_encrypt()
755 hdr.sec.frame_counter = cpu_to_le32(frame_ctr); in mac802154_llsec_encrypt()
757 write_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
763 sec->params.frame_counter = cpu_to_be32(frame_ctr + 1); in mac802154_llsec_encrypt()
765 write_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
772 rc = llsec_do_encrypt(skb, sec, &hdr, key); in mac802154_llsec_encrypt()
778 read_unlock_bh(&sec->lock); in mac802154_llsec_encrypt()
785 llsec_lookup_dev(struct mac802154_llsec *sec, in llsec_lookup_dev() argument
792 llsec_recover_addr(sec, &devaddr) < 0) in llsec_lookup_dev()
799 hash_for_each_possible_rcu(sec->devices_short, dev, in llsec_lookup_dev()
808 hash_for_each_possible_rcu(sec->devices_hw, dev, in llsec_lookup_dev()
819 llsec_lookup_seclevel(const struct mac802154_llsec *sec, in llsec_lookup_seclevel() argument
825 list_for_each_entry_rcu(level, &sec->table.security_levels, list) { in llsec_lookup_seclevel()
838 llsec_do_decrypt_unauth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_decrypt_unauth() argument
849 llsec_geniv(iv, dev_addr, &hdr->sec); in llsec_do_decrypt_unauth()
865 llsec_do_decrypt_auth(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_decrypt_auth() argument
875 authlen = ieee802154_sechdr_authtag_len(&hdr->sec); in llsec_do_decrypt_auth()
876 llsec_geniv(iv, dev_addr, &hdr->sec); in llsec_do_decrypt_auth()
889 if (!(hdr->sec.level & IEEE802154_SCF_SECLEVEL_ENC)) { in llsec_do_decrypt_auth()
907 llsec_do_decrypt(struct sk_buff *skb, const struct mac802154_llsec *sec, in llsec_do_decrypt() argument
911 if (hdr->sec.level == IEEE802154_SCF_SECLEVEL_ENC) in llsec_do_decrypt()
912 return llsec_do_decrypt_unauth(skb, sec, hdr, key, dev_addr); in llsec_do_decrypt()
914 return llsec_do_decrypt_auth(skb, sec, hdr, key, dev_addr); in llsec_do_decrypt()
986 int mac802154_llsec_decrypt(struct mac802154_llsec *sec, struct sk_buff *skb) in mac802154_llsec_decrypt() argument
1004 read_lock_bh(&sec->lock); in mac802154_llsec_decrypt()
1005 if (!sec->params.enabled) { in mac802154_llsec_decrypt()
1006 read_unlock_bh(&sec->lock); in mac802154_llsec_decrypt()
1009 read_unlock_bh(&sec->lock); in mac802154_llsec_decrypt()
1013 key = llsec_lookup_key(sec, &hdr, &hdr.source, &key_id); in mac802154_llsec_decrypt()
1019 dev = llsec_lookup_dev(sec, &hdr.source); in mac802154_llsec_decrypt()
1025 if (llsec_lookup_seclevel(sec, hdr.fc.type, 0, &seclevel) < 0) { in mac802154_llsec_decrypt()
1030 if (!(seclevel.sec_levels & BIT(hdr.sec.level)) && in mac802154_llsec_decrypt()
1031 (hdr.sec.level == 0 && seclevel.device_override && in mac802154_llsec_decrypt()
1037 frame_ctr = le32_to_cpu(hdr.sec.frame_counter); in mac802154_llsec_decrypt()
1052 err = llsec_do_decrypt(skb, sec, &hdr, key, dev_addr); in mac802154_llsec_decrypt()