1a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam/*
2a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * Copyright (C) 2014 The Android Open Source Project
3a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam *
4a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * Licensed under the Apache License, Version 2.0 (the "License");
5a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * you may not use this file except in compliance with the License.
6a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * You may obtain a copy of the License at
7a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam *
8a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam *     http://www.apache.org/licenses/LICENSE-2.0
9a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam *
10a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * Unless required by applicable law or agreed to in writing, software
11a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * distributed under the License is distributed on an "AS IS" BASIS,
12a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * See the License for the specific language governing permissions and
14a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam * limitations under the License.
15a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam */
16a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#ifndef __WIFI_HAL_CPP_BINDINGS_H__
17a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#define __WIFI_HAL_CPP_BINDINGS_H__
18b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
19b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "wifi_hal.h"
20b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "common.h"
21b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#include "sync.h"
22b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
23b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeclass WifiEvent
24b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
25b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    /* TODO: remove this when nl headers are updated */
26b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    static const unsigned NL80211_ATTR_MAX_INTERNAL = 256;
27b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeprivate:
28b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    struct nl_msg *mMsg;
29b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    struct genlmsghdr *mHeader;
30b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    struct nlattr *mAttributes[NL80211_ATTR_MAX_INTERNAL + 1];
31b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
32b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndepublic:
33b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    WifiEvent(nl_msg *msg) {
34b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        mMsg = msg;
35b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        mHeader = NULL;
36b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        memset(mAttributes, 0, sizeof(mAttributes));
37b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
38b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    ~WifiEvent() {
39b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        /* don't destroy mMsg; it doesn't belong to us */
40b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
41b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
42b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    void log();
43b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
44b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int parse();
45b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
46b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    genlmsghdr *header() {
47b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mHeader;
48b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
49b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
50b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int get_cmd() {
51b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mHeader->cmd;
52b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
53b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
54b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int get_vendor_id() {
55b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return get_u32(NL80211_ATTR_VENDOR_ID);
56b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
57b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
58b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int get_vendor_subcmd() {
59b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return get_u32(NL80211_ATTR_VENDOR_SUBCMD);
60b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
61b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
62b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    void *get_vendor_data() {
63b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return get_data(NL80211_ATTR_VENDOR_DATA);
64b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
65b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
66b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int get_vendor_data_len() {
67b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return get_len(NL80211_ATTR_VENDOR_DATA);
68b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
69b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
70b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    const char *get_cmdString();
71b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
72b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    nlattr ** attributes() {
73b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mAttributes;
74b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
75b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
76b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    nlattr *get_attribute(int attribute) {
77b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mAttributes[attribute];
78b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
79b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
80b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    uint8_t get_u8(int attribute) {
81b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mAttributes[attribute] ? nla_get_u8(mAttributes[attribute]) : 0;
82b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
83b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
84b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    uint16_t get_u16(int attribute) {
85b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mAttributes[attribute] ? nla_get_u16(mAttributes[attribute]) : 0;
86b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
87b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
88b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    uint32_t get_u32(int attribute) {
89b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mAttributes[attribute] ? nla_get_u32(mAttributes[attribute]) : 0;
90b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
91b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
92b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    uint64_t get_u64(int attribute) {
93b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mAttributes[attribute] ? nla_get_u64(mAttributes[attribute]) : 0;
94b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
95b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
96b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int get_len(int attribute) {
97b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mAttributes[attribute] ? nla_len(mAttributes[attribute]) : 0;
98b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
99b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
100b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    void *get_data(int attribute) {
101b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mAttributes[attribute] ? nla_data(mAttributes[attribute]) : NULL;
102b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
103b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
104b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeprivate:
105b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    WifiEvent(const WifiEvent&);        // hide copy constructor to prevent copies
106b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde};
107b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
108b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeclass nl_iterator {
109b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    struct nlattr *pos;
110b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int rem;
111b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndepublic:
112b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    nl_iterator(struct nlattr *attr) {
113b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        pos = (struct nlattr *)nla_data(attr);
114b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        rem = nla_len(attr);
115b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
116b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    bool has_next() {
117b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return nla_ok(pos, rem);
118b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
119b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    void next() {
120b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        pos = (struct nlattr *)nla_next(pos, &(rem));
121b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
122b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    struct nlattr *get() {
123b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return pos;
124b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
125b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    uint16_t get_type() {
126b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return pos->nla_type;
127b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
128b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    uint8_t get_u8() {
129b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return nla_get_u8(pos);
130b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
131b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    uint16_t get_u16() {
132b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return nla_get_u16(pos);
133b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
134b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    uint32_t get_u32() {
135b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return nla_get_u32(pos);
136b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
137b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    uint64_t get_u64() {
138b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return nla_get_u64(pos);
139b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
140b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    void* get_data() {
141b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return nla_data(pos);
142b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
143b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int get_len() {
144b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return nla_len(pos);
145b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
146b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeprivate:
147b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    nl_iterator(const nl_iterator&);    // hide copy constructor to prevent copies
148b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde};
149b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
150b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeclass WifiRequest
151b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
152b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeprivate:
153b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int mFamily;
154b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int mIface;
155b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    struct nl_msg *mMsg;
156b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
157b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndepublic:
158b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    WifiRequest(int family) {
159b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        mMsg = NULL;
160b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        mFamily = family;
161b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        mIface = -1;
162b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
163b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
164b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    WifiRequest(int family, int iface) {
165b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        mMsg = NULL;
166b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        mFamily = family;
167b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        mIface = iface;
168b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
169b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
170b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    ~WifiRequest() {
171b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        destroy();
172b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
173b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
174b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    void destroy() {
175b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        if (mMsg) {
176b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde            nlmsg_free(mMsg);
177b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde            mMsg = NULL;
178b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        }
179b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
180b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
181b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    nl_msg *getMessage() {
182b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mMsg;
183b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
184b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
185b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    /* Command assembly helpers */
1869b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error create(int family, uint8_t cmd, int flags, int hdrlen);
1879b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error create(uint8_t cmd, int flags, int hdrlen) {
188a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam        return create(mFamily, cmd, flags, hdrlen);
189a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    }
1909b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error create(uint8_t cmd) {
191b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return create(mFamily, cmd, 0, 0);
192b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
193b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1949b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error create(uint32_t id, int subcmd);
195b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
1969b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error wifi_nla_put(struct nl_msg *msg, int attr,
1979b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik                            int attrlen, const void *data)
1989b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    {
1999b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        int status;
2009b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik
2019b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        status = nla_put(msg, attr, attrlen, data);
2029b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik	if (status < 0)
2039b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik            ALOGE("Failed to put attr with size = %d, type = %d, error = %d",
2049b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik                  attrlen, attr, status);
2059b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        return mapKernelErrortoWifiHalError(status);
2069b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    }
2079b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error put_u8(int attribute, uint8_t value) {
2089b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        return wifi_nla_put(mMsg, attribute, sizeof(value), &value);
209b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
2109b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error put_u16(int attribute, uint16_t value) {
2119b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        return wifi_nla_put(mMsg, attribute, sizeof(value), &value);
212b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
2139b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error put_u32(int attribute, uint32_t value) {
2149b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        return wifi_nla_put(mMsg, attribute, sizeof(value), &value);
215b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
2168abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
2179b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error put_u64(int attribute, uint64_t value) {
2189b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        return wifi_nla_put(mMsg, attribute, sizeof(value), &value);
2194af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
2204af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
2219b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error put_s8(int attribute, s8 value) {
2229b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        return wifi_nla_put(mMsg, attribute, sizeof(int8_t), &value);
2234af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
2249b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error put_s16(int attribute, s16 value) {
2259b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        return wifi_nla_put(mMsg, attribute, sizeof(int16_t), &value);
2264af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
2279b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error put_s32(int attribute, s32 value) {
2289b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        return wifi_nla_put(mMsg, attribute, sizeof(int32_t), &value);
2298abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam    }
2309b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error put_s64(int attribute, s64 value) {
2319b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        return wifi_nla_put(mMsg, attribute, sizeof(int64_t), &value);
2329b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    }
2339b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error put_flag(int attribute) {
2349b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        int status;
2359b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik
2369b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        status =  nla_put_flag(mMsg, attribute);
2379b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        if(status < 0)
2389b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik           ALOGE("Failed to put flag attr of type = %d, error = %d",
2399b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik                  attribute, status);
2409b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        return mapKernelErrortoWifiHalError(status);
2414af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
2428abcd11e6ffef0ed6948497ff03df2c55abc5bb9Amarnath Hullur Subramanyam
2434af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    u8 get_u8(const struct nlattr *nla)
2444af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    {
2454af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        return *(u8 *) nla_data(nla);
2464af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
2474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    u16 get_u16(const struct nlattr *nla)
2484af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    {
2494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        return *(u16 *) nla_data(nla);
2504af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
2514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    u32 get_u32(const struct nlattr *nla)
2524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    {
2534af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        return *(u32 *) nla_data(nla);
254b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
2554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    u64 get_u64(const struct nlattr *nla)
2564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    {
2574af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        return *(u64 *) nla_data(nla);
2584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
2594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
2604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    s8 get_s8(const struct nlattr *nla)
2614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    {
2624af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        return *(s8 *) nla_data(nla);
2634af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
2644af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
2654af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    s16 get_s16(const struct nlattr *nla)
2664af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    {
2674af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        return *(s16 *) nla_data(nla);
2684af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
2694af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    s32 get_s32(const struct nlattr *nla)
2704af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    {
2714af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        return *(s32 *) nla_data(nla);
2724af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
2734af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    s64 get_s64(const struct nlattr *nla)
2744af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    {
2754af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam        return *(s64 *) nla_data(nla);
2764af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    }
2774af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
2789b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error put_string(int attribute, const char *value) {
2799b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        return wifi_nla_put(mMsg, attribute, strlen(value) + 1, value);
280b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
2819b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error put_addr(int attribute, mac_addr value) {
2829b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        return wifi_nla_put(mMsg, attribute, sizeof(mac_addr), value);
283b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
284b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
285b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    struct nlattr * attr_start(int attribute) {
286b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return nla_nest_start(mMsg, attribute);
287b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
288b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    void attr_end(struct nlattr *attr) {
289b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        nla_nest_end(mMsg, attr);
290b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
291b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
2929b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error set_iface_id(int ifindex) {
293b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return put_u32(NL80211_ATTR_IFINDEX, ifindex);
294b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
295a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
2969b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error put_bytes(int attribute, const char *data, int len) {
2979b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik        return wifi_nla_put(mMsg, attribute, len, data);
298a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    }
299ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam
300b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeprivate:
301b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    WifiRequest(const WifiRequest&);        // hide copy constructor to prevent copies
302b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
303b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde};
304b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
305b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeclass WifiCommand
306b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde{
307b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeprotected:
308b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    hal_info *mInfo;
309b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    WifiRequest mMsg;
310b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    Condition mCondition;
311b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    wifi_request_id mId;
312b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    interface_info *mIfaceInfo;
313b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndepublic:
314b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    WifiCommand(wifi_handle handle, wifi_request_id id)
315b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde            : mMsg(getHalInfo(handle)->nl80211_family_id), mId(id)
316b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    {
317b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        mIfaceInfo = NULL;
318b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        mInfo = getHalInfo(handle);
319b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
320b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
321b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    WifiCommand(wifi_interface_handle iface, wifi_request_id id)
322b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde            : mMsg(getHalInfo(iface)->nl80211_family_id, getIfaceInfo(iface)->id), mId(id)
323b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    {
324b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        mIfaceInfo = getIfaceInfo(iface);
325b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        mInfo = getHalInfo(iface);
326b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
327b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
328b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    virtual ~WifiCommand() {
329b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
330b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
331b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    wifi_request_id id() {
332b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mId;
333b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
334b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3359b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error create() {
336b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        /* by default there is no way to cancel */
337b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return WIFI_ERROR_NOT_SUPPORTED;
338b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
339b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3409b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error cancel() {
341b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        /* by default there is no way to cancel */
342b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return WIFI_ERROR_NOT_SUPPORTED;
343b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
344b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3459b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error requestResponse();
3469b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error requestEvent(int cmd);
3479b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error requestVendorEvent(uint32_t id, int subcmd);
3489b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error requestResponse(WifiRequest& request);
349b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
350b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeprotected:
351b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    wifi_handle wifiHandle() {
352b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return getWifiHandle(mInfo);
353b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
354b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
355b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    wifi_interface_handle ifaceHandle() {
356b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return getIfaceHandle(mIfaceInfo);
357b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
358b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
359b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int familyId() {
360b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mInfo->nl80211_family_id;
361b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
362b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
363b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int ifaceId() {
364b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return mIfaceInfo->id;
365b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
366b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
367b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    /* Override this method to parse reply and dig out data; save it in the object */
368b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    virtual int handleResponse(WifiEvent& reply) {
3694a24d3f2c6595a5a9c25bbac4442f4ec953d11a3Subhani Shaik        UNUSED(reply);
370b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return NL_SKIP;
371b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
372b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
373b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    /* Override this method to parse event and dig out data; save it in the object */
374b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    virtual int handleEvent(WifiEvent& event) {
3754a24d3f2c6595a5a9c25bbac4442f4ec953d11a3Subhani Shaik        UNUSED(event);
376b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return NL_SKIP;
377b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
378b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
379b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    int registerHandler(int cmd) {
380b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return wifi_register_handler(wifiHandle(), cmd, &event_handler, this);
381b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
382b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
383b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    void unregisterHandler(int cmd) {
384b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        wifi_unregister_handler(wifiHandle(), cmd);
385b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
386b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
3879b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error registerVendorHandler(uint32_t id, int subcmd) {
388b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        return wifi_register_vendor_handler(wifiHandle(), id, subcmd, &event_handler, this);
389b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
390b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
391b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    void unregisterVendorHandler(uint32_t id, int subcmd) {
392b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        wifi_unregister_vendor_handler(wifiHandle(), id, subcmd);
393b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    }
394b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
395b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapndeprivate:
396b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    WifiCommand(const WifiCommand& );           // hide copy constructor to prevent copies
397b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
398b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    /* Event handling */
399b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    static int response_handler(struct nl_msg *msg, void *arg);
400b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
401b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    static int event_handler(struct nl_msg *msg, void *arg);
402b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
403b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    /* Other event handlers */
404b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    static int valid_handler(struct nl_msg *msg, void *arg);
405b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
406b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    static int ack_handler(struct nl_msg *msg, void *arg);
407b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
408b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    static int finish_handler(struct nl_msg *msg, void *arg);
409b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
410b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    static int error_handler(struct sockaddr_nl *nla, struct nlmsgerr *err, void *arg);
411b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde};
412b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
413a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam//WifiVendorCommand class
414a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamclass WifiVendorCommand: public WifiCommand
415a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam{
416a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamprotected:
417a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    u32 mVendor_id;
418a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    u32 mSubcmd;
419a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    char *mVendorData;
420a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    u32 mDataLen;
421a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
422a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
423a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyampublic:
424a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    WifiVendorCommand(wifi_handle handle, wifi_request_id id, u32 vendor_id, u32 subcmd);
425a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
426a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    virtual ~WifiVendorCommand();
427a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
4289b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error create();
4299b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik
4309b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error requestResponse();
431a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
4329b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error requestEvent();
4334af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
4349b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error put_u8(int attribute, uint8_t value);
435a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
4369b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error put_u16(int attribute, uint16_t value);
437a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
4389b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error put_u32(int attribute, uint32_t value);
439a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
4409b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error put_u64(int attribute, uint64_t value);
441a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
4429b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error put_s8(int attribute, s8 value);
443a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
4449b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error put_s16(int attribute, s16 value);
4454af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
4469b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error put_s32(int attribute, s32 value);
4474af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
4489b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error put_s64(int attribute, s64 value);
4494af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
4509b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    wifi_error put_flag(int attribute);
4514af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
4524af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    virtual u8 get_u8(const struct nlattr *nla);
4534af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    virtual u16 get_u16(const struct nlattr *nla);
4544af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    virtual u32 get_u32(const struct nlattr *nla);
4554af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    virtual u64 get_u64(const struct nlattr *nla);
4564af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
4574af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    virtual s8 get_s8(const struct nlattr *nla);
4584af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    virtual s16 get_s16(const struct nlattr *nla);
4594af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    virtual s32 get_s32(const struct nlattr *nla);
4604af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam    virtual s64 get_s64(const struct nlattr *nla);
4614af494a4400d1ee3944e227626d0452e033284d5Amarnath Hullur Subramanyam
4629b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error put_string(int attribute, const char *value);
463a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
4649b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error put_addr(int attribute, mac_addr value);
465a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
466a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    virtual struct nlattr * attr_start(int attribute);
467a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
468a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    virtual void attr_end(struct nlattr *attribute);
469a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
4709b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error set_iface_id(const char* name);
471a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
4729b620802a517b1745255e7622b81c426918b7a2eSubhani Shaik    virtual wifi_error put_bytes(int attribute, const char *data, int len);
473a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
474ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam    virtual wifi_error get_mac_addr(struct nlattr **tb_vendor,
475ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam                                int attribute,
476ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam                                mac_addr addr);
477ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam
478a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyamprotected:
479a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
480a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    /* Override this method to parse reply and dig out data; save it in the corresponding
481a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam       object */
482a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    virtual int handleResponse(WifiEvent &reply);
483a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
484a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    /* Override this method to parse event and dig out data; save it in the object */
485a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam    virtual int handleEvent(WifiEvent &event);
486a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam};
487a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam
488b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde/* nl message processing macros (required to pass C++ type checks) */
489b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
490b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde#define for_each_attr(pos, nla, rem) \
491b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde    for (pos = (nlattr *)nla_data(nla), rem = nla_len(nla); \
492b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        nla_ok(pos, rem); \
493b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde        pos = (nlattr *)nla_next(pos, &(rem)))
494b573b879161949728b9cbdb0ef2dc8db32a47bfcVinit Deshapnde
495ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyamwifi_error initialize_vendor_cmd(wifi_interface_handle iface,
496d0d336f8cfaa370fc8f9ff7426ffba0036063c61Amarnath Hullur Subramanyam                                 wifi_request_id id,
497ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam                                 u32 subcmd,
498ddae66e0dd0f0b30e8f8a7c8dc84a205f8a98f98Amarnath Hullur Subramanyam                                 WifiVendorCommand **vCommand);
499a779e36f603bbb1b3cd82afeeb4d519d69f6c9fcAmarnath Hullur Subramanyam#endif
500