1/*
2 * Copyright 2008 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com
3 * All rights reserved. Distributed under the terms of the MIT License.
4 */
5#ifndef _BTCOREDATA_H
6#define _BTCOREDATA_H
7
8
9#include <module.h>
10#include <lock.h>
11#include <util/DoublyLinkedList.h>
12#include <util/VectorMap.h>
13#include <net_datalink.h>
14#include <net/if_dl.h>
15
16
17#include <net_buffer.h>
18#include <net_device.h>
19
20#include <bluetooth/bluetooth.h>
21#include <bluetooth/HCI/btHCI.h>
22#include <bluetooth/HCI/btHCI_transport.h>
23#include <l2cap.h>
24
25
26#define BT_CORE_DATA_MODULE_NAME "bluetooth/btCoreData/v1"
27
28
29typedef enum _connection_status {
30	HCI_CONN_CLOSED,
31	HCI_CONN_OPEN,
32} connection_status;
33
34
35#ifdef __cplusplus
36
37struct HciConnection : DoublyLinkedListLinkImpl<HciConnection> {
38	HciConnection(hci_id hid);
39	virtual ~HciConnection();
40
41	hci_id				Hid;
42	bluetooth_device*	ndevice;
43	bdaddr_t			destination;
44	uint16				handle;
45	int					type;
46	uint16				mtu;
47	connection_status	status;
48
49	net_buffer*			currentRxPacket;
50	ssize_t				currentRxExpectedLength;
51
52	struct net_interface_address interface_address;
53	struct sockaddr_dl address_dl;
54	struct sockaddr_storage address_dest;
55
56	void (*disconnect_hook)(HciConnection*);
57
58public:
59	mutex			fLock;
60	uint8			fNextIdent;
61	VectorMap<uint8, void*> fInUseIdents;
62};
63
64#else
65
66struct HciConnection;
67
68#endif
69
70
71struct bluetooth_core_data_module_info {
72	module_info info;
73
74	status_t				(*PostEvent)(bluetooth_device* ndev, void* event,
75								size_t size);
76
77	// FIXME: We really shouldn't be passing out connection pointers at all...
78	struct HciConnection*	(*AddConnection)(uint16 handle, int type,
79								const bdaddr_t& dst, hci_id hid);
80
81	// status_t				(*RemoveConnection)(bdaddr_t destination, hci_id hid);
82	status_t				(*RemoveConnection)(uint16 handle, hci_id hid);
83
84	hci_id					(*RouteConnection)(const bdaddr_t& destination);
85
86	struct HciConnection*	(*ConnectionByHandle)(uint16 handle, hci_id hid);
87	struct HciConnection*	(*ConnectionByDestination)(
88								const bdaddr_t& destination, hci_id hid);
89
90	uint8					(*allocate_command_ident)(struct HciConnection* conn, void* associated);
91	void*					(*lookup_command_ident)(struct HciConnection* conn, uint8 ident);
92	void					(*free_command_ident)(struct HciConnection* conn, uint8 ident);
93};
94
95
96inline bool ExistConnectionByDestination(const bdaddr_t& destination,
97				hci_id hid);
98inline bool ExistConnectionByHandle(uint16 handle, hci_id hid);
99
100
101#endif // _BTCOREDATA_H
102