Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
llc
llc_if.c
Go to the documentation of this file.
1
/*
2
* llc_if.c - Defines LLC interface to upper layer
3
*
4
* Copyright (c) 1997 by Procom Technology, Inc.
5
* 2001-2003 by Arnaldo Carvalho de Melo <
[email protected]
>
6
*
7
* This program can be redistributed or modified under the terms of the
8
* GNU General Public License as published by the Free Software Foundation.
9
* This program is distributed without any warranty or implied warranty
10
* of merchantability or fitness for a particular purpose.
11
*
12
* See the GNU General Public License for more details.
13
*/
14
#include <
linux/gfp.h
>
15
#include <linux/module.h>
16
#include <linux/kernel.h>
17
#include <linux/netdevice.h>
18
#include <asm/errno.h>
19
#include <
net/llc_if.h
>
20
#include <
net/llc_sap.h
>
21
#include <
net/llc_s_ev.h
>
22
#include <
net/llc_conn.h
>
23
#include <
net/sock.h
>
24
#include <
net/llc_c_ev.h
>
25
#include <
net/llc_c_ac.h
>
26
#include <
net/llc_c_st.h
>
27
#include <
net/tcp_states.h
>
28
42
int
llc_build_and_send_pkt
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
)
43
{
44
struct
llc_conn_state_ev
*ev;
45
int
rc
= -
ECONNABORTED
;
46
struct
llc_sock
*llc = llc_sk(sk);
47
48
if
(
unlikely
(llc->
state
==
LLC_CONN_STATE_ADM
))
49
goto
out
;
50
rc = -
EBUSY
;
51
if
(
unlikely
(
llc_data_accept_state
(llc->
state
) ||
/* data_conn_refuse */
52
llc->
p_flag
)) {
53
llc->
failed_data_req
= 1;
54
goto
out
;
55
}
56
ev = llc_conn_ev(skb);
57
ev->
type
=
LLC_CONN_EV_TYPE_PRIM
;
58
ev->
prim
=
LLC_DATA_PRIM
;
59
ev->
prim_type
=
LLC_PRIM_TYPE_REQ
;
60
skb->
dev
= llc->
dev
;
61
rc =
llc_conn_state_process
(sk, skb);
62
out
:
63
return
rc
;
64
}
65
79
int
llc_establish_connection
(
struct
sock
*
sk
,
u8
*lmac,
u8
*dmac,
u8
dsap
)
80
{
81
int
rc
= -
EISCONN
;
82
struct
llc_addr
laddr, daddr;
83
struct
sk_buff
*
skb
;
84
struct
llc_sock
*llc = llc_sk(sk);
85
struct
sock
*existing;
86
87
laddr.
lsap
= llc->
sap
->laddr.lsap;
88
daddr.
lsap
=
dsap
;
89
memcpy
(daddr.
mac
, dmac,
sizeof
(daddr.
mac
));
90
memcpy
(laddr.
mac
, lmac,
sizeof
(laddr.
mac
));
91
existing =
llc_lookup_established
(llc->
sap
, &daddr, &laddr);
92
if
(existing) {
93
if
(existing->sk_state ==
TCP_ESTABLISHED
) {
94
sk = existing;
95
goto
out_put;
96
}
else
97
sock_put(existing);
98
}
99
sock_hold(sk);
100
rc = -
ENOMEM
;
101
skb = alloc_skb(0,
GFP_ATOMIC
);
102
if
(skb) {
103
struct
llc_conn_state_ev
*ev = llc_conn_ev(skb);
104
105
ev->
type
=
LLC_CONN_EV_TYPE_PRIM
;
106
ev->
prim
=
LLC_CONN_PRIM
;
107
ev->
prim_type
=
LLC_PRIM_TYPE_REQ
;
108
skb_set_owner_w(skb, sk);
109
rc =
llc_conn_state_process
(sk, skb);
110
}
111
out_put:
112
sock_put(sk);
113
return
rc
;
114
}
115
125
int
llc_send_disc
(
struct
sock
*
sk
)
126
{
127
u16
rc
= 1;
128
struct
llc_conn_state_ev
*ev;
129
struct
sk_buff
*
skb
;
130
131
sock_hold(sk);
132
if
(sk->
sk_type
!=
SOCK_STREAM
|| sk->sk_state !=
TCP_ESTABLISHED
||
133
llc_sk(sk)->
state
==
LLC_CONN_STATE_ADM
||
134
llc_sk(sk)->
state
==
LLC_CONN_OUT_OF_SVC
)
135
goto
out
;
136
/*
137
* Postpone unassigning the connection from its SAP and returning the
138
* connection until all ACTIONs have been completely executed
139
*/
140
skb = alloc_skb(0,
GFP_ATOMIC
);
141
if
(!skb)
142
goto
out
;
143
skb_set_owner_w(skb, sk);
144
sk->sk_state =
TCP_CLOSING
;
145
ev = llc_conn_ev(skb);
146
ev->
type
=
LLC_CONN_EV_TYPE_PRIM
;
147
ev->
prim
=
LLC_DISC_PRIM
;
148
ev->
prim_type
=
LLC_PRIM_TYPE_REQ
;
149
rc =
llc_conn_state_process
(sk, skb);
150
out
:
151
sock_put(sk);
152
return
rc
;
153
}
154
Generated on Thu Jan 10 2013 14:59:54 for Linux Kernel by
1.8.2