/*++ Copyright (c) 1991 Microsoft Corporation Copyright (c) 1991 ICL Data /Personal Systems Module Name: llcsm.c Abstract: The module implements a IEEE 802.2 compatible state machine as defined in IBM Token-Ring Architectural reference. The most of the code in the module is compiled by the finite state machine compiler from the IBM state machine definition (llcsm.fsm). The compiler is build as a part of this product. DO NOT MODIFY ANY CODE INSIDE: - #ifdef FSM_CONST - #ifdef FSM_DATA - #ifdef FSM_PREDICATE_CASES - #ifdef FSM_ACTION_CASES That code is genereated from the definition file of the state machine. Any changes in the state machine must be done into 802-2.fsm definition file (or to the source files of finite state machine cross compiler, fsmx). To understand the backgroung of this state machine, you should read Chapters 11 and 12 in IBM Token-Ring Architecture Reference. The this module produces 2100H code and A00H data when compiled for 386. Contents: RunStateMachine Author: Antti Saarenheimo (o-anttis) 23-MAY-1991 Revision History: --*/ #include //********************************************************************* // // C- macros for LAN DLC state machine // enum StateMachineOperMode { LLC_NO_OPER = 0, LOCAL_INIT_PENDING = 1, REMOTE_INIT_PENDING = 2, OPER_MODE_PENDING = 4, IS_FRAME_PENDING = 8, STATE_LOCAL_BUSY = 0x10, STATE_REMOTE_BUSY = 0x20, STACKED_DISCp_CMD = 0x40 }; #define SEND_RNR_CMD( a ) SendLlcFrame( pLink, DLC_RNR_TOKEN | \ DLC_TOKEN_COMMAND | a ) #define SEND_RR_CMD( a ) SendLlcFrame( pLink, DLC_RR_TOKEN | \ DLC_TOKEN_COMMAND | a ) #define DLC_REJ_RESPONSE( a ) uchSendId = \ (UCHAR)(DLC_REJ_TOKEN | DLC_TOKEN_RESPONSE) | (UCHAR)a #if 0 #define DLC_REJ_COMMAND( a ) uchSendId = \ (UCHAR)(DLC_REJ_TOKEN | DLC_TOKEN_COMMAND) | (UCHAR)a #endif // 0 #define DLC_RNR_RESPONSE( a ) uchSendId = \ (UCHAR)(DLC_RNR_TOKEN | DLC_TOKEN_RESPONSE) | (UCHAR)a #define DLC_RNR_COMMAND( a ) uchSendId = \ (UCHAR)(DLC_RNR_TOKEN | DLC_TOKEN_COMMAND) | (UCHAR)a #define DLC_RR_RESPONSE( a ) uchSendId = \ (UCHAR)(DLC_RR_TOKEN | DLC_TOKEN_RESPONSE) | (UCHAR)a #define DLC_RR_COMMAND( a ) uchSendId = \ (UCHAR)(DLC_RR_TOKEN | DLC_TOKEN_COMMAND) | (UCHAR)a #define DLC_DISC(a) uchSendId = (UCHAR)DLC_DISC_TOKEN | (UCHAR)a #define DLC_DM(a) uchSendId = (UCHAR)DLC_DM_TOKEN | (UCHAR)a #define DLC_FRMR(a) uchSendId = (UCHAR)DLC_FRMR_TOKEN | (UCHAR)a #define DLC_SABME(a) uchSendId = (UCHAR)DLC_SABME_TOKEN | (UCHAR)a #define DLC_UA(a) uchSendId = (UCHAR)DLC_UA_TOKEN | (UCHAR)a #define TimerStartIf( a ) StartTimer( a ) #define TimerStart( a ) StartTimer( a ) #define TimerStop( a ) StopTimer( a ) #define EnableLinkStation( a ) #define DisableLinkStation( a ) #define SEND_ACK( a ) SendAck( a ) // // Stack all event indications, they must be made immediate after // the state machine has been run // #define EVENT_INDICATION( a ) pLink->DlcStatus.StatusCode |= a UCHAR auchLlcCommands[] = { 0, LLC_REJ, LLC_RNR, LLC_RR, LLC_DISC, LLC_DM, LLC_FRMR, LLC_SABME, LLC_UA }; #ifdef FSM_DATA // Flag for the predicate switch #define PC 0x8000 USHORT aLanLlcStateInput[21][44] = { { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 2, 2, 2, 0, 2, 2, 2, 2, 2}, { 13, 13, 3, 3, 3, 3, 9|PC, 9|PC, 3, 3, 3, 3, 3, 15, 3, 3, 3, 15, 3, 3, 3, 15, 3, 3, 3, 15, 3, 3, 3, 15, 3, 3, 3, 3, 2, 4, 5, 6, 0, 1|PC, 4|PC, 11, 7|PC, 2}, { 24, 24, 25, 25, 3, 3, 22|PC, 22|PC, 0, 25|PC, 29|PC, 0, 29|PC, 32|PC, 35|PC, 0, 35|PC, 38|PC, 47|PC, 0, 47|PC, 50|PC, 41|PC, 0, 41|PC, 44|PC, 47|PC, 0, 47|PC, 50|PC, 3, 3, 3, 3, 2, 2, 5, 6, 0, 2, 11|PC, 14|PC, 17|PC, 2}, { 47, 47, 48, 48, 3, 3, 49, 49, 0, 48, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 5, 6, 0, 2, 2, 2, 53|PC, 2}, { 53, 53, 54, 54, 55, 55, 56, 56, 3, 3, 3, 3, 57, 57, 3, 3, 57, 57, 3, 3, 57, 57, 3, 3, 57, 57, 3, 3, 57, 57, 3, 3, 3, 3, 2, 2, 5, 6, 0, 50, 51, 52, 2, 2}, { 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 71, 72, 73, 73, 73, 74, 59|PC, 59|PC, 59|PC, 62|PC, 79, 79, 79, 80, 76, 76, 76, 81, 59, 59, 59, 60, 2, 2, 58, 2, 61, 2, 62, 63, 56|PC, 65}, { 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 94, 95, 94, 94, 94, 95, 59|PC, 59|PC, 59|PC, 68|PC, 97, 97, 97, 98, 76, 76, 76, 99, 83, 83, 83, 84, 2, 2, 2, 82, 85, 2, 86, 87, 65|PC, 2}, { 89, 89, 90, 90, 91, 91, 92, 92, 106, 106, 107, 107, 107, 108, 109, 109, 109, 110, 59|PC, 59|PC, 59|PC, 74|PC, 112, 112, 112, 113, 76, 76, 76, 114, 101, 101, 101, 102, 2, 2, 100, 2, 103, 2, 86, 104, 71|PC, 2}, { 121, 121, 122, 122, 123, 123, 124, 124, 83|PC, 83|PC, 86|PC, 92|PC, 86|PC, 89|PC, 95|PC,101|PC, 95|PC, 98|PC,104|PC,109|PC, 104|PC,106|PC,112|PC,118|PC,112|PC,115|PC,121|PC,109|PC,121|PC,124|PC, 116, 116, 116, 117, 2, 2, 115, 2, 0, 2, 77|PC, 2, 80|PC, 65}, { 156, 156, 157, 157, 158, 158, 159, 159,130|PC,130|PC, 133|PC,139|PC,133|PC,136|PC,142|PC,145|PC,142|PC,136|PC,104|PC,151|PC, 104|PC,148|PC,154|PC,160|PC,154|PC,157|PC,121|PC,151|PC,121|PC,163|PC, 152, 152, 152, 153, 2, 2, 2, 151, 0, 2, 77|PC, 2,127|PC, 2}, { 156, 156, 157, 157, 158, 158, 159, 159, 160, 160, 169|PC,175|PC,169|PC,172|PC,142|PC,181|PC,142|PC,178|PC,104|PC,187|PC, 104|PC,184|PC,112|PC,193|PC,112|PC,190|PC,196|PC,187|PC,196|PC,198|PC, 152, 152, 152, 153, 2, 2, 180, 2, 0, 2, 77|PC, 2,166|PC, 2}, { 198, 198, 199, 199, 200, 200, 201, 201, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 5, 6, 0, 8, 197, 52, 2, 2}, { 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 204, 71, 72, 205, 207, 205, 206,204|PC,204|PC, 204|PC,207|PC, 76, 76, 76, 81,213|PC,213|PC,213|PC,210|PC, 59, 59, 59, 60, 2, 2, 202, 2, 0, 2, 62, 203,201|PC, 65}, { 89, 89, 90, 90, 91, 91, 92, 92, 106, 106, 94, 94, 94, 95, 94, 94, 94, 95,216|PC,216|PC, 216|PC,219|PC, 76, 76, 76, 99,225|PC,225|PC,225|PC,222|PC, 83, 83, 83, 84, 2, 2, 2, 215, 0, 2, 86, 216, 216, 2}, { 89, 89, 90, 90, 226, 226, 92, 92, 106, 106, 227, 227, 227, 228, 109, 109, 109, 95, 229, 229, 229, 230, 231, 231, 231, 232, 76, 76, 76, 99, 83, 83, 83, 84, 2, 2, 2, 223, 224, 2, 86, 225,228|PC, 2}, { 89, 89, 90, 90, 91, 91, 92, 92, 106, 106, 235, 235, 235, 236, 109, 109, 109, 110,234|PC,234|PC, 234|PC,237|PC, 76, 76, 76, 114,243|PC,243|PC,243|PC,240|PC, 83, 83, 83, 84, 2, 2, 233, 2, 0, 2, 86, 234,231|PC, 2}, { 156, 156, 157, 157, 158, 158, 159, 159, 160, 160, 249|PC,139|PC,249|PC,252|PC,142|PC,255|PC,142|PC,136|PC,258|PC,264|PC, 258|PC,260|PC,154|PC,266|PC,154|PC,157|PC,269|PC,272|PC,269|PC,163|PC, 152, 152, 152, 153, 2, 2, 2,246|PC, 0, 2, 77|PC, 2,127|PC, 2}, { 156, 156, 157, 157, 158, 158, 159, 159,130|PC,130|PC, 169|PC,275|PC,169|PC,172|PC,278|PC,284|PC,278|PC,281|PC,104|PC,287|PC, 104|PC,184|PC,290|PC,296|PC,290|PC,293|PC,121|PC,296|PC,121|PC,198|PC, 152, 152, 152, 153, 2, 2, 257, 2, 0, 2, 77|PC, 2,166|PC, 2}, { 156, 156, 157, 157, 158, 158, 159, 159, 160, 160, 169|PC,175|PC,169|PC,172|PC,299|PC,181|PC,299|PC,302|PC,104|PC,305|PC, 104|PC,184|PC,290|PC,308|PC,290|PC,190|PC,121|PC,311|PC,121|PC,198|PC, 152, 152, 152, 153, 2, 2, 267, 2, 0, 2, 77|PC, 2,166|PC, 2}, { 89, 89, 90, 90, 226, 226, 92, 92, 106, 106, 277, 277, 277, 278, 109, 109, 109, 95, 279, 279, 279, 280, 281, 281, 281, 282,320|PC,320|PC,320|PC,317|PC, 83, 83, 83, 84, 2, 2, 2, 275, 0, 2, 86, 276,314|PC, 2}, { 289, 289, 290, 290, 291, 291, 56, 56, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 5, 6, 0, 50, 51,323|PC, 2, 2}}; USHORT aLanLlcCondJump[326] = { 0, 1, 7, 8, 1, 9, 10, 2, 12, 3, 14, 4, 16, 17, 5, 18, 19, 6, 20, 21, 22, 23, 7, 26, 27, 8, 28, 29, 3, 9, 30, 31, 9, 32, 33, 9, 30, 34, 9, 35, 36, 9, 37, 38, 9, 39, 40, 9, 41, 42, 9, 43, 44, 10, 45, 46, 11, 64, 63, 12, 75, 76, 12, 77, 78, 11, 88, 87, 12, 96, 78, 13, 104, 105, 12, 111, 78, 14, 2, 118, 10, 119, 120, 15, 125, 3, 16, 126, 127, 16, 128, 129, 17, 130, 131, 16, 132, 133, 16, 134, 135, 17, 136, 137, 18, 138, 16, 139, 140, 17, 141, 142, 16, 143, 144, 16, 145, 146, 17, 147, 142, 16, 148, 12, 16, 149, 150, 10, 154, 155, 15, 160, 3, 16, 161, 162, 16, 163, 164, 17, 165, 166, 16, 167, 168, 17, 169, 166, 16, 170, 171, 17, 172, 173, 16, 174, 175, 16, 176, 177, 17, 178, 173, 16, 179, 171, 10, 181, 155, 16, 182, 183, 16, 184, 185, 17, 130, 186, 16, 187, 188, 17, 189, 186, 16, 190, 191, 17, 192, 142, 16, 193, 194, 17, 195, 142, 18, 148, 16, 196, 191, 11, 88, 203, 12, 208, 209, 12, 210, 211, 12, 212, 213, 12, 214, 209, 12, 217, 76, 12, 218, 78, 12, 219, 220, 12, 221, 222, 11, 88, 225, 11, 88, 234, 12, 237, 76, 12, 238, 78, 12, 239, 240, 12, 241, 242, 19, 243, 244, 16, 245, 246, 16, 247, 248, 17, 249, 166, 18, 250, 20, 251, 171, 252, 21, 173, 17, 253, 254, 16, 255, 12, 17, 256, 173, 17, 130, 166, 16, 258, 259, 16, 260, 261, 17, 262, 166, 17, 263, 142, 16, 143, 264, 16, 193, 265, 17, 266, 142, 16, 268, 269, 16, 270, 271, 17, 272, 142, 17, 273, 142, 17, 274, 142, 11, 105, 276, 12, 283, 284, 12, 285, 286, 10, 287, 288}; #endif #define usState pLink->State UINT RunStateMachine( IN OUT PDATA_LINK pLink, IN USHORT usInput, IN BOOLEAN boolPollFinal, IN BOOLEAN boolResponse ) /*++ Routine Description: The function impelements the complete HDLC ABM link station as it has been defined in IBM Token-Ring Architecture Reference. The excluding of XID and TEST handling in the link station level should be the the only difference. The code is compiled from the state machine definition file with the finite state machine compiler. Special: This procededure must be called with SendSpinLock set Arguments: pLink - link station context usInput - state machine input boolPollFinal - boolean flag set when the received frame had poll/final bit set boolResponse - boolean flag set when the received frame was response Return Value: STATUS_SUCCESS - the state machine acknowledged the next operation, eg. the received data or the packet was queued DLC_STATUS_NO_ACTION - the command was accepted and executed. No further action is required from caller. DLC_LOGICAL_ERROR - the input is invalid within this state. This error is returned to the upper levels. DLC_IGNORE_FRAME - the received frame was ignored DLC_DISCARD_INFO_FIELD - the received data was discarded --*/ { UINT usAction; UINT usActionIndex; UCHAR uchSendId = 0; UINT Status = DLC_STATUS_SUCCESS; #if LLC_DBG // // We save all last state machine inputs to a global trace table // aLast[InputIndex % LLC_INPUT_TABLE_SIZE].Input = usInput; aLast[InputIndex % LLC_INPUT_TABLE_SIZE].Time = (USHORT)AbsoluteTime; aLast[InputIndex % LLC_INPUT_TABLE_SIZE].pLink = pLink; InputIndex++; #endif // // FSM condition switch // #ifdef FSM_PREDICATE_CASES usAction = aLanLlcStateInput[usState][usInput]; if (usAction & 0x8000) { usActionIndex = usAction & 0x7fff; usAction = aLanLlcCondJump[usActionIndex++]; switch (usAction) { case 1: if (pLink->Vi==0) ; else if (pLink->Vi==REMOTE_INIT_PENDING) usActionIndex += 1; else usActionIndex = 0; break; case 2: if (pLink->P_Ct==0) ; else usActionIndex = 0; break; case 3: if (pLink->Vi==0) ; else usActionIndex = 0; break; case 4: if (pLink->Vi==LOCAL_INIT_PENDING||pLink->Vi==REMOTE_INIT_PENDING) ; else if (pLink->Vi==OPER_MODE_PENDING) usActionIndex += 1; else usActionIndex = 0; break; case 5: if ((pLink->Vb&STATE_LOCAL_BUSY)!=0) ; else if ((pLink->Vb&STATE_LOCAL_BUSY)==0) usActionIndex += 1; else usActionIndex = 0; break; case 6: if (pLink->P_Ct!=0&&pLink->Vi==LOCAL_INIT_PENDING) ; else if (pLink->P_Ct==0&&pLink->Vi==LOCAL_INIT_PENDING) usActionIndex += 1; else if (pLink->Vi==(REMOTE_INIT_PENDING|LOCAL_INIT_PENDING)&&(pLink->Vb&STATE_LOCAL_BUSY)!=0) usActionIndex += 2; else if (pLink->Vi==(REMOTE_INIT_PENDING|LOCAL_INIT_PENDING)&&(pLink->Vb&STATE_LOCAL_BUSY)==0) usActionIndex += 3; else usActionIndex = 0; break; case 7: if (pLink->Vi==LOCAL_INIT_PENDING||pLink->Vi==(REMOTE_INIT_PENDING|LOCAL_INIT_PENDING)) ; else if (pLink->Vi==OPER_MODE_PENDING) usActionIndex += 1; else usActionIndex = 0; break; case 8: if ((pLink->Vi==LOCAL_INIT_PENDING||pLink->Vi==(REMOTE_INIT_PENDING|LOCAL_INIT_PENDING))&&(pLink->Vb&STATE_LOCAL_BUSY)!=0) ; else if ((pLink->Vi==LOCAL_INIT_PENDING||pLink->Vi==(REMOTE_INIT_PENDING|LOCAL_INIT_PENDING))&&(pLink->Vb&STATE_LOCAL_BUSY)==0) usActionIndex += 1; else if ((pLink->Vi==OPER_MODE_PENDING)) usActionIndex += 2; else usActionIndex = 0; break; case 9: if (pLink->Vi==OPER_MODE_PENDING&&pLink->Nr==0&&(pLink->Vb&STATE_LOCAL_BUSY)!=0) ; else if (pLink->Vi==OPER_MODE_PENDING&&pLink->Nr==0&&(pLink->Vb&STATE_LOCAL_BUSY)==0) usActionIndex += 1; else usActionIndex = 0; break; case 10: if (pLink->P_Ct!=0) ; else if (pLink->P_Ct==0) usActionIndex += 1; else usActionIndex = 0; break; case 11: if (pLink->Is_Ct<=0) ; else if (pLink->Is_Ct>0) usActionIndex += 1; else usActionIndex = 0; break; case 12: if (pLink->Nr!=pLink->Vs) ; else if (pLink->Nr==pLink->Vs) usActionIndex += 1; else usActionIndex = 0; break; case 13: if (pLink->Is_Ct>0) ; else if (pLink->P_Ct<=0) usActionIndex += 1; else usActionIndex = 0; break; case 14: if (pLink->Vc!=0) ; else if (pLink->Vc==0) usActionIndex += 1; else usActionIndex = 0; break; case 15: if (pLink->Vi!=IS_FRAME_PENDING) ; else if (pLink->Vi==IS_FRAME_PENDING) usActionIndex += 1; else usActionIndex = 0; break; case 16: if (pLink->Va!=pLink->Nr) ; else if (pLink->Va==pLink->Nr) usActionIndex += 1; else usActionIndex = 0; break; case 17: if (pLink->Vc==0) ; else if (pLink->Vc==STACKED_DISCp_CMD) usActionIndex += 1; else usActionIndex = 0; break; case 18: if (pLink->Va!=pLink->Nr) ; else usActionIndex = 0; break; case 19: if (pLink->Vb==(STATE_LOCAL_BUSY|STATE_REMOTE_BUSY)) ; else if (pLink->Vb==STATE_LOCAL_BUSY) usActionIndex += 1; else usActionIndex = 0; break; case 20: if (pLink->Va!=pLink->Nr) ; else if (pLink->Va==pLink->Nr) usActionIndex += 1; else if (pLink->Vc==0) usActionIndex += 2; else usActionIndex = 0; break; case 21: if (pLink->Vc==STACKED_DISCp_CMD) ; else usActionIndex = 0; break; }; usAction = aLanLlcCondJump[usActionIndex]; } #endif #ifdef FSM_ACTION_CASES switch (usAction) { case 0: Status=DLC_STATUS_NO_ACTION; break; case 1: EnableLinkStation(pLink); pLink->Vi=pLink->Vb=pLink->Vc=0; label_1_1: pLink->State=1; case 11: label_11_1: TimerStart(&pLink->Ti); break; case 2: Status=DLC_STATUS_LINK_PROTOCOL_ERROR; break; case 3: Status=DLC_STATUS_IGNORE_FRAME; break; case 4: DisableLinkStation(pLink); pLink->State=0; break; case 5: label_5_1: pLink->Vb=STATE_LOCAL_BUSY; break; case 6: label_6_1: pLink->Vb=0; break; case 7: TimerStartIf(&pLink->T1); pLink->Vi=LOCAL_INIT_PENDING; DLC_SABME(1); pLink->State=2; TimerStop(&pLink->Ti); label_7_1: pLink->P_Ct=pLink->N2; label_7_2: pLink->Is_Ct=pLink->N2; break; case 8: pLink->Vi=OPER_MODE_PENDING; DLC_UA(pLink->Pf); pLink->State=2; pLink->Va=pLink->Vs=pLink->Vr=pLink->Vp=0; pLink->Ir_Ct=pLink->N3; TimerStart(&pLink->Ti); goto label_7_2; case 9: DLC_DM(0); label_9_1: EVENT_INDICATION(CONFIRM_DISCONNECT); label_9_2: TimerStart(&pLink->Ti); break; case 10: DLC_DM(pLink->Pf); pLink->Vi=0; goto label_9_1; case 12: label_12_1: ; break; case 13: label_13_1: DLC_DM(boolPollFinal); break; case 14: EVENT_INDICATION(INDICATE_CONNECT_REQUEST); label_14_1: pLink->Pf=boolPollFinal; pLink->Vi=REMOTE_INIT_PENDING; goto label_9_2; case 15: DLC_DM(1); break; case 16: DLC_DM(0); EVENT_INDICATION(CONFIRM_CONNECT_FAILED); EVENT_INDICATION(CONFIRM_DISCONNECT); TimerStop(&pLink->T1); label_16_1: pLink->Vi=0; goto label_1_1; case 17: TimerStop(&pLink->Ti); pLink->Vi=0; pLink->State=3; DLC_DISC(1); label_17_1: pLink->P_Ct=pLink->N2; label_17_2: TimerStart(&pLink->T1); break; case 18: EVENT_INDICATION(INDICATE_TI_TIMER_EXPIRED); label_18_1: pLink->Vi=IS_FRAME_PENDING; DLC_RNR_COMMAND(1); pLink->State=9; label_18_2: EVENT_INDICATION(CONFIRM_CONNECT); goto label_17_1; case 19: pLink->Vi=IS_FRAME_PENDING; EVENT_INDICATION(INDICATE_TI_TIMER_EXPIRED); label_19_1: pLink->State=8; DLC_RR_COMMAND(1); goto label_18_2; case 20: DLC_SABME(1); label_20_1: pLink->P_Ct--; goto label_17_2; case 21: EVENT_INDICATION(CONFIRM_CONNECT_FAILED); EVENT_INDICATION(INDICATE_LINK_LOST); goto label_16_1; case 22: pLink->Va=pLink->Vs=pLink->Vr=pLink->Vp=0; pLink->Vc=0; pLink->Ir_Ct=pLink->N3; pLink->Is_Ct=pLink->N2; goto label_18_1; case 23: pLink->Va=pLink->Vs=pLink->Vr=pLink->Vp=0,pLink->Vi=IS_FRAME_PENDING,pLink->Vc=0; pLink->Ir_Ct=pLink->N3; pLink->Is_Ct=pLink->N2; goto label_19_1; case 24: EVENT_INDICATION(CONFIRM_CONNECT_FAILED); EVENT_INDICATION(INDICATE_DM_DISC_RECEIVED); pLink->State=1; pLink->Vi=0; TimerStart(&pLink->Ti); label_24_1: TimerStop(&pLink->T1); goto label_13_1; case 25: EVENT_INDICATION(CONFIRM_CONNECT_FAILED); EVENT_INDICATION(INDICATE_DM_DISC_RECEIVED); pLink->State=1; TimerStop(&pLink->T1); label_25_1: pLink->Vi=0; goto label_9_2; case 26: pLink->Vi=(REMOTE_INIT_PENDING|LOCAL_INIT_PENDING); case 47: label_47_1: DLC_UA(boolPollFinal); break; case 27: label_27_1: TimerStart(&pLink->Ti); goto label_47_1; case 28: pLink->Va=pLink->Vs=pLink->Vr=pLink->Vp=0; pLink->Vi=IS_FRAME_PENDING; DLC_RNR_COMMAND(1); pLink->State=9; label_28_1: TimerStart(&pLink->T1); EVENT_INDICATION(CONFIRM_CONNECT); pLink->Vc=0; pLink->Ir_Ct=pLink->N3; goto label_7_1; case 29: pLink->Va=pLink->Vs=pLink->Vr=pLink->Vp=0; pLink->Vi=IS_FRAME_PENDING; pLink->State=8; DLC_RR_COMMAND(1); goto label_28_1; case 30: DLC_RNR_RESPONSE(0); label_30_1: pLink->State=6; label_30_2: Status=DLC_STATUS_DISCARD_INFO_FIELD; label_30_3: EnableSendProcess(pLink); label_30_4: EVENT_INDICATION(CONFIRM_CONNECT); goto label_25_1; case 31: SEND_ACK(pLink); label_31_1: Status=STATUS_SUCCESS;pLink->Vr+=2; case 42: label_42_1: pLink->State=5; goto label_30_3; case 32: DLC_RNR_RESPONSE(1); goto label_30_1; case 33: DLC_RR_RESPONSE(1); goto label_31_1; case 34: DLC_REJ_RESPONSE(0); label_34_1: pLink->State=7; goto label_30_2; case 35: pLink->State=6; EVENT_INDICATION(CONFIRM_CONNECT); pLink->Vi=0; EnableSendProcess(pLink); TimerStart(&pLink->Ti); Status=DLC_STATUS_DISCARD_INFO_FIELD; goto label_12_1; case 36: DLC_REJ_RESPONSE(1); goto label_34_1; case 37: label_37_1: pLink->State=13; pLink->Vb=(STATE_LOCAL_BUSY|STATE_REMOTE_BUSY); label_37_2: pLink->Is_Ct=pLink->N2; goto label_30_4; case 38: label_38_1: pLink->State=12; EVENT_INDICATION(INDICATE_REMOTE_BUSY); pLink->Vb=STATE_REMOTE_BUSY; goto label_37_2; case 39: DLC_RNR_RESPONSE(1); goto label_37_1; case 40: DLC_RR_RESPONSE(1); goto label_38_1; case 41: label_41_1: pLink->State=6; goto label_30_3; case 43: DLC_RNR_RESPONSE(1); goto label_41_1; case 44: DLC_RR_RESPONSE(1); goto label_42_1; case 45: DLC_DISC(1); goto label_20_1; case 46: label_46_1: EVENT_INDICATION(CONFIRM_DISCONNECT); goto label_1_1; case 48: TimerStop(&pLink->T1); goto label_46_1; case 49: EVENT_INDICATION(CONFIRM_DISCONNECT); pLink->State=1; TimerStart(&pLink->Ti); goto label_24_1; case 50: pLink->Vi=LOCAL_INIT_PENDING; DLC_SABME(1); pLink->State=2; label_50_1: TimerStop(&pLink->Ti); goto label_17_1; case 51: pLink->State=3; DLC_DISC(1); goto label_50_1; case 52: EVENT_INDICATION(INDICATE_TI_TIMER_EXPIRED); goto label_11_1; case 53: label_53_1: EVENT_INDICATION(INDICATE_DM_DISC_RECEIVED); label_53_2: pLink->State=1; goto label_27_1; case 54: label_54_1: EVENT_INDICATION(INDICATE_DM_DISC_RECEIVED); label_54_2: pLink->State=1; goto label_9_2; case 55: pLink->P_Ct=pLink->N2; label_55_1: pLink->State=20; EVENT_INDICATION(INDICATE_FRMR_RECEIVED); goto label_9_2; case 56: label_56_1: pLink->State=11; EVENT_INDICATION(INDICATE_RESET); goto label_14_1; case 57: DLC_FRMR(boolPollFinal); label_57_1: EVENT_INDICATION(INDICATE_FRMR_SENT); goto label_9_2; case 58: pLink->State=6; DLC_RNR_RESPONSE(0); pLink->Ir_Ct=pLink->N3; TimerStop(&pLink->T2); goto label_5_1; case 59: DLC_FRMR(0); label_59_1: pLink->DlcStatus.FrmrData.Reason=0x01; label_59_2: TimerStop(&pLink->T2); label_59_3: pLink->State=4; TimerStop(&pLink->T1); goto label_57_1; case 60: DLC_FRMR(1); goto label_59_1; case 61: TimerStart(&pLink->T1); pLink->Is_Ct--; pLink->Ir_Ct=pLink->N3; label_61_1: pLink->State=8; label_61_2: pLink->Vp=pLink->Vs; label_61_3: pLink->P_Ct=pLink->N2; break; case 62: TimerStop(&pLink->Ti); TimerStart(&pLink->T1); label_62_1: pLink->State=3; DLC_DISC(1); label_62_2: TimerStop(&pLink->T2); goto label_61_3; case 63: pLink->State=8; DisableSendProcess(pLink); DLC_RR_COMMAND(1); pLink->Vp=pLink->Vs; TimerStart(&pLink->T1); pLink->Ir_Ct=pLink->N3; goto label_62_2; case 64: EVENT_INDICATION(INDICATE_LINK_LOST); TimerStart(&pLink->T1); goto label_62_1; case 65: DLC_RR_RESPONSE(0); label_65_1: pLink->Ir_Ct=pLink->N3; break; case 66: TimerStop(&pLink->T2); case 89: // label_89_1: TimerStop(&pLink->T1); goto label_53_1; case 67: TimerStop(&pLink->T2); case 90: // label_90_1: TimerStop(&pLink->T1); goto label_54_1; case 68: pLink->State=20; EVENT_INDICATION(INDICATE_FRMR_RECEIVED); TimerStop(&pLink->T1); TimerStart(&pLink->Ti); goto label_62_2; case 69: TimerStop(&pLink->T2); case 92: // label_92_1: TimerStop(&pLink->T1); goto label_56_1; case 70: DLC_FRMR(0); goto label_59_2; case 71: label_71_1: SEND_ACK(pLink); label_71_2: Status=STATUS_SUCCESS;pLink->Vr+=2; case 76: label_76_1: UpdateVa(pLink); break; case 72: pLink->Ir_Ct=pLink->N3; TimerStop(&pLink->T2); label_72_1: DLC_RR_RESPONSE(1); goto label_71_2; case 73: DLC_REJ_RESPONSE(0); label_73_1: pLink->State=7; pLink->Ir_Ct=pLink->N3; Status=DLC_STATUS_DISCARD_INFO_FIELD; label_73_2: TimerStop(&pLink->T2); goto label_76_1; case 74: DLC_REJ_RESPONSE(1); goto label_73_1; case 75: label_75_1: ResendPackets(pLink),UpdateVa(pLink); label_75_2: pLink->Is_Ct--; break; case 77: pLink->Ir_Ct=pLink->N3; TimerStop(&pLink->T2); case 111: // label_111_1: DLC_RR_RESPONSE(1); goto label_75_1; case 78: label_78_1: DLC_RR_RESPONSE(1); goto label_73_2; case 79: pLink->Vb=STATE_REMOTE_BUSY,pLink->Is_Ct=pLink->N2; label_79_1: pLink->State=12; EVENT_INDICATION(INDICATE_REMOTE_BUSY); label_79_2: DisableSendProcess(pLink); goto label_76_1; case 80: pLink->Vb=STATE_REMOTE_BUSY; pLink->Ir_Ct=pLink->N3; DLC_RR_RESPONSE(1); pLink->Is_Ct=pLink->N2; TimerStop(&pLink->T2); goto label_79_1; case 81: pLink->Ir_Ct=pLink->N3; goto label_78_1; case 82: TimerStop(&pLink->Ti); TimerStart(&pLink->T1); DisableSendProcess(pLink); pLink->Vb=0; label_82_1: DLC_RR_COMMAND(1); goto label_61_1; case 83: DLC_FRMR(0); label_83_1: pLink->DlcStatus.FrmrData.Reason=0x01; goto label_59_3; case 84: DLC_FRMR(1); goto label_83_1; case 85: pLink->State=9; pLink->Ir_Ct=pLink->N3; label_85_1: TimerStart(&pLink->T1); pLink->Vp=pLink->Vs; pLink->P_Ct=pLink->N2; goto label_75_2; case 86: TimerStart(&pLink->T1); label_86_1: TimerStop(&pLink->Ti); label_86_2: pLink->State=3; DLC_DISC(1); goto label_61_3; case 87: pLink->State=9; label_87_1: DLC_RNR_COMMAND(1); label_87_2: DisableSendProcess(pLink); label_87_3: TimerStart(&pLink->T1); goto label_61_2; case 88: TimerStop(&pLink->T2); case 105: label_105_1: TimerStart(&pLink->T1); goto label_86_2; case 91: label_91_1: TimerStart(&pLink->Ti); label_91_2: TimerStop(&pLink->T1); label_91_3: pLink->State=20; EVENT_INDICATION(INDICATE_FRMR_RECEIVED); goto label_61_3; case 93: pLink->DlcStatus.FrmrData.Reason=0x08; case 106: label_106_1: DLC_FRMR(0); goto label_59_3; case 94: DLC_RNR_RESPONSE(0); case 109: label_109_1: Status=DLC_STATUS_DISCARD_INFO_FIELD; goto label_76_1; case 95: DLC_RNR_RESPONSE(1); goto label_109_1; case 96: DLC_RNR_RESPONSE(1); goto label_75_1; case 97: label_97_1: pLink->State=13; label_97_2: pLink->Vb=(STATE_LOCAL_BUSY|STATE_REMOTE_BUSY); label_97_3: pLink->Is_Ct=pLink->N2; goto label_79_2; case 98: DLC_RNR_RESPONSE(1); goto label_97_1; case 99: DLC_RNR_RESPONSE(1); goto label_76_1; case 100: pLink->State=14; DLC_RNR_RESPONSE(0); goto label_5_1; case 101: pLink->DlcStatus.FrmrData.Reason=00001; goto label_106_1; case 102: pLink->DlcStatus.FrmrData.Reason=00001; DLC_FRMR(1); goto label_59_3; case 103: pLink->State=10; goto label_85_1; case 104: label_104_1: pLink->State=10; DLC_RR_COMMAND(1); goto label_87_2; case 107: pLink->State=5; goto label_71_1; case 108: pLink->State=5; goto label_72_1; case 110: DLC_RR_RESPONSE(1); goto label_109_1; case 112: label_112_1: pLink->State=15; EVENT_INDICATION(INDICATE_REMOTE_BUSY); pLink->Vb=STATE_REMOTE_BUSY; goto label_97_3; case 113: DLC_RR_RESPONSE(1); goto label_112_1; case 114: DLC_RR_RESPONSE(1); goto label_76_1; case 115: pLink->State=9; pLink->Vb=STATE_LOCAL_BUSY; label_115_1: DLC_RNR_RESPONSE(0); label_115_2: TimerStop(&pLink->T2); goto label_65_1; case 116: DLC_FRMR(0); label_116_1: pLink->DlcStatus.FrmrData.Reason=0x01; label_116_2: pLink->State=4; EVENT_INDICATION(INDICATE_FRMR_SENT); label_116_3: TimerStop(&pLink->T1); label_116_4: TimerStop(&pLink->T2); goto label_11_1; case 117: DLC_FRMR(1); goto label_116_1; case 118: pLink->Vc=STACKED_DISCp_CMD; break; case 119: pLink->P_Ct--; DisableSendProcess(pLink); label_119_1: DLC_RR_COMMAND(1); pLink->Vp=pLink->Vs; TimerStart(&pLink->T1); goto label_115_2; case 120: EVENT_INDICATION(INDICATE_LINK_LOST); label_120_1: pLink->State=1; goto label_116_4; case 121: TimerStop(&pLink->T2); case 156: // label_156_1: EVENT_INDICATION(INDICATE_DM_DISC_RECEIVED); pLink->State=1; TimerStart(&pLink->Ti); TimerStop(&pLink->T1); goto label_47_1; case 122: EVENT_INDICATION(INDICATE_DM_DISC_RECEIVED); TimerStop(&pLink->T1); goto label_120_1; case 123: pLink->Vc=0; TimerStop(&pLink->T2); goto label_91_1; case 124: pLink->State=11; EVENT_INDICATION(INDICATE_RESET); pLink->Vi=REMOTE_INIT_PENDING; pLink->Pf=boolPollFinal; goto label_116_3; case 125: DLC_FRMR(0); pLink->Vc=0; goto label_116_2; case 126: SEND_ACK(pLink); Status=STATUS_SUCCESS;pLink->Vr+=2; case 148: label_148_1: AdjustWw(pLink); goto label_7_2; case 127: label_127_1: SEND_ACK(pLink); label_127_2: Status=STATUS_SUCCESS;pLink->Vr+=2; break; case 128: AdjustWw(pLink); pLink->Is_Ct=pLink->N2; case 129: // label_129_1: pLink->Ir_Ct=pLink->N3; TimerStop(&pLink->T2); label_128_2: DLC_RR_RESPONSE(1); goto label_127_2; case 130: pLink->State=5; UpdateVaChkpt(pLink); EnableSendProcess(pLink); goto label_127_1; case 131: UpdateVaChkpt(pLink),TimerStart(&pLink->T1); pLink->Vc=0; Status=DLC_STATUS_DISCARD_INFO_FIELD; TimerStop(&pLink->T2); goto label_86_1; case 132: DLC_REJ_RESPONSE(0); pLink->State=10; AdjustWw(pLink); pLink->Is_Ct=pLink->N2; label_132_1: Status=DLC_STATUS_DISCARD_INFO_FIELD; goto label_115_2; case 133: DLC_REJ_RESPONSE(0); label_133_1: pLink->State=10; goto label_132_1; case 134: DLC_REJ_RESPONSE(1); AdjustWw(pLink); pLink->Is_Ct=pLink->N2; goto label_133_1; case 135: DLC_REJ_RESPONSE(1); goto label_133_1; case 136: DLC_REJ_RESPONSE(0); pLink->State=7; UpdateVaChkpt(pLink); EnableSendProcess(pLink); goto label_132_1; case 137: UpdateVaChkpt(pLink),TimerStart(&pLink->T1); pLink->Vc=0; Status=DLC_STATUS_DISCARD_INFO_FIELD; TimerStop(&pLink->T2); goto label_86_2; case 138: label_138_1: ResendPackets(pLink); goto label_7_2; case 139: ResendPackets(pLink); DLC_RR_RESPONSE(1); pLink->Is_Ct=pLink->N2; goto label_115_2; case 140: label_140_1: TimerStop(&pLink->T2); case 191: label_191_1: DLC_RR_RESPONSE(1); break; case 141: pLink->State=5; label_141_1: UpdateVaChkpt(pLink); label_141_2: EnableSendProcess(pLink); break; case 142: UpdateVaChkpt(pLink),TimerStart(&pLink->T1); label_142_1: pLink->Vc=0; goto label_86_2; case 143: pLink->Vb=STATE_REMOTE_BUSY; goto label_148_1; case 144: pLink->Vb=STATE_REMOTE_BUSY; goto label_7_2; case 145: AdjustWw(pLink); case 146: // label_146_1: pLink->Vb=STATE_REMOTE_BUSY; label_145_2: pLink->Is_Ct=pLink->N2; case 150: label_150_1: pLink->Ir_Ct=pLink->N3; goto label_140_1; case 147: pLink->State=12; label_147_1: EVENT_INDICATION(INDICATE_REMOTE_BUSY); UpdateVaChkpt(pLink); goto label_7_2; case 149: AdjustWw(pLink); goto label_145_2; case 151: pLink->State=17; label_151_1: DLC_RR_RESPONSE(0); goto label_6_1; case 152: DLC_FRMR(0); label_152_1: pLink->DlcStatus.FrmrData.Reason=0x01; label_152_2: pLink->State=4; EVENT_INDICATION(INDICATE_FRMR_SENT); label_152_3: TimerStop(&pLink->T1); goto label_11_1; case 153: DLC_FRMR(1); goto label_152_1; case 154: DLC_RNR_COMMAND(1); label_154_1: DisableSendProcess(pLink); pLink->Vp=pLink->Vs; goto label_20_1; case 155: EVENT_INDICATION(INDICATE_LINK_LOST); goto label_1_1; case 157: EVENT_INDICATION(INDICATE_DM_DISC_RECEIVED); pLink->State=1; goto label_152_3; case 158: TimerStart(&pLink->Ti); goto label_91_2; case 159: pLink->State=11; EVENT_INDICATION(INDICATE_RESET); pLink->Vi=REMOTE_INIT_PENDING; pLink->Pf=boolPollFinal; goto label_152_3; case 160: DLC_FRMR(0); goto label_152_2; case 161: DLC_RNR_RESPONSE(0); Status=DLC_STATUS_DISCARD_INFO_FIELD; goto label_148_1; case 162: label_162_1: DLC_RNR_RESPONSE(0); case 168: label_168_1: Status=DLC_STATUS_DISCARD_INFO_FIELD; break; case 163: AdjustWw(pLink); pLink->Is_Ct=pLink->N2; case 164: // label_164_1: DLC_RNR_RESPONSE(1); goto label_168_1; case 165: pLink->State=6; UpdateVaChkpt(pLink); EnableSendProcess(pLink); goto label_162_1; case 166: UpdateVaChkpt(pLink),TimerStop(&pLink->Ti),TimerStart(&pLink->T1); label_166_1: pLink->Vc=0; pLink->State=3; DLC_DISC(1); pLink->P_Ct=pLink->N2; goto label_168_1; case 167: label_167_1: AdjustWw(pLink); pLink->Is_Ct=pLink->N2; goto label_168_1; case 169: pLink->State=6; label_169_1: UpdateVaChkpt(pLink); EnableSendProcess(pLink); goto label_168_1; case 170: DLC_RNR_RESPONSE(1); goto label_138_1; case 171: label_171_1: DLC_RNR_RESPONSE(1); break; case 172: pLink->State=6; goto label_141_1; case 173: UpdateVaChkpt(pLink),TimerStop(&pLink->Ti),TimerStart(&pLink->T1); goto label_142_1; case 174: pLink->Vb=(STATE_LOCAL_BUSY|STATE_REMOTE_BUSY); goto label_148_1; case 175: label_175_1: pLink->Vb=(STATE_LOCAL_BUSY|STATE_REMOTE_BUSY); goto label_7_2; case 176: AdjustWw(pLink); case 177: label_177_1: pLink->Vb=(STATE_LOCAL_BUSY|STATE_REMOTE_BUSY); label_176_2: pLink->Is_Ct=pLink->N2; goto label_171_1; case 178: pLink->State=13; label_178_1: UpdateVaChkpt(pLink); goto label_175_1; case 179: AdjustWw(pLink); goto label_176_2; case 180: pLink->State=16; goto label_5_1; case 181: DLC_RR_COMMAND(1); goto label_154_1; case 182: pLink->State=8; AdjustWw(pLink); pLink->Is_Ct=pLink->N2; goto label_127_1; case 183: pLink->State=8; goto label_127_1; case 184: pLink->State=8; AdjustWw(pLink); pLink->Is_Ct=pLink->N2; goto label_128_2; case 185: pLink->State=8; goto label_128_2; case 186: UpdateVaChkpt(pLink),TimerStart(&pLink->T1); goto label_166_1; case 187: DLC_RR_RESPONSE(1); goto label_167_1; case 188: DLC_RR_RESPONSE(1); goto label_168_1; case 189: label_189_1: pLink->State=7; goto label_169_1; case 190: DLC_RR_RESPONSE(1); goto label_138_1; case 192: pLink->State=7; goto label_141_1; case 193: AdjustWw(pLink); case 194: // label_194_1: pLink->Vb=STATE_REMOTE_BUSY; label_193_2: pLink->Is_Ct=pLink->N2; goto label_191_1; case 195: pLink->State=15; goto label_147_1; case 196: AdjustWw(pLink); goto label_193_2; case 197: DLC_DM(pLink->Pf); EVENT_INDICATION(CONFIRM_DISCONNECT); label_197_1: pLink->Vi=0; goto label_54_2; case 198: pLink->Vi=0; goto label_53_1; case 199: EVENT_INDICATION(INDICATE_DM_DISC_RECEIVED); goto label_197_1; case 200: pLink->Vi=0; TimerStart(&pLink->Ti); goto label_91_3; case 201: EVENT_INDICATION(INDICATE_RESET); goto label_9_2; case 202: pLink->State=13; pLink->Vb=(STATE_LOCAL_BUSY|STATE_REMOTE_BUSY); goto label_115_1; case 203: pLink->State=8; pLink->P_Ct=pLink->N2; goto label_119_1; case 204: pLink->State=5; pLink->Vb=0; EVENT_INDICATION(INDICATE_REMOTE_READY); label_204_1: UpdateVa(pLink); goto label_127_1; case 205: pLink->State=15; pLink->Ir_Ct=pLink->N3; label_205_1: DLC_REJ_RESPONSE(0); UpdateVa(pLink); TimerStop(&pLink->T2); goto label_168_1; case 206: pLink->State=15; pLink->Ir_Ct=pLink->N3; TimerStop(&pLink->T2); label_206_1: UpdateVa(pLink); label_206_2: Status=DLC_STATUS_DISCARD_INFO_FIELD; goto label_171_1; case 207: pLink->State=7; pLink->Vb=0; EVENT_INDICATION(INDICATE_REMOTE_READY); goto label_205_1; case 208: label_208_1: ResendPackets(pLink),UpdateVa(pLink); pLink->Is_Ct--; label_208_2: pLink->State=5; label_208_3: pLink->Vb=0; label_208_4: EVENT_INDICATION(INDICATE_REMOTE_READY); goto label_141_2; case 209: label_209_1: UpdateVa(pLink); goto label_208_2; case 210: pLink->Ir_Ct=pLink->N3; DLC_RR_RESPONSE(1); TimerStop(&pLink->T2); goto label_208_1; case 211: label_211_1: DLC_RR_RESPONSE(1); TimerStop(&pLink->T2); goto label_209_1; case 212: SEND_RR_CMD(1); TimerStart(&pLink->T1); pLink->State=8; pLink->Vb=0; EVENT_INDICATION(INDICATE_REMOTE_READY); UpdateVa(pLink); goto label_150_1; case 213: pLink->Ir_Ct=pLink->N3; goto label_211_1; case 214: pLink->State=8; label_214_1: TimerStart(&pLink->T1); pLink->Vb=0; DLC_RR_COMMAND(1); label_214_2: EVENT_INDICATION(INDICATE_REMOTE_READY); goto label_76_1; case 215: TimerStop(&pLink->Ti); TimerStart(&pLink->T1); pLink->Vb=STATE_REMOTE_BUSY; goto label_82_1; case 216: pLink->State=9; label_216_1: DLC_RNR_COMMAND(1); goto label_87_3; case 217: ResendPackets(pLink),UpdateVa(pLink); pLink->Is_Ct--; label_217_1: pLink->State=6; pLink->Vb=STATE_LOCAL_BUSY; goto label_208_4; case 218: ResendPackets(pLink),UpdateVa(pLink); pLink->State=6; pLink->Is_Ct--; pLink->Vb=STATE_LOCAL_BUSY; EVENT_INDICATION(INDICATE_REMOTE_READY); EnableSendProcess(pLink); goto label_171_1; case 219: pLink->State=9; label_219_1: UpdateVa(pLink),SEND_RNR_CMD(1); TimerStart(&pLink->T1); label_219_2: pLink->Vb=STATE_LOCAL_BUSY; goto label_171_1; case 220: pLink->State=6; EVENT_INDICATION(INDICATE_REMOTE_READY); EnableSendProcess(pLink); UpdateVa(pLink); goto label_219_2; case 221: DLC_RNR_COMMAND(1); pLink->State=9; TimerStart(&pLink->T1); label_221_1: pLink->Vb=STATE_LOCAL_BUSY; goto label_214_2; case 222: UpdateVa(pLink); goto label_217_1; case 223: TimerStop(&pLink->Ti); pLink->Vb=0; goto label_104_1; case 224: pLink->State=16; goto label_85_1; case 225: pLink->State=16; goto label_87_1; case 226: TimerStop(&pLink->T1); goto label_55_1; case 227: pLink->State=6; UpdateVa(pLink); goto label_162_1; case 228: pLink->State=6; goto label_206_1; case 229: label_229_1: ResendPackets(pLink),UpdateVa(pLink); break; case 230: DLC_RNR_RESPONSE(1); goto label_229_1; case 231: pLink->State=19; EVENT_INDICATION(INDICATE_REMOTE_BUSY); goto label_97_2; case 232: pLink->State=19; EVENT_INDICATION(INDICATE_REMOTE_BUSY); DisableSendProcess(pLink); UpdateVa(pLink); goto label_177_1; case 233: pLink->State=19; pLink->Vb=(STATE_LOCAL_BUSY|STATE_REMOTE_BUSY); label_233_1: DLC_RNR_RESPONSE(0); break; case 234: DLC_RR_COMMAND(1); pLink->State=10; goto label_87_3; case 235: pLink->State=12; goto label_204_1; case 236: pLink->State=12; Status=STATUS_SUCCESS;pLink->Vr+=2; UpdateVa(pLink); goto label_191_1; case 237: label_237_1: pLink->State=7; pLink->Vb=0; label_237_2: pLink->Is_Ct--; EVENT_INDICATION(INDICATE_REMOTE_READY); EnableSendProcess(pLink); goto label_229_1; case 238: DLC_RR_RESPONSE(1); goto label_237_1; case 239: UpdateVa(pLink),SEND_RR_CMD(1); TimerStart(&pLink->T1); pLink->Vb=0; pLink->State=10; EVENT_INDICATION(INDICATE_REMOTE_READY); goto label_191_1; case 240: DLC_RR_RESPONSE(1); case 242: // label_242_1: pLink->State=7; UpdateVa(pLink); goto label_208_3; case 241: pLink->State=10; goto label_214_1; case 243: pLink->State=18; DLC_RR_RESPONSE(0); case 264: label_264_1: pLink->Vb=STATE_REMOTE_BUSY; break; case 244: pLink->State=18; goto label_151_1; case 245: pLink->State=9; AdjustWw(pLink); pLink->Is_Ct=pLink->N2; label_245_1: Status=DLC_STATUS_DISCARD_INFO_FIELD; goto label_233_1; case 246: pLink->State=9; goto label_245_1; case 247: pLink->State=9; AdjustWw(pLink); pLink->Is_Ct=pLink->N2; goto label_206_2; case 248: pLink->State=9; goto label_206_2; case 249: pLink->State=14; goto label_169_1; case 250: label_250_1: ResendPackets(pLink); break; case 251: DLC_RNR_RESPONSE(1); goto label_250_1; case 252: pLink->Vs=pLink->Nr; pLink->State=14; goto label_141_1; case 253: pLink->State=19; goto label_178_1; case 254: UpdateVaChkpt(pLink),TimerStop(&pLink->Ti),TimerStart(&pLink->T1); pLink->Vc=0; pLink->State=3; DLC_DISC(1); pLink->P_Ct=pLink->N2; goto label_264_1; case 255: label_255_1: AdjustWw(pLink); break; case 256: pLink->State=14; UpdateVaChkpt(pLink); goto label_208_4; case 257: pLink->State=9; label_257_1: pLink->Vb=STATE_LOCAL_BUSY; goto label_233_1; case 258: DLC_REJ_RESPONSE(0); case 268: label_268_1: pLink->State=10; Status=DLC_STATUS_DISCARD_INFO_FIELD; pLink->Is_Ct=pLink->N2; goto label_255_1; case 259: DLC_REJ_RESPONSE(0); case 269: label_269_1: pLink->State=10; goto label_168_1; case 260: DLC_REJ_RESPONSE(1); goto label_268_1; case 261: DLC_REJ_RESPONSE(1); goto label_269_1; case 262: DLC_REJ_RESPONSE(0); goto label_189_1; case 263: pLink->Vp=pLink->Nr; label_263_1: UpdateVaChkpt(pLink),TimerStart(&pLink->T1); pLink->State=8; label_263_2: DLC_RR_COMMAND(1); break; case 265: DLC_RR_RESPONSE(1); goto label_264_1; case 266: pLink->Vp=pLink->Vs; goto label_263_1; case 267: pLink->State=16; goto label_257_1; case 270: DLC_RR_RESPONSE(1); goto label_268_1; case 271: DLC_RR_RESPONSE(1); goto label_269_1; case 272: UpdateVaChkpt(pLink),TimerStart(&pLink->T1),pLink->Vp=pLink->Nr; pLink->Is_Ct--; label_272_1: pLink->State=10; goto label_263_2; case 273: pLink->Is_Ct=pLink->N2; case 274: // label_274_1: UpdateVaChkpt(pLink),TimerStart(&pLink->T1),pLink->Vp=pLink->Vs; goto label_272_1; case 275: TimerStop(&pLink->Ti); pLink->Vb=STATE_REMOTE_BUSY; pLink->Vp=pLink->Vs; TimerStart(&pLink->T1); pLink->P_Ct=pLink->N2; goto label_272_1; case 276: pLink->State=16; goto label_216_1; case 277: pLink->State=13; EVENT_INDICATION(INDICATE_REMOTE_READY); UpdateVa(pLink); goto label_245_1; case 278: pLink->State=13; EVENT_INDICATION(INDICATE_REMOTE_READY); goto label_206_1; case 279: label_279_1: pLink->State=14; pLink->Vb=STATE_LOCAL_BUSY; goto label_237_2; case 280: DLC_RNR_RESPONSE(1); goto label_279_1; case 281: label_281_1: pLink->State=14; goto label_76_1; case 282: pLink->State=19; label_282_1: UpdateVa(pLink); goto label_171_1; case 283: pLink->State=16; EVENT_INDICATION(INDICATE_REMOTE_READY); goto label_219_1; case 284: pLink->State=14; pLink->Vb=STATE_LOCAL_BUSY; EVENT_INDICATION(INDICATE_REMOTE_READY); goto label_282_1; case 285: pLink->State=16; DLC_RNR_COMMAND(1); goto label_221_1; case 286: pLink->Vb=STATE_LOCAL_BUSY; EVENT_INDICATION(INDICATE_REMOTE_READY); goto label_281_1; case 287: pLink->P_Ct--; goto label_11_1; case 288: EVENT_INDICATION(INDICATE_TI_TIMER_EXPIRED); goto label_105_1; case 289: EVENT_INDICATION(INDICATE_TI_TIMER_EXPIRED); goto label_53_2; case 290: EVENT_INDICATION(INDICATE_TI_TIMER_EXPIRED); goto label_54_2; case 291: EVENT_INDICATION(INDICATE_FRMR_RECEIVED); break; }; #endif //######################################################################### //************************* CODE BEGINS *************************** // // Check first, if we have any events; FRMR data must be setup // before we can send or queue the FRMR response/command // frame (the status is OK whenever uchSendId != 0) // if (uchSendId != 0) { Status = SendLlcFrame(pLink, uchSendId); } // // Dynamic timer value: DLC maintains a dynamic value for the response // timer based on the average response times of the last poll commands. // This code calculates new timer values, if the last response time // is very different from the old values. // (By the way, is the reading of the absolute timer tick MP safe?, // it must be, otherwise you cannot implement a MP system). // And: 32000 * 40 ms = ~20 minutes, much longer than any sensible T1. // // What should actually happen: // // Average Poll response time: Response delay added to T1 and Ti: // // 40 ms 0 // 80 ms 16 * 40 = 640 ms // 120 ms 16 * 40 = 640 ms // 160 ms 32 * 40 = 1280 ms // 200 ms 32 * 40 = 1280 ms // 240 ms 48 * 40 = 1920 ms // ... // // We use big jumps to avoid to the timer reinitialization // after every checkpointing state. The algorithm should react // immediately, if the reponse time is raising very fast, but // the lowering of reponse time is based on sliding average // of the most recent response times. // We have used local hardcoded number 8 and mask 0xfff0 to make // this algorithm more readable (but more difficult to maintain). // if ((pLink->Flags & DLC_WAITING_RESPONSE_TO_POLL) && !(SecondaryStates[pLink->State] & LLC_CHECKPOINTING)) { SHORT LastResponseTime; USHORT NewAve; LastResponseTime = (SHORT)((USHORT)AbsoluteTime - pLink->LastTimeWhenCmdPollWasSent); if (LastResponseTime < 0) { LastResponseTime += (SHORT)0x8000; } LastResponseTime *= 8; // Magic multiplier // // We use simple sliding average to lower the reponse time, // where the newest reponse values has the highest weigth (12,5%). // But we must also be able to raise immediately the response time, // when the reponse time starts to grow. Thus the actual // response value is maximum of sliding average and last reponse // time. The 40 ms resonse time is to notified, because it is // a statistical thing. // NewAve = (USHORT)((pLink->AverageResponseTime * 7 + LastResponseTime) / 8); NewAve = (NewAve > (USHORT)LastResponseTime ? NewAve : LastResponseTime); pLink->Flags &= ~DLC_WAITING_RESPONSE_TO_POLL; // // The first poll query overrides always the constant initial value. // if (pLink->Flags & DLC_FIRST_POLL) { pLink->Flags &= ~DLC_FIRST_POLL; NewAve = LastResponseTime; } // // We don't want to trigger too easily the reinitialization // of the timers, because it's quite costly operation to be // done in every poll. // Otherwise we would reinitialize timer after every time, when // a poll is sent just before the main timer tick expires. // (This is not actually a good solution, because // the timers are reinitialized whenever r/16 changes. // The same mask is used in the timer initialisation // if ((NewAve & 0xfff0) != (pLink->AverageResponseTime & 0xfff0)) { pLink->AverageResponseTime = NewAve; InitializeLinkTimers(pLink); } else { pLink->AverageResponseTime = NewAve; } } // // Now we must release the locks when we call the upper levels which may // call back to this data link. Note that we kept the link closed during // send, because the order of the sent packet must not be changed // if (pLink->DlcStatus.StatusCode != 0) { // if (Status == DLC_STATUS_SUCCESS) { // // PADAPTER_CONTEXT pContext = pLink->Gen.pAdapterContext; SaveStatusChangeEvent(pLink, pLink->Gen.pAdapterContext->pLookBuf, boolResponse ); // } else { // pLink->DlcStatus.StatusCode = 0; // } } return Status; }