diff options
Diffstat (limited to 'net/mac802154/llsec.c')
-rw-r--r-- | net/mac802154/llsec.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/net/mac802154/llsec.c b/net/mac802154/llsec.c index 392653b1b5a3..a83674edaafd 100644 --- a/net/mac802154/llsec.c +++ b/net/mac802154/llsec.c | |||
@@ -921,6 +921,37 @@ llsec_do_decrypt(struct sk_buff *skb, const struct mac802154_llsec *sec, | |||
921 | } | 921 | } |
922 | 922 | ||
923 | static int | 923 | static int |
924 | llsec_update_devkey_record(struct mac802154_llsec_device *dev, | ||
925 | const struct ieee802154_llsec_key_id *in_key) | ||
926 | { | ||
927 | struct mac802154_llsec_device_key *devkey; | ||
928 | |||
929 | devkey = llsec_devkey_find(dev, in_key); | ||
930 | |||
931 | if (!devkey) { | ||
932 | struct mac802154_llsec_device_key *next; | ||
933 | |||
934 | next = kzalloc(sizeof(*devkey), GFP_ATOMIC); | ||
935 | if (!next) | ||
936 | return -ENOMEM; | ||
937 | |||
938 | next->devkey.key_id = *in_key; | ||
939 | |||
940 | spin_lock_bh(&dev->lock); | ||
941 | |||
942 | devkey = llsec_devkey_find(dev, in_key); | ||
943 | if (!devkey) | ||
944 | list_add_rcu(&next->devkey.list, &dev->dev.keys); | ||
945 | else | ||
946 | kfree(next); | ||
947 | |||
948 | spin_unlock_bh(&dev->lock); | ||
949 | } | ||
950 | |||
951 | return 0; | ||
952 | } | ||
953 | |||
954 | static int | ||
924 | llsec_update_devkey_info(struct mac802154_llsec_device *dev, | 955 | llsec_update_devkey_info(struct mac802154_llsec_device *dev, |
925 | const struct ieee802154_llsec_key_id *in_key, | 956 | const struct ieee802154_llsec_key_id *in_key, |
926 | u32 frame_counter) | 957 | u32 frame_counter) |
@@ -933,6 +964,13 @@ llsec_update_devkey_info(struct mac802154_llsec_device *dev, | |||
933 | return -ENOENT; | 964 | return -ENOENT; |
934 | } | 965 | } |
935 | 966 | ||
967 | if (dev->dev.key_mode == IEEE802154_LLSEC_DEVKEY_RECORD) { | ||
968 | int rc = llsec_update_devkey_record(dev, in_key); | ||
969 | |||
970 | if (rc < 0) | ||
971 | return rc; | ||
972 | } | ||
973 | |||
936 | spin_lock_bh(&dev->lock); | 974 | spin_lock_bh(&dev->lock); |
937 | 975 | ||
938 | if ((!devkey && frame_counter < dev->dev.frame_counter) || | 976 | if ((!devkey && frame_counter < dev->dev.frame_counter) || |