2019-05-27 09:55:21 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2012-05-16 00:50:25 +04:00
/*
* MAC commands interface
*
* Copyright 2007 - 2012 Siemens AG
*
* 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>
2014-10-25 11:41:04 +04:00
# include <linux/ieee802154.h>
2012-05-16 00:50:25 +04:00
# include <net/ieee802154_netdev.h>
2014-10-25 11:41:02 +04:00
# include <net/cfg802154.h>
2012-05-16 00:50:25 +04:00
# include <net/mac802154.h>
2014-10-25 11:41:00 +04:00
# include "ieee802154_i.h"
2014-11-02 06:18:44 +03:00
# include "driver-ops.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 )
{
2015-05-25 15:38:51 +03:00
struct ieee802154_llsec_params params ;
int changed = 0 ;
2014-05-16 19:46:43 +04:00
2014-11-09 10:36:57 +03:00
ASSERT_RTNL ( ) ;
2014-03-15 00:24:02 +04:00
BUG_ON ( addr - > mode ! = IEEE802154_ADDR_SHORT ) ;
2012-06-26 03:24:52 +04:00
2015-05-22 18:43:54 +03:00
dev - > ieee802154_ptr - > pan_id = addr - > pan_id ;
dev - > ieee802154_ptr - > short_addr = addr - > short_addr ;
2012-06-26 03:24:52 +04:00
mac802154_dev_set_page_channel ( dev , page , channel ) ;
2015-05-25 15:38:51 +03:00
params . pan_id = addr - > pan_id ;
changed | = IEEE802154_LLSEC_PARAM_PAN_ID ;
2014-05-16 19:46:43 +04:00
2015-05-25 15:38:51 +03:00
params . hwaddr = ieee802154_devaddr_from_raw ( dev - > dev_addr ) ;
changed | = IEEE802154_LLSEC_PARAM_HWADDR ;
2014-05-16 19:46:43 +04:00
2015-05-25 15:38:51 +03:00
params . coord_hwaddr = params . hwaddr ;
changed | = IEEE802154_LLSEC_PARAM_COORD_HWADDR ;
2014-05-16 19:46:43 +04:00
2015-05-25 15:38:51 +03:00
params . coord_shortaddr = addr - > short_addr ;
changed | = IEEE802154_LLSEC_PARAM_COORD_SHORTADDR ;
2014-05-16 19:46:43 +04:00
2015-05-25 15:38:51 +03:00
return mac802154_set_params ( dev , & params , changed ) ;
2012-06-26 03:24:52 +04:00
}
2014-10-28 20:21:30 +03:00
static int mac802154_set_mac_params ( struct net_device * dev ,
const struct ieee802154_mac_params * params )
{
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-11-02 06:18:44 +03:00
struct ieee802154_local * local = sdata - > local ;
2014-11-09 10:36:46 +03:00
struct wpan_dev * wpan_dev = & sdata - > wpan_dev ;
2014-11-02 06:18:44 +03:00
int ret ;
2014-10-28 20:21:30 +03:00
2014-11-09 10:36:57 +03:00
ASSERT_RTNL ( ) ;
2014-11-09 10:36:46 +03:00
/* PHY */
wpan_dev - > wpan_phy - > transmit_power = params - > transmit_power ;
2014-12-10 17:33:12 +03:00
wpan_dev - > wpan_phy - > cca = params - > cca ;
2014-11-09 10:36:46 +03:00
wpan_dev - > wpan_phy - > cca_ed_level = params - > cca_ed_level ;
/* MAC */
wpan_dev - > min_be = params - > min_be ;
wpan_dev - > max_be = params - > max_be ;
wpan_dev - > csma_retries = params - > csma_retries ;
wpan_dev - > frame_retries = params - > frame_retries ;
wpan_dev - > lbt = params - > lbt ;
2014-10-28 20:21:30 +03:00
2015-05-17 22:44:46 +03:00
if ( local - > hw . phy - > flags & WPAN_PHY_FLAG_TXPOWER ) {
2014-11-02 06:18:44 +03:00
ret = drv_set_tx_power ( local , params - > transmit_power ) ;
if ( ret < 0 )
return ret ;
}
2015-05-17 22:44:46 +03:00
if ( local - > hw . phy - > flags & WPAN_PHY_FLAG_CCA_MODE ) {
2014-12-10 17:33:12 +03:00
ret = drv_set_cca_mode ( local , & params - > cca ) ;
2014-11-02 06:18:44 +03:00
if ( ret < 0 )
return ret ;
}
2015-05-17 22:44:46 +03:00
if ( local - > hw . phy - > flags & WPAN_PHY_FLAG_CCA_ED_LEVEL ) {
2014-11-02 06:18:44 +03:00
ret = drv_set_cca_ed_level ( local , params - > cca_ed_level ) ;
if ( ret < 0 )
return ret ;
}
2014-10-28 20:21:30 +03:00
return 0 ;
}
static void mac802154_get_mac_params ( struct net_device * dev ,
struct ieee802154_mac_params * params )
{
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-11-09 10:36:46 +03:00
struct wpan_dev * wpan_dev = & sdata - > wpan_dev ;
2014-10-28 20:21:30 +03:00
2014-11-09 10:36:57 +03:00
ASSERT_RTNL ( ) ;
2014-11-09 10:36:46 +03:00
/* PHY */
params - > transmit_power = wpan_dev - > wpan_phy - > transmit_power ;
2014-12-10 17:33:12 +03:00
params - > cca = wpan_dev - > wpan_phy - > cca ;
2014-11-09 10:36:46 +03:00
params - > cca_ed_level = wpan_dev - > wpan_phy - > cca_ed_level ;
/* MAC */
params - > min_be = wpan_dev - > min_be ;
params - > max_be = wpan_dev - > max_be ;
params - > csma_retries = wpan_dev - > csma_retries ;
params - > frame_retries = wpan_dev - > frame_retries ;
params - > lbt = wpan_dev - > lbt ;
2014-10-28 20:21:30 +03:00
}
2015-12-24 00:36:32 +03:00
static const struct ieee802154_llsec_ops mac802154_llsec_ops = {
2014-05-16 19:46:42 +04:00
. 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-06-26 03:24:48 +04:00
struct ieee802154_mlme_ops mac802154_mlme_wpan = {
2012-06-26 03:24:52 +04:00
. start_req = mac802154_mlme_start_req ,
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
} ;