1 // SPDX-License-Identifier: GPL-2.0-only 1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 2 /* 3 * Copyright 2007-2012 Siemens AG 3 * Copyright 2007-2012 Siemens AG 4 * 4 * 5 * Written by: 5 * Written by: 6 * Dmitry Eremin-Solenikov <dbaryshkov@gmail.c 6 * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> 7 * Sergey Lapin <slapin@ossfans.org> 7 * Sergey Lapin <slapin@ossfans.org> 8 * Maxim Gorbachyov <maxim.gorbachev@siemens.c 8 * Maxim Gorbachyov <maxim.gorbachev@siemens.com> 9 * Alexander Smirnov <alex.bluesman.smirnov@gm 9 * Alexander Smirnov <alex.bluesman.smirnov@gmail.com> 10 */ 10 */ 11 11 12 #include <linux/if_arp.h> 12 #include <linux/if_arp.h> 13 13 14 #include <net/mac802154.h> 14 #include <net/mac802154.h> 15 #include <net/ieee802154_netdev.h> 15 #include <net/ieee802154_netdev.h> 16 #include <net/cfg802154.h> 16 #include <net/cfg802154.h> 17 17 18 #include "ieee802154_i.h" 18 #include "ieee802154_i.h" 19 #include "driver-ops.h" 19 #include "driver-ops.h" 20 20 21 void mac802154_dev_set_page_channel(struct net 21 void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan) 22 { 22 { 23 struct ieee802154_sub_if_data *sdata = 23 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 24 struct ieee802154_local *local = sdata 24 struct ieee802154_local *local = sdata->local; 25 int res; 25 int res; 26 26 27 ASSERT_RTNL(); 27 ASSERT_RTNL(); 28 28 29 BUG_ON(dev->type != ARPHRD_IEEE802154) 29 BUG_ON(dev->type != ARPHRD_IEEE802154); 30 30 31 res = drv_set_channel(local, page, cha 31 res = drv_set_channel(local, page, chan); 32 if (res) { 32 if (res) { 33 pr_debug("set_channel failed\n 33 pr_debug("set_channel failed\n"); 34 } else { 34 } else { 35 local->phy->current_channel = 35 local->phy->current_channel = chan; 36 local->phy->current_page = pag 36 local->phy->current_page = page; 37 } 37 } 38 } 38 } 39 39 40 int mac802154_get_params(struct net_device *de 40 int mac802154_get_params(struct net_device *dev, 41 struct ieee802154_lls 41 struct ieee802154_llsec_params *params) 42 { 42 { 43 struct ieee802154_sub_if_data *sdata = 43 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 44 int res; 44 int res; 45 45 46 BUG_ON(dev->type != ARPHRD_IEEE802154) 46 BUG_ON(dev->type != ARPHRD_IEEE802154); 47 47 48 mutex_lock(&sdata->sec_mtx); 48 mutex_lock(&sdata->sec_mtx); 49 res = mac802154_llsec_get_params(&sdat 49 res = mac802154_llsec_get_params(&sdata->sec, params); 50 mutex_unlock(&sdata->sec_mtx); 50 mutex_unlock(&sdata->sec_mtx); 51 51 52 return res; 52 return res; 53 } 53 } 54 54 55 int mac802154_set_params(struct net_device *de 55 int mac802154_set_params(struct net_device *dev, 56 const struct ieee8021 56 const struct ieee802154_llsec_params *params, 57 int changed) 57 int changed) 58 { 58 { 59 struct ieee802154_sub_if_data *sdata = 59 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 60 int res; 60 int res; 61 61 62 BUG_ON(dev->type != ARPHRD_IEEE802154) 62 BUG_ON(dev->type != ARPHRD_IEEE802154); 63 63 64 mutex_lock(&sdata->sec_mtx); 64 mutex_lock(&sdata->sec_mtx); 65 res = mac802154_llsec_set_params(&sdat 65 res = mac802154_llsec_set_params(&sdata->sec, params, changed); 66 mutex_unlock(&sdata->sec_mtx); 66 mutex_unlock(&sdata->sec_mtx); 67 67 68 return res; 68 return res; 69 } 69 } 70 70 71 int mac802154_add_key(struct net_device *dev, 71 int mac802154_add_key(struct net_device *dev, 72 const struct ieee802154_ 72 const struct ieee802154_llsec_key_id *id, 73 const struct ieee802154_ 73 const struct ieee802154_llsec_key *key) 74 { 74 { 75 struct ieee802154_sub_if_data *sdata = 75 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 76 int res; 76 int res; 77 77 78 BUG_ON(dev->type != ARPHRD_IEEE802154) 78 BUG_ON(dev->type != ARPHRD_IEEE802154); 79 79 80 mutex_lock(&sdata->sec_mtx); 80 mutex_lock(&sdata->sec_mtx); 81 res = mac802154_llsec_key_add(&sdata-> 81 res = mac802154_llsec_key_add(&sdata->sec, id, key); 82 mutex_unlock(&sdata->sec_mtx); 82 mutex_unlock(&sdata->sec_mtx); 83 83 84 return res; 84 return res; 85 } 85 } 86 86 87 int mac802154_del_key(struct net_device *dev, 87 int mac802154_del_key(struct net_device *dev, 88 const struct ieee802154_ 88 const struct ieee802154_llsec_key_id *id) 89 { 89 { 90 struct ieee802154_sub_if_data *sdata = 90 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 91 int res; 91 int res; 92 92 93 BUG_ON(dev->type != ARPHRD_IEEE802154) 93 BUG_ON(dev->type != ARPHRD_IEEE802154); 94 94 95 mutex_lock(&sdata->sec_mtx); 95 mutex_lock(&sdata->sec_mtx); 96 res = mac802154_llsec_key_del(&sdata-> 96 res = mac802154_llsec_key_del(&sdata->sec, id); 97 mutex_unlock(&sdata->sec_mtx); 97 mutex_unlock(&sdata->sec_mtx); 98 98 99 return res; 99 return res; 100 } 100 } 101 101 102 int mac802154_add_dev(struct net_device *dev, 102 int mac802154_add_dev(struct net_device *dev, 103 const struct ieee802154_ 103 const struct ieee802154_llsec_device *llsec_dev) 104 { 104 { 105 struct ieee802154_sub_if_data *sdata = 105 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 106 int res; 106 int res; 107 107 108 BUG_ON(dev->type != ARPHRD_IEEE802154) 108 BUG_ON(dev->type != ARPHRD_IEEE802154); 109 109 110 mutex_lock(&sdata->sec_mtx); 110 mutex_lock(&sdata->sec_mtx); 111 res = mac802154_llsec_dev_add(&sdata-> 111 res = mac802154_llsec_dev_add(&sdata->sec, llsec_dev); 112 mutex_unlock(&sdata->sec_mtx); 112 mutex_unlock(&sdata->sec_mtx); 113 113 114 return res; 114 return res; 115 } 115 } 116 116 117 int mac802154_del_dev(struct net_device *dev, 117 int mac802154_del_dev(struct net_device *dev, __le64 dev_addr) 118 { 118 { 119 struct ieee802154_sub_if_data *sdata = 119 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 120 int res; 120 int res; 121 121 122 BUG_ON(dev->type != ARPHRD_IEEE802154) 122 BUG_ON(dev->type != ARPHRD_IEEE802154); 123 123 124 mutex_lock(&sdata->sec_mtx); 124 mutex_lock(&sdata->sec_mtx); 125 res = mac802154_llsec_dev_del(&sdata-> 125 res = mac802154_llsec_dev_del(&sdata->sec, dev_addr); 126 mutex_unlock(&sdata->sec_mtx); 126 mutex_unlock(&sdata->sec_mtx); 127 127 128 return res; 128 return res; 129 } 129 } 130 130 131 int mac802154_add_devkey(struct net_device *de 131 int mac802154_add_devkey(struct net_device *dev, 132 __le64 device_addr, 132 __le64 device_addr, 133 const struct ieee8021 133 const struct ieee802154_llsec_device_key *key) 134 { 134 { 135 struct ieee802154_sub_if_data *sdata = 135 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 136 int res; 136 int res; 137 137 138 BUG_ON(dev->type != ARPHRD_IEEE802154) 138 BUG_ON(dev->type != ARPHRD_IEEE802154); 139 139 140 mutex_lock(&sdata->sec_mtx); 140 mutex_lock(&sdata->sec_mtx); 141 res = mac802154_llsec_devkey_add(&sdat 141 res = mac802154_llsec_devkey_add(&sdata->sec, device_addr, key); 142 mutex_unlock(&sdata->sec_mtx); 142 mutex_unlock(&sdata->sec_mtx); 143 143 144 return res; 144 return res; 145 } 145 } 146 146 147 int mac802154_del_devkey(struct net_device *de 147 int mac802154_del_devkey(struct net_device *dev, 148 __le64 device_addr, 148 __le64 device_addr, 149 const struct ieee8021 149 const struct ieee802154_llsec_device_key *key) 150 { 150 { 151 struct ieee802154_sub_if_data *sdata = 151 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 152 int res; 152 int res; 153 153 154 BUG_ON(dev->type != ARPHRD_IEEE802154) 154 BUG_ON(dev->type != ARPHRD_IEEE802154); 155 155 156 mutex_lock(&sdata->sec_mtx); 156 mutex_lock(&sdata->sec_mtx); 157 res = mac802154_llsec_devkey_del(&sdat 157 res = mac802154_llsec_devkey_del(&sdata->sec, device_addr, key); 158 mutex_unlock(&sdata->sec_mtx); 158 mutex_unlock(&sdata->sec_mtx); 159 159 160 return res; 160 return res; 161 } 161 } 162 162 163 int mac802154_add_seclevel(struct net_device * 163 int mac802154_add_seclevel(struct net_device *dev, 164 const struct ieee80 164 const struct ieee802154_llsec_seclevel *sl) 165 { 165 { 166 struct ieee802154_sub_if_data *sdata = 166 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 167 int res; 167 int res; 168 168 169 BUG_ON(dev->type != ARPHRD_IEEE802154) 169 BUG_ON(dev->type != ARPHRD_IEEE802154); 170 170 171 mutex_lock(&sdata->sec_mtx); 171 mutex_lock(&sdata->sec_mtx); 172 res = mac802154_llsec_seclevel_add(&sd 172 res = mac802154_llsec_seclevel_add(&sdata->sec, sl); 173 mutex_unlock(&sdata->sec_mtx); 173 mutex_unlock(&sdata->sec_mtx); 174 174 175 return res; 175 return res; 176 } 176 } 177 177 178 int mac802154_del_seclevel(struct net_device * 178 int mac802154_del_seclevel(struct net_device *dev, 179 const struct ieee80 179 const struct ieee802154_llsec_seclevel *sl) 180 { 180 { 181 struct ieee802154_sub_if_data *sdata = 181 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 182 int res; 182 int res; 183 183 184 BUG_ON(dev->type != ARPHRD_IEEE802154) 184 BUG_ON(dev->type != ARPHRD_IEEE802154); 185 185 186 mutex_lock(&sdata->sec_mtx); 186 mutex_lock(&sdata->sec_mtx); 187 res = mac802154_llsec_seclevel_del(&sd 187 res = mac802154_llsec_seclevel_del(&sdata->sec, sl); 188 mutex_unlock(&sdata->sec_mtx); 188 mutex_unlock(&sdata->sec_mtx); 189 189 190 return res; 190 return res; 191 } 191 } 192 192 193 void mac802154_lock_table(struct net_device *d 193 void mac802154_lock_table(struct net_device *dev) 194 { 194 { 195 struct ieee802154_sub_if_data *sdata = 195 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 196 196 197 BUG_ON(dev->type != ARPHRD_IEEE802154) 197 BUG_ON(dev->type != ARPHRD_IEEE802154); 198 198 199 mutex_lock(&sdata->sec_mtx); 199 mutex_lock(&sdata->sec_mtx); 200 } 200 } 201 201 202 void mac802154_get_table(struct net_device *de 202 void mac802154_get_table(struct net_device *dev, 203 struct ieee802154_lls 203 struct ieee802154_llsec_table **t) 204 { 204 { 205 struct ieee802154_sub_if_data *sdata = 205 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 206 206 207 BUG_ON(dev->type != ARPHRD_IEEE802154) 207 BUG_ON(dev->type != ARPHRD_IEEE802154); 208 208 209 *t = &sdata->sec.table; 209 *t = &sdata->sec.table; 210 } 210 } 211 211 212 void mac802154_unlock_table(struct net_device 212 void mac802154_unlock_table(struct net_device *dev) 213 { 213 { 214 struct ieee802154_sub_if_data *sdata = 214 struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev); 215 215 216 BUG_ON(dev->type != ARPHRD_IEEE802154) 216 BUG_ON(dev->type != ARPHRD_IEEE802154); 217 217 218 mutex_unlock(&sdata->sec_mtx); 218 mutex_unlock(&sdata->sec_mtx); 219 } 219 } 220 220
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.