2012-05-16 00:50:25 +04:00
/*
* MAC commands interface
*
* Copyright 2007 - 2012 Siemens AG
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* Written by :
* Sergey Lapin < slapin @ ossfans . org >
* Dmitry Eremin - Solenikov < dbaryshkov @ gmail . com >
* Alexander Smirnov < alex . bluesman . smirnov @ gmail . com >
*/
# include <linux/skbuff.h>
# include <linux/if_arp.h>
2012-06-26 03:24:52 +04:00
# include <net/ieee802154.h>
2012-05-16 00:50:25 +04:00
# include <net/ieee802154_netdev.h>
# include <net/wpan-phy.h>
# include <net/mac802154.h>
2012-06-26 03:24:52 +04:00
# include <net/nl802154.h>
2012-05-16 00:50:25 +04:00
2014-10-25 11:41:00 +04:00
# include "ieee802154_i.h"
2012-05-16 00:50:25 +04:00
2012-06-26 03:24:52 +04:00
static int mac802154_mlme_start_req ( struct net_device * dev ,
2014-03-15 00:24:02 +04:00
struct ieee802154_addr * addr ,
2012-06-26 03:24:52 +04:00
u8 channel , u8 page ,
u8 bcn_ord , u8 sf_ord ,
u8 pan_coord , u8 blx ,
u8 coord_realign )
{
2014-05-16 19:46:43 +04:00
struct ieee802154_mlme_ops * ops = ieee802154_mlme_ops ( dev ) ;
int rc = 0 ;
2014-03-15 00:24:02 +04:00
BUG_ON ( addr - > mode ! = IEEE802154_ADDR_SHORT ) ;
2012-06-26 03:24:52 +04:00
2014-03-15 00:24:02 +04:00
mac802154_dev_set_pan_id ( dev , addr - > pan_id ) ;
mac802154_dev_set_short_addr ( dev , addr - > short_addr ) ;
2012-06-26 03:24:52 +04:00
mac802154_dev_set_ieee_addr ( dev ) ;
mac802154_dev_set_page_channel ( dev , page , channel ) ;
2014-05-16 19:46:43 +04:00
if ( ops - > llsec ) {
struct ieee802154_llsec_params params ;
int changed = 0 ;
params . coord_shortaddr = addr - > short_addr ;
changed | = IEEE802154_LLSEC_PARAM_COORD_SHORTADDR ;
params . pan_id = addr - > pan_id ;
changed | = IEEE802154_LLSEC_PARAM_PAN_ID ;
params . hwaddr = ieee802154_devaddr_from_raw ( dev - > dev_addr ) ;
changed | = IEEE802154_LLSEC_PARAM_HWADDR ;
params . coord_hwaddr = params . hwaddr ;
changed | = IEEE802154_LLSEC_PARAM_COORD_HWADDR ;
rc = ops - > llsec - > set_params ( dev , & params , changed ) ;
}
2012-06-26 03:24:52 +04:00
/* FIXME: add validation for unused parameters to be sane
* for SoftMAC
*/
ieee802154_nl_start_confirm ( dev , IEEE802154_SUCCESS ) ;
2014-05-16 19:46:43 +04:00
return rc ;
2012-06-26 03:24:52 +04:00
}
2012-07-11 01:22:46 +04:00
static struct wpan_phy * mac802154_get_phy ( const struct net_device * dev )
2012-05-16 00:50:25 +04:00
{
struct mac802154_sub_if_data * priv = netdev_priv ( dev ) ;
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
return to_phy ( get_device ( & priv - > hw - > phy - > dev ) ) ;
}
2014-05-16 19:46:42 +04:00
static struct ieee802154_llsec_ops mac802154_llsec_ops = {
. get_params = mac802154_get_params ,
. set_params = mac802154_set_params ,
. add_key = mac802154_add_key ,
. del_key = mac802154_del_key ,
. add_dev = mac802154_add_dev ,
. del_dev = mac802154_del_dev ,
. add_devkey = mac802154_add_devkey ,
. del_devkey = mac802154_del_devkey ,
. add_seclevel = mac802154_add_seclevel ,
. del_seclevel = mac802154_del_seclevel ,
. lock_table = mac802154_lock_table ,
. get_table = mac802154_get_table ,
. unlock_table = mac802154_unlock_table ,
} ;
2012-05-16 00:50:25 +04:00
struct ieee802154_reduced_mlme_ops mac802154_mlme_reduced = {
. get_phy = mac802154_get_phy ,
} ;
2012-06-26 03:24:48 +04:00
struct ieee802154_mlme_ops mac802154_mlme_wpan = {
. get_phy = mac802154_get_phy ,
2012-06-26 03:24:52 +04:00
. start_req = mac802154_mlme_start_req ,
2012-07-11 01:22:44 +04:00
. get_pan_id = mac802154_dev_get_pan_id ,
. get_short_addr = mac802154_dev_get_short_addr ,
2013-03-25 21:59:29 +04:00
. get_dsn = mac802154_dev_get_dsn ,
2014-03-31 23:37:46 +04:00
2014-05-16 19:46:42 +04:00
. llsec = & mac802154_llsec_ops ,
2014-03-31 23:37:46 +04:00
. set_mac_params = mac802154_set_mac_params ,
. get_mac_params = mac802154_get_mac_params ,
2012-06-26 03:24:48 +04:00
} ;