10 #include <sys/ioctl.h>
11 #include "hcidriver.h"
17 /************************** hci command functions**************************/
18 int call_hci_inquiry_cmd(int dd, void *p_addressarray,__u16 *p_ocf_ogf){
19 inquiry_cp cmdp,*p_cmdp=&cmdp;
20 hci_request req,*p_req=&req;
25 p_cmdp->length=INQ_TIME_14s40;
26 p_cmdp->num_rsp=NUM_RSP_20;
27 memset(p_req,0,sizeof(req));
28 p_req->p_OCF_OGF=p_ocf_ogf;
29 p_req->p_retcmdp=p_addressarray;
32 p_req->cmdp_len=INQUIRY_CP_SIZE;
33 p_req->event=EVT_INQUIRY_COMPLETE;
35 if(hci_send_request(dd,p_req,INQ_TIME_4s24*1280)<0)
39 return p_req->retcmdp_len;
41 // fill up the input parameter address pointer by one address
42 int call_hci_read_bd_addr_cmd(int dd,bt_address *p_address,__u16 *p_ocf_ogf){
43 read_bd_addr_rp cmdp,*p_cmdp=&cmdp; //command parameters return/comand
44 hci_request req,*p_req=&req;
46 memset(p_req,0,sizeof(req));
47 p_req->p_OCF_OGF=p_ocf_ogf;
48 p_req->p_retcmdp=p_cmdp;
49 p_req->retcmdp_len=READ_BD_ADDR_RP_SIZE;
51 p_req->event=EVT_CMD_COMPLETE;
53 if(hci_send_request(dd,p_req,2000)<0)
57 bacpy(p_address, &cmdp.bdaddr);
62 int call_hci_read_local_name_cmd(int dd, void *p_name,__u16 *p_ocf_ogf){
63 read_local_name_rp cmdp,*p_cmdp=&cmdp;
64 hci_request req,*p_req=&req;
66 memset(p_req,0,sizeof(req));
67 p_req->p_OCF_OGF=p_ocf_ogf;
68 p_req->p_retcmdp=p_cmdp;
69 p_req->retcmdp_len=READ_LOCAL_NAME_RP_SIZE;
71 p_req->event=EVT_CMD_COMPLETE;
73 if(hci_send_request(dd,p_req,1000)<0)
77 memcpy(p_name, &p_cmdp->name, 8); //copy name
82 int call_hci_create_connection_cmd(int dd, bt_address *p_address, __u16 *p_ocf_ogf){
83 create_conn_cp cmdp,*p_cmdp=&cmdp;
84 hci_request req,*p_req=&req;
85 evt_conn_complete cc_evp,*p_cc_evp=&cc_evp;
87 p_cmdp->bdaddr=*p_address;
88 p_cmdp->pkt_type=0x0010;
89 p_cmdp->pscan_rep_mode=0x01;
90 p_cmdp->pscan_mode=0x00;
91 p_cmdp->clock_offset=0xf000;
92 p_cmdp->role_switch=0x00;
93 memset(p_req,0,sizeof(req));
94 p_req->p_OCF_OGF=p_ocf_ogf;
96 p_req->cmdp_len=CREATE_CONN_CP_SIZE;
97 p_req->p_retcmdp=p_cc_evp;
98 p_req->retcmdp_len=EVT_CONN_COMPLETE_SIZE;
99 p_req->event=EVT_CONN_COMPLETE;
101 if(hci_send_request(dd,p_req,2000)<0)
104 return p_cc_evp->handle;
108 int call_hci_accept_conn_req_cmd(int dd, bt_address *p_address, __u16 *p_ocf_ogf){
109 accept_conn_req_cp cmdp, *p_cmdp=&cmdp;
110 hci_request req,*p_req=&req;
112 p_cmdp->bdaddr=*p_address;
114 memset(p_req,0,sizeof(req));
115 p_req->p_OCF_OGF=p_ocf_ogf;
116 p_req->p_cmdp=p_cmdp;
117 p_req->cmdp_len=ACCEPT_CONN_REQ_CP_SIZE;
119 if(hci_send_command(dd,p_req)<0){
120 printf("problem with command sending\n");
127 /*******************************HCI main functions ********************************/
129 //create and bind the socket to one device, return -1 when error, device descriptor when OK
130 int hci_open_device(int dev_id){
131 struct sockaddr_hci address;
134 if((dd=socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI))<0){
135 perror("socket no created");
136 return dd; //it return -1 when socket isn't created
139 memset(&address,0,sizeof(address));
140 address.hci_family=AF_BLUETOOTH;
141 address.hci_dev=dev_id;
142 if(bind(dd,(struct sockaddr *) &address, sizeof(address))<0){
143 perror("Socket not binded to hci device");
151 int hci_open_device_nonblock(int dev_id){
152 struct sockaddr_hci address;
156 if((dd=socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI))<0){
157 perror("socket no created");
158 return dd; //it return -1 when socket isn't created
161 oldflag=fcntl(dd, F_GETFL, 0);
162 if(fcntl(dd, F_SETFL, oldflag | O_NONBLOCK) < 0){
163 printf("problem with socket flag setting");
167 memset(&address,0,sizeof(address));
168 address.hci_family=AF_BLUETOOTH;
169 address.hci_dev=dev_id;
170 if(bind(dd,(struct sockaddr *) &address, sizeof(address))<0){
171 perror("Socket not binded to hci device");
179 int hci_close_dev(int dd){
183 int hci_send_command(int dd, hci_request *p_req){
184 __u8 array[p_req->cmdp_len+4];
187 memcpy(&array[1],p_req->p_OCF_OGF,2);
188 array[3]= p_req->cmdp_len;
189 if(p_req->cmdp_len > 0){
190 memcpy(&array[4],p_req->p_cmdp,p_req->cmdp_len); // !!!!!!!!! segmentation fault
193 for(ii=0;ii<sizeof(array);ii++){
194 printf(" %x",array[ii]);
198 while(write(dd, &array, (p_req->cmdp_len+4))<0){
199 perror("write interrupted");
200 if(errno == EAGAIN || errno == EINTR)
208 int hci_send_request(int dd, hci_request *p_req,int timeout){
209 __u8 recbuf[HCI_MAX_EVENT_SIZE],*p_recbuf;
212 hci_event_hdr *p_hdr;
213 struct hci_filter nf, of;
217 if(getsockopt(dd, SOL_HCI, HCI_FILTER, &of, &len)<0){
218 printf("some problem with getsockopt: %d",dd);
222 hci_filter_clear(&nf);
223 hci_filter_set_ptype(HCI_EVENT_PKT, &nf);
224 hci_filter_set_event(EVT_CMD_STATUS, &nf);
225 hci_filter_set_event(EVT_INQUIRY_RESULT_WITH_RSSI, &nf);
226 hci_filter_set_event(p_req->event, &nf);
227 hci_filter_set_opcode(*(p_req->p_OCF_OGF), &nf);
229 if(setsockopt(dd, SOL_HCI, HCI_FILTER, &nf, sizeof(nf))<0){
230 printf("some problem with setsockopt: %d",dd);
234 if(hci_send_command(dd, p_req)<0){
235 printf("some problems with sending command: %d",dd);
243 printf("try %d \n",try_count);
244 evt_cmd_complete *cc;
246 evt_remote_name_req_complete *rnrc;
247 remote_name_req_cp *cpar;
248 inquiry_info_with_rssi *p_res_ev;
249 bt_address *p_actual;
255 p.fd = dd; p.events = POLLIN;
256 while((n = poll(&p, 1, timeout)) < 0){ //pool return 1 when there are some incoming data
257 if(errno == EAGAIN || errno == EINTR)
259 perror("Problem with poll");
263 if (!n) { //time out pool return 0
265 perror("Poll return 0 timeout");
266 printf("exited pool timeout \n ");
271 if(timeout < 0) timeout = 0;
274 printf("Timeout after round is: %d \n",timeout);
276 while((len=read(dd, recbuf, sizeof(recbuf)))<0){
277 if(errno == EAGAIN || errno == EINTR)
279 perror("Problem with cmd reading");
282 printf("Count of received bytes %d \n ",len);
284 printf("%2.2X ",recbuf[j]);
287 p_hdr = (void *) (recbuf + 1);
288 p_recbuf = recbuf + (1 + HCI_EVENT_HDR_SIZE);
289 len -= (1 + HCI_EVENT_HDR_SIZE);
293 cs = (void *) p_recbuf;
294 if(cs->opcode != *(p_req->p_OCF_OGF))
296 if(p_req->event != EVT_CMD_STATUS){
297 if(cs->status){ // if there is something except 0 it is error
299 perror("Some error state has occured on receive");
304 p_req->retcmdp_len = min(len, p_req->retcmdp_len);
305 memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len);
308 case EVT_CMD_COMPLETE:
309 cc = (void *) p_recbuf;
310 if(cc->opcode != *(p_req->p_OCF_OGF))
312 p_recbuf += EVT_CMD_COMPLETE_SIZE;
313 len -= EVT_CMD_COMPLETE_SIZE;
315 p_req->retcmdp_len = min(len, p_req->retcmdp_len);
316 memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len);
317 printf("retcmdp lenght: %d \n",p_req->retcmdp_len);
320 case EVT_REMOTE_NAME_REQ_COMPLETE:
321 if(p_hdr->evt != p_req->event)
323 rnrc = (void *) p_recbuf;
324 cpar = p_req->p_cmdp;
326 if(bacmp(&rnrc->bdaddr, &cpar->bdaddr))
329 p_req->retcmdp_len = min(len, p_req->retcmdp_len);
330 memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len);
333 case EVT_INQUIRY_RESULT_WITH_RSSI:
334 printf("bingo inquiry result RSSI event \n");
335 p_recbuf = recbuf + (1 + HCI_EVENT_HDR_SIZE + 1);// one byte set forward
336 p_res_ev = (void *) p_recbuf;
337 p_actual = &(p_res_ev->bdaddr);
338 //todo:involve signal strength
339 if(count==0){ //array is empty
340 *(bt_address*)(p_req->p_retcmdp)= *p_actual;
344 for(j=0;j<count;j++){
345 if(compare_bda(p_actual,(bt_address *)(p_req->p_retcmdp+(j*sizeof(bt_address)))) == 1){
347 } //im looking for all array members an compare with actual address
349 if(!sign){ // if in array address doesnt exist i will add it to array
350 *(bt_address*)(p_req->p_retcmdp+(count*sizeof(bt_address)))= *p_actual;
355 //printf("type %2.2X \n",((hci_inquiry_result_RSSI_ev *)p_req->p_retcmdp)->RSSI_array);
359 case EVT_INQUIRY_COMPLETE:
360 if(p_hdr->evt != p_req->event)
364 printf("bingo inquiry complete event \n");
365 p_req->retcmdp_len=count; //count of diferent remote decices
369 case EVT_CONN_COMPLETE:
370 if(p_hdr->evt != p_req->event)
374 printf("bingo two devices were connected");
375 p_req->retcmdp_len = min(len, p_req->retcmdp_len);
376 memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len);
380 if(p_hdr->evt != p_req->event)
382 p_req->retcmdp_len = min(len, p_req->retcmdp_len);
383 memcpy(p_req->p_retcmdp, p_recbuf, p_req->retcmdp_len);
394 setsockopt(dd, SOL_HCI, HCI_FILTER, &of, sizeof(of));
398 setsockopt(dd, SOL_HCI, HCI_FILTER, &of, sizeof(of));
404 /*****************************HCI support functions*****************************/
407 void assemble_ocf_ogf(__u8 ocf,__u8 ogf,__u16 *p_ocf_ogf){
413 *p_ocf_ogf=(result|var1);
416 void printba(bt_address *ba){
417 printf("address: %2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X: \n",ba->byte[0],ba->byte[1],ba->byte[2],ba->byte[3],ba->byte[4],ba->byte[5]);
420 int compare_bda(bt_address *p_first, bt_address *p_second){
422 for(i=0;i<sizeof(bt_address);i++){
423 if(p_first->byte[i]==p_second->byte[i])
426 if(k==sizeof(bt_address)) return 1; //all bytes are similar
428 return 0; //addreses are different in one byte at least
431 void fill_zero(bt_address *p_addr){
433 for(i=0;i<sizeof(bt_address);i++){
434 p_addr->byte[i]=0x00;
437 void swap_addrbytes(bt_address *p_addr){
438 bt_address help,*p_help=&help;
440 for(i=0;i<sizeof(bt_address);i++){
441 p_help->byte[i]=p_addr->byte[5-i];
445 __u16 swap_2_bytes(__u16 twobytes){
446 __u16 first,second,result=0;
448 second=twobytes&65280;
449 result=result|(first<<8);
450 result=result|(second>>8);
454 __u8 swap8(__u8 byte1){
455 __u8 i,mask=0,hvar1=0,resvar=0;
457 mask=1<<i; // 1,2,4,8,16,32,64,128
460 resvar=resvar + (128>>i);
465 __u16 swap16(__u16 byte2){
467 __u16 mask=0,hvar1=0,resvar=0;
472 resvar=resvar + (32768>>i);
477 void fill_add(bt_address *addr,__u8 first, __u8 sec, __u8 third, __u8 forth, __u8 fifth, __u8 sixth){