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
nexedi
linux
Commits
293f3e3f
Commit
293f3e3f
authored
Aug 14, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/davem/net-2.5
into home.osdl.org:/home/torvalds/v2.5/linux
parents
2472e908
eb24ab2c
Changes
25
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
2356 additions
and
907 deletions
+2356
-907
Documentation/crypto/api-intro.txt
Documentation/crypto/api-intro.txt
+3
-1
crypto/Kconfig
crypto/Kconfig
+7
-0
crypto/Makefile
crypto/Makefile
+1
-0
crypto/cast5.c
crypto/cast5.c
+852
-0
crypto/tcrypt.c
crypto/tcrypt.c
+101
-0
crypto/tcrypt.h
crypto/tcrypt.h
+68
-0
drivers/atm/lanai.c
drivers/atm/lanai.c
+157
-124
drivers/net/hamradio/bpqether.c
drivers/net/hamradio/bpqether.c
+166
-175
drivers/net/hamradio/yam.c
drivers/net/hamradio/yam.c
+117
-95
drivers/net/slip.c
drivers/net/slip.c
+1
-0
drivers/net/wan/lapbether.c
drivers/net/wan/lapbether.c
+86
-153
include/net/netrom.h
include/net/netrom.h
+81
-19
net/bridge/br_stp_bpdu.c
net/bridge/br_stp_bpdu.c
+1
-1
net/ipv4/devinet.c
net/ipv4/devinet.c
+1
-0
net/ipv4/netfilter/ipt_MASQUERADE.c
net/ipv4/netfilter/ipt_MASQUERADE.c
+11
-4
net/ipv6/addrconf.c
net/ipv6/addrconf.c
+1
-0
net/ipv6/raw.c
net/ipv6/raw.c
+1
-0
net/netrom/af_netrom.c
net/netrom/af_netrom.c
+273
-105
net/netrom/nr_dev.c
net/netrom/nr_dev.c
+11
-14
net/netrom/nr_in.c
net/netrom/nr_in.c
+6
-0
net/netrom/nr_route.c
net/netrom/nr_route.c
+396
-207
net/netrom/nr_subr.c
net/netrom/nr_subr.c
+4
-4
net/netrom/nr_timer.c
net/netrom/nr_timer.c
+6
-0
net/netrom/sysctl_net_netrom.c
net/netrom/sysctl_net_netrom.c
+4
-4
net/sunrpc/sysctl.c
net/sunrpc/sysctl.c
+1
-1
No files found.
Documentation/crypto/api-intro.txt
View file @
293f3e3f
...
@@ -186,7 +186,6 @@ Original developers of the crypto algorithms:
...
@@ -186,7 +186,6 @@ Original developers of the crypto algorithms:
Dag Arne Osvik (Serpent)
Dag Arne Osvik (Serpent)
Brian Gladman (AES)
Brian Gladman (AES)
SHA1 algorithm contributors:
SHA1 algorithm contributors:
Jean-Francois Dive
Jean-Francois Dive
...
@@ -214,6 +213,9 @@ AES algorithm contributors:
...
@@ -214,6 +213,9 @@ AES algorithm contributors:
Kyle McMartin
Kyle McMartin
Adam J. Richter
Adam J. Richter
CAST5 algorithm contributors:
Kartikey Mahendra Bhatt (original developers unknown, FSF copyright).
Generic scatterwalk code by Adam J. Richter <adam@yggdrasil.com>
Generic scatterwalk code by Adam J. Richter <adam@yggdrasil.com>
Please send any credits updates or corrections to:
Please send any credits updates or corrections to:
...
...
crypto/Kconfig
View file @
293f3e3f
...
@@ -126,6 +126,13 @@ config CRYPTO_AES
...
@@ -126,6 +126,13 @@ config CRYPTO_AES
See http://csrc.nist.gov/encryption/aes/ for more information.
See http://csrc.nist.gov/encryption/aes/ for more information.
config CRYPTO_CAST5
tristate "CAST5 (CAST-128) cipher algorithm"
depends on CRYPTO
help
The CAST5 encryption algorithm (synonymous with CAST-128) is
described in RFC2144.
config CRYPTO_DEFLATE
config CRYPTO_DEFLATE
tristate "Deflate compression algorithm"
tristate "Deflate compression algorithm"
depends on CRYPTO
depends on CRYPTO
...
...
crypto/Makefile
View file @
293f3e3f
...
@@ -20,6 +20,7 @@ obj-$(CONFIG_CRYPTO_BLOWFISH) += blowfish.o
...
@@ -20,6 +20,7 @@ obj-$(CONFIG_CRYPTO_BLOWFISH) += blowfish.o
obj-$(CONFIG_CRYPTO_TWOFISH)
+=
twofish.o
obj-$(CONFIG_CRYPTO_TWOFISH)
+=
twofish.o
obj-$(CONFIG_CRYPTO_SERPENT)
+=
serpent.o
obj-$(CONFIG_CRYPTO_SERPENT)
+=
serpent.o
obj-$(CONFIG_CRYPTO_AES)
+=
aes.o
obj-$(CONFIG_CRYPTO_AES)
+=
aes.o
obj-$(CONFIG_CRYPTO_CAST5)
+=
cast5.o
obj-$(CONFIG_CRYPTO_DEFLATE)
+=
deflate.o
obj-$(CONFIG_CRYPTO_DEFLATE)
+=
deflate.o
obj-$(CONFIG_CRYPTO_TEST)
+=
tcrypt.o
obj-$(CONFIG_CRYPTO_TEST)
+=
tcrypt.o
crypto/cast5.c
0 → 100644
View file @
293f3e3f
/* Kernel cryptographic api.
* cast5.c - Cast5 cipher algorithm (rfc2144).
*
* Derived from GnuPG implementation of cast5.
*
* Major Changes.
* Complete conformance to rfc2144.
* Supports key size from 40 to 128 bits.
*
* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
* Copyright (C) 2003 Kartikey Mahendra Bhatt <kartik_me@hotmail.com>.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
#include <linux/init.h>
#include <linux/crypto.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/string.h>
#define CAST5_BLOCK_SIZE 8
#define CAST5_MIN_KEY_SIZE 5
#define CAST5_MAX_KEY_SIZE 16
struct
cast5_ctx
{
u32
Km
[
16
];
u8
Kr
[
16
];
int
rr
;
/* rr?number of rounds = 16:number of rounds = 12; (rfc 2144) */
};
static
const
u32
s1
[
256
]
=
{
0x30fb40d4
,
0x9fa0ff0b
,
0x6beccd2f
,
0x3f258c7a
,
0x1e213f2f
,
0x9c004dd3
,
0x6003e540
,
0xcf9fc949
,
0xbfd4af27
,
0x88bbbdb5
,
0xe2034090
,
0x98d09675
,
0x6e63a0e0
,
0x15c361d2
,
0xc2e7661d
,
0x22d4ff8e
,
0x28683b6f
,
0xc07fd059
,
0xff2379c8
,
0x775f50e2
,
0x43c340d3
,
0xdf2f8656
,
0x887ca41a
,
0xa2d2bd2d
,
0xa1c9e0d6
,
0x346c4819
,
0x61b76d87
,
0x22540f2f
,
0x2abe32e1
,
0xaa54166b
,
0x22568e3a
,
0xa2d341d0
,
0x66db40c8
,
0xa784392f
,
0x004dff2f
,
0x2db9d2de
,
0x97943fac
,
0x4a97c1d8
,
0x527644b7
,
0xb5f437a7
,
0xb82cbaef
,
0xd751d159
,
0x6ff7f0ed
,
0x5a097a1f
,
0x827b68d0
,
0x90ecf52e
,
0x22b0c054
,
0xbc8e5935
,
0x4b6d2f7f
,
0x50bb64a2
,
0xd2664910
,
0xbee5812d
,
0xb7332290
,
0xe93b159f
,
0xb48ee411
,
0x4bff345d
,
0xfd45c240
,
0xad31973f
,
0xc4f6d02e
,
0x55fc8165
,
0xd5b1caad
,
0xa1ac2dae
,
0xa2d4b76d
,
0xc19b0c50
,
0x882240f2
,
0x0c6e4f38
,
0xa4e4bfd7
,
0x4f5ba272
,
0x564c1d2f
,
0xc59c5319
,
0xb949e354
,
0xb04669fe
,
0xb1b6ab8a
,
0xc71358dd
,
0x6385c545
,
0x110f935d
,
0x57538ad5
,
0x6a390493
,
0xe63d37e0
,
0x2a54f6b3
,
0x3a787d5f
,
0x6276a0b5
,
0x19a6fcdf
,
0x7a42206a
,
0x29f9d4d5
,
0xf61b1891
,
0xbb72275e
,
0xaa508167
,
0x38901091
,
0xc6b505eb
,
0x84c7cb8c
,
0x2ad75a0f
,
0x874a1427
,
0xa2d1936b
,
0x2ad286af
,
0xaa56d291
,
0xd7894360
,
0x425c750d
,
0x93b39e26
,
0x187184c9
,
0x6c00b32d
,
0x73e2bb14
,
0xa0bebc3c
,
0x54623779
,
0x64459eab
,
0x3f328b82
,
0x7718cf82
,
0x59a2cea6
,
0x04ee002e
,
0x89fe78e6
,
0x3fab0950
,
0x325ff6c2
,
0x81383f05
,
0x6963c5c8
,
0x76cb5ad6
,
0xd49974c9
,
0xca180dcf
,
0x380782d5
,
0xc7fa5cf6
,
0x8ac31511
,
0x35e79e13
,
0x47da91d0
,
0xf40f9086
,
0xa7e2419e
,
0x31366241
,
0x051ef495
,
0xaa573b04
,
0x4a805d8d
,
0x548300d0
,
0x00322a3c
,
0xbf64cddf
,
0xba57a68e
,
0x75c6372b
,
0x50afd341
,
0xa7c13275
,
0x915a0bf5
,
0x6b54bfab
,
0x2b0b1426
,
0xab4cc9d7
,
0x449ccd82
,
0xf7fbf265
,
0xab85c5f3
,
0x1b55db94
,
0xaad4e324
,
0xcfa4bd3f
,
0x2deaa3e2
,
0x9e204d02
,
0xc8bd25ac
,
0xeadf55b3
,
0xd5bd9e98
,
0xe31231b2
,
0x2ad5ad6c
,
0x954329de
,
0xadbe4528
,
0xd8710f69
,
0xaa51c90f
,
0xaa786bf6
,
0x22513f1e
,
0xaa51a79b
,
0x2ad344cc
,
0x7b5a41f0
,
0xd37cfbad
,
0x1b069505
,
0x41ece491
,
0xb4c332e6
,
0x032268d4
,
0xc9600acc
,
0xce387e6d
,
0xbf6bb16c
,
0x6a70fb78
,
0x0d03d9c9
,
0xd4df39de
,
0xe01063da
,
0x4736f464
,
0x5ad328d8
,
0xb347cc96
,
0x75bb0fc3
,
0x98511bfb
,
0x4ffbcc35
,
0xb58bcf6a
,
0xe11f0abc
,
0xbfc5fe4a
,
0xa70aec10
,
0xac39570a
,
0x3f04442f
,
0x6188b153
,
0xe0397a2e
,
0x5727cb79
,
0x9ceb418f
,
0x1cacd68d
,
0x2ad37c96
,
0x0175cb9d
,
0xc69dff09
,
0xc75b65f0
,
0xd9db40d8
,
0xec0e7779
,
0x4744ead4
,
0xb11c3274
,
0xdd24cb9e
,
0x7e1c54bd
,
0xf01144f9
,
0xd2240eb1
,
0x9675b3fd
,
0xa3ac3755
,
0xd47c27af
,
0x51c85f4d
,
0x56907596
,
0xa5bb15e6
,
0x580304f0
,
0xca042cf1
,
0x011a37ea
,
0x8dbfaadb
,
0x35ba3e4a
,
0x3526ffa0
,
0xc37b4d09
,
0xbc306ed9
,
0x98a52666
,
0x5648f725
,
0xff5e569d
,
0x0ced63d0
,
0x7c63b2cf
,
0x700b45e1
,
0xd5ea50f1
,
0x85a92872
,
0xaf1fbda7
,
0xd4234870
,
0xa7870bf3
,
0x2d3b4d79
,
0x42e04198
,
0x0cd0ede7
,
0x26470db8
,
0xf881814c
,
0x474d6ad7
,
0x7c0c5e5c
,
0xd1231959
,
0x381b7298
,
0xf5d2f4db
,
0xab838653
,
0x6e2f1e23
,
0x83719c9e
,
0xbd91e046
,
0x9a56456e
,
0xdc39200c
,
0x20c8c571
,
0x962bda1c
,
0xe1e696ff
,
0xb141ab08
,
0x7cca89b9
,
0x1a69e783
,
0x02cc4843
,
0xa2f7c579
,
0x429ef47d
,
0x427b169c
,
0x5ac9f049
,
0xdd8f0f00
,
0x5c8165bf
};
static
const
u32
s2
[
256
]
=
{
0x1f201094
,
0xef0ba75b
,
0x69e3cf7e
,
0x393f4380
,
0xfe61cf7a
,
0xeec5207a
,
0x55889c94
,
0x72fc0651
,
0xada7ef79
,
0x4e1d7235
,
0xd55a63ce
,
0xde0436ba
,
0x99c430ef
,
0x5f0c0794
,
0x18dcdb7d
,
0xa1d6eff3
,
0xa0b52f7b
,
0x59e83605
,
0xee15b094
,
0xe9ffd909
,
0xdc440086
,
0xef944459
,
0xba83ccb3
,
0xe0c3cdfb
,
0xd1da4181
,
0x3b092ab1
,
0xf997f1c1
,
0xa5e6cf7b
,
0x01420ddb
,
0xe4e7ef5b
,
0x25a1ff41
,
0xe180f806
,
0x1fc41080
,
0x179bee7a
,
0xd37ac6a9
,
0xfe5830a4
,
0x98de8b7f
,
0x77e83f4e
,
0x79929269
,
0x24fa9f7b
,
0xe113c85b
,
0xacc40083
,
0xd7503525
,
0xf7ea615f
,
0x62143154
,
0x0d554b63
,
0x5d681121
,
0xc866c359
,
0x3d63cf73
,
0xcee234c0
,
0xd4d87e87
,
0x5c672b21
,
0x071f6181
,
0x39f7627f
,
0x361e3084
,
0xe4eb573b
,
0x602f64a4
,
0xd63acd9c
,
0x1bbc4635
,
0x9e81032d
,
0x2701f50c
,
0x99847ab4
,
0xa0e3df79
,
0xba6cf38c
,
0x10843094
,
0x2537a95e
,
0xf46f6ffe
,
0xa1ff3b1f
,
0x208cfb6a
,
0x8f458c74
,
0xd9e0a227
,
0x4ec73a34
,
0xfc884f69
,
0x3e4de8df
,
0xef0e0088
,
0x3559648d
,
0x8a45388c
,
0x1d804366
,
0x721d9bfd
,
0xa58684bb
,
0xe8256333
,
0x844e8212
,
0x128d8098
,
0xfed33fb4
,
0xce280ae1
,
0x27e19ba5
,
0xd5a6c252
,
0xe49754bd
,
0xc5d655dd
,
0xeb667064
,
0x77840b4d
,
0xa1b6a801
,
0x84db26a9
,
0xe0b56714
,
0x21f043b7
,
0xe5d05860
,
0x54f03084
,
0x066ff472
,
0xa31aa153
,
0xdadc4755
,
0xb5625dbf
,
0x68561be6
,
0x83ca6b94
,
0x2d6ed23b
,
0xeccf01db
,
0xa6d3d0ba
,
0xb6803d5c
,
0xaf77a709
,
0x33b4a34c
,
0x397bc8d6
,
0x5ee22b95
,
0x5f0e5304
,
0x81ed6f61
,
0x20e74364
,
0xb45e1378
,
0xde18639b
,
0x881ca122
,
0xb96726d1
,
0x8049a7e8
,
0x22b7da7b
,
0x5e552d25
,
0x5272d237
,
0x79d2951c
,
0xc60d894c
,
0x488cb402
,
0x1ba4fe5b
,
0xa4b09f6b
,
0x1ca815cf
,
0xa20c3005
,
0x8871df63
,
0xb9de2fcb
,
0x0cc6c9e9
,
0x0beeff53
,
0xe3214517
,
0xb4542835
,
0x9f63293c
,
0xee41e729
,
0x6e1d2d7c
,
0x50045286
,
0x1e6685f3
,
0xf33401c6
,
0x30a22c95
,
0x31a70850
,
0x60930f13
,
0x73f98417
,
0xa1269859
,
0xec645c44
,
0x52c877a9
,
0xcdff33a6
,
0xa02b1741
,
0x7cbad9a2
,
0x2180036f
,
0x50d99c08
,
0xcb3f4861
,
0xc26bd765
,
0x64a3f6ab
,
0x80342676
,
0x25a75e7b
,
0xe4e6d1fc
,
0x20c710e6
,
0xcdf0b680
,
0x17844d3b
,
0x31eef84d
,
0x7e0824e4
,
0x2ccb49eb
,
0x846a3bae
,
0x8ff77888
,
0xee5d60f6
,
0x7af75673
,
0x2fdd5cdb
,
0xa11631c1
,
0x30f66f43
,
0xb3faec54
,
0x157fd7fa
,
0xef8579cc
,
0xd152de58
,
0xdb2ffd5e
,
0x8f32ce19
,
0x306af97a
,
0x02f03ef8
,
0x99319ad5
,
0xc242fa0f
,
0xa7e3ebb0
,
0xc68e4906
,
0xb8da230c
,
0x80823028
,
0xdcdef3c8
,
0xd35fb171
,
0x088a1bc8
,
0xbec0c560
,
0x61a3c9e8
,
0xbca8f54d
,
0xc72feffa
,
0x22822e99
,
0x82c570b4
,
0xd8d94e89
,
0x8b1c34bc
,
0x301e16e6
,
0x273be979
,
0xb0ffeaa6
,
0x61d9b8c6
,
0x00b24869
,
0xb7ffce3f
,
0x08dc283b
,
0x43daf65a
,
0xf7e19798
,
0x7619b72f
,
0x8f1c9ba4
,
0xdc8637a0
,
0x16a7d3b1
,
0x9fc393b7
,
0xa7136eeb
,
0xc6bcc63e
,
0x1a513742
,
0xef6828bc
,
0x520365d6
,
0x2d6a77ab
,
0x3527ed4b
,
0x821fd216
,
0x095c6e2e
,
0xdb92f2fb
,
0x5eea29cb
,
0x145892f5
,
0x91584f7f
,
0x5483697b
,
0x2667a8cc
,
0x85196048
,
0x8c4bacea
,
0x833860d4
,
0x0d23e0f9
,
0x6c387e8a
,
0x0ae6d249
,
0xb284600c
,
0xd835731d
,
0xdcb1c647
,
0xac4c56ea
,
0x3ebd81b3
,
0x230eabb0
,
0x6438bc87
,
0xf0b5b1fa
,
0x8f5ea2b3
,
0xfc184642
,
0x0a036b7a
,
0x4fb089bd
,
0x649da589
,
0xa345415e
,
0x5c038323
,
0x3e5d3bb9
,
0x43d79572
,
0x7e6dd07c
,
0x06dfdf1e
,
0x6c6cc4ef
,
0x7160a539
,
0x73bfbe70
,
0x83877605
,
0x4523ecf1
};
static
const
u32
s3
[
256
]
=
{
0x8defc240
,
0x25fa5d9f
,
0xeb903dbf
,
0xe810c907
,
0x47607fff
,
0x369fe44b
,
0x8c1fc644
,
0xaececa90
,
0xbeb1f9bf
,
0xeefbcaea
,
0xe8cf1950
,
0x51df07ae
,
0x920e8806
,
0xf0ad0548
,
0xe13c8d83
,
0x927010d5
,
0x11107d9f
,
0x07647db9
,
0xb2e3e4d4
,
0x3d4f285e
,
0xb9afa820
,
0xfade82e0
,
0xa067268b
,
0x8272792e
,
0x553fb2c0
,
0x489ae22b
,
0xd4ef9794
,
0x125e3fbc
,
0x21fffcee
,
0x825b1bfd
,
0x9255c5ed
,
0x1257a240
,
0x4e1a8302
,
0xbae07fff
,
0x528246e7
,
0x8e57140e
,
0x3373f7bf
,
0x8c9f8188
,
0xa6fc4ee8
,
0xc982b5a5
,
0xa8c01db7
,
0x579fc264
,
0x67094f31
,
0xf2bd3f5f
,
0x40fff7c1
,
0x1fb78dfc
,
0x8e6bd2c1
,
0x437be59b
,
0x99b03dbf
,
0xb5dbc64b
,
0x638dc0e6
,
0x55819d99
,
0xa197c81c
,
0x4a012d6e
,
0xc5884a28
,
0xccc36f71
,
0xb843c213
,
0x6c0743f1
,
0x8309893c
,
0x0feddd5f
,
0x2f7fe850
,
0xd7c07f7e
,
0x02507fbf
,
0x5afb9a04
,
0xa747d2d0
,
0x1651192e
,
0xaf70bf3e
,
0x58c31380
,
0x5f98302e
,
0x727cc3c4
,
0x0a0fb402
,
0x0f7fef82
,
0x8c96fdad
,
0x5d2c2aae
,
0x8ee99a49
,
0x50da88b8
,
0x8427f4a0
,
0x1eac5790
,
0x796fb449
,
0x8252dc15
,
0xefbd7d9b
,
0xa672597d
,
0xada840d8
,
0x45f54504
,
0xfa5d7403
,
0xe83ec305
,
0x4f91751a
,
0x925669c2
,
0x23efe941
,
0xa903f12e
,
0x60270df2
,
0x0276e4b6
,
0x94fd6574
,
0x927985b2
,
0x8276dbcb
,
0x02778176
,
0xf8af918d
,
0x4e48f79e
,
0x8f616ddf
,
0xe29d840e
,
0x842f7d83
,
0x340ce5c8
,
0x96bbb682
,
0x93b4b148
,
0xef303cab
,
0x984faf28
,
0x779faf9b
,
0x92dc560d
,
0x224d1e20
,
0x8437aa88
,
0x7d29dc96
,
0x2756d3dc
,
0x8b907cee
,
0xb51fd240
,
0xe7c07ce3
,
0xe566b4a1
,
0xc3e9615e
,
0x3cf8209d
,
0x6094d1e3
,
0xcd9ca341
,
0x5c76460e
,
0x00ea983b
,
0xd4d67881
,
0xfd47572c
,
0xf76cedd9
,
0xbda8229c
,
0x127dadaa
,
0x438a074e
,
0x1f97c090
,
0x081bdb8a
,
0x93a07ebe
,
0xb938ca15
,
0x97b03cff
,
0x3dc2c0f8
,
0x8d1ab2ec
,
0x64380e51
,
0x68cc7bfb
,
0xd90f2788
,
0x12490181
,
0x5de5ffd4
,
0xdd7ef86a
,
0x76a2e214
,
0xb9a40368
,
0x925d958f
,
0x4b39fffa
,
0xba39aee9
,
0xa4ffd30b
,
0xfaf7933b
,
0x6d498623
,
0x193cbcfa
,
0x27627545
,
0x825cf47a
,
0x61bd8ba0
,
0xd11e42d1
,
0xcead04f4
,
0x127ea392
,
0x10428db7
,
0x8272a972
,
0x9270c4a8
,
0x127de50b
,
0x285ba1c8
,
0x3c62f44f
,
0x35c0eaa5
,
0xe805d231
,
0x428929fb
,
0xb4fcdf82
,
0x4fb66a53
,
0x0e7dc15b
,
0x1f081fab
,
0x108618ae
,
0xfcfd086d
,
0xf9ff2889
,
0x694bcc11
,
0x236a5cae
,
0x12deca4d
,
0x2c3f8cc5
,
0xd2d02dfe
,
0xf8ef5896
,
0xe4cf52da
,
0x95155b67
,
0x494a488c
,
0xb9b6a80c
,
0x5c8f82bc
,
0x89d36b45
,
0x3a609437
,
0xec00c9a9
,
0x44715253
,
0x0a874b49
,
0xd773bc40
,
0x7c34671c
,
0x02717ef6
,
0x4feb5536
,
0xa2d02fff
,
0xd2bf60c4
,
0xd43f03c0
,
0x50b4ef6d
,
0x07478cd1
,
0x006e1888
,
0xa2e53f55
,
0xb9e6d4bc
,
0xa2048016
,
0x97573833
,
0xd7207d67
,
0xde0f8f3d
,
0x72f87b33
,
0xabcc4f33
,
0x7688c55d
,
0x7b00a6b0
,
0x947b0001
,
0x570075d2
,
0xf9bb88f8
,
0x8942019e
,
0x4264a5ff
,
0x856302e0
,
0x72dbd92b
,
0xee971b69
,
0x6ea22fde
,
0x5f08ae2b
,
0xaf7a616d
,
0xe5c98767
,
0xcf1febd2
,
0x61efc8c2
,
0xf1ac2571
,
0xcc8239c2
,
0x67214cb8
,
0xb1e583d1
,
0xb7dc3e62
,
0x7f10bdce
,
0xf90a5c38
,
0x0ff0443d
,
0x606e6dc6
,
0x60543a49
,
0x5727c148
,
0x2be98a1d
,
0x8ab41738
,
0x20e1be24
,
0xaf96da0f
,
0x68458425
,
0x99833be5
,
0x600d457d
,
0x282f9350
,
0x8334b362
,
0xd91d1120
,
0x2b6d8da0
,
0x642b1e31
,
0x9c305a00
,
0x52bce688
,
0x1b03588a
,
0xf7baefd5
,
0x4142ed9c
,
0xa4315c11
,
0x83323ec5
,
0xdfef4636
,
0xa133c501
,
0xe9d3531c
,
0xee353783
};
static
const
u32
s4
[
256
]
=
{
0x9db30420
,
0x1fb6e9de
,
0xa7be7bef
,
0xd273a298
,
0x4a4f7bdb
,
0x64ad8c57
,
0x85510443
,
0xfa020ed1
,
0x7e287aff
,
0xe60fb663
,
0x095f35a1
,
0x79ebf120
,
0xfd059d43
,
0x6497b7b1
,
0xf3641f63
,
0x241e4adf
,
0x28147f5f
,
0x4fa2b8cd
,
0xc9430040
,
0x0cc32220
,
0xfdd30b30
,
0xc0a5374f
,
0x1d2d00d9
,
0x24147b15
,
0xee4d111a
,
0x0fca5167
,
0x71ff904c
,
0x2d195ffe
,
0x1a05645f
,
0x0c13fefe
,
0x081b08ca
,
0x05170121
,
0x80530100
,
0xe83e5efe
,
0xac9af4f8
,
0x7fe72701
,
0xd2b8ee5f
,
0x06df4261
,
0xbb9e9b8a
,
0x7293ea25
,
0xce84ffdf
,
0xf5718801
,
0x3dd64b04
,
0xa26f263b
,
0x7ed48400
,
0x547eebe6
,
0x446d4ca0
,
0x6cf3d6f5
,
0x2649abdf
,
0xaea0c7f5
,
0x36338cc1
,
0x503f7e93
,
0xd3772061
,
0x11b638e1
,
0x72500e03
,
0xf80eb2bb
,
0xabe0502e
,
0xec8d77de
,
0x57971e81
,
0xe14f6746
,
0xc9335400
,
0x6920318f
,
0x081dbb99
,
0xffc304a5
,
0x4d351805
,
0x7f3d5ce3
,
0xa6c866c6
,
0x5d5bcca9
,
0xdaec6fea
,
0x9f926f91
,
0x9f46222f
,
0x3991467d
,
0xa5bf6d8e
,
0x1143c44f
,
0x43958302
,
0xd0214eeb
,
0x022083b8
,
0x3fb6180c
,
0x18f8931e
,
0x281658e6
,
0x26486e3e
,
0x8bd78a70
,
0x7477e4c1
,
0xb506e07c
,
0xf32d0a25
,
0x79098b02
,
0xe4eabb81
,
0x28123b23
,
0x69dead38
,
0x1574ca16
,
0xdf871b62
,
0x211c40b7
,
0xa51a9ef9
,
0x0014377b
,
0x041e8ac8
,
0x09114003
,
0xbd59e4d2
,
0xe3d156d5
,
0x4fe876d5
,
0x2f91a340
,
0x557be8de
,
0x00eae4a7
,
0x0ce5c2ec
,
0x4db4bba6
,
0xe756bdff
,
0xdd3369ac
,
0xec17b035
,
0x06572327
,
0x99afc8b0
,
0x56c8c391
,
0x6b65811c
,
0x5e146119
,
0x6e85cb75
,
0xbe07c002
,
0xc2325577
,
0x893ff4ec
,
0x5bbfc92d
,
0xd0ec3b25
,
0xb7801ab7
,
0x8d6d3b24
,
0x20c763ef
,
0xc366a5fc
,
0x9c382880
,
0x0ace3205
,
0xaac9548a
,
0xeca1d7c7
,
0x041afa32
,
0x1d16625a
,
0x6701902c
,
0x9b757a54
,
0x31d477f7
,
0x9126b031
,
0x36cc6fdb
,
0xc70b8b46
,
0xd9e66a48
,
0x56e55a79
,
0x026a4ceb
,
0x52437eff
,
0x2f8f76b4
,
0x0df980a5
,
0x8674cde3
,
0xedda04eb
,
0x17a9be04
,
0x2c18f4df
,
0xb7747f9d
,
0xab2af7b4
,
0xefc34d20
,
0x2e096b7c
,
0x1741a254
,
0xe5b6a035
,
0x213d42f6
,
0x2c1c7c26
,
0x61c2f50f
,
0x6552daf9
,
0xd2c231f8
,
0x25130f69
,
0xd8167fa2
,
0x0418f2c8
,
0x001a96a6
,
0x0d1526ab
,
0x63315c21
,
0x5e0a72ec
,
0x49bafefd
,
0x187908d9
,
0x8d0dbd86
,
0x311170a7
,
0x3e9b640c
,
0xcc3e10d7
,
0xd5cad3b6
,
0x0caec388
,
0xf73001e1
,
0x6c728aff
,
0x71eae2a1
,
0x1f9af36e
,
0xcfcbd12f
,
0xc1de8417
,
0xac07be6b
,
0xcb44a1d8
,
0x8b9b0f56
,
0x013988c3
,
0xb1c52fca
,
0xb4be31cd
,
0xd8782806
,
0x12a3a4e2
,
0x6f7de532
,
0x58fd7eb6
,
0xd01ee900
,
0x24adffc2
,
0xf4990fc5
,
0x9711aac5
,
0x001d7b95
,
0x82e5e7d2
,
0x109873f6
,
0x00613096
,
0xc32d9521
,
0xada121ff
,
0x29908415
,
0x7fbb977f
,
0xaf9eb3db
,
0x29c9ed2a
,
0x5ce2a465
,
0xa730f32c
,
0xd0aa3fe8
,
0x8a5cc091
,
0xd49e2ce7
,
0x0ce454a9
,
0xd60acd86
,
0x015f1919
,
0x77079103
,
0xdea03af6
,
0x78a8565e
,
0xdee356df
,
0x21f05cbe
,
0x8b75e387
,
0xb3c50651
,
0xb8a5c3ef
,
0xd8eeb6d2
,
0xe523be77
,
0xc2154529
,
0x2f69efdf
,
0xafe67afb
,
0xf470c4b2
,
0xf3e0eb5b
,
0xd6cc9876
,
0x39e4460c
,
0x1fda8538
,
0x1987832f
,
0xca007367
,
0xa99144f8
,
0x296b299e
,
0x492fc295
,
0x9266beab
,
0xb5676e69
,
0x9bd3ddda
,
0xdf7e052f
,
0xdb25701c
,
0x1b5e51ee
,
0xf65324e6
,
0x6afce36c
,
0x0316cc04
,
0x8644213e
,
0xb7dc59d0
,
0x7965291f
,
0xccd6fd43
,
0x41823979
,
0x932bcdf6
,
0xb657c34d
,
0x4edfd282
,
0x7ae5290c
,
0x3cb9536b
,
0x851e20fe
,
0x9833557e
,
0x13ecf0b0
,
0xd3ffb372
,
0x3f85c5c1
,
0x0aef7ed2
};
static
const
u32
s5
[
256
]
=
{
0x7ec90c04
,
0x2c6e74b9
,
0x9b0e66df
,
0xa6337911
,
0xb86a7fff
,
0x1dd358f5
,
0x44dd9d44
,
0x1731167f
,
0x08fbf1fa
,
0xe7f511cc
,
0xd2051b00
,
0x735aba00
,
0x2ab722d8
,
0x386381cb
,
0xacf6243a
,
0x69befd7a
,
0xe6a2e77f
,
0xf0c720cd
,
0xc4494816
,
0xccf5c180
,
0x38851640
,
0x15b0a848
,
0xe68b18cb
,
0x4caadeff
,
0x5f480a01
,
0x0412b2aa
,
0x259814fc
,
0x41d0efe2
,
0x4e40b48d
,
0x248eb6fb
,
0x8dba1cfe
,
0x41a99b02
,
0x1a550a04
,
0xba8f65cb
,
0x7251f4e7
,
0x95a51725
,
0xc106ecd7
,
0x97a5980a
,
0xc539b9aa
,
0x4d79fe6a
,
0xf2f3f763
,
0x68af8040
,
0xed0c9e56
,
0x11b4958b
,
0xe1eb5a88
,
0x8709e6b0
,
0xd7e07156
,
0x4e29fea7
,
0x6366e52d
,
0x02d1c000
,
0xc4ac8e05
,
0x9377f571
,
0x0c05372a
,
0x578535f2
,
0x2261be02
,
0xd642a0c9
,
0xdf13a280
,
0x74b55bd2
,
0x682199c0
,
0xd421e5ec
,
0x53fb3ce8
,
0xc8adedb3
,
0x28a87fc9
,
0x3d959981
,
0x5c1ff900
,
0xfe38d399
,
0x0c4eff0b
,
0x062407ea
,
0xaa2f4fb1
,
0x4fb96976
,
0x90c79505
,
0xb0a8a774
,
0xef55a1ff
,
0xe59ca2c2
,
0xa6b62d27
,
0xe66a4263
,
0xdf65001f
,
0x0ec50966
,
0xdfdd55bc
,
0x29de0655
,
0x911e739a
,
0x17af8975
,
0x32c7911c
,
0x89f89468
,
0x0d01e980
,
0x524755f4
,
0x03b63cc9
,
0x0cc844b2
,
0xbcf3f0aa
,
0x87ac36e9
,
0xe53a7426
,
0x01b3d82b
,
0x1a9e7449
,
0x64ee2d7e
,
0xcddbb1da
,
0x01c94910
,
0xb868bf80
,
0x0d26f3fd
,
0x9342ede7
,
0x04a5c284
,
0x636737b6
,
0x50f5b616
,
0xf24766e3
,
0x8eca36c1
,
0x136e05db
,
0xfef18391
,
0xfb887a37
,
0xd6e7f7d4
,
0xc7fb7dc9
,
0x3063fcdf
,
0xb6f589de
,
0xec2941da
,
0x26e46695
,
0xb7566419
,
0xf654efc5
,
0xd08d58b7
,
0x48925401
,
0xc1bacb7f
,
0xe5ff550f
,
0xb6083049
,
0x5bb5d0e8
,
0x87d72e5a
,
0xab6a6ee1
,
0x223a66ce
,
0xc62bf3cd
,
0x9e0885f9
,
0x68cb3e47
,
0x086c010f
,
0xa21de820
,
0xd18b69de
,
0xf3f65777
,
0xfa02c3f6
,
0x407edac3
,
0xcbb3d550
,
0x1793084d
,
0xb0d70eba
,
0x0ab378d5
,
0xd951fb0c
,
0xded7da56
,
0x4124bbe4
,
0x94ca0b56
,
0x0f5755d1
,
0xe0e1e56e
,
0x6184b5be
,
0x580a249f
,
0x94f74bc0
,
0xe327888e
,
0x9f7b5561
,
0xc3dc0280
,
0x05687715
,
0x646c6bd7
,
0x44904db3
,
0x66b4f0a3
,
0xc0f1648a
,
0x697ed5af
,
0x49e92ff6
,
0x309e374f
,
0x2cb6356a
,
0x85808573
,
0x4991f840
,
0x76f0ae02
,
0x083be84d
,
0x28421c9a
,
0x44489406
,
0x736e4cb8
,
0xc1092910
,
0x8bc95fc6
,
0x7d869cf4
,
0x134f616f
,
0x2e77118d
,
0xb31b2be1
,
0xaa90b472
,
0x3ca5d717
,
0x7d161bba
,
0x9cad9010
,
0xaf462ba2
,
0x9fe459d2
,
0x45d34559
,
0xd9f2da13
,
0xdbc65487
,
0xf3e4f94e
,
0x176d486f
,
0x097c13ea
,
0x631da5c7
,
0x445f7382
,
0x175683f4
,
0xcdc66a97
,
0x70be0288
,
0xb3cdcf72
,
0x6e5dd2f3
,
0x20936079
,
0x459b80a5
,
0xbe60e2db
,
0xa9c23101
,
0xeba5315c
,
0x224e42f2
,
0x1c5c1572
,
0xf6721b2c
,
0x1ad2fff3
,
0x8c25404e
,
0x324ed72f
,
0x4067b7fd
,
0x0523138e
,
0x5ca3bc78
,
0xdc0fd66e
,
0x75922283
,
0x784d6b17
,
0x58ebb16e
,
0x44094f85
,
0x3f481d87
,
0xfcfeae7b
,
0x77b5ff76
,
0x8c2302bf
,
0xaaf47556
,
0x5f46b02a
,
0x2b092801
,
0x3d38f5f7
,
0x0ca81f36
,
0x52af4a8a
,
0x66d5e7c0
,
0xdf3b0874
,
0x95055110
,
0x1b5ad7a8
,
0xf61ed5ad
,
0x6cf6e479
,
0x20758184
,
0xd0cefa65
,
0x88f7be58
,
0x4a046826
,
0x0ff6f8f3
,
0xa09c7f70
,
0x5346aba0
,
0x5ce96c28
,
0xe176eda3
,
0x6bac307f
,
0x376829d2
,
0x85360fa9
,
0x17e3fe2a
,
0x24b79767
,
0xf5a96b20
,
0xd6cd2595
,
0x68ff1ebf
,
0x7555442c
,
0xf19f06be
,
0xf9e0659a
,
0xeeb9491d
,
0x34010718
,
0xbb30cab8
,
0xe822fe15
,
0x88570983
,
0x750e6249
,
0xda627e55
,
0x5e76ffa8
,
0xb1534546
,
0x6d47de08
,
0xefe9e7d4
};
static
const
u32
s6
[
256
]
=
{
0xf6fa8f9d
,
0x2cac6ce1
,
0x4ca34867
,
0xe2337f7c
,
0x95db08e7
,
0x016843b4
,
0xeced5cbc
,
0x325553ac
,
0xbf9f0960
,
0xdfa1e2ed
,
0x83f0579d
,
0x63ed86b9
,
0x1ab6a6b8
,
0xde5ebe39
,
0xf38ff732
,
0x8989b138
,
0x33f14961
,
0xc01937bd
,
0xf506c6da
,
0xe4625e7e
,
0xa308ea99
,
0x4e23e33c
,
0x79cbd7cc
,
0x48a14367
,
0xa3149619
,
0xfec94bd5
,
0xa114174a
,
0xeaa01866
,
0xa084db2d
,
0x09a8486f
,
0xa888614a
,
0x2900af98
,
0x01665991
,
0xe1992863
,
0xc8f30c60
,
0x2e78ef3c
,
0xd0d51932
,
0xcf0fec14
,
0xf7ca07d2
,
0xd0a82072
,
0xfd41197e
,
0x9305a6b0
,
0xe86be3da
,
0x74bed3cd
,
0x372da53c
,
0x4c7f4448
,
0xdab5d440
,
0x6dba0ec3
,
0x083919a7
,
0x9fbaeed9
,
0x49dbcfb0
,
0x4e670c53
,
0x5c3d9c01
,
0x64bdb941
,
0x2c0e636a
,
0xba7dd9cd
,
0xea6f7388
,
0xe70bc762
,
0x35f29adb
,
0x5c4cdd8d
,
0xf0d48d8c
,
0xb88153e2
,
0x08a19866
,
0x1ae2eac8
,
0x284caf89
,
0xaa928223
,
0x9334be53
,
0x3b3a21bf
,
0x16434be3
,
0x9aea3906
,
0xefe8c36e
,
0xf890cdd9
,
0x80226dae
,
0xc340a4a3
,
0xdf7e9c09
,
0xa694a807
,
0x5b7c5ecc
,
0x221db3a6
,
0x9a69a02f
,
0x68818a54
,
0xceb2296f
,
0x53c0843a
,
0xfe893655
,
0x25bfe68a
,
0xb4628abc
,
0xcf222ebf
,
0x25ac6f48
,
0xa9a99387
,
0x53bddb65
,
0xe76ffbe7
,
0xe967fd78
,
0x0ba93563
,
0x8e342bc1
,
0xe8a11be9
,
0x4980740d
,
0xc8087dfc
,
0x8de4bf99
,
0xa11101a0
,
0x7fd37975
,
0xda5a26c0
,
0xe81f994f
,
0x9528cd89
,
0xfd339fed
,
0xb87834bf
,
0x5f04456d
,
0x22258698
,
0xc9c4c83b
,
0x2dc156be
,
0x4f628daa
,
0x57f55ec5
,
0xe2220abe
,
0xd2916ebf
,
0x4ec75b95
,
0x24f2c3c0
,
0x42d15d99
,
0xcd0d7fa0
,
0x7b6e27ff
,
0xa8dc8af0
,
0x7345c106
,
0xf41e232f
,
0x35162386
,
0xe6ea8926
,
0x3333b094
,
0x157ec6f2
,
0x372b74af
,
0x692573e4
,
0xe9a9d848
,
0xf3160289
,
0x3a62ef1d
,
0xa787e238
,
0xf3a5f676
,
0x74364853
,
0x20951063
,
0x4576698d
,
0xb6fad407
,
0x592af950
,
0x36f73523
,
0x4cfb6e87
,
0x7da4cec0
,
0x6c152daa
,
0xcb0396a8
,
0xc50dfe5d
,
0xfcd707ab
,
0x0921c42f
,
0x89dff0bb
,
0x5fe2be78
,
0x448f4f33
,
0x754613c9
,
0x2b05d08d
,
0x48b9d585
,
0xdc049441
,
0xc8098f9b
,
0x7dede786
,
0xc39a3373
,
0x42410005
,
0x6a091751
,
0x0ef3c8a6
,
0x890072d6
,
0x28207682
,
0xa9a9f7be
,
0xbf32679d
,
0xd45b5b75
,
0xb353fd00
,
0xcbb0e358
,
0x830f220a
,
0x1f8fb214
,
0xd372cf08
,
0xcc3c4a13
,
0x8cf63166
,
0x061c87be
,
0x88c98f88
,
0x6062e397
,
0x47cf8e7a
,
0xb6c85283
,
0x3cc2acfb
,
0x3fc06976
,
0x4e8f0252
,
0x64d8314d
,
0xda3870e3
,
0x1e665459
,
0xc10908f0
,
0x513021a5
,
0x6c5b68b7
,
0x822f8aa0
,
0x3007cd3e
,
0x74719eef
,
0xdc872681
,
0x073340d4
,
0x7e432fd9
,
0x0c5ec241
,
0x8809286c
,
0xf592d891
,
0x08a930f6
,
0x957ef305
,
0xb7fbffbd
,
0xc266e96f
,
0x6fe4ac98
,
0xb173ecc0
,
0xbc60b42a
,
0x953498da
,
0xfba1ae12
,
0x2d4bd736
,
0x0f25faab
,
0xa4f3fceb
,
0xe2969123
,
0x257f0c3d
,
0x9348af49
,
0x361400bc
,
0xe8816f4a
,
0x3814f200
,
0xa3f94043
,
0x9c7a54c2
,
0xbc704f57
,
0xda41e7f9
,
0xc25ad33a
,
0x54f4a084
,
0xb17f5505
,
0x59357cbe
,
0xedbd15c8
,
0x7f97c5ab
,
0xba5ac7b5
,
0xb6f6deaf
,
0x3a479c3a
,
0x5302da25
,
0x653d7e6a
,
0x54268d49
,
0x51a477ea
,
0x5017d55b
,
0xd7d25d88
,
0x44136c76
,
0x0404a8c8
,
0xb8e5a121
,
0xb81a928a
,
0x60ed5869
,
0x97c55b96
,
0xeaec991b
,
0x29935913
,
0x01fdb7f1
,
0x088e8dfa
,
0x9ab6f6f5
,
0x3b4cbf9f
,
0x4a5de3ab
,
0xe6051d35
,
0xa0e1d855
,
0xd36b4cf1
,
0xf544edeb
,
0xb0e93524
,
0xbebb8fbd
,
0xa2d762cf
,
0x49c92f54
,
0x38b5f331
,
0x7128a454
,
0x48392905
,
0xa65b1db8
,
0x851c97bd
,
0xd675cf2f
};
static
const
u32
s7
[
256
]
=
{
0x85e04019
,
0x332bf567
,
0x662dbfff
,
0xcfc65693
,
0x2a8d7f6f
,
0xab9bc912
,
0xde6008a1
,
0x2028da1f
,
0x0227bce7
,
0x4d642916
,
0x18fac300
,
0x50f18b82
,
0x2cb2cb11
,
0xb232e75c
,
0x4b3695f2
,
0xb28707de
,
0xa05fbcf6
,
0xcd4181e9
,
0xe150210c
,
0xe24ef1bd
,
0xb168c381
,
0xfde4e789
,
0x5c79b0d8
,
0x1e8bfd43
,
0x4d495001
,
0x38be4341
,
0x913cee1d
,
0x92a79c3f
,
0x089766be
,
0xbaeeadf4
,
0x1286becf
,
0xb6eacb19
,
0x2660c200
,
0x7565bde4
,
0x64241f7a
,
0x8248dca9
,
0xc3b3ad66
,
0x28136086
,
0x0bd8dfa8
,
0x356d1cf2
,
0x107789be
,
0xb3b2e9ce
,
0x0502aa8f
,
0x0bc0351e
,
0x166bf52a
,
0xeb12ff82
,
0xe3486911
,
0xd34d7516
,
0x4e7b3aff
,
0x5f43671b
,
0x9cf6e037
,
0x4981ac83
,
0x334266ce
,
0x8c9341b7
,
0xd0d854c0
,
0xcb3a6c88
,
0x47bc2829
,
0x4725ba37
,
0xa66ad22b
,
0x7ad61f1e
,
0x0c5cbafa
,
0x4437f107
,
0xb6e79962
,
0x42d2d816
,
0x0a961288
,
0xe1a5c06e
,
0x13749e67
,
0x72fc081a
,
0xb1d139f7
,
0xf9583745
,
0xcf19df58
,
0xbec3f756
,
0xc06eba30
,
0x07211b24
,
0x45c28829
,
0xc95e317f
,
0xbc8ec511
,
0x38bc46e9
,
0xc6e6fa14
,
0xbae8584a
,
0xad4ebc46
,
0x468f508b
,
0x7829435f
,
0xf124183b
,
0x821dba9f
,
0xaff60ff4
,
0xea2c4e6d
,
0x16e39264
,
0x92544a8b
,
0x009b4fc3
,
0xaba68ced
,
0x9ac96f78
,
0x06a5b79a
,
0xb2856e6e
,
0x1aec3ca9
,
0xbe838688
,
0x0e0804e9
,
0x55f1be56
,
0xe7e5363b
,
0xb3a1f25d
,
0xf7debb85
,
0x61fe033c
,
0x16746233
,
0x3c034c28
,
0xda6d0c74
,
0x79aac56c
,
0x3ce4e1ad
,
0x51f0c802
,
0x98f8f35a
,
0x1626a49f
,
0xeed82b29
,
0x1d382fe3
,
0x0c4fb99a
,
0xbb325778
,
0x3ec6d97b
,
0x6e77a6a9
,
0xcb658b5c
,
0xd45230c7
,
0x2bd1408b
,
0x60c03eb7
,
0xb9068d78
,
0xa33754f4
,
0xf430c87d
,
0xc8a71302
,
0xb96d8c32
,
0xebd4e7be
,
0xbe8b9d2d
,
0x7979fb06
,
0xe7225308
,
0x8b75cf77
,
0x11ef8da4
,
0xe083c858
,
0x8d6b786f
,
0x5a6317a6
,
0xfa5cf7a0
,
0x5dda0033
,
0xf28ebfb0
,
0xf5b9c310
,
0xa0eac280
,
0x08b9767a
,
0xa3d9d2b0
,
0x79d34217
,
0x021a718d
,
0x9ac6336a
,
0x2711fd60
,
0x438050e3
,
0x069908a8
,
0x3d7fedc4
,
0x826d2bef
,
0x4eeb8476
,
0x488dcf25
,
0x36c9d566
,
0x28e74e41
,
0xc2610aca
,
0x3d49a9cf
,
0xbae3b9df
,
0xb65f8de6
,
0x92aeaf64
,
0x3ac7d5e6
,
0x9ea80509
,
0xf22b017d
,
0xa4173f70
,
0xdd1e16c3
,
0x15e0d7f9
,
0x50b1b887
,
0x2b9f4fd5
,
0x625aba82
,
0x6a017962
,
0x2ec01b9c
,
0x15488aa9
,
0xd716e740
,
0x40055a2c
,
0x93d29a22
,
0xe32dbf9a
,
0x058745b9
,
0x3453dc1e
,
0xd699296e
,
0x496cff6f
,
0x1c9f4986
,
0xdfe2ed07
,
0xb87242d1
,
0x19de7eae
,
0x053e561a
,
0x15ad6f8c
,
0x66626c1c
,
0x7154c24c
,
0xea082b2a
,
0x93eb2939
,
0x17dcb0f0
,
0x58d4f2ae
,
0x9ea294fb
,
0x52cf564c
,
0x9883fe66
,
0x2ec40581
,
0x763953c3
,
0x01d6692e
,
0xd3a0c108
,
0xa1e7160e
,
0xe4f2dfa6
,
0x693ed285
,
0x74904698
,
0x4c2b0edd
,
0x4f757656
,
0x5d393378
,
0xa132234f
,
0x3d321c5d
,
0xc3f5e194
,
0x4b269301
,
0xc79f022f
,
0x3c997e7e
,
0x5e4f9504
,
0x3ffafbbd
,
0x76f7ad0e
,
0x296693f4
,
0x3d1fce6f
,
0xc61e45be
,
0xd3b5ab34
,
0xf72bf9b7
,
0x1b0434c0
,
0x4e72b567
,
0x5592a33d
,
0xb5229301
,
0xcfd2a87f
,
0x60aeb767
,
0x1814386b
,
0x30bcc33d
,
0x38a0c07d
,
0xfd1606f2
,
0xc363519b
,
0x589dd390
,
0x5479f8e6
,
0x1cb8d647
,
0x97fd61a9
,
0xea7759f4
,
0x2d57539d
,
0x569a58cf
,
0xe84e63ad
,
0x462e1b78
,
0x6580f87e
,
0xf3817914
,
0x91da55f4
,
0x40a230f3
,
0xd1988f35
,
0xb6e318d2
,
0x3ffa50bc
,
0x3d40f021
,
0xc3c0bdae
,
0x4958c24c
,
0x518f36b2
,
0x84b1d370
,
0x0fedce83
,
0x878ddada
,
0xf2a279c7
,
0x94e01be8
,
0x90716f4b
,
0x954b8aa3
};
static
const
u32
sb8
[
256
]
=
{
0xe216300d
,
0xbbddfffc
,
0xa7ebdabd
,
0x35648095
,
0x7789f8b7
,
0xe6c1121b
,
0x0e241600
,
0x052ce8b5
,
0x11a9cfb0
,
0xe5952f11
,
0xece7990a
,
0x9386d174
,
0x2a42931c
,
0x76e38111
,
0xb12def3a
,
0x37ddddfc
,
0xde9adeb1
,
0x0a0cc32c
,
0xbe197029
,
0x84a00940
,
0xbb243a0f
,
0xb4d137cf
,
0xb44e79f0
,
0x049eedfd
,
0x0b15a15d
,
0x480d3168
,
0x8bbbde5a
,
0x669ded42
,
0xc7ece831
,
0x3f8f95e7
,
0x72df191b
,
0x7580330d
,
0x94074251
,
0x5c7dcdfa
,
0xabbe6d63
,
0xaa402164
,
0xb301d40a
,
0x02e7d1ca
,
0x53571dae
,
0x7a3182a2
,
0x12a8ddec
,
0xfdaa335d
,
0x176f43e8
,
0x71fb46d4
,
0x38129022
,
0xce949ad4
,
0xb84769ad
,
0x965bd862
,
0x82f3d055
,
0x66fb9767
,
0x15b80b4e
,
0x1d5b47a0
,
0x4cfde06f
,
0xc28ec4b8
,
0x57e8726e
,
0x647a78fc
,
0x99865d44
,
0x608bd593
,
0x6c200e03
,
0x39dc5ff6
,
0x5d0b00a3
,
0xae63aff2
,
0x7e8bd632
,
0x70108c0c
,
0xbbd35049
,
0x2998df04
,
0x980cf42a
,
0x9b6df491
,
0x9e7edd53
,
0x06918548
,
0x58cb7e07
,
0x3b74ef2e
,
0x522fffb1
,
0xd24708cc
,
0x1c7e27cd
,
0xa4eb215b
,
0x3cf1d2e2
,
0x19b47a38
,
0x424f7618
,
0x35856039
,
0x9d17dee7
,
0x27eb35e6
,
0xc9aff67b
,
0x36baf5b8
,
0x09c467cd
,
0xc18910b1
,
0xe11dbf7b
,
0x06cd1af8
,
0x7170c608
,
0x2d5e3354
,
0xd4de495a
,
0x64c6d006
,
0xbcc0c62c
,
0x3dd00db3
,
0x708f8f34
,
0x77d51b42
,
0x264f620f
,
0x24b8d2bf
,
0x15c1b79e
,
0x46a52564
,
0xf8d7e54e
,
0x3e378160
,
0x7895cda5
,
0x859c15a5
,
0xe6459788
,
0xc37bc75f
,
0xdb07ba0c
,
0x0676a3ab
,
0x7f229b1e
,
0x31842e7b
,
0x24259fd7
,
0xf8bef472
,
0x835ffcb8
,
0x6df4c1f2
,
0x96f5b195
,
0xfd0af0fc
,
0xb0fe134c
,
0xe2506d3d
,
0x4f9b12ea
,
0xf215f225
,
0xa223736f
,
0x9fb4c428
,
0x25d04979
,
0x34c713f8
,
0xc4618187
,
0xea7a6e98
,
0x7cd16efc
,
0x1436876c
,
0xf1544107
,
0xbedeee14
,
0x56e9af27
,
0xa04aa441
,
0x3cf7c899
,
0x92ecbae6
,
0xdd67016d
,
0x151682eb
,
0xa842eedf
,
0xfdba60b4
,
0xf1907b75
,
0x20e3030f
,
0x24d8c29e
,
0xe139673b
,
0xefa63fb8
,
0x71873054
,
0xb6f2cf3b
,
0x9f326442
,
0xcb15a4cc
,
0xb01a4504
,
0xf1e47d8d
,
0x844a1be5
,
0xbae7dfdc
,
0x42cbda70
,
0xcd7dae0a
,
0x57e85b7a
,
0xd53f5af6
,
0x20cf4d8c
,
0xcea4d428
,
0x79d130a4
,
0x3486ebfb
,
0x33d3cddc
,
0x77853b53
,
0x37effcb5
,
0xc5068778
,
0xe580b3e6
,
0x4e68b8f4
,
0xc5c8b37e
,
0x0d809ea2
,
0x398feb7c
,
0x132a4f94
,
0x43b7950e
,
0x2fee7d1c
,
0x223613bd
,
0xdd06caa2
,
0x37df932b
,
0xc4248289
,
0xacf3ebc3
,
0x5715f6b7
,
0xef3478dd
,
0xf267616f
,
0xc148cbe4
,
0x9052815e
,
0x5e410fab
,
0xb48a2465
,
0x2eda7fa4
,
0xe87b40e4
,
0xe98ea084
,
0x5889e9e1
,
0xefd390fc
,
0xdd07d35b
,
0xdb485694
,
0x38d7e5b2
,
0x57720101
,
0x730edebc
,
0x5b643113
,
0x94917e4f
,
0x503c2fba
,
0x646f1282
,
0x7523d24a
,
0xe0779695
,
0xf9c17a8f
,
0x7a5b2121
,
0xd187b896
,
0x29263a4d
,
0xba510cdf
,
0x81f47c9f
,
0xad1163ed
,
0xea7b5965
,
0x1a00726e
,
0x11403092
,
0x00da6d77
,
0x4a0cdd61
,
0xad1f4603
,
0x605bdfb0
,
0x9eedc364
,
0x22ebe6a8
,
0xcee7d28a
,
0xa0e736a0
,
0x5564a6b9
,
0x10853209
,
0xc7eb8f37
,
0x2de705ca
,
0x8951570f
,
0xdf09822b
,
0xbd691a6c
,
0xaa12e4f2
,
0x87451c0f
,
0xe0f6a27a
,
0x3ada4819
,
0x4cf1764f
,
0x0d771c2b
,
0x67cdb156
,
0x350d8384
,
0x5938fa0f
,
0x42399ef3
,
0x36997b07
,
0x0e84093d
,
0x4aa93e61
,
0x8360d87b
,
0x1fa98b0c
,
0x1149382c
,
0xe97625a5
,
0x0614d1b7
,
0x0e25244b
,
0x0c768347
,
0x589e8d82
,
0x0d2059d1
,
0xa466bb1e
,
0xf8da0a82
,
0x04f19130
,
0xba6e4ec0
,
0x99265164
,
0x1ee7230d
,
0x50b2ad80
,
0xeaee6801
,
0x8db2a283
,
0xea8bf59e
};
#define rol(n,x) ( ((x) << (n)) | ((x) >> (32-(n))) )
#define F1(D,m,r) ( (I = ((m) + (D))), (I=rol((r),I)), \
(((s1[I >> 24] ^ s2[(I>>16)&0xff]) - s3[(I>>8)&0xff]) + s4[I&0xff]) )
#define F2(D,m,r) ( (I = ((m) ^ (D))), (I=rol((r),I)), \
(((s1[I >> 24] - s2[(I>>16)&0xff]) + s3[(I>>8)&0xff]) ^ s4[I&0xff]) )
#define F3(D,m,r) ( (I = ((m) - (D))), (I=rol((r),I)), \
(((s1[I >> 24] + s2[(I>>16)&0xff]) ^ s3[(I>>8)&0xff]) - s4[I&0xff]) )
static
void
cast5_encrypt
(
void
*
ctx
,
u8
*
outbuf
,
const
u8
*
inbuf
)
{
struct
cast5_ctx
*
c
=
(
struct
cast5_ctx
*
)
ctx
;
u32
l
,
r
,
t
;
u32
I
;
/* used by the Fx macros */
u32
*
Km
;
u8
*
Kr
;
Km
=
c
->
Km
;
Kr
=
c
->
Kr
;
/* (L0,R0) <-- (m1...m64). (Split the plaintext into left and
* right 32-bit halves L0 = m1...m32 and R0 = m33...m64.)
*/
l
=
inbuf
[
0
]
<<
24
|
inbuf
[
1
]
<<
16
|
inbuf
[
2
]
<<
8
|
inbuf
[
3
];
r
=
inbuf
[
4
]
<<
24
|
inbuf
[
5
]
<<
16
|
inbuf
[
6
]
<<
8
|
inbuf
[
7
];
/* (16 rounds) for i from 1 to 16, compute Li and Ri as follows:
* Li = Ri-1;
* Ri = Li-1 ^ f(Ri-1,Kmi,Kri), where f is defined in Section 2.2
* Rounds 1, 4, 7, 10, 13, and 16 use f function Type 1.
* Rounds 2, 5, 8, 11, and 14 use f function Type 2.
* Rounds 3, 6, 9, 12, and 15 use f function Type 3.
*/
if
(
!
(
c
->
rr
))
{
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
0
],
Kr
[
0
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
1
],
Kr
[
1
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
2
],
Kr
[
2
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
3
],
Kr
[
3
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
4
],
Kr
[
4
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
5
],
Kr
[
5
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
6
],
Kr
[
6
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
7
],
Kr
[
7
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
8
],
Kr
[
8
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
9
],
Kr
[
9
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
10
],
Kr
[
10
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
11
],
Kr
[
11
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
12
],
Kr
[
12
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
13
],
Kr
[
13
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
14
],
Kr
[
14
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
15
],
Kr
[
15
]);
}
else
{
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
0
],
Kr
[
0
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
1
],
Kr
[
1
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
2
],
Kr
[
2
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
3
],
Kr
[
3
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
4
],
Kr
[
4
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
5
],
Kr
[
5
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
6
],
Kr
[
6
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
7
],
Kr
[
7
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
8
],
Kr
[
8
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
9
],
Kr
[
9
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
10
],
Kr
[
10
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
11
],
Kr
[
11
]);
}
/* c1...c64 <-- (R16,L16). (Exchange final blocks L16, R16 and
* concatenate to form the ciphertext.) */
outbuf
[
0
]
=
(
r
>>
24
)
&
0xff
;
outbuf
[
1
]
=
(
r
>>
16
)
&
0xff
;
outbuf
[
2
]
=
(
r
>>
8
)
&
0xff
;
outbuf
[
3
]
=
r
&
0xff
;
outbuf
[
4
]
=
(
l
>>
24
)
&
0xff
;
outbuf
[
5
]
=
(
l
>>
16
)
&
0xff
;
outbuf
[
6
]
=
(
l
>>
8
)
&
0xff
;
outbuf
[
7
]
=
l
&
0xff
;
}
static
void
cast5_decrypt
(
void
*
ctx
,
u8
*
outbuf
,
const
u8
*
inbuf
)
{
struct
cast5_ctx
*
c
=
(
struct
cast5_ctx
*
)
ctx
;
u32
l
,
r
,
t
;
u32
I
;
u32
*
Km
;
u8
*
Kr
;
Km
=
c
->
Km
;
Kr
=
c
->
Kr
;
l
=
inbuf
[
0
]
<<
24
|
inbuf
[
1
]
<<
16
|
inbuf
[
2
]
<<
8
|
inbuf
[
3
];
r
=
inbuf
[
4
]
<<
24
|
inbuf
[
5
]
<<
16
|
inbuf
[
6
]
<<
8
|
inbuf
[
7
];
if
(
!
(
c
->
rr
))
{
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
15
],
Kr
[
15
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
14
],
Kr
[
14
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
13
],
Kr
[
13
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
12
],
Kr
[
12
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
11
],
Kr
[
11
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
10
],
Kr
[
10
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
9
],
Kr
[
9
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
8
],
Kr
[
8
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
7
],
Kr
[
7
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
6
],
Kr
[
6
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
5
],
Kr
[
5
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
4
],
Kr
[
4
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
3
],
Kr
[
3
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
2
],
Kr
[
2
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
1
],
Kr
[
1
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
0
],
Kr
[
0
]);
}
else
{
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
11
],
Kr
[
11
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
10
],
Kr
[
10
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
9
],
Kr
[
9
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
8
],
Kr
[
8
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
7
],
Kr
[
7
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
6
],
Kr
[
6
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
5
],
Kr
[
5
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
4
],
Kr
[
4
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
3
],
Kr
[
3
]);
t
=
l
;
l
=
r
;
r
=
t
^
F3
(
r
,
Km
[
2
],
Kr
[
2
]);
t
=
l
;
l
=
r
;
r
=
t
^
F2
(
r
,
Km
[
1
],
Kr
[
1
]);
t
=
l
;
l
=
r
;
r
=
t
^
F1
(
r
,
Km
[
0
],
Kr
[
0
]);
}
outbuf
[
0
]
=
(
r
>>
24
)
&
0xff
;
outbuf
[
1
]
=
(
r
>>
16
)
&
0xff
;
outbuf
[
2
]
=
(
r
>>
8
)
&
0xff
;
outbuf
[
3
]
=
r
&
0xff
;
outbuf
[
4
]
=
(
l
>>
24
)
&
0xff
;
outbuf
[
5
]
=
(
l
>>
16
)
&
0xff
;
outbuf
[
6
]
=
(
l
>>
8
)
&
0xff
;
outbuf
[
7
]
=
l
&
0xff
;
}
static
void
key_schedule
(
u32
*
x
,
u32
*
z
,
u32
*
k
)
{
#define xi(i) ((x[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
#define zi(i) ((z[(i)/4] >> (8*(3-((i)%4)))) & 0xff)
z
[
0
]
=
x
[
0
]
^
s5
[
xi
(
13
)]
^
s6
[
xi
(
15
)]
^
s7
[
xi
(
12
)]
^
sb8
[
xi
(
14
)]
^
s7
[
xi
(
8
)];
z
[
1
]
=
x
[
2
]
^
s5
[
zi
(
0
)]
^
s6
[
zi
(
2
)]
^
s7
[
zi
(
1
)]
^
sb8
[
zi
(
3
)]
^
sb8
[
xi
(
10
)];
z
[
2
]
=
x
[
3
]
^
s5
[
zi
(
7
)]
^
s6
[
zi
(
6
)]
^
s7
[
zi
(
5
)]
^
sb8
[
zi
(
4
)]
^
s5
[
xi
(
9
)];
z
[
3
]
=
x
[
1
]
^
s5
[
zi
(
10
)]
^
s6
[
zi
(
9
)]
^
s7
[
zi
(
11
)]
^
sb8
[
zi
(
8
)]
^
s6
[
xi
(
11
)];
k
[
0
]
=
s5
[
zi
(
8
)]
^
s6
[
zi
(
9
)]
^
s7
[
zi
(
7
)]
^
sb8
[
zi
(
6
)]
^
s5
[
zi
(
2
)];
k
[
1
]
=
s5
[
zi
(
10
)]
^
s6
[
zi
(
11
)]
^
s7
[
zi
(
5
)]
^
sb8
[
zi
(
4
)]
^
s6
[
zi
(
6
)];
k
[
2
]
=
s5
[
zi
(
12
)]
^
s6
[
zi
(
13
)]
^
s7
[
zi
(
3
)]
^
sb8
[
zi
(
2
)]
^
s7
[
zi
(
9
)];
k
[
3
]
=
s5
[
zi
(
14
)]
^
s6
[
zi
(
15
)]
^
s7
[
zi
(
1
)]
^
sb8
[
zi
(
0
)]
^
sb8
[
zi
(
12
)];
x
[
0
]
=
z
[
2
]
^
s5
[
zi
(
5
)]
^
s6
[
zi
(
7
)]
^
s7
[
zi
(
4
)]
^
sb8
[
zi
(
6
)]
^
s7
[
zi
(
0
)];
x
[
1
]
=
z
[
0
]
^
s5
[
xi
(
0
)]
^
s6
[
xi
(
2
)]
^
s7
[
xi
(
1
)]
^
sb8
[
xi
(
3
)]
^
sb8
[
zi
(
2
)];
x
[
2
]
=
z
[
1
]
^
s5
[
xi
(
7
)]
^
s6
[
xi
(
6
)]
^
s7
[
xi
(
5
)]
^
sb8
[
xi
(
4
)]
^
s5
[
zi
(
1
)];
x
[
3
]
=
z
[
3
]
^
s5
[
xi
(
10
)]
^
s6
[
xi
(
9
)]
^
s7
[
xi
(
11
)]
^
sb8
[
xi
(
8
)]
^
s6
[
zi
(
3
)];
k
[
4
]
=
s5
[
xi
(
3
)]
^
s6
[
xi
(
2
)]
^
s7
[
xi
(
12
)]
^
sb8
[
xi
(
13
)]
^
s5
[
xi
(
8
)];
k
[
5
]
=
s5
[
xi
(
1
)]
^
s6
[
xi
(
0
)]
^
s7
[
xi
(
14
)]
^
sb8
[
xi
(
15
)]
^
s6
[
xi
(
13
)];
k
[
6
]
=
s5
[
xi
(
7
)]
^
s6
[
xi
(
6
)]
^
s7
[
xi
(
8
)]
^
sb8
[
xi
(
9
)]
^
s7
[
xi
(
3
)];
k
[
7
]
=
s5
[
xi
(
5
)]
^
s6
[
xi
(
4
)]
^
s7
[
xi
(
10
)]
^
sb8
[
xi
(
11
)]
^
sb8
[
xi
(
7
)];
z
[
0
]
=
x
[
0
]
^
s5
[
xi
(
13
)]
^
s6
[
xi
(
15
)]
^
s7
[
xi
(
12
)]
^
sb8
[
xi
(
14
)]
^
s7
[
xi
(
8
)];
z
[
1
]
=
x
[
2
]
^
s5
[
zi
(
0
)]
^
s6
[
zi
(
2
)]
^
s7
[
zi
(
1
)]
^
sb8
[
zi
(
3
)]
^
sb8
[
xi
(
10
)];
z
[
2
]
=
x
[
3
]
^
s5
[
zi
(
7
)]
^
s6
[
zi
(
6
)]
^
s7
[
zi
(
5
)]
^
sb8
[
zi
(
4
)]
^
s5
[
xi
(
9
)];
z
[
3
]
=
x
[
1
]
^
s5
[
zi
(
10
)]
^
s6
[
zi
(
9
)]
^
s7
[
zi
(
11
)]
^
sb8
[
zi
(
8
)]
^
s6
[
xi
(
11
)];
k
[
8
]
=
s5
[
zi
(
3
)]
^
s6
[
zi
(
2
)]
^
s7
[
zi
(
12
)]
^
sb8
[
zi
(
13
)]
^
s5
[
zi
(
9
)];
k
[
9
]
=
s5
[
zi
(
1
)]
^
s6
[
zi
(
0
)]
^
s7
[
zi
(
14
)]
^
sb8
[
zi
(
15
)]
^
s6
[
zi
(
12
)];
k
[
10
]
=
s5
[
zi
(
7
)]
^
s6
[
zi
(
6
)]
^
s7
[
zi
(
8
)]
^
sb8
[
zi
(
9
)]
^
s7
[
zi
(
2
)];
k
[
11
]
=
s5
[
zi
(
5
)]
^
s6
[
zi
(
4
)]
^
s7
[
zi
(
10
)]
^
sb8
[
zi
(
11
)]
^
sb8
[
zi
(
6
)];
x
[
0
]
=
z
[
2
]
^
s5
[
zi
(
5
)]
^
s6
[
zi
(
7
)]
^
s7
[
zi
(
4
)]
^
sb8
[
zi
(
6
)]
^
s7
[
zi
(
0
)];
x
[
1
]
=
z
[
0
]
^
s5
[
xi
(
0
)]
^
s6
[
xi
(
2
)]
^
s7
[
xi
(
1
)]
^
sb8
[
xi
(
3
)]
^
sb8
[
zi
(
2
)];
x
[
2
]
=
z
[
1
]
^
s5
[
xi
(
7
)]
^
s6
[
xi
(
6
)]
^
s7
[
xi
(
5
)]
^
sb8
[
xi
(
4
)]
^
s5
[
zi
(
1
)];
x
[
3
]
=
z
[
3
]
^
s5
[
xi
(
10
)]
^
s6
[
xi
(
9
)]
^
s7
[
xi
(
11
)]
^
sb8
[
xi
(
8
)]
^
s6
[
zi
(
3
)];
k
[
12
]
=
s5
[
xi
(
8
)]
^
s6
[
xi
(
9
)]
^
s7
[
xi
(
7
)]
^
sb8
[
xi
(
6
)]
^
s5
[
xi
(
3
)];
k
[
13
]
=
s5
[
xi
(
10
)]
^
s6
[
xi
(
11
)]
^
s7
[
xi
(
5
)]
^
sb8
[
xi
(
4
)]
^
s6
[
xi
(
7
)];
k
[
14
]
=
s5
[
xi
(
12
)]
^
s6
[
xi
(
13
)]
^
s7
[
xi
(
3
)]
^
sb8
[
xi
(
2
)]
^
s7
[
xi
(
8
)];
k
[
15
]
=
s5
[
xi
(
14
)]
^
s6
[
xi
(
15
)]
^
s7
[
xi
(
1
)]
^
sb8
[
xi
(
0
)]
^
sb8
[
xi
(
13
)];
#undef xi
#undef zi
}
static
int
cast5_setkey
(
void
*
ctx
,
const
u8
*
key
,
unsigned
key_len
,
u32
*
flags
)
{
int
i
;
u32
x
[
4
];
u32
z
[
4
];
u32
k
[
16
];
u8
p_key
[
16
];
struct
cast5_ctx
*
c
=
(
struct
cast5_ctx
*
)
ctx
;
if
(
key_len
<
5
||
key_len
>
16
)
{
*
flags
|=
CRYPTO_TFM_RES_BAD_KEY_LEN
;
return
-
EINVAL
;
}
c
->
rr
=
key_len
<=
10
?
1
:
0
;
memset
(
p_key
,
0
,
16
);
memcpy
(
p_key
,
key
,
key_len
);
x
[
0
]
=
p_key
[
0
]
<<
24
|
p_key
[
1
]
<<
16
|
p_key
[
2
]
<<
8
|
p_key
[
3
];
x
[
1
]
=
p_key
[
4
]
<<
24
|
p_key
[
5
]
<<
16
|
p_key
[
6
]
<<
8
|
p_key
[
7
];
x
[
2
]
=
p_key
[
8
]
<<
24
|
p_key
[
9
]
<<
16
|
p_key
[
10
]
<<
8
|
p_key
[
11
];
x
[
3
]
=
p_key
[
12
]
<<
24
|
p_key
[
13
]
<<
16
|
p_key
[
14
]
<<
8
|
p_key
[
15
];
key_schedule
(
x
,
z
,
k
);
for
(
i
=
0
;
i
<
16
;
i
++
)
c
->
Km
[
i
]
=
k
[
i
];
key_schedule
(
x
,
z
,
k
);
for
(
i
=
0
;
i
<
16
;
i
++
)
c
->
Kr
[
i
]
=
k
[
i
]
&
0x1f
;
return
0
;
}
static
struct
crypto_alg
alg
=
{
.
cra_name
=
"cast5"
,
.
cra_flags
=
CRYPTO_ALG_TYPE_CIPHER
,
.
cra_blocksize
=
CAST5_BLOCK_SIZE
,
.
cra_ctxsize
=
sizeof
(
struct
cast5_ctx
),
.
cra_module
=
THIS_MODULE
,
.
cra_list
=
LIST_HEAD_INIT
(
alg
.
cra_list
),
.
cra_u
=
{
.
cipher
=
{
.
cia_min_keysize
=
CAST5_MIN_KEY_SIZE
,
.
cia_max_keysize
=
CAST5_MAX_KEY_SIZE
,
.
cia_ivsize
=
CAST5_BLOCK_SIZE
,
.
cia_setkey
=
cast5_setkey
,
.
cia_encrypt
=
cast5_encrypt
,
.
cia_decrypt
=
cast5_decrypt
}
}
};
static
int
__init
init
(
void
)
{
return
crypto_register_alg
(
&
alg
);
}
static
void
__exit
fini
(
void
)
{
crypto_unregister_alg
(
&
alg
);
}
module_init
(
init
);
module_exit
(
fini
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"Cast5 Cipher Algorithm"
);
crypto/tcrypt.c
View file @
293f3e3f
...
@@ -2192,6 +2192,102 @@ test_aes(void)
...
@@ -2192,6 +2192,102 @@ test_aes(void)
crypto_free_tfm
(
tfm
);
crypto_free_tfm
(
tfm
);
}
}
void
test_cast5
(
void
)
{
unsigned
int
ret
,
i
,
tsize
;
u8
*
p
,
*
q
,
*
key
;
struct
crypto_tfm
*
tfm
;
struct
cast5_tv
*
c5_tv
;
struct
scatterlist
sg
[
1
];
printk
(
"
\n
testing cast5 encryption
\n
"
);
tfm
=
crypto_alloc_tfm
(
"cast5"
,
0
);
if
(
tfm
==
NULL
)
{
printk
(
"failed to load transform for cast5 (default ecb)
\n
"
);
return
;
}
tsize
=
sizeof
(
cast5_enc_tv_template
);
if
(
tsize
>
TVMEMSIZE
)
{
printk
(
"template (%u) too big for tvmem (%u)
\n
"
,
tsize
,
TVMEMSIZE
);
return
;
}
memcpy
(
tvmem
,
cast5_enc_tv_template
,
tsize
);
c5_tv
=
(
void
*
)
tvmem
;
for
(
i
=
0
;
i
<
CAST5_ENC_TEST_VECTORS
;
i
++
)
{
printk
(
"test %u (%d bit key):
\n
"
,
i
+
1
,
c5_tv
[
i
].
keylen
*
8
);
key
=
c5_tv
[
i
].
key
;
ret
=
crypto_cipher_setkey
(
tfm
,
key
,
c5_tv
[
i
].
keylen
);
if
(
ret
)
{
printk
(
"setkey() failed flags=%x
\n
"
,
tfm
->
crt_flags
);
if
(
!
c5_tv
[
i
].
fail
)
goto
out
;
}
p
=
c5_tv
[
i
].
plaintext
;
sg
[
0
].
page
=
virt_to_page
(
p
);
sg
[
0
].
offset
=
((
long
)
p
&
~
PAGE_MASK
);
sg
[
0
].
length
=
sizeof
(
c5_tv
[
i
].
plaintext
);
ret
=
crypto_cipher_encrypt
(
tfm
,
sg
,
sg
,
sg
[
0
].
length
);
if
(
ret
)
{
printk
(
"encrypt() failed flags=%x
\n
"
,
tfm
->
crt_flags
);
goto
out
;
}
q
=
kmap
(
sg
[
0
].
page
)
+
sg
[
0
].
offset
;
hexdump
(
q
,
sizeof
(
c5_tv
[
i
].
ciphertext
));
printk
(
"%s
\n
"
,
memcmp
(
q
,
c5_tv
[
i
].
ciphertext
,
sizeof
(
c5_tv
[
i
].
ciphertext
))
?
"fail"
:
"pass"
);
}
tsize
=
sizeof
(
cast5_dec_tv_template
);
if
(
tsize
>
TVMEMSIZE
)
{
printk
(
"template (%u) too big for tvmem (%u)
\n
"
,
tsize
,
TVMEMSIZE
);
return
;
}
memcpy
(
tvmem
,
cast5_dec_tv_template
,
tsize
);
c5_tv
=
(
void
*
)
tvmem
;
for
(
i
=
0
;
i
<
CAST5_DEC_TEST_VECTORS
;
i
++
)
{
printk
(
"test %u (%d bit key):
\n
"
,
i
+
1
,
c5_tv
[
i
].
keylen
*
8
);
key
=
c5_tv
[
i
].
key
;
ret
=
crypto_cipher_setkey
(
tfm
,
key
,
c5_tv
[
i
].
keylen
);
if
(
ret
)
{
printk
(
"setkey() failed flags=%x
\n
"
,
tfm
->
crt_flags
);
if
(
!
c5_tv
[
i
].
fail
)
goto
out
;
}
p
=
c5_tv
[
i
].
plaintext
;
sg
[
0
].
page
=
virt_to_page
(
p
);
sg
[
0
].
offset
=
((
long
)
p
&
~
PAGE_MASK
);
sg
[
0
].
length
=
sizeof
(
c5_tv
[
i
].
plaintext
);
ret
=
crypto_cipher_decrypt
(
tfm
,
sg
,
sg
,
sg
[
0
].
length
);
if
(
ret
)
{
printk
(
"decrypt() failed flags=%x
\n
"
,
tfm
->
crt_flags
);
goto
out
;
}
q
=
kmap
(
sg
[
0
].
page
)
+
sg
[
0
].
offset
;
hexdump
(
q
,
sizeof
(
c5_tv
[
i
].
ciphertext
));
printk
(
"%s
\n
"
,
memcmp
(
q
,
c5_tv
[
i
].
ciphertext
,
sizeof
(
c5_tv
[
i
].
ciphertext
))
?
"fail"
:
"pass"
);
}
out:
crypto_free_tfm
(
tfm
);
}
static
void
static
void
test_deflate
(
void
)
test_deflate
(
void
)
{
{
...
@@ -2304,6 +2400,7 @@ do_test(void)
...
@@ -2304,6 +2400,7 @@ do_test(void)
test_sha384
();
test_sha384
();
test_sha512
();
test_sha512
();
test_deflate
();
test_deflate
();
test_cast5
();
#ifdef CONFIG_CRYPTO_HMAC
#ifdef CONFIG_CRYPTO_HMAC
test_hmac_md5
();
test_hmac_md5
();
test_hmac_sha1
();
test_hmac_sha1
();
...
@@ -2363,6 +2460,10 @@ do_test(void)
...
@@ -2363,6 +2460,10 @@ do_test(void)
test_deflate
();
test_deflate
();
break
;
break
;
case
14
:
test_cast5
();
break
;
#ifdef CONFIG_CRYPTO_HMAC
#ifdef CONFIG_CRYPTO_HMAC
case
100
:
case
100
:
test_hmac_md5
();
test_hmac_md5
();
...
...
crypto/tcrypt.h
View file @
293f3e3f
...
@@ -1682,6 +1682,74 @@ struct aes_tv aes_dec_tv_template[] = {
...
@@ -1682,6 +1682,74 @@ struct aes_tv aes_dec_tv_template[] = {
},
},
};
};
/* Cast5 test vectors from RFC 2144 */
#define CAST5_ENC_TEST_VECTORS 3
#define CAST5_DEC_TEST_VECTORS 3
struct
cast5_tv
{
unsigned
keylen
;
unsigned
fail
;
u8
key
[
16
];
u8
plaintext
[
8
];
u8
ciphertext
[
8
];
};
struct
cast5_tv
cast5_enc_tv_template
[]
=
{
{
16
,
0
,
{
0x01
,
0x23
,
0x45
,
0x67
,
0x12
,
0x34
,
0x56
,
0x78
,
0x23
,
0x45
,
0x67
,
0x89
,
0x34
,
0x56
,
0x78
,
0x9A
},
{
0x01
,
0x23
,
0x45
,
0x67
,
0x89
,
0xab
,
0xcd
,
0xef
},
{
0x23
,
0x8b
,
0x4f
,
0xe5
,
0x84
,
0x7e
,
0x44
,
0xb2
},
},
{
10
,
0
,
{
0x01
,
0x23
,
0x45
,
0x67
,
0x12
,
0x34
,
0x56
,
0x78
,
0x23
,
0x45
},
{
0x01
,
0x23
,
0x45
,
0x67
,
0x89
,
0xab
,
0xcd
,
0xef
},
{
0xeb
,
0x6a
,
0x71
,
0x1a
,
0x2c
,
0x02
,
0x27
,
0x1b
},
},
{
5
,
0
,
{
0x01
,
0x23
,
0x45
,
0x67
,
0x12
},
{
0x01
,
0x23
,
0x45
,
0x67
,
0x89
,
0xab
,
0xcd
,
0xef
},
{
0x7a
,
0xc8
,
0x16
,
0xd1
,
0x6e
,
0x9b
,
0x30
,
0x2e
},
}
};
struct
cast5_tv
cast5_dec_tv_template
[]
=
{
{
16
,
0
,
{
0x01
,
0x23
,
0x45
,
0x67
,
0x12
,
0x34
,
0x56
,
0x78
,
0x23
,
0x45
,
0x67
,
0x89
,
0x34
,
0x56
,
0x78
,
0x9A
},
{
0x23
,
0x8b
,
0x4f
,
0xe5
,
0x84
,
0x7e
,
0x44
,
0xb2
},
{
0x01
,
0x23
,
0x45
,
0x67
,
0x89
,
0xab
,
0xcd
,
0xef
},
},
{
10
,
0
,
{
0x01
,
0x23
,
0x45
,
0x67
,
0x12
,
0x34
,
0x56
,
0x78
,
0x23
,
0x45
},
{
0xeb
,
0x6a
,
0x71
,
0x1a
,
0x2c
,
0x02
,
0x27
,
0x1b
},
{
0x01
,
0x23
,
0x45
,
0x67
,
0x89
,
0xab
,
0xcd
,
0xef
},
},
{
5
,
0
,
{
0x01
,
0x23
,
0x45
,
0x67
,
0x12
},
{
0x7a
,
0xc8
,
0x16
,
0xd1
,
0x6e
,
0x9b
,
0x30
,
0x2e
},
{
0x01
,
0x23
,
0x45
,
0x67
,
0x89
,
0xab
,
0xcd
,
0xef
},
}
};
/*
/*
* Compression stuff.
* Compression stuff.
*/
*/
...
...
drivers/atm/lanai.c
View file @
293f3e3f
...
@@ -514,6 +514,16 @@ static inline void conf2_write(const struct lanai_dev *lanai)
...
@@ -514,6 +514,16 @@ static inline void conf2_write(const struct lanai_dev *lanai)
reg_write
(
lanai
,
lanai
->
conf2
,
Config2_Reg
);
reg_write
(
lanai
,
lanai
->
conf2
,
Config2_Reg
);
}
}
/* Same as conf2_write(), but defers I/O if we're powered down */
static
inline
void
conf2_write_if_powerup
(
const
struct
lanai_dev
*
lanai
)
{
#ifdef USE_POWERDOWN
if
(
unlikely
((
lanai
->
conf1
&
CONFIG1_POWERDOWN
)
!=
0
))
return
;
#endif
/* USE_POWERDOWN */
conf2_write
(
lanai
);
}
static
inline
void
reset_board
(
const
struct
lanai_dev
*
lanai
)
static
inline
void
reset_board
(
const
struct
lanai_dev
*
lanai
)
{
{
DPRINTK
(
"about to reset board
\n
"
);
DPRINTK
(
"about to reset board
\n
"
);
...
@@ -616,11 +626,12 @@ static int __init sram_test_word(
...
@@ -616,11 +626,12 @@ static int __init sram_test_word(
u32
readback
;
u32
readback
;
sram_write
(
lanai
,
pattern
,
offset
);
sram_write
(
lanai
,
pattern
,
offset
);
readback
=
sram_read
(
lanai
,
offset
);
readback
=
sram_read
(
lanai
,
offset
);
if
(
readback
==
pattern
)
if
(
likely
(
readback
==
pattern
)
)
return
0
;
return
0
;
printk
(
KERN_ERR
DEV_LABEL
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): SRAM word at %d bad: wrote 0x%X, read 0x%X
\n
"
,
"(itf %d): SRAM word at %d bad: wrote 0x%X, read 0x%X
\n
"
,
lanai
->
number
,
offset
,
pattern
,
readback
);
lanai
->
number
,
offset
,
(
unsigned
int
)
pattern
,
(
unsigned
int
)
readback
);
return
-
EIO
;
return
-
EIO
;
}
}
...
@@ -721,9 +732,9 @@ static inline void cardvcc_write(const struct lanai_vcc *lvcc,
...
@@ -721,9 +732,9 @@ static inline void cardvcc_write(const struct lanai_vcc *lvcc,
APRINTK
(
lvcc
->
vbase
!=
0
,
"cardvcc_write: unbound vcc!
\n
"
);
APRINTK
(
lvcc
->
vbase
!=
0
,
"cardvcc_write: unbound vcc!
\n
"
);
APRINTK
((
val
&
~
0xFFFF
)
==
0
,
APRINTK
((
val
&
~
0xFFFF
)
==
0
,
"cardvcc_write: bad val 0x%X (vci=%d, addr=0x%02X)
\n
"
,
"cardvcc_write: bad val 0x%X (vci=%d, addr=0x%02X)
\n
"
,
val
,
lvcc
->
vci
,
(
int
)
offset
);
(
unsigned
int
)
val
,
lvcc
->
vci
,
(
unsigned
int
)
offset
);
RWDEBUG
(
"VW vci=%04d 0x%02X > 0x%08X
\n
"
,
RWDEBUG
(
"VW vci=%04d 0x%02X > 0x%08X
\n
"
,
lvcc
->
vci
,
(
int
)
offset
,
val
);
lvcc
->
vci
,
(
unsigned
int
)
offset
,
(
unsigned
int
)
val
);
writel
(
val
,
lvcc
->
vbase
+
(
bus_addr_t
)
offset
);
writel
(
val
,
lvcc
->
vbase
+
(
bus_addr_t
)
offset
);
}
}
...
@@ -981,7 +992,8 @@ static int __init eeprom_read(struct lanai_dev *lanai)
...
@@ -981,7 +992,8 @@ static int __init eeprom_read(struct lanai_dev *lanai)
clock_l
();
udelay
(
5
);
clock_l
();
udelay
(
5
);
send_stop
();
send_stop
();
lanai
->
eeprom
[
address
]
=
data
;
lanai
->
eeprom
[
address
]
=
data
;
DPRINTK
(
"EEPROM 0x%04X %02X
\n
"
,
address
,
data
);
DPRINTK
(
"EEPROM 0x%04X %02X
\n
"
,
(
unsigned
int
)
address
,
(
unsigned
int
)
data
);
}
}
return
0
;
return
0
;
error:
error:
...
@@ -1032,14 +1044,14 @@ static int __init eeprom_validate(struct lanai_dev *lanai)
...
@@ -1032,14 +1044,14 @@ static int __init eeprom_validate(struct lanai_dev *lanai)
if
(
s
!=
e
[
EEPROM_CHECKSUM
])
{
if
(
s
!=
e
[
EEPROM_CHECKSUM
])
{
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): EEPROM checksum bad "
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): EEPROM checksum bad "
"(wanted 0x%02X, got 0x%02X)
\n
"
,
lanai
->
number
,
"(wanted 0x%02X, got 0x%02X)
\n
"
,
lanai
->
number
,
s
,
e
[
EEPROM_CHECKSUM
]);
(
unsigned
int
)
s
,
(
unsigned
int
)
e
[
EEPROM_CHECKSUM
]);
return
-
EIO
;
return
-
EIO
;
}
}
s
^=
0xFF
;
s
^=
0xFF
;
if
(
s
!=
e
[
EEPROM_CHECKSUM_REV
])
{
if
(
s
!=
e
[
EEPROM_CHECKSUM_REV
])
{
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): EEPROM inverse checksum "
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): EEPROM inverse checksum "
"bad (wanted 0x%02X, got 0x%02X)
\n
"
,
lanai
->
number
,
"bad (wanted 0x%02X, got 0x%02X)
\n
"
,
lanai
->
number
,
s
,
e
[
EEPROM_CHECKSUM_REV
]);
(
unsigned
int
)
s
,
(
unsigned
int
)
e
[
EEPROM_CHECKSUM_REV
]);
return
-
EIO
;
return
-
EIO
;
}
}
/* Verify MAC address */
/* Verify MAC address */
...
@@ -1048,7 +1060,8 @@ static int __init eeprom_validate(struct lanai_dev *lanai)
...
@@ -1048,7 +1060,8 @@ static int __init eeprom_validate(struct lanai_dev *lanai)
printk
(
KERN_ERR
DEV_LABEL
printk
(
KERN_ERR
DEV_LABEL
"(itf %d) : EEPROM MAC addresses don't match "
"(itf %d) : EEPROM MAC addresses don't match "
"(0x%02X, inverse 0x%02X)
\n
"
,
lanai
->
number
,
"(0x%02X, inverse 0x%02X)
\n
"
,
lanai
->
number
,
e
[
EEPROM_MAC
+
i
],
e
[
EEPROM_MAC_REV
+
i
]);
(
unsigned
int
)
e
[
EEPROM_MAC
+
i
],
(
unsigned
int
)
e
[
EEPROM_MAC_REV
+
i
]);
return
-
EIO
;
return
-
EIO
;
}
}
DPRINTK
(
"eeprom: MAC address = %02X:%02X:%02X:%02X:%02X:%02X
\n
"
,
DPRINTK
(
"eeprom: MAC address = %02X:%02X:%02X:%02X:%02X:%02X
\n
"
,
...
@@ -1060,10 +1073,10 @@ static int __init eeprom_validate(struct lanai_dev *lanai)
...
@@ -1060,10 +1073,10 @@ static int __init eeprom_validate(struct lanai_dev *lanai)
if
((
lanai
->
serialno
^
v
)
!=
0xFFFFFFFF
)
{
if
((
lanai
->
serialno
^
v
)
!=
0xFFFFFFFF
)
{
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): EEPROM serial numbers "
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): EEPROM serial numbers "
"don't match (0x%08X, inverse 0x%08X)
\n
"
,
lanai
->
number
,
"don't match (0x%08X, inverse 0x%08X)
\n
"
,
lanai
->
number
,
lanai
->
serialno
,
v
);
(
unsigned
int
)
lanai
->
serialno
,
(
unsigned
int
)
v
);
return
-
EIO
;
return
-
EIO
;
}
}
DPRINTK
(
"eeprom: Serial number = %d
\n
"
,
lanai
->
serialno
);
DPRINTK
(
"eeprom: Serial number = %d
\n
"
,
(
unsigned
int
)
lanai
->
serialno
);
/* Verify magic number */
/* Verify magic number */
lanai
->
magicno
=
eeprom_be4
(
lanai
,
EEPROM_MAGIC
);
lanai
->
magicno
=
eeprom_be4
(
lanai
,
EEPROM_MAGIC
);
v
=
eeprom_be4
(
lanai
,
EEPROM_MAGIC_REV
);
v
=
eeprom_be4
(
lanai
,
EEPROM_MAGIC_REV
);
...
@@ -1077,7 +1090,8 @@ static int __init eeprom_validate(struct lanai_dev *lanai)
...
@@ -1077,7 +1090,8 @@ static int __init eeprom_validate(struct lanai_dev *lanai)
if
(
lanai
->
magicno
!=
EEPROM_MAGIC_VALUE
)
if
(
lanai
->
magicno
!=
EEPROM_MAGIC_VALUE
)
printk
(
KERN_WARNING
DEV_LABEL
"(itf %d): warning - EEPROM "
printk
(
KERN_WARNING
DEV_LABEL
"(itf %d): warning - EEPROM "
"magic not what expected (got 0x%08X, not 0x%08X)
\n
"
,
"magic not what expected (got 0x%08X, not 0x%08X)
\n
"
,
lanai
->
number
,
lanai
->
magicno
,
EEPROM_MAGIC_VALUE
);
lanai
->
number
,
(
unsigned
int
)
lanai
->
magicno
,
(
unsigned
int
)
EEPROM_MAGIC_VALUE
);
return
0
;
return
0
;
}
}
...
@@ -1313,7 +1327,7 @@ static inline void lanai_endtx(const struct lanai_dev *lanai,
...
@@ -1313,7 +1327,7 @@ static inline void lanai_endtx(const struct lanai_dev *lanai,
* updating the register. Still, we should make sure
* updating the register. Still, we should make sure
*/
*/
for
(
i
=
0
;
reg_read
(
lanai
,
Status_Reg
)
&
STATUS_BUTTBUSY
;
i
++
)
{
for
(
i
=
0
;
reg_read
(
lanai
,
Status_Reg
)
&
STATUS_BUTTBUSY
;
i
++
)
{
if
(
i
>
50
)
{
if
(
unlikely
(
i
>
50
)
)
{
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): butt register "
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): butt register "
"always busy!
\n
"
,
lanai
->
number
);
"always busy!
\n
"
,
lanai
->
number
);
break
;
break
;
...
@@ -1508,13 +1522,14 @@ static void vcc_rx_aal5(struct lanai_vcc *lvcc, int endptr)
...
@@ -1508,13 +1522,14 @@ static void vcc_rx_aal5(struct lanai_vcc *lvcc, int endptr)
if
(
n
<
0
)
if
(
n
<
0
)
n
+=
lanai_buf_size
(
&
lvcc
->
rx
.
buf
);
n
+=
lanai_buf_size
(
&
lvcc
->
rx
.
buf
);
APRINTK
(
n
>=
0
&&
n
<
lanai_buf_size
(
&
lvcc
->
rx
.
buf
)
&&
!
(
n
&
15
),
APRINTK
(
n
>=
0
&&
n
<
lanai_buf_size
(
&
lvcc
->
rx
.
buf
)
&&
!
(
n
&
15
),
"vcc_rx_aal5: n out of range (%d/%
d
)
\n
"
,
"vcc_rx_aal5: n out of range (%d/%
Zu
)
\n
"
,
n
,
lanai_buf_size
(
&
lvcc
->
rx
.
buf
));
n
,
lanai_buf_size
(
&
lvcc
->
rx
.
buf
));
/* Recover the second-to-last word to get true pdu length */
/* Recover the second-to-last word to get true pdu length */
if
((
x
=
&
end
[
-
2
])
<
lvcc
->
rx
.
buf
.
start
)
if
((
x
=
&
end
[
-
2
])
<
lvcc
->
rx
.
buf
.
start
)
x
=
&
lvcc
->
rx
.
buf
.
end
[
-
2
];
x
=
&
lvcc
->
rx
.
buf
.
end
[
-
2
];
size
=
be32_to_cpup
(
x
)
&
0xffff
;
size
=
be32_to_cpup
(
x
)
&
0xffff
;
if
(
n
!=
aal5_size
(
size
))
{
/* Make sure size matches padding */
if
(
unlikely
(
n
!=
aal5_size
(
size
)))
{
/* Make sure size matches padding */
printk
(
KERN_INFO
DEV_LABEL
"(itf %d): Got bad AAL5 length "
printk
(
KERN_INFO
DEV_LABEL
"(itf %d): Got bad AAL5 length "
"on vci=%d - size=%d n=%d
\n
"
,
"on vci=%d - size=%d n=%d
\n
"
,
lvcc
->
rx
.
atmvcc
->
dev
->
number
,
lvcc
->
vci
,
size
,
n
);
lvcc
->
rx
.
atmvcc
->
dev
->
number
,
lvcc
->
vci
,
size
,
n
);
...
@@ -1522,7 +1537,7 @@ static void vcc_rx_aal5(struct lanai_vcc *lvcc, int endptr)
...
@@ -1522,7 +1537,7 @@ static void vcc_rx_aal5(struct lanai_vcc *lvcc, int endptr)
goto
out
;
goto
out
;
}
}
skb
=
atm_alloc_charge
(
lvcc
->
rx
.
atmvcc
,
size
,
GFP_ATOMIC
);
skb
=
atm_alloc_charge
(
lvcc
->
rx
.
atmvcc
,
size
,
GFP_ATOMIC
);
if
(
skb
==
NULL
)
{
if
(
unlikely
(
skb
==
NULL
)
)
{
lvcc
->
stats
.
rx_nomem
++
;
lvcc
->
stats
.
rx_nomem
++
;
goto
out
;
goto
out
;
}
}
...
@@ -1563,7 +1578,7 @@ static int __init vcc_table_allocate(struct lanai_dev *lanai)
...
@@ -1563,7 +1578,7 @@ static int __init vcc_table_allocate(struct lanai_dev *lanai)
#else
#else
int
bytes
=
(
lanai
->
num_vci
)
*
sizeof
(
struct
lanai_vcc
*
);
int
bytes
=
(
lanai
->
num_vci
)
*
sizeof
(
struct
lanai_vcc
*
);
lanai
->
vccs
=
(
struct
lanai_vcc
**
)
vmalloc
(
bytes
);
lanai
->
vccs
=
(
struct
lanai_vcc
**
)
vmalloc
(
bytes
);
if
(
lanai
->
vccs
==
NULL
)
if
(
unlikely
(
lanai
->
vccs
==
NULL
)
)
return
-
ENOMEM
;
return
-
ENOMEM
;
memset
(
lanai
->
vccs
,
0
,
bytes
);
memset
(
lanai
->
vccs
,
0
,
bytes
);
return
0
;
return
0
;
...
@@ -1584,7 +1599,7 @@ static inline struct lanai_vcc *new_lanai_vcc(void)
...
@@ -1584,7 +1599,7 @@ static inline struct lanai_vcc *new_lanai_vcc(void)
{
{
struct
lanai_vcc
*
lvcc
;
struct
lanai_vcc
*
lvcc
;
lvcc
=
(
struct
lanai_vcc
*
)
kmalloc
(
sizeof
(
*
lvcc
),
GFP_KERNEL
);
lvcc
=
(
struct
lanai_vcc
*
)
kmalloc
(
sizeof
(
*
lvcc
),
GFP_KERNEL
);
if
(
l
vcc
!=
NULL
)
{
if
(
l
ikely
(
lvcc
!=
NULL
)
)
{
lvcc
->
vbase
=
0
;
lvcc
->
vbase
=
0
;
lvcc
->
rx
.
atmvcc
=
lvcc
->
tx
.
atmvcc
=
NULL
;
lvcc
->
rx
.
atmvcc
=
lvcc
->
tx
.
atmvcc
=
NULL
;
lvcc
->
nref
=
0
;
lvcc
->
nref
=
0
;
...
@@ -1605,18 +1620,18 @@ static int lanai_get_sized_buffer(struct lanai_dev *lanai,
...
@@ -1605,18 +1620,18 @@ static int lanai_get_sized_buffer(struct lanai_dev *lanai,
int
min
,
const
char
*
name
)
int
min
,
const
char
*
name
)
{
{
int
size
;
int
size
;
if
(
max_sdu
<
1
)
if
(
unlikely
(
max_sdu
<
1
)
)
max_sdu
=
1
;
max_sdu
=
1
;
max_sdu
=
aal5_size
(
max_sdu
);
max_sdu
=
aal5_size
(
max_sdu
);
size
=
(
max_sdu
+
16
)
*
multiplier
+
16
;
size
=
(
max_sdu
+
16
)
*
multiplier
+
16
;
lanai_buf_allocate
(
buf
,
size
,
min
,
lanai
->
pci
);
lanai_buf_allocate
(
buf
,
size
,
min
,
lanai
->
pci
);
if
(
buf
->
start
==
NULL
)
if
(
unlikely
(
buf
->
start
==
NULL
)
)
return
-
ENOMEM
;
return
-
ENOMEM
;
if
(
lanai_buf_size
(
buf
)
<
size
)
if
(
unlikely
(
lanai_buf_size
(
buf
)
<
size
)
)
printk
(
KERN_WARNING
DEV_LABEL
"(itf %d): wanted %d bytes "
printk
(
KERN_WARNING
DEV_LABEL
"(itf %d): wanted %d bytes "
"for %s buffer, got only %
d
\n
"
,
lanai
->
number
,
size
,
nam
e
,
"for %s buffer, got only %
Zu
\n
"
,
lanai
->
number
,
siz
e
,
lanai_buf_size
(
buf
));
name
,
lanai_buf_size
(
buf
));
DPRINTK
(
"Allocated %
d
byte %s buffer
\n
"
,
lanai_buf_size
(
buf
),
name
);
DPRINTK
(
"Allocated %
Zu
byte %s buffer
\n
"
,
lanai_buf_size
(
buf
),
name
);
return
0
;
return
0
;
}
}
...
@@ -1706,9 +1721,9 @@ static int __init service_buffer_allocate(struct lanai_dev *lanai)
...
@@ -1706,9 +1721,9 @@ static int __init service_buffer_allocate(struct lanai_dev *lanai)
{
{
lanai_buf_allocate
(
&
lanai
->
service
,
SERVICE_ENTRIES
*
4
,
8
,
lanai_buf_allocate
(
&
lanai
->
service
,
SERVICE_ENTRIES
*
4
,
8
,
lanai
->
pci
);
lanai
->
pci
);
if
(
lanai
->
service
.
start
==
NULL
)
if
(
unlikely
(
lanai
->
service
.
start
==
NULL
)
)
return
-
ENOMEM
;
return
-
ENOMEM
;
DPRINTK
(
"allocated service buffer at 0x%08lX, size %
d
(%d)
\n
"
,
DPRINTK
(
"allocated service buffer at 0x%08lX, size %
Zu
(%d)
\n
"
,
(
unsigned
long
)
lanai
->
service
.
start
,
(
unsigned
long
)
lanai
->
service
.
start
,
lanai_buf_size
(
&
lanai
->
service
),
lanai_buf_size
(
&
lanai
->
service
),
lanai_buf_size_cardorder
(
&
lanai
->
service
));
lanai_buf_size_cardorder
(
&
lanai
->
service
));
...
@@ -1746,10 +1761,10 @@ static int handle_service(struct lanai_dev *lanai, u32 s)
...
@@ -1746,10 +1761,10 @@ static int handle_service(struct lanai_dev *lanai, u32 s)
struct
lanai_vcc
*
lvcc
;
struct
lanai_vcc
*
lvcc
;
vcclist_read_lock
();
vcclist_read_lock
();
lvcc
=
lanai
->
vccs
[
vci
];
lvcc
=
lanai
->
vccs
[
vci
];
if
(
lvcc
==
NULL
)
{
if
(
unlikely
(
lvcc
==
NULL
)
)
{
vcclist_read_unlock
();
vcclist_read_unlock
();
DPRINTK
(
"(itf %d) got service entry 0x%X for nonexistent "
DPRINTK
(
"(itf %d) got service entry 0x%X for nonexistent "
"vcc %d
\n
"
,
lanai
->
number
,
s
,
vci
);
"vcc %d
\n
"
,
lanai
->
number
,
(
unsigned
int
)
s
,
vci
);
if
(
s
&
SERVICE_TX
)
if
(
s
&
SERVICE_TX
)
lanai
->
stats
.
service_novcc_tx
++
;
lanai
->
stats
.
service_novcc_tx
++
;
else
else
...
@@ -1757,10 +1772,10 @@ static int handle_service(struct lanai_dev *lanai, u32 s)
...
@@ -1757,10 +1772,10 @@ static int handle_service(struct lanai_dev *lanai, u32 s)
return
0
;
return
0
;
}
}
if
(
s
&
SERVICE_TX
)
{
/* segmentation interrupt */
if
(
s
&
SERVICE_TX
)
{
/* segmentation interrupt */
if
(
lvcc
->
tx
.
atmvcc
==
NULL
)
{
if
(
unlikely
(
lvcc
->
tx
.
atmvcc
==
NULL
)
)
{
vcclist_read_unlock
();
vcclist_read_unlock
();
DPRINTK
(
"(itf %d) got service entry 0x%X for non-TX "
DPRINTK
(
"(itf %d) got service entry 0x%X for non-TX "
"vcc %d
\n
"
,
lanai
->
number
,
s
,
vci
);
"vcc %d
\n
"
,
lanai
->
number
,
(
unsigned
int
)
s
,
vci
);
lanai
->
stats
.
service_notx
++
;
lanai
->
stats
.
service_notx
++
;
return
0
;
return
0
;
}
}
...
@@ -1769,22 +1784,22 @@ static int handle_service(struct lanai_dev *lanai, u32 s)
...
@@ -1769,22 +1784,22 @@ static int handle_service(struct lanai_dev *lanai, u32 s)
vcclist_read_unlock
();
vcclist_read_unlock
();
return
1
;
return
1
;
}
}
if
(
lvcc
->
rx
.
atmvcc
==
NULL
)
{
if
(
unlikely
(
lvcc
->
rx
.
atmvcc
==
NULL
)
)
{
vcclist_read_unlock
();
vcclist_read_unlock
();
DPRINTK
(
"(itf %d) got service entry 0x%X for non-RX "
DPRINTK
(
"(itf %d) got service entry 0x%X for non-RX "
"vcc %d
\n
"
,
lanai
->
number
,
s
,
vci
);
"vcc %d
\n
"
,
lanai
->
number
,
(
unsigned
int
)
s
,
vci
);
lanai
->
stats
.
service_norx
++
;
lanai
->
stats
.
service_norx
++
;
return
0
;
return
0
;
}
}
if
(
lvcc
->
rx
.
atmvcc
->
qos
.
aal
!=
ATM_AAL5
)
{
if
(
unlikely
(
lvcc
->
rx
.
atmvcc
->
qos
.
aal
!=
ATM_AAL5
)
)
{
vcclist_read_unlock
();
vcclist_read_unlock
();
DPRINTK
(
"(itf %d) got RX service entry 0x%X for non-AAL5 "
DPRINTK
(
"(itf %d) got RX service entry 0x%X for non-AAL5 "
"vcc %d
\n
"
,
lanai
->
number
,
s
,
vci
);
"vcc %d
\n
"
,
lanai
->
number
,
(
unsigned
int
)
s
,
vci
);
lanai
->
stats
.
service_rxnotaal5
++
;
lanai
->
stats
.
service_rxnotaal5
++
;
atomic_inc
(
&
lvcc
->
rx
.
atmvcc
->
stats
->
rx_err
);
atomic_inc
(
&
lvcc
->
rx
.
atmvcc
->
stats
->
rx_err
);
return
0
;
return
0
;
}
}
if
(
(
s
&
(
SERVICE_TRASH
|
SERVICE_STREAM
|
SERVICE_CRCERR
))
==
0
)
{
if
(
likely
(
!
(
s
&
(
SERVICE_TRASH
|
SERVICE_STREAM
|
SERVICE_CRCERR
)))
)
{
vcc_rx_aal5
(
lvcc
,
SERVICE_GET_END
(
s
));
vcc_rx_aal5
(
lvcc
,
SERVICE_GET_END
(
s
));
vcclist_read_unlock
();
vcclist_read_unlock
();
return
0
;
return
0
;
...
@@ -1917,6 +1932,9 @@ static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason)
...
@@ -1917,6 +1932,9 @@ static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason)
ack
|=
reason
&
(
INT_AAL0_STR
|
INT_AAL0
);
ack
|=
reason
&
(
INT_AAL0_STR
|
INT_AAL0
);
vcc_rx_aal0
(
lanai
);
vcc_rx_aal0
(
lanai
);
}
}
/* The rest of the interrupts are pretty rare */
if
(
ack
==
reason
)
goto
done
;
if
(
reason
&
INT_STATS
)
{
if
(
reason
&
INT_STATS
)
{
reason
&=
~
INT_STATS
;
/* No need to ack */
reason
&=
~
INT_STATS
;
/* No need to ack */
get_statistics
(
lanai
);
get_statistics
(
lanai
);
...
@@ -1925,11 +1943,11 @@ static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason)
...
@@ -1925,11 +1943,11 @@ static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason)
ack
|=
reason
&
INT_STATUS
;
ack
|=
reason
&
INT_STATUS
;
lanai_check_status
(
lanai
);
lanai_check_status
(
lanai
);
}
}
if
(
reason
&
INT_DMASHUT
)
{
if
(
unlikely
(
reason
&
INT_DMASHUT
)
)
{
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): driver error - DMA "
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): driver error - DMA "
"shutdown, reason=0x%08X, address=0x%08X
\n
"
,
"shutdown, reason=0x%08X, address=0x%08X
\n
"
,
lanai
->
number
,
reason
&
INT_DMASHUT
,
lanai
->
number
,
(
unsigned
int
)
(
reason
&
INT_DMASHUT
)
,
reg_read
(
lanai
,
DMA_Addr_Reg
));
(
unsigned
int
)
reg_read
(
lanai
,
DMA_Addr_Reg
));
if
(
reason
&
INT_TABORTBM
)
{
if
(
reason
&
INT_TABORTBM
)
{
lanai_reset
(
lanai
);
lanai_reset
(
lanai
);
return
;
return
;
...
@@ -1941,32 +1959,35 @@ static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason)
...
@@ -1941,32 +1959,35 @@ static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason)
lanai
->
stats
.
dma_reenable
++
;
lanai
->
stats
.
dma_reenable
++
;
pcistatus_check
(
lanai
,
0
);
pcistatus_check
(
lanai
,
0
);
}
}
if
(
reason
&
INT_TABORTSENT
)
{
if
(
unlikely
(
reason
&
INT_TABORTSENT
)
)
{
ack
|=
(
reason
&
INT_TABORTSENT
);
ack
|=
(
reason
&
INT_TABORTSENT
);
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): sent PCI target abort
\n
"
,
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): sent PCI target abort
\n
"
,
lanai
->
number
);
lanai
->
number
);
pcistatus_check
(
lanai
,
0
);
pcistatus_check
(
lanai
,
0
);
}
}
if
(
reason
&
INT_SEGSHUT
)
{
if
(
unlikely
(
reason
&
INT_SEGSHUT
)
)
{
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): driver error - "
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): driver error - "
"segmentation shutdown, reason=0x%08X
\n
"
,
lanai
->
number
,
"segmentation shutdown, reason=0x%08X
\n
"
,
lanai
->
number
,
reason
&
INT_SEGSHUT
);
(
unsigned
int
)
(
reason
&
INT_SEGSHUT
)
);
lanai_reset
(
lanai
);
lanai_reset
(
lanai
);
return
;
return
;
}
}
if
(
reason
&
(
INT_PING
|
INT_WAKE
))
{
if
(
unlikely
(
reason
&
(
INT_PING
|
INT_WAKE
)
))
{
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): driver error - "
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): driver error - "
"unexpected interrupt 0x%08X, resetting
\n
"
,
"unexpected interrupt 0x%08X, resetting
\n
"
,
lanai
->
number
,
reason
&
(
INT_PING
|
INT_WAKE
));
lanai
->
number
,
(
unsigned
int
)
(
reason
&
(
INT_PING
|
INT_WAKE
)));
lanai_reset
(
lanai
);
lanai_reset
(
lanai
);
return
;
return
;
}
}
#ifdef DEBUG
#ifdef DEBUG
if
(
ack
!=
reason
)
{
if
(
unlikely
(
ack
!=
reason
))
{
DPRINTK
(
"unacked ints: 0x%08X
\n
"
,
reason
&
~
ack
);
DPRINTK
(
"unacked ints: 0x%08X
\n
"
,
(
unsigned
int
)
(
reason
&
~
ack
));
ack
=
reason
;
ack
=
reason
;
}
}
#endif
#endif
done:
if
(
ack
!=
0
)
if
(
ack
!=
0
)
reg_write
(
lanai
,
ack
,
IntAck_Reg
);
reg_write
(
lanai
,
ack
,
IntAck_Reg
);
}
}
...
@@ -1975,24 +1996,31 @@ static irqreturn_t lanai_int(int irq, void *devid, struct pt_regs *regs)
...
@@ -1975,24 +1996,31 @@ static irqreturn_t lanai_int(int irq, void *devid, struct pt_regs *regs)
{
{
struct
lanai_dev
*
lanai
=
(
struct
lanai_dev
*
)
devid
;
struct
lanai_dev
*
lanai
=
(
struct
lanai_dev
*
)
devid
;
u32
reason
;
u32
reason
;
int
handled
=
0
;
(
void
)
irq
;
(
void
)
regs
;
/* unused variables */
(
void
)
irq
;
(
void
)
regs
;
/* unused variables */
#ifdef USE_POWERDOWN
#ifdef USE_POWERDOWN
if
(
lanai
->
conf1
&
CONFIG1_POWERDOWN
)
{
/*
lanai
->
conf1
&=
~
CONFIG1_POWERDOWN
;
* If we're powered down we shouldn't be generating any interrupts -
conf1_write
(
lanai
);
* so assume that this is a shared interrupt line and it's for someone
printk
(
KERN_WARNING
DEV_LABEL
"(itf %d): Got interrupt "
* else
"0x%08X while in POWERDOWN, powering up
\n
"
,
lanai
->
conf1
,
*/
intr_pending
(
lanai
));
if
(
unlikely
(
lanai
->
conf1
&
CONFIG1_POWERDOWN
))
conf2_write
(
lanai
);
return
IRQ_NONE
;
}
#endif
#endif
while
((
reason
=
intr_pending
(
lanai
))
!=
0
)
{
handled
=
1
;
reason
=
intr_pending
(
lanai
);
if
(
reason
==
0
)
return
IRQ_NONE
;
/* Must be for someone else */
do
{
if
(
unlikely
(
reason
==
0xFFFFFFFF
))
break
;
/* Maybe we've been unplugged? */
lanai_int_1
(
lanai
,
reason
);
lanai_int_1
(
lanai
,
reason
);
}
reason
=
intr_pending
(
lanai
);
return
IRQ_RETVAL
(
handled
);
}
while
(
reason
!=
0
);
return
IRQ_HANDLED
;
}
}
/* TODO - it would be nice if we could use the "delayed interrupt" system
/* TODO - it would be nice if we could use the "delayed interrupt" system
...
@@ -2009,10 +2037,11 @@ static irqreturn_t lanai_int(int irq, void *devid, struct pt_regs *regs)
...
@@ -2009,10 +2037,11 @@ static irqreturn_t lanai_int(int irq, void *devid, struct pt_regs *regs)
static
int
check_board_id_and_rev
(
const
char
*
name
,
u32
val
,
int
*
revp
)
static
int
check_board_id_and_rev
(
const
char
*
name
,
u32
val
,
int
*
revp
)
{
{
DPRINTK
(
"%s says board_id=%d, board_rev=%d
\n
"
,
name
,
DPRINTK
(
"%s says board_id=%d, board_rev=%d
\n
"
,
name
,
RESET_GET_BOARD_ID
(
val
),
RESET_GET_BOARD_REV
(
val
));
(
int
)
RESET_GET_BOARD_ID
(
val
),
(
int
)
RESET_GET_BOARD_REV
(
val
));
if
(
RESET_GET_BOARD_ID
(
val
)
!=
BOARD_ID_LANAI256
)
{
if
(
RESET_GET_BOARD_ID
(
val
)
!=
BOARD_ID_LANAI256
)
{
printk
(
KERN_ERR
DEV_LABEL
": Found %s board-id %d -- not a "
printk
(
KERN_ERR
DEV_LABEL
": Found %s board-id %d -- not a "
"Lanai 25.6
\n
"
,
name
,
RESET_GET_BOARD_ID
(
val
));
"Lanai 25.6
\n
"
,
name
,
(
int
)
RESET_GET_BOARD_ID
(
val
));
return
-
ENODEV
;
return
-
ENODEV
;
}
}
if
(
revp
!=
NULL
)
if
(
revp
!=
NULL
)
...
@@ -2058,7 +2087,8 @@ static int __init lanai_pci_start(struct lanai_dev *lanai)
...
@@ -2058,7 +2087,8 @@ static int __init lanai_pci_start(struct lanai_dev *lanai)
"PCI_SUBSYSTEM_ID: %d
\n
"
,
lanai
->
number
,
result
);
"PCI_SUBSYSTEM_ID: %d
\n
"
,
lanai
->
number
,
result
);
return
-
EINVAL
;
return
-
EINVAL
;
}
}
if
((
result
=
check_board_id_and_rev
(
"PCI"
,
w
,
NULL
))
!=
0
)
result
=
check_board_id_and_rev
(
"PCI"
,
w
,
NULL
);
if
(
result
!=
0
)
return
result
;
return
result
;
/* Set latency timer to zero as per lanai docs */
/* Set latency timer to zero as per lanai docs */
result
=
pci_write_config_byte
(
pci
,
PCI_LATENCY_TIMER
,
0
);
result
=
pci_write_config_byte
(
pci
,
PCI_LATENCY_TIMER
,
0
);
...
@@ -2089,10 +2119,7 @@ static inline int vci0_is_ok(struct lanai_dev *lanai,
...
@@ -2089,10 +2119,7 @@ static inline int vci0_is_ok(struct lanai_dev *lanai,
if
(
lanai
->
naal0
!=
0
)
if
(
lanai
->
naal0
!=
0
)
return
0
;
return
0
;
lanai
->
conf2
|=
CONFIG2_VCI0_NORMAL
;
lanai
->
conf2
|=
CONFIG2_VCI0_NORMAL
;
#ifdef USE_POWERDOWN
conf2_write_if_powerup
(
lanai
);
if
((
lanai
->
conf1
&
CONFIG1_POWERDOWN
)
==
0
)
#endif
conf2_write
(
lanai
);
}
}
return
1
;
return
1
;
}
}
...
@@ -2107,7 +2134,7 @@ static int vci_is_ok(struct lanai_dev *lanai, vci_t vci,
...
@@ -2107,7 +2134,7 @@ static int vci_is_ok(struct lanai_dev *lanai, vci_t vci,
const
struct
lanai_vcc
*
lvcc
=
lanai
->
vccs
[
vci
];
const
struct
lanai_vcc
*
lvcc
=
lanai
->
vccs
[
vci
];
if
(
vci
==
0
&&
!
vci0_is_ok
(
lanai
,
qos
))
if
(
vci
==
0
&&
!
vci0_is_ok
(
lanai
,
qos
))
return
0
;
return
0
;
if
(
lvcc
!=
NULL
)
{
if
(
unlikely
(
lvcc
!=
NULL
)
)
{
if
(
qos
->
rxtp
.
traffic_class
!=
ATM_NONE
&&
if
(
qos
->
rxtp
.
traffic_class
!=
ATM_NONE
&&
lvcc
->
rx
.
atmvcc
!=
NULL
&&
lvcc
->
rx
.
atmvcc
!=
atmvcc
)
lvcc
->
rx
.
atmvcc
!=
NULL
&&
lvcc
->
rx
.
atmvcc
!=
atmvcc
)
return
0
;
return
0
;
...
@@ -2124,10 +2151,7 @@ static int vci_is_ok(struct lanai_dev *lanai, vci_t vci,
...
@@ -2124,10 +2151,7 @@ static int vci_is_ok(struct lanai_dev *lanai, vci_t vci,
if
(
vci0
!=
NULL
&&
vci0
->
rx
.
atmvcc
!=
NULL
)
if
(
vci0
!=
NULL
&&
vci0
->
rx
.
atmvcc
!=
NULL
)
return
0
;
return
0
;
lanai
->
conf2
&=
~
CONFIG2_VCI0_NORMAL
;
lanai
->
conf2
&=
~
CONFIG2_VCI0_NORMAL
;
#ifdef USE_POWERDOWN
conf2_write_if_powerup
(
lanai
);
if
((
lanai
->
conf1
&
CONFIG1_POWERDOWN
)
==
0
)
#endif
conf2_write
(
lanai
);
}
}
return
1
;
return
1
;
}
}
...
@@ -2332,15 +2356,16 @@ static int __init lanai_dev_open(struct atm_dev *atmdev)
...
@@ -2332,15 +2356,16 @@ static int __init lanai_dev_open(struct atm_dev *atmdev)
#endif
#endif
memcpy
(
atmdev
->
esi
,
eeprom_mac
(
lanai
),
ESI_LEN
);
memcpy
(
atmdev
->
esi
,
eeprom_mac
(
lanai
),
ESI_LEN
);
lanai_timed_poll_start
(
lanai
);
lanai_timed_poll_start
(
lanai
);
printk
(
KERN_NOTICE
DEV_LABEL
"(itf %d): rev.%d, base=0x%lx, irq=%
d
"
printk
(
KERN_NOTICE
DEV_LABEL
"(itf %d): rev.%d, base=0x%lx, irq=%
u
"
"(%02X-%02X-%02X-%02X-%02X-%02X)
\n
"
,
lanai
->
number
,
"(%02X-%02X-%02X-%02X-%02X-%02X)
\n
"
,
lanai
->
number
,
lanai
->
pci_revision
,
(
long
)
lanai
->
base
,
lanai
->
pci
->
irq
,
(
int
)
lanai
->
pci_revision
,
(
unsigned
long
)
lanai
->
base
,
lanai
->
pci
->
irq
,
atmdev
->
esi
[
0
],
atmdev
->
esi
[
1
],
atmdev
->
esi
[
2
],
atmdev
->
esi
[
0
],
atmdev
->
esi
[
1
],
atmdev
->
esi
[
2
],
atmdev
->
esi
[
3
],
atmdev
->
esi
[
4
],
atmdev
->
esi
[
5
]);
atmdev
->
esi
[
3
],
atmdev
->
esi
[
4
],
atmdev
->
esi
[
5
]);
printk
(
KERN_NOTICE
DEV_LABEL
"(itf %d): LANAI%s, serialno=%
d
(0x%X), "
printk
(
KERN_NOTICE
DEV_LABEL
"(itf %d): LANAI%s, serialno=%
u
(0x%X), "
"board_rev=%d
\n
"
,
lanai
->
number
,
"board_rev=%d
\n
"
,
lanai
->
number
,
lanai
->
type
==
lanai2
?
"2"
:
"HB"
,
lanai
->
serialno
,
lanai
->
type
==
lanai2
?
"2"
:
"HB"
,
(
unsigned
int
)
lanai
->
serialno
,
lanai
->
serialno
,
lanai
->
board_rev
);
(
unsigned
int
)
lanai
->
serialno
,
lanai
->
board_rev
);
return
0
;
return
0
;
error_vcctable:
error_vcctable:
...
@@ -2435,7 +2460,8 @@ static int lanai_open(struct atm_vcc *atmvcc, short vpi, int vci)
...
@@ -2435,7 +2460,8 @@ static int lanai_open(struct atm_vcc *atmvcc, short vpi, int vci)
(
vpi
==
ATM_VPI_UNSPEC
)
||
(
vci
==
ATM_VCI_UNSPEC
))
(
vpi
==
ATM_VPI_UNSPEC
)
||
(
vci
==
ATM_VCI_UNSPEC
))
return
-
EINVAL
;
return
-
EINVAL
;
lanai
=
(
struct
lanai_dev
*
)
atmvcc
->
dev
->
dev_data
;
lanai
=
(
struct
lanai_dev
*
)
atmvcc
->
dev
->
dev_data
;
if
((
result
=
lanai_normalize_ci
(
lanai
,
atmvcc
,
&
vpi
,
&
vci
))
!=
0
)
result
=
lanai_normalize_ci
(
lanai
,
atmvcc
,
&
vpi
,
&
vci
);
if
(
unlikely
(
result
!=
0
))
goto
out
;
goto
out
;
atmvcc
->
vpi
=
vpi
;
atmvcc
->
vpi
=
vpi
;
atmvcc
->
vci
=
vci
;
atmvcc
->
vci
=
vci
;
...
@@ -2444,14 +2470,18 @@ static int lanai_open(struct atm_vcc *atmvcc, short vpi, int vci)
...
@@ -2444,14 +2470,18 @@ static int lanai_open(struct atm_vcc *atmvcc, short vpi, int vci)
if
(
atmvcc
->
qos
.
aal
!=
ATM_AAL0
&&
atmvcc
->
qos
.
aal
!=
ATM_AAL5
)
if
(
atmvcc
->
qos
.
aal
!=
ATM_AAL0
&&
atmvcc
->
qos
.
aal
!=
ATM_AAL5
)
return
-
EINVAL
;
return
-
EINVAL
;
#if 0
#if 0
DPRINTK(DEV_LABEL "(itf %d): open %d.%d flags=0x%X\n",
DPRINTK(DEV_LABEL "(itf %d): open %d.%d flags=0x%
l
X\n",
lanai->number, vpi, vci, (unsigned long) atmvcc->flags);
lanai->number,
(int)
vpi, vci, (unsigned long) atmvcc->flags);
#else
#else
DPRINTK
(
DEV_LABEL
"(itf %d): open %d.%d
\n
"
,
lanai
->
number
,
vpi
,
vci
);
DPRINTK
(
DEV_LABEL
"(itf %d): open %d.%d
\n
"
,
lanai
->
number
,
(
int
)
vpi
,
vci
);
#endif
#endif
if
(
lvcc
==
NULL
&&
(
lvcc
=
new_lanai_vcc
())
==
NULL
)
if
(
lvcc
==
NULL
)
{
return
-
ENOMEM
;
lvcc
=
new_lanai_vcc
();
atmvcc
->
dev_data
=
lvcc
;
if
(
unlikely
(
lvcc
==
NULL
))
return
-
ENOMEM
;
atmvcc
->
dev_data
=
lvcc
;
}
lvcc
->
nref
++
;
lvcc
->
nref
++
;
if
(
atmvcc
->
qos
.
rxtp
.
traffic_class
!=
ATM_NONE
)
{
if
(
atmvcc
->
qos
.
rxtp
.
traffic_class
!=
ATM_NONE
)
{
APRINTK
(
lvcc
->
rx
.
atmvcc
==
NULL
,
"rx.atmvcc!=NULL, vci=%d
\n
"
,
APRINTK
(
lvcc
->
rx
.
atmvcc
==
NULL
,
"rx.atmvcc!=NULL, vci=%d
\n
"
,
...
@@ -2462,7 +2492,7 @@ static int lanai_open(struct atm_vcc *atmvcc, short vpi, int vci)
...
@@ -2462,7 +2492,7 @@ static int lanai_open(struct atm_vcc *atmvcc, short vpi, int vci)
}
else
}
else
result
=
lanai_setup_rx_vci_aal5
(
result
=
lanai_setup_rx_vci_aal5
(
lanai
,
lvcc
,
&
atmvcc
->
qos
);
lanai
,
lvcc
,
&
atmvcc
->
qos
);
if
(
result
!=
0
)
if
(
unlikely
(
result
!=
0
)
)
goto
out_free
;
goto
out_free
;
lvcc
->
rx
.
atmvcc
=
atmvcc
;
lvcc
->
rx
.
atmvcc
=
atmvcc
;
lvcc
->
stats
.
rx_nomem
=
0
;
lvcc
->
stats
.
rx_nomem
=
0
;
...
@@ -2477,7 +2507,7 @@ static int lanai_open(struct atm_vcc *atmvcc, short vpi, int vci)
...
@@ -2477,7 +2507,7 @@ static int lanai_open(struct atm_vcc *atmvcc, short vpi, int vci)
APRINTK
(
lvcc
->
tx
.
atmvcc
==
NULL
,
"tx.atmvcc!=NULL, vci=%d
\n
"
,
APRINTK
(
lvcc
->
tx
.
atmvcc
==
NULL
,
"tx.atmvcc!=NULL, vci=%d
\n
"
,
vci
);
vci
);
result
=
lanai_setup_tx_vci
(
lanai
,
lvcc
,
&
atmvcc
->
qos
);
result
=
lanai_setup_tx_vci
(
lanai
,
lvcc
,
&
atmvcc
->
qos
);
if
(
result
!=
0
)
if
(
unlikely
(
result
!=
0
)
)
goto
out_free
;
goto
out_free
;
lvcc
->
tx
.
atmvcc
=
atmvcc
;
lvcc
->
tx
.
atmvcc
=
atmvcc
;
if
(
atmvcc
->
qos
.
txtp
.
traffic_class
==
ATM_CBR
)
{
if
(
atmvcc
->
qos
.
txtp
.
traffic_class
==
ATM_CBR
)
{
...
@@ -2526,13 +2556,13 @@ static int lanai_ioctl(struct atm_dev *atmdev, unsigned int cmd, void *arg)
...
@@ -2526,13 +2556,13 @@ static int lanai_ioctl(struct atm_dev *atmdev, unsigned int cmd, void *arg)
get_statistics(lanai);
get_statistics(lanai);
return 0;
return 0;
case 2200003: {
case 2200003: {
int i;
unsigned
int i;
for (i = 0; i <= 0x5C ; i += 4) {
for (i = 0; i <= 0x5C ; i += 4) {
if (i==0x48) /* Write-only butt reg */
if (i==0x48) /* Write-only butt reg */
continue;
continue;
printk(KERN_CRIT DEV_LABEL " 0x%02X: "
printk(KERN_CRIT DEV_LABEL " 0x%02X: "
"0x%08X\n", i,
"0x%08X\n", i,
(u
32
) readl(lanai->base + i));
(u
nsigned int
) readl(lanai->base + i));
barrier(); mb();
barrier(); mb();
pcistatus_check(lanai, 0);
pcistatus_check(lanai, 0);
barrier(); mb();
barrier(); mb();
...
@@ -2544,36 +2574,37 @@ static int lanai_ioctl(struct atm_dev *atmdev, unsigned int cmd, void *arg)
...
@@ -2544,36 +2574,37 @@ static int lanai_ioctl(struct atm_dev *atmdev, unsigned int cmd, void *arg)
u32 dw;
u32 dw;
struct pci_dev *pci = lanai->pci;
struct pci_dev *pci = lanai->pci;
(void) pci_read_config_word(pci, PCI_VENDOR_ID, &w);
(void) pci_read_config_word(pci, PCI_VENDOR_ID, &w);
DPRINTK("vendor = 0x%X\n", w);
DPRINTK("vendor = 0x%X\n",
(unsigned int)
w);
(void) pci_read_config_word(pci, PCI_DEVICE_ID, &w);
(void) pci_read_config_word(pci, PCI_DEVICE_ID, &w);
DPRINTK("device = 0x%X\n", w);
DPRINTK("device = 0x%X\n",
(unsigned int)
w);
(void) pci_read_config_word(pci, PCI_COMMAND, &w);
(void) pci_read_config_word(pci, PCI_COMMAND, &w);
DPRINTK("command = 0x%X\n", w);
DPRINTK("command = 0x%X\n",
(unsigned int)
w);
(void) pci_read_config_word(pci, PCI_STATUS, &w);
(void) pci_read_config_word(pci, PCI_STATUS, &w);
DPRINTK("status = 0x%X\n", w);
DPRINTK("status = 0x%X\n",
(unsigned int)
w);
(void) pci_read_config_dword(pci,
(void) pci_read_config_dword(pci,
PCI_CLASS_REVISION, &dw);
PCI_CLASS_REVISION, &dw);
DPRINTK("class/revision = 0x%X\n", dw);
DPRINTK("class/revision = 0x%X\n",
(unsigned int)
dw);
(void) pci_read_config_byte(pci,
(void) pci_read_config_byte(pci,
PCI_CACHE_LINE_SIZE, &b);
PCI_CACHE_LINE_SIZE, &b);
DPRINTK("cache line size = 0x%X\n", b);
DPRINTK("cache line size = 0x%X\n",
(unsigned int)
b);
(void) pci_read_config_byte(pci, PCI_LATENCY_TIMER, &b);
(void) pci_read_config_byte(pci, PCI_LATENCY_TIMER, &b);
DPRINTK("latency = %d (0x%X)\n", b, b);
DPRINTK("latency = %d (0x%X)\n",
(int) b, (unsigned int) b);
(void) pci_read_config_byte(pci, PCI_HEADER_TYPE, &b);
(void) pci_read_config_byte(pci, PCI_HEADER_TYPE, &b);
DPRINTK("header type = 0x%X\n", b);
DPRINTK("header type = 0x%X\n",
(unsigned int)
b);
(void) pci_read_config_byte(pci, PCI_BIST, &b);
(void) pci_read_config_byte(pci, PCI_BIST, &b);
DPRINTK("bist = 0x%X\n", b);
DPRINTK("bist = 0x%X\n",
(unsigned int)
b);
/* skipping a few here */
/* skipping a few here */
(void) pci_read_config_byte(pci,
(void) pci_read_config_byte(pci,
PCI_INTERRUPT_LINE, &b);
PCI_INTERRUPT_LINE, &b);
DPRINTK("pci_int_line = 0x%X\n", b);
DPRINTK("pci_int_line = 0x%X\n",
(unsigned int)
b);
(void) pci_read_config_byte(pci,
(void) pci_read_config_byte(pci,
PCI_INTERRUPT_PIN, &b);
PCI_INTERRUPT_PIN, &b);
DPRINTK("pci_int_pin = 0x%X\n", b);
DPRINTK("pci_int_pin = 0x%X\n",
(unsigned int)
b);
(void) pci_read_config_byte(pci, PCI_MIN_GNT, &b);
(void) pci_read_config_byte(pci, PCI_MIN_GNT, &b);
DPRINTK("min_gnt = 0x%X\n", b);
DPRINTK("min_gnt = 0x%X\n",
(unsigned int)
b);
(void) pci_read_config_byte(pci, PCI_MAX_LAT, &b);
(void) pci_read_config_byte(pci, PCI_MAX_LAT, &b);
DPRINTK("max_lat = 0x%X\n", b); }
DPRINTK("max_lat = 0x%X\n",
(unsigned int)
b); }
return 0;
return 0;
#ifdef USE_POWERDOWN
#ifdef USE_POWERDOWN
case 2200005:
case 2200005:
...
@@ -2597,14 +2628,15 @@ static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb)
...
@@ -2597,14 +2628,15 @@ static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb)
struct
lanai_vcc
*
lvcc
=
(
struct
lanai_vcc
*
)
atmvcc
->
dev_data
;
struct
lanai_vcc
*
lvcc
=
(
struct
lanai_vcc
*
)
atmvcc
->
dev_data
;
struct
lanai_dev
*
lanai
=
(
struct
lanai_dev
*
)
atmvcc
->
dev
->
dev_data
;
struct
lanai_dev
*
lanai
=
(
struct
lanai_dev
*
)
atmvcc
->
dev
->
dev_data
;
unsigned
long
flags
;
unsigned
long
flags
;
if
(
lvcc
==
NULL
||
lvcc
->
vbase
==
0
||
lvcc
->
tx
.
atmvcc
!=
atmvcc
)
if
(
unlikely
(
lvcc
==
NULL
||
lvcc
->
vbase
==
0
||
lvcc
->
tx
.
atmvcc
!=
atmvcc
))
goto
einval
;
goto
einval
;
#ifdef DEBUG
#ifdef DEBUG
if
(
skb
==
NULL
)
{
if
(
unlikely
(
skb
==
NULL
)
)
{
DPRINTK
(
"lanai_send: skb==NULL for vci=%d
\n
"
,
atmvcc
->
vci
);
DPRINTK
(
"lanai_send: skb==NULL for vci=%d
\n
"
,
atmvcc
->
vci
);
goto
einval
;
goto
einval
;
}
}
if
(
lanai
==
NULL
)
{
if
(
unlikely
(
lanai
==
NULL
)
)
{
DPRINTK
(
"lanai_send: lanai==NULL for vci=%d
\n
"
,
atmvcc
->
vci
);
DPRINTK
(
"lanai_send: lanai==NULL for vci=%d
\n
"
,
atmvcc
->
vci
);
goto
einval
;
goto
einval
;
}
}
...
@@ -2617,7 +2649,7 @@ static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb)
...
@@ -2617,7 +2649,7 @@ static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb)
spin_unlock_irqrestore
(
&
lanai
->
txlock
,
flags
);
spin_unlock_irqrestore
(
&
lanai
->
txlock
,
flags
);
return
0
;
return
0
;
case
ATM_AAL0
:
case
ATM_AAL0
:
if
(
skb
->
len
!=
ATM_CELL_SIZE
-
1
)
if
(
unlikely
(
skb
->
len
!=
ATM_CELL_SIZE
-
1
)
)
goto
einval
;
goto
einval
;
/* NOTE - this next line is technically invalid - we haven't unshared skb */
/* NOTE - this next line is technically invalid - we haven't unshared skb */
cpu_to_be32s
((
u32
*
)
skb
->
data
);
cpu_to_be32s
((
u32
*
)
skb
->
data
);
...
@@ -2626,7 +2658,7 @@ static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb)
...
@@ -2626,7 +2658,7 @@ static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb)
spin_unlock_irqrestore
(
&
lanai
->
txlock
,
flags
);
spin_unlock_irqrestore
(
&
lanai
->
txlock
,
flags
);
return
0
;
return
0
;
}
}
DPRINTK
(
"lanai_send: bad aal=%d on vci=%d
\n
"
,
atmvcc
->
qos
.
aal
,
DPRINTK
(
"lanai_send: bad aal=%d on vci=%d
\n
"
,
(
int
)
atmvcc
->
qos
.
aal
,
atmvcc
->
vci
);
atmvcc
->
vci
);
einval:
einval:
lanai_free_skb
(
atmvcc
,
skb
);
lanai_free_skb
(
atmvcc
,
skb
);
...
@@ -2649,12 +2681,13 @@ static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
...
@@ -2649,12 +2681,13 @@ static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
struct
lanai_vcc
*
lvcc
;
struct
lanai_vcc
*
lvcc
;
if
(
left
--
==
0
)
if
(
left
--
==
0
)
return
sprintf
(
page
,
DEV_LABEL
"(itf %d): chip=LANAI%s, "
return
sprintf
(
page
,
DEV_LABEL
"(itf %d): chip=LANAI%s, "
"serial=%
d
, magic=0x%08X, num_vci=%d
\n
"
,
"serial=%
u
, magic=0x%08X, num_vci=%d
\n
"
,
atmdev
->
number
,
lanai
->
type
==
lanai2
?
"2"
:
"HB"
,
atmdev
->
number
,
lanai
->
type
==
lanai2
?
"2"
:
"HB"
,
lanai
->
serialno
,
lanai
->
magicno
,
lanai
->
num_vci
);
(
unsigned
int
)
lanai
->
serialno
,
(
unsigned
int
)
lanai
->
magicno
,
lanai
->
num_vci
);
if
(
left
--
==
0
)
if
(
left
--
==
0
)
return
sprintf
(
page
,
"revision: board=%d, pci_if=%d
\n
"
,
return
sprintf
(
page
,
"revision: board=%d, pci_if=%d
\n
"
,
lanai
->
board_rev
,
lanai
->
pci_revision
);
lanai
->
board_rev
,
(
int
)
lanai
->
pci_revision
);
if
(
left
--
==
0
)
if
(
left
--
==
0
)
return
sprintf
(
page
,
"EEPROM ESI: "
return
sprintf
(
page
,
"EEPROM ESI: "
"%02X:%02X:%02X:%02X:%02X:%02X
\n
"
,
"%02X:%02X:%02X:%02X:%02X:%02X
\n
"
,
...
@@ -2671,37 +2704,37 @@ static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
...
@@ -2671,37 +2704,37 @@ static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
(
lanai
->
status
&
STATUS_LED
)
?
1
:
0
,
(
lanai
->
status
&
STATUS_LED
)
?
1
:
0
,
(
lanai
->
status
&
STATUS_GPIN
)
?
1
:
0
);
(
lanai
->
status
&
STATUS_GPIN
)
?
1
:
0
);
if
(
left
--
==
0
)
if
(
left
--
==
0
)
return
sprintf
(
page
,
"global buffer sizes: service=%
d
, "
return
sprintf
(
page
,
"global buffer sizes: service=%
Zu
, "
"aal0_rx=%
d
\n
"
,
lanai_buf_size
(
&
lanai
->
service
),
"aal0_rx=%
Zu
\n
"
,
lanai_buf_size
(
&
lanai
->
service
),
lanai
->
naal0
?
lanai_buf_size
(
&
lanai
->
aal0buf
)
:
0
);
lanai
->
naal0
?
lanai_buf_size
(
&
lanai
->
aal0buf
)
:
0
);
if
(
left
--
==
0
)
{
if
(
left
--
==
0
)
{
get_statistics
(
lanai
);
get_statistics
(
lanai
);
return
sprintf
(
page
,
"cells in error: overflow=%
d
, "
return
sprintf
(
page
,
"cells in error: overflow=%
u
, "
"closed_vci=%
d, bad_HEC=%d, rx_fifo=%d
\n
"
,
"closed_vci=%
u, bad_HEC=%u, rx_fifo=%u
\n
"
,
lanai
->
stats
.
ovfl_trash
,
lanai
->
stats
.
vci_trash
,
lanai
->
stats
.
ovfl_trash
,
lanai
->
stats
.
vci_trash
,
lanai
->
stats
.
hec_err
,
lanai
->
stats
.
atm_ovfl
);
lanai
->
stats
.
hec_err
,
lanai
->
stats
.
atm_ovfl
);
}
}
if
(
left
--
==
0
)
if
(
left
--
==
0
)
return
sprintf
(
page
,
"PCI errors: parity_detect=%
d
, "
return
sprintf
(
page
,
"PCI errors: parity_detect=%
u
, "
"master_abort=%
d, master_target_abort=%d
,
\n
"
,
"master_abort=%
u, master_target_abort=%u
,
\n
"
,
lanai
->
stats
.
pcierr_parity_detect
,
lanai
->
stats
.
pcierr_parity_detect
,
lanai
->
stats
.
pcierr_serr_set
,
lanai
->
stats
.
pcierr_serr_set
,
lanai
->
stats
.
pcierr_m_target_abort
);
lanai
->
stats
.
pcierr_m_target_abort
);
if
(
left
--
==
0
)
if
(
left
--
==
0
)
return
sprintf
(
page
,
" slave_target_abort=%
d
, "
return
sprintf
(
page
,
" slave_target_abort=%
u
, "
"master_parity=%
d
\n
"
,
lanai
->
stats
.
pcierr_s_target_abort
,
"master_parity=%
u
\n
"
,
lanai
->
stats
.
pcierr_s_target_abort
,
lanai
->
stats
.
pcierr_master_parity
);
lanai
->
stats
.
pcierr_master_parity
);
if
(
left
--
==
0
)
if
(
left
--
==
0
)
return
sprintf
(
page
,
"service list errors: no_vcc_rx=%
d
, "
return
sprintf
(
page
,
"service list errors: no_vcc_rx=%
u
, "
"no_vcc_tx=%
d
,
\n
"
,
lanai
->
stats
.
service_novcc_rx
,
"no_vcc_tx=%
u
,
\n
"
,
lanai
->
stats
.
service_novcc_rx
,
lanai
->
stats
.
service_novcc_tx
);
lanai
->
stats
.
service_novcc_tx
);
if
(
left
--
==
0
)
if
(
left
--
==
0
)
return
sprintf
(
page
,
" no_tx=%
d
, "
return
sprintf
(
page
,
" no_tx=%
u
, "
"no_rx=%
d, bad_rx_aal=%d
\n
"
,
lanai
->
stats
.
service_norx
,
"no_rx=%
u, bad_rx_aal=%u
\n
"
,
lanai
->
stats
.
service_norx
,
lanai
->
stats
.
service_notx
,
lanai
->
stats
.
service_notx
,
lanai
->
stats
.
service_rxnotaal5
);
lanai
->
stats
.
service_rxnotaal5
);
if
(
left
--
==
0
)
if
(
left
--
==
0
)
return
sprintf
(
page
,
"resets: dma=%
d, card=%d
\n
"
,
return
sprintf
(
page
,
"resets: dma=%
u, card=%u
\n
"
,
lanai
->
stats
.
dma_reenable
,
lanai
->
stats
.
card_reset
);
lanai
->
stats
.
dma_reenable
,
lanai
->
stats
.
card_reset
);
/* At this point, "left" should be the VCI we're looking for */
/* At this point, "left" should be the VCI we're looking for */
vcclist_read_lock
();
vcclist_read_lock
();
...
@@ -2715,15 +2748,15 @@ static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
...
@@ -2715,15 +2748,15 @@ static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
(
*
pos
)
++
;
(
*
pos
)
++
;
}
}
/* Note that we re-use "left" here since we're done with it */
/* Note that we re-use "left" here since we're done with it */
left
=
sprintf
(
page
,
"VCI %4d: nref=%d, rx_nomem=%
d
"
,
(
vci_t
)
left
,
left
=
sprintf
(
page
,
"VCI %4d: nref=%d, rx_nomem=%
u
"
,
(
vci_t
)
left
,
lvcc
->
nref
,
lvcc
->
stats
.
rx_nomem
);
lvcc
->
nref
,
lvcc
->
stats
.
rx_nomem
);
if
(
lvcc
->
rx
.
atmvcc
!=
NULL
)
{
if
(
lvcc
->
rx
.
atmvcc
!=
NULL
)
{
left
+=
sprintf
(
&
page
[
left
],
",
\n
rx_AAL=%d"
,
left
+=
sprintf
(
&
page
[
left
],
",
\n
rx_AAL=%d"
,
lvcc
->
rx
.
atmvcc
->
qos
.
aal
==
ATM_AAL5
?
5
:
0
);
lvcc
->
rx
.
atmvcc
->
qos
.
aal
==
ATM_AAL5
?
5
:
0
);
if
(
lvcc
->
rx
.
atmvcc
->
qos
.
aal
==
ATM_AAL5
)
if
(
lvcc
->
rx
.
atmvcc
->
qos
.
aal
==
ATM_AAL5
)
left
+=
sprintf
(
&
page
[
left
],
", rx_buf_size=%
d
, "
left
+=
sprintf
(
&
page
[
left
],
", rx_buf_size=%
Zu
, "
"rx_bad_len=%
d,
\n
rx_service_trash=%d
, "
"rx_bad_len=%
u,
\n
rx_service_trash=%u
, "
"rx_service_stream=%
d, rx_bad_crc=%d
"
,
"rx_service_stream=%
u, rx_bad_crc=%u
"
,
lanai_buf_size
(
&
lvcc
->
rx
.
buf
),
lanai_buf_size
(
&
lvcc
->
rx
.
buf
),
lvcc
->
stats
.
x
.
aal5
.
rx_badlen
,
lvcc
->
stats
.
x
.
aal5
.
rx_badlen
,
lvcc
->
stats
.
x
.
aal5
.
service_trash
,
lvcc
->
stats
.
x
.
aal5
.
service_trash
,
...
@@ -2732,7 +2765,7 @@ static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
...
@@ -2732,7 +2765,7 @@ static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
}
}
if
(
lvcc
->
tx
.
atmvcc
!=
NULL
)
if
(
lvcc
->
tx
.
atmvcc
!=
NULL
)
left
+=
sprintf
(
&
page
[
left
],
",
\n
tx_AAL=%d, "
left
+=
sprintf
(
&
page
[
left
],
",
\n
tx_AAL=%d, "
"tx_buf_size=%
d
, tx_qos=%cBR, tx_backlogged=%c"
,
"tx_buf_size=%
Zu
, tx_qos=%cBR, tx_backlogged=%c"
,
lvcc
->
tx
.
atmvcc
->
qos
.
aal
==
ATM_AAL5
?
5
:
0
,
lvcc
->
tx
.
atmvcc
->
qos
.
aal
==
ATM_AAL5
?
5
:
0
,
lanai_buf_size
(
&
lvcc
->
tx
.
buf
),
lanai_buf_size
(
&
lvcc
->
tx
.
buf
),
lvcc
->
tx
.
atmvcc
==
lanai
->
cbrvcc
?
'C'
:
'U'
,
lvcc
->
tx
.
atmvcc
==
lanai
->
cbrvcc
?
'C'
:
'U'
,
...
...
drivers/net/hamradio/bpqether.c
View file @
293f3e3f
...
@@ -75,6 +75,7 @@
...
@@ -75,6 +75,7 @@
#include <linux/interrupt.h>
#include <linux/interrupt.h>
#include <linux/notifier.h>
#include <linux/notifier.h>
#include <linux/proc_fs.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/stat.h>
#include <linux/netfilter.h>
#include <linux/netfilter.h>
#include <linux/module.h>
#include <linux/module.h>
...
@@ -99,7 +100,7 @@ static char bpq_eth_addr[6];
...
@@ -99,7 +100,7 @@ static char bpq_eth_addr[6];
static
int
bpq_rcv
(
struct
sk_buff
*
,
struct
net_device
*
,
struct
packet_type
*
);
static
int
bpq_rcv
(
struct
sk_buff
*
,
struct
net_device
*
,
struct
packet_type
*
);
static
int
bpq_device_event
(
struct
notifier_block
*
,
unsigned
long
,
void
*
);
static
int
bpq_device_event
(
struct
notifier_block
*
,
unsigned
long
,
void
*
);
static
c
har
*
bpq_print_ethaddr
(
unsigned
char
*
);
static
c
onst
char
*
bpq_print_ethaddr
(
const
unsigned
char
*
);
static
struct
packet_type
bpq_packet_type
=
{
static
struct
packet_type
bpq_packet_type
=
{
.
type
=
__constant_htons
(
ETH_P_BPQ
),
.
type
=
__constant_htons
(
ETH_P_BPQ
),
...
@@ -113,15 +114,16 @@ static struct notifier_block bpq_dev_notifier = {
...
@@ -113,15 +114,16 @@ static struct notifier_block bpq_dev_notifier = {
#define MAXBPQDEV 100
#define MAXBPQDEV 100
static
struct
bpqdev
{
struct
bpqdev
{
struct
bpqdev
*
next
;
struct
list_head
bpq_list
;
/* list of bpq devices chain */
char
ethname
[
14
];
/* ether device name */
struct
net_device
*
ethdev
;
/* link to ethernet device */
struct
net_device
*
ethdev
;
/* link to ethernet device */
struct
net_device
*
axdev
;
/* bpq device (bpq#) */
struct
net_device
axdev
;
/* bpq device (bpq#) */
struct
net_device_stats
stats
;
/* some statistics */
struct
net_device_stats
stats
;
/* some statistics */
char
dest_addr
[
6
];
/* ether destination address */
char
dest_addr
[
6
];
/* ether destination address */
char
acpt_addr
[
6
];
/* accept ether frames from this address only */
char
acpt_addr
[
6
];
/* accept ether frames from this address only */
}
*
bpq_devices
;
};
static
LIST_HEAD
(
bpq_devices
);
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
...
@@ -144,10 +146,10 @@ static inline struct net_device *bpq_get_ax25_dev(struct net_device *dev)
...
@@ -144,10 +146,10 @@ static inline struct net_device *bpq_get_ax25_dev(struct net_device *dev)
{
{
struct
bpqdev
*
bpq
;
struct
bpqdev
*
bpq
;
for
(
bpq
=
bpq_devices
;
bpq
!=
NULL
;
bpq
=
bpq
->
next
)
list_for_each_entry
(
bpq
,
&
bpq_devices
,
bpq_list
)
{
if
(
bpq
->
ethdev
==
dev
)
if
(
bpq
->
ethdev
==
dev
)
return
&
bpq
->
axdev
;
return
bpq
->
axdev
;
}
return
NULL
;
return
NULL
;
}
}
...
@@ -159,50 +161,6 @@ static inline int dev_is_ethdev(struct net_device *dev)
...
@@ -159,50 +161,6 @@ static inline int dev_is_ethdev(struct net_device *dev)
);
);
}
}
static
spinlock_t
bpq_lock
=
SPIN_LOCK_UNLOCKED
;
/*
* Sanity check: remove all devices that ceased to exists and
* return '1' if the given BPQ device was affected.
*/
static
int
bpq_check_devices
(
struct
net_device
*
dev
)
{
struct
bpqdev
*
bpq
,
*
bpq_prev
,
*
bpq_next
;
int
result
=
0
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
bpq_lock
,
flags
);
bpq_prev
=
NULL
;
for
(
bpq
=
bpq_devices
;
bpq
!=
NULL
;
bpq
=
bpq_next
)
{
bpq_next
=
bpq
->
next
;
if
(
!
dev_get
(
bpq
->
ethname
))
{
if
(
bpq_prev
)
bpq_prev
->
next
=
bpq
->
next
;
else
bpq_devices
=
bpq
->
next
;
if
(
&
bpq
->
axdev
==
dev
)
result
=
1
;
/* We should be locked, call
* unregister_netdevice directly
*/
unregister_netdevice
(
&
bpq
->
axdev
);
kfree
(
bpq
);
}
else
bpq_prev
=
bpq
;
}
spin_unlock_irqrestore
(
&
bpq_lock
,
flags
);
return
result
;
}
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
...
@@ -218,12 +176,11 @@ static int bpq_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty
...
@@ -218,12 +176,11 @@ static int bpq_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty
skb
->
sk
=
NULL
;
/* Initially we don't know who it's for */
skb
->
sk
=
NULL
;
/* Initially we don't know who it's for */
rcu_read_lock
();
dev
=
bpq_get_ax25_dev
(
dev
);
dev
=
bpq_get_ax25_dev
(
dev
);
if
(
dev
==
NULL
||
!
netif_running
(
dev
))
{
if
(
dev
==
NULL
||
!
netif_running
(
dev
))
kfree_skb
(
skb
);
goto
drop
;
return
0
;
}
/*
/*
* if we want to accept frames from just one ethernet device
* if we want to accept frames from just one ethernet device
...
@@ -234,8 +191,7 @@ static int bpq_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty
...
@@ -234,8 +191,7 @@ static int bpq_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty
if
(
!
(
bpq
->
acpt_addr
[
0
]
&
0x01
)
&&
memcmp
(
eth
->
h_source
,
bpq
->
acpt_addr
,
ETH_ALEN
))
{
if
(
!
(
bpq
->
acpt_addr
[
0
]
&
0x01
)
&&
memcmp
(
eth
->
h_source
,
bpq
->
acpt_addr
,
ETH_ALEN
))
{
printk
(
KERN_DEBUG
"bpqether: wrong dest %s
\n
"
,
bpq_print_ethaddr
(
eth
->
h_source
));
printk
(
KERN_DEBUG
"bpqether: wrong dest %s
\n
"
,
bpq_print_ethaddr
(
eth
->
h_source
));
kfree_skb
(
skb
);
goto
drop
;
return
0
;
}
}
len
=
skb
->
data
[
0
]
+
skb
->
data
[
1
]
*
256
-
5
;
len
=
skb
->
data
[
0
]
+
skb
->
data
[
1
]
*
256
-
5
;
...
@@ -256,8 +212,15 @@ static int bpq_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty
...
@@ -256,8 +212,15 @@ static int bpq_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_ty
netif_rx
(
skb
);
netif_rx
(
skb
);
dev
->
last_rx
=
jiffies
;
dev
->
last_rx
=
jiffies
;
unlock:
rcu_read_unlock
();
return
0
;
return
0
;
drop:
kfree_skb
(
skb
);
goto
unlock
;
}
}
/*
/*
...
@@ -275,7 +238,6 @@ static int bpq_xmit(struct sk_buff *skb, struct net_device *dev)
...
@@ -275,7 +238,6 @@ static int bpq_xmit(struct sk_buff *skb, struct net_device *dev)
* is down, the ethernet device may have gone.
* is down, the ethernet device may have gone.
*/
*/
if
(
!
netif_running
(
dev
))
{
if
(
!
netif_running
(
dev
))
{
bpq_check_devices
(
dev
);
kfree_skb
(
skb
);
kfree_skb
(
skb
);
return
-
ENODEV
;
return
-
ENODEV
;
}
}
...
@@ -400,11 +362,6 @@ static int bpq_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
...
@@ -400,11 +362,6 @@ static int bpq_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
*/
*/
static
int
bpq_open
(
struct
net_device
*
dev
)
static
int
bpq_open
(
struct
net_device
*
dev
)
{
{
if
(
bpq_check_devices
(
dev
))
return
-
ENODEV
;
/* oops, it's gone */
MOD_INC_USE_COUNT
;
netif_start_queue
(
dev
);
netif_start_queue
(
dev
);
return
0
;
return
0
;
}
}
...
@@ -412,15 +369,6 @@ static int bpq_open(struct net_device *dev)
...
@@ -412,15 +369,6 @@ static int bpq_open(struct net_device *dev)
static
int
bpq_close
(
struct
net_device
*
dev
)
static
int
bpq_close
(
struct
net_device
*
dev
)
{
{
netif_stop_queue
(
dev
);
netif_stop_queue
(
dev
);
MOD_DEC_USE_COUNT
;
return
0
;
}
/*
* currently unused
*/
static
int
bpq_dev_init
(
struct
net_device
*
dev
)
{
return
0
;
return
0
;
}
}
...
@@ -431,7 +379,7 @@ static int bpq_dev_init(struct net_device *dev)
...
@@ -431,7 +379,7 @@ static int bpq_dev_init(struct net_device *dev)
/*
/*
* Proc filesystem
* Proc filesystem
*/
*/
static
c
har
*
bpq_print_ethaddr
(
unsigned
char
*
e
)
static
c
onst
char
*
bpq_print_ethaddr
(
const
unsigned
char
*
e
)
{
{
static
char
buf
[
18
];
static
char
buf
[
18
];
...
@@ -441,98 +389,92 @@ static char * bpq_print_ethaddr(unsigned char *e)
...
@@ -441,98 +389,92 @@ static char * bpq_print_ethaddr(unsigned char *e)
return
buf
;
return
buf
;
}
}
static
int
bpq_get_info
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
length
)
#define BPQ_PROC_START ((void *)1)
static
void
*
bpq_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
{
int
i
=
1
;
struct
bpqdev
*
bpqdev
;
struct
bpqdev
*
bpqdev
;
int
len
=
0
;
off_t
pos
=
0
;
off_t
begin
=
0
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
bpq_lock
,
flags
);
len
+=
sprintf
(
buffer
,
"dev ether destination accept from
\n
"
);
for
(
bpqdev
=
bpq_devices
;
bpqdev
!=
NULL
;
bpqdev
=
bpqdev
->
next
)
{
len
+=
sprintf
(
buffer
+
len
,
"%-5s %-10s %s "
,
bpqdev
->
axdev
.
name
,
bpqdev
->
ethname
,
bpq_print_ethaddr
(
bpqdev
->
dest_addr
));
len
+=
sprintf
(
buffer
+
len
,
"%s
\n
"
,
rcu_read_lock
();
(
bpqdev
->
acpt_addr
[
0
]
&
0x01
)
?
"*"
:
bpq_print_ethaddr
(
bpqdev
->
acpt_addr
));
pos
=
begin
+
len
;
if
(
*
pos
==
0
)
return
BPQ_PROC_START
;
if
(
pos
<
offset
)
{
len
=
0
;
list_for_each_entry
(
bpqdev
,
&
bpq_devices
,
bpq_list
)
{
begin
=
pos
;
if
(
i
==
*
pos
)
}
return
bpqdev
;
if
(
pos
>
offset
+
length
)
break
;
}
}
return
NULL
;
}
spin_unlock_irqrestore
(
&
bpq_lock
,
flags
);
static
void
*
bpq_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
struct
list_head
*
p
;
*
start
=
buffer
+
(
offset
-
begin
);
++*
pos
;
len
-=
(
offset
-
begin
);
if
(
len
>
length
)
len
=
length
;
if
(
v
==
BPQ_PROC_START
)
p
=
bpq_devices
.
next
;
else
p
=
((
struct
bpqdev
*
)
v
)
->
bpq_list
.
next
;
return
len
;
return
(
p
==
&
bpq_devices
)
?
NULL
:
list_entry
(
p
,
struct
bpqdev
,
bpq_list
);
}
}
static
void
bpq_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
/* ------------------------------------------------------------------------ */
/*
* Setup a new device.
*/
static
int
bpq_new_device
(
struct
net_device
*
dev
)
{
{
int
k
;
rcu_read_unlock
();
struct
bpqdev
*
bpq
,
*
bpq2
;
}
unsigned
long
flags
;
if
((
bpq
=
kmalloc
(
sizeof
(
struct
bpqdev
),
GFP_KERNEL
))
==
NULL
)
return
-
ENOMEM
;
memset
(
bpq
,
0
,
sizeof
(
struct
bpqdev
));
bpq
->
ethdev
=
dev
;
bpq
->
ethname
[
sizeof
(
bpq
->
ethname
)
-
1
]
=
'\0'
;
static
int
bpq_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
strncpy
(
bpq
->
ethname
,
dev
->
name
,
sizeof
(
bpq
->
ethname
)
-
1
);
{
if
(
v
==
BPQ_PROC_START
)
seq_puts
(
seq
,
"dev ether destination accept from
\n
"
);
else
{
const
struct
bpqdev
*
bpqdev
=
v
;
seq_printf
(
seq
,
"%-5s %-10s %s "
,
bpqdev
->
axdev
->
name
,
bpqdev
->
ethdev
->
name
,
bpq_print_ethaddr
(
bpqdev
->
dest_addr
));
memcpy
(
bpq
->
dest_addr
,
bcast_addr
,
sizeof
(
bpq_eth_addr
));
seq_printf
(
seq
,
"%s
\n
"
,
memcpy
(
bpq
->
acpt_addr
,
bcast_addr
,
sizeof
(
bpq_eth_addr
));
(
bpqdev
->
acpt_addr
[
0
]
&
0x01
)
?
"*"
:
bpq_print_ethaddr
(
bpqdev
->
acpt_addr
));
dev
=
&
bpq
->
axdev
;
}
return
0
;
}
for
(
k
=
0
;
k
<
MAXBPQDEV
;
k
++
)
{
static
struct
seq_operations
bpq_seqops
=
{
struct
net_device
*
odev
;
.
start
=
bpq_seq_start
,
.
next
=
bpq_seq_next
,
.
stop
=
bpq_seq_stop
,
.
show
=
bpq_seq_show
,
};
sprintf
(
dev
->
name
,
"bpq%d"
,
k
);
static
int
bpq_info_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
return
seq_open
(
file
,
&
bpq_seqops
);
}
if
((
odev
=
__dev_get_by_name
(
dev
->
name
))
==
NULL
||
bpq_check_devices
(
odev
))
static
struct
file_operations
bpq_info_fops
=
{
break
;
.
owner
=
THIS_MODULE
,
}
.
open
=
bpq_info_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
seq_release
,
};
if
(
k
==
MAXBPQDEV
)
{
kfree
(
bpq
);
return
-
ENODEV
;
}
dev
->
priv
=
(
void
*
)
bpq
;
/* pointer back */
/* ------------------------------------------------------------------------ */
dev
->
init
=
bpq_dev_init
;
/* We should be locked, call register_netdevice() directly. */
if
(
register_netdevice
(
dev
)
!=
0
)
{
static
void
bpq_setup
(
struct
net_device
*
dev
)
kfree
(
bpq
);
{
return
-
EIO
;
}
dev
->
hard_start_xmit
=
bpq_xmit
;
dev
->
hard_start_xmit
=
bpq_xmit
;
dev
->
open
=
bpq_open
;
dev
->
open
=
bpq_open
;
...
@@ -540,6 +482,7 @@ static int bpq_new_device(struct net_device *dev)
...
@@ -540,6 +482,7 @@ static int bpq_new_device(struct net_device *dev)
dev
->
set_mac_address
=
bpq_set_mac_address
;
dev
->
set_mac_address
=
bpq_set_mac_address
;
dev
->
get_stats
=
bpq_get_stats
;
dev
->
get_stats
=
bpq_get_stats
;
dev
->
do_ioctl
=
bpq_ioctl
;
dev
->
do_ioctl
=
bpq_ioctl
;
dev
->
destructor
=
(
void
(
*
)(
struct
net_device
*
))
kfree
;
memcpy
(
dev
->
broadcast
,
ax25_bcast
,
AX25_ADDR_LEN
);
memcpy
(
dev
->
broadcast
,
ax25_bcast
,
AX25_ADDR_LEN
);
memcpy
(
dev
->
dev_addr
,
ax25_defaddr
,
AX25_ADDR_LEN
);
memcpy
(
dev
->
dev_addr
,
ax25_defaddr
,
AX25_ADDR_LEN
);
...
@@ -556,20 +499,59 @@ static int bpq_new_device(struct net_device *dev)
...
@@ -556,20 +499,59 @@ static int bpq_new_device(struct net_device *dev)
dev
->
mtu
=
AX25_DEF_PACLEN
;
dev
->
mtu
=
AX25_DEF_PACLEN
;
dev
->
addr_len
=
AX25_ADDR_LEN
;
dev
->
addr_len
=
AX25_ADDR_LEN
;
spin_lock_irqsave
(
&
bpq_lock
,
flags
);
}
if
(
bpq_devices
==
NULL
)
{
/*
bpq_devices
=
bpq
;
* Setup a new device.
}
else
{
*/
for
(
bpq2
=
bpq_devices
;
bpq2
->
next
!=
NULL
;
bpq2
=
bpq2
->
next
);
static
int
bpq_new_device
(
struct
net_device
*
edev
)
bpq2
->
next
=
bpq
;
{
}
int
err
;
struct
net_device
*
ndev
;
struct
bpqdev
*
bpq
;
spin_unlock_irqrestore
(
&
bpq_lock
,
flags
);
ndev
=
alloc_netdev
(
sizeof
(
struct
bpqdev
),
"bpq%d"
,
bpq_setup
);
if
(
!
ndev
)
return
-
ENOMEM
;
bpq
=
ndev
->
priv
;
dev_hold
(
edev
);
bpq
->
ethdev
=
edev
;
bpq
->
axdev
=
ndev
;
memcpy
(
bpq
->
dest_addr
,
bcast_addr
,
sizeof
(
bpq_eth_addr
));
memcpy
(
bpq
->
acpt_addr
,
bcast_addr
,
sizeof
(
bpq_eth_addr
));
err
=
dev_alloc_name
(
ndev
,
ndev
->
name
);
if
(
err
<
0
)
goto
error
;
err
=
register_netdevice
(
ndev
);
if
(
err
)
goto
error
;
/* List protected by RTNL */
list_add_rcu
(
&
bpq
->
bpq_list
,
&
bpq_devices
);
return
0
;
return
0
;
error:
dev_put
(
edev
);
kfree
(
ndev
);
return
err
;
}
}
static
void
bpq_free_device
(
struct
net_device
*
ndev
)
{
struct
bpqdev
*
bpq
=
ndev
->
priv
;
dev_put
(
bpq
->
ethdev
);
list_del_rcu
(
&
bpq
->
bpq_list
);
unregister_netdevice
(
ndev
);
}
/*
/*
* Handle device status changes.
* Handle device status changes.
...
@@ -581,22 +563,27 @@ static int bpq_device_event(struct notifier_block *this,unsigned long event, voi
...
@@ -581,22 +563,27 @@ static int bpq_device_event(struct notifier_block *this,unsigned long event, voi
if
(
!
dev_is_ethdev
(
dev
))
if
(
!
dev_is_ethdev
(
dev
))
return
NOTIFY_DONE
;
return
NOTIFY_DONE
;
bpq_check_devices
(
NULL
);
rcu_read_lock
(
);
switch
(
event
)
{
switch
(
event
)
{
case
NETDEV_UP
:
/* new ethernet device -> new BPQ interface */
case
NETDEV_UP
:
/* new ethernet device -> new BPQ interface */
if
(
bpq_get_ax25_dev
(
dev
)
==
NULL
)
if
(
bpq_get_ax25_dev
(
dev
)
==
NULL
)
bpq_new_device
(
dev
);
bpq_new_device
(
dev
);
break
;
break
;
case
NETDEV_DOWN
:
/* ethernet device closed -> close BPQ interface */
case
NETDEV_DOWN
:
/* ethernet device closed -> close BPQ interface */
if
((
dev
=
bpq_get_ax25_dev
(
dev
))
!=
NULL
)
if
((
dev
=
bpq_get_ax25_dev
(
dev
))
!=
NULL
)
dev_close
(
dev
);
dev_close
(
dev
);
break
;
break
;
default:
case
NETDEV_UNREGISTER
:
/* ethernet device removed -> free BPQ interface */
break
;
if
((
dev
=
bpq_get_ax25_dev
(
dev
))
!=
NULL
)
bpq_free_device
(
dev
);
break
;
default:
break
;
}
}
rcu_read_unlock
();
return
NOTIFY_DONE
;
return
NOTIFY_DONE
;
}
}
...
@@ -618,7 +605,7 @@ static int __init bpq_init_driver(void)
...
@@ -618,7 +605,7 @@ static int __init bpq_init_driver(void)
printk
(
banner
);
printk
(
banner
);
if
(
!
proc_net_
create
(
"bpqether"
,
0
,
bpq_get_info
))
{
if
(
!
proc_net_
fops_create
(
"bpqether"
,
S_IRUGO
,
&
bpq_info_fops
))
{
printk
(
KERN_ERR
printk
(
KERN_ERR
"bpq: cannot create /proc/net/bpqether entry.
\n
"
);
"bpq: cannot create /proc/net/bpqether entry.
\n
"
);
unregister_netdevice_notifier
(
&
bpq_dev_notifier
);
unregister_netdevice_notifier
(
&
bpq_dev_notifier
);
...
@@ -626,15 +613,15 @@ static int __init bpq_init_driver(void)
...
@@ -626,15 +613,15 @@ static int __init bpq_init_driver(void)
return
-
ENOENT
;
return
-
ENOENT
;
}
}
r
ead_lock_bh
(
&
dev_base_lock
);
r
tnl_lock
(
);
for
(
dev
=
dev_base
;
dev
!=
NULL
;
dev
=
dev
->
next
)
{
for
(
dev
=
dev_base
;
dev
!=
NULL
;
dev
=
dev
->
next
)
{
if
(
dev_is_ethdev
(
dev
))
{
if
(
dev_is_ethdev
(
dev
)
&&
bpq_new_device
(
dev
)
)
{
read_unlock_bh
(
&
dev_base_lock
);
printk
(
KERN_ERR
bpq_new_device
(
dev
);
"bpq: cannot setup dev for '%s'
\n
"
,
read_lock_bh
(
&
dev_base_lock
);
dev
->
name
);
}
}
}
}
r
ead_unlock_bh
(
&
dev_base_lock
);
r
tnl_unlock
(
);
return
0
;
return
0
;
}
}
...
@@ -648,8 +635,12 @@ static void __exit bpq_cleanup_driver(void)
...
@@ -648,8 +635,12 @@ static void __exit bpq_cleanup_driver(void)
proc_net_remove
(
"bpqether"
);
proc_net_remove
(
"bpqether"
);
for
(
bpq
=
bpq_devices
;
bpq
!=
NULL
;
bpq
=
bpq
->
next
)
rtnl_lock
();
unregister_netdev
(
&
bpq
->
axdev
);
while
(
!
list_empty
(
&
bpq_devices
))
{
bpq
=
list_entry
(
bpq_devices
.
next
,
struct
bpqdev
,
bpq_list
);
bpq_free_device
(
bpq
->
axdev
);
}
rtnl_unlock
();
}
}
MODULE_AUTHOR
(
"Joerg Reuter DL1BKE <jreuter@yaina.de>"
);
MODULE_AUTHOR
(
"Joerg Reuter DL1BKE <jreuter@yaina.de>"
);
...
...
drivers/net/hamradio/yam.c
View file @
293f3e3f
...
@@ -72,6 +72,7 @@
...
@@ -72,6 +72,7 @@
#include <linux/kernel.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/version.h>
#include <linux/version.h>
#include <asm/uaccess.h>
#include <asm/uaccess.h>
...
@@ -120,7 +121,7 @@ struct yam_port {
...
@@ -120,7 +121,7 @@ struct yam_port {
int
irq
;
int
irq
;
int
dupmode
;
int
dupmode
;
struct
net_device
dev
;
struct
net_device
*
dev
;
/* Stats section */
/* Stats section */
...
@@ -161,7 +162,7 @@ struct yam_mcs {
...
@@ -161,7 +162,7 @@ struct yam_mcs {
struct
yam_mcs
*
next
;
struct
yam_mcs
*
next
;
};
};
static
struct
yam_port
yam_port
s
[
NR_PORTS
];
static
struct
net_device
*
yam_dev
s
[
NR_PORTS
];
static
struct
yam_mcs
*
yam_data
;
static
struct
yam_mcs
*
yam_data
;
...
@@ -628,8 +629,8 @@ static void yam_dotimer(unsigned long dummy)
...
@@ -628,8 +629,8 @@ static void yam_dotimer(unsigned long dummy)
int
i
;
int
i
;
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
struct
net_device
*
dev
=
&
yam_ports
[
i
].
dev
;
struct
net_device
*
dev
=
yam_devs
[
i
]
;
if
(
netif_running
(
dev
))
if
(
dev
&&
netif_running
(
dev
))
yam_arbitrate
(
dev
);
yam_arbitrate
(
dev
);
}
}
yam_timer
.
expires
=
jiffies
+
HZ
/
100
;
yam_timer
.
expires
=
jiffies
+
HZ
/
100
;
...
@@ -724,8 +725,8 @@ static irqreturn_t yam_interrupt(int irq, void *dev_id, struct pt_regs *regs)
...
@@ -724,8 +725,8 @@ static irqreturn_t yam_interrupt(int irq, void *dev_id, struct pt_regs *regs)
int
handled
=
0
;
int
handled
=
0
;
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
yp
=
&
yam_port
s
[
i
];
dev
=
yam_dev
s
[
i
];
dev
=
&
yp
->
de
v
;
yp
=
dev
->
pri
v
;
if
(
!
netif_running
(
dev
))
if
(
!
netif_running
(
dev
))
continue
;
continue
;
...
@@ -765,56 +766,73 @@ static irqreturn_t yam_interrupt(int irq, void *dev_id, struct pt_regs *regs)
...
@@ -765,56 +766,73 @@ static irqreturn_t yam_interrupt(int irq, void *dev_id, struct pt_regs *regs)
return
IRQ_RETVAL
(
handled
);
return
IRQ_RETVAL
(
handled
);
}
}
static
int
yam_net_get_info
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
length
)
#ifdef CONFIG_PROC_FS
static
void
*
yam_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
{
int
len
=
0
;
return
(
*
pos
<
NR_PORTS
)
?
yam_devs
[
*
pos
]
:
NULL
;
int
i
;
}
off_t
pos
=
0
;
off_t
begin
=
0
;
static
void
*
yam_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
++*
pos
;
return
(
*
pos
<
NR_PORTS
)
?
yam_devs
[
*
pos
]
:
NULL
;
}
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
static
void
yam_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
if
(
yam_ports
[
i
].
iobase
==
0
||
yam_ports
[
i
].
irq
==
0
)
{
continue
;
}
len
+=
sprintf
(
buffer
+
len
,
"Device yam%d
\n
"
,
i
);
len
+=
sprintf
(
buffer
+
len
,
" Up %d
\n
"
,
netif_running
(
&
yam_ports
[
i
].
dev
));
len
+=
sprintf
(
buffer
+
len
,
" Speed %u
\n
"
,
yam_ports
[
i
].
bitrate
);
len
+=
sprintf
(
buffer
+
len
,
" IoBase 0x%x
\n
"
,
yam_ports
[
i
].
iobase
);
len
+=
sprintf
(
buffer
+
len
,
" BaudRate %u
\n
"
,
yam_ports
[
i
].
baudrate
);
len
+=
sprintf
(
buffer
+
len
,
" IRQ %u
\n
"
,
yam_ports
[
i
].
irq
);
len
+=
sprintf
(
buffer
+
len
,
" TxState %u
\n
"
,
yam_ports
[
i
].
tx_state
);
len
+=
sprintf
(
buffer
+
len
,
" Duplex %u
\n
"
,
yam_ports
[
i
].
dupmode
);
len
+=
sprintf
(
buffer
+
len
,
" HoldDly %u
\n
"
,
yam_ports
[
i
].
holdd
);
len
+=
sprintf
(
buffer
+
len
,
" TxDelay %u
\n
"
,
yam_ports
[
i
].
txd
);
len
+=
sprintf
(
buffer
+
len
,
" TxTail %u
\n
"
,
yam_ports
[
i
].
txtail
);
len
+=
sprintf
(
buffer
+
len
,
" SlotTime %u
\n
"
,
yam_ports
[
i
].
slot
);
len
+=
sprintf
(
buffer
+
len
,
" Persist %u
\n
"
,
yam_ports
[
i
].
pers
);
len
+=
sprintf
(
buffer
+
len
,
" TxFrames %lu
\n
"
,
yam_ports
[
i
].
stats
.
tx_packets
);
len
+=
sprintf
(
buffer
+
len
,
" RxFrames %lu
\n
"
,
yam_ports
[
i
].
stats
.
rx_packets
);
len
+=
sprintf
(
buffer
+
len
,
" TxInt %u
\n
"
,
yam_ports
[
i
].
nb_mdint
);
len
+=
sprintf
(
buffer
+
len
,
" RxInt %u
\n
"
,
yam_ports
[
i
].
nb_rxint
);
len
+=
sprintf
(
buffer
+
len
,
" RxOver %lu
\n
"
,
yam_ports
[
i
].
stats
.
rx_fifo_errors
);
len
+=
sprintf
(
buffer
+
len
,
"
\n
"
);
pos
=
begin
+
len
;
if
(
pos
<
offset
)
{
len
=
0
;
begin
=
pos
;
}
if
(
pos
>
offset
+
length
)
break
;
}
*
start
=
buffer
+
(
offset
-
begin
);
static
int
yam_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
len
-=
(
offset
-
begin
);
{
const
struct
net_device
*
dev
=
v
;
const
struct
yam_port
*
yp
=
dev
->
priv
;
seq_printf
(
seq
,
"Device %s
\n
"
,
dev
->
name
);
seq_printf
(
seq
,
" Up %d
\n
"
,
netif_running
(
dev
));
seq_printf
(
seq
,
" Speed %u
\n
"
,
yp
->
bitrate
);
seq_printf
(
seq
,
" IoBase 0x%x
\n
"
,
yp
->
iobase
);
seq_printf
(
seq
,
" BaudRate %u
\n
"
,
yp
->
baudrate
);
seq_printf
(
seq
,
" IRQ %u
\n
"
,
yp
->
irq
);
seq_printf
(
seq
,
" TxState %u
\n
"
,
yp
->
tx_state
);
seq_printf
(
seq
,
" Duplex %u
\n
"
,
yp
->
dupmode
);
seq_printf
(
seq
,
" HoldDly %u
\n
"
,
yp
->
holdd
);
seq_printf
(
seq
,
" TxDelay %u
\n
"
,
yp
->
txd
);
seq_printf
(
seq
,
" TxTail %u
\n
"
,
yp
->
txtail
);
seq_printf
(
seq
,
" SlotTime %u
\n
"
,
yp
->
slot
);
seq_printf
(
seq
,
" Persist %u
\n
"
,
yp
->
pers
);
seq_printf
(
seq
,
" TxFrames %lu
\n
"
,
yp
->
stats
.
tx_packets
);
seq_printf
(
seq
,
" RxFrames %lu
\n
"
,
yp
->
stats
.
rx_packets
);
seq_printf
(
seq
,
" TxInt %u
\n
"
,
yp
->
nb_mdint
);
seq_printf
(
seq
,
" RxInt %u
\n
"
,
yp
->
nb_rxint
);
seq_printf
(
seq
,
" RxOver %lu
\n
"
,
yp
->
stats
.
rx_fifo_errors
);
seq_printf
(
seq
,
"
\n
"
);
if
(
len
>
length
)
}
len
=
length
;
return
len
;
static
struct
seq_operations
yam_seqops
=
{
.
start
=
yam_seq_start
,
.
next
=
yam_seq_next
,
.
stop
=
yam_seq_stop
,
.
show
=
yam_seq_show
,
};
static
int
yam_info_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
return
seq_open
(
file
,
&
yam_seqops
);
}
}
static
struct
file_operations
yam_info_fops
=
{
.
owner
=
THIS_MODULE
,
.
open
=
yam_info_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
seq_release
,
};
#endif
/* --------------------------------------------------------------------- */
/* --------------------------------------------------------------------- */
static
struct
net_device_stats
*
yam_get_stats
(
struct
net_device
*
dev
)
static
struct
net_device_stats
*
yam_get_stats
(
struct
net_device
*
dev
)
...
@@ -882,8 +900,10 @@ static int yam_open(struct net_device *dev)
...
@@ -882,8 +900,10 @@ static int yam_open(struct net_device *dev)
/* Reset overruns for all ports - FPGA programming makes overruns */
/* Reset overruns for all ports - FPGA programming makes overruns */
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
inb
(
LSR
(
yam_ports
[
i
].
dev
.
base_addr
));
struct
net_device
*
dev
=
yam_devs
[
i
];
yam_ports
[
i
].
stats
.
rx_fifo_errors
=
0
;
struct
yam_port
*
yp
=
dev
->
priv
;
inb
(
LSR
(
dev
->
base_addr
));
yp
->
stats
.
rx_fifo_errors
=
0
;
}
}
printk
(
KERN_INFO
"%s at iobase 0x%lx irq %u uart %s
\n
"
,
dev
->
name
,
dev
->
base_addr
,
dev
->
irq
,
printk
(
KERN_INFO
"%s at iobase 0x%lx irq %u uart %s
\n
"
,
dev
->
name
,
dev
->
base_addr
,
dev
->
irq
,
...
@@ -1070,14 +1090,26 @@ static int yam_set_mac_address(struct net_device *dev, void *addr)
...
@@ -1070,14 +1090,26 @@ static int yam_set_mac_address(struct net_device *dev, void *addr)
/* --------------------------------------------------------------------- */
/* --------------------------------------------------------------------- */
static
int
yam_probe
(
struct
net_device
*
dev
)
static
void
yam_setup
(
struct
net_device
*
dev
)
{
{
struct
yam_port
*
yp
;
struct
yam_port
*
yp
=
dev
->
priv
;
if
(
!
dev
)
return
-
ENXIO
;
yp
=
(
struct
yam_port
*
)
dev
->
priv
;
yp
->
magic
=
YAM_MAGIC
;
yp
->
bitrate
=
DEFAULT_BITRATE
;
yp
->
baudrate
=
DEFAULT_BITRATE
*
2
;
yp
->
iobase
=
0
;
yp
->
irq
=
0
;
yp
->
dupmode
=
0
;
yp
->
holdd
=
DEFAULT_HOLDD
;
yp
->
txd
=
DEFAULT_TXD
;
yp
->
txtail
=
DEFAULT_TXTAIL
;
yp
->
slot
=
DEFAULT_SLOT
;
yp
->
pers
=
DEFAULT_PERS
;
yp
->
dev
=
dev
;
dev
->
base_addr
=
yp
->
iobase
;
dev
->
irq
=
yp
->
irq
;
SET_MODULE_OWNER
(
dev
);
dev
->
open
=
yam_open
;
dev
->
open
=
yam_open
;
dev
->
stop
=
yam_close
;
dev
->
stop
=
yam_close
;
...
@@ -1104,58 +1136,49 @@ static int yam_probe(struct net_device *dev)
...
@@ -1104,58 +1136,49 @@ static int yam_probe(struct net_device *dev)
memcpy
(
dev
->
broadcast
,
ax25_bcast
,
7
);
memcpy
(
dev
->
broadcast
,
ax25_bcast
,
7
);
memcpy
(
dev
->
dev_addr
,
ax25_test
,
7
);
memcpy
(
dev
->
dev_addr
,
ax25_test
,
7
);
/* New style flags */
dev
->
flags
=
0
;
return
0
;
}
}
/* --------------------------------------------------------------------- */
static
int
__init
yam_init_driver
(
void
)
static
int
__init
yam_init_driver
(
void
)
{
{
struct
net_device
*
dev
;
struct
net_device
*
dev
;
int
i
;
int
i
,
err
;
char
name
[
IFNAMSIZ
];
printk
(
yam_drvinfo
);
printk
(
yam_drvinfo
);
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
sprintf
(
yam_ports
[
i
].
dev
.
name
,
"yam%d"
,
i
);
sprintf
(
name
,
"yam%d"
,
i
);
yam_ports
[
i
].
magic
=
YAM_MAGIC
;
yam_ports
[
i
].
bitrate
=
DEFAULT_BITRATE
;
dev
=
alloc_netdev
(
sizeof
(
struct
yam_port
),
name
,
yam_ports
[
i
].
baudrate
=
DEFAULT_BITRATE
*
2
;
yam_setup
);
yam_ports
[
i
].
iobase
=
0
;
if
(
!
dev
)
{
yam_ports
[
i
].
irq
=
0
;
printk
(
KERN_ERR
"yam: cannot allocate net device %s
\n
"
,
yam_ports
[
i
].
dupmode
=
0
;
dev
->
name
);
yam_ports
[
i
].
holdd
=
DEFAULT_HOLDD
;
err
=
-
ENOMEM
;
yam_ports
[
i
].
txd
=
DEFAULT_TXD
;
goto
error
;
yam_ports
[
i
].
txtail
=
DEFAULT_TXTAIL
;
}
yam_ports
[
i
].
slot
=
DEFAULT_SLOT
;
yam_ports
[
i
].
pers
=
DEFAULT_PERS
;
err
=
register_netdev
(
dev
);
if
(
err
)
{
dev
=
&
yam_ports
[
i
].
dev
;
dev
->
priv
=
&
yam_ports
[
i
];
dev
->
base_addr
=
yam_ports
[
i
].
iobase
;
dev
->
irq
=
yam_ports
[
i
].
irq
;
dev
->
init
=
yam_probe
;
dev
->
if_port
=
0
;
if
(
register_netdev
(
dev
))
{
printk
(
KERN_WARNING
"yam: cannot register net device %s
\n
"
,
dev
->
name
);
printk
(
KERN_WARNING
"yam: cannot register net device %s
\n
"
,
dev
->
name
);
dev
->
priv
=
NULL
;
goto
error
;
return
-
ENXIO
;
}
}
yam_devs
[
i
]
=
dev
;
SET_MODULE_OWNER
(
dev
);
}
}
yam_timer
.
function
=
yam_dotimer
;
yam_timer
.
function
=
yam_dotimer
;
yam_timer
.
expires
=
jiffies
+
HZ
/
100
;
yam_timer
.
expires
=
jiffies
+
HZ
/
100
;
add_timer
(
&
yam_timer
);
add_timer
(
&
yam_timer
);
proc_net_
create
(
"yam"
,
0
,
yam_net_get_info
);
proc_net_
fops_create
(
"yam"
,
S_IRUGO
,
&
yam_info_fops
);
return
0
;
return
0
;
error:
while
(
--
i
>=
0
)
{
unregister_netdev
(
yam_devs
[
i
]);
kfree
(
yam_devs
[
i
]);
}
return
err
;
}
}
/* --------------------------------------------------------------------- */
/* --------------------------------------------------------------------- */
...
@@ -1167,12 +1190,11 @@ static void __exit yam_cleanup_driver(void)
...
@@ -1167,12 +1190,11 @@ static void __exit yam_cleanup_driver(void)
del_timer
(
&
yam_timer
);
del_timer
(
&
yam_timer
);
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
struct
net_device
*
dev
=
&
yam_ports
[
i
].
dev
;
struct
net_device
*
dev
=
yam_devs
[
i
];
if
(
!
dev
->
priv
)
if
(
dev
)
{
continue
;
unregister_netdev
(
dev
);
if
(
netif_running
(
dev
))
kfree
(
dev
);
yam_close
(
dev
);
}
unregister_netdev
(
dev
);
}
}
while
(
yam_data
)
{
while
(
yam_data
)
{
...
...
drivers/net/slip.c
View file @
293f3e3f
...
@@ -1369,6 +1369,7 @@ static int __init slip_init(void)
...
@@ -1369,6 +1369,7 @@ static int __init slip_init(void)
/* Fill in our line protocol discipline, and register it */
/* Fill in our line protocol discipline, and register it */
if
((
status
=
tty_register_ldisc
(
N_SLIP
,
&
sl_ldisc
))
!=
0
)
{
if
((
status
=
tty_register_ldisc
(
N_SLIP
,
&
sl_ldisc
))
!=
0
)
{
printk
(
KERN_ERR
"SLIP: can't register line discipline (err = %d)
\n
"
,
status
);
printk
(
KERN_ERR
"SLIP: can't register line discipline (err = %d)
\n
"
,
status
);
kfree
(
slip_devs
);
}
}
return
status
;
return
status
;
}
}
...
...
drivers/net/wan/lapbether.c
View file @
293f3e3f
...
@@ -37,7 +37,6 @@
...
@@ -37,7 +37,6 @@
#include <linux/mm.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <linux/interrupt.h>
#include <linux/notifier.h>
#include <linux/notifier.h>
#include <linux/proc_fs.h>
#include <linux/stat.h>
#include <linux/stat.h>
#include <linux/netfilter.h>
#include <linux/netfilter.h>
#include <linux/module.h>
#include <linux/module.h>
...
@@ -52,50 +51,27 @@ static char bcast_addr[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
...
@@ -52,50 +51,27 @@ static char bcast_addr[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
struct
lapbethdev
{
struct
lapbethdev
{
struct
list_head
node
;
struct
list_head
node
;
char
ethname
[
14
];
/* ether device name */
struct
net_device
*
ethdev
;
/* link to ethernet device */
struct
net_device
*
ethdev
;
/* link to ethernet device */
struct
net_device
axdev
;
/* lapbeth device (lapb#) */
struct
net_device
*
axdev
;
/* lapbeth device (lapb#) */
struct
net_device_stats
stats
;
/* some statistics */
struct
net_device_stats
stats
;
/* some statistics */
atomic_t
refcnt
;
};
};
static
struct
list_head
lapbeth_devices
=
LIST_HEAD_INIT
(
lapbeth_devices
);
static
struct
list_head
lapbeth_devices
=
LIST_HEAD_INIT
(
lapbeth_devices
);
static
rwlock_t
lapbeth_devices_lock
=
RW_LOCK_UNLOCKED
;
static
__inline__
void
lapbeth_hold
(
struct
lapbethdev
*
lapbeth
)
{
atomic_inc
(
&
lapbeth
->
refcnt
);
}
static
__inline__
void
lapbeth_put
(
struct
lapbethdev
*
lapbeth
)
{
if
(
atomic_dec_and_test
(
&
lapbeth
->
refcnt
))
kfree
(
lapbeth
);
}
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
/*
/*
* Get the LAPB device for the ethernet device
* Get the LAPB device for the ethernet device
*/
*/
static
__inline__
struct
lapbethdev
*
lapbeth_get_x25_dev
(
struct
net_device
*
dev
)
static
struct
lapbethdev
*
lapbeth_get_x25_dev
(
struct
net_device
*
dev
)
{
{
struct
list_head
*
entry
;
struct
lapbethdev
*
lapbeth
;
struct
lapbethdev
*
lapbeth
,
*
use
=
NULL
;
read_lock
(
&
lapbeth_devices_lock
);
list_for_each
(
entry
,
&
lapbeth_devices
)
{
list_for_each_entry_rcu
(
lapbeth
,
&
lapbeth_devices
,
node
)
{
lapbeth
=
list_entry
(
entry
,
struct
lapbethdev
,
node
);
if
(
lapbeth
->
ethdev
==
dev
)
if
(
lapbeth
->
ethdev
==
dev
)
{
return
lapbeth
;
use
=
lapbeth
;
break
;
}
}
}
if
(
use
)
return
NULL
;
lapbeth_hold
(
use
);
read_unlock
(
&
lapbeth_devices_lock
);
return
use
;
}
}
static
__inline__
int
dev_is_ethdev
(
struct
net_device
*
dev
)
static
__inline__
int
dev_is_ethdev
(
struct
net_device
*
dev
)
...
@@ -103,36 +79,6 @@ static __inline__ int dev_is_ethdev(struct net_device *dev)
...
@@ -103,36 +79,6 @@ static __inline__ int dev_is_ethdev(struct net_device *dev)
return
dev
->
type
==
ARPHRD_ETHER
&&
strncmp
(
dev
->
name
,
"dummy"
,
5
);
return
dev
->
type
==
ARPHRD_ETHER
&&
strncmp
(
dev
->
name
,
"dummy"
,
5
);
}
}
/*
* Sanity check: remove all devices that ceased to exists and
* return '1' if the given LAPB device was affected.
*/
static
int
lapbeth_check_devices
(
struct
net_device
*
dev
)
{
struct
lapbethdev
*
lapbeth
;
struct
list_head
*
entry
,
*
tmp
;
int
result
=
0
;
write_lock
(
&
lapbeth_devices_lock
);
list_for_each_safe
(
entry
,
tmp
,
&
lapbeth_devices
)
{
lapbeth
=
list_entry
(
entry
,
struct
lapbethdev
,
node
);
if
(
!
dev_get
(
lapbeth
->
ethname
))
{
if
(
&
lapbeth
->
axdev
==
dev
)
result
=
1
;
unregister_netdev
(
&
lapbeth
->
axdev
);
dev_put
(
lapbeth
->
ethdev
);
list_del
(
&
lapbeth
->
node
);
lapbeth_put
(
lapbeth
);
}
}
write_unlock
(
&
lapbeth_devices_lock
);
return
result
;
}
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
/*
/*
...
@@ -145,29 +91,28 @@ static int lapbeth_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
...
@@ -145,29 +91,28 @@ static int lapbeth_rcv(struct sk_buff *skb, struct net_device *dev, struct packe
skb
->
sk
=
NULL
;
/* Initially we don't know who it's for */
skb
->
sk
=
NULL
;
/* Initially we don't know who it's for */
rcu_read_lock
();
lapbeth
=
lapbeth_get_x25_dev
(
dev
);
lapbeth
=
lapbeth_get_x25_dev
(
dev
);
if
(
!
lapbeth
)
if
(
!
lapbeth
)
goto
drop
;
goto
drop
;
if
(
!
netif_running
(
&
lapbeth
->
axdev
))
if
(
!
netif_running
(
lapbeth
->
axdev
))
goto
put_
drop
;
goto
drop
;
lapbeth
->
stats
.
rx_packets
++
;
lapbeth
->
stats
.
rx_packets
++
;
len
=
skb
->
data
[
0
]
+
skb
->
data
[
1
]
*
256
;
len
=
skb
->
data
[
0
]
+
skb
->
data
[
1
]
*
256
;
lapbeth
->
stats
.
rx_bytes
+=
len
;
skb_pull
(
skb
,
2
);
/* Remove the length bytes */
skb_pull
(
skb
,
2
);
/* Remove the length bytes */
skb_trim
(
skb
,
len
);
/* Set the length of the data */
skb_trim
(
skb
,
len
);
/* Set the length of the data */
if
((
err
=
lapb_data_received
(
lapbeth
,
skb
))
!=
LAPB_OK
)
{
if
((
err
=
lapb_data_received
(
lapbeth
,
skb
))
!=
LAPB_OK
)
{
printk
(
KERN_DEBUG
"lapbether: lapb_data_received err - %d
\n
"
,
err
);
printk
(
KERN_DEBUG
"lapbether: lapb_data_received err - %d
\n
"
,
err
);
goto
put_
drop
;
goto
drop
;
}
}
lapbeth_put
(
lapbeth
);
out:
out:
rcu_read_unlock
();
return
0
;
return
0
;
put_drop:
lapbeth_put
(
lapbeth
);
drop:
drop:
kfree_skb
(
skb
);
kfree_skb
(
skb
);
goto
out
;
goto
out
;
...
@@ -181,7 +126,7 @@ static int lapbeth_data_indication(void *token, struct sk_buff *skb)
...
@@ -181,7 +126,7 @@ static int lapbeth_data_indication(void *token, struct sk_buff *skb)
ptr
=
skb_push
(
skb
,
1
);
ptr
=
skb_push
(
skb
,
1
);
*
ptr
=
0x00
;
*
ptr
=
0x00
;
skb
->
dev
=
&
lapbeth
->
axdev
;
skb
->
dev
=
lapbeth
->
axdev
;
skb
->
protocol
=
htons
(
ETH_P_X25
);
skb
->
protocol
=
htons
(
ETH_P_X25
);
skb
->
mac
.
raw
=
skb
->
data
;
skb
->
mac
.
raw
=
skb
->
data
;
skb
->
pkt_type
=
PACKET_HOST
;
skb
->
pkt_type
=
PACKET_HOST
;
...
@@ -203,7 +148,6 @@ static int lapbeth_xmit(struct sk_buff *skb, struct net_device *dev)
...
@@ -203,7 +148,6 @@ static int lapbeth_xmit(struct sk_buff *skb, struct net_device *dev)
* is down, the ethernet device may have gone.
* is down, the ethernet device may have gone.
*/
*/
if
(
!
netif_running
(
dev
))
{
if
(
!
netif_running
(
dev
))
{
lapbeth_check_devices
(
dev
);
goto
drop
;
goto
drop
;
}
}
...
@@ -257,6 +201,7 @@ static void lapbeth_data_transmit(void *token, struct sk_buff *skb)
...
@@ -257,6 +201,7 @@ static void lapbeth_data_transmit(void *token, struct sk_buff *skb)
*
ptr
++
=
size
/
256
;
*
ptr
++
=
size
/
256
;
lapbeth
->
stats
.
tx_packets
++
;
lapbeth
->
stats
.
tx_packets
++
;
lapbeth
->
stats
.
tx_bytes
+=
size
;
skb
->
dev
=
dev
=
lapbeth
->
ethdev
;
skb
->
dev
=
dev
=
lapbeth
->
ethdev
;
...
@@ -279,7 +224,7 @@ static void lapbeth_connected(void *token, int reason)
...
@@ -279,7 +224,7 @@ static void lapbeth_connected(void *token, int reason)
ptr
=
skb_put
(
skb
,
1
);
ptr
=
skb_put
(
skb
,
1
);
*
ptr
=
0x01
;
*
ptr
=
0x01
;
skb
->
dev
=
&
lapbeth
->
axdev
;
skb
->
dev
=
lapbeth
->
axdev
;
skb
->
protocol
=
htons
(
ETH_P_X25
);
skb
->
protocol
=
htons
(
ETH_P_X25
);
skb
->
mac
.
raw
=
skb
->
data
;
skb
->
mac
.
raw
=
skb
->
data
;
skb
->
pkt_type
=
PACKET_HOST
;
skb
->
pkt_type
=
PACKET_HOST
;
...
@@ -302,7 +247,7 @@ static void lapbeth_disconnected(void *token, int reason)
...
@@ -302,7 +247,7 @@ static void lapbeth_disconnected(void *token, int reason)
ptr
=
skb_put
(
skb
,
1
);
ptr
=
skb_put
(
skb
,
1
);
*
ptr
=
0x02
;
*
ptr
=
0x02
;
skb
->
dev
=
&
lapbeth
->
axdev
;
skb
->
dev
=
lapbeth
->
axdev
;
skb
->
protocol
=
htons
(
ETH_P_X25
);
skb
->
protocol
=
htons
(
ETH_P_X25
);
skb
->
mac
.
raw
=
skb
->
data
;
skb
->
mac
.
raw
=
skb
->
data
;
skb
->
pkt_type
=
PACKET_HOST
;
skb
->
pkt_type
=
PACKET_HOST
;
...
@@ -330,27 +275,26 @@ static int lapbeth_set_mac_address(struct net_device *dev, void *addr)
...
@@ -330,27 +275,26 @@ static int lapbeth_set_mac_address(struct net_device *dev, void *addr)
return
0
;
return
0
;
}
}
static
struct
lapb_register_struct
lapbeth_callbacks
=
{
.
connect_confirmation
=
lapbeth_connected
,
.
connect_indication
=
lapbeth_connected
,
.
disconnect_confirmation
=
lapbeth_disconnected
,
.
disconnect_indication
=
lapbeth_disconnected
,
.
data_indication
=
lapbeth_data_indication
,
.
data_transmit
=
lapbeth_data_transmit
,
};
/*
/*
* open/close a device
* open/close a device
*/
*/
static
int
lapbeth_open
(
struct
net_device
*
dev
)
static
int
lapbeth_open
(
struct
net_device
*
dev
)
{
{
struct
lapb_register_struct
lapbeth_callbacks
;
struct
lapbethdev
*
lapbeth
;
struct
lapbethdev
*
lapbeth
;
int
err
;
int
err
;
if
(
lapbeth_check_devices
(
dev
))
return
-
ENODEV
;
/* oops, it's gone */
lapbeth
=
(
struct
lapbethdev
*
)
dev
->
priv
;
lapbeth
=
(
struct
lapbethdev
*
)
dev
->
priv
;
lapbeth_callbacks
.
connect_confirmation
=
lapbeth_connected
;
lapbeth_callbacks
.
connect_indication
=
lapbeth_connected
;
lapbeth_callbacks
.
disconnect_confirmation
=
lapbeth_disconnected
;
lapbeth_callbacks
.
disconnect_indication
=
lapbeth_disconnected
;
lapbeth_callbacks
.
data_indication
=
lapbeth_data_indication
;
lapbeth_callbacks
.
data_transmit
=
lapbeth_data_transmit
;
if
((
err
=
lapb_register
(
lapbeth
,
&
lapbeth_callbacks
))
!=
LAPB_OK
)
{
if
((
err
=
lapb_register
(
lapbeth
,
&
lapbeth_callbacks
))
!=
LAPB_OK
)
{
printk
(
KERN_ERR
"lapbeth: lapb_register error - %d
\n
"
,
err
);
printk
(
KERN_ERR
"lapbeth: lapb_register error - %d
\n
"
,
err
);
return
-
ENODEV
;
return
-
ENODEV
;
...
@@ -375,65 +319,52 @@ static int lapbeth_close(struct net_device *dev)
...
@@ -375,65 +319,52 @@ static int lapbeth_close(struct net_device *dev)
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
static
void
lapbeth_setup
(
struct
net_device
*
dev
)
{
dev
->
hard_start_xmit
=
lapbeth_xmit
;
dev
->
open
=
lapbeth_open
;
dev
->
stop
=
lapbeth_close
;
dev
->
destructor
=
(
void
(
*
)(
struct
net_device
*
))
kfree
;
dev
->
set_mac_address
=
lapbeth_set_mac_address
;
dev
->
get_stats
=
lapbeth_get_stats
;
dev
->
type
=
ARPHRD_X25
;
dev
->
hard_header_len
=
3
;
dev
->
mtu
=
1000
;
dev
->
addr_len
=
0
;
SET_MODULE_OWNER
(
dev
);
}
/*
/*
* Setup a new device.
* Setup a new device.
*/
*/
static
int
lapbeth_new_device
(
struct
net_device
*
dev
)
static
int
lapbeth_new_device
(
struct
net_device
*
dev
)
{
{
unsigned
char
buf
[
14
]
;
struct
net_device
*
ndev
;
struct
lapbethdev
*
lapbeth
;
struct
lapbethdev
*
lapbeth
;
int
k
,
rc
=
-
ENOMEM
;
int
rc
=
-
ENOMEM
;
if
((
lapbeth
=
kmalloc
(
sizeof
(
struct
lapbethdev
),
GFP_ATOMIC
))
==
NULL
)
ASSERT_RTNL
();
ndev
=
alloc_netdev
(
sizeof
(
*
lapbeth
),
"lapb%d"
,
lapbeth_setup
);
if
(
!
ndev
)
goto
out
;
goto
out
;
memset
(
lapbeth
,
0
,
sizeof
(
struct
lapbethdev
));
lapbeth
=
ndev
->
priv
;
lapbeth
->
axdev
=
ndev
;
dev_hold
(
dev
);
dev_hold
(
dev
);
lapbeth
->
ethdev
=
dev
;
lapbeth
->
ethdev
=
dev
;
strncpy
(
lapbeth
->
ethname
,
dev
->
name
,
sizeof
(
lapbeth
->
ethname
)
-
1
);
rc
=
dev_alloc_name
(
ndev
,
ndev
->
name
);
lapbeth
->
ethname
[
sizeof
(
lapbeth
->
ethname
)
-
1
]
=
'\0'
;
if
(
rc
<
0
)
atomic_set
(
&
lapbeth
->
refcnt
,
1
);
dev
=
&
lapbeth
->
axdev
;
SET_MODULE_OWNER
(
dev
);
for
(
k
=
0
;
k
<
MAXLAPBDEV
;
k
++
)
{
struct
net_device
*
odev
;
sprintf
(
buf
,
"lapb%d"
,
k
);
if
((
odev
=
__dev_get_by_name
(
buf
))
==
NULL
||
lapbeth_check_devices
(
odev
))
break
;
}
rc
=
-
ENODEV
;
if
(
k
==
MAXLAPBDEV
)
goto
fail
;
goto
fail
;
dev
->
priv
=
(
void
*
)
lapbeth
;
/* pointer back */
strcpy
(
dev
->
name
,
buf
);
rc
=
-
EIO
;
rc
=
-
EIO
;
if
(
register_netdev
(
dev
))
if
(
register_netdev
ice
(
n
dev
))
goto
fail
;
goto
fail
;
dev
->
hard_start_xmit
=
lapbeth_xmit
;
list_add_rcu
(
&
lapbeth
->
node
,
&
lapbeth_devices
);
dev
->
open
=
lapbeth_open
;
dev
->
stop
=
lapbeth_close
;
dev
->
set_mac_address
=
lapbeth_set_mac_address
;
dev
->
get_stats
=
lapbeth_get_stats
;
dev
->
type
=
ARPHRD_X25
;
dev
->
hard_header_len
=
3
;
dev
->
mtu
=
1000
;
dev
->
addr_len
=
0
;
write_lock
(
&
lapbeth_devices_lock
);
list_add
(
&
lapbeth
->
node
,
&
lapbeth_devices
);
lapbeth_hold
(
lapbeth
);
write_unlock
(
&
lapbeth_devices_lock
);
rc
=
0
;
rc
=
0
;
out:
out:
return
rc
;
return
rc
;
...
@@ -443,6 +374,16 @@ static int lapbeth_new_device(struct net_device *dev)
...
@@ -443,6 +374,16 @@ static int lapbeth_new_device(struct net_device *dev)
goto
out
;
goto
out
;
}
}
/*
* Free a lapb network device.
*/
static
void
lapbeth_free_device
(
struct
lapbethdev
*
lapbeth
)
{
dev_put
(
lapbeth
->
ethdev
);
list_del_rcu
(
&
lapbeth
->
node
);
unregister_netdevice
(
lapbeth
->
axdev
);
}
/*
/*
* Handle device status changes.
* Handle device status changes.
*/
*/
...
@@ -455,30 +396,27 @@ static int lapbeth_device_event(struct notifier_block *this,
...
@@ -455,30 +396,27 @@ static int lapbeth_device_event(struct notifier_block *this,
if
(
!
dev_is_ethdev
(
dev
))
if
(
!
dev_is_ethdev
(
dev
))
return
NOTIFY_DONE
;
return
NOTIFY_DONE
;
lapbeth_check_devices
(
NULL
);
rcu_read_lock
();
switch
(
event
)
{
switch
(
event
)
{
case
NETDEV_UP
:
case
NETDEV_UP
:
/*
/* New ethernet device -> new LAPB interface */
* New ethernet device -> new LAPB interface
if
(
lapbeth_get_x25_dev
(
dev
)
==
NULL
)
*/
lapbeth
=
lapbeth_get_x25_dev
(
dev
);
if
(
lapbeth
)
lapbeth_put
(
lapbeth
);
else
lapbeth_new_device
(
dev
);
lapbeth_new_device
(
dev
);
break
;
break
;
case
NETDEV_
GOING_DOWN
:
case
NETDEV_
DOWN
:
case
NETDEV_DOWN
:
/* ethernet device closed -> close LAPB interface */
/* ethernet device closed -> close LAPB interface */
lapbeth
=
lapbeth_get_x25_dev
(
dev
);
lapbeth
=
lapbeth_get_x25_dev
(
dev
);
if
(
lapbeth
)
if
(
lapbeth
)
{
dev_close
(
lapbeth
->
axdev
);
dev_close
(
lapbeth
->
ethdev
);
break
;
lapbeth_put
(
lapbeth
);
case
NETDEV_UNREGISTER
:
}
/* ethernet device disappears -> remove LAPB interface */
lapbeth
=
lapbeth_get_x25_dev
(
dev
);
if
(
lapbeth
)
lapbeth_free_device
(
lapbeth
);
break
;
break
;
}
}
rcu_read_unlock
();
return
NOTIFY_DONE
;
return
NOTIFY_DONE
;
}
}
...
@@ -506,15 +444,13 @@ static int __init lapbeth_init_driver(void)
...
@@ -506,15 +444,13 @@ static int __init lapbeth_init_driver(void)
printk
(
banner
);
printk
(
banner
);
r
ead_lock_bh
(
&
dev_base_lock
);
r
tnl_lock
(
);
for
(
dev
=
dev_base
;
dev
;
dev
=
dev
->
next
)
{
for
(
dev
=
dev_base
;
dev
;
dev
=
dev
->
next
)
{
if
(
dev_is_ethdev
(
dev
))
{
if
(
dev_is_ethdev
(
dev
))
{
read_unlock_bh
(
&
dev_base_lock
);
lapbeth_new_device
(
dev
);
lapbeth_new_device
(
dev
);
read_lock_bh
(
&
dev_base_lock
);
}
}
}
}
r
ead_unlock_bh
(
&
dev_base_lock
);
r
tnl_unlock
(
);
return
0
;
return
0
;
}
}
...
@@ -528,16 +464,13 @@ static void __exit lapbeth_cleanup_driver(void)
...
@@ -528,16 +464,13 @@ static void __exit lapbeth_cleanup_driver(void)
dev_remove_pack
(
&
lapbeth_packet_type
);
dev_remove_pack
(
&
lapbeth_packet_type
);
unregister_netdevice_notifier
(
&
lapbeth_dev_notifier
);
unregister_netdevice_notifier
(
&
lapbeth_dev_notifier
);
write_lock
(
&
lapbeth_devices_lock
);
rtnl_lock
();
list_for_each_safe
(
entry
,
tmp
,
&
lapbeth_devices
)
{
list_for_each_safe
(
entry
,
tmp
,
&
lapbeth_devices
)
{
lapbeth
=
list_entry
(
entry
,
struct
lapbethdev
,
node
);
lapbeth
=
list_entry
(
entry
,
struct
lapbethdev
,
node
);
unregister_netdev
(
&
lapbeth
->
axdev
);
list_del
(
&
lapbeth
->
node
);
lapbeth_put
(
lapbeth
);
}
write_unlock
(
&
lapbeth_devices_lock
);
unregister_netdevice
(
lapbeth
->
axdev
);
}
rtnl_unlock
();
}
}
module_exit
(
lapbeth_cleanup_driver
);
module_exit
(
lapbeth_cleanup_driver
);
...
...
include/net/netrom.h
View file @
293f3e3f
...
@@ -7,6 +7,7 @@
...
@@ -7,6 +7,7 @@
#ifndef _NETROM_H
#ifndef _NETROM_H
#define _NETROM_H
#define _NETROM_H
#include <linux/netrom.h>
#include <linux/netrom.h>
#include <linux/list.h>
#define NR_NETWORK_LEN 15
#define NR_NETWORK_LEN 15
#define NR_TRANSPORT_LEN 5
#define NR_TRANSPORT_LEN 5
...
@@ -77,16 +78,17 @@ typedef struct {
...
@@ -77,16 +78,17 @@ typedef struct {
#define nr_sk(__sk) ((nr_cb *)(__sk)->sk_protinfo)
#define nr_sk(__sk) ((nr_cb *)(__sk)->sk_protinfo)
struct
nr_neigh
{
struct
nr_neigh
{
struct
nr_neigh
*
next
;
struct
hlist_node
neigh_node
;
ax25_address
callsign
;
ax25_address
callsign
;
ax25_digi
*
digipeat
;
ax25_digi
*
digipeat
;
ax25_cb
*
ax25
;
ax25_cb
*
ax25
;
struct
net_device
*
dev
;
struct
net_device
*
dev
;
unsigned
char
quality
;
unsigned
char
quality
;
unsigned
char
locked
;
unsigned
char
locked
;
unsigned
short
count
;
unsigned
short
count
;
unsigned
int
number
;
unsigned
int
number
;
unsigned
char
failed
;
unsigned
char
failed
;
atomic_t
refcount
;
};
};
struct
nr_route
{
struct
nr_route
{
...
@@ -96,14 +98,74 @@ struct nr_route {
...
@@ -96,14 +98,74 @@ struct nr_route {
};
};
struct
nr_node
{
struct
nr_node
{
struct
nr_node
*
next
;
struct
hlist_node
node_node
;
ax25_address
callsign
;
ax25_address
callsign
;
char
mnemonic
[
7
];
char
mnemonic
[
7
];
unsigned
char
which
;
unsigned
char
which
;
unsigned
char
count
;
unsigned
char
count
;
struct
nr_route
routes
[
3
];
struct
nr_route
routes
[
3
];
atomic_t
refcount
;
spinlock_t
node_lock
;
};
};
/*********************************************************************
* nr_node & nr_neigh lists, refcounting and locking
*********************************************************************/
extern
struct
hlist_head
nr_node_list
;
extern
struct
hlist_head
nr_neigh_list
;
#define nr_node_hold(__nr_node) \
atomic_inc(&((__nr_node)->refcount))
static
__inline__
void
nr_node_put
(
struct
nr_node
*
nr_node
)
{
if
(
atomic_dec_and_test
(
&
nr_node
->
refcount
))
{
kfree
(
nr_node
);
}
}
#define nr_neigh_hold(__nr_neigh) \
atomic_inc(&((__nr_neigh)->refcount))
static
__inline__
void
nr_neigh_put
(
struct
nr_neigh
*
nr_neigh
)
{
if
(
atomic_dec_and_test
(
&
nr_neigh
->
refcount
))
{
if
(
nr_neigh
->
digipeat
!=
NULL
)
kfree
(
nr_neigh
->
digipeat
);
kfree
(
nr_neigh
);
}
}
/* nr_node_lock and nr_node_unlock also hold/put the node's refcounter.
*/
static
__inline__
void
nr_node_lock
(
struct
nr_node
*
nr_node
)
{
nr_node_hold
(
nr_node
);
spin_lock_bh
(
&
nr_node
->
node_lock
);
}
static
__inline__
void
nr_node_unlock
(
struct
nr_node
*
nr_node
)
{
spin_unlock_bh
(
&
nr_node
->
node_lock
);
nr_node_put
(
nr_node
);
}
#define nr_neigh_for_each(__nr_neigh, node, list) \
hlist_for_each_entry(__nr_neigh, node, list, neigh_node)
#define nr_neigh_for_each_safe(__nr_neigh, node, node2, list) \
hlist_for_each_entry_safe(__nr_neigh, node, node2, list, neigh_node)
#define nr_node_for_each(__nr_node, node, list) \
hlist_for_each_entry(__nr_node, node, list, node_node)
#define nr_node_for_each_safe(__nr_node, node, node2, list) \
hlist_for_each_entry_safe(__nr_node, node, node2, list, node_node)
/*********************************************************************/
/* af_netrom.c */
/* af_netrom.c */
extern
int
sysctl_netrom_default_path_quality
;
extern
int
sysctl_netrom_default_path_quality
;
extern
int
sysctl_netrom_obsolescence_count_initialiser
;
extern
int
sysctl_netrom_obsolescence_count_initialiser
;
...
@@ -121,7 +183,7 @@ extern void nr_destroy_socket(struct sock *);
...
@@ -121,7 +183,7 @@ extern void nr_destroy_socket(struct sock *);
/* nr_dev.c */
/* nr_dev.c */
extern
int
nr_rx_ip
(
struct
sk_buff
*
,
struct
net_device
*
);
extern
int
nr_rx_ip
(
struct
sk_buff
*
,
struct
net_device
*
);
extern
int
nr_init
(
struct
net_device
*
);
extern
void
nr_setup
(
struct
net_device
*
);
/* nr_in.c */
/* nr_in.c */
extern
int
nr_process_rx_frame
(
struct
sock
*
,
struct
sk_buff
*
);
extern
int
nr_process_rx_frame
(
struct
sock
*
,
struct
sk_buff
*
);
...
@@ -147,8 +209,8 @@ extern struct net_device *nr_dev_get(ax25_address *);
...
@@ -147,8 +209,8 @@ extern struct net_device *nr_dev_get(ax25_address *);
extern
int
nr_rt_ioctl
(
unsigned
int
,
void
*
);
extern
int
nr_rt_ioctl
(
unsigned
int
,
void
*
);
extern
void
nr_link_failed
(
ax25_cb
*
,
int
);
extern
void
nr_link_failed
(
ax25_cb
*
,
int
);
extern
int
nr_route_frame
(
struct
sk_buff
*
,
ax25_cb
*
);
extern
int
nr_route_frame
(
struct
sk_buff
*
,
ax25_cb
*
);
extern
int
nr_nodes_get_info
(
char
*
,
char
**
,
off_t
,
int
)
;
extern
struct
file_operations
nr_nodes_fops
;
extern
int
nr_neigh_get_info
(
char
*
,
char
**
,
off_t
,
int
)
;
extern
struct
file_operations
nr_neigh_fops
;
extern
void
nr_rt_free
(
void
);
extern
void
nr_rt_free
(
void
);
/* nr_subr.c */
/* nr_subr.c */
...
...
net/bridge/br_stp_bpdu.c
View file @
293f3e3f
...
@@ -201,6 +201,6 @@ int br_stp_handle_bpdu(struct sk_buff *skb)
...
@@ -201,6 +201,6 @@ int br_stp_handle_bpdu(struct sk_buff *skb)
out:
out:
spin_unlock_bh
(
&
br
->
lock
);
spin_unlock_bh
(
&
br
->
lock
);
err:
err:
kfree
(
skb
);
kfree
_skb
(
skb
);
return
0
;
return
0
;
}
}
net/ipv4/devinet.c
View file @
293f3e3f
...
@@ -922,6 +922,7 @@ static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
...
@@ -922,6 +922,7 @@ static int inet_fill_ifaddr(struct sk_buff *skb, struct in_ifaddr *ifa,
unsigned
char
*
b
=
skb
->
tail
;
unsigned
char
*
b
=
skb
->
tail
;
nlh
=
NLMSG_PUT
(
skb
,
pid
,
seq
,
event
,
sizeof
(
*
ifm
));
nlh
=
NLMSG_PUT
(
skb
,
pid
,
seq
,
event
,
sizeof
(
*
ifm
));
if
(
pid
)
nlh
->
nlmsg_flags
|=
NLM_F_MULTI
;
ifm
=
NLMSG_DATA
(
nlh
);
ifm
=
NLMSG_DATA
(
nlh
);
ifm
->
ifa_family
=
AF_INET
;
ifm
->
ifa_family
=
AF_INET
;
ifm
->
ifa_prefixlen
=
ifa
->
ifa_prefixlen
;
ifm
->
ifa_prefixlen
=
ifa
->
ifa_prefixlen
;
...
...
net/ipv4/netfilter/ipt_MASQUERADE.c
View file @
293f3e3f
...
@@ -91,11 +91,18 @@ masquerade_target(struct sk_buff **pskb,
...
@@ -91,11 +91,18 @@ masquerade_target(struct sk_buff **pskb,
#ifdef CONFIG_IP_ROUTE_FWMARK
#ifdef CONFIG_IP_ROUTE_FWMARK
.
fwmark
=
(
*
pskb
)
->
nfmark
.
fwmark
=
(
*
pskb
)
->
nfmark
#endif
#endif
}
},
}
}
};
.
oif
=
out
->
ifindex
};
if
(
ip_route_output_key
(
&
rt
,
&
fl
)
!=
0
)
{
if
(
ip_route_output_key
(
&
rt
,
&
fl
)
!=
0
)
{
/* Shouldn't happen */
/* Funky routing can do this. */
printk
(
"MASQUERADE: No route: Rusty's brain broke!
\n
"
);
if
(
net_ratelimit
())
printk
(
"MASQUERADE:"
" No route: Rusty's brain broke!
\n
"
);
return
NF_DROP
;
}
if
(
rt
->
u
.
dst
.
dev
!=
out
)
{
if
(
net_ratelimit
())
printk
(
"MASQUERADE:"
" Route sent us somewhere else.
\n
"
);
return
NF_DROP
;
return
NF_DROP
;
}
}
}
}
...
...
net/ipv6/addrconf.c
View file @
293f3e3f
...
@@ -2443,6 +2443,7 @@ static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa,
...
@@ -2443,6 +2443,7 @@ static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa,
unsigned
char
*
b
=
skb
->
tail
;
unsigned
char
*
b
=
skb
->
tail
;
nlh
=
NLMSG_PUT
(
skb
,
pid
,
seq
,
event
,
sizeof
(
*
ifm
));
nlh
=
NLMSG_PUT
(
skb
,
pid
,
seq
,
event
,
sizeof
(
*
ifm
));
if
(
pid
)
nlh
->
nlmsg_flags
|=
NLM_F_MULTI
;
ifm
=
NLMSG_DATA
(
nlh
);
ifm
=
NLMSG_DATA
(
nlh
);
ifm
->
ifa_family
=
AF_INET6
;
ifm
->
ifa_family
=
AF_INET6
;
ifm
->
ifa_prefixlen
=
ifa
->
prefix_len
;
ifm
->
ifa_prefixlen
=
ifa
->
prefix_len
;
...
...
net/ipv6/raw.c
View file @
293f3e3f
...
@@ -833,6 +833,7 @@ static int rawv6_getsockopt(struct sock *sk, int level, int optname,
...
@@ -833,6 +833,7 @@ static int rawv6_getsockopt(struct sock *sk, int level, int optname,
val
=
-
1
;
val
=
-
1
;
else
else
val
=
opt
->
offset
;
val
=
opt
->
offset
;
break
;
default:
default:
return
-
ENOPROTOOPT
;
return
-
ENOPROTOOPT
;
...
...
net/netrom/af_netrom.c
View file @
293f3e3f
...
@@ -36,6 +36,7 @@
...
@@ -36,6 +36,7 @@
#include <linux/notifier.h>
#include <linux/notifier.h>
#include <net/netrom.h>
#include <net/netrom.h>
#include <linux/proc_fs.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <net/ip.h>
#include <net/ip.h>
#include <net/tcp.h>
#include <net/tcp.h>
#include <net/arp.h>
#include <net/arp.h>
...
@@ -57,8 +58,8 @@ int sysctl_netrom_link_fails_count = NR_DEFAULT_FAILS;
...
@@ -57,8 +58,8 @@ int sysctl_netrom_link_fails_count = NR_DEFAULT_FAILS;
static
unsigned
short
circuit
=
0x101
;
static
unsigned
short
circuit
=
0x101
;
HLIST_HEAD
(
nr_list
);
static
HLIST_HEAD
(
nr_list
);
static
spinlock_t
nr_list_lock
;
static
spinlock_t
nr_list_lock
=
SPIN_LOCK_UNLOCKED
;
static
struct
proto_ops
nr_proto_ops
;
static
struct
proto_ops
nr_proto_ops
;
...
@@ -147,8 +148,10 @@ static struct sock *nr_find_listener(ax25_address *addr)
...
@@ -147,8 +148,10 @@ static struct sock *nr_find_listener(ax25_address *addr)
spin_lock_bh
(
&
nr_list_lock
);
spin_lock_bh
(
&
nr_list_lock
);
sk_for_each
(
s
,
node
,
&
nr_list
)
sk_for_each
(
s
,
node
,
&
nr_list
)
if
(
!
ax25cmp
(
&
nr_sk
(
s
)
->
source_addr
,
addr
)
&&
if
(
!
ax25cmp
(
&
nr_sk
(
s
)
->
source_addr
,
addr
)
&&
s
->
sk_state
==
TCP_LISTEN
)
s
->
sk_state
==
TCP_LISTEN
)
{
bh_lock_sock
(
s
);
goto
found
;
goto
found
;
}
s
=
NULL
;
s
=
NULL
;
found:
found:
spin_unlock_bh
(
&
nr_list_lock
);
spin_unlock_bh
(
&
nr_list_lock
);
...
@@ -167,8 +170,10 @@ static struct sock *nr_find_socket(unsigned char index, unsigned char id)
...
@@ -167,8 +170,10 @@ static struct sock *nr_find_socket(unsigned char index, unsigned char id)
sk_for_each
(
s
,
node
,
&
nr_list
)
{
sk_for_each
(
s
,
node
,
&
nr_list
)
{
nr_cb
*
nr
=
nr_sk
(
s
);
nr_cb
*
nr
=
nr_sk
(
s
);
if
(
nr
->
my_index
==
index
&&
nr
->
my_id
==
id
)
if
(
nr
->
my_index
==
index
&&
nr
->
my_id
==
id
)
{
bh_lock_sock
(
s
);
goto
found
;
goto
found
;
}
}
}
s
=
NULL
;
s
=
NULL
;
found:
found:
...
@@ -190,8 +195,10 @@ static struct sock *nr_find_peer(unsigned char index, unsigned char id,
...
@@ -190,8 +195,10 @@ static struct sock *nr_find_peer(unsigned char index, unsigned char id,
nr_cb
*
nr
=
nr_sk
(
s
);
nr_cb
*
nr
=
nr_sk
(
s
);
if
(
nr
->
your_index
==
index
&&
nr
->
your_id
==
id
&&
if
(
nr
->
your_index
==
index
&&
nr
->
your_id
==
id
&&
!
ax25cmp
(
&
nr
->
dest_addr
,
dest
))
!
ax25cmp
(
&
nr
->
dest_addr
,
dest
))
{
bh_lock_sock
(
s
);
goto
found
;
goto
found
;
}
}
}
s
=
NULL
;
s
=
NULL
;
found:
found:
...
@@ -206,14 +213,17 @@ static unsigned short nr_find_next_circuit(void)
...
@@ -206,14 +213,17 @@ static unsigned short nr_find_next_circuit(void)
{
{
unsigned
short
id
=
circuit
;
unsigned
short
id
=
circuit
;
unsigned
char
i
,
j
;
unsigned
char
i
,
j
;
struct
sock
*
sk
;
for
(;;)
{
for
(;;)
{
i
=
id
/
256
;
i
=
id
/
256
;
j
=
id
%
256
;
j
=
id
%
256
;
if
(
i
!=
0
&&
j
!=
0
)
if
(
i
!=
0
&&
j
!=
0
)
{
if
(
nr_find_socket
(
i
,
j
)
==
NULL
)
if
(
(
sk
=
nr_find_socket
(
i
,
j
)
)
==
NULL
)
break
;
break
;
bh_unlock_sock
(
sk
);
}
id
++
;
id
++
;
}
}
...
@@ -231,7 +241,12 @@ void nr_destroy_socket(struct sock *);
...
@@ -231,7 +241,12 @@ void nr_destroy_socket(struct sock *);
*/
*/
static
void
nr_destroy_timer
(
unsigned
long
data
)
static
void
nr_destroy_timer
(
unsigned
long
data
)
{
{
nr_destroy_socket
((
struct
sock
*
)
data
);
struct
sock
*
sk
=
(
struct
sock
*
)
data
;
bh_lock_sock
(
sk
);
sock_hold
(
sk
);
nr_destroy_socket
(
sk
);
bh_unlock_sock
(
sk
);
sock_put
(
sk
);
}
}
/*
/*
...
@@ -264,17 +279,20 @@ void nr_destroy_socket(struct sock *sk)
...
@@ -264,17 +279,20 @@ void nr_destroy_socket(struct sock *sk)
kfree_skb
(
skb
);
kfree_skb
(
skb
);
}
}
while
((
skb
=
skb_dequeue
(
&
sk
->
sk_write_queue
))
!=
NULL
)
{
kfree_skb
(
skb
);
}
if
(
atomic_read
(
&
sk
->
sk_wmem_alloc
)
||
if
(
atomic_read
(
&
sk
->
sk_wmem_alloc
)
||
atomic_read
(
&
sk
->
sk_rmem_alloc
))
{
atomic_read
(
&
sk
->
sk_rmem_alloc
))
{
/* Defer: outstanding buffers */
/* Defer: outstanding buffers */
init_timer
(
&
sk
->
sk_timer
);
init_timer
(
&
sk
->
sk_timer
);
sk
->
sk_timer
.
expires
=
jiffies
+
10
*
HZ
;
sk
->
sk_timer
.
expires
=
jiffies
+
2
*
HZ
;
sk
->
sk_timer
.
function
=
nr_destroy_timer
;
sk
->
sk_timer
.
function
=
nr_destroy_timer
;
sk
->
sk_timer
.
data
=
(
unsigned
long
)
sk
;
sk
->
sk_timer
.
data
=
(
unsigned
long
)
sk
;
add_timer
(
&
sk
->
sk_timer
);
add_timer
(
&
sk
->
sk_timer
);
}
else
}
else
s
k_free
(
sk
);
s
ock_put
(
sk
);
}
}
/*
/*
...
@@ -388,12 +406,15 @@ static int nr_listen(struct socket *sock, int backlog)
...
@@ -388,12 +406,15 @@ static int nr_listen(struct socket *sock, int backlog)
{
{
struct
sock
*
sk
=
sock
->
sk
;
struct
sock
*
sk
=
sock
->
sk
;
lock_sock
(
sk
);
if
(
sk
->
sk_state
!=
TCP_LISTEN
)
{
if
(
sk
->
sk_state
!=
TCP_LISTEN
)
{
memset
(
&
nr_sk
(
sk
)
->
user_addr
,
0
,
AX25_ADDR_LEN
);
memset
(
&
nr_sk
(
sk
)
->
user_addr
,
0
,
AX25_ADDR_LEN
);
sk
->
sk_max_ack_backlog
=
backlog
;
sk
->
sk_max_ack_backlog
=
backlog
;
sk
->
sk_state
=
TCP_LISTEN
;
sk
->
sk_state
=
TCP_LISTEN
;
release_sock
(
sk
);
return
0
;
return
0
;
}
}
release_sock
(
sk
);
return
-
EOPNOTSUPP
;
return
-
EOPNOTSUPP
;
}
}
...
@@ -495,6 +516,8 @@ static int nr_release(struct socket *sock)
...
@@ -495,6 +516,8 @@ static int nr_release(struct socket *sock)
if
(
sk
==
NULL
)
return
0
;
if
(
sk
==
NULL
)
return
0
;
sock_hold
(
sk
);
lock_sock
(
sk
);
nr
=
nr_sk
(
sk
);
nr
=
nr_sk
(
sk
);
switch
(
nr
->
state
)
{
switch
(
nr
->
state
)
{
...
@@ -528,6 +551,8 @@ static int nr_release(struct socket *sock)
...
@@ -528,6 +551,8 @@ static int nr_release(struct socket *sock)
}
}
sock
->
sk
=
NULL
;
sock
->
sk
=
NULL
;
release_sock
(
sk
);
sock_put
(
sk
);
return
0
;
return
0
;
}
}
...
@@ -540,21 +565,26 @@ static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
...
@@ -540,21 +565,26 @@ static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
struct
net_device
*
dev
;
struct
net_device
*
dev
;
ax25_address
*
user
,
*
source
;
ax25_address
*
user
,
*
source
;
if
(
!
sk
->
sk_zapped
)
lock_sock
(
sk
);
if
(
!
sk
->
sk_zapped
)
{
release_sock
(
sk
);
return
-
EINVAL
;
return
-
EINVAL
;
}
if
(
addr_len
<
sizeof
(
struct
sockaddr_ax25
)
||
addr_len
>
sizeof
(
struct
if
(
addr_len
<
sizeof
(
struct
sockaddr_ax25
)
||
addr_len
>
sizeof
(
struct
full_sockaddr_ax25
))
{
full_sockaddr_ax25
))
release_sock
(
sk
);
return
-
EINVAL
;
return
-
EINVAL
;
}
if
(
addr_len
<
(
addr
->
fsa_ax25
.
sax25_ndigis
*
sizeof
(
ax25_address
)
+
sizeof
(
struct
sockaddr_ax25
)))
if
(
addr_len
<
(
addr
->
fsa_ax25
.
sax25_ndigis
*
sizeof
(
ax25_address
)
+
sizeof
(
struct
sockaddr_ax25
)))
{
release_sock
(
sk
);
return
-
EINVAL
;
return
-
EINVAL
;
}
if
(
addr
->
fsa_ax25
.
sax25_family
!=
AF_NETROM
)
if
(
addr
->
fsa_ax25
.
sax25_family
!=
AF_NETROM
)
{
release_sock
(
sk
);
return
-
EINVAL
;
return
-
EINVAL
;
}
if
((
dev
=
nr_dev_get
(
&
addr
->
fsa_ax25
.
sax25_call
))
==
NULL
)
{
if
((
dev
=
nr_dev_get
(
&
addr
->
fsa_ax25
.
sax25_call
))
==
NULL
)
{
SOCK_DEBUG
(
sk
,
"NET/ROM: bind failed: invalid node callsign
\n
"
);
SOCK_DEBUG
(
sk
,
"NET/ROM: bind failed: invalid node callsign
\n
"
);
release_sock
(
sk
);
return
-
EADDRNOTAVAIL
;
return
-
EADDRNOTAVAIL
;
}
}
...
@@ -562,16 +592,22 @@ full_sockaddr_ax25))
...
@@ -562,16 +592,22 @@ full_sockaddr_ax25))
* Only the super user can set an arbitrary user callsign.
* Only the super user can set an arbitrary user callsign.
*/
*/
if
(
addr
->
fsa_ax25
.
sax25_ndigis
==
1
)
{
if
(
addr
->
fsa_ax25
.
sax25_ndigis
==
1
)
{
if
(
!
capable
(
CAP_NET_BIND_SERVICE
))
if
(
!
capable
(
CAP_NET_BIND_SERVICE
))
{
dev_put
(
dev
);
release_sock
(
sk
);
return
-
EACCES
;
return
-
EACCES
;
}
nr
->
user_addr
=
addr
->
fsa_digipeater
[
0
];
nr
->
user_addr
=
addr
->
fsa_digipeater
[
0
];
nr
->
source_addr
=
addr
->
fsa_ax25
.
sax25_call
;
nr
->
source_addr
=
addr
->
fsa_ax25
.
sax25_call
;
}
else
{
}
else
{
source
=
&
addr
->
fsa_ax25
.
sax25_call
;
source
=
&
addr
->
fsa_ax25
.
sax25_call
;
if
((
user
=
ax25_findbyuid
(
current
->
euid
))
==
NULL
)
{
if
((
user
=
ax25_findbyuid
(
current
->
euid
))
==
NULL
)
{
if
(
ax25_uid_policy
&&
!
capable
(
CAP_NET_BIND_SERVICE
))
if
(
ax25_uid_policy
&&
!
capable
(
CAP_NET_BIND_SERVICE
))
{
release_sock
(
sk
);
dev_put
(
dev
);
return
-
EPERM
;
return
-
EPERM
;
}
user
=
source
;
user
=
source
;
}
}
...
@@ -583,6 +619,8 @@ full_sockaddr_ax25))
...
@@ -583,6 +619,8 @@ full_sockaddr_ax25))
nr_insert_socket
(
sk
);
nr_insert_socket
(
sk
);
sk
->
sk_zapped
=
0
;
sk
->
sk_zapped
=
0
;
dev_put
(
dev
);
release_sock
(
sk
);
SOCK_DEBUG
(
sk
,
"NET/ROM: socket is bound
\n
"
);
SOCK_DEBUG
(
sk
,
"NET/ROM: socket is bound
\n
"
);
return
0
;
return
0
;
}
}
...
@@ -596,39 +634,50 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
...
@@ -596,39 +634,50 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
ax25_address
*
user
,
*
source
=
NULL
;
ax25_address
*
user
,
*
source
=
NULL
;
struct
net_device
*
dev
;
struct
net_device
*
dev
;
lock_sock
(
sk
);
if
(
sk
->
sk_state
==
TCP_ESTABLISHED
&&
sock
->
state
==
SS_CONNECTING
)
{
if
(
sk
->
sk_state
==
TCP_ESTABLISHED
&&
sock
->
state
==
SS_CONNECTING
)
{
sock
->
state
=
SS_CONNECTED
;
sock
->
state
=
SS_CONNECTED
;
release_sock
(
sk
);
return
0
;
/* Connect completed during a ERESTARTSYS event */
return
0
;
/* Connect completed during a ERESTARTSYS event */
}
}
if
(
sk
->
sk_state
==
TCP_CLOSE
&&
sock
->
state
==
SS_CONNECTING
)
{
if
(
sk
->
sk_state
==
TCP_CLOSE
&&
sock
->
state
==
SS_CONNECTING
)
{
sock
->
state
=
SS_UNCONNECTED
;
sock
->
state
=
SS_UNCONNECTED
;
release_sock
(
sk
);
return
-
ECONNREFUSED
;
return
-
ECONNREFUSED
;
}
}
if
(
sk
->
sk_state
==
TCP_ESTABLISHED
)
if
(
sk
->
sk_state
==
TCP_ESTABLISHED
)
{
release_sock
(
sk
);
return
-
EISCONN
;
/* No reconnect on a seqpacket socket */
return
-
EISCONN
;
/* No reconnect on a seqpacket socket */
}
sk
->
sk_state
=
TCP_CLOSE
;
sk
->
sk_state
=
TCP_CLOSE
;
sock
->
state
=
SS_UNCONNECTED
;
sock
->
state
=
SS_UNCONNECTED
;
if
(
addr_len
!=
sizeof
(
struct
sockaddr_ax25
)
&&
addr_len
!=
sizeof
(
struct
full_sockaddr_ax25
))
if
(
addr_len
!=
sizeof
(
struct
sockaddr_ax25
)
&&
addr_len
!=
sizeof
(
struct
full_sockaddr_ax25
))
{
release_sock
(
sk
);
return
-
EINVAL
;
return
-
EINVAL
;
}
if
(
addr
->
sax25_family
!=
AF_NETROM
)
if
(
addr
->
sax25_family
!=
AF_NETROM
)
{
release_sock
(
sk
);
return
-
EINVAL
;
return
-
EINVAL
;
}
if
(
sk
->
sk_zapped
)
{
/* Must bind first - autobinding in this may or may not work */
if
(
sk
->
sk_zapped
)
{
/* Must bind first - autobinding in this may or may not work */
sk
->
sk_zapped
=
0
;
sk
->
sk_zapped
=
0
;
if
((
dev
=
nr_dev_first
())
==
NULL
)
if
((
dev
=
nr_dev_first
())
==
NULL
)
{
release_sock
(
sk
);
return
-
ENETUNREACH
;
return
-
ENETUNREACH
;
}
source
=
(
ax25_address
*
)
dev
->
dev_addr
;
source
=
(
ax25_address
*
)
dev
->
dev_addr
;
if
((
user
=
ax25_findbyuid
(
current
->
euid
))
==
NULL
)
{
if
((
user
=
ax25_findbyuid
(
current
->
euid
))
==
NULL
)
{
if
(
ax25_uid_policy
&&
!
capable
(
CAP_NET_ADMIN
))
if
(
ax25_uid_policy
&&
!
capable
(
CAP_NET_ADMIN
))
{
dev_put
(
dev
);
release_sock
(
sk
);
return
-
EPERM
;
return
-
EPERM
;
}
user
=
source
;
user
=
source
;
}
}
...
@@ -636,12 +685,15 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
...
@@ -636,12 +685,15 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
nr
->
source_addr
=
*
source
;
nr
->
source_addr
=
*
source
;
nr
->
device
=
dev
;
nr
->
device
=
dev
;
dev_put
(
dev
);
nr_insert_socket
(
sk
);
/* Finish the bind */
nr_insert_socket
(
sk
);
/* Finish the bind */
}
}
nr
->
dest_addr
=
addr
->
sax25_call
;
nr
->
dest_addr
=
addr
->
sax25_call
;
release_sock
(
sk
);
circuit
=
nr_find_next_circuit
();
circuit
=
nr_find_next_circuit
();
lock_sock
(
sk
);
nr
->
my_index
=
circuit
/
256
;
nr
->
my_index
=
circuit
/
256
;
nr
->
my_id
=
circuit
%
256
;
nr
->
my_id
=
circuit
%
256
;
...
@@ -659,8 +711,10 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
...
@@ -659,8 +711,10 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
nr_start_heartbeat
(
sk
);
nr_start_heartbeat
(
sk
);
/* Now the loop */
/* Now the loop */
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
&&
(
flags
&
O_NONBLOCK
))
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
&&
(
flags
&
O_NONBLOCK
))
{
release_sock
(
sk
);
return
-
EINPROGRESS
;
return
-
EINPROGRESS
;
}
/*
/*
* A Connect Ack with Choke or timeout or failed routing will go to
* A Connect Ack with Choke or timeout or failed routing will go to
...
@@ -675,8 +729,10 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
...
@@ -675,8 +729,10 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
set_current_state
(
TASK_INTERRUPTIBLE
);
set_current_state
(
TASK_INTERRUPTIBLE
);
if
(
sk
->
sk_state
!=
TCP_SYN_SENT
)
if
(
sk
->
sk_state
!=
TCP_SYN_SENT
)
break
;
break
;
release_sock
(
sk
);
if
(
!
signal_pending
(
tsk
))
{
if
(
!
signal_pending
(
tsk
))
{
schedule
();
schedule
();
lock_sock
(
sk
);
continue
;
continue
;
}
}
return
-
ERESTARTSYS
;
return
-
ERESTARTSYS
;
...
@@ -687,10 +743,12 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
...
@@ -687,10 +743,12 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
{
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
{
sock
->
state
=
SS_UNCONNECTED
;
sock
->
state
=
SS_UNCONNECTED
;
release_sock
(
sk
);
return
sock_error
(
sk
);
/* Always set at this point */
return
sock_error
(
sk
);
/* Always set at this point */
}
}
sock
->
state
=
SS_CONNECTED
;
sock
->
state
=
SS_CONNECTED
;
release_sock
(
sk
);
return
0
;
return
0
;
}
}
...
@@ -753,6 +811,7 @@ static int nr_accept(struct socket *sock, struct socket *newsock, int flags)
...
@@ -753,6 +811,7 @@ static int nr_accept(struct socket *sock, struct socket *newsock, int flags)
newsock
->
sk
=
newsk
;
newsock
->
sk
=
newsk
;
out:
out:
release_sock
(
sk
);
return
err
;
return
err
;
}
}
...
@@ -763,9 +822,12 @@ static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
...
@@ -763,9 +822,12 @@ static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
struct
sock
*
sk
=
sock
->
sk
;
struct
sock
*
sk
=
sock
->
sk
;
nr_cb
*
nr
=
nr_sk
(
sk
);
nr_cb
*
nr
=
nr_sk
(
sk
);
lock_sock
(
sk
);
if
(
peer
!=
0
)
{
if
(
peer
!=
0
)
{
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
{
release_sock
(
sk
);
return
-
ENOTCONN
;
return
-
ENOTCONN
;
}
sax
->
fsa_ax25
.
sax25_family
=
AF_NETROM
;
sax
->
fsa_ax25
.
sax25_family
=
AF_NETROM
;
sax
->
fsa_ax25
.
sax25_ndigis
=
1
;
sax
->
fsa_ax25
.
sax25_ndigis
=
1
;
sax
->
fsa_ax25
.
sax25_call
=
nr
->
user_addr
;
sax
->
fsa_ax25
.
sax25_call
=
nr
->
user_addr
;
...
@@ -777,6 +839,7 @@ static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
...
@@ -777,6 +839,7 @@ static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
sax
->
fsa_ax25
.
sax25_call
=
nr
->
source_addr
;
sax
->
fsa_ax25
.
sax25_call
=
nr
->
source_addr
;
*
uaddr_len
=
sizeof
(
struct
sockaddr_ax25
);
*
uaddr_len
=
sizeof
(
struct
sockaddr_ax25
);
}
}
release_sock
(
sk
);
return
0
;
return
0
;
}
}
...
@@ -790,6 +853,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
...
@@ -790,6 +853,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
unsigned
short
circuit_index
,
circuit_id
;
unsigned
short
circuit_index
,
circuit_id
;
unsigned
short
peer_circuit_index
,
peer_circuit_id
;
unsigned
short
peer_circuit_index
,
peer_circuit_id
;
unsigned
short
frametype
,
flags
,
window
,
timeout
;
unsigned
short
frametype
,
flags
,
window
,
timeout
;
int
ret
;
skb
->
sk
=
NULL
;
/* Initially we don't know who it's for */
skb
->
sk
=
NULL
;
/* Initially we don't know who it's for */
...
@@ -847,7 +911,9 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
...
@@ -847,7 +911,9 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
else
else
nr_sk
(
sk
)
->
bpqext
=
0
;
nr_sk
(
sk
)
->
bpqext
=
0
;
return
nr_process_rx_frame
(
sk
,
skb
);
ret
=
nr_process_rx_frame
(
sk
,
skb
);
bh_unlock_sock
(
sk
);
return
ret
;
}
}
/*
/*
...
@@ -877,6 +943,8 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
...
@@ -877,6 +943,8 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
if
(
!
sk
||
sk
->
sk_ack_backlog
==
sk
->
sk_max_ack_backlog
||
if
(
!
sk
||
sk
->
sk_ack_backlog
==
sk
->
sk_max_ack_backlog
||
(
make
=
nr_make_new
(
sk
))
==
NULL
)
{
(
make
=
nr_make_new
(
sk
))
==
NULL
)
{
nr_transmit_refusal
(
skb
,
0
);
nr_transmit_refusal
(
skb
,
0
);
if
(
sk
)
bh_unlock_sock
(
sk
);
return
0
;
return
0
;
}
}
...
@@ -894,7 +962,9 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
...
@@ -894,7 +962,9 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
nr_make
->
your_index
=
circuit_index
;
nr_make
->
your_index
=
circuit_index
;
nr_make
->
your_id
=
circuit_id
;
nr_make
->
your_id
=
circuit_id
;
bh_unlock_sock
(
sk
);
circuit
=
nr_find_next_circuit
();
circuit
=
nr_find_next_circuit
();
bh_lock_sock
(
sk
);
nr_make
->
my_index
=
circuit
/
256
;
nr_make
->
my_index
=
circuit
/
256
;
nr_make
->
my_id
=
circuit
%
256
;
nr_make
->
my_id
=
circuit
%
256
;
...
@@ -936,6 +1006,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
...
@@ -936,6 +1006,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
if
(
!
sock_flag
(
sk
,
SOCK_DEAD
))
if
(
!
sock_flag
(
sk
,
SOCK_DEAD
))
sk
->
sk_data_ready
(
sk
,
skb
->
len
);
sk
->
sk_data_ready
(
sk
,
skb
->
len
);
bh_unlock_sock
(
sk
);
return
1
;
return
1
;
}
}
...
@@ -954,28 +1025,42 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,
...
@@ -954,28 +1025,42 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,
if
(
msg
->
msg_flags
&
~
(
MSG_DONTWAIT
|
MSG_EOR
))
if
(
msg
->
msg_flags
&
~
(
MSG_DONTWAIT
|
MSG_EOR
))
return
-
EINVAL
;
return
-
EINVAL
;
if
(
sk
->
sk_zapped
)
lock_sock
(
sk
);
return
-
EADDRNOTAVAIL
;
if
(
sk
->
sk_zapped
)
{
err
=
-
EADDRNOTAVAIL
;
goto
out
;
}
if
(
sk
->
sk_shutdown
&
SEND_SHUTDOWN
)
{
if
(
sk
->
sk_shutdown
&
SEND_SHUTDOWN
)
{
send_sig
(
SIGPIPE
,
current
,
0
);
send_sig
(
SIGPIPE
,
current
,
0
);
return
-
EPIPE
;
err
=
-
EPIPE
;
goto
out
;
}
}
if
(
nr
->
device
==
NULL
)
if
(
nr
->
device
==
NULL
)
{
return
-
ENETUNREACH
;
err
=
-
ENETUNREACH
;
goto
out
;
}
if
(
usax
)
{
if
(
usax
)
{
if
(
msg
->
msg_namelen
<
sizeof
(
sax
))
if
(
msg
->
msg_namelen
<
sizeof
(
sax
))
{
return
-
EINVAL
;
err
=
-
EINVAL
;
goto
out
;
}
sax
=
*
usax
;
sax
=
*
usax
;
if
(
ax25cmp
(
&
nr
->
dest_addr
,
&
sax
.
sax25_call
)
!=
0
)
if
(
ax25cmp
(
&
nr
->
dest_addr
,
&
sax
.
sax25_call
)
!=
0
)
{
return
-
EISCONN
;
err
=
-
EISCONN
;
if
(
sax
.
sax25_family
!=
AF_NETROM
)
goto
out
;
return
-
EINVAL
;
}
if
(
sax
.
sax25_family
!=
AF_NETROM
)
{
err
=
-
EINVAL
;
goto
out
;
}
}
else
{
}
else
{
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
{
return
-
ENOTCONN
;
err
=
-
ENOTCONN
;
goto
out
;
}
sax
.
sax25_family
=
AF_NETROM
;
sax
.
sax25_family
=
AF_NETROM
;
sax
.
sax25_call
=
nr
->
dest_addr
;
sax
.
sax25_call
=
nr
->
dest_addr
;
}
}
...
@@ -984,10 +1069,10 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,
...
@@ -984,10 +1069,10 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,
/* Build a packet */
/* Build a packet */
SOCK_DEBUG
(
sk
,
"NET/ROM: sendto: building packet.
\n
"
);
SOCK_DEBUG
(
sk
,
"NET/ROM: sendto: building packet.
\n
"
);
size
=
len
+
AX25_BPQ_HEADER_LEN
+
AX25_MAX_HEADER_LEN
+
NR_NETWORK_LEN
+
NR_TRANSPORT_LEN
;
size
=
len
+
NR_NETWORK_LEN
+
NR_TRANSPORT_LEN
;
if
((
skb
=
sock_alloc_send_skb
(
sk
,
size
,
msg
->
msg_flags
&
MSG_DONTWAIT
,
&
err
))
==
NULL
)
if
((
skb
=
sock_alloc_send_skb
(
sk
,
size
,
msg
->
msg_flags
&
MSG_DONTWAIT
,
&
err
))
==
NULL
)
return
err
;
goto
out
;
skb_reserve
(
skb
,
size
-
len
);
skb_reserve
(
skb
,
size
-
len
);
...
@@ -1022,12 +1107,16 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,
...
@@ -1022,12 +1107,16 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
{
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
{
kfree_skb
(
skb
);
kfree_skb
(
skb
);
return
-
ENOTCONN
;
err
=
-
ENOTCONN
;
goto
out
;
}
}
nr_output
(
sk
,
skb
);
/* Shove it onto the queue */
nr_output
(
sk
,
skb
);
/* Shove it onto the queue */
return
len
;
err
=
len
;
out:
release_sock
(
sk
);
return
err
;
}
}
static
int
nr_recvmsg
(
struct
kiocb
*
iocb
,
struct
socket
*
sock
,
static
int
nr_recvmsg
(
struct
kiocb
*
iocb
,
struct
socket
*
sock
,
...
@@ -1044,12 +1133,17 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock,
...
@@ -1044,12 +1133,17 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock,
* us! We do one quick check first though
* us! We do one quick check first though
*/
*/
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
lock_sock
(
sk
);
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
{
release_sock
(
sk
);
return
-
ENOTCONN
;
return
-
ENOTCONN
;
}
/* Now we can treat all alike */
/* Now we can treat all alike */
if
((
skb
=
skb_recv_datagram
(
sk
,
flags
&
~
MSG_DONTWAIT
,
flags
&
MSG_DONTWAIT
,
&
er
))
==
NULL
)
if
((
skb
=
skb_recv_datagram
(
sk
,
flags
&
~
MSG_DONTWAIT
,
flags
&
MSG_DONTWAIT
,
&
er
))
==
NULL
)
{
release_sock
(
sk
);
return
er
;
return
er
;
}
skb
->
h
.
raw
=
skb
->
data
;
skb
->
h
.
raw
=
skb
->
data
;
copied
=
skb
->
len
;
copied
=
skb
->
len
;
...
@@ -1070,6 +1164,7 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock,
...
@@ -1070,6 +1164,7 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock,
skb_free_datagram
(
sk
,
skb
);
skb_free_datagram
(
sk
,
skb
);
release_sock
(
sk
);
return
copied
;
return
copied
;
}
}
...
@@ -1077,13 +1172,16 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock,
...
@@ -1077,13 +1172,16 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock,
static
int
nr_ioctl
(
struct
socket
*
sock
,
unsigned
int
cmd
,
unsigned
long
arg
)
static
int
nr_ioctl
(
struct
socket
*
sock
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
{
struct
sock
*
sk
=
sock
->
sk
;
struct
sock
*
sk
=
sock
->
sk
;
int
ret
;
lock_sock
(
sk
);
switch
(
cmd
)
{
switch
(
cmd
)
{
case
TIOCOUTQ
:
{
case
TIOCOUTQ
:
{
long
amount
;
long
amount
;
amount
=
sk
->
sk_sndbuf
-
atomic_read
(
&
sk
->
sk_wmem_alloc
);
amount
=
sk
->
sk_sndbuf
-
atomic_read
(
&
sk
->
sk_wmem_alloc
);
if
(
amount
<
0
)
if
(
amount
<
0
)
amount
=
0
;
amount
=
0
;
release_sock
(
sk
);
return
put_user
(
amount
,
(
int
*
)
arg
);
return
put_user
(
amount
,
(
int
*
)
arg
);
}
}
...
@@ -1093,15 +1191,21 @@ static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
...
@@ -1093,15 +1191,21 @@ static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
/* These two are safe on a single CPU system as only user tasks fiddle here */
/* These two are safe on a single CPU system as only user tasks fiddle here */
if
((
skb
=
skb_peek
(
&
sk
->
sk_receive_queue
))
!=
NULL
)
if
((
skb
=
skb_peek
(
&
sk
->
sk_receive_queue
))
!=
NULL
)
amount
=
skb
->
len
;
amount
=
skb
->
len
;
release_sock
(
sk
);
return
put_user
(
amount
,
(
int
*
)
arg
);
return
put_user
(
amount
,
(
int
*
)
arg
);
}
}
case
SIOCGSTAMP
:
case
SIOCGSTAMP
:
if
(
sk
!=
NULL
)
{
if
(
sk
!=
NULL
)
{
if
(
!
sk
->
sk_stamp
.
tv_sec
)
if
(
!
sk
->
sk_stamp
.
tv_sec
)
{
release_sock
(
sk
);
return
-
ENOENT
;
return
-
ENOENT
;
return
copy_to_user
((
void
*
)
arg
,
&
sk
->
sk_stamp
,
sizeof
(
struct
timeval
))
?
-
EFAULT
:
0
;
}
ret
=
copy_to_user
((
void
*
)
arg
,
&
sk
->
sk_stamp
,
sizeof
(
struct
timeval
))
?
-
EFAULT
:
0
;
release_sock
(
sk
);
return
ret
;
}
}
release_sock
(
sk
);
return
-
EINVAL
;
return
-
EINVAL
;
case
SIOCGIFADDR
:
case
SIOCGIFADDR
:
...
@@ -1114,48 +1218,85 @@ static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
...
@@ -1114,48 +1218,85 @@ static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
case
SIOCSIFNETMASK
:
case
SIOCSIFNETMASK
:
case
SIOCGIFMETRIC
:
case
SIOCGIFMETRIC
:
case
SIOCSIFMETRIC
:
case
SIOCSIFMETRIC
:
release_sock
(
sk
);
return
-
EINVAL
;
return
-
EINVAL
;
case
SIOCADDRT
:
case
SIOCADDRT
:
case
SIOCDELRT
:
case
SIOCDELRT
:
case
SIOCNRDECOBS
:
case
SIOCNRDECOBS
:
release_sock
(
sk
);
if
(
!
capable
(
CAP_NET_ADMIN
))
return
-
EPERM
;
if
(
!
capable
(
CAP_NET_ADMIN
))
return
-
EPERM
;
return
nr_rt_ioctl
(
cmd
,
(
void
*
)
arg
);
return
nr_rt_ioctl
(
cmd
,
(
void
*
)
arg
);
default:
default:
release_sock
(
sk
);
return
dev_ioctl
(
cmd
,
(
void
*
)
arg
);
return
dev_ioctl
(
cmd
,
(
void
*
)
arg
);
}
}
release_sock
(
sk
);
return
0
;
return
0
;
}
}
static
int
nr_get_info
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
length
)
#ifdef CONFIG_PROC_FS
/* Marker for header entry */
#define NETROM_PROC_START ((void *)1)
static
void
*
nr_info_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
{
struct
sock
*
s
;
struct
sock
*
s
;
struct
hlist_node
*
node
;
struct
hlist_node
*
node
;
int
i
=
1
;
spin_lock_bh
(
&
nr_list_lock
);
if
(
*
pos
==
0
)
return
NETROM_PROC_START
;
sk_for_each
(
s
,
node
,
&
nr_list
)
{
if
(
i
==
*
pos
)
return
s
;
++
i
;
}
return
NULL
;
}
static
void
*
nr_info_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
++*
pos
;
return
(
v
==
NETROM_PROC_START
)
?
sk_head
(
&
nr_list
)
:
sk_next
((
struct
sock
*
)
v
);
}
static
void
nr_info_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
spin_unlock_bh
(
&
nr_list_lock
);
}
static
int
nr_info_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
struct
sock
*
s
=
v
;
struct
net_device
*
dev
;
struct
net_device
*
dev
;
nr_cb
*
nr
;
const
char
*
devname
;
const
char
*
devname
;
int
len
=
0
;
off_t
pos
=
0
;
off_t
begin
=
0
;
spin_lock_bh
(
&
nr_list_lock
);
if
(
v
==
NETROM_PROC_START
)
seq_puts
(
seq
,
"user_addr dest_node src_node dev my your st vs vr va t1 t2 t4 idle n2 wnd Snd-Q Rcv-Q inode
\n
"
);
len
+=
sprintf
(
buffer
,
"user_addr dest_node src_node dev my your st vs vr va t1 t2 t4 idle n2 wnd Snd-Q Rcv-Q inode
\n
"
);
else
{
sk_for_each
(
s
,
node
,
&
nr_list
)
{
bh_lock_sock
(
s
);
nr
_cb
*
nr
=
nr_sk
(
s
);
nr
=
nr_sk
(
s
);
if
((
dev
=
nr
->
device
)
==
NULL
)
if
((
dev
=
nr
->
device
)
==
NULL
)
devname
=
"???"
;
devname
=
"???"
;
else
else
devname
=
dev
->
name
;
devname
=
dev
->
name
;
len
+=
sprintf
(
buffer
+
len
,
"%-9s "
,
seq_printf
(
seq
,
"%-9s "
,
ax2asc
(
&
nr
->
user_addr
));
ax2asc
(
&
nr
->
user_addr
));
seq_printf
(
seq
,
"%-9s "
,
ax2asc
(
&
nr
->
dest_addr
));
len
+=
sprintf
(
buffer
+
len
,
"%-9s "
,
seq_printf
(
seq
,
ax2asc
(
&
nr
->
dest_addr
));
"%-9s %-3s %02X/%02X %02X/%02X %2d %3d %3d %3d %3lu/%03lu %2lu/%02lu %3lu/%03lu %3lu/%03lu %2d/%02d %3d %5d %5d %ld
\n
"
,
len
+=
sprintf
(
buffer
+
len
,
"%-9s %-3s %02X/%02X %02X/%02X %2d %3d %3d %3d %3lu/%03lu %2lu/%02lu %3lu/%03lu %3lu/%03lu %2d/%02d %3d %5d %5d %ld
\n
"
,
ax2asc
(
&
nr
->
source_addr
),
ax2asc
(
&
nr
->
source_addr
),
devname
,
devname
,
nr
->
my_index
,
nr
->
my_index
,
...
@@ -1181,27 +1322,31 @@ static int nr_get_info(char *buffer, char **start, off_t offset, int length)
...
@@ -1181,27 +1322,31 @@ static int nr_get_info(char *buffer, char **start, off_t offset, int length)
atomic_read
(
&
s
->
sk_rmem_alloc
),
atomic_read
(
&
s
->
sk_rmem_alloc
),
s
->
sk_socket
?
SOCK_INODE
(
s
->
sk_socket
)
->
i_ino
:
0L
);
s
->
sk_socket
?
SOCK_INODE
(
s
->
sk_socket
)
->
i_ino
:
0L
);
pos
=
begin
+
len
;
bh_unlock_sock
(
s
);
if
(
pos
<
offset
)
{
len
=
0
;
begin
=
pos
;
}
if
(
pos
>
offset
+
length
)
break
;
}
}
return
0
;
}
spin_unlock_bh
(
&
nr_list_lock
);
static
struct
seq_operations
nr_info_seqops
=
{
.
start
=
nr_info_start
,
*
start
=
buffer
+
(
offset
-
begin
);
.
next
=
nr_info_next
,
len
-=
(
offset
-
begin
);
.
stop
=
nr_info_stop
,
.
show
=
nr_info_show
,
if
(
len
>
length
)
};
len
=
length
;
static
int
nr_info_open
(
struct
inode
*
inode
,
struct
file
*
file
)
return
len
;
{
return
seq_open
(
file
,
&
nr_info_seqops
);
}
}
static
struct
file_operations
nr_info_fops
=
{
.
owner
=
THIS_MODULE
,
.
open
=
nr_info_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
seq_release
,
};
#endif
/* CONFIG_PROC_FS */
static
struct
net_proto_family
nr_family_ops
=
{
static
struct
net_proto_family
nr_family_ops
=
{
.
family
=
PF_NETROM
,
.
family
=
PF_NETROM
,
...
@@ -1234,7 +1379,7 @@ static struct notifier_block nr_dev_notifier = {
...
@@ -1234,7 +1379,7 @@ static struct notifier_block nr_dev_notifier = {
.
notifier_call
=
nr_device_event
,
.
notifier_call
=
nr_device_event
,
};
};
static
struct
net_device
*
dev_nr
;
static
struct
net_device
*
*
dev_nr
;
static
char
banner
[]
__initdata
=
KERN_INFO
"G4KLX NET/ROM for Linux. Version 0.7 for AX25.037 Linux 2.4
\n
"
;
static
char
banner
[]
__initdata
=
KERN_INFO
"G4KLX NET/ROM for Linux. Version 0.7 for AX25.037 Linux 2.4
\n
"
;
...
@@ -1247,20 +1392,39 @@ static int __init nr_proto_init(void)
...
@@ -1247,20 +1392,39 @@ static int __init nr_proto_init(void)
return
-
1
;
return
-
1
;
}
}
if
((
dev_nr
=
kmalloc
(
nr_ndevs
*
sizeof
(
struct
net_device
),
GFP_KERNEL
))
==
NULL
)
{
dev_nr
=
kmalloc
(
nr_ndevs
*
sizeof
(
struct
net_device
*
),
GFP_KERNEL
);
printk
(
KERN_ERR
"NET/ROM: nr_proto_init - unable to allocate device structure
\n
"
);
if
(
dev_nr
==
NULL
)
{
printk
(
KERN_ERR
"NET/ROM: nr_proto_init - unable to allocate device array
\n
"
);
return
-
1
;
return
-
1
;
}
}
memset
(
dev_nr
,
0x00
,
nr_ndevs
*
sizeof
(
struct
net_device
));
memset
(
dev_nr
,
0x00
,
nr_ndevs
*
sizeof
(
struct
net_device
*
));
for
(
i
=
0
;
i
<
nr_ndevs
;
i
++
)
{
for
(
i
=
0
;
i
<
nr_ndevs
;
i
++
)
{
sprintf
(
dev_nr
[
i
].
name
,
"nr%d"
,
i
);
char
name
[
IFNAMSIZ
];
dev_nr
[
i
].
init
=
nr_init
;
struct
net_device
*
dev
;
register_netdev
(
&
dev_nr
[
i
]);
sprintf
(
name
,
"nr%d"
,
i
);
dev
=
alloc_netdev
(
sizeof
(
struct
net_device_stats
),
name
,
nr_setup
);
if
(
!
dev
)
{
printk
(
KERN_ERR
"NET/ROM: nr_proto_init - unable to allocate device structure
\n
"
);
goto
fail
;
}
dev
->
base_addr
=
i
;
if
(
register_netdev
(
dev
))
{
printk
(
KERN_ERR
"NET/ROM: nr_proto_init - unable to register network device
\n
"
);
goto
fail
;
}
dev_nr
[
i
]
=
dev
;
}
}
sock_register
(
&
nr_family_ops
);
if
(
sock_register
(
&
nr_family_ops
))
{
printk
(
KERN_ERR
"NET/ROM: nr_proto_init - unable to register socket family
\n
"
);
goto
fail
;
}
register_netdevice_notifier
(
&
nr_dev_notifier
);
register_netdevice_notifier
(
&
nr_dev_notifier
);
printk
(
banner
);
printk
(
banner
);
...
@@ -1273,10 +1437,16 @@ static int __init nr_proto_init(void)
...
@@ -1273,10 +1437,16 @@ static int __init nr_proto_init(void)
nr_loopback_init
();
nr_loopback_init
();
proc_net_
create
(
"nr"
,
0
,
nr_get_info
);
proc_net_
fops_create
(
"nr"
,
S_IRUGO
,
&
nr_info_fops
);
proc_net_
create
(
"nr_neigh"
,
0
,
nr_neigh_get_info
);
proc_net_
fops_create
(
"nr_neigh"
,
S_IRUGO
,
&
nr_neigh_fops
);
proc_net_
create
(
"nr_nodes"
,
0
,
nr_nodes_get_info
);
proc_net_
fops_create
(
"nr_nodes"
,
S_IRUGO
,
&
nr_nodes_fops
);
return
0
;
return
0
;
fail:
while
(
--
i
>=
0
)
unregister_netdev
(
dev_nr
[
i
]);
kfree
(
dev_nr
);
return
-
1
;
}
}
module_init
(
nr_proto_init
);
module_init
(
nr_proto_init
);
...
@@ -1300,23 +1470,21 @@ static void __exit nr_exit(void)
...
@@ -1300,23 +1470,21 @@ static void __exit nr_exit(void)
nr_rt_free
();
nr_rt_free
();
ax25_protocol_release
(
AX25_P_NETROM
);
#ifdef CONFIG_SYSCTL
nr_unregister_sysctl
();
#endif
ax25_linkfail_release
(
nr_link_failed
);
ax25_linkfail_release
(
nr_link_failed
);
ax25_protocol_release
(
AX25_P_NETROM
);
unregister_netdevice_notifier
(
&
nr_dev_notifier
);
unregister_netdevice_notifier
(
&
nr_dev_notifier
);
#ifdef CONFIG_SYSCTL
nr_unregister_sysctl
();
#endif
sock_unregister
(
PF_NETROM
);
sock_unregister
(
PF_NETROM
);
for
(
i
=
0
;
i
<
nr_ndevs
;
i
++
)
{
for
(
i
=
0
;
i
<
nr_ndevs
;
i
++
)
{
if
(
dev_nr
[
i
].
priv
!=
NULL
)
{
struct
net_device
*
dev
=
dev_nr
[
i
];
kfree
(
dev_nr
[
i
].
priv
);
if
(
dev
)
dev_nr
[
i
].
priv
=
NULL
;
unregister_netdev
(
dev
);
unregister_netdev
(
&
dev_nr
[
i
]);
}
kfree
(
dev_nr
[
i
].
name
);
}
}
kfree
(
dev_nr
);
kfree
(
dev_nr
);
...
...
net/netrom/nr_dev.c
View file @
293f3e3f
...
@@ -159,11 +159,13 @@ static int nr_set_mac_address(struct net_device *dev, void *addr)
...
@@ -159,11 +159,13 @@ static int nr_set_mac_address(struct net_device *dev, void *addr)
{
{
struct
sockaddr
*
sa
=
addr
;
struct
sockaddr
*
sa
=
addr
;
ax25_listen_release
((
ax25_address
*
)
dev
->
dev_addr
,
NULL
);
if
(
dev
->
flags
&
IFF_UP
)
ax25_listen_release
((
ax25_address
*
)
dev
->
dev_addr
,
NULL
);
memcpy
(
dev
->
dev_addr
,
sa
->
sa_data
,
dev
->
addr_len
);
memcpy
(
dev
->
dev_addr
,
sa
->
sa_data
,
dev
->
addr_len
);
ax25_listen_register
((
ax25_address
*
)
dev
->
dev_addr
,
NULL
);
if
(
dev
->
flags
&
IFF_UP
)
ax25_listen_register
((
ax25_address
*
)
dev
->
dev_addr
,
NULL
);
return
0
;
return
0
;
}
}
...
@@ -177,8 +179,8 @@ static int nr_open(struct net_device *dev)
...
@@ -177,8 +179,8 @@ static int nr_open(struct net_device *dev)
static
int
nr_close
(
struct
net_device
*
dev
)
static
int
nr_close
(
struct
net_device
*
dev
)
{
{
netif_stop_queue
(
dev
);
ax25_listen_release
((
ax25_address
*
)
dev
->
dev_addr
,
NULL
);
ax25_listen_release
((
ax25_address
*
)
dev
->
dev_addr
,
NULL
);
netif_stop_queue
(
dev
);
return
0
;
return
0
;
}
}
...
@@ -195,30 +197,25 @@ static struct net_device_stats *nr_get_stats(struct net_device *dev)
...
@@ -195,30 +197,25 @@ static struct net_device_stats *nr_get_stats(struct net_device *dev)
return
(
struct
net_device_stats
*
)
dev
->
priv
;
return
(
struct
net_device_stats
*
)
dev
->
priv
;
}
}
int
nr_init
(
struct
net_device
*
dev
)
void
nr_setup
(
struct
net_device
*
dev
)
{
{
SET_MODULE_OWNER
(
dev
);
SET_MODULE_OWNER
(
dev
);
dev
->
mtu
=
NR_MAX_PACKET_SIZE
;
dev
->
mtu
=
NR_MAX_PACKET_SIZE
;
dev
->
hard_start_xmit
=
nr_xmit
;
dev
->
hard_start_xmit
=
nr_xmit
;
dev
->
open
=
nr_open
;
dev
->
open
=
nr_open
;
dev
->
stop
=
nr_close
;
dev
->
stop
=
nr_close
;
dev
->
destructor
=
(
void
(
*
)(
struct
net_device
*
))
kfree
;
dev
->
hard_header
=
nr_header
;
dev
->
hard_header
=
nr_header
;
dev
->
hard_header_len
=
AX25_BPQ_HEADER_LEN
+
AX25_MAX_HEADER_LEN
+
NR_NETWORK_LEN
+
NR_TRANSPORT_LEN
;
dev
->
hard_header_len
=
NR_NETWORK_LEN
+
NR_TRANSPORT_LEN
;
dev
->
addr_len
=
AX25_ADDR_LEN
;
dev
->
addr_len
=
AX25_ADDR_LEN
;
dev
->
type
=
ARPHRD_NETROM
;
dev
->
type
=
ARPHRD_NETROM
;
dev
->
tx_queue_len
=
40
;
dev
->
rebuild_header
=
nr_rebuild_header
;
dev
->
rebuild_header
=
nr_rebuild_header
;
dev
->
set_mac_address
=
nr_set_mac_address
;
dev
->
set_mac_address
=
nr_set_mac_address
;
/* New-style flags. */
/* New-style flags. */
dev
->
flags
=
0
;
dev
->
flags
=
0
;
if
((
dev
->
priv
=
kmalloc
(
sizeof
(
struct
net_device_stats
),
GFP_KERNEL
))
==
NULL
)
dev
->
get_stats
=
nr_get_stats
;
return
-
ENOMEM
;
}
memset
(
dev
->
priv
,
0
,
sizeof
(
struct
net_device_stats
));
dev
->
get_stats
=
nr_get_stats
;
return
0
;
};
net/netrom/nr_in.c
View file @
293f3e3f
...
@@ -74,6 +74,7 @@ static int nr_queue_rx_frame(struct sock *sk, struct sk_buff *skb, int more)
...
@@ -74,6 +74,7 @@ static int nr_queue_rx_frame(struct sock *sk, struct sk_buff *skb, int more)
static
int
nr_state1_machine
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
,
static
int
nr_state1_machine
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
,
int
frametype
)
int
frametype
)
{
{
bh_lock_sock
(
sk
);
switch
(
frametype
)
{
switch
(
frametype
)
{
case
NR_CONNACK
:
{
case
NR_CONNACK
:
{
nr_cb
*
nr
=
nr_sk
(
sk
);
nr_cb
*
nr
=
nr_sk
(
sk
);
...
@@ -102,6 +103,7 @@ static int nr_state1_machine(struct sock *sk, struct sk_buff *skb,
...
@@ -102,6 +103,7 @@ static int nr_state1_machine(struct sock *sk, struct sk_buff *skb,
default:
default:
break
;
break
;
}
}
bh_unlock_sock
(
sk
);
return
0
;
return
0
;
}
}
...
@@ -114,6 +116,7 @@ static int nr_state1_machine(struct sock *sk, struct sk_buff *skb,
...
@@ -114,6 +116,7 @@ static int nr_state1_machine(struct sock *sk, struct sk_buff *skb,
static
int
nr_state2_machine
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
,
static
int
nr_state2_machine
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
,
int
frametype
)
int
frametype
)
{
{
bh_lock_sock
(
sk
);
switch
(
frametype
)
{
switch
(
frametype
)
{
case
NR_CONNACK
|
NR_CHOKE_FLAG
:
case
NR_CONNACK
|
NR_CHOKE_FLAG
:
nr_disconnect
(
sk
,
ECONNRESET
);
nr_disconnect
(
sk
,
ECONNRESET
);
...
@@ -129,6 +132,7 @@ static int nr_state2_machine(struct sock *sk, struct sk_buff *skb,
...
@@ -129,6 +132,7 @@ static int nr_state2_machine(struct sock *sk, struct sk_buff *skb,
default:
default:
break
;
break
;
}
}
bh_unlock_sock
(
sk
);
return
0
;
return
0
;
}
}
...
@@ -150,6 +154,7 @@ static int nr_state3_machine(struct sock *sk, struct sk_buff *skb, int frametype
...
@@ -150,6 +154,7 @@ static int nr_state3_machine(struct sock *sk, struct sk_buff *skb, int frametype
nr
=
skb
->
data
[
18
];
nr
=
skb
->
data
[
18
];
ns
=
skb
->
data
[
17
];
ns
=
skb
->
data
[
17
];
bh_lock_sock
(
sk
);
switch
(
frametype
)
{
switch
(
frametype
)
{
case
NR_CONNREQ
:
case
NR_CONNREQ
:
nr_write_internal
(
sk
,
NR_CONNACK
);
nr_write_internal
(
sk
,
NR_CONNACK
);
...
@@ -260,6 +265,7 @@ static int nr_state3_machine(struct sock *sk, struct sk_buff *skb, int frametype
...
@@ -260,6 +265,7 @@ static int nr_state3_machine(struct sock *sk, struct sk_buff *skb, int frametype
default:
default:
break
;
break
;
}
}
bh_unlock_sock
(
sk
);
return
queued
;
return
queued
;
}
}
...
...
net/netrom/nr_route.c
View file @
293f3e3f
...
@@ -36,13 +36,49 @@
...
@@ -36,13 +36,49 @@
#include <linux/init.h>
#include <linux/init.h>
#include <linux/spinlock.h>
#include <linux/spinlock.h>
#include <net/netrom.h>
#include <net/netrom.h>
#include <linux/seq_file.h>
static
unsigned
int
nr_neigh_no
=
1
;
static
unsigned
int
nr_neigh_no
=
1
;
static
struct
nr_node
*
nr_node_list
;
static
HLIST_HEAD
(
nr_node_list
);
static
spinlock_t
nr_node_lock
;
static
spinlock_t
nr_node_list_lock
=
SPIN_LOCK_UNLOCKED
;
static
struct
nr_neigh
*
nr_neigh_list
;
static
HLIST_HEAD
(
nr_neigh_list
);
static
spinlock_t
nr_neigh_lock
;
static
spinlock_t
nr_neigh_list_lock
=
SPIN_LOCK_UNLOCKED
;
struct
nr_node
*
nr_node_get
(
ax25_address
*
callsign
)
{
struct
nr_node
*
found
=
NULL
;
struct
nr_node
*
nr_node
;
struct
hlist_node
*
node
;
spin_lock_bh
(
&
nr_node_list_lock
);
nr_node_for_each
(
nr_node
,
node
,
&
nr_node_list
)
if
(
ax25cmp
(
callsign
,
&
nr_node
->
callsign
)
==
0
)
{
nr_node_hold
(
nr_node
);
found
=
nr_node
;
break
;
}
spin_unlock_bh
(
&
nr_node_list_lock
);
return
found
;
}
struct
nr_neigh
*
nr_neigh_get_dev
(
ax25_address
*
callsign
,
struct
net_device
*
dev
)
{
struct
nr_neigh
*
found
=
NULL
;
struct
nr_neigh
*
nr_neigh
;
struct
hlist_node
*
node
;
spin_lock_bh
(
&
nr_neigh_list_lock
);
nr_neigh_for_each
(
nr_neigh
,
node
,
&
nr_neigh_list
)
if
(
ax25cmp
(
callsign
,
&
nr_neigh
->
callsign
)
==
0
&&
nr_neigh
->
dev
==
dev
)
{
nr_neigh_hold
(
nr_neigh
);
found
=
nr_neigh
;
break
;
}
spin_unlock_bh
(
&
nr_neigh_list_lock
);
return
found
;
}
static
void
nr_remove_neigh
(
struct
nr_neigh
*
);
static
void
nr_remove_neigh
(
struct
nr_neigh
*
);
...
@@ -57,17 +93,16 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
...
@@ -57,17 +93,16 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
struct
nr_neigh
*
nr_neigh
;
struct
nr_neigh
*
nr_neigh
;
struct
nr_route
nr_route
;
struct
nr_route
nr_route
;
int
i
,
found
;
int
i
,
found
;
struct
net_device
*
odev
;
if
(
nr_dev_get
(
nr
)
!=
NULL
)
/* Can't add routes to ourself */
if
((
odev
=
nr_dev_get
(
nr
))
!=
NULL
)
{
/* Can't add routes to ourself */
dev_put
(
odev
);
return
-
EINVAL
;
return
-
EINVAL
;
}
for
(
nr_node
=
nr_node_list
;
nr_node
!=
NULL
;
nr_node
=
nr_node
->
next
)
nr_node
=
nr_node_get
(
nr
);
if
(
ax25cmp
(
nr
,
&
nr_node
->
callsign
)
==
0
)
break
;
for
(
nr_neigh
=
nr_neigh_list
;
nr_neigh
!=
NULL
;
nr_neigh
=
nr_neigh
->
next
)
nr_neigh
=
nr_neigh_get_dev
(
ax25
,
dev
);
if
(
ax25cmp
(
ax25
,
&
nr_neigh
->
callsign
)
==
0
&&
nr_neigh
->
dev
==
dev
)
break
;
/*
/*
* The L2 link to a neighbour has failed in the past
* The L2 link to a neighbour has failed in the past
...
@@ -76,24 +111,36 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
...
@@ -76,24 +111,36 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
* routes now (and not wait for a node broadcast).
* routes now (and not wait for a node broadcast).
*/
*/
if
(
nr_neigh
!=
NULL
&&
nr_neigh
->
failed
!=
0
&&
quality
==
0
)
{
if
(
nr_neigh
!=
NULL
&&
nr_neigh
->
failed
!=
0
&&
quality
==
0
)
{
struct
nr_node
*
node
;
struct
nr_node
*
nr_nodet
;
struct
hlist_node
*
node
;
for
(
node
=
nr_node_list
;
node
!=
NULL
;
node
=
node
->
next
)
for
(
i
=
0
;
i
<
node
->
count
;
i
++
)
spin_lock_bh
(
&
nr_node_list_lock
);
if
(
node
->
routes
[
i
].
neighbour
==
nr_neigh
)
nr_node_for_each
(
nr_nodet
,
node
,
&
nr_node_list
)
{
if
(
i
<
node
->
which
)
nr_node_lock
(
nr_nodet
);
node
->
which
=
i
;
for
(
i
=
0
;
i
<
nr_nodet
->
count
;
i
++
)
if
(
nr_nodet
->
routes
[
i
].
neighbour
==
nr_neigh
)
if
(
i
<
nr_nodet
->
which
)
nr_nodet
->
which
=
i
;
nr_node_unlock
(
nr_nodet
);
}
spin_unlock_bh
(
&
nr_node_list_lock
);
}
}
if
(
nr_neigh
!=
NULL
)
if
(
nr_neigh
!=
NULL
)
nr_neigh
->
failed
=
0
;
nr_neigh
->
failed
=
0
;
if
(
quality
==
0
&&
nr_neigh
!=
NULL
&&
nr_node
!=
NULL
)
if
(
quality
==
0
&&
nr_neigh
!=
NULL
&&
nr_node
!=
NULL
)
{
nr_neigh_put
(
nr_neigh
);
nr_node_put
(
nr_node
);
return
0
;
return
0
;
}
if
(
nr_neigh
==
NULL
)
{
if
(
nr_neigh
==
NULL
)
{
if
((
nr_neigh
=
kmalloc
(
sizeof
(
*
nr_neigh
),
GFP_ATOMIC
))
==
NULL
)
if
((
nr_neigh
=
kmalloc
(
sizeof
(
*
nr_neigh
),
GFP_ATOMIC
))
==
NULL
)
{
if
(
nr_node
)
nr_node_put
(
nr_node
);
return
-
ENOMEM
;
return
-
ENOMEM
;
}
nr_neigh
->
callsign
=
*
ax25
;
nr_neigh
->
callsign
=
*
ax25
;
nr_neigh
->
digipeat
=
NULL
;
nr_neigh
->
digipeat
=
NULL
;
...
@@ -104,48 +151,58 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
...
@@ -104,48 +151,58 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
nr_neigh
->
count
=
0
;
nr_neigh
->
count
=
0
;
nr_neigh
->
number
=
nr_neigh_no
++
;
nr_neigh
->
number
=
nr_neigh_no
++
;
nr_neigh
->
failed
=
0
;
nr_neigh
->
failed
=
0
;
atomic_set
(
&
nr_neigh
->
refcount
,
1
);
if
(
ax25_digi
!=
NULL
&&
ax25_digi
->
ndigi
>
0
)
{
if
(
ax25_digi
!=
NULL
&&
ax25_digi
->
ndigi
>
0
)
{
if
((
nr_neigh
->
digipeat
=
kmalloc
(
sizeof
(
*
ax25_digi
),
GFP_KERNEL
))
==
NULL
)
{
if
((
nr_neigh
->
digipeat
=
kmalloc
(
sizeof
(
*
ax25_digi
),
GFP_KERNEL
))
==
NULL
)
{
kfree
(
nr_neigh
);
kfree
(
nr_neigh
);
if
(
nr_node
)
nr_node_put
(
nr_node
);
return
-
ENOMEM
;
return
-
ENOMEM
;
}
}
memcpy
(
nr_neigh
->
digipeat
,
ax25_digi
,
memcpy
(
nr_neigh
->
digipeat
,
ax25_digi
,
sizeof
(
*
ax25_digi
));
sizeof
(
*
ax25_digi
));
}
}
spin_lock_bh
(
&
nr_neigh_lock
);
spin_lock_bh
(
&
nr_neigh_l
ist_l
ock
);
nr_neigh
->
next
=
nr_neigh_list
;
hlist_add_head
(
&
nr_neigh
->
neigh_node
,
&
nr_neigh_list
)
;
nr_neigh_
list
=
nr_neigh
;
nr_neigh_
hold
(
nr_neigh
)
;
spin_unlock_bh
(
&
nr_neigh_lock
);
spin_unlock_bh
(
&
nr_neigh_l
ist_l
ock
);
}
}
if
(
quality
!=
0
&&
ax25cmp
(
nr
,
ax25
)
==
0
&&
!
nr_neigh
->
locked
)
if
(
quality
!=
0
&&
ax25cmp
(
nr
,
ax25
)
==
0
&&
!
nr_neigh
->
locked
)
nr_neigh
->
quality
=
quality
;
nr_neigh
->
quality
=
quality
;
if
(
nr_node
==
NULL
)
{
if
(
nr_node
==
NULL
)
{
if
((
nr_node
=
kmalloc
(
sizeof
(
*
nr_node
),
GFP_ATOMIC
))
==
NULL
)
if
((
nr_node
=
kmalloc
(
sizeof
(
*
nr_node
),
GFP_ATOMIC
))
==
NULL
)
{
if
(
nr_neigh
)
nr_neigh_put
(
nr_neigh
);
return
-
ENOMEM
;
return
-
ENOMEM
;
}
nr_node
->
callsign
=
*
nr
;
nr_node
->
callsign
=
*
nr
;
strcpy
(
nr_node
->
mnemonic
,
mnemonic
);
strcpy
(
nr_node
->
mnemonic
,
mnemonic
);
nr_node
->
which
=
0
;
nr_node
->
which
=
0
;
nr_node
->
count
=
1
;
nr_node
->
count
=
1
;
atomic_set
(
&
nr_node
->
refcount
,
1
);
nr_node
->
node_lock
=
SPIN_LOCK_UNLOCKED
;
nr_node
->
routes
[
0
].
quality
=
quality
;
nr_node
->
routes
[
0
].
quality
=
quality
;
nr_node
->
routes
[
0
].
obs_count
=
obs_count
;
nr_node
->
routes
[
0
].
obs_count
=
obs_count
;
nr_node
->
routes
[
0
].
neighbour
=
nr_neigh
;
nr_node
->
routes
[
0
].
neighbour
=
nr_neigh
;
spin_lock_bh
(
&
nr_node_lock
);
nr_neigh_hold
(
nr_neigh
);
nr_node
->
next
=
nr_node_list
;
nr_node_list
=
nr_node
;
spin_unlock_bh
(
&
nr_node_lock
);
nr_neigh
->
count
++
;
nr_neigh
->
count
++
;
spin_lock_bh
(
&
nr_node_list_lock
);
hlist_add_head
(
&
nr_node
->
node_node
,
&
nr_node_list
);
/* refcount initialized at 1 */
spin_unlock_bh
(
&
nr_node_list_lock
);
return
0
;
return
0
;
}
}
nr_node_lock
(
nr_node
);
if
(
quality
!=
0
)
if
(
quality
!=
0
)
strcpy
(
nr_node
->
mnemonic
,
mnemonic
);
strcpy
(
nr_node
->
mnemonic
,
mnemonic
);
...
@@ -171,11 +228,13 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
...
@@ -171,11 +228,13 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
nr_node
->
which
++
;
nr_node
->
which
++
;
nr_node
->
count
++
;
nr_node
->
count
++
;
nr_neigh_hold
(
nr_neigh
);
nr_neigh
->
count
++
;
nr_neigh
->
count
++
;
}
else
{
}
else
{
/* It must be better than the worst */
/* It must be better than the worst */
if
(
quality
>
nr_node
->
routes
[
2
].
quality
)
{
if
(
quality
>
nr_node
->
routes
[
2
].
quality
)
{
nr_node
->
routes
[
2
].
neighbour
->
count
--
;
nr_node
->
routes
[
2
].
neighbour
->
count
--
;
nr_neigh_put
(
nr_node
->
routes
[
2
].
neighbour
);
if
(
nr_node
->
routes
[
2
].
neighbour
->
count
==
0
&&
!
nr_node
->
routes
[
2
].
neighbour
->
locked
)
if
(
nr_node
->
routes
[
2
].
neighbour
->
count
==
0
&&
!
nr_node
->
routes
[
2
].
neighbour
->
locked
)
nr_remove_neigh
(
nr_node
->
routes
[
2
].
neighbour
);
nr_remove_neigh
(
nr_node
->
routes
[
2
].
neighbour
);
...
@@ -184,6 +243,7 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
...
@@ -184,6 +243,7 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
nr_node
->
routes
[
2
].
obs_count
=
obs_count
;
nr_node
->
routes
[
2
].
obs_count
=
obs_count
;
nr_node
->
routes
[
2
].
neighbour
=
nr_neigh
;
nr_node
->
routes
[
2
].
neighbour
=
nr_neigh
;
nr_neigh_hold
(
nr_neigh
);
nr_neigh
->
count
++
;
nr_neigh
->
count
++
;
}
}
}
}
...
@@ -244,62 +304,42 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
...
@@ -244,62 +304,42 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
}
}
}
}
nr_neigh_put
(
nr_neigh
);
nr_node_unlock
(
nr_node
);
nr_node_put
(
nr_node
);
return
0
;
return
0
;
}
}
static
void
nr_remove_node
(
struct
nr_node
*
nr_node
)
static
inline
void
__
nr_remove_node
(
struct
nr_node
*
nr_node
)
{
{
struct
nr_node
*
s
;
hlist_del_init
(
&
nr_node
->
node_node
);
nr_node_put
(
nr_node
);
spin_lock_bh
(
&
nr_node_lock
);
}
if
((
s
=
nr_node_list
)
==
nr_node
)
{
nr_node_list
=
nr_node
->
next
;
spin_unlock_bh
(
&
nr_node_lock
);
kfree
(
nr_node
);
return
;
}
while
(
s
!=
NULL
&&
s
->
next
!=
NULL
)
{
if
(
s
->
next
==
nr_node
)
{
s
->
next
=
nr_node
->
next
;
spin_unlock_bh
(
&
nr_node_lock
);
kfree
(
nr_node
);
return
;
}
s
=
s
->
next
;
#define nr_remove_node_locked(__node) \
}
__nr_remove_node(__node)
spin_unlock_bh
(
&
nr_node_lock
);
static
void
nr_remove_node
(
struct
nr_node
*
nr_node
)
{
spin_lock_bh
(
&
nr_node_list_lock
);
__nr_remove_node
(
nr_node
);
spin_unlock_bh
(
&
nr_node_list_lock
);
}
}
static
void
nr_remove_neigh
(
struct
nr_neigh
*
nr_neigh
)
static
inline
void
__
nr_remove_neigh
(
struct
nr_neigh
*
nr_neigh
)
{
{
struct
nr_neigh
*
s
;
hlist_del_init
(
&
nr_neigh
->
neigh_node
);
nr_neigh_put
(
nr_neigh
);
spin_lock_bh
(
&
nr_neigh_lock
);
}
if
((
s
=
nr_neigh_list
)
==
nr_neigh
)
{
nr_neigh_list
=
nr_neigh
->
next
;
spin_unlock_bh
(
&
nr_neigh_lock
);
if
(
nr_neigh
->
digipeat
!=
NULL
)
kfree
(
nr_neigh
->
digipeat
);
kfree
(
nr_neigh
);
return
;
}
while
(
s
!=
NULL
&&
s
->
next
!=
NULL
)
{
#define nr_remove_neigh_locked(__neigh) \
if
(
s
->
next
==
nr_neigh
)
{
__nr_remove_neigh(__neigh)
s
->
next
=
nr_neigh
->
next
;
spin_unlock_bh
(
&
nr_neigh_lock
);
if
(
nr_neigh
->
digipeat
!=
NULL
)
kfree
(
nr_neigh
->
digipeat
);
kfree
(
nr_neigh
);
return
;
}
s
=
s
->
next
;
static
void
nr_remove_neigh
(
struct
nr_neigh
*
nr_neigh
)
}
{
spin_unlock_bh
(
&
nr_neigh_lock
);
spin_lock_bh
(
&
nr_neigh_list_lock
);
__nr_remove_neigh
(
nr_neigh
);
spin_unlock_bh
(
&
nr_neigh_list_lock
);
}
}
/*
/*
...
@@ -312,26 +352,27 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
...
@@ -312,26 +352,27 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
struct
nr_neigh
*
nr_neigh
;
struct
nr_neigh
*
nr_neigh
;
int
i
;
int
i
;
for
(
nr_node
=
nr_node_list
;
nr_node
!=
NULL
;
nr_node
=
nr_node
->
next
)
nr_node
=
nr_node_get
(
callsign
);
if
(
ax25cmp
(
callsign
,
&
nr_node
->
callsign
)
==
0
)
break
;
if
(
nr_node
==
NULL
)
if
(
nr_node
==
NULL
)
return
-
EINVAL
;
return
-
EINVAL
;
for
(
nr_neigh
=
nr_neigh_list
;
nr_neigh
!=
NULL
;
nr_neigh
=
nr_neigh
->
next
)
nr_neigh
=
nr_neigh_get_dev
(
neighbour
,
dev
);
if
(
ax25cmp
(
neighbour
,
&
nr_neigh
->
callsign
)
==
0
&&
nr_neigh
->
dev
==
dev
)
break
;
if
(
nr_neigh
==
NULL
)
if
(
nr_neigh
==
NULL
)
{
nr_node_put
(
nr_node
);
return
-
EINVAL
;
return
-
EINVAL
;
}
nr_node_lock
(
nr_node
);
for
(
i
=
0
;
i
<
nr_node
->
count
;
i
++
)
{
for
(
i
=
0
;
i
<
nr_node
->
count
;
i
++
)
{
if
(
nr_node
->
routes
[
i
].
neighbour
==
nr_neigh
)
{
if
(
nr_node
->
routes
[
i
].
neighbour
==
nr_neigh
)
{
nr_neigh
->
count
--
;
nr_neigh
->
count
--
;
nr_neigh_put
(
nr_neigh
);
if
(
nr_neigh
->
count
==
0
&&
!
nr_neigh
->
locked
)
if
(
nr_neigh
->
count
==
0
&&
!
nr_neigh
->
locked
)
nr_remove_neigh
(
nr_neigh
);
nr_remove_neigh
(
nr_neigh
);
nr_neigh_put
(
nr_neigh
);
nr_node
->
count
--
;
nr_node
->
count
--
;
...
@@ -346,11 +387,16 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
...
@@ -346,11 +387,16 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
case
2
:
case
2
:
break
;
break
;
}
}
nr_node_put
(
nr_node
);
}
}
nr_node_unlock
(
nr_node
);
return
0
;
return
0
;
}
}
}
}
nr_neigh_put
(
nr_neigh
);
nr_node_unlock
(
nr_node
);
nr_node_put
(
nr_node
);
return
-
EINVAL
;
return
-
EINVAL
;
}
}
...
@@ -362,12 +408,12 @@ static int nr_add_neigh(ax25_address *callsign, ax25_digi *ax25_digi, struct net
...
@@ -362,12 +408,12 @@ static int nr_add_neigh(ax25_address *callsign, ax25_digi *ax25_digi, struct net
{
{
struct
nr_neigh
*
nr_neigh
;
struct
nr_neigh
*
nr_neigh
;
for
(
nr_neigh
=
nr_neigh_list
;
nr_neigh
!=
NULL
;
nr_neigh
=
nr_neigh
->
next
)
{
nr_neigh
=
nr_neigh_get_dev
(
callsign
,
dev
);
if
(
ax25cmp
(
callsign
,
&
nr_neigh
->
callsign
)
==
0
&&
nr_neigh
->
dev
==
dev
)
{
if
(
nr_neigh
)
{
nr_neigh
->
quality
=
quality
;
nr_neigh
->
quality
=
quality
;
nr_neigh
->
locked
=
1
;
nr_neigh
->
locked
=
1
;
return
0
;
nr_neigh_put
(
nr_neigh
)
;
}
return
0
;
}
}
if
((
nr_neigh
=
kmalloc
(
sizeof
(
*
nr_neigh
),
GFP_ATOMIC
))
==
NULL
)
if
((
nr_neigh
=
kmalloc
(
sizeof
(
*
nr_neigh
),
GFP_ATOMIC
))
==
NULL
)
...
@@ -382,6 +428,7 @@ static int nr_add_neigh(ax25_address *callsign, ax25_digi *ax25_digi, struct net
...
@@ -382,6 +428,7 @@ static int nr_add_neigh(ax25_address *callsign, ax25_digi *ax25_digi, struct net
nr_neigh
->
count
=
0
;
nr_neigh
->
count
=
0
;
nr_neigh
->
number
=
nr_neigh_no
++
;
nr_neigh
->
number
=
nr_neigh_no
++
;
nr_neigh
->
failed
=
0
;
nr_neigh
->
failed
=
0
;
atomic_set
(
&
nr_neigh
->
refcount
,
1
);
if
(
ax25_digi
!=
NULL
&&
ax25_digi
->
ndigi
>
0
)
{
if
(
ax25_digi
!=
NULL
&&
ax25_digi
->
ndigi
>
0
)
{
if
((
nr_neigh
->
digipeat
=
kmalloc
(
sizeof
(
*
ax25_digi
),
GFP_KERNEL
))
==
NULL
)
{
if
((
nr_neigh
->
digipeat
=
kmalloc
(
sizeof
(
*
ax25_digi
),
GFP_KERNEL
))
==
NULL
)
{
...
@@ -391,10 +438,10 @@ static int nr_add_neigh(ax25_address *callsign, ax25_digi *ax25_digi, struct net
...
@@ -391,10 +438,10 @@ static int nr_add_neigh(ax25_address *callsign, ax25_digi *ax25_digi, struct net
memcpy
(
nr_neigh
->
digipeat
,
ax25_digi
,
sizeof
(
*
ax25_digi
));
memcpy
(
nr_neigh
->
digipeat
,
ax25_digi
,
sizeof
(
*
ax25_digi
));
}
}
spin_lock_bh
(
&
nr_neigh_lock
);
spin_lock_bh
(
&
nr_neigh_l
ist_l
ock
);
nr_neigh
->
next
=
nr_neigh_list
;
hlist_add_head
(
&
nr_neigh
->
neigh_node
,
&
nr_neigh_list
)
;
nr_neigh_list
=
nr_neigh
;
/* refcount is initialized at 1 */
spin_unlock_bh
(
&
nr_neigh_lock
);
spin_unlock_bh
(
&
nr_neigh_l
ist_l
ock
);
return
0
;
return
0
;
}
}
...
@@ -407,9 +454,7 @@ static int nr_del_neigh(ax25_address *callsign, struct net_device *dev, unsigned
...
@@ -407,9 +454,7 @@ static int nr_del_neigh(ax25_address *callsign, struct net_device *dev, unsigned
{
{
struct
nr_neigh
*
nr_neigh
;
struct
nr_neigh
*
nr_neigh
;
for
(
nr_neigh
=
nr_neigh_list
;
nr_neigh
!=
NULL
;
nr_neigh
=
nr_neigh
->
next
)
nr_neigh
=
nr_neigh_get_dev
(
callsign
,
dev
);
if
(
ax25cmp
(
callsign
,
&
nr_neigh
->
callsign
)
==
0
&&
nr_neigh
->
dev
==
dev
)
break
;
if
(
nr_neigh
==
NULL
)
return
-
EINVAL
;
if
(
nr_neigh
==
NULL
)
return
-
EINVAL
;
...
@@ -418,6 +463,7 @@ static int nr_del_neigh(ax25_address *callsign, struct net_device *dev, unsigned
...
@@ -418,6 +463,7 @@ static int nr_del_neigh(ax25_address *callsign, struct net_device *dev, unsigned
if
(
nr_neigh
->
count
==
0
)
if
(
nr_neigh
->
count
==
0
)
nr_remove_neigh
(
nr_neigh
);
nr_remove_neigh
(
nr_neigh
);
nr_neigh_put
(
nr_neigh
);
return
0
;
return
0
;
}
}
...
@@ -430,15 +476,13 @@ static int nr_del_neigh(ax25_address *callsign, struct net_device *dev, unsigned
...
@@ -430,15 +476,13 @@ static int nr_del_neigh(ax25_address *callsign, struct net_device *dev, unsigned
static
int
nr_dec_obs
(
void
)
static
int
nr_dec_obs
(
void
)
{
{
struct
nr_neigh
*
nr_neigh
;
struct
nr_neigh
*
nr_neigh
;
struct
nr_node
*
s
,
*
nr_node
;
struct
nr_node
*
s
;
struct
hlist_node
*
node
,
*
nodet
;
int
i
;
int
i
;
nr_node
=
nr_node_list
;
spin_lock_bh
(
&
nr_node_list_lock
);
nr_node_for_each_safe
(
s
,
node
,
nodet
,
&
nr_node_list
)
{
while
(
nr_node
!=
NULL
)
{
nr_node_lock
(
s
);
s
=
nr_node
;
nr_node
=
nr_node
->
next
;
for
(
i
=
0
;
i
<
s
->
count
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
count
;
i
++
)
{
switch
(
s
->
routes
[
i
].
obs_count
)
{
switch
(
s
->
routes
[
i
].
obs_count
)
{
case
0
:
/* A locked entry */
case
0
:
/* A locked entry */
...
@@ -448,6 +492,7 @@ static int nr_dec_obs(void)
...
@@ -448,6 +492,7 @@ static int nr_dec_obs(void)
nr_neigh
=
s
->
routes
[
i
].
neighbour
;
nr_neigh
=
s
->
routes
[
i
].
neighbour
;
nr_neigh
->
count
--
;
nr_neigh
->
count
--
;
nr_neigh_put
(
nr_neigh
);
if
(
nr_neigh
->
count
==
0
&&
!
nr_neigh
->
locked
)
if
(
nr_neigh
->
count
==
0
&&
!
nr_neigh
->
locked
)
nr_remove_neigh
(
nr_neigh
);
nr_remove_neigh
(
nr_neigh
);
...
@@ -472,8 +517,10 @@ static int nr_dec_obs(void)
...
@@ -472,8 +517,10 @@ static int nr_dec_obs(void)
}
}
if
(
s
->
count
<=
0
)
if
(
s
->
count
<=
0
)
nr_remove_node
(
s
);
nr_remove_node_locked
(
s
);
nr_node_unlock
(
s
);
}
}
spin_unlock_bh
(
&
nr_node_list_lock
);
return
0
;
return
0
;
}
}
...
@@ -483,21 +530,17 @@ static int nr_dec_obs(void)
...
@@ -483,21 +530,17 @@ static int nr_dec_obs(void)
*/
*/
void
nr_rt_device_down
(
struct
net_device
*
dev
)
void
nr_rt_device_down
(
struct
net_device
*
dev
)
{
{
struct
nr_neigh
*
s
,
*
nr_neigh
=
nr_neigh_list
;
struct
nr_neigh
*
s
;
struct
nr_node
*
t
,
*
nr_node
;
struct
hlist_node
*
node
,
*
nodet
,
*
node2
,
*
node2t
;
struct
nr_node
*
t
;
int
i
;
int
i
;
while
(
nr_neigh
!=
NULL
)
{
spin_lock_bh
(
&
nr_neigh_list_lock
);
s
=
nr_neigh
;
nr_neigh_for_each_safe
(
s
,
node
,
nodet
,
&
nr_neigh_list
)
{
nr_neigh
=
nr_neigh
->
next
;
if
(
s
->
dev
==
dev
)
{
if
(
s
->
dev
==
dev
)
{
nr_node
=
nr_node_list
;
spin_lock_bh
(
&
nr_node_list_lock
);
nr_node_for_each_safe
(
t
,
node2
,
node2t
,
&
nr_node_list
)
{
while
(
nr_node
!=
NULL
)
{
nr_node_lock
(
t
);
t
=
nr_node
;
nr_node
=
nr_node
->
next
;
for
(
i
=
0
;
i
<
t
->
count
;
i
++
)
{
for
(
i
=
0
;
i
<
t
->
count
;
i
++
)
{
if
(
t
->
routes
[
i
].
neighbour
==
s
)
{
if
(
t
->
routes
[
i
].
neighbour
==
s
)
{
t
->
count
--
;
t
->
count
--
;
...
@@ -514,12 +557,15 @@ void nr_rt_device_down(struct net_device *dev)
...
@@ -514,12 +557,15 @@ void nr_rt_device_down(struct net_device *dev)
}
}
if
(
t
->
count
<=
0
)
if
(
t
->
count
<=
0
)
nr_remove_node
(
t
);
nr_remove_node_locked
(
t
);
nr_node_unlock
(
t
);
}
}
spin_unlock_bh
(
&
nr_node_list_lock
);
nr_remove_neigh
(
s
);
nr_remove_neigh
_locked
(
s
);
}
}
}
}
spin_unlock_bh
(
&
nr_neigh_list_lock
);
}
}
/*
/*
...
@@ -553,6 +599,8 @@ struct net_device *nr_dev_first(void)
...
@@ -553,6 +599,8 @@ struct net_device *nr_dev_first(void)
if
(
first
==
NULL
||
strncmp
(
dev
->
name
,
first
->
name
,
3
)
<
0
)
if
(
first
==
NULL
||
strncmp
(
dev
->
name
,
first
->
name
,
3
)
<
0
)
first
=
dev
;
first
=
dev
;
}
}
if
(
first
)
dev_hold
(
first
);
read_unlock
(
&
dev_base_lock
);
read_unlock
(
&
dev_base_lock
);
return
first
;
return
first
;
...
@@ -603,6 +651,7 @@ int nr_rt_ioctl(unsigned int cmd, void *arg)
...
@@ -603,6 +651,7 @@ int nr_rt_ioctl(unsigned int cmd, void *arg)
{
{
struct
nr_route_struct
nr_route
;
struct
nr_route_struct
nr_route
;
struct
net_device
*
dev
;
struct
net_device
*
dev
;
int
ret
;
switch
(
cmd
)
{
switch
(
cmd
)
{
case
SIOCADDRT
:
case
SIOCADDRT
:
...
@@ -610,23 +659,29 @@ int nr_rt_ioctl(unsigned int cmd, void *arg)
...
@@ -610,23 +659,29 @@ int nr_rt_ioctl(unsigned int cmd, void *arg)
return
-
EFAULT
;
return
-
EFAULT
;
if
((
dev
=
nr_ax25_dev_get
(
nr_route
.
device
))
==
NULL
)
if
((
dev
=
nr_ax25_dev_get
(
nr_route
.
device
))
==
NULL
)
return
-
EINVAL
;
return
-
EINVAL
;
if
(
nr_route
.
ndigis
<
0
||
nr_route
.
ndigis
>
AX25_MAX_DIGIS
)
if
(
nr_route
.
ndigis
<
0
||
nr_route
.
ndigis
>
AX25_MAX_DIGIS
)
{
dev_put
(
dev
);
return
-
EINVAL
;
return
-
EINVAL
;
}
switch
(
nr_route
.
type
)
{
switch
(
nr_route
.
type
)
{
case
NETROM_NODE
:
case
NETROM_NODE
:
ret
urn
nr_add_node
(
&
nr_route
.
callsign
,
ret
=
nr_add_node
(
&
nr_route
.
callsign
,
nr_route
.
mnemonic
,
nr_route
.
mnemonic
,
&
nr_route
.
neighbour
,
&
nr_route
.
neighbour
,
nr_call_to_digi
(
nr_route
.
ndigis
,
nr_route
.
digipeaters
),
nr_call_to_digi
(
nr_route
.
ndigis
,
nr_route
.
digipeaters
),
dev
,
nr_route
.
quality
,
dev
,
nr_route
.
quality
,
nr_route
.
obs_count
);
nr_route
.
obs_count
);
break
;
case
NETROM_NEIGH
:
case
NETROM_NEIGH
:
ret
urn
nr_add_neigh
(
&
nr_route
.
callsign
,
ret
=
nr_add_neigh
(
&
nr_route
.
callsign
,
nr_call_to_digi
(
nr_route
.
ndigis
,
nr_route
.
digipeaters
),
nr_call_to_digi
(
nr_route
.
ndigis
,
nr_route
.
digipeaters
),
dev
,
nr_route
.
quality
);
dev
,
nr_route
.
quality
);
break
;
default:
default:
ret
urn
-
EINVAL
;
ret
=
-
EINVAL
;
}
}
dev_put
(
dev
);
return
ret
;
case
SIOCDELRT
:
case
SIOCDELRT
:
if
(
copy_from_user
(
&
nr_route
,
arg
,
sizeof
(
struct
nr_route_struct
)))
if
(
copy_from_user
(
&
nr_route
,
arg
,
sizeof
(
struct
nr_route_struct
)))
...
@@ -635,14 +690,18 @@ int nr_rt_ioctl(unsigned int cmd, void *arg)
...
@@ -635,14 +690,18 @@ int nr_rt_ioctl(unsigned int cmd, void *arg)
return
-
EINVAL
;
return
-
EINVAL
;
switch
(
nr_route
.
type
)
{
switch
(
nr_route
.
type
)
{
case
NETROM_NODE
:
case
NETROM_NODE
:
ret
urn
nr_del_node
(
&
nr_route
.
callsign
,
ret
=
nr_del_node
(
&
nr_route
.
callsign
,
&
nr_route
.
neighbour
,
dev
);
&
nr_route
.
neighbour
,
dev
);
break
;
case
NETROM_NEIGH
:
case
NETROM_NEIGH
:
ret
urn
nr_del_neigh
(
&
nr_route
.
callsign
,
ret
=
nr_del_neigh
(
&
nr_route
.
callsign
,
dev
,
nr_route
.
quality
);
dev
,
nr_route
.
quality
);
break
;
default:
default:
ret
urn
-
EINVAL
;
ret
=
-
EINVAL
;
}
}
dev_put
(
dev
);
return
ret
;
case
SIOCNRDECOBS
:
case
SIOCNRDECOBS
:
return
nr_dec_obs
();
return
nr_dec_obs
();
...
@@ -660,22 +719,36 @@ int nr_rt_ioctl(unsigned int cmd, void *arg)
...
@@ -660,22 +719,36 @@ int nr_rt_ioctl(unsigned int cmd, void *arg)
*/
*/
void
nr_link_failed
(
ax25_cb
*
ax25
,
int
reason
)
void
nr_link_failed
(
ax25_cb
*
ax25
,
int
reason
)
{
{
struct
nr_neigh
*
nr_neigh
;
struct
nr_neigh
*
s
,
*
nr_neigh
=
NULL
;
struct
nr_node
*
nr_node
;
struct
hlist_node
*
node
;
struct
nr_node
*
nr_node
=
NULL
;
for
(
nr_neigh
=
nr_neigh_list
;
nr_neigh
!=
NULL
;
nr_neigh
=
nr_neigh
->
next
)
if
(
nr_neigh
->
ax25
==
ax25
)
spin_lock_bh
(
&
nr_neigh_list_lock
);
nr_neigh_for_each
(
s
,
node
,
&
nr_neigh_list
)
if
(
s
->
ax25
==
ax25
)
{
nr_neigh_hold
(
s
);
nr_neigh
=
s
;
break
;
break
;
}
spin_unlock_bh
(
&
nr_neigh_list_lock
);
if
(
nr_neigh
==
NULL
)
return
;
if
(
nr_neigh
==
NULL
)
return
;
nr_neigh
->
ax25
=
NULL
;
nr_neigh
->
ax25
=
NULL
;
// ax25_cb_put(ax25);
if
(
++
nr_neigh
->
failed
<
sysctl_netrom_link_fails_count
)
return
;
if
(
++
nr_neigh
->
failed
<
sysctl_netrom_link_fails_count
)
{
nr_neigh_put
(
nr_neigh
);
for
(
nr_node
=
nr_node_list
;
nr_node
!=
NULL
;
nr_node
=
nr_node
->
next
)
return
;
}
spin_lock_bh
(
&
nr_node_list_lock
);
nr_node_for_each
(
nr_node
,
node
,
&
nr_node_list
)
nr_node_lock
(
nr_node
);
if
(
nr_node
->
which
<
nr_node
->
count
&&
nr_node
->
routes
[
nr_node
->
which
].
neighbour
==
nr_neigh
)
if
(
nr_node
->
which
<
nr_node
->
count
&&
nr_node
->
routes
[
nr_node
->
which
].
neighbour
==
nr_neigh
)
nr_node
->
which
++
;
nr_node
->
which
++
;
nr_node_unlock
(
nr_node
);
spin_unlock_bh
(
&
nr_node_list_lock
);
nr_neigh_put
(
nr_neigh
);
}
}
/*
/*
...
@@ -689,6 +762,9 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
...
@@ -689,6 +762,9 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
struct
nr_node
*
nr_node
;
struct
nr_node
*
nr_node
;
struct
net_device
*
dev
;
struct
net_device
*
dev
;
unsigned
char
*
dptr
;
unsigned
char
*
dptr
;
ax25_cb
*
ax25s
;
int
ret
;
struct
sk_buff
*
skbn
;
nr_src
=
(
ax25_address
*
)(
skb
->
data
+
0
);
nr_src
=
(
ax25_address
*
)(
skb
->
data
+
0
);
...
@@ -700,98 +776,202 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
...
@@ -700,98 +776,202 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
if
((
dev
=
nr_dev_get
(
nr_dest
))
!=
NULL
)
{
/* Its for me */
if
((
dev
=
nr_dev_get
(
nr_dest
))
!=
NULL
)
{
/* Its for me */
if
(
ax25
==
NULL
)
/* Its from me */
if
(
ax25
==
NULL
)
/* Its from me */
ret
urn
nr_loopback_queue
(
skb
);
ret
=
nr_loopback_queue
(
skb
);
else
else
return
nr_rx_frame
(
skb
,
dev
);
ret
=
nr_rx_frame
(
skb
,
dev
);
dev_put
(
dev
);
return
ret
;
}
}
if
(
!
sysctl_netrom_routing_control
&&
ax25
!=
NULL
)
if
(
!
sysctl_netrom_routing_control
&&
ax25
!=
NULL
)
return
0
;
return
0
;
/* Its Time-To-Live has expired */
/* Its Time-To-Live has expired */
if
(
--
skb
->
data
[
14
]
==
0
)
if
(
skb
->
data
[
14
]
==
1
)
{
return
0
;
return
0
;
}
for
(
nr_node
=
nr_node_list
;
nr_node
!=
NULL
;
nr_node
=
nr_node
->
next
)
nr_node
=
nr_node_get
(
nr_dest
);
if
(
ax25cmp
(
nr_dest
,
&
nr_node
->
callsign
)
==
0
)
if
(
nr_node
==
NULL
)
break
;
return
0
;
nr_node_lock
(
nr_node
);
if
(
nr_node
==
NULL
||
nr_node
->
which
>=
nr_node
->
count
)
if
(
nr_node
->
which
>=
nr_node
->
count
)
{
nr_node_unlock
(
nr_node
);
nr_node_put
(
nr_node
);
return
0
;
return
0
;
}
nr_neigh
=
nr_node
->
routes
[
nr_node
->
which
].
neighbour
;
nr_neigh
=
nr_node
->
routes
[
nr_node
->
which
].
neighbour
;
if
((
dev
=
nr_dev_first
())
==
NULL
)
if
((
dev
=
nr_dev_first
())
==
NULL
)
{
nr_node_unlock
(
nr_node
);
nr_node_put
(
nr_node
);
return
0
;
}
/* We are going to change the netrom headers so we should get our
own skb, we also did not know until now how much header space
we had to reserve... - RXQ */
if
((
skbn
=
skb_copy_expand
(
skb
,
dev
->
hard_header_len
,
0
,
GFP_ATOMIC
))
==
NULL
)
{
nr_node_unlock
(
nr_node
);
nr_node_put
(
nr_node
);
dev_put
(
dev
);
return
0
;
return
0
;
}
kfree_skb
(
skb
);
skb
=
skbn
;
skb
->
data
[
14
]
--
;
dptr
=
skb_push
(
skb
,
1
);
dptr
=
skb_push
(
skb
,
1
);
*
dptr
=
AX25_P_NETROM
;
*
dptr
=
AX25_P_NETROM
;
nr_neigh
->
ax25
=
ax25_send_frame
(
skb
,
256
,
(
ax25_address
*
)
dev
->
dev_addr
,
&
nr_neigh
->
callsign
,
nr_neigh
->
digipeat
,
nr_neigh
->
dev
);
ax25s
=
ax25_send_frame
(
skb
,
256
,
(
ax25_address
*
)
dev
->
dev_addr
,
&
nr_neigh
->
callsign
,
nr_neigh
->
digipeat
,
nr_neigh
->
dev
);
if
(
nr_neigh
->
ax25
&&
ax25s
)
{
/* We were already holding this ax25_cb */
// ax25_cb_put(ax25s);
}
nr_neigh
->
ax25
=
ax25s
;
return
(
nr_neigh
->
ax25
!=
NULL
);
dev_put
(
dev
);
ret
=
(
nr_neigh
->
ax25
!=
NULL
);
nr_node_unlock
(
nr_node
);
nr_node_put
(
nr_node
);
return
ret
;
}
}
int
nr_nodes_get_info
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
length
)
#ifdef CONFIG_PROC_FS
#define NETROM_PROC_START ((void *) 1)
static
void
*
nr_node_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
{
struct
nr_node
*
nr_node
;
struct
nr_node
*
nr_node
;
int
len
=
0
;
struct
hlist_node
*
node
;
off_t
pos
=
0
;
int
i
=
1
;
off_t
begin
=
0
;
int
i
;
spin_lock_bh
(
&
nr_node_list_lock
);
if
(
*
pos
==
0
)
return
NETROM_PROC_START
;
nr_node_for_each
(
nr_node
,
node
,
&
nr_node_list
)
{
if
(
i
==
*
pos
)
return
nr_node
;
++
i
;
}
return
NULL
;
}
static
void
*
nr_node_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
struct
hlist_node
*
node
;
++*
pos
;
node
=
(
v
==
NETROM_PROC_START
)
?
nr_node_list
.
first
:
((
struct
nr_node
*
)
v
)
->
node_node
.
next
;
return
hlist_entry
(
node
,
struct
nr_node
,
node_node
);
}
static
void
nr_node_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
spin_unlock_bh
(
&
nr_node_list_lock
);
}
spin_lock_bh
(
&
nr_node_lock
);
static
int
nr_node_show
(
struct
seq_file
*
seq
,
void
*
v
)
len
+=
sprintf
(
buffer
,
"callsign mnemonic w n qual obs neigh qual obs neigh qual obs neigh
\n
"
);
{
int
i
;
for
(
nr_node
=
nr_node_list
;
nr_node
!=
NULL
;
nr_node
=
nr_node
->
next
)
{
if
(
v
==
NETROM_PROC_START
)
len
+=
sprintf
(
buffer
+
len
,
"%-9s %-7s %d %d"
,
seq_puts
(
seq
,
"callsign mnemonic w n qual obs neigh qual obs neigh qual obs neigh
\n
"
);
else
{
struct
nr_node
*
nr_node
=
v
;
nr_node_lock
(
nr_node
);
seq_printf
(
seq
,
"%-9s %-7s %d %d"
,
ax2asc
(
&
nr_node
->
callsign
),
ax2asc
(
&
nr_node
->
callsign
),
(
nr_node
->
mnemonic
[
0
]
==
'\0'
)
?
"*"
:
nr_node
->
mnemonic
,
(
nr_node
->
mnemonic
[
0
]
==
'\0'
)
?
"*"
:
nr_node
->
mnemonic
,
nr_node
->
which
+
1
,
nr_node
->
which
+
1
,
nr_node
->
count
);
nr_node
->
count
);
for
(
i
=
0
;
i
<
nr_node
->
count
;
i
++
)
{
for
(
i
=
0
;
i
<
nr_node
->
count
;
i
++
)
{
len
+=
sprintf
(
buffer
+
len
,
" %3d %d %05d"
,
seq_printf
(
seq
,
" %3d %d %05d"
,
nr_node
->
routes
[
i
].
quality
,
nr_node
->
routes
[
i
].
quality
,
nr_node
->
routes
[
i
].
obs_count
,
nr_node
->
routes
[
i
].
obs_count
,
nr_node
->
routes
[
i
].
neighbour
->
number
);
nr_node
->
routes
[
i
].
neighbour
->
number
);
}
}
nr_node_unlock
(
nr_node
);
seq_puts
(
seq
,
"
\n
"
);
}
return
0
;
}
len
+=
sprintf
(
buffer
+
len
,
"
\n
"
);
static
struct
seq_operations
nr_node_seqops
=
{
.
start
=
nr_node_start
,
.
next
=
nr_node_next
,
.
stop
=
nr_node_stop
,
.
show
=
nr_node_show
,
};
pos
=
begin
+
len
;
static
int
nr_node_info_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
return
seq_open
(
file
,
&
nr_node_seqops
);
}
if
(
pos
<
offset
)
{
struct
file_operations
nr_nodes_fops
=
{
len
=
0
;
.
owner
=
THIS_MODULE
,
begin
=
pos
;
.
open
=
nr_node_info_open
,
}
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
seq_release
,
};
if
(
pos
>
offset
+
length
)
static
void
*
nr_neigh_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
break
;
{
}
struct
nr_neigh
*
nr_neigh
;
spin_unlock_bh
(
&
nr_node_lock
);
struct
hlist_node
*
node
;
int
i
=
1
;
*
start
=
buffer
+
(
offset
-
begin
);
spin_lock_bh
(
&
nr_neigh_list_lock
);
len
-=
(
offset
-
begin
);
if
(
*
pos
==
0
)
return
NETROM_PROC_START
;
if
(
len
>
length
)
len
=
length
;
nr_neigh_for_each
(
nr_neigh
,
node
,
&
nr_neigh_list
)
{
if
(
i
==
*
pos
)
return
nr_neigh
;
}
return
NULL
;
}
return
len
;
static
void
*
nr_neigh_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
struct
hlist_node
*
node
;
++*
pos
;
node
=
(
v
==
NETROM_PROC_START
)
?
nr_neigh_list
.
first
:
((
struct
nr_neigh
*
)
v
)
->
neigh_node
.
next
;
return
hlist_entry
(
node
,
struct
nr_neigh
,
neigh_node
);
}
}
int
nr_neigh_get_info
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
length
)
static
void
nr_neigh_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
spin_unlock_bh
(
&
nr_neigh_list_lock
);
}
static
int
nr_neigh_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
{
struct
nr_neigh
*
nr_neigh
;
int
len
=
0
;
off_t
pos
=
0
;
off_t
begin
=
0
;
int
i
;
int
i
;
spin_lock_bh
(
&
nr_neigh_lock
);
if
(
v
==
NETROM_PROC_START
)
len
+=
sprintf
(
buffer
,
"addr callsign dev qual lock count failed digipeaters
\n
"
);
seq_puts
(
seq
,
"addr callsign dev qual lock count failed digipeaters
\n
"
);
else
{
struct
nr_neigh
*
nr_neigh
=
v
;
for
(
nr_neigh
=
nr_neigh_list
;
nr_neigh
!=
NULL
;
nr_neigh
=
nr_neigh
->
next
)
{
seq_printf
(
seq
,
"%05d %-9s %-4s %3d %d %3d %3d"
,
len
+=
sprintf
(
buffer
+
len
,
"%05d %-9s %-4s %3d %d %3d %3d"
,
nr_neigh
->
number
,
nr_neigh
->
number
,
ax2asc
(
&
nr_neigh
->
callsign
),
ax2asc
(
&
nr_neigh
->
callsign
),
nr_neigh
->
dev
?
nr_neigh
->
dev
->
name
:
"???"
,
nr_neigh
->
dev
?
nr_neigh
->
dev
->
name
:
"???"
,
...
@@ -802,51 +982,60 @@ int nr_neigh_get_info(char *buffer, char **start, off_t offset, int length)
...
@@ -802,51 +982,60 @@ int nr_neigh_get_info(char *buffer, char **start, off_t offset, int length)
if
(
nr_neigh
->
digipeat
!=
NULL
)
{
if
(
nr_neigh
->
digipeat
!=
NULL
)
{
for
(
i
=
0
;
i
<
nr_neigh
->
digipeat
->
ndigi
;
i
++
)
for
(
i
=
0
;
i
<
nr_neigh
->
digipeat
->
ndigi
;
i
++
)
len
+=
sprintf
(
buffer
+
len
,
" %s"
,
ax2asc
(
&
nr_neigh
->
digipeat
->
calls
[
i
]));
seq_printf
(
seq
,
" %s"
,
}
ax2asc
(
&
nr_neigh
->
digipeat
->
calls
[
i
]));
len
+=
sprintf
(
buffer
+
len
,
"
\n
"
);
pos
=
begin
+
len
;
if
(
pos
<
offset
)
{
len
=
0
;
begin
=
pos
;
}
}
if
(
pos
>
offset
+
length
)
seq_puts
(
seq
,
"
\n
"
);
break
;
}
}
return
0
;
}
spin_unlock_bh
(
&
nr_neigh_lock
);
static
struct
seq_operations
nr_neigh_seqops
=
{
.
start
=
nr_neigh_start
,
.
next
=
nr_neigh_next
,
.
stop
=
nr_neigh_stop
,
.
show
=
nr_neigh_show
,
};
*
start
=
buffer
+
(
offset
-
begin
);
static
int
nr_neigh_info_open
(
struct
inode
*
inode
,
struct
file
*
file
)
len
-=
(
offset
-
begin
);
{
return
seq_open
(
file
,
&
nr_neigh_seqops
);
}
if
(
len
>
length
)
len
=
length
;
struct
file_operations
nr_neigh_fops
=
{
.
owner
=
THIS_MODULE
,
.
open
=
nr_neigh_info_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
seq_release
,
};
return
len
;
#endif
}
/*
/*
* Free all memory associated with the nodes and routes lists.
* Free all memory associated with the nodes and routes lists.
*/
*/
void
__exit
nr_rt_free
(
void
)
void
__exit
nr_rt_free
(
void
)
{
{
struct
nr_neigh
*
s
,
*
nr_neigh
=
nr_neigh_list
;
struct
nr_neigh
*
s
=
NULL
;
struct
nr_node
*
t
,
*
nr_node
=
nr_node_list
;
struct
nr_node
*
t
=
NULL
;
struct
hlist_node
*
node
,
*
nodet
;
while
(
nr_node
!=
NULL
)
{
t
=
nr_node
;
spin_lock_bh
(
&
nr_neigh_list_lock
);
nr_node
=
nr_node
->
next
;
spin_lock_bh
(
&
nr_node_list_lock
);
nr_node_for_each_safe
(
t
,
node
,
nodet
,
&
nr_node_list
)
{
nr_remove_node
(
t
);
nr_node_lock
(
t
);
nr_remove_node_locked
(
t
);
nr_node_unlock
(
t
);
}
}
nr_neigh_for_each_safe
(
s
,
node
,
nodet
,
&
nr_neigh_list
)
{
while
(
nr_neigh
!=
NULL
)
{
while
(
s
->
count
)
{
s
=
nr_neigh
;
s
->
count
--
;
nr_neigh
=
nr_neigh
->
next
;
nr_neigh_put
(
s
)
;
}
nr_remove_neigh
(
s
);
nr_remove_neigh
_locked
(
s
);
}
}
spin_unlock_bh
(
&
nr_node_list_lock
);
spin_unlock_bh
(
&
nr_neigh_list_lock
);
}
}
net/netrom/nr_subr.c
View file @
293f3e3f
...
@@ -127,7 +127,7 @@ void nr_write_internal(struct sock *sk, int frametype)
...
@@ -127,7 +127,7 @@ void nr_write_internal(struct sock *sk, int frametype)
unsigned
char
*
dptr
;
unsigned
char
*
dptr
;
int
len
,
timeout
;
int
len
,
timeout
;
len
=
AX25_BPQ_HEADER_LEN
+
AX25_MAX_HEADER_LEN
+
NR_NETWORK_LEN
+
NR_TRANSPORT_LEN
;
len
=
NR_NETWORK_LEN
+
NR_TRANSPORT_LEN
;
switch
(
frametype
&
0x0F
)
{
switch
(
frametype
&
0x0F
)
{
case
NR_CONNREQ
:
case
NR_CONNREQ
:
...
@@ -151,7 +151,7 @@ void nr_write_internal(struct sock *sk, int frametype)
...
@@ -151,7 +151,7 @@ void nr_write_internal(struct sock *sk, int frametype)
/*
/*
* Space for AX.25 and NET/ROM network header
* Space for AX.25 and NET/ROM network header
*/
*/
skb_reserve
(
skb
,
AX25_BPQ_HEADER_LEN
+
AX25_MAX_HEADER_LEN
+
NR_NETWORK_LEN
);
skb_reserve
(
skb
,
NR_NETWORK_LEN
);
dptr
=
skb_put
(
skb
,
skb_tailroom
(
skb
));
dptr
=
skb_put
(
skb
,
skb_tailroom
(
skb
));
...
@@ -219,12 +219,12 @@ void nr_transmit_refusal(struct sk_buff *skb, int mine)
...
@@ -219,12 +219,12 @@ void nr_transmit_refusal(struct sk_buff *skb, int mine)
unsigned
char
*
dptr
;
unsigned
char
*
dptr
;
int
len
;
int
len
;
len
=
AX25_BPQ_HEADER_LEN
+
AX25_MAX_HEADER_LEN
+
NR_NETWORK_LEN
+
NR_TRANSPORT_LEN
+
1
;
len
=
NR_NETWORK_LEN
+
NR_TRANSPORT_LEN
+
1
;
if
((
skbn
=
alloc_skb
(
len
,
GFP_ATOMIC
))
==
NULL
)
if
((
skbn
=
alloc_skb
(
len
,
GFP_ATOMIC
))
==
NULL
)
return
;
return
;
skb_reserve
(
skbn
,
AX25_BPQ_HEADER_LEN
+
AX25_MAX_HEADER_LEN
);
skb_reserve
(
skbn
,
0
);
dptr
=
skb_put
(
skbn
,
NR_NETWORK_LEN
+
NR_TRANSPORT_LEN
);
dptr
=
skb_put
(
skbn
,
NR_NETWORK_LEN
+
NR_TRANSPORT_LEN
);
...
...
net/netrom/nr_timer.c
View file @
293f3e3f
...
@@ -143,7 +143,10 @@ static void nr_heartbeat_expiry(unsigned long param)
...
@@ -143,7 +143,10 @@ static void nr_heartbeat_expiry(unsigned long param)
is accepted() it isn't 'dead' so doesn't get removed. */
is accepted() it isn't 'dead' so doesn't get removed. */
if
(
sock_flag
(
sk
,
SOCK_DESTROY
)
||
if
(
sock_flag
(
sk
,
SOCK_DESTROY
)
||
(
sk
->
sk_state
==
TCP_LISTEN
&&
sock_flag
(
sk
,
SOCK_DEAD
)))
{
(
sk
->
sk_state
==
TCP_LISTEN
&&
sock_flag
(
sk
,
SOCK_DEAD
)))
{
sock_hold
(
sk
);
nr_destroy_socket
(
sk
);
nr_destroy_socket
(
sk
);
bh_unlock_sock
(
sk
);
sock_put
(
sk
);
return
;
return
;
}
}
break
;
break
;
...
@@ -227,6 +230,7 @@ static void nr_t1timer_expiry(unsigned long param)
...
@@ -227,6 +230,7 @@ static void nr_t1timer_expiry(unsigned long param)
case
NR_STATE_1
:
case
NR_STATE_1
:
if
(
nr
->
n2count
==
nr
->
n2
)
{
if
(
nr
->
n2count
==
nr
->
n2
)
{
nr_disconnect
(
sk
,
ETIMEDOUT
);
nr_disconnect
(
sk
,
ETIMEDOUT
);
bh_unlock_sock
(
sk
);
return
;
return
;
}
else
{
}
else
{
nr
->
n2count
++
;
nr
->
n2count
++
;
...
@@ -237,6 +241,7 @@ static void nr_t1timer_expiry(unsigned long param)
...
@@ -237,6 +241,7 @@ static void nr_t1timer_expiry(unsigned long param)
case
NR_STATE_2
:
case
NR_STATE_2
:
if
(
nr
->
n2count
==
nr
->
n2
)
{
if
(
nr
->
n2count
==
nr
->
n2
)
{
nr_disconnect
(
sk
,
ETIMEDOUT
);
nr_disconnect
(
sk
,
ETIMEDOUT
);
bh_unlock_sock
(
sk
);
return
;
return
;
}
else
{
}
else
{
nr
->
n2count
++
;
nr
->
n2count
++
;
...
@@ -247,6 +252,7 @@ static void nr_t1timer_expiry(unsigned long param)
...
@@ -247,6 +252,7 @@ static void nr_t1timer_expiry(unsigned long param)
case
NR_STATE_3
:
case
NR_STATE_3
:
if
(
nr
->
n2count
==
nr
->
n2
)
{
if
(
nr
->
n2count
==
nr
->
n2
)
{
nr_disconnect
(
sk
,
ETIMEDOUT
);
nr_disconnect
(
sk
,
ETIMEDOUT
);
bh_unlock_sock
(
sk
);
return
;
return
;
}
else
{
}
else
{
nr
->
n2count
++
;
nr
->
n2count
++
;
...
...
net/netrom/sysctl_net_netrom.c
View file @
293f3e3f
...
@@ -15,9 +15,9 @@
...
@@ -15,9 +15,9 @@
/*
/*
* Values taken from NET/ROM documentation.
* Values taken from NET/ROM documentation.
*/
*/
static
int
min_quality
[
1
],
max_quality
[]
=
{
255
};
static
int
min_quality
[
]
=
{
0
},
max_quality
[]
=
{
255
};
static
int
min_obs
[
1
],
max_obs
[]
=
{
255
};
static
int
min_obs
[
]
=
{
0
},
max_obs
[]
=
{
255
};
static
int
min_ttl
[
1
],
max_ttl
[]
=
{
255
};
static
int
min_ttl
[
]
=
{
0
},
max_ttl
[]
=
{
255
};
static
int
min_t1
[]
=
{
5
*
HZ
};
static
int
min_t1
[]
=
{
5
*
HZ
};
static
int
max_t1
[]
=
{
600
*
HZ
};
static
int
max_t1
[]
=
{
600
*
HZ
};
static
int
min_n2
[]
=
{
2
},
max_n2
[]
=
{
127
};
static
int
min_n2
[]
=
{
2
},
max_n2
[]
=
{
127
};
...
@@ -28,7 +28,7 @@ static int max_t4[] = {1000 * HZ};
...
@@ -28,7 +28,7 @@ static int max_t4[] = {1000 * HZ};
static
int
min_window
[]
=
{
1
},
max_window
[]
=
{
127
};
static
int
min_window
[]
=
{
1
},
max_window
[]
=
{
127
};
static
int
min_idle
[]
=
{
0
*
HZ
};
static
int
min_idle
[]
=
{
0
*
HZ
};
static
int
max_idle
[]
=
{
65535
*
HZ
};
static
int
max_idle
[]
=
{
65535
*
HZ
};
static
int
min_route
[
1
],
max_route
[]
=
{
1
};
static
int
min_route
[
]
=
{
0
},
max_route
[]
=
{
1
};
static
int
min_fails
[]
=
{
1
},
max_fails
[]
=
{
10
};
static
int
min_fails
[]
=
{
1
},
max_fails
[]
=
{
10
};
static
struct
ctl_table_header
*
nr_table_header
;
static
struct
ctl_table_header
*
nr_table_header
;
...
...
net/sunrpc/sysctl.c
View file @
293f3e3f
...
@@ -102,7 +102,7 @@ proc_dodebug(ctl_table *table, int write, struct file *file,
...
@@ -102,7 +102,7 @@ proc_dodebug(ctl_table *table, int write, struct file *file,
len
=
sprintf
(
tmpbuf
,
"%d"
,
*
(
unsigned
int
*
)
table
->
data
);
len
=
sprintf
(
tmpbuf
,
"%d"
,
*
(
unsigned
int
*
)
table
->
data
);
if
(
len
>
left
)
if
(
len
>
left
)
len
=
left
;
len
=
left
;
copy_to_user
(
buffer
,
tmpbuf
,
len
);
__
copy_to_user
(
buffer
,
tmpbuf
,
len
);
if
((
left
-=
len
)
>
0
)
{
if
((
left
-=
len
)
>
0
)
{
put_user
(
'\n'
,
(
char
*
)
buffer
+
len
);
put_user
(
'\n'
,
(
char
*
)
buffer
+
len
);
left
--
;
left
--
;
...
...
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