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