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, &params, 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