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