Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
081fc6c7
Commit
081fc6c7
authored
Sep 11, 2003
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge davem@nuts.ninka.net:/disk1/davem/BK/net-2.5
into kernel.bkbits.net:/home/davem/net-2.5
parents
36f1b589
ee2dea7d
Changes
39
Hide whitespace changes
Inline
Side-by-side
Showing
39 changed files
with
987 additions
and
716 deletions
+987
-716
crypto/proc.c
crypto/proc.c
+8
-0
include/linux/atmclip.h
include/linux/atmclip.h
+0
-4
net/atm/br2684.c
net/atm/br2684.c
+4
-3
net/atm/clip.c
net/atm/clip.c
+7
-0
net/atm/ipcommon.c
net/atm/ipcommon.c
+0
-10
net/atm/proc.c
net/atm/proc.c
+736
-424
net/atm/resources.c
net/atm/resources.c
+30
-1
net/atm/resources.h
net/atm/resources.h
+5
-0
net/bluetooth/af_bluetooth.c
net/bluetooth/af_bluetooth.c
+0
-1
net/bluetooth/bnep/sock.c
net/bluetooth/bnep/sock.c
+3
-0
net/bluetooth/hci_sock.c
net/bluetooth/hci_sock.c
+2
-0
net/bridge/br_forward.c
net/bridge/br_forward.c
+1
-0
net/core/dev.c
net/core/dev.c
+4
-10
net/ipv4/arp.c
net/ipv4/arp.c
+3
-8
net/ipv4/fib_hash.c
net/ipv4/fib_hash.c
+4
-10
net/ipv4/icmp.c
net/ipv4/icmp.c
+1
-1
net/ipv4/igmp.c
net/ipv4/igmp.c
+4
-11
net/ipv4/ip_input.c
net/ipv4/ip_input.c
+1
-0
net/ipv4/netfilter/ip_nat_tftp.c
net/ipv4/netfilter/ip_nat_tftp.c
+1
-1
net/ipv4/netfilter/ipt_MASQUERADE.c
net/ipv4/netfilter/ipt_MASQUERADE.c
+14
-40
net/ipv4/netfilter/ipt_REJECT.c
net/ipv4/netfilter/ipt_REJECT.c
+14
-24
net/ipv4/proc.c
net/ipv4/proc.c
+5
-12
net/ipv4/raw.c
net/ipv4/raw.c
+5
-11
net/ipv4/route.c
net/ipv4/route.c
+1
-1
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_ipv4.c
+11
-8
net/ipv4/udp.c
net/ipv4/udp.c
+4
-5
net/ipv6/addrconf.c
net/ipv6/addrconf.c
+42
-54
net/ipv6/anycast.c
net/ipv6/anycast.c
+3
-5
net/ipv6/ip6_flowlabel.c
net/ipv6/ip6_flowlabel.c
+2
-7
net/ipv6/mcast.c
net/ipv6/mcast.c
+5
-11
net/ipv6/proc.c
net/ipv6/proc.c
+32
-19
net/ipv6/raw.c
net/ipv6/raw.c
+2
-6
net/ipv6/tcp_ipv6.c
net/ipv6/tcp_ipv6.c
+2
-0
net/sched/estimator.c
net/sched/estimator.c
+0
-1
net/sched/police.c
net/sched/police.c
+0
-1
net/sched/sch_api.c
net/sched/sch_api.c
+17
-18
net/sched/sch_atm.c
net/sched/sch_atm.c
+11
-5
net/sched/sch_htb.c
net/sched/sch_htb.c
+0
-1
net/xfrm/xfrm_user.c
net/xfrm/xfrm_user.c
+3
-3
No files found.
crypto/proc.c
View file @
081fc6c7
...
...
@@ -57,6 +57,7 @@ static int c_show(struct seq_file *m, void *p)
switch
(
alg
->
cra_flags
&
CRYPTO_ALG_TYPE_MASK
)
{
case
CRYPTO_ALG_TYPE_CIPHER
:
seq_printf
(
m
,
"type : cipher
\n
"
);
seq_printf
(
m
,
"blocksize : %u
\n
"
,
alg
->
cra_blocksize
);
seq_printf
(
m
,
"min keysize : %u
\n
"
,
alg
->
cra_cipher
.
cia_min_keysize
);
...
...
@@ -65,10 +66,17 @@ static int c_show(struct seq_file *m, void *p)
break
;
case
CRYPTO_ALG_TYPE_DIGEST
:
seq_printf
(
m
,
"type : digest
\n
"
);
seq_printf
(
m
,
"blocksize : %u
\n
"
,
alg
->
cra_blocksize
);
seq_printf
(
m
,
"digestsize : %u
\n
"
,
alg
->
cra_digest
.
dia_digestsize
);
break
;
case
CRYPTO_ALG_TYPE_COMPRESS
:
seq_printf
(
m
,
"type : compression
\n
"
);
break
;
default:
seq_printf
(
m
,
"type : unknown
\n
"
);
break
;
}
seq_putc
(
m
,
'\n'
);
...
...
include/linux/atmclip.h
View file @
081fc6c7
...
...
@@ -18,8 +18,4 @@
#define SIOCMKCLIP _IO('a',ATMIOC_CLIP)
/* create IP interface */
#ifdef __KERNEL__
extern
const
unsigned
char
llc_oui
[
6
];
#endif
#endif
net/atm/br2684.c
View file @
081fc6c7
...
...
@@ -732,9 +732,10 @@ static int br2684_seq_show(struct seq_file *seq, void *v)
#ifdef CONFIG_ATM_BR2684_IPFILTER
#define b1(var, byte) ((u8 *) &brvcc->filter.var)[byte]
#define bs(var) b1(var, 0), b1(var, 1), b1(var, 2), b1(var, 3)
if
(
brvcc
->
filter
.
netmask
!=
0
&&
pos
--
==
0
)
return
sprintf
(
buf
,
" filter=%d.%d.%d.%d/"
"%d.%d.%d.%d
\n
"
,
bs
(
prefix
),
bs
(
netmask
));
if
(
brvcc
->
filter
.
netmask
!=
0
)
seq_printf
(
seq
,
" filter=%d.%d.%d.%d/"
"%d.%d.%d.%d
\n
"
,
bs
(
prefix
),
bs
(
netmask
));
#undef bs
#undef b1
#endif
/* CONFIG_ATM_BR2684_IPFILTER */
...
...
net/atm/clip.c
View file @
081fc6c7
...
...
@@ -189,6 +189,13 @@ static int clip_arp_rcv(struct sk_buff *skb)
return
0
;
}
static
const
unsigned
char
llc_oui
[]
=
{
0xaa
,
/* DSAP: non-ISO */
0xaa
,
/* SSAP: non-ISO */
0x03
,
/* Ctrl: Unnumbered Information Command PDU */
0x00
,
/* OUI: EtherType */
0x00
,
0x00
};
static
void
clip_push
(
struct
atm_vcc
*
vcc
,
struct
sk_buff
*
skb
)
{
...
...
net/atm/ipcommon.c
View file @
081fc6c7
...
...
@@ -22,15 +22,6 @@
#endif
const
unsigned
char
llc_oui
[]
=
{
0xaa
,
/* DSAP: non-ISO */
0xaa
,
/* SSAP: non-ISO */
0x03
,
/* Ctrl: Unnumbered Information Command PDU */
0x00
,
/* OUI: EtherType */
0x00
,
0x00
};
/*
* skb_migrate appends the list at "from" to "to", emptying "from" in the
* process. skb_migrate is atomic with respect to all other skb operations on
...
...
@@ -67,5 +58,4 @@ void skb_migrate(struct sk_buff_head *from,struct sk_buff_head *to)
}
EXPORT_SYMBOL
(
llc_oui
);
EXPORT_SYMBOL
(
skb_migrate
);
net/atm/proc.c
View file @
081fc6c7
/* net/atm/proc.c - ATM /proc interface */
/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
/*
* The mechanism used here isn't designed for speed but rather for convenience
* of implementation. We only return one entry per read system call, so we can
* be reasonably sure not to overrun the page and race conditions may lead to
* the addition or omission of some lines but never to any corruption of a
* line's internal structure.
/* net/atm/proc.c - ATM /proc interface
*
* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA
*
*
Making the whole thing slightly more efficient is left as an exercise to the
*
reader. (Suggestions: wrapper which loops to get several entries per system
*
call; or make --left slightly more clever to avoid O(n^2) characteristics.)
*
I find it fast enough on my unloaded 266 MHz Pentium 2 :-)
*
seq_file api usage by romieu@fr.zoreil.com
*
*
Evaluating the efficiency of the whole thing if left as an exercise to
*
the reader.
*/
#include <linux/config.h>
#include <linux/module.h>
/* for EXPORT_SYMBOL */
#include <linux/string.h>
...
...
@@ -24,6 +16,7 @@
#include <linux/fs.h>
#include <linux/stat.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/errno.h>
#include <linux/atm.h>
#include <linux/atmdev.h>
...
...
@@ -51,119 +44,202 @@
static
ssize_t
proc_dev_atm_read
(
struct
file
*
file
,
char
*
buf
,
size_t
count
,
loff_t
*
pos
);
static
ssize_t
proc_spec_atm_read
(
struct
file
*
file
,
char
*
buf
,
size_t
count
,
loff_t
*
pos
);
static
struct
file_operations
proc_
dev_atm_operation
s
=
{
static
struct
file_operations
proc_
atm_dev_op
s
=
{
.
owner
=
THIS_MODULE
,
.
read
=
proc_dev_atm_read
,
};
static
struct
file_operations
proc_spec_atm_operations
=
{
.
owner
=
THIS_MODULE
,
.
read
=
proc_spec_atm_read
,
};
static
void
add_stats
(
char
*
buf
,
const
char
*
aal
,
static
void
add_stats
(
struct
seq_file
*
seq
,
const
char
*
aal
,
const
struct
k_atm_aal_stats
*
stats
)
{
s
printf
(
strchr
(
buf
,
0
),
"%s ( %d %d %d %d %d )"
,
aal
,
s
eq_printf
(
seq
,
"%s ( %d %d %d %d %d )"
,
aal
,
atomic_read
(
&
stats
->
tx
),
atomic_read
(
&
stats
->
tx_err
),
atomic_read
(
&
stats
->
rx
),
atomic_read
(
&
stats
->
rx_err
),
atomic_read
(
&
stats
->
rx_drop
));
}
static
void
atm_dev_info
(
const
struct
atm_dev
*
dev
,
char
*
buf
)
static
void
atm_dev_info
(
struct
seq_file
*
seq
,
const
struct
atm_dev
*
dev
)
{
int
off
,
i
;
int
i
;
off
=
sprintf
(
buf
,
"%3d %-8s"
,
dev
->
number
,
dev
->
type
);
seq_printf
(
seq
,
"%3d %-8s"
,
dev
->
number
,
dev
->
type
);
for
(
i
=
0
;
i
<
ESI_LEN
;
i
++
)
off
+=
sprintf
(
buf
+
off
,
"%02x"
,
dev
->
esi
[
i
]);
s
trcat
(
buf
,
" "
);
add_stats
(
buf
,
"0"
,
&
dev
->
stats
.
aal0
);
s
trcat
(
buf
,
" "
);
add_stats
(
buf
,
"5"
,
&
dev
->
stats
.
aal5
);
s
printf
(
strchr
(
buf
,
0
)
,
"
\t
[%d]"
,
atomic_read
(
&
dev
->
refcnt
));
s
trcat
(
buf
,
"
\n
"
);
seq_printf
(
seq
,
"%02x"
,
dev
->
esi
[
i
]);
s
eq_puts
(
seq
,
" "
);
add_stats
(
seq
,
"0"
,
&
dev
->
stats
.
aal0
);
s
eq_puts
(
seq
,
" "
);
add_stats
(
seq
,
"5"
,
&
dev
->
stats
.
aal5
);
s
eq_printf
(
seq
,
"
\t
[%d]"
,
atomic_read
(
&
dev
->
refcnt
));
s
eq_putc
(
seq
,
'\n'
);
}
#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
static
int
svc_addr
(
char
*
buf
,
struct
sockaddr_atmsvc
*
addr
)
static
void
svc_addr
(
struct
seq_file
*
seq
,
struct
sockaddr_atmsvc
*
addr
)
{
static
int
code
[]
=
{
1
,
2
,
10
,
6
,
1
,
0
};
static
int
e164
[]
=
{
1
,
8
,
4
,
6
,
1
,
0
};
int
*
fields
;
int
len
,
i
,
j
,
pos
;
len
=
0
;
if
(
*
addr
->
sas_addr
.
pub
)
{
strcpy
(
buf
,
addr
->
sas_addr
.
pub
);
len
=
strlen
(
addr
->
sas_addr
.
pub
);
buf
+=
len
;
if
(
*
addr
->
sas_addr
.
prv
)
{
*
buf
++
=
'+'
;
len
++
;
}
seq_printf
(
seq
,
"%s"
,
addr
->
sas_addr
.
pub
);
if
(
*
addr
->
sas_addr
.
prv
)
seq_putc
(
seq
,
'+'
);
}
else
if
(
!*
addr
->
sas_addr
.
prv
)
{
seq_printf
(
seq
,
"%s"
,
"(none)"
);
return
;
}
else
if
(
!*
addr
->
sas_addr
.
prv
)
{
strcpy
(
buf
,
"(none)"
);
return
strlen
(
buf
);
}
if
(
*
addr
->
sas_addr
.
prv
)
{
len
+=
44
;
pos
=
0
;
fields
=
*
addr
->
sas_addr
.
prv
==
ATM_AFI_E164
?
e164
:
code
;
unsigned
char
*
prv
=
addr
->
sas_addr
.
prv
;
int
*
fields
;
int
i
,
j
;
fields
=
*
prv
==
ATM_AFI_E164
?
e164
:
code
;
for
(
i
=
0
;
fields
[
i
];
i
++
)
{
for
(
j
=
fields
[
i
];
j
;
j
--
)
{
sprintf
(
buf
,
"%02X"
,
addr
->
sas_addr
.
prv
[
pos
++
]);
buf
+=
2
;
}
if
(
fields
[
i
+
1
])
*
buf
++
=
'.'
;
for
(
j
=
fields
[
i
];
j
;
j
--
)
seq_printf
(
seq
,
"%02X"
,
*
prv
++
);
if
(
fields
[
i
+
1
])
seq_putc
(
seq
,
'.'
);
}
}
return
len
;
}
static
void
atmarp_info
(
struct
net_device
*
dev
,
struct
atmarp_entry
*
entry
,
struct
clip_vcc
*
clip_vcc
,
char
*
buf
)
static
void
atmarp_info
(
struct
seq_file
*
seq
,
struct
net_device
*
dev
,
struct
atmarp_entry
*
entry
,
struct
clip_vcc
*
clip_vcc
)
{
unsigned
char
*
ip
;
int
svc
,
off
,
ip_len
;
char
buf
[
17
]
;
int
svc
,
off
;
svc
=
!
clip_vcc
||
clip_vcc
->
vcc
->
sk
->
sk_family
==
AF_ATMSVC
;
off
=
sprintf
(
buf
,
"%-6s%-4s%-4s%5ld "
,
dev
->
name
,
svc
?
"SVC"
:
"PVC"
,
seq_printf
(
seq
,
"%-6s%-4s%-4s%5ld "
,
dev
->
name
,
svc
?
"SVC"
:
"PVC"
,
!
clip_vcc
||
clip_vcc
->
encap
?
"LLC"
:
"NULL"
,
(
jiffies
-
(
clip_vcc
?
clip_vcc
->
last_use
:
entry
->
neigh
->
used
))
/
HZ
);
ip
=
(
unsigned
char
*
)
&
entry
->
ip
;
ip_len
=
sprintf
(
buf
+
off
,
"%d.%d.%d.%d"
,
ip
[
0
],
ip
[
1
],
ip
[
2
],
ip
[
3
]);
off
+=
ip_len
;
while
(
ip_len
++
<
16
)
buf
[
off
++
]
=
' '
;
if
(
!
clip_vcc
)
(
jiffies
-
(
clip_vcc
?
clip_vcc
->
last_use
:
entry
->
neigh
->
used
))
/
HZ
);
off
=
snprintf
(
buf
,
sizeof
(
buf
)
-
1
,
"%d.%d.%d.%d"
,
NIPQUAD
(
entry
->
ip
));
while
(
off
<
16
)
buf
[
off
++
]
=
' '
;
buf
[
off
]
=
'\0'
;
seq_printf
(
seq
,
"%s"
,
buf
);
if
(
!
clip_vcc
)
{
if
(
time_before
(
jiffies
,
entry
->
expires
))
strcpy
(
buf
+
off
,
"(resolving)
\n
"
);
else
sprintf
(
buf
+
off
,
"(expired, ref %d)
\n
"
,
atomic_read
(
&
entry
->
neigh
->
refcnt
));
else
if
(
!
svc
)
sprintf
(
buf
+
off
,
"%d.%d.%d
\n
"
,
clip_vcc
->
vcc
->
dev
->
number
,
clip_vcc
->
vcc
->
vpi
,
clip_vcc
->
vcc
->
vci
);
else
{
off
+=
svc_addr
(
buf
+
off
,
&
clip_vcc
->
vcc
->
remote
);
strcpy
(
buf
+
off
,
"
\n
"
);
}
seq_printf
(
seq
,
"(resolving)
\n
"
);
else
seq_printf
(
seq
,
"(expired, ref %d)
\n
"
,
atomic_read
(
&
entry
->
neigh
->
refcnt
));
}
else
if
(
!
svc
)
{
seq_printf
(
seq
,
"%d.%d.%d
\n
"
,
clip_vcc
->
vcc
->
dev
->
number
,
clip_vcc
->
vcc
->
vpi
,
clip_vcc
->
vcc
->
vci
);
}
else
{
svc_addr
(
seq
,
&
clip_vcc
->
vcc
->
remote
);
seq_putc
(
seq
,
'\n'
);
}
}
#endif
/* CONFIG_ATM_CLIP */
struct
vcc_state
{
struct
sock
*
sk
;
int
family
;
int
clip_info
;
};
static
inline
int
compare_family
(
struct
sock
*
sk
,
int
family
)
{
struct
atm_vcc
*
vcc
=
atm_sk
(
sk
);
return
!
family
||
(
vcc
->
sk
->
sk_family
==
family
);
}
static
int
__vcc_walk
(
struct
sock
**
sock
,
int
family
,
loff_t
l
)
{
struct
sock
*
sk
=
*
sock
;
if
(
sk
==
(
void
*
)
1
)
{
sk
=
hlist_empty
(
&
vcc_sklist
)
?
NULL
:
__sk_head
(
&
vcc_sklist
);
l
--
;
}
for
(;
sk
;
sk
=
sk_next
(
sk
))
{
l
-=
compare_family
(
sk
,
family
);
if
(
l
<
0
)
goto
out
;
}
sk
=
(
void
*
)
1
;
out:
*
sock
=
sk
;
return
(
l
<
0
);
}
static
inline
void
*
vcc_walk
(
struct
vcc_state
*
state
,
loff_t
l
)
{
return
__vcc_walk
(
&
state
->
sk
,
state
->
family
,
l
)
?
state
:
NULL
;
}
static
int
__vcc_seq_open
(
struct
inode
*
inode
,
struct
file
*
file
,
int
family
,
struct
seq_operations
*
ops
)
{
struct
vcc_state
*
state
;
struct
seq_file
*
seq
;
int
rc
=
-
ENOMEM
;
state
=
kmalloc
(
sizeof
(
*
state
),
GFP_KERNEL
);
if
(
!
state
)
goto
out
;
rc
=
seq_open
(
file
,
ops
);
if
(
rc
)
goto
out_kfree
;
state
->
family
=
family
;
state
->
clip_info
=
try_atm_clip_ops
();
seq
=
file
->
private_data
;
seq
->
private
=
state
;
out:
return
rc
;
out_kfree:
kfree
(
state
);
goto
out
;
}
static
int
vcc_seq_release
(
struct
inode
*
inode
,
struct
file
*
file
)
{
#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
struct
seq_file
*
seq
=
file
->
private_data
;
struct
vcc_state
*
state
=
seq
->
private
;
if
(
state
->
clip_info
)
module_put
(
atm_clip_ops
->
owner
);
#endif
return
seq_release_private
(
inode
,
file
);
}
static
void
*
vcc_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
struct
vcc_state
*
state
=
seq
->
private
;
loff_t
left
=
*
pos
;
read_lock
(
&
vcc_sklist_lock
);
state
->
sk
=
(
void
*
)
1
;
return
left
?
vcc_walk
(
state
,
left
)
:
(
void
*
)
1
;
}
static
void
pvc_info
(
struct
atm_vcc
*
vcc
,
char
*
buf
,
int
clip_info
)
static
void
vcc_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
read_unlock
(
&
vcc_sklist_lock
);
}
static
void
*
vcc_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
struct
vcc_state
*
state
=
seq
->
private
;
v
=
vcc_walk
(
state
,
1
);
*
pos
+=
!!
PTR_ERR
(
v
);
return
v
;
}
static
void
pvc_info
(
struct
seq_file
*
seq
,
struct
atm_vcc
*
vcc
,
int
clip_info
)
{
static
const
char
*
class_name
[]
=
{
"off"
,
"UBR"
,
"CBR"
,
"VBR"
,
"ABR"
};
static
const
char
*
aal_name
[]
=
{
...
...
@@ -171,9 +247,8 @@ static void pvc_info(struct atm_vcc *vcc, char *buf, int clip_info)
"???"
,
"5"
,
"???"
,
"???"
,
/* 4- 7 */
"???"
,
"???"
,
"???"
,
"???"
,
/* 8-11 */
"???"
,
"0"
,
"???"
,
"???"
};
/* 12-15 */
int
off
;
off
=
sprintf
(
buf
,
"%3d %3d %5d %-3s %7d %-5s %7d %-6s"
,
seq_printf
(
seq
,
"%3d %3d %5d %-3s %7d %-5s %7d %-6s"
,
vcc
->
dev
->
number
,
vcc
->
vpi
,
vcc
->
vci
,
vcc
->
qos
.
aal
>=
sizeof
(
aal_name
)
/
sizeof
(
aal_name
[
0
])
?
"err"
:
aal_name
[
vcc
->
qos
.
aal
],
vcc
->
qos
.
rxtp
.
min_pcr
,
...
...
@@ -185,18 +260,14 @@ static void pvc_info(struct atm_vcc *vcc, char *buf, int clip_info)
struct
net_device
*
dev
;
dev
=
clip_vcc
->
entry
?
clip_vcc
->
entry
->
neigh
->
dev
:
NULL
;
off
+=
sprintf
(
buf
+
off
,
"CLIP, Itf:%s, Encap:"
,
seq_printf
(
seq
,
"CLIP, Itf:%s, Encap:"
,
dev
?
dev
->
name
:
"none?"
);
if
(
clip_vcc
->
encap
)
off
+=
sprintf
(
buf
+
off
,
"LLC/SNAP"
);
else
off
+=
sprintf
(
buf
+
off
,
"None"
);
seq_printf
(
seq
,
"%s"
,
clip_vcc
->
encap
?
"LLC/SNAP"
:
"None"
);
}
#endif
s
trcpy
(
buf
+
off
,
"
\n
"
);
s
eq_putc
(
seq
,
'\n'
);
}
static
const
char
*
vcc_state
(
struct
atm_vcc
*
vcc
)
{
static
const
char
*
map
[]
=
{
ATM_VS2TXT_MAP
};
...
...
@@ -204,337 +275,592 @@ static const char *vcc_state(struct atm_vcc *vcc)
return
map
[
ATM_VF2VS
(
vcc
->
flags
)];
}
static
void
vc_info
(
struct
atm_vcc
*
vcc
,
char
*
buf
)
static
void
vcc_info
(
struct
seq_file
*
seq
,
struct
atm_vcc
*
vcc
)
{
char
*
here
;
here
=
buf
+
sprintf
(
buf
,
"%p "
,
vcc
);
if
(
!
vcc
->
dev
)
here
+=
sprintf
(
here
,
"Unassigned "
);
else
here
+=
sprintf
(
here
,
"%3d %3d %5d "
,
vcc
->
dev
->
number
,
vcc
->
vpi
,
vcc
->
vci
);
seq_printf
(
seq
,
"%p "
,
vcc
)
;
if
(
!
vcc
->
dev
)
seq_printf
(
seq
,
"Unassigned "
);
else
seq_printf
(
seq
,
"%3d %3d %5d "
,
vcc
->
dev
->
number
,
vcc
->
vpi
,
vcc
->
vci
);
switch
(
vcc
->
sk
->
sk_family
)
{
case
AF_ATMPVC
:
here
+=
sprintf
(
here
,
"PVC"
);
seq_printf
(
seq
,
"PVC"
);
break
;
case
AF_ATMSVC
:
here
+=
sprintf
(
here
,
"SVC"
);
seq_printf
(
seq
,
"SVC"
);
break
;
default:
here
+=
sprintf
(
here
,
"%3d"
,
vcc
->
sk
->
sk_family
);
seq_printf
(
seq
,
"%3d"
,
vcc
->
sk
->
sk_family
);
}
here
+=
sprintf
(
here
,
" %04lx %5d %7d/%7d %7d/%7d
\n
"
,
vcc
->
flags
,
vcc
->
sk
->
sk_err
,
atomic_read
(
&
vcc
->
sk
->
sk_wmem_alloc
),
vcc
->
sk
->
sk_sndbuf
,
atomic_read
(
&
vcc
->
sk
->
sk_rmem_alloc
),
vcc
->
sk
->
sk_rcvbuf
);
seq_printf
(
seq
,
" %04lx %5d %7d/%7d %7d/%7d
\n
"
,
vcc
->
flags
,
vcc
->
sk
->
sk_err
,
atomic_read
(
&
vcc
->
sk
->
sk_wmem_alloc
),
vcc
->
sk
->
sk_sndbuf
,
atomic_read
(
&
vcc
->
sk
->
sk_rmem_alloc
),
vcc
->
sk
->
sk_rcvbuf
);
}
static
void
svc_info
(
struct
atm_vcc
*
vcc
,
char
*
buf
)
static
void
svc_info
(
struct
seq_file
*
seq
,
struct
atm_vcc
*
vcc
)
{
char
*
here
;
int
i
;
if
(
!
vcc
->
dev
)
s
printf
(
buf
,
sizeof
(
void
*
)
==
4
?
"N/A@%p%10s"
:
"N/A@%p%2s"
,
vcc
,
""
);
else
sprintf
(
buf
,
"%3d %3d %5d "
,
vcc
->
dev
->
number
,
vcc
->
vpi
,
vcc
->
vci
);
here
=
strchr
(
buf
,
0
);
here
+=
sprintf
(
here
,
"%-10s "
,
vcc_state
(
vcc
));
here
+=
sprintf
(
here
,
"%s%s"
,
vcc
->
remote
.
sas_addr
.
pub
,
s
eq_printf
(
seq
,
sizeof
(
void
*
)
==
4
?
"N/A@%p%10s"
:
"N/A@%p%2s"
,
vcc
,
""
);
else
seq_printf
(
seq
,
"%3d %3d %5d "
,
vcc
->
dev
->
number
,
vcc
->
vpi
,
vcc
->
vci
);
seq_printf
(
seq
,
"%-10s "
,
vcc_state
(
vcc
));
seq_printf
(
seq
,
"%s%s"
,
vcc
->
remote
.
sas_addr
.
pub
,
*
vcc
->
remote
.
sas_addr
.
pub
&&
*
vcc
->
remote
.
sas_addr
.
prv
?
"+"
:
""
);
if
(
*
vcc
->
remote
.
sas_addr
.
prv
)
if
(
*
vcc
->
remote
.
sas_addr
.
prv
)
{
int
i
;
for
(
i
=
0
;
i
<
ATM_ESA_LEN
;
i
++
)
here
+=
sprintf
(
here
,
"%02x"
,
vcc
->
remote
.
sas_addr
.
prv
[
i
]);
s
trcat
(
here
,
"
\n
"
);
seq_printf
(
seq
,
"%02x"
,
vcc
->
remote
.
sas_addr
.
prv
[
i
]);
}
s
eq_putc
(
seq
,
'\n'
);
}
#if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)
static
char
*
lec_arp_get_status_string
(
unsigned
char
status
)
static
char
*
lec_arp_get_status_string
(
unsigned
char
status
)
{
switch
(
status
)
{
case
ESI_UNKNOWN
:
return
"ESI_UNKNOWN "
;
case
ESI_ARP_PENDING
:
return
"ESI_ARP_PENDING "
;
case
ESI_VC_PENDING
:
return
"ESI_VC_PENDING "
;
case
ESI_FLUSH_PENDING
:
return
"ESI_FLUSH_PENDING "
;
case
ESI_FORWARD_DIRECT
:
return
"ESI_FORWARD_DIRECT"
;
default:
return
"<Unknown> "
;
}
static
char
*
lec_arp_status_string
[]
=
{
"ESI_UNKNOWN "
,
"ESI_ARP_PENDING "
,
"ESI_VC_PENDING "
,
"<Unknown> "
,
"ESI_FLUSH_PENDING "
,
"ESI_FORWARD_DIRECT"
,
"<Undefined>"
};
if
(
status
>
ESI_FORWARD_DIRECT
)
status
=
ESI_FORWARD_DIRECT
+
1
;
return
lec_arp_status_string
[
status
];
}
static
void
lec_info
(
struct
lec_arp_table
*
entry
,
char
*
buf
)
static
void
lec_info
(
struct
seq_file
*
seq
,
struct
lec_arp_table
*
entry
)
{
int
j
,
offset
=
0
;
int
i
;
for
(
j
=
0
;
j
<
ETH_ALEN
;
j
++
)
{
offset
+=
sprintf
(
buf
+
offset
,
"%2.2x"
,
0xff
&
entry
->
mac_addr
[
j
]);
}
offset
+=
sprintf
(
buf
+
offset
,
" "
);
for
(
j
=
0
;
j
<
ATM_ESA_LEN
;
j
++
)
{
offset
+=
sprintf
(
buf
+
offset
,
"%2.2x"
,
0xff
&
entry
->
atm_addr
[
j
]);
for
(
i
=
0
;
i
<
ETH_ALEN
;
i
++
)
seq_printf
(
seq
,
"%2.2x"
,
entry
->
mac_addr
[
i
]
&
0xff
);
seq_printf
(
seq
,
" "
);
for
(
i
=
0
;
i
<
ATM_ESA_LEN
;
i
++
)
seq_printf
(
seq
,
"%2.2x"
,
entry
->
atm_addr
[
i
]
&
0xff
);
seq_printf
(
seq
,
" %s %4.4x"
,
lec_arp_get_status_string
(
entry
->
status
),
entry
->
flags
&
0xffff
);
if
(
entry
->
vcc
)
seq_printf
(
seq
,
"%3d %3d "
,
entry
->
vcc
->
vpi
,
entry
->
vcc
->
vci
);
else
seq_printf
(
seq
,
" "
);
if
(
entry
->
recv_vcc
)
{
seq_printf
(
seq
,
" %3d %3d"
,
entry
->
recv_vcc
->
vpi
,
entry
->
recv_vcc
->
vci
);
}
offset
+=
sprintf
(
buf
+
offset
,
" %s %4.4x"
,
lec_arp_get_status_string
(
entry
->
status
),
entry
->
flags
&
0xffff
);
if
(
entry
->
vcc
)
{
offset
+=
sprintf
(
buf
+
offset
,
"%3d %3d "
,
entry
->
vcc
->
vpi
,
entry
->
vcc
->
vci
);
}
else
offset
+=
sprintf
(
buf
+
offset
,
" "
);
if
(
entry
->
recv_vcc
)
{
offset
+=
sprintf
(
buf
+
offset
,
" %3d %3d"
,
entry
->
recv_vcc
->
vpi
,
entry
->
recv_vcc
->
vci
);
}
sprintf
(
buf
+
offset
,
"
\n
"
);
seq_putc
(
seq
,
'\n'
);
}
#endif
#endif
/* CONFIG_ATM_LANE */
static
int
atm_dev
ices_info
(
loff_t
pos
,
char
*
buf
)
static
int
atm_dev
_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
struct
atm_dev
*
dev
;
struct
list_head
*
p
;
int
left
;
static
char
atm_dev_banner
[]
=
"Itf Type ESI/
\"
MAC
\"
addr "
"AAL(TX,err,RX,err,drop) ... [refcnt]
\n
"
;
if
(
v
==
(
void
*
)
1
)
seq_puts
(
seq
,
atm_dev_banner
);
else
{
struct
atm_dev
*
dev
=
list_entry
(
v
,
struct
atm_dev
,
dev_list
);
if
(
!
pos
)
{
return
sprintf
(
buf
,
"Itf Type ESI/
\"
MAC
\"
addr "
"AAL(TX,err,RX,err,drop) ... [refcnt]
\n
"
);
atm_dev_info
(
seq
,
dev
);
}
left
=
pos
-
1
;
spin_lock
(
&
atm_dev_lock
);
list_for_each
(
p
,
&
atm_devs
)
{
dev
=
list_entry
(
p
,
struct
atm_dev
,
dev_list
);
if
(
left
--
==
0
)
{
atm_dev_info
(
dev
,
buf
);
spin_unlock
(
&
atm_dev_lock
);
return
strlen
(
buf
);
}
return
0
;
}
static
struct
seq_operations
atm_dev_seq_ops
=
{
.
start
=
atm_dev_seq_start
,
.
next
=
atm_dev_seq_next
,
.
stop
=
atm_dev_seq_stop
,
.
show
=
atm_dev_seq_show
,
};
static
int
atm_dev_seq_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
return
seq_open
(
file
,
&
atm_dev_seq_ops
);
}
static
struct
file_operations
devices_seq_fops
=
{
.
open
=
atm_dev_seq_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
seq_release
,
};
static
int
pvc_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
static
char
atm_pvc_banner
[]
=
"Itf VPI VCI AAL RX(PCR,Class) TX(PCR,Class)
\n
"
;
if
(
v
==
(
void
*
)
1
)
seq_puts
(
seq
,
atm_pvc_banner
);
else
{
struct
vcc_state
*
state
=
seq
->
private
;
struct
atm_vcc
*
vcc
=
atm_sk
(
state
->
sk
);
pvc_info
(
seq
,
vcc
,
state
->
clip_info
);
}
spin_unlock
(
&
atm_dev_lock
);
return
0
;
}
/*
* FIXME: it isn't safe to walk the VCC list without turning off interrupts.
* What is really needed is some lock on the devices. Ditto for ATMARP.
*/
static
struct
seq_operations
pvc_seq_ops
=
{
.
start
=
vcc_seq_start
,
.
next
=
vcc_seq_next
,
.
stop
=
vcc_seq_stop
,
.
show
=
pvc_seq_show
,
};
static
int
atm_pvc_info
(
loff_t
pos
,
char
*
buf
)
static
int
pvc_seq_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
struct
hlist_node
*
node
;
struct
sock
*
s
;
struct
atm_vcc
*
vcc
;
int
left
,
clip_info
=
0
;
return
__vcc_seq_open
(
inode
,
file
,
PF_ATMPVC
,
&
pvc_seq_ops
);
}
if
(
!
pos
)
{
return
sprintf
(
buf
,
"Itf VPI VCI AAL RX(PCR,Class) "
"TX(PCR,Class)
\n
"
);
}
left
=
pos
-
1
;
#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
if
(
try_atm_clip_ops
())
clip_info
=
1
;
#endif
read_lock
(
&
vcc_sklist_lock
);
sk_for_each
(
s
,
node
,
&
vcc_sklist
)
{
vcc
=
atm_sk
(
s
);
if
(
vcc
->
sk
->
sk_family
==
PF_ATMPVC
&&
vcc
->
dev
&&
!
left
--
)
{
pvc_info
(
vcc
,
buf
,
clip_info
);
read_unlock
(
&
vcc_sklist_lock
);
#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
if
(
clip_info
)
module_put
(
atm_clip_ops
->
owner
);
#endif
return
strlen
(
buf
);
}
static
struct
file_operations
pvc_seq_fops
=
{
.
open
=
pvc_seq_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
vcc_seq_release
,
};
static
int
vcc_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
if
(
v
==
(
void
*
)
1
)
{
seq_printf
(
seq
,
sizeof
(
void
*
)
==
4
?
"%-8s%s"
:
"%-16s%s"
,
"Address "
,
"Itf VPI VCI Fam Flags Reply "
"Send buffer Recv buffer
\n
"
);
}
else
{
struct
vcc_state
*
state
=
seq
->
private
;
struct
atm_vcc
*
vcc
=
atm_sk
(
state
->
sk
);
vcc_info
(
seq
,
vcc
);
}
return
0
;
}
static
struct
seq_operations
vcc_seq_ops
=
{
.
start
=
vcc_seq_start
,
.
next
=
vcc_seq_next
,
.
stop
=
vcc_seq_stop
,
.
show
=
vcc_seq_show
,
};
static
int
vcc_seq_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
return
__vcc_seq_open
(
inode
,
file
,
0
,
&
vcc_seq_ops
);
}
static
struct
file_operations
vcc_seq_fops
=
{
.
open
=
vcc_seq_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
vcc_seq_release
,
};
static
int
svc_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
static
char
atm_svc_banner
[]
=
"Itf VPI VCI State Remote
\n
"
;
if
(
v
==
(
void
*
)
1
)
seq_puts
(
seq
,
atm_svc_banner
);
else
{
struct
vcc_state
*
state
=
seq
->
private
;
struct
atm_vcc
*
vcc
=
atm_sk
(
state
->
sk
);
svc_info
(
seq
,
vcc
);
}
read_unlock
(
&
vcc_sklist_lock
);
#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
if
(
clip_info
)
module_put
(
atm_clip_ops
->
owner
);
#endif
return
0
;
}
static
struct
seq_operations
svc_seq_ops
=
{
.
start
=
vcc_seq_start
,
.
next
=
vcc_seq_next
,
.
stop
=
vcc_seq_stop
,
.
show
=
svc_seq_show
,
};
static
int
atm_vc_info
(
loff_t
pos
,
char
*
buf
)
static
int
svc_seq_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
struct
atm_vcc
*
vcc
;
struct
hlist_node
*
node
;
struct
sock
*
s
;
int
left
;
return
__vcc_seq_open
(
inode
,
file
,
PF_ATMSVC
,
&
svc_seq_ops
);
}
if
(
!
pos
)
return
sprintf
(
buf
,
sizeof
(
void
*
)
==
4
?
"%-8s%s"
:
"%-16s%s"
,
"Address"
,
" Itf VPI VCI Fam Flags Reply Send buffer"
" Recv buffer
\n
"
);
left
=
pos
-
1
;
read_lock
(
&
vcc_sklist_lock
);
sk_for_each
(
s
,
node
,
&
vcc_sklist
)
{
vcc
=
atm_sk
(
s
);
if
(
!
left
--
)
{
vc_info
(
vcc
,
buf
);
read_unlock
(
&
vcc_sklist_lock
);
return
strlen
(
buf
);
}
}
read_unlock
(
&
vcc_sklist_lock
);
static
struct
file_operations
svc_seq_fops
=
{
.
open
=
svc_seq_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
vcc_seq_release
,
};
return
0
;
}
#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
struct
arp_state
{
int
bucket
;
struct
neighbour
*
n
;
struct
clip_vcc
*
vcc
;
};
static
void
*
arp_vcc_walk
(
struct
arp_state
*
state
,
struct
atmarp_entry
*
e
,
loff_t
*
l
)
{
struct
clip_vcc
*
vcc
=
state
->
vcc
;
if
(
!
vcc
)
vcc
=
e
->
vccs
;
if
(
vcc
==
(
void
*
)
1
)
{
vcc
=
e
->
vccs
;
--*
l
;
}
for
(;
vcc
;
vcc
=
vcc
->
next
)
{
if
(
--*
l
<
0
)
break
;
}
state
->
vcc
=
vcc
;
return
(
*
l
<
0
)
?
state
:
NULL
;
}
static
void
*
arp_get_idx
(
struct
arp_state
*
state
,
loff_t
l
)
{
void
*
v
=
NULL
;
for
(;
state
->
bucket
<=
NEIGH_HASHMASK
;
state
->
bucket
++
)
{
for
(;
state
->
n
;
state
->
n
=
state
->
n
->
next
)
{
v
=
arp_vcc_walk
(
state
,
NEIGH2ENTRY
(
state
->
n
),
&
l
);
if
(
v
)
goto
done
;
}
state
->
n
=
clip_tbl_hook
->
hash_buckets
[
state
->
bucket
+
1
];
}
done:
return
v
;
}
static
int
atm_svc_info
(
loff_t
pos
,
char
*
buf
)
static
void
*
arp_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
struct
hlist_node
*
node
;
struct
sock
*
s
;
struct
atm_vcc
*
vcc
;
int
left
;
struct
arp_state
*
state
=
seq
->
private
;
void
*
ret
=
(
void
*
)
1
;
if
(
!
pos
)
return
sprintf
(
buf
,
"Itf VPI VCI State Remote
\n
"
);
left
=
pos
-
1
;
read_lock
(
&
vcc_sklist_lock
);
sk_for_each
(
s
,
node
,
&
vcc_sklist
)
{
vcc
=
atm_sk
(
s
);
if
(
vcc
->
sk
->
sk_family
==
PF_ATMSVC
&&
!
left
--
)
{
svc_info
(
vcc
,
buf
);
read_unlock
(
&
vcc_sklist_lock
);
return
strlen
(
buf
);
}
if
(
!
clip_tbl_hook
)
{
state
->
bucket
=
-
1
;
goto
out
;
}
read_unlock
(
&
vcc_sklist_lock
);
return
0
;
read_lock_bh
(
&
clip_tbl_hook
->
lock
);
state
->
bucket
=
0
;
state
->
n
=
clip_tbl_hook
->
hash_buckets
[
0
];
state
->
vcc
=
(
void
*
)
1
;
if
(
*
pos
)
ret
=
arp_get_idx
(
state
,
*
pos
);
out:
return
ret
;
}
#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
static
int
atm_arp_info
(
loff_t
pos
,
char
*
buf
)
static
void
arp_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
struct
arp_state
*
state
=
seq
->
private
;
if
(
state
->
bucket
!=
-
1
)
read_unlock_bh
(
&
clip_tbl_hook
->
lock
);
}
static
void
*
arp_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
struct
neighbour
*
n
;
int
i
,
count
;
struct
arp_state
*
state
=
seq
->
private
;
if
(
!
pos
)
{
return
sprintf
(
buf
,
"IPitf TypeEncp Idle IP address "
"ATM address
\n
"
);
v
=
arp_get_idx
(
state
,
1
);
*
pos
+=
!!
PTR_ERR
(
v
);
return
v
;
}
static
int
arp_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
static
char
atm_arp_banner
[]
=
"IPitf TypeEncp Idle IP address ATM address
\n
"
;
if
(
v
==
(
void
*
)
1
)
seq_puts
(
seq
,
atm_arp_banner
);
else
{
struct
arp_state
*
state
=
seq
->
private
;
struct
neighbour
*
n
=
state
->
n
;
struct
clip_vcc
*
vcc
=
state
->
vcc
;
atmarp_info
(
seq
,
n
->
dev
,
NEIGH2ENTRY
(
n
),
vcc
);
}
return
0
;
}
static
struct
seq_operations
arp_seq_ops
=
{
.
start
=
arp_seq_start
,
.
next
=
arp_seq_next
,
.
stop
=
arp_seq_stop
,
.
show
=
arp_seq_show
,
};
static
int
arp_seq_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
struct
arp_state
*
state
;
struct
seq_file
*
seq
;
int
rc
=
-
EAGAIN
;
if
(
!
try_atm_clip_ops
())
return
0
;
count
=
pos
;
read_lock_bh
(
&
clip_tbl_hook
->
lock
);
for
(
i
=
0
;
i
<=
NEIGH_HASHMASK
;
i
++
)
for
(
n
=
clip_tbl_hook
->
hash_buckets
[
i
];
n
;
n
=
n
->
next
)
{
struct
atmarp_entry
*
entry
=
NEIGH2ENTRY
(
n
);
struct
clip_vcc
*
vcc
;
if
(
!
entry
->
vccs
)
{
if
(
--
count
)
continue
;
atmarp_info
(
n
->
dev
,
entry
,
NULL
,
buf
);
read_unlock_bh
(
&
clip_tbl_hook
->
lock
);
module_put
(
atm_clip_ops
->
owner
);
return
strlen
(
buf
);
}
for
(
vcc
=
entry
->
vccs
;
vcc
;
vcc
=
vcc
->
next
)
{
if
(
--
count
)
continue
;
atmarp_info
(
n
->
dev
,
entry
,
vcc
,
buf
);
read_unlock_bh
(
&
clip_tbl_hook
->
lock
);
module_put
(
atm_clip_ops
->
owner
);
return
strlen
(
buf
);
}
}
read_unlock_bh
(
&
clip_tbl_hook
->
lock
);
goto
out
;
state
=
kmalloc
(
sizeof
(
*
state
),
GFP_KERNEL
);
if
(
!
state
)
{
rc
=
-
ENOMEM
;
goto
out_put
;
}
rc
=
seq_open
(
file
,
&
arp_seq_ops
);
if
(
rc
)
goto
out_kfree
;
seq
=
file
->
private_data
;
seq
->
private
=
state
;
out:
return
rc
;
out_put:
module_put
(
atm_clip_ops
->
owner
);
return
0
;
out_kfree:
kfree
(
state
);
goto
out
;
}
#endif
#if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)
static
int
atm_lec_info
(
loff_t
pos
,
char
*
buf
)
static
int
arp_seq_release
(
struct
inode
*
inode
,
struct
file
*
file
)
{
module_put
(
atm_clip_ops
->
owner
);
return
seq_release_private
(
inode
,
file
);
}
static
struct
file_operations
arp_seq_fops
=
{
.
open
=
arp_seq_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
arp_seq_release
,
};
#endif
/* CONFIG_ATM_CLIP */
#if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)
struct
lec_state
{
unsigned
long
flags
;
struct
lec_priv
*
priv
;
struct
lec_priv
*
locked
;
struct
lec_arp_table
*
entry
;
int
i
,
count
,
d
,
e
;
struct
net_device
*
dev
;
int
itf
;
int
arp_table
;
int
misc_table
;
};
if
(
!
pos
)
{
return
sprintf
(
buf
,
"Itf MAC ATM destination"
" Status Flags "
"VPI/VCI Recv VPI/VCI
\n
"
);
static
void
*
lec_tbl_walk
(
struct
lec_state
*
state
,
struct
lec_arp_table
*
tbl
,
loff_t
*
l
)
{
struct
lec_arp_table
*
e
=
state
->
entry
;
if
(
!
e
)
e
=
tbl
;
if
(
e
==
(
void
*
)
1
)
{
e
=
tbl
;
--*
l
;
}
if
(
!
try_atm_lane_ops
())
return
0
;
/* the lane module is not there yet */
count
=
pos
;
for
(
d
=
0
;
d
<
MAX_LEC_ITF
;
d
++
)
{
dev
=
atm_lane_ops
->
get_lec
(
d
);
if
(
!
dev
||
!
(
priv
=
(
struct
lec_priv
*
)
dev
->
priv
))
continue
;
spin_lock_irqsave
(
&
priv
->
lec_arp_lock
,
flags
);
for
(
i
=
0
;
i
<
LEC_ARP_TABLE_SIZE
;
i
++
)
{
for
(
entry
=
priv
->
lec_arp_tables
[
i
];
entry
;
entry
=
entry
->
next
)
{
if
(
--
count
)
continue
;
e
=
sprintf
(
buf
,
"%s "
,
dev
->
name
);
lec_info
(
entry
,
buf
+
e
);
spin_unlock_irqrestore
(
&
priv
->
lec_arp_lock
,
flags
);
dev_put
(
dev
);
module_put
(
atm_lane_ops
->
owner
);
return
strlen
(
buf
);
}
}
for
(
entry
=
priv
->
lec_arp_empty_ones
;
entry
;
entry
=
entry
->
next
)
{
if
(
--
count
)
continue
;
e
=
sprintf
(
buf
,
"%s "
,
dev
->
name
);
lec_info
(
entry
,
buf
+
e
);
spin_unlock_irqrestore
(
&
priv
->
lec_arp_lock
,
flags
);
dev_put
(
dev
);
module_put
(
atm_lane_ops
->
owner
);
return
strlen
(
buf
);
}
for
(
entry
=
priv
->
lec_no_forward
;
entry
;
entry
=
entry
->
next
)
{
if
(
--
count
)
continue
;
e
=
sprintf
(
buf
,
"%s "
,
dev
->
name
);
lec_info
(
entry
,
buf
+
e
);
spin_unlock_irqrestore
(
&
priv
->
lec_arp_lock
,
flags
);
dev_put
(
dev
);
module_put
(
atm_lane_ops
->
owner
);
return
strlen
(
buf
);
}
for
(
entry
=
priv
->
mcast_fwds
;
entry
;
entry
=
entry
->
next
)
{
if
(
--
count
)
continue
;
e
=
sprintf
(
buf
,
"%s "
,
dev
->
name
);
lec_info
(
entry
,
buf
+
e
);
spin_unlock_irqrestore
(
&
priv
->
lec_arp_lock
,
flags
);
dev_put
(
dev
);
module_put
(
atm_lane_ops
->
owner
);
return
strlen
(
buf
);
}
spin_unlock_irqrestore
(
&
priv
->
lec_arp_lock
,
flags
);
for
(;
e
;
e
=
e
->
next
)
{
if
(
--*
l
<
0
)
break
;
}
state
->
entry
=
e
;
return
(
*
l
<
0
)
?
state
:
NULL
;
}
static
void
*
lec_arp_walk
(
struct
lec_state
*
state
,
loff_t
*
l
,
struct
lec_priv
*
priv
)
{
void
*
v
=
NULL
;
int
p
;
for
(
p
=
state
->
arp_table
;
p
<
LEC_ARP_TABLE_SIZE
;
p
++
)
{
v
=
lec_tbl_walk
(
state
,
priv
->
lec_arp_tables
[
p
],
l
);
if
(
v
)
break
;
}
state
->
arp_table
=
p
;
return
v
;
}
static
void
*
lec_misc_walk
(
struct
lec_state
*
state
,
loff_t
*
l
,
struct
lec_priv
*
priv
)
{
struct
lec_arp_table
*
lec_misc_tables
[]
=
{
priv
->
lec_arp_empty_ones
,
priv
->
lec_no_forward
,
priv
->
mcast_fwds
};
void
*
v
=
NULL
;
int
q
;
for
(
q
=
state
->
misc_table
;
q
<
ARRAY_SIZE
(
lec_misc_tables
);
q
++
)
{
v
=
lec_tbl_walk
(
state
,
lec_misc_tables
[
q
],
l
);
if
(
v
)
break
;
}
state
->
misc_table
=
q
;
return
v
;
}
static
void
*
lec_priv_walk
(
struct
lec_state
*
state
,
loff_t
*
l
,
struct
lec_priv
*
priv
)
{
if
(
!
state
->
locked
)
{
state
->
locked
=
priv
;
spin_lock_irqsave
(
&
priv
->
lec_arp_lock
,
state
->
flags
);
}
if
(
!
lec_arp_walk
(
state
,
l
,
priv
)
&&
!
lec_misc_walk
(
state
,
l
,
priv
))
{
spin_unlock_irqrestore
(
&
priv
->
lec_arp_lock
,
state
->
flags
);
state
->
locked
=
NULL
;
/* Partial state reset for the next time we get called */
state
->
arp_table
=
state
->
misc_table
=
0
;
}
return
state
->
locked
;
}
static
void
*
lec_itf_walk
(
struct
lec_state
*
state
,
loff_t
*
l
)
{
struct
net_device
*
dev
;
void
*
v
;
dev
=
state
->
dev
?
state
->
dev
:
atm_lane_ops
->
get_lec
(
state
->
itf
);
v
=
(
dev
&&
dev
->
priv
)
?
lec_priv_walk
(
state
,
l
,
dev
->
priv
)
:
NULL
;
if
(
!
v
&&
dev
)
{
dev_put
(
dev
);
/* Partial state reset for the next time we get called */
dev
=
NULL
;
}
state
->
dev
=
dev
;
return
v
;
}
static
void
*
lec_get_idx
(
struct
lec_state
*
state
,
loff_t
l
)
{
void
*
v
=
NULL
;
for
(;
state
->
itf
<
MAX_LEC_ITF
;
state
->
itf
++
)
{
v
=
lec_itf_walk
(
state
,
&
l
);
if
(
v
)
break
;
}
return
v
;
}
static
void
*
lec_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
struct
lec_state
*
state
=
seq
->
private
;
state
->
itf
=
0
;
state
->
dev
=
NULL
;
state
->
locked
=
NULL
;
state
->
arp_table
=
0
;
state
->
misc_table
=
0
;
state
->
entry
=
(
void
*
)
1
;
return
*
pos
?
lec_get_idx
(
state
,
*
pos
)
:
(
void
*
)
1
;
}
static
void
lec_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
struct
lec_state
*
state
=
seq
->
private
;
if
(
state
->
dev
)
{
spin_unlock_irqrestore
(
&
state
->
locked
->
lec_arp_lock
,
state
->
flags
);
dev_put
(
state
->
dev
);
}
}
static
void
*
lec_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
struct
lec_state
*
state
=
seq
->
private
;
v
=
lec_get_idx
(
state
,
1
);
*
pos
+=
!!
PTR_ERR
(
v
);
return
v
;
}
static
int
lec_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
static
char
lec_banner
[]
=
"Itf MAC ATM destination"
" Status Flags "
"VPI/VCI Recv VPI/VCI
\n
"
;
if
(
v
==
(
void
*
)
1
)
seq_puts
(
seq
,
lec_banner
);
else
{
struct
lec_state
*
state
=
seq
->
private
;
struct
net_device
*
dev
=
state
->
dev
;
seq_printf
(
seq
,
"%s "
,
dev
->
name
);
lec_info
(
seq
,
state
->
entry
);
}
module_put
(
atm_lane_ops
->
owner
);
return
0
;
}
#endif
static
struct
seq_operations
lec_seq_ops
=
{
.
start
=
lec_seq_start
,
.
next
=
lec_seq_next
,
.
stop
=
lec_seq_stop
,
.
show
=
lec_seq_show
,
};
static
int
lec_seq_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
struct
lec_state
*
state
;
struct
seq_file
*
seq
;
int
rc
=
-
EAGAIN
;
if
(
!
try_atm_lane_ops
())
goto
out
;
state
=
kmalloc
(
sizeof
(
*
state
),
GFP_KERNEL
);
if
(
!
state
)
{
rc
=
-
ENOMEM
;
goto
out
;
}
rc
=
seq_open
(
file
,
&
lec_seq_ops
);
if
(
rc
)
goto
out_kfree
;
seq
=
file
->
private_data
;
seq
->
private
=
state
;
out:
return
rc
;
out_kfree:
kfree
(
state
);
goto
out
;
}
static
int
lec_seq_release
(
struct
inode
*
inode
,
struct
file
*
file
)
{
module_put
(
atm_lane_ops
->
owner
);
return
seq_release_private
(
inode
,
file
);
}
static
struct
file_operations
lec_seq_fops
=
{
.
open
=
lec_seq_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
lec_seq_release
,
};
#endif
/* CONFIG_ATM_LANE */
static
ssize_t
proc_dev_atm_read
(
struct
file
*
file
,
char
*
buf
,
size_t
count
,
loff_t
*
pos
)
...
...
@@ -562,28 +888,6 @@ static ssize_t proc_dev_atm_read(struct file *file,char *buf,size_t count,
}
static
ssize_t
proc_spec_atm_read
(
struct
file
*
file
,
char
*
buf
,
size_t
count
,
loff_t
*
pos
)
{
unsigned
long
page
;
int
length
;
int
(
*
info
)(
loff_t
,
char
*
);
info
=
PDE
(
file
->
f_dentry
->
d_inode
)
->
data
;
if
(
count
==
0
)
return
0
;
page
=
get_zeroed_page
(
GFP_KERNEL
);
if
(
!
page
)
return
-
ENOMEM
;
length
=
(
*
info
)(
*
pos
,(
char
*
)
page
);
if
(
length
>
count
)
length
=
-
EINVAL
;
if
(
length
>=
0
)
{
if
(
copy_to_user
(
buf
,(
char
*
)
page
,
length
))
length
=
-
EFAULT
;
(
*
pos
)
++
;
}
free_page
(
page
);
return
length
;
}
struct
proc_dir_entry
*
atm_proc_root
;
EXPORT_SYMBOL
(
atm_proc_root
);
...
...
@@ -604,19 +908,19 @@ int atm_proc_dev_register(struct atm_dev *dev)
dev
->
proc_name
=
kmalloc
(
strlen
(
dev
->
type
)
+
digits
+
2
,
GFP_KERNEL
);
if
(
!
dev
->
proc_name
)
goto
fail1
;
goto
err_out
;
sprintf
(
dev
->
proc_name
,
"%s:%d"
,
dev
->
type
,
dev
->
number
);
dev
->
proc_entry
=
create_proc_entry
(
dev
->
proc_name
,
0
,
atm_proc_root
);
if
(
!
dev
->
proc_entry
)
goto
fail0
;
goto
err_free_name
;
dev
->
proc_entry
->
data
=
dev
;
dev
->
proc_entry
->
proc_fops
=
&
proc_
dev_atm_operation
s
;
dev
->
proc_entry
->
proc_fops
=
&
proc_
atm_dev_op
s
;
dev
->
proc_entry
->
owner
=
THIS_MODULE
;
return
0
;
fail0
:
err_free_name
:
kfree
(
dev
->
proc_name
);
fail1
:
err_out
:
return
error
;
}
...
...
@@ -630,57 +934,65 @@ void atm_proc_dev_deregister(struct atm_dev *dev)
kfree
(
dev
->
proc_name
);
}
static
struct
atm_proc_entry
{
char
*
name
;
struct
file_operations
*
proc_fops
;
struct
proc_dir_entry
*
dirent
;
}
atm_proc_ents
[]
=
{
{
.
name
=
"devices"
,
.
proc_fops
=
&
devices_seq_fops
},
{
.
name
=
"pvc"
,
.
proc_fops
=
&
pvc_seq_fops
},
{
.
name
=
"svc"
,
.
proc_fops
=
&
svc_seq_fops
},
{
.
name
=
"vc"
,
.
proc_fops
=
&
vcc_seq_fops
},
#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
{
.
name
=
"arp"
,
.
proc_fops
=
&
arp_seq_fops
},
#endif
#if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)
{
.
name
=
"lec"
,
.
proc_fops
=
&
lec_seq_fops
},
#endif
{
.
name
=
NULL
,
.
proc_fops
=
NULL
}
};
#define CREATE_ENTRY(name) \
name = create_proc_entry(#name,0,atm_proc_root); \
if (!name) goto cleanup; \
name->data = atm_##name##_info; \
name->proc_fops = &proc_spec_atm_operations; \
name->owner = THIS_MODULE
static
struct
proc_dir_entry
*
devices
=
NULL
,
*
pvc
=
NULL
,
*
svc
=
NULL
,
*
arp
=
NULL
,
*
lec
=
NULL
,
*
vc
=
NULL
;
static
void
atm_proc_cleanup
(
void
)
static
void
atm_proc_dirs_remove
(
void
)
{
if
(
devices
)
remove_proc_entry
(
"devices"
,
atm_proc_root
);
if
(
pvc
)
remove_proc_entry
(
"pvc"
,
atm_proc_root
);
if
(
svc
)
remove_proc_entry
(
"svc"
,
atm_proc_root
);
if
(
arp
)
remove_proc_entry
(
"arp"
,
atm_proc_root
);
if
(
lec
)
remove_proc_entry
(
"lec"
,
atm_proc_root
);
if
(
vc
)
remove_proc_entry
(
"vc"
,
atm_proc_root
);
remove_proc_entry
(
"net/atm"
,
NULL
);
static
struct
atm_proc_entry
*
e
;
for
(
e
=
atm_proc_ents
;
e
->
name
;
e
++
)
{
if
(
e
->
dirent
)
remove_proc_entry
(
e
->
name
,
atm_proc_root
);
}
remove_proc_entry
(
"net/atm"
,
NULL
);
}
int
__init
atm_proc_init
(
void
)
{
static
struct
atm_proc_entry
*
e
;
int
ret
;
atm_proc_root
=
proc_mkdir
(
"net/atm"
,
NULL
);
if
(
!
atm_proc_root
)
return
-
ENOMEM
;
CREATE_ENTRY
(
devices
);
CREATE_ENTRY
(
pvc
);
CREATE_ENTRY
(
svc
);
CREATE_ENTRY
(
vc
);
#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
CREATE_ENTRY
(
arp
);
#endif
#if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)
CREATE_ENTRY
(
lec
);
#endif
return
0
;
cleanup:
atm_proc_cleanup
();
return
-
ENOMEM
;
goto
err_out
;
for
(
e
=
atm_proc_ents
;
e
->
name
;
e
++
)
{
struct
proc_dir_entry
*
dirent
;
dirent
=
create_proc_entry
(
e
->
name
,
S_IRUGO
,
atm_proc_root
);
if
(
!
dirent
)
goto
err_out_remove
;
dirent
->
proc_fops
=
e
->
proc_fops
;
dirent
->
owner
=
THIS_MODULE
;
e
->
dirent
=
dirent
;
}
ret
=
0
;
out:
return
ret
;
err_out_remove:
atm_proc_dirs_remove
();
err_out:
ret
=
-
ENOMEM
;
goto
out
;
}
void
atm_proc_exit
(
void
)
void
__exit
atm_proc_exit
(
void
)
{
atm_proc_
cleanup
();
atm_proc_
dirs_remove
();
}
net/atm/resources.c
View file @
081fc6c7
...
...
@@ -30,7 +30,7 @@ static struct atm_dev *__alloc_atm_dev(const char *type)
{
struct
atm_dev
*
dev
;
dev
=
kmalloc
(
sizeof
(
*
dev
),
GFP_
ATOMIC
);
dev
=
kmalloc
(
sizeof
(
*
dev
),
GFP_
KERNEL
);
if
(
!
dev
)
return
NULL
;
memset
(
dev
,
0
,
sizeof
(
*
dev
));
...
...
@@ -395,6 +395,35 @@ int atm_dev_ioctl(unsigned int cmd, unsigned long arg)
return
error
;
}
static
__inline__
void
*
dev_get_idx
(
loff_t
left
)
{
struct
list_head
*
p
;
list_for_each
(
p
,
&
atm_devs
)
{
if
(
!--
left
)
break
;
}
return
(
p
!=
&
atm_devs
)
?
p
:
NULL
;
}
void
*
atm_dev_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
spin_lock
(
&
atm_dev_lock
);
return
*
pos
?
dev_get_idx
(
*
pos
)
:
(
void
*
)
1
;
}
void
atm_dev_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
spin_unlock
(
&
atm_dev_lock
);
}
void
*
atm_dev_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
++*
pos
;
v
=
(
v
==
(
void
*
)
1
)
?
atm_devs
.
next
:
((
struct
list_head
*
)
v
)
->
next
;
return
(
v
==
&
atm_devs
)
?
NULL
:
v
;
}
EXPORT_SYMBOL
(
atm_dev_register
);
EXPORT_SYMBOL
(
atm_dev_deregister
);
...
...
net/atm/resources.h
View file @
081fc6c7
...
...
@@ -21,6 +21,11 @@ int atm_dev_ioctl(unsigned int cmd, unsigned long arg);
#include <linux/proc_fs.h>
void
*
atm_dev_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
);
void
atm_dev_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
);
void
*
atm_dev_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
);
int
atm_proc_dev_register
(
struct
atm_dev
*
dev
);
void
atm_proc_dev_deregister
(
struct
atm_dev
*
dev
);
...
...
net/bluetooth/af_bluetooth.c
View file @
081fc6c7
...
...
@@ -130,7 +130,6 @@ struct sock *bt_sock_alloc(struct socket *sock, int proto, int pi_size, int prio
}
sock_init_data
(
sock
,
sk
);
sk_set_owner
(
sk
,
THIS_MODULE
);
INIT_LIST_HEAD
(
&
bt_sk
(
sk
)
->
accept_q
);
sk
->
sk_zapped
=
0
;
...
...
net/bluetooth/bnep/sock.c
View file @
081fc6c7
...
...
@@ -175,6 +175,9 @@ static int bnep_sock_create(struct socket *sock, int protocol)
if
(
!
(
sk
=
bt_sock_alloc
(
sock
,
PF_BLUETOOTH
,
0
,
GFP_KERNEL
)))
return
-
ENOMEM
;
sk_set_owner
(
sk
,
THIS_MODULE
);
sock
->
ops
=
&
bnep_sock_ops
;
sock
->
state
=
SS_UNCONNECTED
;
...
...
net/bluetooth/hci_sock.c
View file @
081fc6c7
...
...
@@ -587,6 +587,8 @@ static int hci_sock_create(struct socket *sock, int protocol)
if
(
!
sk
)
return
-
ENOMEM
;
sk_set_owner
(
sk
,
THIS_MODULE
);
sock
->
state
=
SS_UNCONNECTED
;
sk
->
sk_state
=
BT_OPEN
;
...
...
net/bridge/br_forward.c
View file @
081fc6c7
...
...
@@ -69,6 +69,7 @@ static void __br_forward(const struct net_bridge_port *to, struct sk_buff *skb)
indev
=
skb
->
dev
;
skb
->
dev
=
to
->
dev
;
skb
->
ip_summed
=
CHECKSUM_NONE
;
NF_HOOK
(
PF_BRIDGE
,
NF_BR_FORWARD
,
skb
,
indev
,
skb
->
dev
,
br_forward_finish
);
...
...
net/core/dev.c
View file @
081fc6c7
...
...
@@ -1994,26 +1994,21 @@ extern int wireless_proc_init(void);
static
int
__init
dev_proc_init
(
void
)
{
struct
proc_dir_entry
*
p
;
int
rc
=
-
ENOMEM
;
p
=
create_proc_entry
(
"dev"
,
S_IRUGO
,
proc_net
);
if
(
!
p
)
if
(
!
proc_net_fops_create
(
"dev"
,
S_IRUGO
,
&
dev_seq_fops
))
goto
out
;
p
->
proc_fops
=
&
dev_seq_fops
;
p
=
create_proc_entry
(
"softnet_stat"
,
S_IRUGO
,
proc_net
);
if
(
!
p
)
if
(
!
proc_net_fops_create
(
"softnet_stat"
,
S_IRUGO
,
&
softnet_seq_fops
))
goto
out_dev
;
p
->
proc_fops
=
&
softnet_seq_fops
;
if
(
wireless_proc_init
())
goto
out_softnet
;
rc
=
0
;
out:
return
rc
;
out_softnet:
remove_proc_entry
(
"softnet_stat"
,
proc_net
);
proc_net_remove
(
"softnet_stat"
);
out_dev:
remove_proc_entry
(
"dev"
,
proc_net
);
proc_net_remove
(
"dev"
);
goto
out
;
}
#else
...
...
@@ -2759,7 +2754,6 @@ static void netdev_wait_allrefs(struct net_device *dev)
current
->
state
=
TASK_INTERRUPTIBLE
;
schedule_timeout
(
HZ
/
4
);
current
->
state
=
TASK_RUNNING
;
if
(
time_after
(
jiffies
,
warning_time
+
10
*
HZ
))
{
printk
(
KERN_EMERG
"unregister_netdevice: "
...
...
net/ipv4/arp.c
View file @
081fc6c7
...
...
@@ -1416,14 +1416,9 @@ static struct file_operations arp_seq_fops = {
static
int
__init
arp_proc_init
(
void
)
{
int
rc
=
0
;
struct
proc_dir_entry
*
p
=
create_proc_entry
(
"arp"
,
S_IRUGO
,
proc_net
);
if
(
p
)
p
->
proc_fops
=
&
arp_seq_fops
;
else
rc
=
-
ENOMEM
;
return
rc
;
if
(
!
proc_net_fops_create
(
"arp"
,
S_IRUGO
,
&
arp_seq_fops
))
return
-
ENOMEM
;
return
0
;
}
#else
/* CONFIG_PROC_FS */
...
...
net/ipv4/fib_hash.c
View file @
081fc6c7
...
...
@@ -1096,19 +1096,13 @@ static struct file_operations fib_seq_fops = {
int
__init
fib_proc_init
(
void
)
{
struct
proc_dir_entry
*
p
;
int
rc
=
0
;
p
=
create_proc_entry
(
"route"
,
S_IRUGO
,
proc_net
);
if
(
p
)
p
->
proc_fops
=
&
fib_seq_fops
;
else
rc
=
-
ENOMEM
;
return
rc
;
if
(
!
proc_net_fops_create
(
"route"
,
S_IRUGO
,
&
fib_seq_fops
))
return
-
ENOMEM
;
return
0
;
}
void
__init
fib_proc_exit
(
void
)
{
remove_proc_entry
(
"route"
,
proc_net
);
proc_net_remove
(
"route"
);
}
#endif
/* CONFIG_PROC_FS */
net/ipv4/icmp.c
View file @
081fc6c7
...
...
@@ -669,7 +669,7 @@ static void icmp_unreach(struct sk_buff *skb)
printk
(
KERN_WARNING
"%u.%u.%u.%u sent an invalid ICMP "
"type %u, code %u "
"error to a broadcast: %u.%u.%u.%u on %s
\n
"
,
NIPQUAD
(
iph
->
saddr
),
NIPQUAD
(
skb
->
nh
.
iph
->
saddr
),
icmph
->
type
,
icmph
->
code
,
NIPQUAD
(
iph
->
daddr
),
skb
->
dev
->
name
);
...
...
net/ipv4/igmp.c
View file @
081fc6c7
...
...
@@ -2162,7 +2162,7 @@ static struct ip_mc_list *igmp_mc_get_idx(struct seq_file *seq, loff_t pos)
static
void
*
igmp_mc_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
read_lock
(
&
dev_base_lock
);
return
*
pos
?
igmp_mc_get_idx
(
seq
,
*
pos
)
:
SEQ_START_TOKEN
;
return
*
pos
?
igmp_mc_get_idx
(
seq
,
*
pos
-
1
)
:
SEQ_START_TOKEN
;
}
static
void
*
igmp_mc_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
...
...
@@ -2337,7 +2337,7 @@ static struct ip_sf_list *igmp_mcf_get_idx(struct seq_file *seq, loff_t pos)
static
void
*
igmp_mcf_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
read_lock
(
&
dev_base_lock
);
return
*
pos
?
igmp_mcf_get_idx
(
seq
,
*
pos
)
:
SEQ_START_TOKEN
;
return
*
pos
?
igmp_mcf_get_idx
(
seq
,
*
pos
-
1
)
:
SEQ_START_TOKEN
;
}
static
void
*
igmp_mcf_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
...
...
@@ -2430,15 +2430,8 @@ static struct file_operations igmp_mcf_seq_fops = {
int
__init
igmp_mc_proc_init
(
void
)
{
struct
proc_dir_entry
*
p
;
p
=
create_proc_entry
(
"igmp"
,
S_IRUGO
,
proc_net
);
if
(
p
)
p
->
proc_fops
=
&
igmp_mc_seq_fops
;
p
=
create_proc_entry
(
"mcfilter"
,
S_IRUGO
,
proc_net
);
if
(
p
)
p
->
proc_fops
=
&
igmp_mcf_seq_fops
;
proc_net_fops_create
(
"igmp"
,
S_IRUGO
,
&
igmp_mc_seq_fops
);
proc_net_fops_create
(
"mcfilter"
,
S_IRUGO
,
&
igmp_mcf_seq_fops
);
return
0
;
}
#endif
...
...
net/ipv4/ip_input.c
View file @
081fc6c7
...
...
@@ -201,6 +201,7 @@ static inline int ip_local_deliver_finish(struct sk_buff *skb)
#ifdef CONFIG_NETFILTER_DEBUG
nf_debug_ip_local_deliver
(
skb
);
skb
->
nf_debug
=
3
D
0
;
#endif
/*CONFIG_NETFILTER_DEBUG*/
__skb_pull
(
skb
,
ihl
);
...
...
net/ipv4/netfilter/ip_nat_tftp.c
View file @
081fc6c7
...
...
@@ -30,7 +30,7 @@
#include <linux/netfilter_ipv4/ip_nat_rule.h>
MODULE_AUTHOR
(
"Magnus Boden <mb@ozaba.mine.nu>"
);
MODULE_DESCRIPTION
(
"tf
pt
NAT helper"
);
MODULE_DESCRIPTION
(
"tf
tp
NAT helper"
);
MODULE_LICENSE
(
"GPL"
);
#define MAX_PORTS 8
...
...
net/ipv4/netfilter/ipt_MASQUERADE.c
View file @
081fc6c7
...
...
@@ -130,57 +130,35 @@ masquerade_target(struct sk_buff **pskb,
}
static
inline
int
device_cmp
(
const
struct
ip_conntrack
*
i
,
void
*
ifindex
)
device_cmp
(
const
struct
ip_conntrack
*
i
,
void
*
_ina
)
{
int
ret
;
int
ret
=
0
;
struct
in_ifaddr
*
ina
=
_ina
;
READ_LOCK
(
&
masq_lock
);
ret
=
(
i
->
nat
.
masq_index
==
(
int
)(
long
)
ifindex
);
/* If it's masquerading out this interface with a different address,
or we don't know the new address of this interface. */
if
(
i
->
nat
.
masq_index
==
ina
->
ifa_dev
->
dev
->
ifindex
&&
i
->
tuplehash
[
IP_CT_DIR_REPLY
].
tuple
.
dst
.
ip
!=
ina
->
ifa_address
)
ret
=
1
;
READ_UNLOCK
(
&
masq_lock
);
return
ret
;
}
static
int
masq_device_event
(
struct
notifier_block
*
this
,
unsigned
long
event
,
void
*
ptr
)
{
struct
net_device
*
dev
=
ptr
;
if
(
event
==
NETDEV_DOWN
)
{
/* Device was downed. Search entire table for
conntracks which were associated with that device,
and forget them. */
IP_NF_ASSERT
(
dev
->
ifindex
!=
0
);
ip_ct_selective_cleanup
(
device_cmp
,
(
void
*
)(
long
)
dev
->
ifindex
);
}
return
NOTIFY_DONE
;
}
static
int
masq_inet_event
(
struct
notifier_block
*
this
,
unsigned
long
event
,
void
*
ptr
)
{
struct
net_device
*
dev
=
((
struct
in_ifaddr
*
)
ptr
)
->
ifa_dev
->
dev
;
if
(
event
==
NETDEV_DOWN
)
{
/* IP address was deleted. Search entire table for
conntracks which were associated with that device,
and forget them. */
IP_NF_ASSERT
(
dev
->
ifindex
!=
0
);
ip_ct_selective_cleanup
(
device_cmp
,
(
void
*
)(
long
)
dev
->
ifindex
);
}
/* For some configurations, interfaces often come back with
* the same address. If not, clean up old conntrack
* entries. */
if
(
event
==
NETDEV_UP
)
ip_ct_selective_cleanup
(
device_cmp
,
ptr
);
return
NOTIFY_DONE
;
}
static
struct
notifier_block
masq_dev_notifier
=
{
.
notifier_call
=
masq_device_event
,
};
static
struct
notifier_block
masq_inet_notifier
=
{
.
notifier_call
=
masq_inet_event
,
};
...
...
@@ -198,12 +176,9 @@ static int __init init(void)
ret
=
ipt_register_target
(
&
masquerade
);
if
(
ret
==
0
)
{
/* Register for device down reports */
register_netdevice_notifier
(
&
masq_dev_notifier
);
if
(
ret
==
0
)
/* Register IP address change reports */
register_inetaddr_notifier
(
&
masq_inet_notifier
);
}
return
ret
;
}
...
...
@@ -211,7 +186,6 @@ static int __init init(void)
static
void
__exit
fini
(
void
)
{
ipt_unregister_target
(
&
masquerade
);
unregister_netdevice_notifier
(
&
masq_dev_notifier
);
unregister_inetaddr_notifier
(
&
masq_inet_notifier
);
}
...
...
net/ipv4/netfilter/ipt_REJECT.c
View file @
081fc6c7
...
...
@@ -84,45 +84,34 @@ static inline struct rtable *route_reverse(struct sk_buff *skb, int local)
static
void
send_reset
(
struct
sk_buff
*
oldskb
,
int
local
)
{
struct
sk_buff
*
nskb
;
struct
tcphdr
*
otcph
,
*
tcph
;
struct
tcphdr
otcph
,
*
tcph
;
struct
rtable
*
rt
;
unsigned
int
otcplen
;
u_int16_t
tmp_port
;
u_int32_t
tmp_addr
;
int
needs_ack
;
int
hh_len
;
/* IP header checks: fragment, too short. */
if
(
oldskb
->
nh
.
iph
->
frag_off
&
htons
(
IP_OFFSET
)
||
oldskb
->
len
<
(
oldskb
->
nh
.
iph
->
ihl
<<
2
)
+
sizeof
(
struct
tcphdr
))
/* IP header checks: fragment. */
if
(
oldskb
->
nh
.
iph
->
frag_off
&
htons
(
IP_OFFSET
))
return
;
otcph
=
(
struct
tcphdr
*
)((
u_int32_t
*
)
oldskb
->
nh
.
iph
+
oldskb
->
nh
.
iph
->
ihl
);
otcplen
=
oldskb
->
len
-
oldskb
->
nh
.
iph
->
ihl
*
4
;
if
(
skb_copy_bits
(
oldskb
,
oldskb
->
nh
.
iph
->
ihl
*
4
,
otcph
,
sizeof
(
*
otcph
))
<
0
)
return
;
&
otcph
,
sizeof
(
otcph
))
<
0
)
return
;
/* No RST for RST. */
if
(
otcph
->
rst
)
return
;
/* Check checksum. */
if
(
tcp_v4_check
(
otcph
,
otcplen
,
oldskb
->
nh
.
iph
->
saddr
,
oldskb
->
nh
.
iph
->
daddr
,
csum_partial
((
char
*
)
otcph
,
otcplen
,
0
))
!=
0
)
if
(
otcph
.
rst
)
return
;
/* FIXME: Check checksum --RR */
if
((
rt
=
route_reverse
(
oldskb
,
local
))
==
NULL
)
return
;
hh_len
=
(
rt
->
u
.
dst
.
dev
->
hard_header_len
+
15
)
&~
15
;
/* Copy skb (even if skb is about to be dropped, we can't just
clone it because there may be other things, such as tcpdump,
interested in it). We also need to expand headroom in case
hh_len of incoming interface < hh_len of outgoing interface */
/* We need a linear, writeable skb. We also need to expand
headroom in case hh_len of incoming interface < hh_len of
outgoing interface */
nskb
=
skb_copy_expand
(
oldskb
,
hh_len
,
skb_tailroom
(
oldskb
),
GFP_ATOMIC
);
if
(
!
nskb
)
{
...
...
@@ -163,12 +152,13 @@ static void send_reset(struct sk_buff *oldskb, int local)
if
(
tcph
->
ack
)
{
needs_ack
=
0
;
tcph
->
seq
=
otcph
->
ack_seq
;
tcph
->
seq
=
otcph
.
ack_seq
;
tcph
->
ack_seq
=
0
;
}
else
{
needs_ack
=
1
;
tcph
->
ack_seq
=
htonl
(
ntohl
(
otcph
->
seq
)
+
otcph
->
syn
+
otcph
->
fin
+
otcplen
-
(
otcph
->
doff
<<
2
));
tcph
->
ack_seq
=
htonl
(
ntohl
(
otcph
.
seq
)
+
otcph
.
syn
+
otcph
.
fin
+
oldskb
->
len
-
oldskb
->
nh
.
iph
->
ihl
*
4
-
(
otcph
.
doff
<<
2
));
tcph
->
seq
=
0
;
}
...
...
net/ipv4/proc.c
View file @
081fc6c7
...
...
@@ -238,28 +238,21 @@ static struct file_operations netstat_seq_fops = {
int
__init
ip_misc_proc_init
(
void
)
{
int
rc
=
0
;
struct
proc_dir_entry
*
p
;
p
=
create_proc_entry
(
"netstat"
,
S_IRUGO
,
proc_net
);
if
(
!
p
)
if
(
!
proc_net_fops_create
(
"netstat"
,
S_IRUGO
,
&
netstat_seq_fops
))
goto
out_netstat
;
p
->
proc_fops
=
&
netstat_seq_fops
;
p
=
create_proc_entry
(
"snmp"
,
S_IRUGO
,
proc_net
);
if
(
!
p
)
if
(
!
proc_net_fops_create
(
"snmp"
,
S_IRUGO
,
&
snmp_seq_fops
))
goto
out_snmp
;
p
->
proc_fops
=
&
snmp_seq_fops
;
p
=
create_proc_entry
(
"sockstat"
,
S_IRUGO
,
proc_net
);
if
(
!
p
)
if
(
!
proc_net_fops_create
(
"sockstat"
,
S_IRUGO
,
&
sockstat_seq_fops
))
goto
out_sockstat
;
p
->
proc_fops
=
&
sockstat_seq_fops
;
out:
return
rc
;
out_sockstat:
remove_proc_entry
(
"snmp"
,
proc_net
);
proc_net_remove
(
"snmp"
);
out_snmp:
remove_proc_entry
(
"netstat"
,
proc_net
);
proc_net_remove
(
"netstat"
);
out_netstat:
rc
=
-
ENOMEM
;
goto
out
;
...
...
net/ipv4/raw.c
View file @
081fc6c7
...
...
@@ -736,7 +736,7 @@ static struct sock *raw_get_idx(struct seq_file *seq, loff_t pos)
static
void
*
raw_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
read_lock
(
&
raw_v4_lock
);
return
*
pos
?
raw_get_idx
(
seq
,
*
pos
)
:
SEQ_START_TOKEN
;
return
*
pos
?
raw_get_idx
(
seq
,
*
pos
-
1
)
:
SEQ_START_TOKEN
;
}
static
void
*
raw_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
...
...
@@ -831,19 +831,13 @@ static struct file_operations raw_seq_fops = {
int
__init
raw_proc_init
(
void
)
{
struct
proc_dir_entry
*
p
;
int
rc
=
0
;
p
=
create_proc_entry
(
"raw"
,
S_IRUGO
,
proc_net
);
if
(
p
)
p
->
proc_fops
=
&
raw_seq_fops
;
else
rc
=
-
ENOMEM
;
return
rc
;
if
(
!
proc_net_fops_create
(
"raw"
,
S_IRUGO
,
&
raw_seq_fops
))
return
-
ENOMEM
;
return
0
;
}
void
__init
raw_proc_exit
(
void
)
{
remove_proc_entry
(
"raw"
,
proc_net
);
proc_net_remove
(
"raw"
);
}
#endif
/* CONFIG_PROC_FS */
net/ipv4/route.c
View file @
081fc6c7
...
...
@@ -259,7 +259,7 @@ static struct rtable *rt_cache_get_idx(struct seq_file *seq, loff_t pos)
static
void
*
rt_cache_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
return
*
pos
?
rt_cache_get_idx
(
seq
,
*
pos
)
:
SEQ_START_TOKEN
;
return
*
pos
?
rt_cache_get_idx
(
seq
,
*
pos
-
1
)
:
SEQ_START_TOKEN
;
}
static
void
*
rt_cache_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
...
...
net/ipv4/tcp_ipv4.c
View file @
081fc6c7
...
...
@@ -2413,11 +2413,15 @@ static int tcp_seq_open(struct inode *inode, struct file *file)
{
struct
tcp_seq_afinfo
*
afinfo
=
PDE
(
inode
)
->
data
;
struct
seq_file
*
seq
;
int
rc
=
-
ENOMEM
;
struct
tcp_iter_state
*
s
=
kmalloc
(
sizeof
(
*
s
),
GFP_KERNEL
)
;
struct
tcp_iter_state
*
s
;
int
rc
;
if
(
unlikely
(
afinfo
==
NULL
))
return
-
EINVAL
;
s
=
kmalloc
(
sizeof
(
*
s
),
GFP_KERNEL
);
if
(
!
s
)
goto
out
;
return
-
ENOMEM
;
memset
(
s
,
0
,
sizeof
(
*
s
));
s
->
family
=
afinfo
->
family
;
s
->
seq_ops
.
start
=
tcp_seq_start
;
...
...
@@ -2450,11 +2454,10 @@ int tcp_proc_register(struct tcp_seq_afinfo *afinfo)
afinfo
->
seq_fops
->
llseek
=
seq_lseek
;
afinfo
->
seq_fops
->
release
=
seq_release_private
;
p
=
create_proc_entry
(
afinfo
->
name
,
S_IRUGO
,
proc_net
);
if
(
p
)
{
p
=
proc_net_fops_create
(
afinfo
->
name
,
S_IRUGO
,
afinfo
->
seq_fops
);
if
(
p
)
p
->
data
=
afinfo
;
p
->
proc_fops
=
afinfo
->
seq_fops
;
}
else
else
rc
=
-
ENOMEM
;
return
rc
;
}
...
...
@@ -2463,7 +2466,7 @@ void tcp_proc_unregister(struct tcp_seq_afinfo *afinfo)
{
if
(
!
afinfo
)
return
;
remove_proc_entry
(
afinfo
->
name
,
proc_net
);
proc_net_remove
(
afinfo
->
name
);
memset
(
afinfo
->
seq_fops
,
0
,
sizeof
(
*
afinfo
->
seq_fops
));
}
...
...
net/ipv4/udp.c
View file @
081fc6c7
...
...
@@ -1460,11 +1460,10 @@ int udp_proc_register(struct udp_seq_afinfo *afinfo)
afinfo
->
seq_fops
->
llseek
=
seq_lseek
;
afinfo
->
seq_fops
->
release
=
seq_release_private
;
p
=
create_proc_entry
(
afinfo
->
name
,
S_IRUGO
,
proc_net
);
if
(
p
)
{
p
=
proc_net_fops_create
(
afinfo
->
name
,
S_IRUGO
,
afinfo
->
seq_fops
);
if
(
p
)
p
->
data
=
afinfo
;
p
->
proc_fops
=
afinfo
->
seq_fops
;
}
else
else
rc
=
-
ENOMEM
;
return
rc
;
}
...
...
@@ -1473,7 +1472,7 @@ void udp_proc_unregister(struct udp_seq_afinfo *afinfo)
{
if
(
!
afinfo
)
return
;
remove_proc_entry
(
afinfo
->
name
,
proc_net
);
proc_net_remove
(
afinfo
->
name
);
memset
(
afinfo
->
seq_fops
,
0
,
sizeof
(
*
afinfo
->
seq_fops
));
}
...
...
net/ipv6/addrconf.c
View file @
081fc6c7
...
...
@@ -2149,59 +2149,65 @@ struct if6_iter_state {
int
bucket
;
};
static
inline
struct
inet6_ifaddr
*
if6_get_bucket
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
static
struct
inet6_ifaddr
*
if6_get_first
(
struct
seq_file
*
seq
)
{
int
i
;
struct
inet6_ifaddr
*
ifa
=
NULL
;
loff_t
l
=
*
pos
;
struct
if6_iter_state
*
state
=
seq
->
private
;
for
(;
state
->
bucket
<
IN6_ADDR_HSIZE
;
++
state
->
bucket
)
for
(
i
=
0
,
ifa
=
inet6_addr_lst
[
state
->
bucket
];
ifa
;
++
i
,
ifa
=
ifa
->
lst_next
)
{
if
(
l
--
)
continue
;
*
pos
=
i
;
goto
out
;
}
out:
for
(
state
->
bucket
=
0
;
state
->
bucket
<
IN6_ADDR_HSIZE
;
++
state
->
bucket
)
{
ifa
=
inet6_addr_lst
[
state
->
bucket
];
if
(
ifa
)
break
;
}
return
ifa
;
}
static
struct
inet6_ifaddr
*
if6_get_next
(
struct
seq_file
*
seq
,
struct
inet6_ifaddr
*
ifa
)
{
struct
if6_iter_state
*
state
=
seq
->
private
;
ifa
=
ifa
->
lst_next
;
try_again:
if
(
!
ifa
&&
++
state
->
bucket
<
IN6_ADDR_HSIZE
)
{
ifa
=
inet6_addr_lst
[
state
->
bucket
];
goto
try_again
;
}
return
ifa
;
}
static
struct
inet6_ifaddr
*
if6_get_idx
(
struct
seq_file
*
seq
,
loff_t
pos
)
{
struct
inet6_ifaddr
*
ifa
=
if6_get_first
(
seq
);
if
(
ifa
)
while
(
pos
&&
(
ifa
=
if6_get_next
(
seq
,
ifa
))
!=
NULL
)
--
pos
;
return
pos
?
NULL
:
ifa
;
}
static
void
*
if6_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
read_lock_bh
(
&
addrconf_hash_lock
);
return
*
pos
?
if6_get_bucket
(
seq
,
pos
)
:
SEQ_START_TOKEN
;
return
if6_get_idx
(
seq
,
*
pos
)
;
}
static
void
*
if6_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
struct
inet6_ifaddr
*
ifa
;
struct
if6_iter_state
*
state
;
if
(
v
==
SEQ_START_TOKEN
)
{
ifa
=
if6_get_bucket
(
seq
,
pos
);
goto
out
;
}
state
=
seq
->
private
;
ifa
=
v
;
ifa
=
ifa
->
lst_next
;
if
(
ifa
)
goto
out
;
if
(
++
state
->
bucket
>=
IN6_ADDR_HSIZE
)
goto
out
;
*
pos
=
0
;
ifa
=
if6_get_bucket
(
seq
,
pos
);
out:
ifa
=
if6_get_next
(
seq
,
v
);
++*
pos
;
return
ifa
;
}
static
inline
void
if6_iface_seq_show
(
struct
seq_file
*
seq
,
struct
inet6_ifaddr
*
ifp
)
static
void
if6_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
read_unlock_bh
(
&
addrconf_hash_lock
);
}
static
int
if6_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
struct
inet6_ifaddr
*
ifp
=
(
struct
inet6_ifaddr
*
)
v
;
seq_printf
(
seq
,
"%04x%04x%04x%04x%04x%04x%04x%04x %02x %02x %02x %02x %8s
\n
"
,
NIP6
(
ifp
->
addr
),
...
...
@@ -2210,22 +2216,9 @@ static inline void if6_iface_seq_show(struct seq_file *seq, struct inet6_ifaddr
ifp
->
scope
,
ifp
->
flags
,
ifp
->
idev
->
dev
->
name
);
}
static
int
if6_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
if
(
v
==
SEQ_START_TOKEN
)
return
0
;
else
if6_iface_seq_show
(
seq
,
v
);
return
0
;
}
static
void
if6_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
read_unlock_bh
(
&
addrconf_hash_lock
);
}
static
struct
seq_operations
if6_seq_ops
=
{
.
start
=
if6_seq_start
,
.
next
=
if6_seq_next
,
...
...
@@ -2266,16 +2259,11 @@ static struct file_operations if6_fops = {
int
__init
if6_proc_init
(
void
)
{
struct
proc_dir_entry
*
p
;
int
rc
=
0
;
p
=
create_proc_entry
(
"if_inet6"
,
S_IRUGO
,
proc_net
);
if
(
p
)
p
->
proc_fops
=
&
if6_fops
;
else
rc
=
-
ENOMEM
;
return
rc
;
if
(
!
proc_net_fops_create
(
"if_inet6"
,
S_IRUGO
,
&
if6_fops
))
return
-
ENOMEM
;
return
0
;
}
void
if6_proc_exit
(
void
)
{
proc_net_remove
(
"if_inet6"
);
...
...
net/ipv6/anycast.c
View file @
081fc6c7
...
...
@@ -505,7 +505,7 @@ static struct ifacaddr6 *ac6_get_idx(struct seq_file *seq, loff_t pos)
static
void
*
ac6_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
read_lock
(
&
dev_base_lock
);
return
*
pos
?
ac6_get_idx
(
seq
,
*
pos
)
:
ac6_get_first
(
seq
);
return
ac6_get_idx
(
seq
,
*
pos
);
}
static
void
*
ac6_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
...
...
@@ -581,11 +581,9 @@ static struct file_operations ac6_seq_fops = {
int
__init
ac6_proc_init
(
void
)
{
struct
proc_dir_entry
*
p
;
if
(
!
proc_net_fops_create
(
"anycast6"
,
S_IRUGO
,
&
ac6_seq_fops
))
return
-
ENOMEM
;
p
=
create_proc_entry
(
"anycast6"
,
S_IRUGO
,
proc_net
);
if
(
p
)
p
->
proc_fops
=
&
ac6_seq_fops
;
return
0
;
}
...
...
net/ipv6/ip6_flowlabel.c
View file @
081fc6c7
...
...
@@ -603,7 +603,7 @@ static struct ip6_flowlabel *ip6fl_get_idx(struct seq_file *seq, loff_t pos)
static
void
*
ip6fl_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
read_lock_bh
(
&
ip6_fl_lock
);
return
*
pos
?
ip6fl_get_idx
(
seq
,
*
pos
)
:
SEQ_START_TOKEN
;
return
*
pos
?
ip6fl_get_idx
(
seq
,
*
pos
-
1
)
:
SEQ_START_TOKEN
;
}
static
void
*
ip6fl_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
...
...
@@ -695,12 +695,7 @@ static struct file_operations ip6fl_seq_fops = {
void
ip6_flowlabel_init
()
{
#ifdef CONFIG_PROC_FS
struct
proc_dir_entry
*
p
;
#endif
#ifdef CONFIG_PROC_FS
p
=
create_proc_entry
(
"ip6_flowlabel"
,
S_IRUGO
,
proc_net
);
if
(
p
)
p
->
proc_fops
=
&
ip6fl_seq_fops
;
proc_net_fops_create
(
"ip6_flowlabel"
,
S_IRUGO
,
&
ip6fl_seq_fops
);
#endif
}
...
...
net/ipv6/mcast.c
View file @
081fc6c7
...
...
@@ -2119,7 +2119,7 @@ static struct ifmcaddr6 *igmp6_mc_get_idx(struct seq_file *seq, loff_t pos)
static
void
*
igmp6_mc_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
read_lock
(
&
dev_base_lock
);
return
*
pos
?
igmp6_mc_get_idx
(
seq
,
*
pos
)
:
igmp6_mc_get_first
(
seq
);
return
igmp6_mc_get_idx
(
seq
,
*
pos
);
}
static
void
*
igmp6_mc_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
...
...
@@ -2278,7 +2278,7 @@ static struct ip6_sf_list *igmp6_mcf_get_idx(struct seq_file *seq, loff_t pos)
static
void
*
igmp6_mcf_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
read_lock
(
&
dev_base_lock
);
return
*
pos
?
igmp6_mcf_get_idx
(
seq
,
*
pos
)
:
SEQ_START_TOKEN
;
return
*
pos
?
igmp6_mcf_get_idx
(
seq
,
*
pos
-
1
)
:
SEQ_START_TOKEN
;
}
static
void
*
igmp6_mcf_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
...
...
@@ -2378,9 +2378,6 @@ int __init igmp6_init(struct net_proto_family *ops)
struct
ipv6_pinfo
*
np
;
struct
sock
*
sk
;
int
err
;
#ifdef CONFIG_PROC_FS
struct
proc_dir_entry
*
p
;
#endif
err
=
sock_create
(
PF_INET6
,
SOCK_RAW
,
IPPROTO_ICMPV6
,
&
igmp6_socket
);
if
(
err
<
0
)
{
...
...
@@ -2399,12 +2396,8 @@ int __init igmp6_init(struct net_proto_family *ops)
np
->
hop_limit
=
1
;
#ifdef CONFIG_PROC_FS
p
=
create_proc_entry
(
"igmp6"
,
S_IRUGO
,
proc_net
);
if
(
p
)
p
->
proc_fops
=
&
igmp6_mc_seq_fops
;
p
=
create_proc_entry
(
"mcfilter6"
,
S_IRUGO
,
proc_net
);
if
(
p
)
p
->
proc_fops
=
&
igmp6_mcf_seq_fops
;
proc_net_fops_create
(
"igmp6"
,
S_IRUGO
,
&
igmp6_mc_seq_fops
);
proc_net_fops_create
(
"mcfilter6"
,
S_IRUGO
,
&
igmp6_mcf_seq_fops
);
#endif
return
0
;
...
...
@@ -2414,6 +2407,7 @@ void igmp6_cleanup(void)
{
sock_release
(
igmp6_socket
);
igmp6_socket
=
NULL
;
/* for safety */
#ifdef CONFIG_PROC_FS
proc_net_remove
(
"mcfilter6"
);
proc_net_remove
(
"igmp6"
);
...
...
net/ipv6/proc.c
View file @
081fc6c7
...
...
@@ -32,7 +32,6 @@
#ifdef CONFIG_PROC_FS
static
struct
proc_dir_entry
*
proc_net_devsnmp6
;
#endif
static
int
fold_prot_inuse
(
struct
proto
*
proto
)
{
...
...
@@ -58,7 +57,6 @@ static int sockstat6_seq_show(struct seq_file *seq, void *v)
return
0
;
}
struct
snmp6_item
{
char
*
name
;
...
...
@@ -221,9 +219,7 @@ static struct file_operations snmp6_seq_fops = {
int
snmp6_register_dev
(
struct
inet6_dev
*
idev
)
{
int
err
=
-
ENOMEM
;
#ifdef CONFIG_PROC_FS
struct
proc_dir_entry
*
p
;
#endif
if
(
!
idev
||
!
idev
->
dev
)
return
-
EINVAL
;
...
...
@@ -232,7 +228,6 @@ int snmp6_register_dev(struct inet6_dev *idev)
__alignof__
(
struct
icmpv6_mib
))
<
0
)
goto
err_icmp
;
#ifdef CONFIG_PROC_FS
if
(
!
proc_net_devsnmp6
)
{
err
=
-
ENOENT
;
goto
err_proc
;
...
...
@@ -244,27 +239,22 @@ int snmp6_register_dev(struct inet6_dev *idev)
p
->
proc_fops
=
&
snmp6_seq_fops
;
idev
->
stats
.
proc_dir_entry
=
p
;
#endif
return
0
;
#ifdef CONFIG_PROC_FS
err_proc:
snmp6_mib_free
((
void
**
)
idev
->
stats
.
icmpv6
);
#endif
err_icmp:
return
err
;
}
int
snmp6_unregister_dev
(
struct
inet6_dev
*
idev
)
{
#ifdef CONFIG_PROC_FS
if
(
!
proc_net_devsnmp6
)
return
-
ENOENT
;
if
(
!
idev
||
!
idev
->
stats
.
proc_dir_entry
)
return
-
EINVAL
;
remove_proc_entry
(
idev
->
stats
.
proc_dir_entry
->
name
,
proc_net_devsnmp6
);
#endif
snmp6_mib_free
((
void
**
)
idev
->
stats
.
icmpv6
);
return
0
;
...
...
@@ -273,21 +263,16 @@ int snmp6_unregister_dev(struct inet6_dev *idev)
int
__init
ipv6_misc_proc_init
(
void
)
{
int
rc
=
0
;
struct
proc_dir_entry
*
p
;
p
=
create_proc_entry
(
"snmp6"
,
S_IRUGO
,
proc_net
);
if
(
!
p
)
if
(
!
proc_net_fops_create
(
"snmp6"
,
S_IRUGO
,
&
snmp6_seq_fops
))
goto
proc_snmp6_fail
;
else
p
->
proc_fops
=
&
snmp6_seq_fops
;
proc_net_devsnmp6
=
proc_mkdir
(
"dev_snmp6"
,
proc_net
);
if
(
!
proc_net_devsnmp6
)
goto
proc_dev_snmp6_fail
;
p
=
create_proc_entry
(
"sockstat6"
,
S_IRUGO
,
proc_net
);
if
(
!
p
)
if
(
!
p
roc_net_fops_create
(
"sockstat6"
,
S_IRUGO
,
&
sockstat6_seq_fops
)
)
goto
proc_sockstat6_fail
;
else
p
->
proc_fops
=
&
sockstat6_seq_fops
;
out:
return
rc
;
...
...
@@ -307,3 +292,31 @@ void ipv6_misc_proc_exit(void)
proc_net_remove
(
"snmp6"
);
}
#else
/* CONFIG_PROC_FS */
int
snmp6_register_dev
(
struct
inet6_dev
*
idev
)
{
int
err
=
-
ENOMEM
;
if
(
!
idev
||
!
idev
->
dev
)
return
-
EINVAL
;
if
(
snmp6_mib_init
((
void
**
)
idev
->
stats
.
icmpv6
,
sizeof
(
struct
icmpv6_mib
),
__alignof__
(
struct
icmpv6_mib
))
<
0
)
goto
err_icmp
;
return
0
;
err_icmp:
return
err
;
}
int
snmp6_unregister_dev
(
struct
inet6_dev
*
idev
)
{
snmp6_mib_free
((
void
**
)
idev
->
stats
.
icmpv6
);
return
0
;
}
#endif
net/ipv6/raw.c
View file @
081fc6c7
...
...
@@ -961,7 +961,7 @@ static struct sock *raw6_get_idx(struct seq_file *seq, loff_t pos)
static
void
*
raw6_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
read_lock
(
&
raw_v6_lock
);
return
*
pos
?
raw6_get_idx
(
seq
,
*
pos
)
:
SEQ_START_TOKEN
;
return
*
pos
?
raw6_get_idx
(
seq
,
*
pos
-
1
)
:
SEQ_START_TOKEN
;
}
static
void
*
raw6_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
...
...
@@ -1059,12 +1059,8 @@ static struct file_operations raw6_seq_fops = {
int
__init
raw6_proc_init
(
void
)
{
struct
proc_dir_entry
*
p
=
create_proc_entry
(
"raw6"
,
S_IRUGO
,
proc_net
);
if
(
!
p
)
if
(
!
proc_net_fops_create
(
"raw6"
,
S_IRUGO
,
&
raw6_seq_fops
))
return
-
ENOMEM
;
p
->
proc_fops
=
&
raw6_seq_fops
;
return
0
;
}
...
...
net/ipv6/tcp_ipv6.c
View file @
081fc6c7
...
...
@@ -2023,6 +2023,7 @@ static void get_timewait6_sock(struct seq_file *seq,
atomic_read
(
&
tw
->
tw_refcnt
),
tw
);
}
#ifdef CONFIG_PROC_FS
static
int
tcp6_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
struct
tcp_iter_state
*
st
;
...
...
@@ -2072,6 +2073,7 @@ void tcp6_proc_exit(void)
{
tcp_proc_unregister
(
&
tcp6_seq_afinfo
);
}
#endif
struct
proto
tcpv6_prot
=
{
.
name
=
"TCPv6"
,
...
...
net/sched/estimator.c
View file @
081fc6c7
...
...
@@ -26,7 +26,6 @@
#include <linux/skbuff.h>
#include <linux/rtnetlink.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <net/sock.h>
#include <net/pkt_sched.h>
...
...
net/sched/police.c
View file @
081fc6c7
...
...
@@ -27,7 +27,6 @@
#include <linux/skbuff.h>
#include <linux/rtnetlink.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <net/sock.h>
#include <net/pkt_sched.h>
...
...
net/sched/sch_api.c
View file @
081fc6c7
...
...
@@ -32,6 +32,7 @@
#include <linux/rtnetlink.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/kmod.h>
#include <net/sock.h>
...
...
@@ -1059,27 +1060,27 @@ int psched_us_per_tick = 1;
int
psched_tick_per_us
=
1
;
#ifdef CONFIG_PROC_FS
static
int
psched_read_proc
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
length
,
int
*
eof
,
void
*
data
)
static
int
psched_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
int
len
;
len
=
sprintf
(
buffer
,
"%08x %08x %08x %08x
\n
"
,
seq_printf
(
seq
,
"%08x %08x %08x %08x
\n
"
,
psched_tick_per_us
,
psched_us_per_tick
,
1000000
,
HZ
);
len
-=
offset
;
if
(
len
>
length
)
len
=
length
;
if
(
len
<
0
)
len
=
0
;
*
start
=
buffer
+
offset
;
*
eof
=
1
;
return
0
;
}
return
len
;
static
int
psched_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
return
single_open
(
file
,
psched_show
,
PDE
(
inode
)
->
data
);
}
static
struct
file_operations
psched_fops
=
{
.
owner
=
THIS_MODULE
,
.
open
=
psched_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
single_release
,
};
#endif
#if PSCHED_CLOCK_SOURCE == PSCHED_GETTIMEOFDAY
...
...
@@ -1250,9 +1251,7 @@ int __init pktsched_init(void)
tc_filter_init
();
#endif
#ifdef CONFIG_PROC_FS
create_proc_read_entry
(
"net/psched"
,
0
,
0
,
psched_read_proc
,
NULL
);
#endif
proc_net_fops_create
(
"psched"
,
0
,
&
psched_fops
);
return
0
;
}
net/sched/sch_atm.c
View file @
081fc6c7
...
...
@@ -216,6 +216,13 @@ static void sch_atm_pop(struct atm_vcc *vcc,struct sk_buff *skb)
tasklet_schedule
(
&
p
->
task
);
}
static
const
u8
llc_oui_ip
[]
=
{
0xaa
,
/* DSAP: non-ISO */
0xaa
,
/* SSAP: non-ISO */
0x03
,
/* Ctrl: Unnumbered Information Command PDU */
0x00
,
/* OUI: EtherType */
0x00
,
0x00
,
0x08
,
0x00
};
/* Ethertype IP (0800) */
static
int
atm_tc_change
(
struct
Qdisc
*
sch
,
u32
classid
,
u32
parent
,
struct
rtattr
**
tca
,
unsigned
long
*
arg
)
...
...
@@ -322,11 +329,10 @@ static int atm_tc_change(struct Qdisc *sch, u32 classid, u32 parent,
flow
->
next
=
p
->
link
.
next
;
p
->
link
.
next
=
flow
;
flow
->
hdr_len
=
hdr_len
;
if
(
hdr
)
memcpy
(
flow
->
hdr
,
hdr
,
hdr_len
);
else
{
memcpy
(
flow
->
hdr
,
llc_oui
,
sizeof
(
llc_oui
));
((
u16
*
)
flow
->
hdr
)[
3
]
=
htons
(
ETH_P_IP
);
}
if
(
hdr
)
memcpy
(
flow
->
hdr
,
hdr
,
hdr_len
);
else
memcpy
(
flow
->
hdr
,
llc_oui_ip
,
sizeof
(
llc_oui_ip
));
*
arg
=
(
unsigned
long
)
flow
;
return
0
;
err_out:
...
...
net/sched/sch_htb.c
View file @
081fc6c7
...
...
@@ -32,7 +32,6 @@
#include <asm/bitops.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/version.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <linux/mm.h>
...
...
net/xfrm/xfrm_user.c
View file @
081fc6c7
...
...
@@ -433,9 +433,9 @@ static int verify_userspi_info(struct xfrm_userspi_info *p)
case
IPPROTO_COMP
:
/* IPCOMP spi is 16-bits. */
if
(
p
->
min
>=
0x10000
||
p
->
max
>=
0x10000
)
if
(
p
->
max
>=
0x10000
)
return
-
EINVAL
;
break
;
default:
return
-
EINVAL
;
...
...
@@ -470,7 +470,7 @@ static int xfrm_alloc_userspi(struct sk_buff *skb, struct nlmsghdr *nlh, void **
spin_lock_bh
(
&
x
->
lock
);
if
(
x
->
km
.
state
!=
XFRM_STATE_DEAD
)
{
xfrm_alloc_spi
(
x
,
p
->
min
,
p
->
max
);
xfrm_alloc_spi
(
x
,
htonl
(
p
->
min
),
htonl
(
p
->
max
)
);
if
(
x
->
id
.
spi
)
resp_skb
=
xfrm_state_netlink
(
skb
,
x
,
nlh
->
nlmsg_seq
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment