Blame view
net/llc/llc_station.c
3.22 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* * llc_station.c - station component of LLC * * Copyright (c) 1997 by Procom Technology, Inc. * 2001-2003 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. */ |
1da177e4c Linux-2.6.12-rc2 |
14 15 |
#include <linux/init.h> #include <linux/module.h> |
5a0e3ad6a include cleanup: ... |
16 |
#include <linux/slab.h> |
1da177e4c Linux-2.6.12-rc2 |
17 18 19 20 21 22 23 24 25 26 |
#include <net/llc.h> #include <net/llc_sap.h> #include <net/llc_conn.h> #include <net/llc_c_ac.h> #include <net/llc_s_ac.h> #include <net/llc_c_ev.h> #include <net/llc_c_st.h> #include <net/llc_s_ev.h> #include <net/llc_s_st.h> #include <net/llc_pdu.h> |
1da177e4c Linux-2.6.12-rc2 |
27 28 |
static int llc_stat_ev_rx_null_dsap_xid_c(struct sk_buff *skb) { |
1da177e4c Linux-2.6.12-rc2 |
29 |
struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); |
025e36332 llc2: Remove dead... |
30 |
return LLC_PDU_IS_CMD(pdu) && /* command PDU */ |
1da177e4c Linux-2.6.12-rc2 |
31 32 33 34 |
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 */ } |
1da177e4c Linux-2.6.12-rc2 |
35 36 |
static int llc_stat_ev_rx_null_dsap_test_c(struct sk_buff *skb) { |
1da177e4c Linux-2.6.12-rc2 |
37 |
struct llc_pdu_un *pdu = llc_pdu_un_hdr(skb); |
025e36332 llc2: Remove dead... |
38 |
return LLC_PDU_IS_CMD(pdu) && /* command PDU */ |
1da177e4c Linux-2.6.12-rc2 |
39 40 41 42 |
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 */ } |
1da177e4c Linux-2.6.12-rc2 |
43 44 45 46 |
static int llc_station_ac_send_xid_r(struct sk_buff *skb) { u8 mac_da[ETH_ALEN], dsap; int rc = 1; |
f83f1768f [LLC]: skb alloca... |
47 48 |
struct sk_buff *nskb = llc_alloc_frame(NULL, skb->dev, LLC_PDU_TYPE_U, sizeof(struct llc_xid_info)); |
1da177e4c Linux-2.6.12-rc2 |
49 50 51 52 |
if (!nskb) goto out; rc = 0; |
1da177e4c Linux-2.6.12-rc2 |
53 54 55 56 |
llc_pdu_decode_sa(skb, mac_da); llc_pdu_decode_ssap(skb, &dsap); llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, dsap, LLC_PDU_RSP); llc_pdu_init_as_xid_rsp(nskb, LLC_XID_NULL_CLASS_2, 127); |
a5a04819c [LLC]: station so... |
57 |
rc = llc_mac_hdr_init(nskb, skb->dev->dev_addr, mac_da); |
249ff1c6d [LLC]: Use some m... |
58 |
if (unlikely(rc)) |
1da177e4c Linux-2.6.12-rc2 |
59 |
goto free; |
5ecf9eea2 llc2: Remove the ... |
60 |
dev_queue_xmit(nskb); |
1da177e4c Linux-2.6.12-rc2 |
61 62 63 |
out: return rc; free: |
91d27a865 llc: free the rig... |
64 |
kfree_skb(nskb); |
1da177e4c Linux-2.6.12-rc2 |
65 66 67 68 69 70 71 |
goto out; } static int llc_station_ac_send_test_r(struct sk_buff *skb) { u8 mac_da[ETH_ALEN], dsap; int rc = 1; |
f83f1768f [LLC]: skb alloca... |
72 73 74 75 76 77 |
u32 data_size; struct sk_buff *nskb; /* The test request command is type U (llc_len = 3) */ data_size = ntohs(eth_hdr(skb)->h_proto) - 3; nskb = llc_alloc_frame(NULL, skb->dev, LLC_PDU_TYPE_U, data_size); |
1da177e4c Linux-2.6.12-rc2 |
78 79 80 81 |
if (!nskb) goto out; rc = 0; |
1da177e4c Linux-2.6.12-rc2 |
82 83 84 |
llc_pdu_decode_sa(skb, mac_da); llc_pdu_decode_ssap(skb, &dsap); llc_pdu_header_init(nskb, LLC_PDU_TYPE_U, 0, dsap, LLC_PDU_RSP); |
d57b1869b [NET] LLC: Fix wh... |
85 |
llc_pdu_init_as_test_rsp(nskb, skb); |
a5a04819c [LLC]: station so... |
86 |
rc = llc_mac_hdr_init(nskb, skb->dev->dev_addr, mac_da); |
249ff1c6d [LLC]: Use some m... |
87 |
if (unlikely(rc)) |
1da177e4c Linux-2.6.12-rc2 |
88 |
goto free; |
5ecf9eea2 llc2: Remove the ... |
89 |
dev_queue_xmit(nskb); |
1da177e4c Linux-2.6.12-rc2 |
90 91 92 |
out: return rc; free: |
91d27a865 llc: free the rig... |
93 |
kfree_skb(nskb); |
1da177e4c Linux-2.6.12-rc2 |
94 95 |
goto out; } |
1da177e4c Linux-2.6.12-rc2 |
96 |
/** |
1da177e4c Linux-2.6.12-rc2 |
97 98 99 100 101 102 103 |
* llc_station_rcv - send received pdu to the station state machine * @skb: received frame. * * Sends data unit to station state machine. */ static void llc_station_rcv(struct sk_buff *skb) { |
12ebc8b9a llc2: Collapse re... |
104 105 106 107 |
if (llc_stat_ev_rx_null_dsap_xid_c(skb)) llc_station_ac_send_xid_r(skb); else if (llc_stat_ev_rx_null_dsap_test_c(skb)) llc_station_ac_send_test_r(skb); |
04d191c25 llc2: Collapse th... |
108 |
kfree_skb(skb); |
1da177e4c Linux-2.6.12-rc2 |
109 |
} |
6024935f5 llc2: Fix silent ... |
110 |
void __init llc_station_init(void) |
1da177e4c Linux-2.6.12-rc2 |
111 |
{ |
aadf31de1 llc: Fix races be... |
112 |
llc_set_station_handler(llc_station_rcv); |
1da177e4c Linux-2.6.12-rc2 |
113 |
} |
f4f8720fe llc2: Call llc_st... |
114 |
void llc_station_exit(void) |
1da177e4c Linux-2.6.12-rc2 |
115 116 117 |
{ llc_set_station_handler(NULL); } |