/*
 *
 *  BlueZ - Bluetooth protocol stack for Linux
 *
 *  Copyright (C) 2002-2003  Maxim Krasnyansky <maxk@qualcomm.com>
 *  Copyright (C) 2002-2004  Marcel Holtmann <marcel@holtmann.org>
 *
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation;
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 *  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
 *  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
 *  CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES 
 *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
 *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
 *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 *  ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, 
 *  COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS 
 *  SOFTWARE IS DISCLAIMED.
 *
 *
 *  $Id$
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <sys/socket.h>

#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>

int main(void)
{
	uint32_t type_mask;
	uint32_t event_mask[2];
	uint32_t ocf_mask[4];

	/* Packet types */
	memset((void *)&type_mask, 0, sizeof(type_mask));
	hci_set_bit(HCI_EVENT_PKT, &type_mask);

	printf("Type mask: { 0x%x }\n", type_mask); 

	/* Events */
	memset((void *)event_mask, 0, sizeof(event_mask));
	hci_set_bit(EVT_INQUIRY_COMPLETE, event_mask);
	hci_set_bit(EVT_INQUIRY_RESULT,   event_mask);

	hci_set_bit(EVT_CONN_COMPLETE, event_mask);
	hci_set_bit(EVT_CONN_REQUEST,  event_mask);
	hci_set_bit(EVT_DISCONN_COMPLETE, event_mask);

	hci_set_bit(EVT_AUTH_COMPLETE,  event_mask);
	hci_set_bit(EVT_ENCRYPT_CHANGE, event_mask);

	hci_set_bit(EVT_CMD_COMPLETE, event_mask);
	hci_set_bit(EVT_CMD_STATUS,   event_mask);

	hci_set_bit(EVT_READ_REMOTE_FEATURES_COMPLETE, event_mask);
	hci_set_bit(EVT_READ_REMOTE_VERSION_COMPLETE,  event_mask);
	hci_set_bit(EVT_REMOTE_NAME_REQ_COMPLETE,      event_mask);

	printf("Event mask: { 0x%x, 0x%x }\n", event_mask[0], event_mask[1]); 

	/* OGF_LINK_CTL */
	memset((void *) ocf_mask, 0, sizeof(ocf_mask));
	hci_set_bit(OCF_INQUIRY, ocf_mask);
	hci_set_bit(OCF_REMOTE_NAME_REQ, ocf_mask);
	hci_set_bit(OCF_READ_REMOTE_FEATURES, ocf_mask);
	hci_set_bit(OCF_READ_REMOTE_VERSION,  ocf_mask);

	printf("OGF_LINK_CTL: { 0x%x, 0x%x, 0x%x, 0x%x }\n",
			ocf_mask[0], ocf_mask[1], ocf_mask[2], ocf_mask[3]); 

	/* OGF_LINK_POLICY */
	memset((void *) ocf_mask, 0, sizeof(ocf_mask));
	hci_set_bit(OCF_ROLE_DISCOVERY,   ocf_mask);
	hci_set_bit(OCF_READ_LINK_POLICY, ocf_mask);

	printf("OGF_LINK_POLICY: { 0x%x, 0x%x, 0x%x, 0x%x }\n",
			ocf_mask[0], ocf_mask[1], ocf_mask[2], ocf_mask[3]);

	/* OGF_HOST_CTL */
	memset((void *) ocf_mask, 0, sizeof(ocf_mask));
	hci_set_bit(OCF_READ_AUTH_ENABLE, ocf_mask);
	hci_set_bit(OCF_READ_ENCRYPT_MODE, ocf_mask);
	hci_set_bit(OCF_READ_LOCAL_NAME, ocf_mask);
	hci_set_bit(OCF_READ_CLASS_OF_DEV, ocf_mask);
	hci_set_bit(OCF_READ_VOICE_SETTING, ocf_mask);
	hci_set_bit(OCF_READ_TRANSMIT_POWER_LEVEL, ocf_mask);

	printf("OGF_HOST_CTL: { 0x%x, 0x%x, 0x%x, 0x%x }\n",
			ocf_mask[0], ocf_mask[1], ocf_mask[2], ocf_mask[3]); 

	/* OGF_INFO_PARAM */
	memset((void *) ocf_mask, 0, sizeof(ocf_mask));
	hci_set_bit(OCF_READ_LOCAL_VERSION, ocf_mask);
	hci_set_bit(OCF_READ_LOCAL_FEATURES, ocf_mask);
	hci_set_bit(OCF_READ_BUFFER_SIZE, ocf_mask);
	hci_set_bit(OCF_READ_BD_ADDR, ocf_mask);
	hci_set_bit(OCF_READ_BD_ADDR, ocf_mask);

	printf("OGF_INFO_PARAM: { 0x%x, 0x%x, 0x%x, 0x%x}\n", 
			ocf_mask[0], ocf_mask[1], ocf_mask[2], ocf_mask[3]); 

	/* OGF_INFO_PARAM */
	memset((void *) ocf_mask, 0, sizeof(ocf_mask));
	hci_set_bit(OCF_READ_FAILED_CONTACT_COUNTER, ocf_mask);
	hci_set_bit(OCF_RESET_FAILED_CONTACT_COUNTER, ocf_mask);
	hci_set_bit(OCF_READ_LINK_QUALITY, ocf_mask);
	hci_set_bit(OCF_READ_RSSI, ocf_mask);

	printf("OGF_STATUS_PARAM: { 0x%x, 0x%x, 0x%x, 0x%x}\n", 
			ocf_mask[0], ocf_mask[1], ocf_mask[2], ocf_mask[3]); 

	return 0;
}
