1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * llc_s_st.c - Defines SAP component state machine transitions. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * The followed transitions are SAP component state machine transitions 5*4882a593Smuzhiyun * which are described in 802.2 LLC protocol standard document. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright (c) 1997 by Procom Technology, Inc. 8*4882a593Smuzhiyun * 2001-2003 by Arnaldo Carvalho de Melo <acme@conectiva.com.br> 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * This program can be redistributed or modified under the terms of the 11*4882a593Smuzhiyun * GNU General Public License as published by the Free Software Foundation. 12*4882a593Smuzhiyun * This program is distributed without any warranty or implied warranty 13*4882a593Smuzhiyun * of merchantability or fitness for a particular purpose. 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * See the GNU General Public License for more details. 16*4882a593Smuzhiyun */ 17*4882a593Smuzhiyun #include <linux/types.h> 18*4882a593Smuzhiyun #include <net/llc_if.h> 19*4882a593Smuzhiyun #include <net/llc_s_ev.h> 20*4882a593Smuzhiyun #include <net/llc_s_ac.h> 21*4882a593Smuzhiyun #include <net/llc_s_st.h> 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* dummy last-transition indicator; common to all state transition groups 24*4882a593Smuzhiyun * last entry for this state 25*4882a593Smuzhiyun * all members are zeros, .bss zeroes it 26*4882a593Smuzhiyun */ 27*4882a593Smuzhiyun static struct llc_sap_state_trans llc_sap_state_trans_end; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* state LLC_SAP_STATE_INACTIVE transition for 30*4882a593Smuzhiyun * LLC_SAP_EV_ACTIVATION_REQ event 31*4882a593Smuzhiyun */ 32*4882a593Smuzhiyun static const llc_sap_action_t llc_sap_inactive_state_actions_1[] = { 33*4882a593Smuzhiyun [0] = llc_sap_action_report_status, 34*4882a593Smuzhiyun [1] = NULL, 35*4882a593Smuzhiyun }; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun static struct llc_sap_state_trans llc_sap_inactive_state_trans_1 = { 38*4882a593Smuzhiyun .ev = llc_sap_ev_activation_req, 39*4882a593Smuzhiyun .next_state = LLC_SAP_STATE_ACTIVE, 40*4882a593Smuzhiyun .ev_actions = llc_sap_inactive_state_actions_1, 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* array of pointers; one to each transition */ 44*4882a593Smuzhiyun static struct llc_sap_state_trans *llc_sap_inactive_state_transitions[] = { 45*4882a593Smuzhiyun [0] = &llc_sap_inactive_state_trans_1, 46*4882a593Smuzhiyun [1] = &llc_sap_state_trans_end, 47*4882a593Smuzhiyun }; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* state LLC_SAP_STATE_ACTIVE transition for LLC_SAP_EV_RX_UI event */ 50*4882a593Smuzhiyun static const llc_sap_action_t llc_sap_active_state_actions_1[] = { 51*4882a593Smuzhiyun [0] = llc_sap_action_unitdata_ind, 52*4882a593Smuzhiyun [1] = NULL, 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun static struct llc_sap_state_trans llc_sap_active_state_trans_1 = { 56*4882a593Smuzhiyun .ev = llc_sap_ev_rx_ui, 57*4882a593Smuzhiyun .next_state = LLC_SAP_STATE_ACTIVE, 58*4882a593Smuzhiyun .ev_actions = llc_sap_active_state_actions_1, 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* state LLC_SAP_STATE_ACTIVE transition for LLC_SAP_EV_UNITDATA_REQ event */ 62*4882a593Smuzhiyun static const llc_sap_action_t llc_sap_active_state_actions_2[] = { 63*4882a593Smuzhiyun [0] = llc_sap_action_send_ui, 64*4882a593Smuzhiyun [1] = NULL, 65*4882a593Smuzhiyun }; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun static struct llc_sap_state_trans llc_sap_active_state_trans_2 = { 68*4882a593Smuzhiyun .ev = llc_sap_ev_unitdata_req, 69*4882a593Smuzhiyun .next_state = LLC_SAP_STATE_ACTIVE, 70*4882a593Smuzhiyun .ev_actions = llc_sap_active_state_actions_2, 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* state LLC_SAP_STATE_ACTIVE transition for LLC_SAP_EV_XID_REQ event */ 74*4882a593Smuzhiyun static const llc_sap_action_t llc_sap_active_state_actions_3[] = { 75*4882a593Smuzhiyun [0] = llc_sap_action_send_xid_c, 76*4882a593Smuzhiyun [1] = NULL, 77*4882a593Smuzhiyun }; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun static struct llc_sap_state_trans llc_sap_active_state_trans_3 = { 80*4882a593Smuzhiyun .ev = llc_sap_ev_xid_req, 81*4882a593Smuzhiyun .next_state = LLC_SAP_STATE_ACTIVE, 82*4882a593Smuzhiyun .ev_actions = llc_sap_active_state_actions_3, 83*4882a593Smuzhiyun }; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* state LLC_SAP_STATE_ACTIVE transition for LLC_SAP_EV_RX_XID_C event */ 86*4882a593Smuzhiyun static const llc_sap_action_t llc_sap_active_state_actions_4[] = { 87*4882a593Smuzhiyun [0] = llc_sap_action_send_xid_r, 88*4882a593Smuzhiyun [1] = NULL, 89*4882a593Smuzhiyun }; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun static struct llc_sap_state_trans llc_sap_active_state_trans_4 = { 92*4882a593Smuzhiyun .ev = llc_sap_ev_rx_xid_c, 93*4882a593Smuzhiyun .next_state = LLC_SAP_STATE_ACTIVE, 94*4882a593Smuzhiyun .ev_actions = llc_sap_active_state_actions_4, 95*4882a593Smuzhiyun }; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* state LLC_SAP_STATE_ACTIVE transition for LLC_SAP_EV_RX_XID_R event */ 98*4882a593Smuzhiyun static const llc_sap_action_t llc_sap_active_state_actions_5[] = { 99*4882a593Smuzhiyun [0] = llc_sap_action_xid_ind, 100*4882a593Smuzhiyun [1] = NULL, 101*4882a593Smuzhiyun }; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun static struct llc_sap_state_trans llc_sap_active_state_trans_5 = { 104*4882a593Smuzhiyun .ev = llc_sap_ev_rx_xid_r, 105*4882a593Smuzhiyun .next_state = LLC_SAP_STATE_ACTIVE, 106*4882a593Smuzhiyun .ev_actions = llc_sap_active_state_actions_5, 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun /* state LLC_SAP_STATE_ACTIVE transition for LLC_SAP_EV_TEST_REQ event */ 110*4882a593Smuzhiyun static const llc_sap_action_t llc_sap_active_state_actions_6[] = { 111*4882a593Smuzhiyun [0] = llc_sap_action_send_test_c, 112*4882a593Smuzhiyun [1] = NULL, 113*4882a593Smuzhiyun }; 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun static struct llc_sap_state_trans llc_sap_active_state_trans_6 = { 116*4882a593Smuzhiyun .ev = llc_sap_ev_test_req, 117*4882a593Smuzhiyun .next_state = LLC_SAP_STATE_ACTIVE, 118*4882a593Smuzhiyun .ev_actions = llc_sap_active_state_actions_6, 119*4882a593Smuzhiyun }; 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* state LLC_SAP_STATE_ACTIVE transition for LLC_SAP_EV_RX_TEST_C event */ 122*4882a593Smuzhiyun static const llc_sap_action_t llc_sap_active_state_actions_7[] = { 123*4882a593Smuzhiyun [0] = llc_sap_action_send_test_r, 124*4882a593Smuzhiyun [1] = NULL, 125*4882a593Smuzhiyun }; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun static struct llc_sap_state_trans llc_sap_active_state_trans_7 = { 128*4882a593Smuzhiyun .ev = llc_sap_ev_rx_test_c, 129*4882a593Smuzhiyun .next_state = LLC_SAP_STATE_ACTIVE, 130*4882a593Smuzhiyun .ev_actions = llc_sap_active_state_actions_7 131*4882a593Smuzhiyun }; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /* state LLC_SAP_STATE_ACTIVE transition for LLC_SAP_EV_RX_TEST_R event */ 134*4882a593Smuzhiyun static const llc_sap_action_t llc_sap_active_state_actions_8[] = { 135*4882a593Smuzhiyun [0] = llc_sap_action_test_ind, 136*4882a593Smuzhiyun [1] = NULL, 137*4882a593Smuzhiyun }; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun static struct llc_sap_state_trans llc_sap_active_state_trans_8 = { 140*4882a593Smuzhiyun .ev = llc_sap_ev_rx_test_r, 141*4882a593Smuzhiyun .next_state = LLC_SAP_STATE_ACTIVE, 142*4882a593Smuzhiyun .ev_actions = llc_sap_active_state_actions_8, 143*4882a593Smuzhiyun }; 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun /* state LLC_SAP_STATE_ACTIVE transition for 146*4882a593Smuzhiyun * LLC_SAP_EV_DEACTIVATION_REQ event 147*4882a593Smuzhiyun */ 148*4882a593Smuzhiyun static const llc_sap_action_t llc_sap_active_state_actions_9[] = { 149*4882a593Smuzhiyun [0] = llc_sap_action_report_status, 150*4882a593Smuzhiyun [1] = NULL, 151*4882a593Smuzhiyun }; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun static struct llc_sap_state_trans llc_sap_active_state_trans_9 = { 154*4882a593Smuzhiyun .ev = llc_sap_ev_deactivation_req, 155*4882a593Smuzhiyun .next_state = LLC_SAP_STATE_INACTIVE, 156*4882a593Smuzhiyun .ev_actions = llc_sap_active_state_actions_9 157*4882a593Smuzhiyun }; 158*4882a593Smuzhiyun 159*4882a593Smuzhiyun /* array of pointers; one to each transition */ 160*4882a593Smuzhiyun static struct llc_sap_state_trans *llc_sap_active_state_transitions[] = { 161*4882a593Smuzhiyun [0] = &llc_sap_active_state_trans_2, 162*4882a593Smuzhiyun [1] = &llc_sap_active_state_trans_1, 163*4882a593Smuzhiyun [2] = &llc_sap_active_state_trans_3, 164*4882a593Smuzhiyun [3] = &llc_sap_active_state_trans_4, 165*4882a593Smuzhiyun [4] = &llc_sap_active_state_trans_5, 166*4882a593Smuzhiyun [5] = &llc_sap_active_state_trans_6, 167*4882a593Smuzhiyun [6] = &llc_sap_active_state_trans_7, 168*4882a593Smuzhiyun [7] = &llc_sap_active_state_trans_8, 169*4882a593Smuzhiyun [8] = &llc_sap_active_state_trans_9, 170*4882a593Smuzhiyun [9] = &llc_sap_state_trans_end, 171*4882a593Smuzhiyun }; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun /* SAP state transition table */ 174*4882a593Smuzhiyun struct llc_sap_state llc_sap_state_table[LLC_NR_SAP_STATES] = { 175*4882a593Smuzhiyun [LLC_SAP_STATE_INACTIVE - 1] = { 176*4882a593Smuzhiyun .curr_state = LLC_SAP_STATE_INACTIVE, 177*4882a593Smuzhiyun .transitions = llc_sap_inactive_state_transitions, 178*4882a593Smuzhiyun }, 179*4882a593Smuzhiyun [LLC_SAP_STATE_ACTIVE - 1] = { 180*4882a593Smuzhiyun .curr_state = LLC_SAP_STATE_ACTIVE, 181*4882a593Smuzhiyun .transitions = llc_sap_active_state_transitions, 182*4882a593Smuzhiyun }, 183*4882a593Smuzhiyun }; 184