📄 ttp.c
字号:
*
* DESCRIPTION
* process_ttp_tx_queue
*
* PARAMETERS
* lsap_sel -> the LSAP selector of the specified TTP queue
* RETURNS
* None
*
* GLOBALS AFFECTED
* check the tx queue of the specified TTP queue then send one
data frame to LMP if any frame exists in the TTP queue
*************************************************************************/
kal_uint16 irda_buff_count=0;
void process_ttp_tx_queue(kal_uint8 lsap_sel)
{
kal_uint8 *tmpptr;
FBUF *tmpbuf;
kal_uint8 tmp;
kal_uint8 stauts;
gprs_flc_pool_presence_enum is_pool_presence;
gprs_flc_query_fix_size_pool_occupy(IRDA_DATA,
0,
GPRS_FLC_DL,
0,
&is_pool_presence,
0,
&irda_buff_count);
ASSERT(is_pool_presence == GPRS_FLC_POOL_CREATED);
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_FUNC, IRDA_MSG79);
#endif
if (FRAME_IN_QUEUE(lm_con[lsap_sel].ttp_txq))
{
while((lm_con[lsap_sel].ttp_dat.sendcredit > 0)&&(FRAME_IN_QUEUE(lm_con[lsap_sel].ttp_txq))) /*have data && can send */
{ /* Data LM-PDU */
gprs_flc_query_fix_size_pool_occupy(IRDA_DATA,
0,
GPRS_FLC_DL,
0,
&is_pool_presence,
0,
&irda_buff_count);
QUEUE_REMOVE(lm_con[lsap_sel].ttp_txq,tmpbuf,MAX_TTP_FRAMES);
tmpptr=(kal_uint8 *) (tmpbuf) + I_TX_PACKET_OFFSET;
lm_con[lsap_sel].ttp_dat.availcredit=
irda_buff_count-(lm_con[lsap_sel].ttp_dat.remotecredit);
tmp = lm_con[lsap_sel].ttp_dat.availcredit;
lm_con[lsap_sel].ttp_dat.availcredit=0;
lm_con[lsap_sel].ttp_dat.remotecredit+=tmp;
lm_con[lsap_sel].ttp_dat.sendcredit-=1;
*(tmpptr+2)=tmp;//tmp /* add delta credit */
stauts=IrLMP_Data_Request(lsap_sel, lm_con[lsap_sel].sel, tmpbuf);
}
/*check if ap asks disconnect*/
irda_ttp_disconnect_req_check();
if (lm_con[lsap_sel].ttp_dat.sendcredit == 0)/*lm_con[lsap_sel].ttp_dat.sendcredit <= 0*/
{ /*send dataless flow data */
gprs_flc_query_fix_size_pool_occupy(IRDA_DATA,
0,
GPRS_FLC_DL,
0,
&is_pool_presence,
0,
&irda_buff_count);
tmpbuf=Getbuf();
tmpbuf->size=1;/*for credit field*/
tmpptr=(kal_uint8 *) (tmpbuf) + I_TX_PACKET_OFFSET;
lm_con[lsap_sel].ttp_dat.availcredit=
irda_buff_count-(lm_con[lsap_sel].ttp_dat.remotecredit);
tmp = lm_con[lsap_sel].ttp_dat.availcredit;
lm_con[lsap_sel].ttp_dat.availcredit=0;
lm_con[lsap_sel].ttp_dat.remotecredit+=tmp;
if(tmp!=0)/*not send credit=0 frame*/
{
//lm_con[lsap_sel].ttp_dat.sendcredit-=1;
*(tmpptr+2)=tmp;//tmp; /* add delta credit */
stauts=IrLMP_Data_Request(lsap_sel, lm_con[lsap_sel].sel, tmpbuf);
// ASSERT(stauts==0);
}
else
Freebuf(tmpbuf);
}
}
else/*send dataless TTP data*/
{
tmpbuf=Getbuf();
tmpbuf->size=1;/*for credit field*/
tmpptr=(kal_uint8 *) (tmpbuf) + I_TX_PACKET_OFFSET;
lm_con[lsap_sel].ttp_dat.availcredit=
irda_buff_count-(lm_con[lsap_sel].ttp_dat.remotecredit);
tmp = lm_con[lsap_sel].ttp_dat.availcredit;
lm_con[lsap_sel].ttp_dat.availcredit=0;
lm_con[lsap_sel].ttp_dat.remotecredit+=tmp;
if(tmp!=0)
{
//lm_con[lsap_sel].ttp_dat.sendcredit=1;
*(tmpptr+2)=tmp;//tmp; /* add delta credit */
stauts=IrLMP_Data_Request(lsap_sel, lm_con[lsap_sel].sel, tmpbuf);
}
else
Freebuf(tmpbuf);
}
} /* process_ttp_tx_queue() */
/*************************************************************************
* FUNCTION
* ttp_send_msg_to_upper_layer
*
* DESCRIPTION
* process_ttp_rx_queue
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* check the rx queue of the specified TTP queue then send one
data frame to upper layer if any frame exists in the TTP queue
*************************************************************************/
kal_bool irda_temp = KAL_FALSE;
static peer_buff_struct* sar_peer_buff_ptr=NULL;
static kal_uint8* sar_pdu_ptr=NULL;
void ttp_send_msg_to_upper_layer(kal_uint16 msg, FBUF *frame, irda_error_code_enum code)
{
ilm_struct *ttp_ilm;
irda_local_para_struct *tmp_local_para;
peer_buff_struct* tmp_peer_buf_ptr;
kal_uint8* pdu_ptr;
kal_uint16 pdu_length;
volatile kal_bool send_data;
gprs_flc_pool_presence_enum is_pool_presence;
kal_uint8 *tmpptr;
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_FUNC, IRDA_MSG80);
#endif
tmpptr= (kal_uint8 *)(frame)+I_RX_PACKET_OFFSET;
send_data=1;
tmp_local_para=(irda_local_para_struct *)construct_local_para(sizeof(irda_local_para_struct),TD_UL);
tmp_local_para->local_lsap_sel=local_lsap_sel;
tmp_local_para->remote_lsap_sel=remote_lsap_sel;
tmp_local_para->disconnect_reason=lm_con[local_lsap_sel].discon_code;
tmp_local_para->return_code=code;
if(msg==MSG_ID_TTP_DATA_INDICATION)
{
if(1)/*not necessary to do SAR*/
{
#ifndef IRDA_CTRL_BUF
tmp_peer_buf_ptr=construct_peer_buff( (frame->size-2), 0, 0, TD_CTRL);
#else
tmp_peer_buf_ptr = gprs_flc_get_peer_buff
(IRDA_DATA,
0,
GPRS_FLC_DL,
0,
IRDA_STD_PACKET_SIZE, /* (frame->size-2),// 256 */
0,
0,
&is_pool_presence);
ASSERT(is_pool_presence == GPRS_FLC_POOL_CREATED);
#endif
if (tmp_peer_buf_ptr==NULL)
{
send_data=0;
if (!(QUEUE_FULL(lm_con[local_lsap_sel].ttp_rxq,MAX_TTP_FRAMES)))
{
QUEUE_ADD(lm_con[local_lsap_sel].ttp_rxq,frame,MAX_TTP_FRAMES);
}
else
ASSERT(0);
gprs_flc_query_fix_size_pool_occupy(IRDA_DATA,
0,
GPRS_FLC_DL,
0,
&is_pool_presence,
0,
&irda_buff_count);
}
else/*0!=tmp_peer_buf_ptr*/
{
if( (frame->size-5) <=IRDA_STD_PACKET_SIZE)
{
pdu_ptr=(kal_uint8*)get_pdu_ptr(tmp_peer_buf_ptr, &pdu_length);
kal_mem_set( pdu_ptr, 0, pdu_length);
xmemcpy((kal_uint8*)(pdu_ptr),(kal_uint8*)((kal_uint8*)frame+FBUF_HEAD+5),((frame->size)-5));
tmp_peer_buf_ptr->pdu_len = (frame->size)-5;
Freebuf(frame);
}
else
{
kal_prompt_trace(MOD_TTP,"%d larger than Max frame size ",(frame->size-5));
gprs_flc_free_peer_buff(IRDA_DATA,0,GPRS_FLC_DL,0,tmp_peer_buf_ptr);
Freebuf(frame);
send_data=0;
}
}
}
}
ttp_ilm=allocate_ilm(MOD_TTP);/*MOD_TTP*/
ttp_ilm->src_mod_id=MOD_TTP; /*MOD_TTP*/
if(local_lsap_sel==OBEX_LSAP_SEL||local_lsap_sel==OBEX_IRXFER_LSAP_SEL)
{
ttp_ilm->dest_mod_id=MOD_OBEX; /*@@@@MOD_OBEX*/
ttp_ilm->sap_id=IRDA_OBEX_SAP;
}
else if (local_lsap_sel==COMMX_LSAP_SEL)
{
ttp_ilm->dest_mod_id=MOD_IRCOMM; /*@@@@MOD_IRCOMM*/
ttp_ilm->sap_id=IRDA_IRCOMM_SAP;
}
ttp_ilm->msg_id=msg;
ttp_ilm->local_para_ptr=(local_para_struct *)tmp_local_para;
if(msg==MSG_ID_TTP_DATA_INDICATION)
ttp_ilm->peer_buff_ptr=(peer_buff_struct *) tmp_peer_buf_ptr;
if(send_data)
{
msg_send_ext_queue(ttp_ilm);
}
else
{
free_ilm(ttp_ilm);
cancel_ilm(MOD_TTP);
}
} /* ttp_send_msg_to_upper_layer() */
/*************************************************************************
* FUNCTION
* process_rx_ctrl_q
*
* DESCRIPTION
* process_ttp_rx_queue
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* check the rx queue of the specified TTP queue then send one
data frame to upper layer if any frame exists in the TTP queue
*************************************************************************/
kal_uint32 ui=0;
kal_uint16 irda_buff_count2=0;
void process_rx_ctrl_q(kal_uint8 lsap_sel)
{
FBUF *frame;
gprs_flc_pool_presence_enum is_pool_presence;
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_FUNC, IRDA_MSG81);
#endif
gprs_flc_query_fix_size_pool_occupy(IRDA_DATA,
0,
GPRS_FLC_DL,
0,
&is_pool_presence,
0,
&irda_buff_count2);
while(FRAME_IN_QUEUE(lm_con[lsap_sel].ttp_rxq) && (0!=irda_buff_count2))
{
ui++;
QUEUE_REMOVE(lm_con[lsap_sel].ttp_rxq,frame,MAX_TTP_FRAMES);
ttp_send_msg_to_upper_layer(MSG_ID_TTP_DATA_INDICATION,frame,IRDA_SUCCESS);
gprs_flc_query_fix_size_pool_occupy(IRDA_DATA,
0,
GPRS_FLC_DL,
0,
&is_pool_presence,
0,
&irda_buff_count2);
}
irda_ttp_disconnect_ind_check();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -