2012-05-16 00:50:26 +04:00
/*
* 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 :
* Dmitry Eremin - Solenikov < dbaryshkov @ gmail . com >
* Sergey Lapin < slapin @ ossfans . org >
* Maxim Gorbachyov < maxim . gorbachev @ siemens . com >
* Alexander Smirnov < alex . bluesman . smirnov @ gmail . com >
*/
# include <linux/if_arp.h>
# include <net/mac802154.h>
2014-03-15 00:23:59 +04:00
# include <net/ieee802154_netdev.h>
2014-10-25 11:41:02 +04:00
# include <net/cfg802154.h>
2012-05-16 00:50:26 +04:00
2014-10-25 11:41:00 +04:00
# include "ieee802154_i.h"
2014-10-28 20:21:21 +03:00
# include "driver-ops.h"
2012-05-16 00:50:26 +04:00
2012-06-26 03:24:51 +04:00
void mac802154_dev_set_page_channel ( struct net_device * dev , u8 page , u8 chan )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-10-28 20:21:29 +03:00
struct ieee802154_local * local = sdata - > local ;
int res ;
2012-06-26 03:24:51 +04:00
2015-05-22 18:43:52 +03:00
ASSERT_RTNL ( ) ;
2012-06-26 03:24:51 +04:00
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-28 20:21:29 +03:00
res = drv_set_channel ( local , page , chan ) ;
if ( res ) {
pr_debug ( " set_channel failed \n " ) ;
2014-07-02 07:31:09 +04:00
} else {
2014-10-28 20:21:29 +03:00
local - > phy - > current_channel = chan ;
local - > phy - > current_page = page ;
2014-07-02 07:31:09 +04:00
}
2012-06-26 03:24:51 +04:00
}
2014-05-16 19:46:42 +04:00
int mac802154_get_params ( struct net_device * dev ,
struct ieee802154_llsec_params * params )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-05-16 19:46:42 +04:00
int res ;
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-25 19:16:36 +04:00
mutex_lock ( & sdata - > sec_mtx ) ;
res = mac802154_llsec_get_params ( & sdata - > sec , params ) ;
mutex_unlock ( & sdata - > sec_mtx ) ;
2014-05-16 19:46:42 +04:00
return res ;
}
int mac802154_set_params ( struct net_device * dev ,
const struct ieee802154_llsec_params * params ,
int changed )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-05-16 19:46:42 +04:00
int res ;
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-25 19:16:36 +04:00
mutex_lock ( & sdata - > sec_mtx ) ;
res = mac802154_llsec_set_params ( & sdata - > sec , params , changed ) ;
mutex_unlock ( & sdata - > sec_mtx ) ;
2014-05-16 19:46:42 +04:00
return res ;
}
int mac802154_add_key ( struct net_device * dev ,
const struct ieee802154_llsec_key_id * id ,
const struct ieee802154_llsec_key * key )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-05-16 19:46:42 +04:00
int res ;
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-25 19:16:36 +04:00
mutex_lock ( & sdata - > sec_mtx ) ;
res = mac802154_llsec_key_add ( & sdata - > sec , id , key ) ;
mutex_unlock ( & sdata - > sec_mtx ) ;
2014-05-16 19:46:42 +04:00
return res ;
}
int mac802154_del_key ( struct net_device * dev ,
const struct ieee802154_llsec_key_id * id )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-05-16 19:46:42 +04:00
int res ;
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-25 19:16:36 +04:00
mutex_lock ( & sdata - > sec_mtx ) ;
res = mac802154_llsec_key_del ( & sdata - > sec , id ) ;
mutex_unlock ( & sdata - > sec_mtx ) ;
2014-05-16 19:46:42 +04:00
return res ;
}
int mac802154_add_dev ( struct net_device * dev ,
const struct ieee802154_llsec_device * llsec_dev )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-05-16 19:46:42 +04:00
int res ;
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-25 19:16:36 +04:00
mutex_lock ( & sdata - > sec_mtx ) ;
res = mac802154_llsec_dev_add ( & sdata - > sec , llsec_dev ) ;
mutex_unlock ( & sdata - > sec_mtx ) ;
2014-05-16 19:46:42 +04:00
return res ;
}
int mac802154_del_dev ( struct net_device * dev , __le64 dev_addr )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-05-16 19:46:42 +04:00
int res ;
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-25 19:16:36 +04:00
mutex_lock ( & sdata - > sec_mtx ) ;
res = mac802154_llsec_dev_del ( & sdata - > sec , dev_addr ) ;
mutex_unlock ( & sdata - > sec_mtx ) ;
2014-05-16 19:46:42 +04:00
return res ;
}
int mac802154_add_devkey ( struct net_device * dev ,
__le64 device_addr ,
const struct ieee802154_llsec_device_key * key )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-05-16 19:46:42 +04:00
int res ;
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-25 19:16:36 +04:00
mutex_lock ( & sdata - > sec_mtx ) ;
res = mac802154_llsec_devkey_add ( & sdata - > sec , device_addr , key ) ;
mutex_unlock ( & sdata - > sec_mtx ) ;
2014-05-16 19:46:42 +04:00
return res ;
}
int mac802154_del_devkey ( struct net_device * dev ,
__le64 device_addr ,
const struct ieee802154_llsec_device_key * key )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-05-16 19:46:42 +04:00
int res ;
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-25 19:16:36 +04:00
mutex_lock ( & sdata - > sec_mtx ) ;
res = mac802154_llsec_devkey_del ( & sdata - > sec , device_addr , key ) ;
mutex_unlock ( & sdata - > sec_mtx ) ;
2014-05-16 19:46:42 +04:00
return res ;
}
int mac802154_add_seclevel ( struct net_device * dev ,
const struct ieee802154_llsec_seclevel * sl )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-05-16 19:46:42 +04:00
int res ;
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-25 19:16:36 +04:00
mutex_lock ( & sdata - > sec_mtx ) ;
res = mac802154_llsec_seclevel_add ( & sdata - > sec , sl ) ;
mutex_unlock ( & sdata - > sec_mtx ) ;
2014-05-16 19:46:42 +04:00
return res ;
}
int mac802154_del_seclevel ( struct net_device * dev ,
const struct ieee802154_llsec_seclevel * sl )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-05-16 19:46:42 +04:00
int res ;
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-25 19:16:36 +04:00
mutex_lock ( & sdata - > sec_mtx ) ;
res = mac802154_llsec_seclevel_del ( & sdata - > sec , sl ) ;
mutex_unlock ( & sdata - > sec_mtx ) ;
2014-05-16 19:46:42 +04:00
return res ;
}
void mac802154_lock_table ( struct net_device * dev )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-05-16 19:46:42 +04:00
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-25 19:16:36 +04:00
mutex_lock ( & sdata - > sec_mtx ) ;
2014-05-16 19:46:42 +04:00
}
void mac802154_get_table ( struct net_device * dev ,
struct ieee802154_llsec_table * * t )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-05-16 19:46:42 +04:00
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-25 19:16:36 +04:00
* t = & sdata - > sec . table ;
2014-05-16 19:46:42 +04:00
}
void mac802154_unlock_table ( struct net_device * dev )
{
2014-10-25 19:16:40 +04:00
struct ieee802154_sub_if_data * sdata = IEEE802154_DEV_TO_SUB_IF ( dev ) ;
2014-05-16 19:46:42 +04:00
BUG_ON ( dev - > type ! = ARPHRD_IEEE802154 ) ;
2014-10-25 19:16:36 +04:00
mutex_unlock ( & sdata - > sec_mtx ) ;
2014-05-16 19:46:42 +04:00
}