15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski * Copyright 2009-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1949a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#define LOG_TAG "bt_btif_sock" 2049a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen 21db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif_sock_util.h" 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <arpa/inet.h> 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <errno.h> 25109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <netinet/in.h> 26109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <netinet/tcp.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h> 28109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <stdlib.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 30109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <sys/ioctl.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/socket.h> 32109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <sys/types.h> 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/un.h> 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <unistd.h> 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 36109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <hardware/bluetooth.h> 37109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include <hardware/bt_sock.h> 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson#include "bt_common.h" 40109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "bt_target.h" 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h" 42109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "bta_jv_api.h" 43109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "bta_jv_co.h" 44109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "btif_common.h" 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_sock_sdp.h" 46109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "btif_sock_thread.h" 47109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "btif_util.h" 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h" 50109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "btu.h" 51109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "hcimsgs.h" 5244802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati#include "osi/include/log.h" 53109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "port_api.h" 54109691281c0135fd4298debcdec37fdc5855261eMiao Chou#include "sdp_api.h" 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5640cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson#define asrt(s) \ 5740cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson do { \ 5840cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson if (!(s)) \ 5940cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson BTIF_TRACE_ERROR("## %s assert %s failed at line:%d ##", __func__, #s, \ 6040cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson __LINE__) \ 6140cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson } while (0) 626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonint sock_send_all(int sock_fd, const uint8_t* buf, int len) { 646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson int s = len; 656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson while (s) { 676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ssize_t ret; 686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson OSI_NO_INTR(ret = send(sock_fd, buf, s, 0)); 696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (ret <= 0) { 706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_ERROR("sock fd:%d send errno:%d, ret:%d", sock_fd, errno, ret); 716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return -1; 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson buf += ret; 746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson s -= ret; 756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return len; 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonint sock_recv_all(int sock_fd, uint8_t* buf, int len) { 796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson int r = len; 806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson while (r) { 826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ssize_t ret; 836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson OSI_NO_INTR(ret = recv(sock_fd, buf, r, MSG_WAITALL)); 846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (ret <= 0) { 856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_ERROR("sock fd:%d recv errno:%d, ret:%d", sock_fd, errno, ret); 866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return -1; 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson buf += ret; 896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson r -= ret; 906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return len; 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonint sock_send_fd(int sock_fd, const uint8_t* buf, int len, int send_fd) { 956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson struct msghdr msg; 966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson unsigned char* buffer = (unsigned char*)buf; 976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson memset(&msg, 0, sizeof(msg)); 986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson struct cmsghdr* cmsg; 1006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson char msgbuf[CMSG_SPACE(1)]; 1016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson asrt(send_fd != -1); 1026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (sock_fd == -1 || send_fd == -1) return -1; 1036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // Add any pending outbound file descriptors to the message 1046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // See "man cmsg" really 1056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson msg.msg_control = msgbuf; 1066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson msg.msg_controllen = sizeof msgbuf; 1076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson cmsg = CMSG_FIRSTHDR(&msg); 1086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson cmsg->cmsg_level = SOL_SOCKET; 1096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson cmsg->cmsg_type = SCM_RIGHTS; 1106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson cmsg->cmsg_len = CMSG_LEN(sizeof send_fd); 1116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson memcpy(CMSG_DATA(cmsg), &send_fd, sizeof send_fd); 1126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 1136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // We only write our msg_control during the first write 1146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson int ret_len = len; 1156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson while (len > 0) { 1166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson struct iovec iv; 1176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson memset(&iv, 0, sizeof(iv)); 1186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 1196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson iv.iov_base = buffer; 1206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson iv.iov_len = len; 1216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 1226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson msg.msg_iov = &iv; 1236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson msg.msg_iovlen = 1; 1246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 1256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ssize_t ret; 1266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson OSI_NO_INTR(ret = sendmsg(sock_fd, &msg, MSG_NOSIGNAL)); 1276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (ret < 0) { 1286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_ERROR("fd:%d, send_fd:%d, sendmsg ret:%d, errno:%d, %s", 1296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson sock_fd, send_fd, (int)ret, errno, strerror(errno)); 1306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ret_len = -1; 1316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson break; 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1336bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 1346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson buffer += ret; 1356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson len -= ret; 1366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 1376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // Wipes out any msg_control too 1386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson memset(&msg, 0, sizeof(msg)); 1396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 1406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson BTIF_TRACE_DEBUG("close fd:%d after sent", send_fd); 1416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // TODO: This seems wrong - if the FD is not opened in JAVA before this is 1426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // called 1436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // we get a "socket closed" exception in java, when reading from the 1446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson // socket... 1456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson close(send_fd); 1466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return ret_len; 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 148