xref: /haiku/src/add-ons/kernel/drivers/bluetooth/h2/h2generic/h2util.cpp (revision 05e1165520f748a223162a9996caa2535125f633)
1 /*
2  * Copyright 2007 Oliver Ruiz Dorantes, oliver.ruiz.dorantes_at_gmail.com
3  * Copyright 2008 Mika Lindqvist, monni1995_at_gmail.com
4  * All rights reserved. Distributed under the terms of the MIT License.
5  */
6 
7 
8 #include "h2util.h"
9 
10 #include <malloc.h>
11 
12 #include <bluetooth/HCI/btHCI_acl.h>
13 #include <bluetooth/HCI/btHCI_command.h>
14 #include <bluetooth/HCI/btHCI_event.h>
15 #include <bluetooth/HCI/btHCI_sco.h>
16 
17 #include "h2debug.h"
18 #include "h2upper.h"
19 #include "h2transactions.h"
20 
21 
22 void*
nb_get_whole_buffer(net_buffer * nbuf)23 nb_get_whole_buffer(net_buffer* nbuf)
24 {
25 	void* conPointer;
26 	status_t err;
27 #if 0
28 	// the job could be already done
29 	// !!! it could be trash from other upper protocols...
30 	if (nbuf->COOKIEFIELD != NULL)
31 		return (void*)nbuf->COOKIEFIELD;
32 #endif
33 	err = nb->direct_access(nbuf, 0, nbuf->size, &conPointer);
34 
35 	if (err != B_OK) {
36 		panic("expected to be contiguous");
37 		#if 0
38 		// We are gonna need a realocation
39 		nbuf->COOKIEFIELD = (uint32) malloc(nbuf->size);
40 		if (nbuf->COOKIEFIELD == NULL)
41 			goto fail;
42 
43 		err = nb->write(nbuf, 0, (void*) nbuf->COOKIEFIELD, nbuf->size);
44 		if (err != B_OK)
45 			goto free;
46 
47 		conPointer = (void*)nbuf->COOKIEFIELD;
48 		#endif
49 	}
50 
51 	return conPointer;
52 #if 0
53 free:
54 	free((void*) nbuf->COOKIEFIELD);
55 fail:
56 	return NULL;
57 #endif
58 }
59 
60 
61 void
nb_destroy(net_buffer * nbuf)62 nb_destroy(net_buffer* nbuf)
63 {
64 	if (nbuf == NULL)
65 		return;
66 #if 0
67 	// Free possible allocated
68 	if (nbuf->COOKIEFIELD != NULL)
69 		free((void*)nbuf->COOKIEFIELD);
70 #endif
71 	// TODO check for survivers...
72 	if (nb != NULL)
73 		nb->free(nbuf);
74 
75 }
76 
77 
78 // Extract the expected size of the packet
79 // TODO: This might be inefficient as at the moment of the creation
80 // of the net_buffer this information is known and it could be stored
81 #if 0
82 ssize_t
83 get_expected_size(net_buffer* nbuf)
84 {
85 
86 	if (nbuf == NULL)
87 		panic("Analizing NULL packet");
88 
89 	switch (nbuf->protocol) {
90 
91 		case BT_COMMAND: {
92 			struct hci_command_header* header = nb_get_whole_buffer(nbuf);
93 			return header->clen + sizeof(struct hci_command_header);
94 		}
95 
96 		case BT_EVENT: {
97 			struct hci_event_header* header = nb_get_whole_buffer(nbuf);
98 			return header->elen + sizeof(struct hci_event_header);
99 		}
100 
101 		case BT_ACL: {
102 			struct hci_acl_header* header = nb_get_whole_buffer(nbuf);
103 			return header->alen + sizeof(struct hci_acl_header);
104 		}
105 
106 		case BT_SCO: {
107 			struct hci_sco_header* header = nb_get_whole_buffer(nbuf);
108 			return header->slen + sizeof(struct hci_sco_header);
109 		}
110 
111 		default:
112 			panic(BLUETOOTH_DEVICE_DEVFS_NAME ":no protocol specified for ");
113 		break;
114 	}
115 
116 	return -1;
117 }
118 #endif
119 
120 
121 #if 0
122 #pragma mark - room util -
123 #endif
124 
125 
126 void
init_room(struct list * l)127 init_room(struct list* l)
128 {
129 	list_init(l);
130 }
131 
132 
133 void*
alloc_room(struct list * l,size_t size)134 alloc_room(struct list* l, size_t size)
135 {
136 
137 	void* item = list_get_first_item(l);
138 
139 	if (item == NULL)
140 		item = (void*) malloc(size);
141 
142 	return item;
143 
144 }
145 
146 
147 void
reuse_room(struct list * l,void * room)148 reuse_room(struct list* l, void* room)
149 {
150 	list_add_item(l, room);
151 }
152 
153 
154 void
purge_room(struct list * l)155 purge_room(struct list* l)
156 {
157 	void* item;
158 
159 	while ((item = list_remove_head_item(l)) != NULL) {
160 		free(item);
161 	}
162 }
163