16ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius/*
26ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius * hidl interface for wpa_supplicant daemon
36ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius * Copyright (c) 2004-2016, Jouni Malinen <j@w1.fi>
46ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius * Copyright (c) 2004-2016, Roshan Pius <rpius@google.com>
56ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius *
66ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius * This software may be distributed under the terms of the BSD license.
76ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius * See README for more details.
86ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius */
96ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius
106ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius#ifndef MISC_UTILS_H_
116ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius#define MISC_UTILS_H_
126ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius
136ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusextern "C" {
146ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius#include "wpabuf.h"
156ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius}
166ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius
176ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusnamespace {
186ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusconstexpr size_t kWpsPinNumDigits = 8;
196ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius// Custom deleter for wpabuf.
206ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusvoid freeWpaBuf(wpabuf *ptr) { wpabuf_free(ptr); }
216ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius}  // namespace
226ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius
236ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusnamespace android {
246ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusnamespace hardware {
256ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusnamespace wifi {
266ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusnamespace supplicant {
276ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusnamespace V1_1 {
286ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusnamespace implementation {
296ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusnamespace misc_utils {
306ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piususing wpabuf_unique_ptr = std::unique_ptr<wpabuf, void (*)(wpabuf *)>;
316ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius
326ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius// Creates a unique_ptr for wpabuf ptr with a custom deleter.
336ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusinline wpabuf_unique_ptr createWpaBufUniquePtr(struct wpabuf *raw_ptr)
346ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius{
356ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius	return {raw_ptr, freeWpaBuf};
366ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius}
376ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius
386ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius// Creates a wpabuf ptr with a custom deleter copying the data from the provided
396ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius// vector.
406ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusinline wpabuf_unique_ptr convertVectorToWpaBuf(const std::vector<uint8_t> &data)
416ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius{
426ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius	return createWpaBufUniquePtr(
436ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius	    wpabuf_alloc_copy(data.data(), data.size()));
446ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius}
456ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius
466ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius// Copies the provided wpabuf contents to a std::vector.
476ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusinline std::vector<uint8_t> convertWpaBufToVector(const struct wpabuf *buf)
486ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius{
496ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius	if (buf) {
506ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius		return std::vector<uint8_t>(
516ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius		    wpabuf_head_u8(buf), wpabuf_head_u8(buf) + wpabuf_len(buf));
526ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius	} else {
536ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius		return std::vector<uint8_t>();
546ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius	}
556ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius}
566ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius
576ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius// Returns a string holding the wps pin.
586ca7b54de22e93958b79bae0a4428107e08cb778Roshan Piusinline std::string convertWpsPinToString(int pin)
596ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius{
606ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius	char pin_str[kWpsPinNumDigits + 1];
616ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius	snprintf(pin_str, sizeof(pin_str), "%08d", pin);
626ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius	return pin_str;
636ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius}
646ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius
656ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius}  // namespace misc_utils
666ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius}  // namespace implementation
676ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius}  // namespace V1_1
686ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius}  // namespace supplicant
696ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius}  // namespace wifi
706ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius}  // namespace hardware
716ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius}  // namespace android
726ca7b54de22e93958b79bae0a4428107e08cb778Roshan Pius#endif  // MISC_UTILS_H_
73