linux/net/mac802154/mib.c
<<
>>
Prefs
   1/*
   2 * Copyright 2007-2012 Siemens AG
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License version 2
   6 * as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope that it will be useful,
   9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11 * GNU General Public License for more details.
  12 *
  13 * Written by:
  14 * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
  15 * Sergey Lapin <slapin@ossfans.org>
  16 * Maxim Gorbachyov <maxim.gorbachev@siemens.com>
  17 * Alexander Smirnov <alex.bluesman.smirnov@gmail.com>
  18 */
  19
  20#include <linux/if_arp.h>
  21
  22#include <net/mac802154.h>
  23#include <net/ieee802154_netdev.h>
  24#include <net/cfg802154.h>
  25
  26#include "ieee802154_i.h"
  27#include "driver-ops.h"
  28
  29void mac802154_dev_set_page_channel(struct net_device *dev, u8 page, u8 chan)
  30{
  31        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
  32        struct ieee802154_local *local = sdata->local;
  33        int res;
  34
  35        ASSERT_RTNL();
  36
  37        BUG_ON(dev->type != ARPHRD_IEEE802154);
  38
  39        res = drv_set_channel(local, page, chan);
  40        if (res) {
  41                pr_debug("set_channel failed\n");
  42        } else {
  43                local->phy->current_channel = chan;
  44                local->phy->current_page = page;
  45        }
  46}
  47
  48int mac802154_get_params(struct net_device *dev,
  49                         struct ieee802154_llsec_params *params)
  50{
  51        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
  52        int res;
  53
  54        BUG_ON(dev->type != ARPHRD_IEEE802154);
  55
  56        mutex_lock(&sdata->sec_mtx);
  57        res = mac802154_llsec_get_params(&sdata->sec, params);
  58        mutex_unlock(&sdata->sec_mtx);
  59
  60        return res;
  61}
  62
  63int mac802154_set_params(struct net_device *dev,
  64                         const struct ieee802154_llsec_params *params,
  65                         int changed)
  66{
  67        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
  68        int res;
  69
  70        BUG_ON(dev->type != ARPHRD_IEEE802154);
  71
  72        mutex_lock(&sdata->sec_mtx);
  73        res = mac802154_llsec_set_params(&sdata->sec, params, changed);
  74        mutex_unlock(&sdata->sec_mtx);
  75
  76        return res;
  77}
  78
  79int mac802154_add_key(struct net_device *dev,
  80                      const struct ieee802154_llsec_key_id *id,
  81                      const struct ieee802154_llsec_key *key)
  82{
  83        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
  84        int res;
  85
  86        BUG_ON(dev->type != ARPHRD_IEEE802154);
  87
  88        mutex_lock(&sdata->sec_mtx);
  89        res = mac802154_llsec_key_add(&sdata->sec, id, key);
  90        mutex_unlock(&sdata->sec_mtx);
  91
  92        return res;
  93}
  94
  95int mac802154_del_key(struct net_device *dev,
  96                      const struct ieee802154_llsec_key_id *id)
  97{
  98        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
  99        int res;
 100
 101        BUG_ON(dev->type != ARPHRD_IEEE802154);
 102
 103        mutex_lock(&sdata->sec_mtx);
 104        res = mac802154_llsec_key_del(&sdata->sec, id);
 105        mutex_unlock(&sdata->sec_mtx);
 106
 107        return res;
 108}
 109
 110int mac802154_add_dev(struct net_device *dev,
 111                      const struct ieee802154_llsec_device *llsec_dev)
 112{
 113        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 114        int res;
 115
 116        BUG_ON(dev->type != ARPHRD_IEEE802154);
 117
 118        mutex_lock(&sdata->sec_mtx);
 119        res = mac802154_llsec_dev_add(&sdata->sec, llsec_dev);
 120        mutex_unlock(&sdata->sec_mtx);
 121
 122        return res;
 123}
 124
 125int mac802154_del_dev(struct net_device *dev, __le64 dev_addr)
 126{
 127        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 128        int res;
 129
 130        BUG_ON(dev->type != ARPHRD_IEEE802154);
 131
 132        mutex_lock(&sdata->sec_mtx);
 133        res = mac802154_llsec_dev_del(&sdata->sec, dev_addr);
 134        mutex_unlock(&sdata->sec_mtx);
 135
 136        return res;
 137}
 138
 139int mac802154_add_devkey(struct net_device *dev,
 140                         __le64 device_addr,
 141                         const struct ieee802154_llsec_device_key *key)
 142{
 143        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 144        int res;
 145
 146        BUG_ON(dev->type != ARPHRD_IEEE802154);
 147
 148        mutex_lock(&sdata->sec_mtx);
 149        res = mac802154_llsec_devkey_add(&sdata->sec, device_addr, key);
 150        mutex_unlock(&sdata->sec_mtx);
 151
 152        return res;
 153}
 154
 155int mac802154_del_devkey(struct net_device *dev,
 156                         __le64 device_addr,
 157                         const struct ieee802154_llsec_device_key *key)
 158{
 159        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 160        int res;
 161
 162        BUG_ON(dev->type != ARPHRD_IEEE802154);
 163
 164        mutex_lock(&sdata->sec_mtx);
 165        res = mac802154_llsec_devkey_del(&sdata->sec, device_addr, key);
 166        mutex_unlock(&sdata->sec_mtx);
 167
 168        return res;
 169}
 170
 171int mac802154_add_seclevel(struct net_device *dev,
 172                           const struct ieee802154_llsec_seclevel *sl)
 173{
 174        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 175        int res;
 176
 177        BUG_ON(dev->type != ARPHRD_IEEE802154);
 178
 179        mutex_lock(&sdata->sec_mtx);
 180        res = mac802154_llsec_seclevel_add(&sdata->sec, sl);
 181        mutex_unlock(&sdata->sec_mtx);
 182
 183        return res;
 184}
 185
 186int mac802154_del_seclevel(struct net_device *dev,
 187                           const struct ieee802154_llsec_seclevel *sl)
 188{
 189        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 190        int res;
 191
 192        BUG_ON(dev->type != ARPHRD_IEEE802154);
 193
 194        mutex_lock(&sdata->sec_mtx);
 195        res = mac802154_llsec_seclevel_del(&sdata->sec, sl);
 196        mutex_unlock(&sdata->sec_mtx);
 197
 198        return res;
 199}
 200
 201void mac802154_lock_table(struct net_device *dev)
 202{
 203        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 204
 205        BUG_ON(dev->type != ARPHRD_IEEE802154);
 206
 207        mutex_lock(&sdata->sec_mtx);
 208}
 209
 210void mac802154_get_table(struct net_device *dev,
 211                         struct ieee802154_llsec_table **t)
 212{
 213        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 214
 215        BUG_ON(dev->type != ARPHRD_IEEE802154);
 216
 217        *t = &sdata->sec.table;
 218}
 219
 220void mac802154_unlock_table(struct net_device *dev)
 221{
 222        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
 223
 224        BUG_ON(dev->type != ARPHRD_IEEE802154);
 225
 226        mutex_unlock(&sdata->sec_mtx);
 227}
 228