1 /******************************************************************************
2 *
3 * Copyright (C) 2009-2012 Broadcom Corporation
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
19
20 /************************************************************************************
21 *
22 * Filename: btif_sock.c
23 *
24 * Description: Bluetooth Socket Interface
25 *
26 *
27 ***********************************************************************************/
28
29 #include <hardware/bluetooth.h>
30 #include <hardware/bt_sock.h>
31
32 #define LOG_TAG "BTIF_SOCK"
33 #include "btif_common.h"
34 #include "btif_util.h"
35
36 #include "bd.h"
37
38 #include "bta_api.h"
39 #include "btif_sock_thread.h"
40 #include "btif_sock_rfc.h"
41
42 static bt_status_t btsock_listen(btsock_type_t type, const char* service_name,
43 const uint8_t* uuid, int channel, int* sock_fd, int flags);
44 static bt_status_t btsock_connect(const bt_bdaddr_t *bd_addr, btsock_type_t type,
45 const uint8_t* uuid, int channel, int* sock_fd, int flags);
46
47 static void btsock_signaled(int fd, int type, int flags, uint32_t user_id);
48
49 /*******************************************************************************
50 **
51 ** Function btsock_ini
52 **
53 ** Description initializes the bt socket interface
54 **
55 ** Returns bt_status_t
56 **
57 *******************************************************************************/
58 static btsock_interface_t sock_if = {
59 sizeof(sock_if),
60 btsock_listen,
61 btsock_connect
62 };
btif_sock_get_interface()63 btsock_interface_t *btif_sock_get_interface()
64 {
65 return &sock_if;
66 }
btif_sock_init()67 bt_status_t btif_sock_init()
68 {
69 static volatile int binit;
70 if(!binit)
71 {
72 //fix me, the process doesn't exit right now. don't set the init flag for now
73 //binit = 1;
74 BTIF_TRACE_DEBUG0("btsock initializing...");
75 btsock_thread_init();
76 int handle = btsock_thread_create(btsock_signaled, NULL);
77 if(handle >= 0 && btsock_rfc_init(handle) == BT_STATUS_SUCCESS)
78 {
79 BTIF_TRACE_DEBUG0("btsock successfully initialized");
80 return BT_STATUS_SUCCESS;
81 }
82 }
83 else BTIF_TRACE_ERROR0("btsock interface already initialized");
84 return BT_STATUS_FAIL;
85 }
btif_sock_cleanup()86 void btif_sock_cleanup()
87 {
88 btsock_rfc_cleanup();
89 BTIF_TRACE_DEBUG0("leaving");
90 }
91
btsock_listen(btsock_type_t type,const char * service_name,const uint8_t * service_uuid,int channel,int * sock_fd,int flags)92 static bt_status_t btsock_listen(btsock_type_t type, const char* service_name,
93 const uint8_t* service_uuid, int channel, int* sock_fd, int flags)
94 {
95 if((service_uuid == NULL && channel <= 0) || sock_fd == NULL)
96 {
97 BTIF_TRACE_ERROR3("invalid parameters, uuid:%p, channel:%d, sock_fd:%p", service_uuid, channel, sock_fd);
98 return BT_STATUS_PARM_INVALID;
99 }
100 *sock_fd = -1;
101 bt_status_t status = BT_STATUS_FAIL;
102 switch(type)
103 {
104 case BTSOCK_RFCOMM:
105 status = btsock_rfc_listen(service_name, service_uuid, channel, sock_fd, flags);
106 break;
107 case BTSOCK_L2CAP:
108 BTIF_TRACE_ERROR1("bt l2cap socket type not supported, type:%d", type);
109 status = BT_STATUS_UNSUPPORTED;
110 break;
111 case BTSOCK_SCO:
112 BTIF_TRACE_ERROR1("bt sco socket not supported, type:%d", type);
113 status = BT_STATUS_UNSUPPORTED;
114 break;
115 default:
116 BTIF_TRACE_ERROR1("unknown bt socket type:%d", type);
117 status = BT_STATUS_UNSUPPORTED;
118 break;
119 }
120 return status;
121 }
btsock_connect(const bt_bdaddr_t * bd_addr,btsock_type_t type,const uint8_t * uuid,int channel,int * sock_fd,int flags)122 static bt_status_t btsock_connect(const bt_bdaddr_t *bd_addr, btsock_type_t type,
123 const uint8_t* uuid, int channel, int* sock_fd, int flags)
124 {
125 if((uuid == NULL && channel <= 0) || bd_addr == NULL || sock_fd == NULL)
126 {
127 BTIF_TRACE_ERROR4("invalid parameters, bd_addr:%p, uuid:%p, channel:%d, sock_fd:%p",
128 bd_addr, uuid, channel, sock_fd);
129 return BT_STATUS_PARM_INVALID;
130 }
131 *sock_fd = -1;
132 bt_status_t status = BT_STATUS_FAIL;
133 switch(type)
134 {
135 case BTSOCK_RFCOMM:
136 status = btsock_rfc_connect(bd_addr, uuid, channel, sock_fd, flags);
137 break;
138 case BTSOCK_L2CAP:
139 BTIF_TRACE_ERROR1("bt l2cap socket type not supported, type:%d", type);
140 status = BT_STATUS_UNSUPPORTED;
141 break;
142 case BTSOCK_SCO:
143 BTIF_TRACE_ERROR1("bt sco socket not supported, type:%d", type);
144 status = BT_STATUS_UNSUPPORTED;
145 break;
146 default:
147 BTIF_TRACE_ERROR1("unknown bt socket type:%d", type);
148 status = BT_STATUS_UNSUPPORTED;
149 break;
150 }
151 return status;
152 }
btsock_signaled(int fd,int type,int flags,uint32_t user_id)153 static void btsock_signaled(int fd, int type, int flags, uint32_t user_id)
154 {
155 switch(type)
156 {
157 case BTSOCK_RFCOMM:
158 btsock_rfc_signaled(fd, flags, user_id);
159 break;
160 case BTSOCK_L2CAP:
161 BTIF_TRACE_ERROR2("bt l2cap socket type not supported, fd:%d, flags:%d", fd, flags);
162 break;
163 case BTSOCK_SCO:
164 BTIF_TRACE_ERROR2("bt sco socket type not supported, fd:%d, flags:%d", fd, flags);
165 break;
166 default:
167 BTIF_TRACE_ERROR3("unknown socket type:%d, fd:%d, flags:%d", type, fd, flags);
168 break;
169 }
170 }
171
172
173
174