📄 ttp.c
字号:
/*****************************************************************************
* Copyright Statement:
* --------------------
* This software is protected by Copyright and the information contained
* herein is confidential. The software may not be copied and the information
* contained herein may not be used or disclosed except with the written
* permission of MediaTek Inc. (C) 2005
*
* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
*
* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/
/*****************************************************************************
*
* Filename:
* ---------
* TTP.c
*
* Project:
* --------
* Maui_Software
*
* Description:
* ------------
* This file contains the Tiny Transport Protocol of IrDA
*
* Author:
* -------
* -------
*****************************************************************************/
#include "kal_release.h" /* Basic data type */
#include "stack_common.h"
#include "stack_msgs.h"
#include "app_ltlcom.h" /* Task message communiction */
#include "stack_timer.h" /* Stack timer */
#include "irda_enums.h" /* irda enum */
#include "gprs_flc_kal.h"
#include "gprs_flc_common_data_types.h"
#include "flc_tunable_para.h"
#include "irconfig.h" /* IrPro system configuration */
#include "lap.h" /* LAP source header file */
#include "lmp.h" /* LMP source header file */
#include "ttp.h"
#include "iap_p.h" /* IAP primary stack header file */
#include "iap_s.h" /* IAP secondary stack header file */
#include "iastab.h" /* IAS table configuraton header file */
#include "support.h" /* system support functions */
#include "externs.h" /* system external definitions */
#include "irda.h"
#include "irframer_sw.h"
#include "stack_config.h"
#include "kal_trace.h"
#include "irda_trace.h"
kal_uint16 irda_ttp_flag; /*set by LMP*/
kal_uint16 ctrl_buff_cnt=0; /*record unfree control buff*/
kal_uint16 dbg_ctrl_buff_count=0;/*dbg use*/
kal_uint16 irda_ttp_disconnect_req=0;
kal_uint16 irda_ttp_disconnect_ind=0;
struct REC_CTRL_BUFF_Q rec_ctrl_buff_q;
/*************************************************************************
* FUNCTION
* init_irda_ttp
*
* DESCRIPTION
* Initial all TTP correlated global variables and queue
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void init_irda_ttp(void)
{
kal_uint8 i;
irda_ttp_flag=NULL_IRDA_TTP_MSG;
for ( i=0;i<MAX_SEL;i++)
{
if (lm_con[i].control&TTP_MASK)
{
QUEUE_FLUSH(lm_con[i].ttp_txq,MAX_TTP_FRAMES);
QUEUE_FLUSH(lm_con[i].ttp_rxq,MAX_TTP_FRAMES);
/*initialize TX/RX Queue*/
INIT_Q(lm_con[i].ttp_txq,MAX_TTP_FRAMES);/*8*/
INIT_Q(lm_con[i].ttp_rxq,MAX_TTP_FRAMES);
lm_con[i].ttp_dat.ttp_connected=0;
lm_con[i].ttp_dat.sendcredit=0;
lm_con[i].ttp_dat.remotecredit=0;
}
}
irda_ttp_disconnect_req=0;
irda_ttp_disconnect_ind=0;
} /* init_irda_ttp() */
/*Reset all ttp releated connection*/
void IrTTP_Disconnect_Reset(kal_uint8 local)
{
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_FUNC, IRDA_MSG75);
#endif
QUEUE_FLUSH(lm_con[local].ttp_txq,MAX_TTP_FRAMES);
QUEUE_FLUSH(lm_con[local].ttp_rxq,MAX_TTP_FRAMES);
/*initialize TX/RX Queue*/
INIT_Q(lm_con[local].ttp_txq,MAX_TTP_FRAMES);/*8*/
INIT_Q(lm_con[local].ttp_rxq,MAX_TTP_FRAMES);
lm_con[local].ttp_dat.ttp_connected=0;
lm_con[local].ttp_dat.sendcredit=0;
lm_con[local].ttp_dat.remotecredit=0;
/*free all control buffer in Q*/
flush_ctrl_buff_q();
}
void ttp_link_disconnect_indiaction(kal_uint8 local)
{
ilm_struct *ttp_ilm;
irda_local_para_struct *tmp_local_para;
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_FUNC, IRDA_MSG76);
#endif
ttp_ilm=allocate_ilm(MOD_TTP);/*MOD_TTP*/
ttp_ilm->src_mod_id=MOD_TTP; /*MOD_TTP*/
if(local==OBEX_LSAP_SEL||local==OBEX_IRXFER_LSAP_SEL)
{
ttp_ilm->dest_mod_id=MOD_OBEX; /*@@@@MOD_OBEX*/
ttp_ilm->sap_id=IRDA_OBEX_SAP;
}
else if (local==COMMX_LSAP_SEL)
{
ttp_ilm->dest_mod_id=MOD_IRCOMM; /*@@@@MOD_IRCOMM*/
ttp_ilm->sap_id=IRDA_IRCOMM_SAP;
}
ttp_ilm->msg_id=MSG_ID_LMP_LINK_DISCONNECT_INDICATION;
tmp_local_para=(irda_local_para_struct *)construct_local_para(sizeof(irda_local_para_struct),TD_UL);
tmp_local_para->local_lsap_sel=local;
tmp_local_para->disconnect_reason=lm_con[local].discon_code;
tmp_local_para->return_code=0;
ttp_ilm->local_para_ptr=(local_para_struct *)tmp_local_para;
msg_send_ext_queue(ttp_ilm);
} /* ttp_send_msg_to_upper_layer() */
/*************************************************************************
* FUNCTION
* irda_lmp_to_ttp_msg
*
* DESCRIPTION
* Process all the message send from LMP to TTP
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void irda_lmp_to_ttp_msg(void)
{
FBUF *frame;
kal_uint8 *tmpptr;
kal_uint16 old_ttp_flag;
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_FUNC, IRDA_MSG77);
#endif
frame = irda_data_buffer;
tmpptr= (kal_uint8 *) (irda_data_buffer)+I_RX_PACKET_OFFSET;
irda_data_buffer=0;
old_ttp_flag=irda_ttp_flag;
switch (irda_ttp_flag)
{
case MSG_ID_LMP_DATA_INDICATION:
if (lm_con[local_lsap_sel].cc_state==IRDA_LMP_CC_ACTIVE)
{
/* add delta credit */
lm_con[local_lsap_sel].ttp_dat.sendcredit+=(tmpptr[2]&0x7f);
process_ttp_tx_queue(local_lsap_sel);
kal_prompt_trace(MOD_TTP,"RX data size %d",frame->size);
if (frame->size<=(I_RX_PACKET_HEAD+3))/*2 for AC 2 for LMP 1 for TTP*/
{ /* zero frame */ /*2*/
Freebuf(frame);
}
else
{ /* not zero frame */
lm_con[local_lsap_sel].ttp_dat.remotecredit-=1;
/*to upper layer*/
process_rx_ctrl_q(local_lsap_sel);/*process rx_ctrl_q first*/
ttp_send_msg_to_upper_layer(MSG_ID_TTP_DATA_INDICATION,frame,IRDA_SUCCESS);
}
/*send data or dataless TTP_DATA*/
}
else/*Wrong CC state*/
{
ASSERT(0);
Freebuf(frame);
}
break;
case MSG_ID_LMP_CONNECT_INDICATION:
if (lm_con[local_lsap_sel].cc_state==IRDA_LMP_CC_INCOMING)
{
ttp_send_msg_to_upper_layer(MSG_ID_TTP_CONNECT_INDICATION, NULL, IRDA_SUCCESS);
}
else
ASSERT(0);
break;
case MSG_ID_LMP_CONNECT_CONFIRM:/*????*/
ttp_send_msg_to_upper_layer(MSG_ID_TTP_CONNECT_CONFIRM, NULL, irda_error_code);
if (!irda_error_code)
{
lm_con[local_lsap_sel].ttp_dat.ttp_connected=1;
lm_con[local_lsap_sel].ttp_dat.sendcredit=tmpptr[LMP_OP_HEAD]; /*4*/
Freebuf(frame); /*2 sels, 1 opcode 1 parameters*/
}
break;
case MSG_ID_LMP_LSAP_DISCONNECT_INDICATION:
if((!FRAME_IN_QUEUE(lm_con[local_lsap_sel].ttp_rxq))||
(lm_con[local_lsap_sel].cc_state!=IRDA_LMP_CC_ACTIVE))
{
ttp_send_msg_to_upper_layer(MSG_ID_TTP_LSAP_DISCONNECT_INDICATION,NULL,IRDA_SUCCESS);
IrTTP_Disconnect_Reset(local_lsap_sel);
irda_ttp_disconnect_ind=0;
}
else
irda_ttp_disconnect_ind=1;
break;
case MSG_ID_LMP_LINK_DISCONNECT_INDICATION:
init_irda_ttp();
ttp_link_disconnect_indiaction(OBEX_LSAP_SEL);
ttp_link_disconnect_indiaction(COMMX_LSAP_SEL);
break;
default:
break;
}
if (old_ttp_flag==irda_ttp_flag)
irda_ttp_flag = NULL_IRDA_TTP_MSG;
}
/*************************************************************************
* FUNCTION
* irda_ttp_process_external_msg
*
* DESCRIPTION
* irda_ttp_process_external_msg
*
* PARAMETERS
* rx_msg -> inter layer message from upper layer
* RETURNS
* None
*
* GLOBALS AFFECTED
* Process all the message send from upper layer to TTP
*************************************************************************/
kal_uint16 init_buff_count=0;
void irda_ttp_process_external_msg(ilm_struct rx_msg)
{
FBUF *tmpbuf=0;
kal_uint8 *tmpptr, tmp;
irda_local_para_struct *tmp_local_para;
// peer_buff_struct* tmp_peer_buf_ptr;
kal_uint8* pdu_ptr;
kal_uint16 pdu_length;
gprs_flc_pool_presence_enum is_pool_presence;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -