diff options
author | Srikanth Uppala <suppala@broadcom.com> | 2012-06-17 21:44:48 -0700 |
---|---|---|
committer | Matthew Xie <mattx@google.com> | 2012-07-14 11:19:23 -0700 |
commit | 1144d2b375fc67c9b48298e0ffd774d969cfd2cc (patch) | |
tree | 4d36d4f8be4942d769300c242caeb9b9096c6a35 /stack/obx/obx_utils.c | |
parent | fed66f7b66d29da466e2e67befe3238e7ed8fc6a (diff) | |
download | external_bluetooth_bluedroid-1144d2b375fc67c9b48298e0ffd774d969cfd2cc.zip external_bluetooth_bluedroid-1144d2b375fc67c9b48298e0ffd774d969cfd2cc.tar.gz external_bluetooth_bluedroid-1144d2b375fc67c9b48298e0ffd774d969cfd2cc.tar.bz2 |
resubmit code-cleanup changes lost in gerrit merge
Change-Id: Iebc520d9b10ef220a83a16ff55efa46b4c5a0d27
Diffstat (limited to 'stack/obx/obx_utils.c')
-rw-r--r-- | stack/obx/obx_utils.c | 979 |
1 files changed, 0 insertions, 979 deletions
diff --git a/stack/obx/obx_utils.c b/stack/obx/obx_utils.c deleted file mode 100644 index 785df18..0000000 --- a/stack/obx/obx_utils.c +++ /dev/null @@ -1,979 +0,0 @@ -/***************************************************************************** -** -** Name: obx_utils.c -** -** File: OBEX common utility functions -** -** Copyright (c) 2003-2011, Broadcom Corp., All Rights Reserved. -** Broadcom Bluetooth Core. Proprietary and confidential. -** -*****************************************************************************/ -#include <string.h> -#include <stdio.h> -#include "wcassert.h" - - -#include "bt_target.h" -#include "obx_int.h" -#include "port_api.h" -#include "sdpdefs.h" -#include "l2c_api.h" - -const tOBX_EVENT obx_sm_evt_to_api_evt[OBX_MAX_EVT_MAP_NUM] = -{ - OBX_CONNECT_REQ_EVT, - OBX_SESSION_REQ_EVT, /* A Crease Session or Resume Session request is received by the server. Call OBX_SessionRsp(). */ - OBX_DISCONNECT_REQ_EVT, - OBX_PUT_REQ_EVT, - OBX_GET_REQ_EVT, - OBX_SETPATH_REQ_EVT, - OBX_ACTION_REQ_EVT, /* An Action request is received by the server. Call OBX_ActionRsp(). */ - OBX_ABORT_REQ_EVT -}; - - -const UINT8 obx_rsp_code[] = -{ - OBX_RSP_CONTINUE, /* 0x10 Continue */ - OBX_RSP_OK, /* 0x20 OK, Success */ - OBX_RSP_CREATED, /* 0x21 Created */ - OBX_RSP_ACCEPTED, /* 0x22 Accepted */ - OBX_RSP_NON_AUTH_INFO, /* 0x23 Non-Authoritative Information */ - OBX_RSP_NO_CONTENT, /* 0x24 No Content */ - OBX_RSP_RESET_CONTENT, /* 0x25 Reset Content */ - OBX_RSP_PART_CONTENT, /* 0x26 Partial Content */ - OBX_RSP_MULTI_CHOICES, /* 0x30 Multiple Choices */ - OBX_RSP_MVD_PERM, /* 0x31 Moved Permanently */ - OBX_RSP_MVD_TEMP, /* 0x32 Moved temporarily */ - OBX_RSP_SEE_OTHER, /* 0x33 See Other */ - OBX_RSP_NOT_MODIFIED, /* 0x34 Not modified */ - OBX_RSP_USE_PROXY, /* 0x35 Use Proxy */ - OBX_RSP_BAD_REQUEST, /* 0x40 Bad Request - server couldn't understand request */ - OBX_RSP_UNAUTHORIZED, /* 0x41 Unauthorized */ - OBX_RSP_PAYMENT_REQD, /* 0x42 Payment required */ - OBX_RSP_FORBIDDEN, /* 0x43 Forbidden - operation is understood but refused */ - OBX_RSP_NOT_FOUND, /* 0x44 Not Found */ - OBX_RSP_NOT_ALLOWED, /* 0x45 Method not allowed */ - OBX_RSP_NOT_ACCEPTABLE, /* 0x46 Not Acceptable */ - OBX_RSP_PROXY_AUTH_REQD, /* 0x47 Proxy Authentication required */ - OBX_RSP_REQUEST_TIMEOUT, /* 0x48 Request Time Out */ - OBX_RSP_CONFLICT, /* 0x49 Conflict */ - OBX_RSP_GONE, /* 0x4A Gone */ - OBX_RSP_LENGTH_REQD, /* 0x4B Length Required */ - OBX_RSP_PRECONDTN_FAILED, /* 0x4C Precondition failed */ - OBX_RSP_REQ_ENT_2_LARGE, /* 0x4D Requested entity too large */ - OBX_RSP_REQ_URL_2_LARGE, /* 0x4E Request URL too large */ - OBX_RSP_UNSUPTD_TYPE, /* 0x4F Unsupported media type */ - OBX_RSP_INTRNL_SRVR_ERR, /* 0x50 Internal Server Error */ - OBX_RSP_NOT_IMPLEMENTED, /* 0x51 Not Implemented */ - OBX_RSP_BAD_GATEWAY, /* 0x52 Bad Gateway */ - OBX_RSP_SERVICE_UNAVL, /* 0x53 Service Unavailable */ - OBX_RSP_GATEWAY_TIMEOUT, /* 0x54 Gateway Timeout */ - OBX_RSP_HTTP_VER_NOT_SUPTD, /* 0x55 HTTP version not supported */ - OBX_RSP_DATABASE_FULL, /* 0x60 Database Full */ - OBX_RSP_DATABASE_LOCKED, /* 0x61 Database Locked */ - OBX_RSP_DEFAULT -}; - -static void obx_read_mtu(BT_HDR *p_pkt, tOBX_HANDLE handle, tOBX_CONN_EVT *p_evt); - -/******************************************************************************* -** Function obx_read_srm -** Description read the SRM and SRM_PARAM headers from the packet received from -** peer and set the control block data member accordingly -** Return UINT8 -*******************************************************************************/ -UINT8 obx_read_srm (tOBX_SRM *p_srm, BOOLEAN is_client, BT_HDR *p_pkt) -{ - UINT8 srm, srmp = 0, ret_srmp=0; - UINT8 old_srm = *p_srm; - BOOLEAN allowed = FALSE, clear = TRUE; - - OBX_TRACE_DEBUG1("obx_read_srm srm:0x%x", *p_srm ); - if (*p_srm) - { - /* if the SRM enable request is not granted in the next packet, the request is not valid any more - * clear the requesting flag */ - *p_srm &= ~OBX_SRM_REQING; - - if (OBX_Read1ByteHdr(p_pkt, OBX_HI_SRM, &srm)) - { - if (srm == OBX_HV_SRM_ENABLE) - { - if (is_client) - { - if (old_srm & OBX_SRM_REQING) - { - *p_srm |= OBX_SRM_ENGAGE; - allowed = TRUE; - } - } - else /* is server */ - { - *p_srm |= OBX_SRM_REQING; - allowed = TRUE; - } - } - OBX_TRACE_DEBUG3("SRM :0x%x srm:0x%x old_srm:0x%x", srm, *p_srm, old_srm ); - } - - if (!allowed) - allowed = old_srm & OBX_SRM_PARAM_AL; - - if (OBX_Read1ByteHdr(p_pkt, OBX_HI_SRM_PARAM, &srmp)) - { - if ((srmp == OBX_HV_SRM_PARAM_WAIT) && allowed) - { - ret_srmp = OBX_SRMP_WAIT; - *p_srm |= OBX_SRM_PARAM_AL; - clear = FALSE; - } - } - OBX_TRACE_DEBUG4("SRM_PARAM :0x%x srm:0x%x allowed:%d clear:%d", srmp, *p_srm, allowed, clear ); - - /* once the SRMP header is not used, it should be ignored for the rest of the transaction */ - if (clear) - *p_srm &= ~OBX_SRM_PARAM_AL; - } - - return ret_srmp; -} - -/******************************************************************************* -** Function obx_add_timeout -** Description add the timeout triplet -** -** Return UINT8 -*******************************************************************************/ -UINT8 obx_add_timeout (tOBX_TRIPLET *p_trip, UINT32 timeout, tOBX_SESS_EVT *p_param) -{ - UINT8 *p; - UINT8 ret = 0; - - if (timeout != OBX_INFINITE_TIMEOUT) - { - p_trip->tag = OBX_TAG_SESS_PARAM_TOUT; - p_trip->len = OBX_TIMEOUT_SIZE; - p = p_trip->p_array; - UINT32_TO_BE_STREAM(p, timeout); - ret = 1; - } - p_param->timeout = timeout; - return ret; -} - -/******************************************************************************* -** Function obx_read_timeout -** Description add the timeout triplet -** -** Return void -*******************************************************************************/ -void obx_read_timeout (tOBX_TRIPLET *p_trip, UINT8 num, UINT32 *p_timeout, UINT8 *p_toa) -{ - UINT8 ind; - UINT8 *p; - UINT32 tmp; - - p = p_toa; - BE_STREAM_TO_UINT32(tmp, p); - OBX_TRACE_DEBUG2("obx_read_timeout %d/%d", *p_timeout, tmp); - if (*p_timeout == 0) - *p_timeout = tmp; - ind = obx_read_triplet(p_trip, num, OBX_TAG_SESS_PARAM_TOUT); - if ((ind != num) && (p_trip[ind].len == OBX_TIMEOUT_SIZE)) - { - p = p_trip[ind].p_array; - BE_STREAM_TO_UINT32(tmp, p); - if (tmp < (*p_timeout)) - { - (*p_timeout) = tmp; - OBX_TRACE_DEBUG1("new timeout %d", tmp); - } - } - UINT32_TO_BE_STREAM(p_toa, (*p_timeout)); -} - -#if (OBX_CLIENT_INCLUDED == TRUE) -/******************************************************************************* -** Function obx_verify_response -** Description -** Return OBX_BAD_SM_EVT, if bad. -*******************************************************************************/ -UINT8 obx_verify_response(UINT8 opcode, tOBX_RX_HDR *p_rxh) -{ - UINT8 final = (opcode & OBX_FINAL) ? TRUE : FALSE; - int xx = 0; - UINT8 res_code = opcode & ~OBX_FINAL; - - p_rxh->sm_evt = OBX_BAD_SM_EVT; - - /* response packet must have the final bit set */ - if (final == TRUE) - { - if (res_code == OBX_RSP_CONTINUE) - { - p_rxh->sm_evt = OBX_CONT_CFM_CEVT; - } - else - { - /* figure out the kind of response, Continue, OK, or Error */ - while(obx_rsp_code[xx] != OBX_RSP_DEFAULT) - { - if (obx_rsp_code[xx] == res_code) - break; - xx++; - } - - if (obx_rsp_code[xx] != OBX_RSP_DEFAULT) - { - if (obx_rsp_code[xx] <= OBX_MAX_OK_RSP) - p_rxh->sm_evt = OBX_OK_CFM_CEVT; - else - p_rxh->sm_evt = OBX_FAIL_CFM_CEVT; - } - /* else bad response code */ - } - if (p_rxh->sm_evt != OBX_BAD_SM_EVT) - { - p_rxh->code = opcode; - } - } - /* - else final bit not set in response packet -> bad response code - */ - - return p_rxh->sm_evt; -} - -/******************************************************************************* -** -** Function obx_cl_proc_pkt -** -** Description process a packet received from the connected server -** verify that the response is valid -** fill in event parameters -** call csm to process the event -** -** Returns void -** -*******************************************************************************/ -void obx_cl_proc_pkt (tOBX_CL_CB *p_cb, BT_HDR *p_pkt) -{ - tOBX_RX_HDR *p_rxh; - UINT32 conn_id; - BOOLEAN pass = FALSE; - UINT8 xx; - tOBX_TRIPLET triplet[OBX_MAX_NUM_AUTH_TRIPLET]; - UINT8 num_trip = OBX_MAX_NUM_AUTH_TRIPLET; - tOBX_CL_EVENT sm_evt; - UINT8 ssn; - - OBX_TRACE_DEBUG3("obx_cl_proc_pkt 0x%x srm:0x%x, sess_st:%d", p_pkt, p_cb->srm, p_cb->sess_st); - OBX_TRACE_DEBUG1("csm offset:%d", p_cb->param.sess.obj_offset); - - p_rxh = (tOBX_RX_HDR *)(p_pkt + 1); - p_cb->rsp_code = p_rxh->code & ~OBX_FINAL; - - p_pkt->event = OBX_PUT_RSP_EVT; /* any response */ - /* setup callback event param - memset(&p_cb->param, 0, sizeof(tOBX_EVT_PARAM)); */ - - if (p_cb->state == OBX_CS_CONNECT_REQ_SENT ) - { - /* when a response packet is received in conn_rs state, - * it must be a connect response packet */ - p_pkt->event = OBX_CONNECT_RSP_EVT; - p_cb->param.conn.handle = p_cb->ll_cb.port.handle; - obx_read_mtu(p_pkt, p_cb->ll_cb.port.handle, &(p_cb->param.conn)); - p_cb->ll_cb.port.tx_mtu = p_cb->param.conn.mtu; - - /* save Connection ID */ - if (OBX_Read4ByteHdr(p_pkt, OBX_HI_CONN_ID, &conn_id) == TRUE) - p_cb->conn_id = conn_id; - OBX_TRACE_DEBUG1("Connection ID: 0x%x", p_cb->conn_id ); - } - - if (p_cb->sess_st == OBX_SESS_ACTIVE) - { - /* verify the session sequence number */ - if (OBX_Read1ByteHdr (p_pkt, OBX_HI_SESSION_SN, &ssn)) - { - OBX_TRACE_DEBUG1("ssn:%d", ssn); - p_cb->param.ssn = ssn; - } - } - - sm_evt = p_rxh->sm_evt; - - if (p_cb->wait_auth == TRUE) - { - /* this can only happen for CONNECT */ - if (p_cb->rsp_code == OBX_RSP_OK) - { - /* successful according to server */ - /* verify the digest */ - p_cb->wait_auth = FALSE; - /* The coverity complaints on this function is not correct. - * The value in triplet[] is set/initialized by OBX_ReadTriplet if num_trip returns TRUE. - * leave this unnecessary memset here */ - memset(triplet,0,sizeof(triplet)); - if (OBX_ReadTriplet(p_pkt, OBX_HI_AUTH_RSP, triplet, &num_trip)) - { - for (xx=0; xx<num_trip; xx++) - { - if (triplet[xx].tag == OBX_DIGEST_RSP_TAG) - { - if (memcmp (p_cb->p_auth, triplet[xx].p_array, OBX_DIGEST_SIZE) == 0) - pass = TRUE; - break; - } - } - } - if (pass == FALSE) - { - OBX_TRACE_ERROR0("Failed - server does not provide good digest" ); - p_cb->wait_auth = OBX_WAIT_AUTH_FAIL; - p_cb->rsp_code = OBX_RSP_FAILED; - } - } - } - if (p_cb->p_auth) - GKI_freebuf(p_cb->p_auth); - p_cb->p_auth = NULL; - - p_cb->srmp = obx_read_srm (&p_cb->srm, TRUE, p_pkt); - obx_csm_event(p_cb, sm_evt, p_pkt); -} - -/******************************************************************************* -** -** Function obx_cl_prepend_msg -** -** Description This function is used by API functions to add the data in the -** reserved space in the OBEX packet -** -** Returns void. -** -*******************************************************************************/ -BT_HDR * obx_cl_prepend_msg(tOBX_CL_CB *p_cb, BT_HDR *p_pkt, UINT8 * p_data, UINT16 data_len) -{ - UINT8 *p; - UINT16 len; - - if (p_pkt == NULL) - { - p_pkt = OBX_HdrInit(OBX_HANDLE_NULL, OBX_MIN_MTU); - len = data_len; - } - else - { - len = p_pkt->len + data_len; - } - - WC_ASSERT(p_pkt->offset >= data_len); - p = (UINT8 *)(p_pkt + 1) + p_pkt->offset - data_len; - memcpy(p, p_data, data_len); - p++; - /* adjust the packet len */ - UINT16_TO_BE_STREAM(p, len); - p_pkt->len += data_len; - p_pkt->offset -= data_len; - p_pkt->layer_specific -= data_len; - - return p_pkt; -} -#endif /* OBX_CLIENT_INCLUDED */ - -#if (OBX_SERVER_INCLUDED == TRUE) -/******************************************************************************* -** Function obx_verify_request -** Description -** Return OBX_BAD_SM_EVT, if bad. -*******************************************************************************/ -UINT8 obx_verify_request(UINT8 opcode, tOBX_RX_HDR *p_rxh) -{ - UINT8 final = (opcode & OBX_FINAL) ? TRUE : FALSE; - UINT8 req_code = opcode & ~OBX_FINAL; - p_rxh->sm_evt = OBX_BAD_SM_EVT; - - OBX_TRACE_DEBUG2("obx_verify_request opcode 0x%x: final:%d", opcode, final); - switch (req_code) - { - case OBX_REQ_CONNECT: - /* this request must have the final bit set */ - if (final == TRUE) - p_rxh->sm_evt = OBX_CONNECT_REQ_SEVT; - break; - - case OBX_REQ_SESSION: - /* this request must have the final bit set */ - if (final == TRUE) - p_rxh->sm_evt = OBX_SESSION_REQ_SEVT; - break; - - case OBX_REQ_ACTION: - /* this request must have the final bit set */ - if (final == TRUE) - p_rxh->sm_evt = OBX_ACTION_REQ_SEVT; - break; - - case OBX_REQ_DISCONNECT: - /* this request must have the final bit set */ - if (final == TRUE) - p_rxh->sm_evt = OBX_DISCNT_REQ_SEVT; - break; - - case OBX_REQ_PUT: - p_rxh->sm_evt = OBX_PUT_REQ_SEVT; - break; - - case OBX_REQ_GET: - p_rxh->sm_evt = OBX_GET_REQ_SEVT; - break; - - case OBX_REQ_SETPATH: - /* this request must have the final bit set */ - if (final == TRUE) - p_rxh->sm_evt = OBX_SETPATH_REQ_SEVT; - break; - - case OBX_REQ_ABORT: - /* this request must have the final bit set */ - if (final == TRUE) - p_rxh->sm_evt = OBX_ABORT_REQ_SEVT; - break; - } - - if (p_rxh->sm_evt != OBX_BAD_SM_EVT) - { - p_rxh->code = opcode; - } - return p_rxh->sm_evt; -} - -/******************************************************************************* -** -** Function obx_is_get_or_put_cont -** -** Returns TRUE, if it's a GET/PUT continuing continuing -** TRUE, if it's an ABORT -** -*******************************************************************************/ -BOOLEAN obx_is_get_or_put_cont (tOBX_SR_SESS_CB *p_scb, UINT8 req_code) -{ - BOOLEAN is_cont = FALSE; - - if (req_code == OBX_REQ_ABORT) - { - is_cont = TRUE; - } - else if (req_code == OBX_REQ_PUT) - { - if (p_scb->state == OBX_SS_PUT_TRANSACTION || p_scb->state == OBX_SS_PUT_SRM) - { - is_cont = TRUE; - } - } - else if (req_code == OBX_REQ_GET) - { - if (p_scb->state == OBX_SS_GET_TRANSACTION || p_scb->state == OBX_SS_GET_SRM) - { - is_cont = TRUE; - } - } - - return is_cont; -} - -/******************************************************************************* -** -** Function obx_sr_proc_pkt -** -** Description process a packet received from the connected client -** verify that the request is valid -** fill in event parameters -** call ssm to process the event -** -** Returns TRUE, if abort -** -*******************************************************************************/ -BOOLEAN obx_sr_proc_pkt (tOBX_SR_SESS_CB *p_scb, BT_HDR *p_pkt) -{ - tOBX_RX_HDR *p_rxh; - UINT8 *p_body; - UINT16 len; - BOOLEAN end; - UINT32 conn_id = 0; - UINT8 req_code; - BOOLEAN final; - UINT8 ssn, tmp_ssn; - UINT8 num_hdrs, num_body, num_ssn; - UINT8 rsp_code = OBX_RSP_OK; - UINT8 num_id; - BOOLEAN chk_add = FALSE; - - p_rxh = (tOBX_RX_HDR *)(p_pkt + 1); - final = (p_rxh->code & OBX_FINAL) ? TRUE : FALSE; - req_code = p_rxh->code & ~OBX_FINAL; - p_scb->api_evt = (UINT8)p_pkt->event; - memset(&p_scb->param, 0, sizeof(tOBX_EVT_PARAM)); - p_scb->param.get.final = final; - - num_id = OBX_Read4ByteHdr (p_pkt, OBX_HI_CONN_ID, &conn_id); - - OBX_TRACE_DEBUG6("obx_sr_proc_pkt 0x%x srm:0x%x sess_st:%d req_code:0x%x, sm_evt:%d ssn:%d", - p_pkt, p_scb->srm, p_scb->sess_st, req_code, p_rxh->sm_evt, p_scb->ssn); - - num_ssn = OBX_Read1ByteHdr (p_pkt, OBX_HI_SESSION_SN, &ssn); - if (p_scb->srm & OBX_SRM_ABORT) - { - /* OBX_SRM_ABORT bit is set by server only when PUT req /w SRM is rejected before transaction actually ends - * this means we need to ignore follow packets until the next transaction starts */ - if (req_code == OBX_REQ_PUT) - { - /* check if this is the put for the previous transaction */ - num_hdrs = OBX_ReadNumHdrs(p_pkt, &num_body); - OBX_TRACE_DEBUG4("num_hdrs:%d num_body:%d num_id:%d num_ssn:%d", num_hdrs, num_body, num_id, num_ssn); - num_body += num_ssn; - num_body += num_id; - if (num_hdrs <= num_body) - { - p_scb->ssn = ssn+1; - /* it is left-over, drop it. */ - if (p_pkt) - GKI_freebuf (p_pkt); - p_scb->api_evt = OBX_NULL_EVT; - return TRUE; - } - } - /* clear the SRM bits; leave only the enabled bit */ - p_scb->srm &= OBX_SRM_ENABLE; - } - - if ((p_scb->sess_st == OBX_SESS_ACTIVE) && (req_code != OBX_REQ_SESSION) && (req_code != OBX_REQ_ABORT)) - { - rsp_code = OBX_RSP_BAD_REQUEST; - /* verify the session sequence number */ - if (num_ssn) - { - OBX_TRACE_DEBUG2("ssn pkt/cb=%d/%d", ssn, p_scb->ssn); - if (ssn == p_scb->ssn) - { - p_scb->param.ssn = p_scb->ssn; - rsp_code = OBX_RSP_OK; - } - else if (p_scb->srmp & OBX_SRMP_SESS_FST) - { - tmp_ssn = ssn+1; - if (tmp_ssn == p_scb->ssn) - { - p_scb->param.ssn = ssn; - p_scb->ssn = ssn; - rsp_code = OBX_RSP_OK; - } - } - } - p_scb->srmp &= ~OBX_SRMP_SESS_FST; - } - - /* fill event parameter */ - if (req_code == OBX_REQ_CONNECT) - { - p_scb->param.conn.handle = p_scb->handle; - obx_read_mtu(p_pkt, p_scb->ll_cb.comm.handle, &(p_scb->param.conn)); - - p_scb->ll_cb.port.tx_mtu = p_scb->param.conn.mtu; - /* verify the target header and connection ID - * in obx_sa_connect_ind() for OBX_SS_NOT_CONNECTED */ - /* verify the connection ID in obx_sa_auth_ind() for OBX_SS_WAIT_AUTH */ - chk_add = TRUE; - } - else if (req_code == OBX_REQ_SESSION) - { - /* do nothing */ - if (conn_id != 0) - { - OBX_TRACE_ERROR1("Session command should not use Connection ID: 0x%x", conn_id); - p_rxh->sm_evt = OBX_BAD_REQ_SEVT; - } - } - else - { - OBX_TRACE_DEBUG3("Connection ID: 0x%x/0x%x state:%d", p_scb->conn_id, conn_id, p_scb->state ); - /* verify the connection ID */ - if ( (conn_id == p_scb->conn_id) || - (conn_id == 0 && p_scb->conn_id != 0 && obx_is_get_or_put_cont(p_scb, req_code))) - { - /* match: both non-exist or both exist and equal */ - /* connection ID header does not exist, but control block uses connection ID, - * if this is continuation packets for PUT and GET, it's OK */ - if (req_code == OBX_REQ_PUT) - { - p_scb->param.put.final = final; - - /* determine the PUT type */ - p_scb->param.put.type = OBX_PT_PUT; - if (p_scb->state == OBX_SS_CONNECTED && final == TRUE) - { - if (OBX_ReadBodyHdr(p_pkt, &p_body, &len, &end) == FALSE) - { - /* final is set, no BODY or End-of-Body - * -> Delete request */ - p_scb->param.put.type = OBX_PT_DELETE; - } - else if (end == TRUE && len == 0) - { - /* an empty End-of-Body header - * -> Create-Empty request */ - p_scb->param.put.type = OBX_PT_CREATE; - } - } - OBX_TRACE_EVENT1("Put request type: %d", p_scb->param.put.type); - } - else if (req_code == OBX_REQ_SETPATH) - { - p_scb->param.sp.flag = *((UINT8 *)(p_pkt + 1) + p_pkt->offset + OBX_SETPATH_FLAG_OFFSET); - } - } - else - { - /* does not have good connection ID */ - p_rxh->sm_evt = OBX_BAD_REQ_SEVT; - p_scb->api_evt = OBX_NULL_EVT; - } - } - - /* process the SRM header */ - p_scb->srmp |= obx_read_srm (&p_scb->srm, FALSE, p_pkt); - - if (p_rxh->sm_evt != OBX_BAD_REQ_SEVT && req_code != OBX_REQ_ABORT) - { - p_scb->cur_op = req_code; - if (final) - p_scb->cur_op |= OBX_FINAL; - } - - if (rsp_code != OBX_RSP_OK) - { - p_rxh->sm_evt = OBX_BAD_REQ_SEVT; - } - - OBX_TRACE_DEBUG2("rsp_code:0x%x, sm_evt:%d", rsp_code, p_rxh->sm_evt); - - obx_ssm_event(p_scb, p_rxh->sm_evt, p_pkt); - if (chk_add) - { - if (p_scb->ll_cb.comm.p_send_fn == (tOBX_SEND_FN *)obx_rfc_snd_msg) - obx_add_port(p_scb->handle); - } - return FALSE; -} - -/******************************************************************************* -** -** Function obx_sr_prepend_msg -** -** Description This function is used by API functions to add the data in the -** reserved space in the OBEX packet -** -** Returns void. -** -*******************************************************************************/ -BT_HDR * obx_sr_prepend_msg(BT_HDR *p_pkt, UINT8 * p_data, UINT16 data_len) -{ - UINT8 *p; - UINT16 len; - - if (p_pkt == NULL) - { - p_pkt = OBX_HdrInit(OBX_HANDLE_NULL, OBX_MIN_MTU); - len = data_len; - } - else - { - len = p_pkt->len + data_len; - } - - WC_ASSERT(p_pkt->offset >= data_len); - p = (UINT8 *)(p_pkt + 1) + p_pkt->offset - data_len; - memcpy(p, p_data, data_len); - p++; - /* adjust the packet len */ - UINT16_TO_BE_STREAM(p, len); - p_pkt->len += data_len; - p_pkt->offset -= data_len; - p_pkt->layer_specific -= data_len; - - return p_pkt; -} -#endif /* OBX_SERVER_INCLUDED */ - -/******************************************************************************* -** -** Function obx_read_mtu -** -** Description This function is used to access the MTU in CONNECT packets -** -** Returns void. -** -*******************************************************************************/ -void obx_read_mtu(BT_HDR *p_pkt, tOBX_HANDLE handle, tOBX_CONN_EVT *p_evt) -{ - UINT8 *p = (UINT8 *)(p_pkt + 1) + p_pkt->offset + OBX_CONNECT_MTU_OFFSET; - - BE_STREAM_TO_UINT16(p_evt->mtu, p); - if (p_evt->mtu > OBX_MAX_MTU) - p_evt->mtu = OBX_MAX_MTU; - if (p_evt->mtu == 0) - p_evt->mtu = OBX_MIN_MTU; - - /* Get the Bd_Addr */ - OBX_GetPeerAddr (handle, p_evt->peer_addr); -} - -/******************************************************************************* -** -** Function obx_free_buf -** -** Description This function is used to free the GKI buffers of the given -** lower layer control block -** -** Returns void. -** -*******************************************************************************/ -void obx_free_buf(tOBX_LL_CB *p_ll_cb) -{ - void *p_pkt; - - - if (p_ll_cb->comm.p_send_fn == (tOBX_SEND_FN *)obx_rfc_snd_msg) - { - if (p_ll_cb->port.p_rxmsg) - { - OBX_TRACE_WARNING0("obx_free_buf release p_rxmsg"); - GKI_freebuf(p_ll_cb->port.p_rxmsg); - p_ll_cb->port.p_rxmsg = 0; - } - } - - if (!GKI_queue_is_empty(&p_ll_cb->comm.rx_q)) - { - while((p_pkt = GKI_dequeue (&p_ll_cb->comm.rx_q)) != NULL) - { - OBX_TRACE_WARNING0("obx_free_buf release rx_q"); - GKI_freebuf(p_pkt); - } - } - - if (p_ll_cb->comm.p_txmsg) - { - OBX_TRACE_WARNING0("obx_free_buf release p_txmsg"); - GKI_freebuf(p_ll_cb->comm.p_txmsg); - p_ll_cb->comm.p_txmsg = 0; - } -} - -/******************************************************************************* -** -** Function obx_flow_control -** -** Description If we had flowed control the peer, enable the data path now -** -** Returns void. -** -*******************************************************************************/ -void obx_flow_control(tOBX_COMM_CB *p_comm) -{ - OBX_TRACE_DEBUG1 ("obx_flow_control stopped:%d", p_comm->stopped ); - if (p_comm->stopped) - { - if (p_comm->p_send_fn == (tOBX_SEND_FN *)obx_rfc_snd_msg) - { - PORT_FlowControl(p_comm->id, TRUE); - } - else - { - L2CA_FlowControl(p_comm->id, TRUE); - } - p_comm->stopped = FALSE; - } -} - -/***************************************************************************** -* Function: obx_read_triplet -* Purpose: Read the application parameters with the given tag -*****************************************************************************/ -UINT8 obx_read_triplet(tOBX_TRIPLET *p_trip, UINT8 num_trip, UINT8 tag) -{ - UINT8 xx = 0; - - for (xx=0; xx<num_trip; xx++, p_trip++) - { - if (p_trip->tag == tag) - { - break; - } - } - - return xx; -} -/***************************************************************************** -* Function: obx_read_obj_offset -* Purpose: Read the application parameters with the object offset tag -*****************************************************************************/ -UINT32 obx_read_obj_offset(tOBX_TRIPLET *p_trip, UINT8 num_trip) -{ - UINT32 obj_offset = 0; - UINT8 ind; - UINT8 *p = NULL, *pe; - UINT8 extra = 0, xx; - - ind = obx_read_triplet(p_trip, num_trip, OBX_TAG_SESS_PARAM_OBJ_OFF); - if (ind != num_trip) - { - if (p_trip[ind].len == 4) - { - p = p_trip[ind].p_array; - } - else if (p_trip[ind].len > 4) - { - extra = p_trip[ind].len - 4; - } - - if (extra) - { - /* the TLV is bigger than 4 bytes - * if the MSBs are all 0, we can still handle it with UINT32 */ - pe = p_trip[ind].p_array; - for (xx=0; xx<extra; xx++) - { - if (*pe == 0) - pe++; - else - break; - } - if (xx == extra) - p = pe; - } - - if (p) - BE_STREAM_TO_UINT32(obj_offset, p); - } - - return obj_offset; -} - -/******************************************************************************* -** -** Function obxu_dump_hex -** -** Description This function dumps hex data -** -*/ -#if (BT_USE_TRACES == TRUE) -void obxu_dump_hex (UINT8 *p, char *p_title, UINT16 len) -{ - UINT16 xx, yy; - char buff1[100], buff2[20]; - - if (p_title) - OBX_TRACE_DEBUG1 ("%s:", p_title); - - memset (buff2, ' ', 16); - buff2[16] = 0; - - yy = sprintf (buff1, "%04x: ", 0); - for (xx = 0; xx < len; xx++) - { - if ( (xx) && ((xx & 15) == 0) ) - { - OBX_TRACE_DEBUG2 (" %s %s", buff1, buff2); - yy = sprintf(buff1, "%04x: ", xx); - memset (buff2, ' ', 16); - } - yy += sprintf (&buff1[yy], "%02x ", *p); - - if ((*p >= ' ') && (*p <= 'z')) - buff2[xx & 15] = *p; - else - buff2[xx & 15] = '.'; - - p++; - } - - /* Pad out the remainder */ - for ( ; ; xx++) - { - if ((xx & 15) == 0) - { - OBX_TRACE_DEBUG2 (" %s %s", buff1, buff2); - break; - } - yy += sprintf (&buff1[yy], " "); - } - -} -#endif - -/******************************************************************************* -** -** Function OBX_GetPeerAddr -** -** Description This function is called to learn the Bluetooth address of the -** connected device. -** -** Returns L2CAP channel ID. -** -*******************************************************************************/ -UINT16 OBX_GetPeerAddr(tOBX_HANDLE shandle, BD_ADDR bd_addr) -{ - UINT16 lcid = 0; -#if (OBX_SERVER_INCLUDED == TRUE) - tOBX_SR_SESS_CB *p_scb; -#endif -#if (OBX_CLIENT_INCLUDED == TRUE) - tOBX_CL_CB *p_cb; - - if (shandle & OBX_CL_HANDLE_MASK) - { - p_cb = obx_cl_get_cb(shandle); - if (p_cb) - { - if (p_cb->ll_cb.comm.p_send_fn == (tOBX_SEND_FN *)obx_rfc_snd_msg) - { - PORT_CheckConnection(p_cb->ll_cb.port.port_handle, p_cb->peer_addr, &lcid); - memcpy (bd_addr, p_cb->peer_addr, BD_ADDR_LEN); - lcid = p_cb->ll_cb.comm.id; - } - else if (p_cb->ll_cb.comm.id) - { - /* GetPeerAddr for l2c */ - memcpy (bd_addr, p_cb->peer_addr, BD_ADDR_LEN); - lcid = p_cb->ll_cb.comm.id; - } - } - } -#endif - -#if (OBX_SERVER_INCLUDED == TRUE) - if ((shandle & OBX_CL_HANDLE_MASK) == 0) - { - p_scb = obx_sr_get_scb(shandle); - if (p_scb) - { - if (p_scb->ll_cb.comm.p_send_fn == (tOBX_SEND_FN *)obx_rfc_snd_msg) - { - PORT_CheckConnection(p_scb->ll_cb.port.port_handle, bd_addr, &lcid); - } - else if (p_scb->ll_cb.comm.id) - { - /* GetPeerAddr for l2c */ - memcpy (bd_addr, p_scb->peer_addr, BD_ADDR_LEN); - lcid = p_scb->ll_cb.comm.id; - } - } - } -#endif - - return lcid; -} |