linux/net/ieee802154/netlink.c
<<
>>
Prefs
   1/*
   2 * Netlink interface for IEEE 802.15.4 stack
   3 *
   4 * Copyright 2007, 2008 Siemens AG
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2
   8 * as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful,
  11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13 * GNU General Public License for more details.
  14 *
  15 * Written by:
  16 * Sergey Lapin <slapin@ossfans.org>
  17 * Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
  18 * Maxim Osipov <maxim.osipov@siemens.com>
  19 */
  20
  21#include <linux/kernel.h>
  22#include <linux/gfp.h>
  23#include <net/genetlink.h>
  24#include <linux/nl802154.h>
  25
  26#include "ieee802154.h"
  27
  28static unsigned int ieee802154_seq_num;
  29static DEFINE_SPINLOCK(ieee802154_seq_lock);
  30
  31struct genl_family nl802154_family = {
  32        .id             = GENL_ID_GENERATE,
  33        .hdrsize        = 0,
  34        .name           = IEEE802154_NL_NAME,
  35        .version        = 1,
  36        .maxattr        = IEEE802154_ATTR_MAX,
  37};
  38
  39/* Requests to userspace */
  40struct sk_buff *ieee802154_nl_create(int flags, u8 req)
  41{
  42        void *hdr;
  43        struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
  44        unsigned long f;
  45
  46        if (!msg)
  47                return NULL;
  48
  49        spin_lock_irqsave(&ieee802154_seq_lock, f);
  50        hdr = genlmsg_put(msg, 0, ieee802154_seq_num++,
  51                          &nl802154_family, flags, req);
  52        spin_unlock_irqrestore(&ieee802154_seq_lock, f);
  53        if (!hdr) {
  54                nlmsg_free(msg);
  55                return NULL;
  56        }
  57
  58        return msg;
  59}
  60
  61int ieee802154_nl_mcast(struct sk_buff *msg, unsigned int group)
  62{
  63        struct nlmsghdr *nlh = nlmsg_hdr(msg);
  64        void *hdr = genlmsg_data(nlmsg_data(nlh));
  65
  66        genlmsg_end(msg, hdr);
  67
  68        return genlmsg_multicast(&nl802154_family, msg, 0, group, GFP_ATOMIC);
  69}
  70
  71struct sk_buff *ieee802154_nl_new_reply(struct genl_info *info,
  72                                        int flags, u8 req)
  73{
  74        void *hdr;
  75        struct sk_buff *msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
  76
  77        if (!msg)
  78                return NULL;
  79
  80        hdr = genlmsg_put_reply(msg, info,
  81                                &nl802154_family, flags, req);
  82        if (!hdr) {
  83                nlmsg_free(msg);
  84                return NULL;
  85        }
  86
  87        return msg;
  88}
  89
  90int ieee802154_nl_reply(struct sk_buff *msg, struct genl_info *info)
  91{
  92        struct nlmsghdr *nlh = nlmsg_hdr(msg);
  93        void *hdr = genlmsg_data(nlmsg_data(nlh));
  94
  95        genlmsg_end(msg, hdr);
  96
  97        return genlmsg_reply(msg, info);
  98}
  99
 100static const struct genl_ops ieee8021154_ops[] = {
 101        /* see nl-phy.c */
 102        IEEE802154_DUMP(IEEE802154_LIST_PHY, ieee802154_list_phy,
 103                        ieee802154_dump_phy),
 104        IEEE802154_OP(IEEE802154_ADD_IFACE, ieee802154_add_iface),
 105        IEEE802154_OP(IEEE802154_DEL_IFACE, ieee802154_del_iface),
 106        /* see nl-mac.c */
 107        IEEE802154_OP(IEEE802154_ASSOCIATE_REQ, ieee802154_associate_req),
 108        IEEE802154_OP(IEEE802154_ASSOCIATE_RESP, ieee802154_associate_resp),
 109        IEEE802154_OP(IEEE802154_DISASSOCIATE_REQ, ieee802154_disassociate_req),
 110        IEEE802154_OP(IEEE802154_SCAN_REQ, ieee802154_scan_req),
 111        IEEE802154_OP(IEEE802154_START_REQ, ieee802154_start_req),
 112        IEEE802154_DUMP(IEEE802154_LIST_IFACE, ieee802154_list_iface,
 113                        ieee802154_dump_iface),
 114        IEEE802154_OP(IEEE802154_SET_MACPARAMS, ieee802154_set_macparams),
 115        IEEE802154_OP(IEEE802154_LLSEC_GETPARAMS, ieee802154_llsec_getparams),
 116        IEEE802154_OP(IEEE802154_LLSEC_SETPARAMS, ieee802154_llsec_setparams),
 117        IEEE802154_DUMP(IEEE802154_LLSEC_LIST_KEY, NULL,
 118                        ieee802154_llsec_dump_keys),
 119        IEEE802154_OP(IEEE802154_LLSEC_ADD_KEY, ieee802154_llsec_add_key),
 120        IEEE802154_OP(IEEE802154_LLSEC_DEL_KEY, ieee802154_llsec_del_key),
 121        IEEE802154_DUMP(IEEE802154_LLSEC_LIST_DEV, NULL,
 122                        ieee802154_llsec_dump_devs),
 123        IEEE802154_OP(IEEE802154_LLSEC_ADD_DEV, ieee802154_llsec_add_dev),
 124        IEEE802154_OP(IEEE802154_LLSEC_DEL_DEV, ieee802154_llsec_del_dev),
 125        IEEE802154_DUMP(IEEE802154_LLSEC_LIST_DEVKEY, NULL,
 126                        ieee802154_llsec_dump_devkeys),
 127        IEEE802154_OP(IEEE802154_LLSEC_ADD_DEVKEY, ieee802154_llsec_add_devkey),
 128        IEEE802154_OP(IEEE802154_LLSEC_DEL_DEVKEY, ieee802154_llsec_del_devkey),
 129        IEEE802154_DUMP(IEEE802154_LLSEC_LIST_SECLEVEL, NULL,
 130                        ieee802154_llsec_dump_seclevels),
 131        IEEE802154_OP(IEEE802154_LLSEC_ADD_SECLEVEL,
 132                      ieee802154_llsec_add_seclevel),
 133        IEEE802154_OP(IEEE802154_LLSEC_DEL_SECLEVEL,
 134                      ieee802154_llsec_del_seclevel),
 135};
 136
 137static const struct genl_multicast_group ieee802154_mcgrps[] = {
 138        [IEEE802154_COORD_MCGRP] = { .name = IEEE802154_MCAST_COORD_NAME, },
 139        [IEEE802154_BEACON_MCGRP] = { .name = IEEE802154_MCAST_BEACON_NAME, },
 140};
 141
 142int __init ieee802154_nl_init(void)
 143{
 144        return genl_register_family_with_ops_groups(&nl802154_family,
 145                                                    ieee8021154_ops,
 146                                                    ieee802154_mcgrps);
 147}
 148
 149void ieee802154_nl_exit(void)
 150{
 151        genl_unregister_family(&nl802154_family);
 152}
 153