📄 lap_p.c
字号:
}
}
mask=1<<(i1+1);
}
/* apply new connection parameters */
/*Max turn around time*/
p_timeout=new_ttt-10; /* subtract out response ms delay */
tmp_ms_timeout=p_timeout;
MS_TO_TICKS(p_timeout); /* convert p_timeout to OS tick equivalent */
/*Min turn around time and addional bof*/
bofs=new_minttt+new_xbofs; /* add the min TTT to bofs */
IRDA_SetBof(bofs);
/*Baudrate*/
savedMask = SaveAndSetIRQMask();
Com_ioctl( IOCTL_BAUD, new_baud );
Reset_Baudrate();
RestoreIRQMask(savedMask);
//Com_ioctl( IOCTL_BAUD, new_baud );
/* the windows size is currently set to one */
/*Data size*/
if (new_size==0)
max_frame_size=IRLAP_FRAME_SIZE;
else
max_frame_size=new_size+4;
/*Link disconnect.threshold time*/
if(new_ld==3)
{
N1=0;
N2 = 6;//about 3s
}
else
{
/* calculate these values based on ms time not OS ticks*/
N1=3000/tmp_ms_timeout;/**/
N2 = 6;//about 3s
}
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_INFO, IRDA_MSG26, new_baud);
kal_trace(TRACE_INFO, IRDA_MSG27, new_size);
kal_trace(TRACE_INFO, IRDA_MSG28, new_ttt);
kal_trace(TRACE_INFO, IRDA_MSG29, bofs);
kal_trace(TRACE_INFO, IRDA_MSG30, new_minttt);
kal_trace(TRACE_INFO, IRDA_MSG31, new_ld);
kal_trace(TRACE_INFO, IRDA_MSG32, N1);
kal_trace(TRACE_INFO, IRDA_MSG33, N2);
#endif
}
/*************************************************************************
* FUNCTION
* IrLAP_DISCONNECT_request_p
*
* DESCRIPTION
* Perform a LAP disconnect request for a primary
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void IrLAP_DISCONNECT_request_p (void )
{
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_FUNC, IRDA_MSG34);
#endif
STOP_P_TIMER();
Com_write(Format_packet (1,DISC_COMMAND));
START_F_TIMER();
irlap_state=IRLAP_PCLOSE;
}
/*************************************************************************
* FUNCTION
* Send_NRM_Command
*
* DESCRIPTION
* Send a LAP data frame or S command
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void Send_NRM_Command ( void )
{
FBUF *tmpptr;
//kal_uint8 tx_lap;
if(lap_disconnect_flag==1)/*Send DISC */
{
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_INFO, IRDA_MSG35);
#endif
IrLAP_DISCONNECT_request_p();
lap_disconnect_flag=0;
return;
}
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_INFO, IRDA_MSG36);
#endif
/* if local_busy toggles, ensure that one S frame is transmitted to
inform the remote about our receive status
*/
kal_prompt_trace(MOD_LAP,"Nr %d AS %d VS %d",Nr, As, Vs);
if (!remote_busy&&!(((local_busy&1)^(local_busy>>1))&1))
{
if ((Nr==As)&&(unacked_frame!=0))
{
/* adjust Vs before retransmit */
if (Vs==0)
Vs=7;
else
Vs--;
unacked_frame->size-=2; /*2 for A and C field */
Com_write(Format_I_Packet (1,0x10,unacked_frame,unacked_frame->size));
As=Vs;
Vs=(Vs+1)%8;
}
else if ( unacked_frame )
{
SEND_S_COMMAND();
}
else if (FRAME_IN_QUEUE(lap_request_q))
{
QUEUE_REMOVE(lap_request_q,tmpptr,MAX_REQUEST);
Com_write(Format_I_Packet (1,0x10,tmpptr,tmpptr->size));
unacked_frame = tmpptr;
As=Vs;
Vs=(Vs+1)%8;
}
else
{
SEND_S_COMMAND();
}
}
else
{
if (local_busy&1)
local_busy=3;
else
local_busy=0;
SEND_S_COMMAND();
}
retrycount=0;
/* ??? */
START_F_TIMER();
}
/*************************************************************************
* FUNCTION
* Do_quick_p_timer
*
* DESCRIPTION
* This does reply to Secondary as soon as possible
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void Do_quick_p_timer ( void )
{
if ( irlap_state==IRLAP_XMIT )
{
irlap_state=IRLAP_NRMP;
Send_NRM_Command();
}
}
/*************************************************************************
* FUNCTION
* Check_F_Timer
*
* DESCRIPTION
* Handle f timer timeout
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void Check_F_Timer ( void )
{
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_FUNC, IRDA_MSG37);
#endif
switch (irlap_state)
{
case IRLAP_SETUP:
irp_connect=DISCONNECT_INDICATION;
LAP_disconnect_reset(LOST_LAP_CON);
Reset_Baudrate();
irda_lmp_flag=MSG_ID_LAP_DISCONNECT_INDICATION;
break;
case IRLAP_NRMP:
if ( retrycount < N2 )
{
SEND_S_COMMAND();
retrycount+=1;
START_F_TIMER();
}
else
{
LAP_disconnect_reset(LOST_LAP_CON);
Reset_Baudrate();
irda_lmp_flag=MSG_ID_LAP_DISCONNECT_INDICATION;
}
break;
case IRLAP_PCLOSE:
if ( retrycount < N2 )
{
Com_write(Format_packet (1,DISC_COMMAND));
retrycount+=1;
START_F_TIMER();
}
else
{
LAP_disconnect_reset(LOST_LAP_CON);
Reset_Baudrate();
irda_lmp_flag=MSG_ID_LAP_DISCONNECT_INDICATION;
}
break;
default:
STOP_F_TIMER();
break;
}
}
/*************************************************************************
* FUNCTION
* Check_P_Timer
*
* DESCRIPTION
* handle poll timeout
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void Check_P_Timer ( void )
{
if ( irlap_state==IRLAP_XMIT )
{
irlap_state=IRLAP_NRMP;
Send_NRM_Command();
}
}
/*************************************************************************
* FUNCTION
* Process_Nr
*
* DESCRIPTION
* Process NR.
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void Process_Nr ( void )
{
peer_buff_struct* tmp_peer_buf_ptr;
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_FUNC, IRDA_MSG38);
#endif
if ((Nr==Vs)&&(unacked_frame!=0))
{
if((ctrl_buff_cnt)&&(unacked_frame->type==CONTROL_BUF_TYPE)
&&(FRAME_IN_QUEUE(ctrl_buff_q)))
{
QUEUE_PEAK(ctrl_buff_q, tmp_peer_buf_ptr);
kal_prompt_trace(MOD_TTP,"ctrl buf %d unack %d",tmp_peer_buf_ptr->pdu_len, (unacked_frame->size-5));
if(tmp_peer_buf_ptr->pdu_len>=(tmp_peer_buf_ptr->pdu_len-(unacked_frame->size-5)))
tmp_peer_buf_ptr->pdu_len=tmp_peer_buf_ptr->pdu_len-(unacked_frame->size-5);/*2LAP+2LMP+1TTP*/
else
tmp_peer_buf_ptr->pdu_len=0;
if(tmp_peer_buf_ptr->pdu_len==0)
{
QUEUE_REMOVE(ctrl_buff_q,tmp_peer_buf_ptr,MAX_TTP_FRAMES);
gprs_flc_free_peer_buff (
IRDA_DATA,
0,
GPRS_FLC_UL,
0,
tmp_peer_buf_ptr);
ctrl_buff_cnt--;
dbg_ctrl_buff_count--;
}
if(local_lsap_sel==OBEX_LSAP_SEL||local_lsap_sel==OBEX_IRXFER_LSAP_SEL)
{
/*Attar 20060227: remove it because of race condition */
/*extern void obex_flc_release_callback(void);
kal_prompt_trace(MOD_OBEX, "local_lsap_sel==OBEX_LSAP_SEL||local_lsap_sel==OBEX_IRXFER_LSAP_SEL");
obex_flc_release_callback();*/
}
{
kal_uint16 u_available_half_blocks; kal_uint16 u_available_full_blocks;
kal_uint16 d_available_half_blocks; kal_uint16 d_available_full_blocks;
gprs_flc_pool_presence_enum is_pool_created;
gprs_flc_query_fix_size_pool_occupy( IRDA_DATA, GPRS_INVALID_SAPI, GPRS_FLC_UL, 0, \
&is_pool_created, &u_available_half_blocks, &u_available_full_blocks );
gprs_flc_query_fix_size_pool_occupy( IRDA_DATA, GPRS_INVALID_SAPI, GPRS_FLC_DL, 0, \
&is_pool_created, &d_available_half_blocks, &d_available_full_blocks );
kal_prompt_trace(MOD_TTP, "[LAP] [UL: (%d) (%d)][DL: (%d) (%d)]", u_available_half_blocks, u_available_full_blocks, d_available_half_blocks, d_available_full_blocks );
kal_prompt_trace(MOD_LAP, "[LAP] [UL: (%d) (%d)][DL: (%d) (%d)]", u_available_half_blocks, u_available_full_blocks, d_available_half_blocks, d_available_full_blocks );
}
}
Freebuf((FBUF*)unacked_frame);
unacked_frame=0;
}
}
/*************************************************************************
* FUNCTION
* Process_peer_SNRM_com
*
* DESCRIPTION
* Process the PEER SNRM command
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
*
*************************************************************************/
static void Process_peer_SNRM_com ( kal_uint8 * frame )
{
kal_uint32 tmplong;
kal_uint32 tmpdest;
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_FUNC, IRDA_MSG39);
#endif
/* determine (tentatively) if we are a primary or secondary */
/* dest 32bit address */
xmemcpy ((kal_uint8 *)&tmplong, (kal_uint8 *)&frame[DEST_ADDRESS_OFFSET],4);
tmpdest=Swap_long_order(tmplong);
Yield_Secondary(frame);
}
/*************************************************************************
* FUNCTION
* Yield_Secondary
*
* DESCRIPTION
* Yield link control as a secondary
*
* PARAMETERS
*
* RETURNS
* None
*
* GLOBALS AFFECTED
* only used in PEER mode
*************************************************************************/
static void Yield_Secondary( kal_uint8 * frame )
{
#ifdef IRDA_KAL_TRACE
kal_trace(TRACE_FUNC, IRDA_MSG40);
#endif
ENABLE_SECONDARY_STACK();/*stack=0*/
Do_u_frame_s( frame );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -