16e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com/* 26e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * MAC commands interface 36e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * 46e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * Copyright 2007-2012 Siemens AG 56e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * 66e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * This program is free software; you can redistribute it and/or modify 76e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * it under the terms of the GNU General Public License version 2 86e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * as published by the Free Software Foundation. 96e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * 106e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * This program is distributed in the hope that it will be useful, 116e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * but WITHOUT ANY WARRANTY; without even the implied warranty of 126e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 136e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * GNU General Public License for more details. 146e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * 156e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * You should have received a copy of the GNU General Public License along 166e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * with this program; if not, write to the Free Software Foundation, Inc., 176e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 186e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * 196e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * Written by: 206e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * Sergey Lapin <slapin@ossfans.org> 216e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> 226e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com * Alexander Smirnov <alex.bluesman.smirnov@gmail.com> 236e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com */ 246e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com 256e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com#include <linux/skbuff.h> 266e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com#include <linux/if_arp.h> 276e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com 285265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com#include <net/ieee802154.h> 296e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com#include <net/ieee802154_netdev.h> 306e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com#include <net/wpan-phy.h> 316e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com#include <net/mac802154.h> 325265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com#include <net/nl802154.h> 336e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com 346e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com#include "mac802154.h" 356e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com 365265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.comstatic int mac802154_mlme_start_req(struct net_device *dev, 37ae531b9475f62c5e1863508604cd6b3faf362d56Phoebe Buckheister struct ieee802154_addr *addr, 385265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com u8 channel, u8 page, 395265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com u8 bcn_ord, u8 sf_ord, 405265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com u8 pan_coord, u8 blx, 415265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com u8 coord_realign) 425265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com{ 439b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister struct ieee802154_mlme_ops *ops = ieee802154_mlme_ops(dev); 449b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister int rc = 0; 459b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister 46ae531b9475f62c5e1863508604cd6b3faf362d56Phoebe Buckheister BUG_ON(addr->mode != IEEE802154_ADDR_SHORT); 475265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com 48ae531b9475f62c5e1863508604cd6b3faf362d56Phoebe Buckheister mac802154_dev_set_pan_id(dev, addr->pan_id); 49ae531b9475f62c5e1863508604cd6b3faf362d56Phoebe Buckheister mac802154_dev_set_short_addr(dev, addr->short_addr); 505265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com mac802154_dev_set_ieee_addr(dev); 515265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com mac802154_dev_set_page_channel(dev, page, channel); 525265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com 539b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister if (ops->llsec) { 549b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister struct ieee802154_llsec_params params; 559b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister int changed = 0; 569b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister 579b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister params.coord_shortaddr = addr->short_addr; 589b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister changed |= IEEE802154_LLSEC_PARAM_COORD_SHORTADDR; 599b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister 609b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister params.pan_id = addr->pan_id; 619b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister changed |= IEEE802154_LLSEC_PARAM_PAN_ID; 629b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister 639b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister params.hwaddr = ieee802154_devaddr_from_raw(dev->dev_addr); 649b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister changed |= IEEE802154_LLSEC_PARAM_HWADDR; 659b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister 669b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister params.coord_hwaddr = params.hwaddr; 679b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister changed |= IEEE802154_LLSEC_PARAM_COORD_HWADDR; 689b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister 699b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister rc = ops->llsec->set_params(dev, ¶ms, changed); 709b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister } 719b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister 725265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com /* FIXME: add validation for unused parameters to be sane 735265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com * for SoftMAC 745265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com */ 755265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com ieee802154_nl_start_confirm(dev, IEEE802154_SUCCESS); 765265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com 779b0bb4a83f27cd9b05d709cdeee86edc174db100Phoebe Buckheister return rc; 785265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com} 795265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com 80428840424fc54dd2d3f67d3de8b78bb71a479537alex.bluesman.smirnov@gmail.comstatic struct wpan_phy *mac802154_get_phy(const struct net_device *dev) 816e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com{ 826e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com struct mac802154_sub_if_data *priv = netdev_priv(dev); 836e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com 846e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com BUG_ON(dev->type != ARPHRD_IEEE802154); 856e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com 866e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com return to_phy(get_device(&priv->hw->phy->dev)); 876e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com} 886e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com 8929e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheisterstatic struct ieee802154_llsec_ops mac802154_llsec_ops = { 9029e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .get_params = mac802154_get_params, 9129e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .set_params = mac802154_set_params, 9229e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .add_key = mac802154_add_key, 9329e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .del_key = mac802154_del_key, 9429e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .add_dev = mac802154_add_dev, 9529e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .del_dev = mac802154_del_dev, 9629e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .add_devkey = mac802154_add_devkey, 9729e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .del_devkey = mac802154_del_devkey, 9829e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .add_seclevel = mac802154_add_seclevel, 9929e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .del_seclevel = mac802154_del_seclevel, 10029e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .lock_table = mac802154_lock_table, 10129e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .get_table = mac802154_get_table, 10229e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .unlock_table = mac802154_unlock_table, 10329e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister}; 10429e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister 1056e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.comstruct ieee802154_reduced_mlme_ops mac802154_mlme_reduced = { 1066e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com .get_phy = mac802154_get_phy, 1076e2128d42af43906d8bcbed7cf2207244fa4301ealex.bluesman.smirnov@gmail.com}; 10832bad7e30f113a8a5cebe4704bf6519ab4383e1balex.bluesman.smirnov@gmail.com 10932bad7e30f113a8a5cebe4704bf6519ab4383e1balex.bluesman.smirnov@gmail.comstruct ieee802154_mlme_ops mac802154_mlme_wpan = { 11032bad7e30f113a8a5cebe4704bf6519ab4383e1balex.bluesman.smirnov@gmail.com .get_phy = mac802154_get_phy, 1115265f46711ca4e6c389519a00e97036ddb892781alex.bluesman.smirnov@gmail.com .start_req = mac802154_mlme_start_req, 112e885a47a474fe53ed7d952af4b6e9a5cf86d9a07alex.bluesman.smirnov@gmail.com .get_pan_id = mac802154_dev_get_pan_id, 113e885a47a474fe53ed7d952af4b6e9a5cf86d9a07alex.bluesman.smirnov@gmail.com .get_short_addr = mac802154_dev_get_short_addr, 1140483546a3de329cad7705d42962edb09a28794c6Tony Cheneau .get_dsn = mac802154_dev_get_dsn, 115e462ded699aa2cca04b68fbf203ea4675d4c44d4Phoebe Buckheister 11629e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister .llsec = &mac802154_llsec_ops, 11729e023746a672e4ff702ca9dc63a06145fd8f4b0Phoebe Buckheister 118e462ded699aa2cca04b68fbf203ea4675d4c44d4Phoebe Buckheister .set_mac_params = mac802154_set_mac_params, 119e462ded699aa2cca04b68fbf203ea4675d4c44d4Phoebe Buckheister .get_mac_params = mac802154_get_mac_params, 12032bad7e30f113a8a5cebe4704bf6519ab4383e1balex.bluesman.smirnov@gmail.com}; 121