Merge branch 'davinci-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[deliverable/linux.git] / net / ieee802154 / netlink.c
index cd0567f067164b48e16c7091e3c24d4e2c88ed9a..ca767bde17a455a2f426e57dc1e2dc1db471c4a4 100644 (file)
@@ -35,6 +35,7 @@
 #include <net/ieee802154_netdev.h>
 
 static unsigned int ieee802154_seq_num;
+static DEFINE_SPINLOCK(ieee802154_seq_lock);
 
 static struct genl_family ieee802154_coordinator_family = {
        .id             = GENL_ID_GENERATE,
@@ -57,12 +58,15 @@ static struct sk_buff *ieee802154_nl_create(int flags, u8 req)
 {
        void *hdr;
        struct sk_buff *msg = nlmsg_new(NLMSG_GOODSIZE, GFP_ATOMIC);
+       unsigned long f;
 
        if (!msg)
                return NULL;
 
+       spin_lock_irqsave(&ieee802154_seq_lock, f);
        hdr = genlmsg_put(msg, 0, ieee802154_seq_num++,
                        &ieee802154_coordinator_family, flags, req);
+       spin_unlock_irqrestore(&ieee802154_seq_lock, f);
        if (!hdr) {
                nlmsg_free(msg);
                return NULL;
@@ -232,7 +236,7 @@ nla_put_failure:
 EXPORT_SYMBOL(ieee802154_nl_beacon_indic);
 
 int ieee802154_nl_scan_confirm(struct net_device *dev,
-               u8 status, u8 scan_type, u32 unscanned,
+               u8 status, u8 scan_type, u32 unscanned, u8 page,
                u8 *edl/* , struct list_head *pan_desc_list */)
 {
        struct sk_buff *msg;
@@ -251,6 +255,7 @@ int ieee802154_nl_scan_confirm(struct net_device *dev,
        NLA_PUT_U8(msg, IEEE802154_ATTR_STATUS, status);
        NLA_PUT_U8(msg, IEEE802154_ATTR_SCAN_TYPE, scan_type);
        NLA_PUT_U32(msg, IEEE802154_ATTR_CHANNELS, unscanned);
+       NLA_PUT_U8(msg, IEEE802154_ATTR_PAGE, page);
 
        if (edl)
                NLA_PUT(msg, IEEE802154_ATTR_ED_LIST, 27, edl);
@@ -349,6 +354,7 @@ static int ieee802154_associate_req(struct sk_buff *skb,
 {
        struct net_device *dev;
        struct ieee802154_addr addr;
+       u8 page;
        int ret = -EINVAL;
 
        if (!info->attrs[IEEE802154_ATTR_CHANNEL] ||
@@ -374,8 +380,14 @@ static int ieee802154_associate_req(struct sk_buff *skb,
        }
        addr.pan_id = nla_get_u16(info->attrs[IEEE802154_ATTR_COORD_PAN_ID]);
 
+       if (info->attrs[IEEE802154_ATTR_PAGE])
+               page = nla_get_u8(info->attrs[IEEE802154_ATTR_PAGE]);
+       else
+               page = 0;
+
        ret = ieee802154_mlme_ops(dev)->assoc_req(dev, &addr,
                        nla_get_u8(info->attrs[IEEE802154_ATTR_CHANNEL]),
+                       page,
                        nla_get_u8(info->attrs[IEEE802154_ATTR_CAPABILITY]));
 
        dev_put(dev);
@@ -458,6 +470,7 @@ static int ieee802154_start_req(struct sk_buff *skb, struct genl_info *info)
        struct ieee802154_addr addr;
 
        u8 channel, bcn_ord, sf_ord;
+       u8 page;
        int pan_coord, blx, coord_realign;
        int ret;
 
@@ -488,13 +501,19 @@ static int ieee802154_start_req(struct sk_buff *skb, struct genl_info *info)
        blx = nla_get_u8(info->attrs[IEEE802154_ATTR_BAT_EXT]);
        coord_realign = nla_get_u8(info->attrs[IEEE802154_ATTR_COORD_REALIGN]);
 
+       if (info->attrs[IEEE802154_ATTR_PAGE])
+               page = nla_get_u8(info->attrs[IEEE802154_ATTR_PAGE]);
+       else
+               page = 0;
+
+
        if (addr.short_addr == IEEE802154_ADDR_BROADCAST) {
                ieee802154_nl_start_confirm(dev, IEEE802154_NO_SHORT_ADDRESS);
                dev_put(dev);
                return -EINVAL;
        }
 
-       ret = ieee802154_mlme_ops(dev)->start_req(dev, &addr, channel,
+       ret = ieee802154_mlme_ops(dev)->start_req(dev, &addr, channel, page,
                bcn_ord, sf_ord, pan_coord, blx, coord_realign);
 
        dev_put(dev);
@@ -508,6 +527,7 @@ static int ieee802154_scan_req(struct sk_buff *skb, struct genl_info *info)
        u8 type;
        u32 channels;
        u8 duration;
+       u8 page;
 
        if (!info->attrs[IEEE802154_ATTR_SCAN_TYPE] ||
            !info->attrs[IEEE802154_ATTR_CHANNELS] ||
@@ -522,7 +542,13 @@ static int ieee802154_scan_req(struct sk_buff *skb, struct genl_info *info)
        channels = nla_get_u32(info->attrs[IEEE802154_ATTR_CHANNELS]);
        duration = nla_get_u8(info->attrs[IEEE802154_ATTR_DURATION]);
 
-       ret = ieee802154_mlme_ops(dev)->scan_req(dev, type, channels,
+       if (info->attrs[IEEE802154_ATTR_PAGE])
+               page = nla_get_u8(info->attrs[IEEE802154_ATTR_PAGE]);
+       else
+               page = 0;
+
+
+       ret = ieee802154_mlme_ops(dev)->scan_req(dev, type, channels, page,
                        duration);
 
        dev_put(dev);
This page took 0.025264 seconds and 5 git commands to generate.