Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mac802154: add llsec configuration functions

Signed-off-by: Phoebe Buckheister <phoebe.buckheister@itwm.fraunhofer.de>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Phoebe Buckheister and committed by
David S. Miller
29e02374 af9eed5b

+274
+36
include/net/ieee802154_netdev.h
··· 358 358 IEEE802154_LLSEC_PARAM_COORD_SHORTADDR = 1 << 8, 359 359 }; 360 360 361 + struct ieee802154_llsec_ops { 362 + int (*get_params)(struct net_device *dev, 363 + struct ieee802154_llsec_params *params); 364 + int (*set_params)(struct net_device *dev, 365 + const struct ieee802154_llsec_params *params, 366 + int changed); 367 + 368 + int (*add_key)(struct net_device *dev, 369 + const struct ieee802154_llsec_key_id *id, 370 + const struct ieee802154_llsec_key *key); 371 + int (*del_key)(struct net_device *dev, 372 + const struct ieee802154_llsec_key_id *id); 373 + 374 + int (*add_dev)(struct net_device *dev, 375 + const struct ieee802154_llsec_device *llsec_dev); 376 + int (*del_dev)(struct net_device *dev, __le64 dev_addr); 377 + 378 + int (*add_devkey)(struct net_device *dev, 379 + __le64 device_addr, 380 + const struct ieee802154_llsec_device_key *key); 381 + int (*del_devkey)(struct net_device *dev, 382 + __le64 device_addr, 383 + const struct ieee802154_llsec_device_key *key); 384 + 385 + int (*add_seclevel)(struct net_device *dev, 386 + const struct ieee802154_llsec_seclevel *sl); 387 + int (*del_seclevel)(struct net_device *dev, 388 + const struct ieee802154_llsec_seclevel *sl); 389 + 390 + void (*lock_table)(struct net_device *dev); 391 + void (*get_table)(struct net_device *dev, 392 + struct ieee802154_llsec_table **t); 393 + void (*unlock_table)(struct net_device *dev); 394 + }; 361 395 /* 362 396 * This should be located at net_device->ml_priv 363 397 * ··· 421 387 const struct ieee802154_mac_params *params); 422 388 void (*get_mac_params)(struct net_device *dev, 423 389 struct ieee802154_mac_params *params); 390 + 391 + struct ieee802154_llsec_ops *llsec; 424 392 425 393 /* The fields below are required. */ 426 394
+33
net/mac802154/mac802154.h
··· 136 136 void mac802154_get_mac_params(struct net_device *dev, 137 137 struct ieee802154_mac_params *params); 138 138 139 + int mac802154_get_params(struct net_device *dev, 140 + struct ieee802154_llsec_params *params); 141 + int mac802154_set_params(struct net_device *dev, 142 + const struct ieee802154_llsec_params *params, 143 + int changed); 144 + 145 + int mac802154_add_key(struct net_device *dev, 146 + const struct ieee802154_llsec_key_id *id, 147 + const struct ieee802154_llsec_key *key); 148 + int mac802154_del_key(struct net_device *dev, 149 + const struct ieee802154_llsec_key_id *id); 150 + 151 + int mac802154_add_dev(struct net_device *dev, 152 + const struct ieee802154_llsec_device *llsec_dev); 153 + int mac802154_del_dev(struct net_device *dev, __le64 dev_addr); 154 + 155 + int mac802154_add_devkey(struct net_device *dev, 156 + __le64 device_addr, 157 + const struct ieee802154_llsec_device_key *key); 158 + int mac802154_del_devkey(struct net_device *dev, 159 + __le64 device_addr, 160 + const struct ieee802154_llsec_device_key *key); 161 + 162 + int mac802154_add_seclevel(struct net_device *dev, 163 + const struct ieee802154_llsec_seclevel *sl); 164 + int mac802154_del_seclevel(struct net_device *dev, 165 + const struct ieee802154_llsec_seclevel *sl); 166 + 167 + void mac802154_lock_table(struct net_device *dev); 168 + void mac802154_get_table(struct net_device *dev, 169 + struct ieee802154_llsec_table **t); 170 + void mac802154_unlock_table(struct net_device *dev); 171 + 139 172 #endif /* MAC802154_H */
+18
net/mac802154/mac_cmd.c
··· 64 64 return to_phy(get_device(&priv->hw->phy->dev)); 65 65 } 66 66 67 + static struct ieee802154_llsec_ops mac802154_llsec_ops = { 68 + .get_params = mac802154_get_params, 69 + .set_params = mac802154_set_params, 70 + .add_key = mac802154_add_key, 71 + .del_key = mac802154_del_key, 72 + .add_dev = mac802154_add_dev, 73 + .del_dev = mac802154_del_dev, 74 + .add_devkey = mac802154_add_devkey, 75 + .del_devkey = mac802154_del_devkey, 76 + .add_seclevel = mac802154_add_seclevel, 77 + .del_seclevel = mac802154_del_seclevel, 78 + .lock_table = mac802154_lock_table, 79 + .get_table = mac802154_get_table, 80 + .unlock_table = mac802154_unlock_table, 81 + }; 82 + 67 83 struct ieee802154_reduced_mlme_ops mac802154_mlme_reduced = { 68 84 .get_phy = mac802154_get_phy, 69 85 }; ··· 90 74 .get_pan_id = mac802154_dev_get_pan_id, 91 75 .get_short_addr = mac802154_dev_get_short_addr, 92 76 .get_dsn = mac802154_dev_get_dsn, 77 + 78 + .llsec = &mac802154_llsec_ops, 93 79 94 80 .set_mac_params = mac802154_set_mac_params, 95 81 .get_mac_params = mac802154_get_mac_params,
+187
net/mac802154/mib.c
··· 213 213 } else 214 214 mutex_unlock(&priv->hw->phy->pib_lock); 215 215 } 216 + 217 + 218 + int mac802154_get_params(struct net_device *dev, 219 + struct ieee802154_llsec_params *params) 220 + { 221 + struct mac802154_sub_if_data *priv = netdev_priv(dev); 222 + int res; 223 + 224 + BUG_ON(dev->type != ARPHRD_IEEE802154); 225 + 226 + mutex_lock(&priv->sec_mtx); 227 + res = mac802154_llsec_get_params(&priv->sec, params); 228 + mutex_unlock(&priv->sec_mtx); 229 + 230 + return res; 231 + } 232 + 233 + int mac802154_set_params(struct net_device *dev, 234 + const struct ieee802154_llsec_params *params, 235 + int changed) 236 + { 237 + struct mac802154_sub_if_data *priv = netdev_priv(dev); 238 + int res; 239 + 240 + BUG_ON(dev->type != ARPHRD_IEEE802154); 241 + 242 + mutex_lock(&priv->sec_mtx); 243 + res = mac802154_llsec_set_params(&priv->sec, params, changed); 244 + mutex_unlock(&priv->sec_mtx); 245 + 246 + return res; 247 + } 248 + 249 + 250 + int mac802154_add_key(struct net_device *dev, 251 + const struct ieee802154_llsec_key_id *id, 252 + const struct ieee802154_llsec_key *key) 253 + { 254 + struct mac802154_sub_if_data *priv = netdev_priv(dev); 255 + int res; 256 + 257 + BUG_ON(dev->type != ARPHRD_IEEE802154); 258 + 259 + mutex_lock(&priv->sec_mtx); 260 + res = mac802154_llsec_key_add(&priv->sec, id, key); 261 + mutex_unlock(&priv->sec_mtx); 262 + 263 + return res; 264 + } 265 + 266 + int mac802154_del_key(struct net_device *dev, 267 + const struct ieee802154_llsec_key_id *id) 268 + { 269 + struct mac802154_sub_if_data *priv = netdev_priv(dev); 270 + int res; 271 + 272 + BUG_ON(dev->type != ARPHRD_IEEE802154); 273 + 274 + mutex_lock(&priv->sec_mtx); 275 + res = mac802154_llsec_key_del(&priv->sec, id); 276 + mutex_unlock(&priv->sec_mtx); 277 + 278 + return res; 279 + } 280 + 281 + 282 + int mac802154_add_dev(struct net_device *dev, 283 + const struct ieee802154_llsec_device *llsec_dev) 284 + { 285 + struct mac802154_sub_if_data *priv = netdev_priv(dev); 286 + int res; 287 + 288 + BUG_ON(dev->type != ARPHRD_IEEE802154); 289 + 290 + mutex_lock(&priv->sec_mtx); 291 + res = mac802154_llsec_dev_add(&priv->sec, llsec_dev); 292 + mutex_unlock(&priv->sec_mtx); 293 + 294 + return res; 295 + } 296 + 297 + int mac802154_del_dev(struct net_device *dev, __le64 dev_addr) 298 + { 299 + struct mac802154_sub_if_data *priv = netdev_priv(dev); 300 + int res; 301 + 302 + BUG_ON(dev->type != ARPHRD_IEEE802154); 303 + 304 + mutex_lock(&priv->sec_mtx); 305 + res = mac802154_llsec_dev_del(&priv->sec, dev_addr); 306 + mutex_unlock(&priv->sec_mtx); 307 + 308 + return res; 309 + } 310 + 311 + 312 + int mac802154_add_devkey(struct net_device *dev, 313 + __le64 device_addr, 314 + const struct ieee802154_llsec_device_key *key) 315 + { 316 + struct mac802154_sub_if_data *priv = netdev_priv(dev); 317 + int res; 318 + 319 + BUG_ON(dev->type != ARPHRD_IEEE802154); 320 + 321 + mutex_lock(&priv->sec_mtx); 322 + res = mac802154_llsec_devkey_add(&priv->sec, device_addr, key); 323 + mutex_unlock(&priv->sec_mtx); 324 + 325 + return res; 326 + } 327 + 328 + int mac802154_del_devkey(struct net_device *dev, 329 + __le64 device_addr, 330 + const struct ieee802154_llsec_device_key *key) 331 + { 332 + struct mac802154_sub_if_data *priv = netdev_priv(dev); 333 + int res; 334 + 335 + BUG_ON(dev->type != ARPHRD_IEEE802154); 336 + 337 + mutex_lock(&priv->sec_mtx); 338 + res = mac802154_llsec_devkey_del(&priv->sec, device_addr, key); 339 + mutex_unlock(&priv->sec_mtx); 340 + 341 + return res; 342 + } 343 + 344 + 345 + int mac802154_add_seclevel(struct net_device *dev, 346 + const struct ieee802154_llsec_seclevel *sl) 347 + { 348 + struct mac802154_sub_if_data *priv = netdev_priv(dev); 349 + int res; 350 + 351 + BUG_ON(dev->type != ARPHRD_IEEE802154); 352 + 353 + mutex_lock(&priv->sec_mtx); 354 + res = mac802154_llsec_seclevel_add(&priv->sec, sl); 355 + mutex_unlock(&priv->sec_mtx); 356 + 357 + return res; 358 + } 359 + 360 + int mac802154_del_seclevel(struct net_device *dev, 361 + const struct ieee802154_llsec_seclevel *sl) 362 + { 363 + struct mac802154_sub_if_data *priv = netdev_priv(dev); 364 + int res; 365 + 366 + BUG_ON(dev->type != ARPHRD_IEEE802154); 367 + 368 + mutex_lock(&priv->sec_mtx); 369 + res = mac802154_llsec_seclevel_del(&priv->sec, sl); 370 + mutex_unlock(&priv->sec_mtx); 371 + 372 + return res; 373 + } 374 + 375 + 376 + void mac802154_lock_table(struct net_device *dev) 377 + { 378 + struct mac802154_sub_if_data *priv = netdev_priv(dev); 379 + 380 + BUG_ON(dev->type != ARPHRD_IEEE802154); 381 + 382 + mutex_lock(&priv->sec_mtx); 383 + } 384 + 385 + void mac802154_get_table(struct net_device *dev, 386 + struct ieee802154_llsec_table **t) 387 + { 388 + struct mac802154_sub_if_data *priv = netdev_priv(dev); 389 + 390 + BUG_ON(dev->type != ARPHRD_IEEE802154); 391 + 392 + *t = &priv->sec.table; 393 + } 394 + 395 + void mac802154_unlock_table(struct net_device *dev) 396 + { 397 + struct mac802154_sub_if_data *priv = netdev_priv(dev); 398 + 399 + BUG_ON(dev->type != ARPHRD_IEEE802154); 400 + 401 + mutex_unlock(&priv->sec_mtx); 402 + }