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