llc_c_ev.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769
  1. /*
  2. * llc_c_ev.c - Connection component state transition event qualifiers
  3. *
  4. * A 'state' consists of a number of possible event matching functions,
  5. * the actions associated with each being executed when that event is
  6. * matched; a 'state machine' accepts events in a serial fashion from an
  7. * event queue. Each event is passed to each successive event matching
  8. * function until a match is made (the event matching function returns
  9. * success, or '0') or the list of event matching functions is exhausted.
  10. * If a match is made, the actions associated with the event are executed
  11. * and the state is changed to that event's transition state. Before some
  12. * events are recognized, even after a match has been made, a certain
  13. * number of 'event qualifier' functions must also be executed. If these
  14. * all execute successfully, then the event is finally executed.
  15. *
  16. * These event functions must return 0 for success, to show a matched
  17. * event, of 1 if the event does not match. Event qualifier functions
  18. * must return a 0 for success or a non-zero for failure. Each function
  19. * is simply responsible for verifying one single thing and returning
  20. * either a success or failure.
  21. *
  22. * All of followed event functions are described in 802.2 LLC Protocol
  23. * standard document except two functions that we added that will explain
  24. * in their comments, at below.
  25. *
  26. * Copyright (c) 1997 by Procom Technology, Inc.
  27. * 2001-2003 by Arnaldo Carvalho de Melo <acme@conectiva.com.br>
  28. *
  29. * This program can be redistributed or modified under the terms of the
  30. * GNU General Public License as published by the Free Software Foundation.
  31. * This program is distributed without any warranty or implied warranty
  32. * of merchantability or fitness for a particular purpose.
  33. *
  34. * See the GNU General Public License for more details.
  35. */
  36. #include <linux/netdevice.h>
  37. #include <net/llc_conn.h>
  38. #include <net/llc_sap.h>
  39. #include <net/sock.h>
  40. #include <net/llc_c_ev.h>
  41. #include <net/llc_pdu.h>
  42. #if 1
  43. #define dprintk(args...) printk(KERN_DEBUG args)
  44. #else
  45. #define dprintk(args...)
  46. #endif
  47. extern u16 llc_circular_between(u8 a, u8 b, u8 c);
  48. /**
  49. * llc_util_ns_inside_rx_window - check if sequence number is in rx window
  50. * @ns: sequence number of received pdu.
  51. * @vr: sequence number which receiver expects to receive.
  52. * @rw: receive window size of receiver.
  53. *
  54. * Checks if sequence number of received PDU is in range of receive
  55. * window. Returns 0 for success, 1 otherwise
  56. */
  57. static u16 llc_util_ns_inside_rx_window(u8 ns, u8 vr, u8 rw)
  58. {
  59. return !llc_circular_between(vr, ns,
  60. (vr + rw - 1) % LLC_2_SEQ_NBR_MODULO);
  61. }
  62. /**
  63. * llc_util_nr_inside_tx_window - check if sequence number is in tx window
  64. * @sk: current connection.
  65. * @nr: N(R) of received PDU.
  66. *
  67. * This routine checks if N(R) of received PDU is in range of transmit
  68. * window; on the other hand checks if received PDU acknowledges some
  69. * outstanding PDUs that are in transmit window. Returns 0 for success, 1
  70. * otherwise.
  71. */
  72. static u16 llc_util_nr_inside_tx_window(struct sock *sk, u8 nr)
  73. {
  74. u8 nr1, nr2;
  75. struct sk_buff *skb;
  76. struct llc_pdu_sn *pdu;
  77. struct llc_sock *llc = llc_sk(sk);
  78. int rc = 0;
  79. if (llc->dev->flags & IFF_LOOPBACK)
  80. goto out;
  81. rc = 1;
  82. if (skb_queue_empty(&llc->pdu_unack_q))
  83. goto out;
  84. skb = skb_peek(&llc->pdu_unack_q);
  85. pdu = llc_pdu_sn_hdr(skb);
  86. nr1 = LLC_I_GET_NS(pdu);
  87. skb = skb_peek_tail(&llc->pdu_unack_q);
  88. pdu = llc_pdu_sn_hdr(skb);
  89. nr2 = LLC_I_GET_NS(pdu);
  90. rc = !llc_circular_between(nr1, nr, (nr2 + 1) % LLC_2_SEQ_NBR_MODULO);
  91. out:
  92. return rc;
  93. }
  94. int llc_conn_ev_conn_req(struct sock *sk, struct sk_buff *skb)
  95. {
  96. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  97. return ev->prim == LLC_CONN_PRIM &&
  98. ev->prim_type == LLC_PRIM_TYPE_REQ ? 0 : 1;
  99. }
  100. int llc_conn_ev_data_req(struct sock *sk, struct sk_buff *skb)
  101. {
  102. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  103. return ev->prim == LLC_DATA_PRIM &&
  104. ev->prim_type == LLC_PRIM_TYPE_REQ ? 0 : 1;
  105. }
  106. int llc_conn_ev_disc_req(struct sock *sk, struct sk_buff *skb)
  107. {
  108. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  109. return ev->prim == LLC_DISC_PRIM &&
  110. ev->prim_type == LLC_PRIM_TYPE_REQ ? 0 : 1;
  111. }
  112. int llc_conn_ev_rst_req(struct sock *sk, struct sk_buff *skb)
  113. {
  114. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  115. return ev->prim == LLC_RESET_PRIM &&
  116. ev->prim_type == LLC_PRIM_TYPE_REQ ? 0 : 1;
  117. }
  118. int llc_conn_ev_local_busy_detected(struct sock *sk, struct sk_buff *skb)
  119. {
  120. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  121. return ev->type == LLC_CONN_EV_TYPE_SIMPLE &&
  122. ev->prim_type == LLC_CONN_EV_LOCAL_BUSY_DETECTED ? 0 : 1;
  123. }
  124. int llc_conn_ev_local_busy_cleared(struct sock *sk, struct sk_buff *skb)
  125. {
  126. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  127. return ev->type == LLC_CONN_EV_TYPE_SIMPLE &&
  128. ev->prim_type == LLC_CONN_EV_LOCAL_BUSY_CLEARED ? 0 : 1;
  129. }
  130. int llc_conn_ev_rx_bad_pdu(struct sock *sk, struct sk_buff *skb)
  131. {
  132. return 1;
  133. }
  134. int llc_conn_ev_rx_disc_cmd_pbit_set_x(struct sock *sk, struct sk_buff *skb)
  135. {
  136. struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb);
  137. return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_U(pdu) &&
  138. LLC_U_PDU_CMD(pdu) == LLC_2_PDU_CMD_DISC ? 0 : 1;
  139. }
  140. int llc_conn_ev_rx_dm_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb)
  141. {
  142. struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb);
  143. return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_U(pdu) &&
  144. LLC_U_PDU_RSP(pdu) == LLC_2_PDU_RSP_DM ? 0 : 1;
  145. }
  146. int llc_conn_ev_rx_frmr_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb)
  147. {
  148. struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb);
  149. return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_U(pdu) &&
  150. LLC_U_PDU_RSP(pdu) == LLC_2_PDU_RSP_FRMR ? 0 : 1;
  151. }
  152. int llc_conn_ev_rx_i_cmd_pbit_set_0(struct sock *sk, struct sk_buff *skb)
  153. {
  154. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  155. return llc_conn_space(sk, skb) &&
  156. LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) &&
  157. LLC_I_PF_IS_0(pdu) &&
  158. LLC_I_GET_NS(pdu) == llc_sk(sk)->vR ? 0 : 1;
  159. }
  160. int llc_conn_ev_rx_i_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb)
  161. {
  162. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  163. return llc_conn_space(sk, skb) &&
  164. LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) &&
  165. LLC_I_PF_IS_1(pdu) &&
  166. LLC_I_GET_NS(pdu) == llc_sk(sk)->vR ? 0 : 1;
  167. }
  168. int llc_conn_ev_rx_i_cmd_pbit_set_0_unexpd_ns(struct sock *sk,
  169. struct sk_buff *skb)
  170. {
  171. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  172. u8 vr = llc_sk(sk)->vR;
  173. u8 ns = LLC_I_GET_NS(pdu);
  174. return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) &&
  175. LLC_I_PF_IS_0(pdu) && ns != vr &&
  176. !llc_util_ns_inside_rx_window(ns, vr, llc_sk(sk)->rw) ? 0 : 1;
  177. }
  178. int llc_conn_ev_rx_i_cmd_pbit_set_1_unexpd_ns(struct sock *sk,
  179. struct sk_buff *skb)
  180. {
  181. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  182. u8 vr = llc_sk(sk)->vR;
  183. u8 ns = LLC_I_GET_NS(pdu);
  184. return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) &&
  185. LLC_I_PF_IS_1(pdu) && ns != vr &&
  186. !llc_util_ns_inside_rx_window(ns, vr, llc_sk(sk)->rw) ? 0 : 1;
  187. }
  188. int llc_conn_ev_rx_i_cmd_pbit_set_x_inval_ns(struct sock *sk,
  189. struct sk_buff *skb)
  190. {
  191. struct llc_pdu_sn * pdu = llc_pdu_sn_hdr(skb);
  192. u8 vr = llc_sk(sk)->vR;
  193. u8 ns = LLC_I_GET_NS(pdu);
  194. u16 rc = LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ns != vr &&
  195. llc_util_ns_inside_rx_window(ns, vr, llc_sk(sk)->rw) ? 0 : 1;
  196. if (!rc)
  197. dprintk("%s: matched, state=%d, ns=%d, vr=%d\n",
  198. __FUNCTION__, llc_sk(sk)->state, ns, vr);
  199. return rc;
  200. }
  201. int llc_conn_ev_rx_i_rsp_fbit_set_0(struct sock *sk, struct sk_buff *skb)
  202. {
  203. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  204. return llc_conn_space(sk, skb) &&
  205. LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) &&
  206. LLC_I_PF_IS_0(pdu) &&
  207. LLC_I_GET_NS(pdu) == llc_sk(sk)->vR ? 0 : 1;
  208. }
  209. int llc_conn_ev_rx_i_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb)
  210. {
  211. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  212. return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) &&
  213. LLC_I_PF_IS_1(pdu) &&
  214. LLC_I_GET_NS(pdu) == llc_sk(sk)->vR ? 0 : 1;
  215. }
  216. int llc_conn_ev_rx_i_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb)
  217. {
  218. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  219. return llc_conn_space(sk, skb) &&
  220. LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) &&
  221. LLC_I_GET_NS(pdu) == llc_sk(sk)->vR ? 0 : 1;
  222. }
  223. int llc_conn_ev_rx_i_rsp_fbit_set_0_unexpd_ns(struct sock *sk,
  224. struct sk_buff *skb)
  225. {
  226. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  227. u8 vr = llc_sk(sk)->vR;
  228. u8 ns = LLC_I_GET_NS(pdu);
  229. return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) &&
  230. LLC_I_PF_IS_0(pdu) && ns != vr &&
  231. !llc_util_ns_inside_rx_window(ns, vr, llc_sk(sk)->rw) ? 0 : 1;
  232. }
  233. int llc_conn_ev_rx_i_rsp_fbit_set_1_unexpd_ns(struct sock *sk,
  234. struct sk_buff *skb)
  235. {
  236. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  237. u8 vr = llc_sk(sk)->vR;
  238. u8 ns = LLC_I_GET_NS(pdu);
  239. return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) &&
  240. LLC_I_PF_IS_1(pdu) && ns != vr &&
  241. !llc_util_ns_inside_rx_window(ns, vr, llc_sk(sk)->rw) ? 0 : 1;
  242. }
  243. int llc_conn_ev_rx_i_rsp_fbit_set_x_unexpd_ns(struct sock *sk,
  244. struct sk_buff *skb)
  245. {
  246. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  247. u8 vr = llc_sk(sk)->vR;
  248. u8 ns = LLC_I_GET_NS(pdu);
  249. return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ns != vr &&
  250. !llc_util_ns_inside_rx_window(ns, vr, llc_sk(sk)->rw) ? 0 : 1;
  251. }
  252. int llc_conn_ev_rx_i_rsp_fbit_set_x_inval_ns(struct sock *sk,
  253. struct sk_buff *skb)
  254. {
  255. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  256. u8 vr = llc_sk(sk)->vR;
  257. u8 ns = LLC_I_GET_NS(pdu);
  258. u16 rc = LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_I(pdu) && ns != vr &&
  259. llc_util_ns_inside_rx_window(ns, vr, llc_sk(sk)->rw) ? 0 : 1;
  260. if (!rc)
  261. dprintk("%s: matched, state=%d, ns=%d, vr=%d\n",
  262. __FUNCTION__, llc_sk(sk)->state, ns, vr);
  263. return rc;
  264. }
  265. int llc_conn_ev_rx_rej_cmd_pbit_set_0(struct sock *sk, struct sk_buff *skb)
  266. {
  267. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  268. return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) &&
  269. LLC_S_PF_IS_0(pdu) &&
  270. LLC_S_PDU_CMD(pdu) == LLC_2_PDU_CMD_REJ ? 0 : 1;
  271. }
  272. int llc_conn_ev_rx_rej_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb)
  273. {
  274. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  275. return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) &&
  276. LLC_S_PF_IS_1(pdu) &&
  277. LLC_S_PDU_CMD(pdu) == LLC_2_PDU_CMD_REJ ? 0 : 1;
  278. }
  279. int llc_conn_ev_rx_rej_rsp_fbit_set_0(struct sock *sk, struct sk_buff *skb)
  280. {
  281. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  282. return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) &&
  283. LLC_S_PF_IS_0(pdu) &&
  284. LLC_S_PDU_RSP(pdu) == LLC_2_PDU_RSP_REJ ? 0 : 1;
  285. }
  286. int llc_conn_ev_rx_rej_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb)
  287. {
  288. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  289. return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) &&
  290. LLC_S_PF_IS_1(pdu) &&
  291. LLC_S_PDU_RSP(pdu) == LLC_2_PDU_RSP_REJ ? 0 : 1;
  292. }
  293. int llc_conn_ev_rx_rej_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb)
  294. {
  295. struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb);
  296. return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) &&
  297. LLC_S_PDU_RSP(pdu) == LLC_2_PDU_RSP_REJ ? 0 : 1;
  298. }
  299. int llc_conn_ev_rx_rnr_cmd_pbit_set_0(struct sock *sk, struct sk_buff *skb)
  300. {
  301. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  302. return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) &&
  303. LLC_S_PF_IS_0(pdu) &&
  304. LLC_S_PDU_CMD(pdu) == LLC_2_PDU_CMD_RNR ? 0 : 1;
  305. }
  306. int llc_conn_ev_rx_rnr_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb)
  307. {
  308. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  309. return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) &&
  310. LLC_S_PF_IS_1(pdu) &&
  311. LLC_S_PDU_CMD(pdu) == LLC_2_PDU_CMD_RNR ? 0 : 1;
  312. }
  313. int llc_conn_ev_rx_rnr_rsp_fbit_set_0(struct sock *sk, struct sk_buff *skb)
  314. {
  315. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  316. return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) &&
  317. LLC_S_PF_IS_0(pdu) &&
  318. LLC_S_PDU_RSP(pdu) == LLC_2_PDU_RSP_RNR ? 0 : 1;
  319. }
  320. int llc_conn_ev_rx_rnr_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb)
  321. {
  322. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  323. return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) &&
  324. LLC_S_PF_IS_1(pdu) &&
  325. LLC_S_PDU_RSP(pdu) == LLC_2_PDU_RSP_RNR ? 0 : 1;
  326. }
  327. int llc_conn_ev_rx_rr_cmd_pbit_set_0(struct sock *sk, struct sk_buff *skb)
  328. {
  329. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  330. return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) &&
  331. LLC_S_PF_IS_0(pdu) &&
  332. LLC_S_PDU_CMD(pdu) == LLC_2_PDU_CMD_RR ? 0 : 1;
  333. }
  334. int llc_conn_ev_rx_rr_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb)
  335. {
  336. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  337. return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_S(pdu) &&
  338. LLC_S_PF_IS_1(pdu) &&
  339. LLC_S_PDU_CMD(pdu) == LLC_2_PDU_CMD_RR ? 0 : 1;
  340. }
  341. int llc_conn_ev_rx_rr_rsp_fbit_set_0(struct sock *sk, struct sk_buff *skb)
  342. {
  343. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  344. return llc_conn_space(sk, skb) &&
  345. LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) &&
  346. LLC_S_PF_IS_0(pdu) &&
  347. LLC_S_PDU_RSP(pdu) == LLC_2_PDU_RSP_RR ? 0 : 1;
  348. }
  349. int llc_conn_ev_rx_rr_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb)
  350. {
  351. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  352. return llc_conn_space(sk, skb) &&
  353. LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_S(pdu) &&
  354. LLC_S_PF_IS_1(pdu) &&
  355. LLC_S_PDU_RSP(pdu) == LLC_2_PDU_RSP_RR ? 0 : 1;
  356. }
  357. int llc_conn_ev_rx_sabme_cmd_pbit_set_x(struct sock *sk, struct sk_buff *skb)
  358. {
  359. struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb);
  360. return LLC_PDU_IS_CMD(pdu) && LLC_PDU_TYPE_IS_U(pdu) &&
  361. LLC_U_PDU_CMD(pdu) == LLC_2_PDU_CMD_SABME ? 0 : 1;
  362. }
  363. int llc_conn_ev_rx_ua_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb)
  364. {
  365. struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb);
  366. return LLC_PDU_IS_RSP(pdu) && LLC_PDU_TYPE_IS_U(pdu) &&
  367. LLC_U_PDU_RSP(pdu) == LLC_2_PDU_RSP_UA ? 0 : 1;
  368. }
  369. int llc_conn_ev_rx_xxx_cmd_pbit_set_1(struct sock *sk, struct sk_buff *skb)
  370. {
  371. u16 rc = 1;
  372. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  373. if (LLC_PDU_IS_CMD(pdu)) {
  374. if (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) {
  375. if (LLC_I_PF_IS_1(pdu))
  376. rc = 0;
  377. } else if (LLC_PDU_TYPE_IS_U(pdu) && LLC_U_PF_IS_1(pdu))
  378. rc = 0;
  379. }
  380. return rc;
  381. }
  382. int llc_conn_ev_rx_xxx_cmd_pbit_set_x(struct sock *sk, struct sk_buff *skb)
  383. {
  384. u16 rc = 1;
  385. struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb);
  386. if (LLC_PDU_IS_CMD(pdu)) {
  387. if (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu))
  388. rc = 0;
  389. else if (LLC_PDU_TYPE_IS_U(pdu))
  390. switch (LLC_U_PDU_CMD(pdu)) {
  391. case LLC_2_PDU_CMD_SABME:
  392. case LLC_2_PDU_CMD_DISC:
  393. rc = 0;
  394. break;
  395. }
  396. }
  397. return rc;
  398. }
  399. int llc_conn_ev_rx_xxx_rsp_fbit_set_1(struct sock *sk, struct sk_buff *skb)
  400. {
  401. u16 rc = 1;
  402. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  403. if (LLC_PDU_IS_RSP(pdu)) {
  404. if (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) {
  405. if (LLC_I_PF_IS_1(pdu))
  406. rc = 0;
  407. } else if (LLC_PDU_TYPE_IS_U(pdu))
  408. switch (LLC_U_PDU_RSP(pdu)) {
  409. case LLC_2_PDU_RSP_UA:
  410. case LLC_2_PDU_RSP_DM:
  411. case LLC_2_PDU_RSP_FRMR:
  412. if (LLC_U_PF_IS_1(pdu))
  413. rc = 0;
  414. break;
  415. }
  416. }
  417. return rc;
  418. }
  419. int llc_conn_ev_rx_xxx_rsp_fbit_set_x(struct sock *sk, struct sk_buff *skb)
  420. {
  421. u16 rc = 1;
  422. struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb);
  423. if (LLC_PDU_IS_RSP(pdu)) {
  424. if (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu))
  425. rc = 0;
  426. else if (LLC_PDU_TYPE_IS_U(pdu))
  427. switch (LLC_U_PDU_RSP(pdu)) {
  428. case LLC_2_PDU_RSP_UA:
  429. case LLC_2_PDU_RSP_DM:
  430. case LLC_2_PDU_RSP_FRMR:
  431. rc = 0;
  432. break;
  433. }
  434. }
  435. return rc;
  436. }
  437. int llc_conn_ev_rx_zzz_cmd_pbit_set_x_inval_nr(struct sock *sk,
  438. struct sk_buff *skb)
  439. {
  440. u16 rc = 1;
  441. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  442. u8 vs = llc_sk(sk)->vS;
  443. u8 nr = LLC_I_GET_NR(pdu);
  444. if (LLC_PDU_IS_CMD(pdu) &&
  445. (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) &&
  446. nr != vs && llc_util_nr_inside_tx_window(sk, nr)) {
  447. dprintk("%s: matched, state=%d, vs=%d, nr=%d\n",
  448. __FUNCTION__, llc_sk(sk)->state, vs, nr);
  449. rc = 0;
  450. }
  451. return rc;
  452. }
  453. int llc_conn_ev_rx_zzz_rsp_fbit_set_x_inval_nr(struct sock *sk,
  454. struct sk_buff *skb)
  455. {
  456. u16 rc = 1;
  457. struct llc_pdu_sn *pdu = llc_pdu_sn_hdr(skb);
  458. u8 vs = llc_sk(sk)->vS;
  459. u8 nr = LLC_I_GET_NR(pdu);
  460. if (LLC_PDU_IS_RSP(pdu) &&
  461. (LLC_PDU_TYPE_IS_I(pdu) || LLC_PDU_TYPE_IS_S(pdu)) &&
  462. nr != vs && llc_util_nr_inside_tx_window(sk, nr)) {
  463. rc = 0;
  464. dprintk("%s: matched, state=%d, vs=%d, nr=%d\n",
  465. __FUNCTION__, llc_sk(sk)->state, vs, nr);
  466. }
  467. return rc;
  468. }
  469. int llc_conn_ev_rx_any_frame(struct sock *sk, struct sk_buff *skb)
  470. {
  471. return 0;
  472. }
  473. int llc_conn_ev_p_tmr_exp(struct sock *sk, struct sk_buff *skb)
  474. {
  475. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  476. return ev->type != LLC_CONN_EV_TYPE_P_TMR;
  477. }
  478. int llc_conn_ev_ack_tmr_exp(struct sock *sk, struct sk_buff *skb)
  479. {
  480. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  481. return ev->type != LLC_CONN_EV_TYPE_ACK_TMR;
  482. }
  483. int llc_conn_ev_rej_tmr_exp(struct sock *sk, struct sk_buff *skb)
  484. {
  485. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  486. return ev->type != LLC_CONN_EV_TYPE_REJ_TMR;
  487. }
  488. int llc_conn_ev_busy_tmr_exp(struct sock *sk, struct sk_buff *skb)
  489. {
  490. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  491. return ev->type != LLC_CONN_EV_TYPE_BUSY_TMR;
  492. }
  493. int llc_conn_ev_init_p_f_cycle(struct sock *sk, struct sk_buff *skb)
  494. {
  495. return 1;
  496. }
  497. int llc_conn_ev_tx_buffer_full(struct sock *sk, struct sk_buff *skb)
  498. {
  499. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  500. return ev->type == LLC_CONN_EV_TYPE_SIMPLE &&
  501. ev->prim_type == LLC_CONN_EV_TX_BUFF_FULL ? 0 : 1;
  502. }
  503. /* Event qualifier functions
  504. *
  505. * these functions simply verify the value of a state flag associated with
  506. * the connection and return either a 0 for success or a non-zero value
  507. * for not-success; verify the event is the type we expect
  508. */
  509. int llc_conn_ev_qlfy_data_flag_eq_1(struct sock *sk, struct sk_buff *skb)
  510. {
  511. return llc_sk(sk)->data_flag != 1;
  512. }
  513. int llc_conn_ev_qlfy_data_flag_eq_0(struct sock *sk, struct sk_buff *skb)
  514. {
  515. return llc_sk(sk)->data_flag;
  516. }
  517. int llc_conn_ev_qlfy_data_flag_eq_2(struct sock *sk, struct sk_buff *skb)
  518. {
  519. return llc_sk(sk)->data_flag != 2;
  520. }
  521. int llc_conn_ev_qlfy_p_flag_eq_1(struct sock *sk, struct sk_buff *skb)
  522. {
  523. return llc_sk(sk)->p_flag != 1;
  524. }
  525. /**
  526. * conn_ev_qlfy_last_frame_eq_1 - checks if frame is last in tx window
  527. * @sk: current connection structure.
  528. * @skb: current event.
  529. *
  530. * This function determines when frame which is sent, is last frame of
  531. * transmit window, if it is then this function return zero else return
  532. * one. This function is used for sending last frame of transmit window
  533. * as I-format command with p-bit set to one. Returns 0 if frame is last
  534. * frame, 1 otherwise.
  535. */
  536. int llc_conn_ev_qlfy_last_frame_eq_1(struct sock *sk, struct sk_buff *skb)
  537. {
  538. return !(skb_queue_len(&llc_sk(sk)->pdu_unack_q) + 1 == llc_sk(sk)->k);
  539. }
  540. /**
  541. * conn_ev_qlfy_last_frame_eq_0 - checks if frame isn't last in tx window
  542. * @sk: current connection structure.
  543. * @skb: current event.
  544. *
  545. * This function determines when frame which is sent, isn't last frame of
  546. * transmit window, if it isn't then this function return zero else return
  547. * one. Returns 0 if frame isn't last frame, 1 otherwise.
  548. */
  549. int llc_conn_ev_qlfy_last_frame_eq_0(struct sock *sk, struct sk_buff *skb)
  550. {
  551. return skb_queue_len(&llc_sk(sk)->pdu_unack_q) + 1 == llc_sk(sk)->k;
  552. }
  553. int llc_conn_ev_qlfy_p_flag_eq_0(struct sock *sk, struct sk_buff *skb)
  554. {
  555. return llc_sk(sk)->p_flag;
  556. }
  557. int llc_conn_ev_qlfy_p_flag_eq_f(struct sock *sk, struct sk_buff *skb)
  558. {
  559. u8 f_bit;
  560. llc_pdu_decode_pf_bit(skb, &f_bit);
  561. return llc_sk(sk)->p_flag == f_bit ? 0 : 1;
  562. }
  563. int llc_conn_ev_qlfy_remote_busy_eq_0(struct sock *sk, struct sk_buff *skb)
  564. {
  565. return llc_sk(sk)->remote_busy_flag;
  566. }
  567. int llc_conn_ev_qlfy_remote_busy_eq_1(struct sock *sk, struct sk_buff *skb)
  568. {
  569. return !llc_sk(sk)->remote_busy_flag;
  570. }
  571. int llc_conn_ev_qlfy_retry_cnt_lt_n2(struct sock *sk, struct sk_buff *skb)
  572. {
  573. return !(llc_sk(sk)->retry_count < llc_sk(sk)->n2);
  574. }
  575. int llc_conn_ev_qlfy_retry_cnt_gte_n2(struct sock *sk, struct sk_buff *skb)
  576. {
  577. return !(llc_sk(sk)->retry_count >= llc_sk(sk)->n2);
  578. }
  579. int llc_conn_ev_qlfy_s_flag_eq_1(struct sock *sk, struct sk_buff *skb)
  580. {
  581. return !llc_sk(sk)->s_flag;
  582. }
  583. int llc_conn_ev_qlfy_s_flag_eq_0(struct sock *sk, struct sk_buff *skb)
  584. {
  585. return llc_sk(sk)->s_flag;
  586. }
  587. int llc_conn_ev_qlfy_cause_flag_eq_1(struct sock *sk, struct sk_buff *skb)
  588. {
  589. return !llc_sk(sk)->cause_flag;
  590. }
  591. int llc_conn_ev_qlfy_cause_flag_eq_0(struct sock *sk, struct sk_buff *skb)
  592. {
  593. return llc_sk(sk)->cause_flag;
  594. }
  595. int llc_conn_ev_qlfy_set_status_conn(struct sock *sk, struct sk_buff *skb)
  596. {
  597. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  598. ev->status = LLC_STATUS_CONN;
  599. return 0;
  600. }
  601. int llc_conn_ev_qlfy_set_status_disc(struct sock *sk, struct sk_buff *skb)
  602. {
  603. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  604. ev->status = LLC_STATUS_DISC;
  605. return 0;
  606. }
  607. int llc_conn_ev_qlfy_set_status_failed(struct sock *sk, struct sk_buff *skb)
  608. {
  609. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  610. ev->status = LLC_STATUS_FAILED;
  611. return 0;
  612. }
  613. int llc_conn_ev_qlfy_set_status_remote_busy(struct sock *sk,
  614. struct sk_buff *skb)
  615. {
  616. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  617. ev->status = LLC_STATUS_REMOTE_BUSY;
  618. return 0;
  619. }
  620. int llc_conn_ev_qlfy_set_status_refuse(struct sock *sk, struct sk_buff *skb)
  621. {
  622. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  623. ev->status = LLC_STATUS_REFUSE;
  624. return 0;
  625. }
  626. int llc_conn_ev_qlfy_set_status_conflict(struct sock *sk, struct sk_buff *skb)
  627. {
  628. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  629. ev->status = LLC_STATUS_CONFLICT;
  630. return 0;
  631. }
  632. int llc_conn_ev_qlfy_set_status_rst_done(struct sock *sk, struct sk_buff *skb)
  633. {
  634. struct llc_conn_state_ev *ev = llc_conn_ev(skb);
  635. ev->status = LLC_STATUS_RESET_DONE;
  636. return 0;
  637. }