Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | /* * llc_evnt.c - LLC station component event match functions * Description : * Functions in this module are implementation of station component events. * Details of events can be found in IEEE-802.2 standard document. * All functions have one station and one event as input argument. All of * them return 0 On success and 1 otherwise. * * Copyright (c) 1997 by Procom Technology, Inc. * 2001 by Arnaldo Carvalho de Melo <acme@conectiva.com.br> * * This program can be redistributed or modified under the terms of the * GNU General Public License as published by the Free Software Foundation. * This program is distributed without any warranty or implied warranty * of merchantability or fitness for a particular purpose. * * See the GNU General Public License for more details. */ #include <linux/socket.h> #include <net/sock.h> #include <net/llc_if.h> #include <net/llc_main.h> #include <net/llc_evnt.h> #include <net/llc_pdu.h> int llc_stat_ev_enable_with_dup_addr_check(struct llc_station *station, struct sk_buff *skb) { struct llc_station_state_ev *ev = llc_station_ev(skb); return ev->type == LLC_STATION_EV_TYPE_SIMPLE && ev->prim_type == LLC_STATION_EV_ENABLE_WITH_DUP_ADDR_CHECK ? 0 : 1; } int llc_stat_ev_enable_without_dup_addr_check(struct llc_station *station, struct sk_buff *skb) { struct llc_station_state_ev *ev = llc_station_ev(skb); return ev->type == LLC_STATION_EV_TYPE_SIMPLE && ev->prim_type == LLC_STATION_EV_ENABLE_WITHOUT_DUP_ADDR_CHECK ? 0 : 1; } int llc_stat_ev_ack_tmr_exp_lt_retry_cnt_max_retry(struct llc_station *station, struct sk_buff *skb) { struct llc_station_state_ev *ev = llc_station_ev(skb); return ev->type == LLC_STATION_EV_TYPE_ACK_TMR && station->retry_count < station->maximum_retry ? 0 : 1; } int llc_stat_ev_ack_tmr_exp_eq_retry_cnt_max_retry(struct llc_station *station, struct sk_buff *skb) { struct llc_station_state_ev *ev = llc_station_ev(skb); return ev->type == LLC_STATION_EV_TYPE_ACK_TMR && station->retry_count == station->maximum_retry ? 0 : 1; } int llc_stat_ev_rx_null_dsap_xid_c(struct llc_station *station, struct sk_buff *skb) { struct llc_station_state_ev *ev = llc_station_ev(skb); struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); return ev->type == LLC_STATION_EV_TYPE_PDU && !LLC_PDU_IS_CMD(pdu) && /* command PDU */ !LLC_PDU_TYPE_IS_U(pdu) && /* U type PDU */ LLC_U_PDU_CMD(pdu) == LLC_1_PDU_CMD_XID && !pdu->dsap ? 0 : 1; /* NULL DSAP value */ } int llc_stat_ev_rx_null_dsap_0_xid_r_xid_r_cnt_eq(struct llc_station *station, struct sk_buff *skb) { struct llc_station_state_ev *ev = llc_station_ev(skb); struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); return ev->type == LLC_STATION_EV_TYPE_PDU && !LLC_PDU_IS_RSP(pdu) && /* response PDU */ !LLC_PDU_TYPE_IS_U(pdu) && /* U type PDU */ LLC_U_PDU_RSP(pdu) == LLC_1_PDU_CMD_XID && !pdu->dsap && /* NULL DSAP value */ !station->xid_r_count ? 0 : 1; } int llc_stat_ev_rx_null_dsap_1_xid_r_xid_r_cnt_eq(struct llc_station *station, struct sk_buff *skb) { struct llc_station_state_ev *ev = llc_station_ev(skb); struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); return ev->type == LLC_STATION_EV_TYPE_PDU && !LLC_PDU_IS_RSP(pdu) && /* response PDU */ !LLC_PDU_TYPE_IS_U(pdu) && /* U type PDU */ LLC_U_PDU_RSP(pdu) == LLC_1_PDU_CMD_XID && !pdu->dsap && /* NULL DSAP value */ station->xid_r_count == 1 ? 0 : 1; } int llc_stat_ev_rx_null_dsap_test_c(struct llc_station *station, struct sk_buff *skb) { struct llc_station_state_ev *ev = llc_station_ev(skb); struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); return ev->type == LLC_STATION_EV_TYPE_PDU && !LLC_PDU_IS_CMD(pdu) && /* command PDU */ !LLC_PDU_TYPE_IS_U(pdu) && /* U type PDU */ LLC_U_PDU_CMD(pdu) == LLC_1_PDU_CMD_TEST && !pdu->dsap ? 0 : 1; /* NULL DSAP */ } int llc_stat_ev_disable_req(struct llc_station *station, struct sk_buff *skb) { struct llc_station_state_ev *ev = llc_station_ev(skb); return ev->type == LLC_STATION_EV_TYPE_PRIM && ev->prim == LLC_DISABLE_PRIM && ev->prim_type == LLC_PRIM_TYPE_REQ ? 0 : 1; } |