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