Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
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
Show 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:
Dag Arne Osvik (Serpent)
Brian Gladman (AES)
SHA1 algorithm contributors:
Jean-Francois Dive
...
...
@@ -214,6 +213,9 @@ AES algorithm contributors:
Kyle McMartin
Adam J. Richter
CAST5 algorithm contributors:
Kartikey Mahendra Bhatt (original developers unknown, FSF copyright).
Generic scatterwalk code by Adam J. Richter <adam@yggdrasil.com>
Please send any credits updates or corrections to:
...
...
crypto/Kconfig
View file @
293f3e3f
...
...
@@ -126,6 +126,13 @@ config CRYPTO_AES
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
tristate "Deflate compression algorithm"
depends on CRYPTO
...
...
crypto/Makefile
View file @
293f3e3f
...
...
@@ -20,6 +20,7 @@ obj-$(CONFIG_CRYPTO_BLOWFISH) += blowfish.o
obj-$(CONFIG_CRYPTO_TWOFISH)
+=
twofish.o
obj-$(CONFIG_CRYPTO_SERPENT)
+=
serpent.o
obj-$(CONFIG_CRYPTO_AES)
+=
aes.o
obj-$(CONFIG_CRYPTO_CAST5)
+=
cast5.o
obj-$(CONFIG_CRYPTO_DEFLATE)
+=
deflate.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)
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
test_deflate
(
void
)
{
...
...
@@ -2304,6 +2400,7 @@ do_test(void)
test_sha384
();
test_sha512
();
test_deflate
();
test_cast5
();
#ifdef CONFIG_CRYPTO_HMAC
test_hmac_md5
();
test_hmac_sha1
();
...
...
@@ -2363,6 +2460,10 @@ do_test(void)
test_deflate
();
break
;
case
14
:
test_cast5
();
break
;
#ifdef CONFIG_CRYPTO_HMAC
case
100
:
test_hmac_md5
();
...
...
crypto/tcrypt.h
View file @
293f3e3f
...
...
@@ -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.
*/
...
...
drivers/atm/lanai.c
View file @
293f3e3f
...
...
@@ -514,6 +514,16 @@ static inline void conf2_write(const struct lanai_dev *lanai)
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
)
{
DPRINTK
(
"about to reset board
\n
"
);
...
...
@@ -616,11 +626,12 @@ static int __init sram_test_word(
u32
readback
;
sram_write
(
lanai
,
pattern
,
offset
);
readback
=
sram_read
(
lanai
,
offset
);
if
(
readback
==
pattern
)
if
(
likely
(
readback
==
pattern
)
)
return
0
;
printk
(
KERN_ERR
DEV_LABEL
"(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
;
}
...
...
@@ -721,9 +732,9 @@ static inline void cardvcc_write(const struct lanai_vcc *lvcc,
APRINTK
(
lvcc
->
vbase
!=
0
,
"cardvcc_write: unbound vcc!
\n
"
);
APRINTK
((
val
&
~
0xFFFF
)
==
0
,
"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
"
,
lvcc
->
vci
,
(
int
)
offset
,
val
);
lvcc
->
vci
,
(
unsigned
int
)
offset
,
(
unsigned
int
)
val
);
writel
(
val
,
lvcc
->
vbase
+
(
bus_addr_t
)
offset
);
}
...
...
@@ -981,7 +992,8 @@ static int __init eeprom_read(struct lanai_dev *lanai)
clock_l
();
udelay
(
5
);
send_stop
();
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
;
error:
...
...
@@ -1032,14 +1044,14 @@ static int __init eeprom_validate(struct lanai_dev *lanai)
if
(
s
!=
e
[
EEPROM_CHECKSUM
])
{
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): EEPROM checksum bad "
"(wanted 0x%02X, got 0x%02X)
\n
"
,
lanai
->
number
,
s
,
e
[
EEPROM_CHECKSUM
]);
(
unsigned
int
)
s
,
(
unsigned
int
)
e
[
EEPROM_CHECKSUM
]);
return
-
EIO
;
}
s
^=
0xFF
;
if
(
s
!=
e
[
EEPROM_CHECKSUM_REV
])
{
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): EEPROM inverse checksum "
"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
;
}
/* Verify MAC address */
...
...
@@ -1048,7 +1060,8 @@ static int __init eeprom_validate(struct lanai_dev *lanai)
printk
(
KERN_ERR
DEV_LABEL
"(itf %d) : EEPROM MAC addresses don't match "
"(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
;
}
DPRINTK
(
"eeprom: MAC address = %02X:%02X:%02X:%02X:%02X:%02X
\n
"
,
...
...
@@ -1060,10 +1073,10 @@ static int __init eeprom_validate(struct lanai_dev *lanai)
if
((
lanai
->
serialno
^
v
)
!=
0xFFFFFFFF
)
{
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): EEPROM serial numbers "
"don't match (0x%08X, inverse 0x%08X)
\n
"
,
lanai
->
number
,
lanai
->
serialno
,
v
);
(
unsigned
int
)
lanai
->
serialno
,
(
unsigned
int
)
v
);
return
-
EIO
;
}
DPRINTK
(
"eeprom: Serial number = %d
\n
"
,
lanai
->
serialno
);
DPRINTK
(
"eeprom: Serial number = %d
\n
"
,
(
unsigned
int
)
lanai
->
serialno
);
/* Verify magic number */
lanai
->
magicno
=
eeprom_be4
(
lanai
,
EEPROM_MAGIC
);
v
=
eeprom_be4
(
lanai
,
EEPROM_MAGIC_REV
);
...
...
@@ -1077,7 +1090,8 @@ static int __init eeprom_validate(struct lanai_dev *lanai)
if
(
lanai
->
magicno
!=
EEPROM_MAGIC_VALUE
)
printk
(
KERN_WARNING
DEV_LABEL
"(itf %d): warning - EEPROM "
"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
;
}
...
...
@@ -1313,7 +1327,7 @@ static inline void lanai_endtx(const struct lanai_dev *lanai,
* updating the register. Still, we should make sure
*/
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 "
"always busy!
\n
"
,
lanai
->
number
);
break
;
...
...
@@ -1508,13 +1522,14 @@ static void vcc_rx_aal5(struct lanai_vcc *lvcc, int endptr)
if
(
n
<
0
)
n
+=
lanai_buf_size
(
&
lvcc
->
rx
.
buf
);
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
));
/* Recover the second-to-last word to get true pdu length */
if
((
x
=
&
end
[
-
2
])
<
lvcc
->
rx
.
buf
.
start
)
x
=
&
lvcc
->
rx
.
buf
.
end
[
-
2
];
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 "
"on vci=%d - size=%d n=%d
\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)
goto
out
;
}
skb
=
atm_alloc_charge
(
lvcc
->
rx
.
atmvcc
,
size
,
GFP_ATOMIC
);
if
(
skb
==
NULL
)
{
if
(
unlikely
(
skb
==
NULL
)
)
{
lvcc
->
stats
.
rx_nomem
++
;
goto
out
;
}
...
...
@@ -1563,7 +1578,7 @@ static int __init vcc_table_allocate(struct lanai_dev *lanai)
#else
int
bytes
=
(
lanai
->
num_vci
)
*
sizeof
(
struct
lanai_vcc
*
);
lanai
->
vccs
=
(
struct
lanai_vcc
**
)
vmalloc
(
bytes
);
if
(
lanai
->
vccs
==
NULL
)
if
(
unlikely
(
lanai
->
vccs
==
NULL
)
)
return
-
ENOMEM
;
memset
(
lanai
->
vccs
,
0
,
bytes
);
return
0
;
...
...
@@ -1584,7 +1599,7 @@ static inline struct lanai_vcc *new_lanai_vcc(void)
{
struct
lanai_vcc
*
lvcc
;
lvcc
=
(
struct
lanai_vcc
*
)
kmalloc
(
sizeof
(
*
lvcc
),
GFP_KERNEL
);
if
(
l
vcc
!=
NULL
)
{
if
(
l
ikely
(
lvcc
!=
NULL
)
)
{
lvcc
->
vbase
=
0
;
lvcc
->
rx
.
atmvcc
=
lvcc
->
tx
.
atmvcc
=
NULL
;
lvcc
->
nref
=
0
;
...
...
@@ -1605,18 +1620,18 @@ static int lanai_get_sized_buffer(struct lanai_dev *lanai,
int
min
,
const
char
*
name
)
{
int
size
;
if
(
max_sdu
<
1
)
if
(
unlikely
(
max_sdu
<
1
)
)
max_sdu
=
1
;
max_sdu
=
aal5_size
(
max_sdu
);
size
=
(
max_sdu
+
16
)
*
multiplier
+
16
;
lanai_buf_allocate
(
buf
,
size
,
min
,
lanai
->
pci
);
if
(
buf
->
start
==
NULL
)
if
(
unlikely
(
buf
->
start
==
NULL
)
)
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 "
"for %s buffer, got only %
d
\n
"
,
lanai
->
number
,
size
,
nam
e
,
lanai_buf_size
(
buf
));
DPRINTK
(
"Allocated %
d
byte %s buffer
\n
"
,
lanai_buf_size
(
buf
),
name
);
"for %s buffer, got only %
Zu
\n
"
,
lanai
->
number
,
siz
e
,
name
,
lanai_buf_size
(
buf
));
DPRINTK
(
"Allocated %
Zu
byte %s buffer
\n
"
,
lanai_buf_size
(
buf
),
name
);
return
0
;
}
...
...
@@ -1706,9 +1721,9 @@ static int __init service_buffer_allocate(struct lanai_dev *lanai)
{
lanai_buf_allocate
(
&
lanai
->
service
,
SERVICE_ENTRIES
*
4
,
8
,
lanai
->
pci
);
if
(
lanai
->
service
.
start
==
NULL
)
if
(
unlikely
(
lanai
->
service
.
start
==
NULL
)
)
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
,
lanai_buf_size
(
&
lanai
->
service
),
lanai_buf_size_cardorder
(
&
lanai
->
service
));
...
...
@@ -1746,10 +1761,10 @@ static int handle_service(struct lanai_dev *lanai, u32 s)
struct
lanai_vcc
*
lvcc
;
vcclist_read_lock
();
lvcc
=
lanai
->
vccs
[
vci
];
if
(
lvcc
==
NULL
)
{
if
(
unlikely
(
lvcc
==
NULL
)
)
{
vcclist_read_unlock
();
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
)
lanai
->
stats
.
service_novcc_tx
++
;
else
...
...
@@ -1757,10 +1772,10 @@ static int handle_service(struct lanai_dev *lanai, u32 s)
return
0
;
}
if
(
s
&
SERVICE_TX
)
{
/* segmentation interrupt */
if
(
lvcc
->
tx
.
atmvcc
==
NULL
)
{
if
(
unlikely
(
lvcc
->
tx
.
atmvcc
==
NULL
)
)
{
vcclist_read_unlock
();
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
++
;
return
0
;
}
...
...
@@ -1769,22 +1784,22 @@ static int handle_service(struct lanai_dev *lanai, u32 s)
vcclist_read_unlock
();
return
1
;
}
if
(
lvcc
->
rx
.
atmvcc
==
NULL
)
{
if
(
unlikely
(
lvcc
->
rx
.
atmvcc
==
NULL
)
)
{
vcclist_read_unlock
();
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
++
;
return
0
;
}
if
(
lvcc
->
rx
.
atmvcc
->
qos
.
aal
!=
ATM_AAL5
)
{
if
(
unlikely
(
lvcc
->
rx
.
atmvcc
->
qos
.
aal
!=
ATM_AAL5
)
)
{
vcclist_read_unlock
();
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
++
;
atomic_inc
(
&
lvcc
->
rx
.
atmvcc
->
stats
->
rx_err
);
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
));
vcclist_read_unlock
();
return
0
;
...
...
@@ -1917,6 +1932,9 @@ static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason)
ack
|=
reason
&
(
INT_AAL0_STR
|
INT_AAL0
);
vcc_rx_aal0
(
lanai
);
}
/* The rest of the interrupts are pretty rare */
if
(
ack
==
reason
)
goto
done
;
if
(
reason
&
INT_STATS
)
{
reason
&=
~
INT_STATS
;
/* No need to ack */
get_statistics
(
lanai
);
...
...
@@ -1925,11 +1943,11 @@ static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason)
ack
|=
reason
&
INT_STATUS
;
lanai_check_status
(
lanai
);
}
if
(
reason
&
INT_DMASHUT
)
{
if
(
unlikely
(
reason
&
INT_DMASHUT
)
)
{
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): driver error - DMA "
"shutdown, reason=0x%08X, address=0x%08X
\n
"
,
lanai
->
number
,
reason
&
INT_DMASHUT
,
reg_read
(
lanai
,
DMA_Addr_Reg
));
lanai
->
number
,
(
unsigned
int
)
(
reason
&
INT_DMASHUT
)
,
(
unsigned
int
)
reg_read
(
lanai
,
DMA_Addr_Reg
));
if
(
reason
&
INT_TABORTBM
)
{
lanai_reset
(
lanai
);
return
;
...
...
@@ -1941,32 +1959,35 @@ static inline void lanai_int_1(struct lanai_dev *lanai, u32 reason)
lanai
->
stats
.
dma_reenable
++
;
pcistatus_check
(
lanai
,
0
);
}
if
(
reason
&
INT_TABORTSENT
)
{
if
(
unlikely
(
reason
&
INT_TABORTSENT
)
)
{
ack
|=
(
reason
&
INT_TABORTSENT
);
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): sent PCI target abort
\n
"
,
lanai
->
number
);
pcistatus_check
(
lanai
,
0
);
}
if
(
reason
&
INT_SEGSHUT
)
{
if
(
unlikely
(
reason
&
INT_SEGSHUT
)
)
{
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): driver error - "
"segmentation shutdown, reason=0x%08X
\n
"
,
lanai
->
number
,
reason
&
INT_SEGSHUT
);
(
unsigned
int
)
(
reason
&
INT_SEGSHUT
)
);
lanai_reset
(
lanai
);
return
;
}
if
(
reason
&
(
INT_PING
|
INT_WAKE
))
{
if
(
unlikely
(
reason
&
(
INT_PING
|
INT_WAKE
)
))
{
printk
(
KERN_ERR
DEV_LABEL
"(itf %d): driver error - "
"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
);
return
;
}
#ifdef DEBUG
if
(
ack
!=
reason
)
{
DPRINTK
(
"unacked ints: 0x%08X
\n
"
,
reason
&
~
ack
);
if
(
unlikely
(
ack
!=
reason
))
{
DPRINTK
(
"unacked ints: 0x%08X
\n
"
,
(
unsigned
int
)
(
reason
&
~
ack
));
ack
=
reason
;
}
#endif
done:
if
(
ack
!=
0
)
reg_write
(
lanai
,
ack
,
IntAck_Reg
);
}
...
...
@@ -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
;
u32
reason
;
int
handled
=
0
;
(
void
)
irq
;
(
void
)
regs
;
/* unused variables */
#ifdef USE_POWERDOWN
if
(
lanai
->
conf1
&
CONFIG1_POWERDOWN
)
{
lanai
->
conf1
&=
~
CONFIG1_POWERDOWN
;
conf1_write
(
lanai
);
printk
(
KERN_WARNING
DEV_LABEL
"(itf %d): Got interrupt "
"0x%08X while in POWERDOWN, powering up
\n
"
,
lanai
->
conf1
,
intr_pending
(
lanai
));
conf2_write
(
lanai
);
}
/*
* If we're powered down we shouldn't be generating any interrupts -
* so assume that this is a shared interrupt line and it's for someone
* else
*/
if
(
unlikely
(
lanai
->
conf1
&
CONFIG1_POWERDOWN
))
return
IRQ_NONE
;
#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
);
}
return
IRQ_RETVAL
(
handled
);
reason
=
intr_pending
(
lanai
);
}
while
(
reason
!=
0
);
return
IRQ_HANDLED
;
}
/* 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)
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
,
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
)
{
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
;
}
if
(
revp
!=
NULL
)
...
...
@@ -2058,7 +2087,8 @@ static int __init lanai_pci_start(struct lanai_dev *lanai)
"PCI_SUBSYSTEM_ID: %d
\n
"
,
lanai
->
number
,
result
);
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
;
/* Set latency timer to zero as per lanai docs */
result
=
pci_write_config_byte
(
pci
,
PCI_LATENCY_TIMER
,
0
);
...
...
@@ -2089,10 +2119,7 @@ static inline int vci0_is_ok(struct lanai_dev *lanai,
if
(
lanai
->
naal0
!=
0
)
return
0
;
lanai
->
conf2
|=
CONFIG2_VCI0_NORMAL
;
#ifdef USE_POWERDOWN
if
((
lanai
->
conf1
&
CONFIG1_POWERDOWN
)
==
0
)
#endif
conf2_write
(
lanai
);
conf2_write_if_powerup
(
lanai
);
}
return
1
;
}
...
...
@@ -2107,7 +2134,7 @@ static int vci_is_ok(struct lanai_dev *lanai, vci_t vci,
const
struct
lanai_vcc
*
lvcc
=
lanai
->
vccs
[
vci
];
if
(
vci
==
0
&&
!
vci0_is_ok
(
lanai
,
qos
))
return
0
;
if
(
lvcc
!=
NULL
)
{
if
(
unlikely
(
lvcc
!=
NULL
)
)
{
if
(
qos
->
rxtp
.
traffic_class
!=
ATM_NONE
&&
lvcc
->
rx
.
atmvcc
!=
NULL
&&
lvcc
->
rx
.
atmvcc
!=
atmvcc
)
return
0
;
...
...
@@ -2124,10 +2151,7 @@ static int vci_is_ok(struct lanai_dev *lanai, vci_t vci,
if
(
vci0
!=
NULL
&&
vci0
->
rx
.
atmvcc
!=
NULL
)
return
0
;
lanai
->
conf2
&=
~
CONFIG2_VCI0_NORMAL
;
#ifdef USE_POWERDOWN
if
((
lanai
->
conf1
&
CONFIG1_POWERDOWN
)
==
0
)
#endif
conf2_write
(
lanai
);
conf2_write_if_powerup
(
lanai
);
}
return
1
;
}
...
...
@@ -2332,15 +2356,16 @@ static int __init lanai_dev_open(struct atm_dev *atmdev)
#endif
memcpy
(
atmdev
->
esi
,
eeprom_mac
(
lanai
),
ESI_LEN
);
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
,
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
[
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
,
lanai
->
type
==
lanai2
?
"2"
:
"HB"
,
lanai
->
serialno
,
lanai
->
serialno
,
lanai
->
board_rev
);
lanai
->
type
==
lanai2
?
"2"
:
"HB"
,
(
unsigned
int
)
lanai
->
serialno
,
(
unsigned
int
)
lanai
->
serialno
,
lanai
->
board_rev
);
return
0
;
error_vcctable:
...
...
@@ -2435,7 +2460,8 @@ static int lanai_open(struct atm_vcc *atmvcc, short vpi, int vci)
(
vpi
==
ATM_VPI_UNSPEC
)
||
(
vci
==
ATM_VCI_UNSPEC
))
return
-
EINVAL
;
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
;
atmvcc
->
vpi
=
vpi
;
atmvcc
->
vci
=
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
)
return
-
EINVAL
;
#if 0
DPRINTK(DEV_LABEL "(itf %d): open %d.%d flags=0x%X\n",
lanai->number, vpi, vci, (unsigned long) atmvcc->flags);
DPRINTK(DEV_LABEL "(itf %d): open %d.%d flags=0x%
l
X\n",
lanai->number,
(int)
vpi, vci, (unsigned long) atmvcc->flags);
#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
if
(
lvcc
==
NULL
&&
(
lvcc
=
new_lanai_vcc
())
==
NULL
)
if
(
lvcc
==
NULL
)
{
lvcc
=
new_lanai_vcc
();
if
(
unlikely
(
lvcc
==
NULL
))
return
-
ENOMEM
;
atmvcc
->
dev_data
=
lvcc
;
}
lvcc
->
nref
++
;
if
(
atmvcc
->
qos
.
rxtp
.
traffic_class
!=
ATM_NONE
)
{
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)
}
else
result
=
lanai_setup_rx_vci_aal5
(
lanai
,
lvcc
,
&
atmvcc
->
qos
);
if
(
result
!=
0
)
if
(
unlikely
(
result
!=
0
)
)
goto
out_free
;
lvcc
->
rx
.
atmvcc
=
atmvcc
;
lvcc
->
stats
.
rx_nomem
=
0
;
...
...
@@ -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
"
,
vci
);
result
=
lanai_setup_tx_vci
(
lanai
,
lvcc
,
&
atmvcc
->
qos
);
if
(
result
!=
0
)
if
(
unlikely
(
result
!=
0
)
)
goto
out_free
;
lvcc
->
tx
.
atmvcc
=
atmvcc
;
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)
get_statistics(lanai);
return 0;
case 2200003: {
int i;
unsigned
int i;
for (i = 0; i <= 0x5C ; i += 4) {
if (i==0x48) /* Write-only butt reg */
continue;
printk(KERN_CRIT DEV_LABEL " 0x%02X: "
"0x%08X\n", i,
(u
32
) readl(lanai->base + i));
(u
nsigned int
) readl(lanai->base + i));
barrier(); mb();
pcistatus_check(lanai, 0);
barrier(); mb();
...
...
@@ -2544,36 +2574,37 @@ static int lanai_ioctl(struct atm_dev *atmdev, unsigned int cmd, void *arg)
u32 dw;
struct pci_dev *pci = lanai->pci;
(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);
DPRINTK("device = 0x%X\n", w);
DPRINTK("device = 0x%X\n",
(unsigned int)
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);
DPRINTK("status = 0x%X\n", w);
DPRINTK("status = 0x%X\n",
(unsigned int)
w);
(void) pci_read_config_dword(pci,
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,
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);
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);
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);
DPRINTK("bist = 0x%X\n", b);
DPRINTK("bist = 0x%X\n",
(unsigned int)
b);
/* skipping a few here */
(void) pci_read_config_byte(pci,
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,
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);
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);
DPRINTK("max_lat = 0x%X\n", b); }
DPRINTK("max_lat = 0x%X\n",
(unsigned int)
b); }
return 0;
#ifdef USE_POWERDOWN
case 2200005:
...
...
@@ -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_dev
*
lanai
=
(
struct
lanai_dev
*
)
atmvcc
->
dev
->
dev_data
;
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
;
#ifdef DEBUG
if
(
skb
==
NULL
)
{
if
(
unlikely
(
skb
==
NULL
)
)
{
DPRINTK
(
"lanai_send: skb==NULL for vci=%d
\n
"
,
atmvcc
->
vci
);
goto
einval
;
}
if
(
lanai
==
NULL
)
{
if
(
unlikely
(
lanai
==
NULL
)
)
{
DPRINTK
(
"lanai_send: lanai==NULL for vci=%d
\n
"
,
atmvcc
->
vci
);
goto
einval
;
}
...
...
@@ -2617,7 +2649,7 @@ static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb)
spin_unlock_irqrestore
(
&
lanai
->
txlock
,
flags
);
return
0
;
case
ATM_AAL0
:
if
(
skb
->
len
!=
ATM_CELL_SIZE
-
1
)
if
(
unlikely
(
skb
->
len
!=
ATM_CELL_SIZE
-
1
)
)
goto
einval
;
/* NOTE - this next line is technically invalid - we haven't unshared skb */
cpu_to_be32s
((
u32
*
)
skb
->
data
);
...
...
@@ -2626,7 +2658,7 @@ static int lanai_send(struct atm_vcc *atmvcc, struct sk_buff *skb)
spin_unlock_irqrestore
(
&
lanai
->
txlock
,
flags
);
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
);
einval:
lanai_free_skb
(
atmvcc
,
skb
);
...
...
@@ -2649,12 +2681,13 @@ static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
struct
lanai_vcc
*
lvcc
;
if
(
left
--
==
0
)
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"
,
lanai
->
serialno
,
lanai
->
magicno
,
lanai
->
num_vci
);
(
unsigned
int
)
lanai
->
serialno
,
(
unsigned
int
)
lanai
->
magicno
,
lanai
->
num_vci
);
if
(
left
--
==
0
)
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
)
return
sprintf
(
page
,
"EEPROM ESI: "
"%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)
(
lanai
->
status
&
STATUS_LED
)
?
1
:
0
,
(
lanai
->
status
&
STATUS_GPIN
)
?
1
:
0
);
if
(
left
--
==
0
)
return
sprintf
(
page
,
"global buffer sizes: service=%
d
, "
"aal0_rx=%
d
\n
"
,
lanai_buf_size
(
&
lanai
->
service
),
return
sprintf
(
page
,
"global buffer sizes: service=%
Zu
, "
"aal0_rx=%
Zu
\n
"
,
lanai_buf_size
(
&
lanai
->
service
),
lanai
->
naal0
?
lanai_buf_size
(
&
lanai
->
aal0buf
)
:
0
);
if
(
left
--
==
0
)
{
get_statistics
(
lanai
);
return
sprintf
(
page
,
"cells in error: overflow=%
d
, "
"closed_vci=%
d, bad_HEC=%d, rx_fifo=%d
\n
"
,
return
sprintf
(
page
,
"cells in error: overflow=%
u
, "
"closed_vci=%
u, bad_HEC=%u, rx_fifo=%u
\n
"
,
lanai
->
stats
.
ovfl_trash
,
lanai
->
stats
.
vci_trash
,
lanai
->
stats
.
hec_err
,
lanai
->
stats
.
atm_ovfl
);
}
if
(
left
--
==
0
)
return
sprintf
(
page
,
"PCI errors: parity_detect=%
d
, "
"master_abort=%
d, master_target_abort=%d
,
\n
"
,
return
sprintf
(
page
,
"PCI errors: parity_detect=%
u
, "
"master_abort=%
u, master_target_abort=%u
,
\n
"
,
lanai
->
stats
.
pcierr_parity_detect
,
lanai
->
stats
.
pcierr_serr_set
,
lanai
->
stats
.
pcierr_m_target_abort
);
if
(
left
--
==
0
)
return
sprintf
(
page
,
" slave_target_abort=%
d
, "
"master_parity=%
d
\n
"
,
lanai
->
stats
.
pcierr_s_target_abort
,
return
sprintf
(
page
,
" slave_target_abort=%
u
, "
"master_parity=%
u
\n
"
,
lanai
->
stats
.
pcierr_s_target_abort
,
lanai
->
stats
.
pcierr_master_parity
);
if
(
left
--
==
0
)
return
sprintf
(
page
,
"service list errors: no_vcc_rx=%
d
, "
"no_vcc_tx=%
d
,
\n
"
,
lanai
->
stats
.
service_novcc_rx
,
return
sprintf
(
page
,
"service list errors: no_vcc_rx=%
u
, "
"no_vcc_tx=%
u
,
\n
"
,
lanai
->
stats
.
service_novcc_rx
,
lanai
->
stats
.
service_novcc_tx
);
if
(
left
--
==
0
)
return
sprintf
(
page
,
" no_tx=%
d
, "
"no_rx=%
d, bad_rx_aal=%d
\n
"
,
lanai
->
stats
.
service_norx
,
return
sprintf
(
page
,
" no_tx=%
u
, "
"no_rx=%
u, bad_rx_aal=%u
\n
"
,
lanai
->
stats
.
service_norx
,
lanai
->
stats
.
service_notx
,
lanai
->
stats
.
service_rxnotaal5
);
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
);
/* At this point, "left" should be the VCI we're looking for */
vcclist_read_lock
();
...
...
@@ -2715,15 +2748,15 @@ static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
(
*
pos
)
++
;
}
/* 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
);
if
(
lvcc
->
rx
.
atmvcc
!=
NULL
)
{
left
+=
sprintf
(
&
page
[
left
],
",
\n
rx_AAL=%d"
,
lvcc
->
rx
.
atmvcc
->
qos
.
aal
==
ATM_AAL5
?
5
:
0
);
if
(
lvcc
->
rx
.
atmvcc
->
qos
.
aal
==
ATM_AAL5
)
left
+=
sprintf
(
&
page
[
left
],
", rx_buf_size=%
d
, "
"rx_bad_len=%
d,
\n
rx_service_trash=%d
, "
"rx_service_stream=%
d, rx_bad_crc=%d
"
,
left
+=
sprintf
(
&
page
[
left
],
", rx_buf_size=%
Zu
, "
"rx_bad_len=%
u,
\n
rx_service_trash=%u
, "
"rx_service_stream=%
u, rx_bad_crc=%u
"
,
lanai_buf_size
(
&
lvcc
->
rx
.
buf
),
lvcc
->
stats
.
x
.
aal5
.
rx_badlen
,
lvcc
->
stats
.
x
.
aal5
.
service_trash
,
...
...
@@ -2732,7 +2765,7 @@ static int lanai_proc_read(struct atm_dev *atmdev, loff_t *pos, char *page)
}
if
(
lvcc
->
tx
.
atmvcc
!=
NULL
)
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
,
lanai_buf_size
(
&
lvcc
->
tx
.
buf
),
lvcc
->
tx
.
atmvcc
==
lanai
->
cbrvcc
?
'C'
:
'U'
,
...
...
drivers/net/hamradio/bpqether.c
View file @
293f3e3f
...
...
@@ -75,6 +75,7 @@
#include <linux/interrupt.h>
#include <linux/notifier.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/netfilter.h>
#include <linux/module.h>
...
...
@@ -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_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
=
{
.
type
=
__constant_htons
(
ETH_P_BPQ
),
...
...
@@ -113,15 +114,16 @@ static struct notifier_block bpq_dev_notifier = {
#define MAXBPQDEV 100
static
struct
bpqdev
{
struct
bpqdev
*
next
;
char
ethname
[
14
];
/* ether device name */
struct
bpqdev
{
struct
list_head
bpq_list
;
/* list of bpq devices chain */
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 */
char
dest_addr
[
6
];
/* ether destination address */
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)
{
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
)
return
&
bpq
->
axdev
;
return
bpq
->
axdev
;
}
return
NULL
;
}
...
...
@@ -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
skb
->
sk
=
NULL
;
/* Initially we don't know who it's for */
rcu_read_lock
();
dev
=
bpq_get_ax25_dev
(
dev
);
if
(
dev
==
NULL
||
!
netif_running
(
dev
))
{
kfree_skb
(
skb
);
return
0
;
}
if
(
dev
==
NULL
||
!
netif_running
(
dev
))
goto
drop
;
/*
* 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
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
));
kfree_skb
(
skb
);
return
0
;
goto
drop
;
}
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
netif_rx
(
skb
);
dev
->
last_rx
=
jiffies
;
unlock:
rcu_read_unlock
();
return
0
;
drop:
kfree_skb
(
skb
);
goto
unlock
;
}
/*
...
...
@@ -275,7 +238,6 @@ static int bpq_xmit(struct sk_buff *skb, struct net_device *dev)
* is down, the ethernet device may have gone.
*/
if
(
!
netif_running
(
dev
))
{
bpq_check_devices
(
dev
);
kfree_skb
(
skb
);
return
-
ENODEV
;
}
...
...
@@ -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
)
{
if
(
bpq_check_devices
(
dev
))
return
-
ENODEV
;
/* oops, it's gone */
MOD_INC_USE_COUNT
;
netif_start_queue
(
dev
);
return
0
;
}
...
...
@@ -412,15 +369,6 @@ static int bpq_open(struct net_device *dev)
static
int
bpq_close
(
struct
net_device
*
dev
)
{
netif_stop_queue
(
dev
);
MOD_DEC_USE_COUNT
;
return
0
;
}
/*
* currently unused
*/
static
int
bpq_dev_init
(
struct
net_device
*
dev
)
{
return
0
;
}
...
...
@@ -431,7 +379,7 @@ static int bpq_dev_init(struct net_device *dev)
/*
* 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
];
...
...
@@ -441,98 +389,92 @@ static char * bpq_print_ethaddr(unsigned char *e)
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
;
int
len
=
0
;
off_t
pos
=
0
;
off_t
begin
=
0
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
bpq_lock
,
flags
);
rcu_read_lock
(
);
len
+=
sprintf
(
buffer
,
"dev ether destination accept from
\n
"
);
if
(
*
pos
==
0
)
return
BPQ_PROC_START
;
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
"
,
(
bpqdev
->
acpt_addr
[
0
]
&
0x01
)
?
"*"
:
bpq_print_ethaddr
(
bpqdev
->
acpt_addr
));
pos
=
begin
+
len
;
if
(
pos
<
offset
)
{
len
=
0
;
begin
=
pos
;
}
if
(
pos
>
offset
+
length
)
break
;
list_for_each_entry
(
bpqdev
,
&
bpq_devices
,
bpq_list
)
{
if
(
i
==
*
pos
)
return
bpqdev
;
}
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
);
len
-=
(
offset
-
begin
);
++*
pos
;
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
);
}
/* ------------------------------------------------------------------------ */
/*
* Setup a new device.
*/
static
int
bpq_new_device
(
struct
net_device
*
dev
)
static
void
bpq_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
int
k
;
struct
bpqdev
*
bpq
,
*
bpq2
;
unsigned
long
flags
;
if
((
bpq
=
kmalloc
(
sizeof
(
struct
bpqdev
),
GFP_KERNEL
))
==
NULL
)
return
-
ENOMEM
;
rcu_read_unlock
();
}
memset
(
bpq
,
0
,
sizeof
(
struct
bpqdev
));
bpq
->
ethdev
=
dev
;
static
int
bpq_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
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
));
bpq
->
ethname
[
sizeof
(
bpq
->
ethname
)
-
1
]
=
'\0'
;
strncpy
(
bpq
->
ethname
,
dev
->
name
,
sizeof
(
bpq
->
ethname
)
-
1
);
seq_printf
(
seq
,
"%s
\n
"
,
(
bpqdev
->
acpt_addr
[
0
]
&
0x01
)
?
"*"
:
bpq_print_ethaddr
(
bpqdev
->
acpt_addr
));
memcpy
(
bpq
->
dest_addr
,
bcast_addr
,
sizeof
(
bpq_eth_addr
));
memcpy
(
bpq
->
acpt_addr
,
bcast_addr
,
sizeof
(
bpq_eth_addr
));
dev
=
&
bpq
->
axdev
;
}
return
0
;
}
for
(
k
=
0
;
k
<
MAXBPQDEV
;
k
++
)
{
struct
net_device
*
odev
;
static
struct
seq_operations
bpq_seqops
=
{
.
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
))
break
;
}
static
struct
file_operations
bpq_info_fops
=
{
.
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
)
{
kfree
(
bpq
);
return
-
EIO
;
}
static
void
bpq_setup
(
struct
net_device
*
dev
)
{
dev
->
hard_start_xmit
=
bpq_xmit
;
dev
->
open
=
bpq_open
;
...
...
@@ -540,6 +482,7 @@ static int bpq_new_device(struct net_device *dev)
dev
->
set_mac_address
=
bpq_set_mac_address
;
dev
->
get_stats
=
bpq_get_stats
;
dev
->
do_ioctl
=
bpq_ioctl
;
dev
->
destructor
=
(
void
(
*
)(
struct
net_device
*
))
kfree
;
memcpy
(
dev
->
broadcast
,
ax25_bcast
,
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)
dev
->
mtu
=
AX25_DEF_PACLEN
;
dev
->
addr_len
=
AX25_ADDR_LEN
;
spin_lock_irqsave
(
&
bpq_lock
,
flags
);
}
if
(
bpq_devices
==
NULL
)
{
bpq_devices
=
bpq
;
}
else
{
for
(
bpq2
=
bpq_devices
;
bpq2
->
next
!=
NULL
;
bpq2
=
bpq2
->
next
);
bpq2
->
next
=
bpq
;
}
/*
* Setup a new device.
*/
static
int
bpq_new_device
(
struct
net_device
*
edev
)
{
int
err
;
struct
net_device
*
ndev
;
struct
bpqdev
*
bpq
;
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
;
spin_unlock_irqrestore
(
&
bpq_lock
,
flags
);
err
=
register_netdevice
(
ndev
);
if
(
err
)
goto
error
;
/* List protected by RTNL */
list_add_rcu
(
&
bpq
->
bpq_list
,
&
bpq_devices
);
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.
...
...
@@ -581,7 +563,7 @@ static int bpq_device_event(struct notifier_block *this,unsigned long event, voi
if
(
!
dev_is_ethdev
(
dev
))
return
NOTIFY_DONE
;
bpq_check_devices
(
NULL
);
rcu_read_lock
(
);
switch
(
event
)
{
case
NETDEV_UP
:
/* new ethernet device -> new BPQ interface */
...
...
@@ -594,9 +576,14 @@ static int bpq_device_event(struct notifier_block *this,unsigned long event, voi
dev_close
(
dev
);
break
;
case
NETDEV_UNREGISTER
:
/* ethernet device removed -> free BPQ interface */
if
((
dev
=
bpq_get_ax25_dev
(
dev
))
!=
NULL
)
bpq_free_device
(
dev
);
break
;
default:
break
;
}
rcu_read_unlock
();
return
NOTIFY_DONE
;
}
...
...
@@ -618,7 +605,7 @@ static int __init bpq_init_driver(void)
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
"bpq: cannot create /proc/net/bpqether entry.
\n
"
);
unregister_netdevice_notifier
(
&
bpq_dev_notifier
);
...
...
@@ -626,15 +613,15 @@ static int __init bpq_init_driver(void)
return
-
ENOENT
;
}
r
ead_lock_bh
(
&
dev_base_lock
);
r
tnl_lock
(
);
for
(
dev
=
dev_base
;
dev
!=
NULL
;
dev
=
dev
->
next
)
{
if
(
dev_is_ethdev
(
dev
))
{
read_unlock_bh
(
&
dev_base_lock
);
bpq_new_device
(
dev
);
read_lock_bh
(
&
dev_base_lock
);
if
(
dev_is_ethdev
(
dev
)
&&
bpq_new_device
(
dev
)
)
{
printk
(
KERN_ERR
"bpq: cannot setup dev for '%s'
\n
"
,
dev
->
name
);
}
}
r
ead_unlock_bh
(
&
dev_base_lock
);
r
tnl_unlock
(
);
return
0
;
}
...
...
@@ -648,8 +635,12 @@ static void __exit bpq_cleanup_driver(void)
proc_net_remove
(
"bpqether"
);
for
(
bpq
=
bpq_devices
;
bpq
!=
NULL
;
bpq
=
bpq
->
next
)
unregister_netdev
(
&
bpq
->
axdev
);
rtnl_lock
();
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>"
);
...
...
drivers/net/hamradio/yam.c
View file @
293f3e3f
...
...
@@ -72,6 +72,7 @@
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/version.h>
#include <asm/uaccess.h>
...
...
@@ -120,7 +121,7 @@ struct yam_port {
int
irq
;
int
dupmode
;
struct
net_device
dev
;
struct
net_device
*
dev
;
/* Stats section */
...
...
@@ -161,7 +162,7 @@ struct yam_mcs {
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
;
...
...
@@ -628,8 +629,8 @@ static void yam_dotimer(unsigned long dummy)
int
i
;
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
struct
net_device
*
dev
=
&
yam_ports
[
i
].
dev
;
if
(
netif_running
(
dev
))
struct
net_device
*
dev
=
yam_devs
[
i
]
;
if
(
dev
&&
netif_running
(
dev
))
yam_arbitrate
(
dev
);
}
yam_timer
.
expires
=
jiffies
+
HZ
/
100
;
...
...
@@ -724,8 +725,8 @@ static irqreturn_t yam_interrupt(int irq, void *dev_id, struct pt_regs *regs)
int
handled
=
0
;
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
yp
=
&
yam_port
s
[
i
];
dev
=
&
yp
->
de
v
;
dev
=
yam_dev
s
[
i
];
yp
=
dev
->
pri
v
;
if
(
!
netif_running
(
dev
))
continue
;
...
...
@@ -765,56 +766,73 @@ static irqreturn_t yam_interrupt(int irq, void *dev_id, struct pt_regs *regs)
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
;
int
i
;
off_t
pos
=
0
;
off_t
begin
=
0
;
return
(
*
pos
<
NR_PORTS
)
?
yam_devs
[
*
pos
]
:
NULL
;
}
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
++
)
{
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
;
}
static
void
yam_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
}
*
start
=
buffer
+
(
offset
-
begin
);
len
-=
(
offset
-
begin
);
static
int
yam_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
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
)
...
...
@@ -882,8 +900,10 @@ static int yam_open(struct net_device *dev)
/* Reset overruns for all ports - FPGA programming makes overruns */
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
inb
(
LSR
(
yam_ports
[
i
].
dev
.
base_addr
));
yam_ports
[
i
].
stats
.
rx_fifo_errors
=
0
;
struct
net_device
*
dev
=
yam_devs
[
i
];
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
,
...
...
@@ -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
;
if
(
!
dev
)
return
-
ENXIO
;
struct
yam_port
*
yp
=
dev
->
priv
;
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
->
stop
=
yam_close
;
...
...
@@ -1104,58 +1136,49 @@ static int yam_probe(struct net_device *dev)
memcpy
(
dev
->
broadcast
,
ax25_bcast
,
7
);
memcpy
(
dev
->
dev_addr
,
ax25_test
,
7
);
/* New style flags */
dev
->
flags
=
0
;
return
0
;
}
/* --------------------------------------------------------------------- */
static
int
__init
yam_init_driver
(
void
)
{
struct
net_device
*
dev
;
int
i
;
int
i
,
err
;
char
name
[
IFNAMSIZ
];
printk
(
yam_drvinfo
);
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
sprintf
(
yam_ports
[
i
].
dev
.
name
,
"yam%d"
,
i
);
yam_ports
[
i
].
magic
=
YAM_MAGIC
;
yam_ports
[
i
].
bitrate
=
DEFAULT_BITRATE
;
yam_ports
[
i
].
baudrate
=
DEFAULT_BITRATE
*
2
;
yam_ports
[
i
].
iobase
=
0
;
yam_ports
[
i
].
irq
=
0
;
yam_ports
[
i
].
dupmode
=
0
;
yam_ports
[
i
].
holdd
=
DEFAULT_HOLDD
;
yam_ports
[
i
].
txd
=
DEFAULT_TXD
;
yam_ports
[
i
].
txtail
=
DEFAULT_TXTAIL
;
yam_ports
[
i
].
slot
=
DEFAULT_SLOT
;
yam_ports
[
i
].
pers
=
DEFAULT_PERS
;
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
))
{
sprintf
(
name
,
"yam%d"
,
i
);
dev
=
alloc_netdev
(
sizeof
(
struct
yam_port
),
name
,
yam_setup
);
if
(
!
dev
)
{
printk
(
KERN_ERR
"yam: cannot allocate net device %s
\n
"
,
dev
->
name
);
err
=
-
ENOMEM
;
goto
error
;
}
err
=
register_netdev
(
dev
);
if
(
err
)
{
printk
(
KERN_WARNING
"yam: cannot register net device %s
\n
"
,
dev
->
name
);
dev
->
priv
=
NULL
;
return
-
ENXIO
;
goto
error
;
}
yam_devs
[
i
]
=
dev
;
SET_MODULE_OWNER
(
dev
);
}
yam_timer
.
function
=
yam_dotimer
;
yam_timer
.
expires
=
jiffies
+
HZ
/
100
;
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
;
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)
del_timer
(
&
yam_timer
);
for
(
i
=
0
;
i
<
NR_PORTS
;
i
++
)
{
struct
net_device
*
dev
=
&
yam_ports
[
i
].
dev
;
if
(
!
dev
->
priv
)
continue
;
if
(
netif_running
(
dev
))
yam_close
(
dev
);
struct
net_device
*
dev
=
yam_devs
[
i
];
if
(
dev
)
{
unregister_netdev
(
dev
);
kfree
(
dev
);
}
}
while
(
yam_data
)
{
...
...
drivers/net/slip.c
View file @
293f3e3f
...
...
@@ -1369,6 +1369,7 @@ static int __init slip_init(void)
/* Fill in our line protocol discipline, and register it */
if
((
status
=
tty_register_ldisc
(
N_SLIP
,
&
sl_ldisc
))
!=
0
)
{
printk
(
KERN_ERR
"SLIP: can't register line discipline (err = %d)
\n
"
,
status
);
kfree
(
slip_devs
);
}
return
status
;
}
...
...
drivers/net/wan/lapbether.c
View file @
293f3e3f
...
...
@@ -37,7 +37,6 @@
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <linux/notifier.h>
#include <linux/proc_fs.h>
#include <linux/stat.h>
#include <linux/netfilter.h>
#include <linux/module.h>
...
...
@@ -52,50 +51,27 @@ static char bcast_addr[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
struct
lapbethdev
{
struct
list_head
node
;
char
ethname
[
14
];
/* ether device name */
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 */
atomic_t
refcnt
;
};
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
*/
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
,
*
use
=
NULL
;
read_lock
(
&
lapbeth_devices_lock
);
struct
lapbethdev
*
lapbeth
;
list_for_each
(
entry
,
&
lapbeth_devices
)
{
lapbeth
=
list_entry
(
entry
,
struct
lapbethdev
,
node
);
if
(
lapbeth
->
ethdev
==
dev
)
{
use
=
lapbeth
;
break
;
}
list_for_each_entry_rcu
(
lapbeth
,
&
lapbeth_devices
,
node
)
{
if
(
lapbeth
->
ethdev
==
dev
)
return
lapbeth
;
}
if
(
use
)
lapbeth_hold
(
use
);
read_unlock
(
&
lapbeth_devices_lock
);
return
use
;
return
NULL
;
}
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
);
}
/*
* 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
skb
->
sk
=
NULL
;
/* Initially we don't know who it's for */
rcu_read_lock
();
lapbeth
=
lapbeth_get_x25_dev
(
dev
);
if
(
!
lapbeth
)
goto
drop
;
if
(
!
netif_running
(
&
lapbeth
->
axdev
))
goto
put_
drop
;
if
(
!
netif_running
(
lapbeth
->
axdev
))
goto
drop
;
lapbeth
->
stats
.
rx_packets
++
;
len
=
skb
->
data
[
0
]
+
skb
->
data
[
1
]
*
256
;
lapbeth
->
stats
.
rx_bytes
+=
len
;
skb_pull
(
skb
,
2
);
/* Remove the length bytes */
skb_trim
(
skb
,
len
);
/* Set the length of the data */
if
((
err
=
lapb_data_received
(
lapbeth
,
skb
))
!=
LAPB_OK
)
{
printk
(
KERN_DEBUG
"lapbether: lapb_data_received err - %d
\n
"
,
err
);
goto
put_
drop
;
goto
drop
;
}
lapbeth_put
(
lapbeth
);
out:
rcu_read_unlock
();
return
0
;
put_drop:
lapbeth_put
(
lapbeth
);
drop:
kfree_skb
(
skb
);
goto
out
;
...
...
@@ -181,7 +126,7 @@ static int lapbeth_data_indication(void *token, struct sk_buff *skb)
ptr
=
skb_push
(
skb
,
1
);
*
ptr
=
0x00
;
skb
->
dev
=
&
lapbeth
->
axdev
;
skb
->
dev
=
lapbeth
->
axdev
;
skb
->
protocol
=
htons
(
ETH_P_X25
);
skb
->
mac
.
raw
=
skb
->
data
;
skb
->
pkt_type
=
PACKET_HOST
;
...
...
@@ -203,7 +148,6 @@ static int lapbeth_xmit(struct sk_buff *skb, struct net_device *dev)
* is down, the ethernet device may have gone.
*/
if
(
!
netif_running
(
dev
))
{
lapbeth_check_devices
(
dev
);
goto
drop
;
}
...
...
@@ -257,6 +201,7 @@ static void lapbeth_data_transmit(void *token, struct sk_buff *skb)
*
ptr
++
=
size
/
256
;
lapbeth
->
stats
.
tx_packets
++
;
lapbeth
->
stats
.
tx_bytes
+=
size
;
skb
->
dev
=
dev
=
lapbeth
->
ethdev
;
...
...
@@ -279,7 +224,7 @@ static void lapbeth_connected(void *token, int reason)
ptr
=
skb_put
(
skb
,
1
);
*
ptr
=
0x01
;
skb
->
dev
=
&
lapbeth
->
axdev
;
skb
->
dev
=
lapbeth
->
axdev
;
skb
->
protocol
=
htons
(
ETH_P_X25
);
skb
->
mac
.
raw
=
skb
->
data
;
skb
->
pkt_type
=
PACKET_HOST
;
...
...
@@ -302,7 +247,7 @@ static void lapbeth_disconnected(void *token, int reason)
ptr
=
skb_put
(
skb
,
1
);
*
ptr
=
0x02
;
skb
->
dev
=
&
lapbeth
->
axdev
;
skb
->
dev
=
lapbeth
->
axdev
;
skb
->
protocol
=
htons
(
ETH_P_X25
);
skb
->
mac
.
raw
=
skb
->
data
;
skb
->
pkt_type
=
PACKET_HOST
;
...
...
@@ -330,27 +275,26 @@ static int lapbeth_set_mac_address(struct net_device *dev, void *addr)
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
*/
static
int
lapbeth_open
(
struct
net_device
*
dev
)
{
struct
lapb_register_struct
lapbeth_callbacks
;
struct
lapbethdev
*
lapbeth
;
int
err
;
if
(
lapbeth_check_devices
(
dev
))
return
-
ENODEV
;
/* oops, it's gone */
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
)
{
printk
(
KERN_ERR
"lapbeth: lapb_register error - %d
\n
"
,
err
);
return
-
ENODEV
;
...
...
@@ -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.
*/
static
int
lapbeth_new_device
(
struct
net_device
*
dev
)
{
unsigned
char
buf
[
14
]
;
struct
net_device
*
ndev
;
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
;
memset
(
lapbeth
,
0
,
sizeof
(
struct
lapbethdev
));
lapbeth
=
ndev
->
priv
;
lapbeth
->
axdev
=
ndev
;
dev_hold
(
dev
);
lapbeth
->
ethdev
=
dev
;
strncpy
(
lapbeth
->
ethname
,
dev
->
name
,
sizeof
(
lapbeth
->
ethname
)
-
1
);
lapbeth
->
ethname
[
sizeof
(
lapbeth
->
ethname
)
-
1
]
=
'\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
)
rc
=
dev_alloc_name
(
ndev
,
ndev
->
name
);
if
(
rc
<
0
)
goto
fail
;
dev
->
priv
=
(
void
*
)
lapbeth
;
/* pointer back */
strcpy
(
dev
->
name
,
buf
);
rc
=
-
EIO
;
if
(
register_netdev
(
dev
))
if
(
register_netdev
ice
(
n
dev
))
goto
fail
;
dev
->
hard_start_xmit
=
lapbeth_xmit
;
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
);
list_add_rcu
(
&
lapbeth
->
node
,
&
lapbeth_devices
);
rc
=
0
;
out:
return
rc
;
...
...
@@ -443,6 +374,16 @@ static int lapbeth_new_device(struct net_device *dev)
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.
*/
...
...
@@ -455,30 +396,27 @@ static int lapbeth_device_event(struct notifier_block *this,
if
(
!
dev_is_ethdev
(
dev
))
return
NOTIFY_DONE
;
lapbeth_check_devices
(
NULL
);
rcu_read_lock
();
switch
(
event
)
{
case
NETDEV_UP
:
/*
* New ethernet device -> new LAPB interface
*/
/* New ethernet device -> new LAPB interface */
if
(
lapbeth_get_x25_dev
(
dev
)
==
NULL
)
lapbeth_new_device
(
dev
);
break
;
case
NETDEV_DOWN
:
/* ethernet device closed -> close LAPB interface */
lapbeth
=
lapbeth_get_x25_dev
(
dev
);
if
(
lapbeth
)
lapbeth_put
(
lapbeth
);
else
lapbeth_new_device
(
dev
);
dev_close
(
lapbeth
->
axdev
);
break
;
case
NETDEV_
GOING_DOWN
:
case
NETDEV_DOWN
:
/* ethernet device closed -> clos
e LAPB interface */
case
NETDEV_
UNREGISTER
:
/* ethernet device disappears -> remov
e LAPB interface */
lapbeth
=
lapbeth_get_x25_dev
(
dev
);
if
(
lapbeth
)
{
dev_close
(
lapbeth
->
ethdev
);
lapbeth_put
(
lapbeth
);
}
if
(
lapbeth
)
lapbeth_free_device
(
lapbeth
);
break
;
}
rcu_read_unlock
();
return
NOTIFY_DONE
;
}
...
...
@@ -506,15 +444,13 @@ static int __init lapbeth_init_driver(void)
printk
(
banner
);
r
ead_lock_bh
(
&
dev_base_lock
);
r
tnl_lock
(
);
for
(
dev
=
dev_base
;
dev
;
dev
=
dev
->
next
)
{
if
(
dev_is_ethdev
(
dev
))
{
read_unlock_bh
(
&
dev_base_lock
);
lapbeth_new_device
(
dev
);
read_lock_bh
(
&
dev_base_lock
);
}
}
r
ead_unlock_bh
(
&
dev_base_lock
);
r
tnl_unlock
(
);
return
0
;
}
...
...
@@ -528,16 +464,13 @@ static void __exit lapbeth_cleanup_driver(void)
dev_remove_pack
(
&
lapbeth_packet_type
);
unregister_netdevice_notifier
(
&
lapbeth_dev_notifier
);
write_lock
(
&
lapbeth_devices_lock
);
rtnl_lock
();
list_for_each_safe
(
entry
,
tmp
,
&
lapbeth_devices
)
{
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
);
...
...
include/net/netrom.h
View file @
293f3e3f
...
...
@@ -7,6 +7,7 @@
#ifndef _NETROM_H
#define _NETROM_H
#include <linux/netrom.h>
#include <linux/list.h>
#define NR_NETWORK_LEN 15
#define NR_TRANSPORT_LEN 5
...
...
@@ -77,7 +78,7 @@ typedef struct {
#define nr_sk(__sk) ((nr_cb *)(__sk)->sk_protinfo)
struct
nr_neigh
{
struct
nr_neigh
*
next
;
struct
hlist_node
neigh_node
;
ax25_address
callsign
;
ax25_digi
*
digipeat
;
ax25_cb
*
ax25
;
...
...
@@ -87,6 +88,7 @@ struct nr_neigh {
unsigned
short
count
;
unsigned
int
number
;
unsigned
char
failed
;
atomic_t
refcount
;
};
struct
nr_route
{
...
...
@@ -96,14 +98,74 @@ struct nr_route {
};
struct
nr_node
{
struct
nr_node
*
next
;
struct
hlist_node
node_node
;
ax25_address
callsign
;
char
mnemonic
[
7
];
unsigned
char
which
;
unsigned
char
count
;
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 */
extern
int
sysctl_netrom_default_path_quality
;
extern
int
sysctl_netrom_obsolescence_count_initialiser
;
...
...
@@ -121,7 +183,7 @@ extern void nr_destroy_socket(struct sock *);
/* nr_dev.c */
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 */
extern
int
nr_process_rx_frame
(
struct
sock
*
,
struct
sk_buff
*
);
...
...
@@ -147,8 +209,8 @@ extern struct net_device *nr_dev_get(ax25_address *);
extern
int
nr_rt_ioctl
(
unsigned
int
,
void
*
);
extern
void
nr_link_failed
(
ax25_cb
*
,
int
);
extern
int
nr_route_frame
(
struct
sk_buff
*
,
ax25_cb
*
);
extern
int
nr_nodes_get_info
(
char
*
,
char
**
,
off_t
,
int
)
;
extern
int
nr_neigh_get_info
(
char
*
,
char
**
,
off_t
,
int
)
;
extern
struct
file_operations
nr_nodes_fops
;
extern
struct
file_operations
nr_neigh_fops
;
extern
void
nr_rt_free
(
void
);
/* 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)
out:
spin_unlock_bh
(
&
br
->
lock
);
err:
kfree
(
skb
);
kfree
_skb
(
skb
);
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,
unsigned
char
*
b
=
skb
->
tail
;
nlh
=
NLMSG_PUT
(
skb
,
pid
,
seq
,
event
,
sizeof
(
*
ifm
));
if
(
pid
)
nlh
->
nlmsg_flags
|=
NLM_F_MULTI
;
ifm
=
NLMSG_DATA
(
nlh
);
ifm
->
ifa_family
=
AF_INET
;
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,
#ifdef CONFIG_IP_ROUTE_FWMARK
.
fwmark
=
(
*
pskb
)
->
nfmark
#endif
}
},
.
oif
=
out
->
ifindex
};
}
}
};
if
(
ip_route_output_key
(
&
rt
,
&
fl
)
!=
0
)
{
/* Shouldn't happen */
printk
(
"MASQUERADE: No route: Rusty's brain broke!
\n
"
);
/* Funky routing can do this. */
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
;
}
}
...
...
net/ipv6/addrconf.c
View file @
293f3e3f
...
...
@@ -2443,6 +2443,7 @@ static int inet6_fill_ifaddr(struct sk_buff *skb, struct inet6_ifaddr *ifa,
unsigned
char
*
b
=
skb
->
tail
;
nlh
=
NLMSG_PUT
(
skb
,
pid
,
seq
,
event
,
sizeof
(
*
ifm
));
if
(
pid
)
nlh
->
nlmsg_flags
|=
NLM_F_MULTI
;
ifm
=
NLMSG_DATA
(
nlh
);
ifm
->
ifa_family
=
AF_INET6
;
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,
val
=
-
1
;
else
val
=
opt
->
offset
;
break
;
default:
return
-
ENOPROTOOPT
;
...
...
net/netrom/af_netrom.c
View file @
293f3e3f
...
...
@@ -36,6 +36,7 @@
#include <linux/notifier.h>
#include <net/netrom.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <net/ip.h>
#include <net/tcp.h>
#include <net/arp.h>
...
...
@@ -57,8 +58,8 @@ int sysctl_netrom_link_fails_count = NR_DEFAULT_FAILS;
static
unsigned
short
circuit
=
0x101
;
HLIST_HEAD
(
nr_list
);
static
spinlock_t
nr_list_lock
;
static
HLIST_HEAD
(
nr_list
);
static
spinlock_t
nr_list_lock
=
SPIN_LOCK_UNLOCKED
;
static
struct
proto_ops
nr_proto_ops
;
...
...
@@ -147,8 +148,10 @@ static struct sock *nr_find_listener(ax25_address *addr)
spin_lock_bh
(
&
nr_list_lock
);
sk_for_each
(
s
,
node
,
&
nr_list
)
if
(
!
ax25cmp
(
&
nr_sk
(
s
)
->
source_addr
,
addr
)
&&
s
->
sk_state
==
TCP_LISTEN
)
s
->
sk_state
==
TCP_LISTEN
)
{
bh_lock_sock
(
s
);
goto
found
;
}
s
=
NULL
;
found:
spin_unlock_bh
(
&
nr_list_lock
);
...
...
@@ -167,9 +170,11 @@ static struct sock *nr_find_socket(unsigned char index, unsigned char id)
sk_for_each
(
s
,
node
,
&
nr_list
)
{
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
;
}
}
s
=
NULL
;
found:
spin_unlock_bh
(
&
nr_list_lock
);
...
...
@@ -190,9 +195,11 @@ static struct sock *nr_find_peer(unsigned char index, unsigned char id,
nr_cb
*
nr
=
nr_sk
(
s
);
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
;
}
}
s
=
NULL
;
found:
spin_unlock_bh
(
&
nr_list_lock
);
...
...
@@ -206,14 +213,17 @@ static unsigned short nr_find_next_circuit(void)
{
unsigned
short
id
=
circuit
;
unsigned
char
i
,
j
;
struct
sock
*
sk
;
for
(;;)
{
i
=
id
/
256
;
j
=
id
%
256
;
if
(
i
!=
0
&&
j
!=
0
)
if
(
nr_find_socket
(
i
,
j
)
==
NULL
)
if
(
i
!=
0
&&
j
!=
0
)
{
if
(
(
sk
=
nr_find_socket
(
i
,
j
)
)
==
NULL
)
break
;
bh_unlock_sock
(
sk
);
}
id
++
;
}
...
...
@@ -231,7 +241,12 @@ void nr_destroy_socket(struct sock *);
*/
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)
kfree_skb
(
skb
);
}
while
((
skb
=
skb_dequeue
(
&
sk
->
sk_write_queue
))
!=
NULL
)
{
kfree_skb
(
skb
);
}
if
(
atomic_read
(
&
sk
->
sk_wmem_alloc
)
||
atomic_read
(
&
sk
->
sk_rmem_alloc
))
{
/* Defer: outstanding buffers */
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
.
data
=
(
unsigned
long
)
sk
;
add_timer
(
&
sk
->
sk_timer
);
}
else
s
k_free
(
sk
);
s
ock_put
(
sk
);
}
/*
...
...
@@ -388,12 +406,15 @@ static int nr_listen(struct socket *sock, int backlog)
{
struct
sock
*
sk
=
sock
->
sk
;
lock_sock
(
sk
);
if
(
sk
->
sk_state
!=
TCP_LISTEN
)
{
memset
(
&
nr_sk
(
sk
)
->
user_addr
,
0
,
AX25_ADDR_LEN
);
sk
->
sk_max_ack_backlog
=
backlog
;
sk
->
sk_state
=
TCP_LISTEN
;
release_sock
(
sk
);
return
0
;
}
release_sock
(
sk
);
return
-
EOPNOTSUPP
;
}
...
...
@@ -495,6 +516,8 @@ static int nr_release(struct socket *sock)
if
(
sk
==
NULL
)
return
0
;
sock_hold
(
sk
);
lock_sock
(
sk
);
nr
=
nr_sk
(
sk
);
switch
(
nr
->
state
)
{
...
...
@@ -528,6 +551,8 @@ static int nr_release(struct socket *sock)
}
sock
->
sk
=
NULL
;
release_sock
(
sk
);
sock_put
(
sk
);
return
0
;
}
...
...
@@ -540,21 +565,26 @@ static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
struct
net_device
*
dev
;
ax25_address
*
user
,
*
source
;
if
(
!
sk
->
sk_zapped
)
lock_sock
(
sk
);
if
(
!
sk
->
sk_zapped
)
{
release_sock
(
sk
);
return
-
EINVAL
;
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
;
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
;
if
(
addr
->
fsa_ax25
.
sax25_family
!=
AF_NETROM
)
}
if
(
addr
->
fsa_ax25
.
sax25_family
!=
AF_NETROM
)
{
release_sock
(
sk
);
return
-
EINVAL
;
}
if
((
dev
=
nr_dev_get
(
&
addr
->
fsa_ax25
.
sax25_call
))
==
NULL
)
{
SOCK_DEBUG
(
sk
,
"NET/ROM: bind failed: invalid node callsign
\n
"
);
release_sock
(
sk
);
return
-
EADDRNOTAVAIL
;
}
...
...
@@ -562,16 +592,22 @@ full_sockaddr_ax25))
* Only the super user can set an arbitrary user callsign.
*/
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
;
}
nr
->
user_addr
=
addr
->
fsa_digipeater
[
0
];
nr
->
source_addr
=
addr
->
fsa_ax25
.
sax25_call
;
}
else
{
source
=
&
addr
->
fsa_ax25
.
sax25_call
;
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
;
}
user
=
source
;
}
...
...
@@ -583,6 +619,8 @@ full_sockaddr_ax25))
nr_insert_socket
(
sk
);
sk
->
sk_zapped
=
0
;
dev_put
(
dev
);
release_sock
(
sk
);
SOCK_DEBUG
(
sk
,
"NET/ROM: socket is bound
\n
"
);
return
0
;
}
...
...
@@ -596,39 +634,50 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
ax25_address
*
user
,
*
source
=
NULL
;
struct
net_device
*
dev
;
lock_sock
(
sk
);
if
(
sk
->
sk_state
==
TCP_ESTABLISHED
&&
sock
->
state
==
SS_CONNECTING
)
{
sock
->
state
=
SS_CONNECTED
;
release_sock
(
sk
);
return
0
;
/* Connect completed during a ERESTARTSYS event */
}
if
(
sk
->
sk_state
==
TCP_CLOSE
&&
sock
->
state
==
SS_CONNECTING
)
{
sock
->
state
=
SS_UNCONNECTED
;
release_sock
(
sk
);
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 */
}
sk
->
sk_state
=
TCP_CLOSE
;
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
;
if
(
addr
->
sax25_family
!=
AF_NETROM
)
}
if
(
addr
->
sax25_family
!=
AF_NETROM
)
{
release_sock
(
sk
);
return
-
EINVAL
;
}
if
(
sk
->
sk_zapped
)
{
/* Must bind first - autobinding in this may or may not work */
sk
->
sk_zapped
=
0
;
if
((
dev
=
nr_dev_first
())
==
NULL
)
if
((
dev
=
nr_dev_first
())
==
NULL
)
{
release_sock
(
sk
);
return
-
ENETUNREACH
;
}
source
=
(
ax25_address
*
)
dev
->
dev_addr
;
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
;
}
user
=
source
;
}
...
...
@@ -636,12 +685,15 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
nr
->
source_addr
=
*
source
;
nr
->
device
=
dev
;
dev_put
(
dev
);
nr_insert_socket
(
sk
);
/* Finish the bind */
}
nr
->
dest_addr
=
addr
->
sax25_call
;
release_sock
(
sk
);
circuit
=
nr_find_next_circuit
();
lock_sock
(
sk
);
nr
->
my_index
=
circuit
/
256
;
nr
->
my_id
=
circuit
%
256
;
...
...
@@ -659,8 +711,10 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
nr_start_heartbeat
(
sk
);
/* 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
;
}
/*
* 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,
set_current_state
(
TASK_INTERRUPTIBLE
);
if
(
sk
->
sk_state
!=
TCP_SYN_SENT
)
break
;
release_sock
(
sk
);
if
(
!
signal_pending
(
tsk
))
{
schedule
();
lock_sock
(
sk
);
continue
;
}
return
-
ERESTARTSYS
;
...
...
@@ -687,10 +743,12 @@ static int nr_connect(struct socket *sock, struct sockaddr *uaddr,
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
{
sock
->
state
=
SS_UNCONNECTED
;
release_sock
(
sk
);
return
sock_error
(
sk
);
/* Always set at this point */
}
sock
->
state
=
SS_CONNECTED
;
release_sock
(
sk
);
return
0
;
}
...
...
@@ -753,6 +811,7 @@ static int nr_accept(struct socket *sock, struct socket *newsock, int flags)
newsock
->
sk
=
newsk
;
out:
release_sock
(
sk
);
return
err
;
}
...
...
@@ -763,9 +822,12 @@ static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
struct
sock
*
sk
=
sock
->
sk
;
nr_cb
*
nr
=
nr_sk
(
sk
);
lock_sock
(
sk
);
if
(
peer
!=
0
)
{
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
{
release_sock
(
sk
);
return
-
ENOTCONN
;
}
sax
->
fsa_ax25
.
sax25_family
=
AF_NETROM
;
sax
->
fsa_ax25
.
sax25_ndigis
=
1
;
sax
->
fsa_ax25
.
sax25_call
=
nr
->
user_addr
;
...
...
@@ -777,6 +839,7 @@ static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
sax
->
fsa_ax25
.
sax25_call
=
nr
->
source_addr
;
*
uaddr_len
=
sizeof
(
struct
sockaddr_ax25
);
}
release_sock
(
sk
);
return
0
;
}
...
...
@@ -790,6 +853,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
unsigned
short
circuit_index
,
circuit_id
;
unsigned
short
peer_circuit_index
,
peer_circuit_id
;
unsigned
short
frametype
,
flags
,
window
,
timeout
;
int
ret
;
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)
else
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)
if
(
!
sk
||
sk
->
sk_ack_backlog
==
sk
->
sk_max_ack_backlog
||
(
make
=
nr_make_new
(
sk
))
==
NULL
)
{
nr_transmit_refusal
(
skb
,
0
);
if
(
sk
)
bh_unlock_sock
(
sk
);
return
0
;
}
...
...
@@ -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_id
=
circuit_id
;
bh_unlock_sock
(
sk
);
circuit
=
nr_find_next_circuit
();
bh_lock_sock
(
sk
);
nr_make
->
my_index
=
circuit
/
256
;
nr_make
->
my_id
=
circuit
%
256
;
...
...
@@ -936,6 +1006,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev)
if
(
!
sock_flag
(
sk
,
SOCK_DEAD
))
sk
->
sk_data_ready
(
sk
,
skb
->
len
);
bh_unlock_sock
(
sk
);
return
1
;
}
...
...
@@ -954,28 +1025,42 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,
if
(
msg
->
msg_flags
&
~
(
MSG_DONTWAIT
|
MSG_EOR
))
return
-
EINVAL
;
if
(
sk
->
sk_zapped
)
return
-
EADDRNOTAVAIL
;
lock_sock
(
sk
);
if
(
sk
->
sk_zapped
)
{
err
=
-
EADDRNOTAVAIL
;
goto
out
;
}
if
(
sk
->
sk_shutdown
&
SEND_SHUTDOWN
)
{
send_sig
(
SIGPIPE
,
current
,
0
);
return
-
EPIPE
;
err
=
-
EPIPE
;
goto
out
;
}
if
(
nr
->
device
==
NULL
)
return
-
ENETUNREACH
;
if
(
nr
->
device
==
NULL
)
{
err
=
-
ENETUNREACH
;
goto
out
;
}
if
(
usax
)
{
if
(
msg
->
msg_namelen
<
sizeof
(
sax
))
return
-
EINVAL
;
if
(
msg
->
msg_namelen
<
sizeof
(
sax
))
{
err
=
-
EINVAL
;
goto
out
;
}
sax
=
*
usax
;
if
(
ax25cmp
(
&
nr
->
dest_addr
,
&
sax
.
sax25_call
)
!=
0
)
return
-
EISCONN
;
if
(
sax
.
sax25_family
!=
AF_NETROM
)
return
-
EINVAL
;
if
(
ax25cmp
(
&
nr
->
dest_addr
,
&
sax
.
sax25_call
)
!=
0
)
{
err
=
-
EISCONN
;
goto
out
;
}
if
(
sax
.
sax25_family
!=
AF_NETROM
)
{
err
=
-
EINVAL
;
goto
out
;
}
}
else
{
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
return
-
ENOTCONN
;
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
{
err
=
-
ENOTCONN
;
goto
out
;
}
sax
.
sax25_family
=
AF_NETROM
;
sax
.
sax25_call
=
nr
->
dest_addr
;
}
...
...
@@ -984,10 +1069,10 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,
/* Build a packet */
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
)
return
err
;
goto
out
;
skb_reserve
(
skb
,
size
-
len
);
...
...
@@ -1022,12 +1107,16 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,
if
(
sk
->
sk_state
!=
TCP_ESTABLISHED
)
{
kfree_skb
(
skb
);
return
-
ENOTCONN
;
err
=
-
ENOTCONN
;
goto
out
;
}
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
,
...
...
@@ -1044,12 +1133,17 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock,
* 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
;
}
/* 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
;
}
skb
->
h
.
raw
=
skb
->
data
;
copied
=
skb
->
len
;
...
...
@@ -1070,6 +1164,7 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock,
skb_free_datagram
(
sk
,
skb
);
release_sock
(
sk
);
return
copied
;
}
...
...
@@ -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
)
{
struct
sock
*
sk
=
sock
->
sk
;
int
ret
;
lock_sock
(
sk
);
switch
(
cmd
)
{
case
TIOCOUTQ
:
{
long
amount
;
amount
=
sk
->
sk_sndbuf
-
atomic_read
(
&
sk
->
sk_wmem_alloc
);
if
(
amount
<
0
)
amount
=
0
;
release_sock
(
sk
);
return
put_user
(
amount
,
(
int
*
)
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 */
if
((
skb
=
skb_peek
(
&
sk
->
sk_receive_queue
))
!=
NULL
)
amount
=
skb
->
len
;
release_sock
(
sk
);
return
put_user
(
amount
,
(
int
*
)
arg
);
}
case
SIOCGSTAMP
:
if
(
sk
!=
NULL
)
{
if
(
!
sk
->
sk_stamp
.
tv_sec
)
if
(
!
sk
->
sk_stamp
.
tv_sec
)
{
release_sock
(
sk
);
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
;
case
SIOCGIFADDR
:
...
...
@@ -1114,48 +1218,85 @@ static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
case
SIOCSIFNETMASK
:
case
SIOCGIFMETRIC
:
case
SIOCSIFMETRIC
:
release_sock
(
sk
);
return
-
EINVAL
;
case
SIOCADDRT
:
case
SIOCDELRT
:
case
SIOCNRDECOBS
:
release_sock
(
sk
);
if
(
!
capable
(
CAP_NET_ADMIN
))
return
-
EPERM
;
return
nr_rt_ioctl
(
cmd
,
(
void
*
)
arg
);
default:
release_sock
(
sk
);
return
dev_ioctl
(
cmd
,
(
void
*
)
arg
);
}
release_sock
(
sk
);
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
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
;
nr_cb
*
nr
;
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
)
{
nr
_cb
*
nr
=
nr_sk
(
s
);
bh_lock_sock
(
s
);
nr
=
nr_sk
(
s
);
if
((
dev
=
nr
->
device
)
==
NULL
)
devname
=
"???"
;
else
devname
=
dev
->
name
;
len
+=
sprintf
(
buffer
+
len
,
"%-9s "
,
ax2asc
(
&
nr
->
user_addr
));
len
+=
sprintf
(
buffer
+
len
,
"%-9s "
,
ax2asc
(
&
nr
->
dest_addr
));
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
"
,
seq_printf
(
seq
,
"%-9s "
,
ax2asc
(
&
nr
->
user_addr
));
seq_printf
(
seq
,
"%-9s "
,
ax2asc
(
&
nr
->
dest_addr
));
seq_printf
(
seq
,
"%-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
),
devname
,
nr
->
my_index
,
...
...
@@ -1181,28 +1322,32 @@ static int nr_get_info(char *buffer, char **start, off_t offset, int length)
atomic_read
(
&
s
->
sk_rmem_alloc
),
s
->
sk_socket
?
SOCK_INODE
(
s
->
sk_socket
)
->
i_ino
:
0L
);
pos
=
begin
+
len
;
if
(
pos
<
offset
)
{
len
=
0
;
begin
=
pos
;
bh_unlock_sock
(
s
);
}
return
0
;
}
if
(
pos
>
offset
+
length
)
break
;
}
spin_unlock_bh
(
&
nr_list_lock
);
*
start
=
buffer
+
(
offset
-
begin
);
len
-=
(
offset
-
begin
);
if
(
len
>
length
)
len
=
length
;
static
struct
seq_operations
nr_info_seqops
=
{
.
start
=
nr_info_start
,
.
next
=
nr_info_next
,
.
stop
=
nr_info_stop
,
.
show
=
nr_info_show
,
};
return
len
;
static
int
nr_info_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
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
=
{
.
family
=
PF_NETROM
,
.
create
=
nr_create
,
...
...
@@ -1234,7 +1379,7 @@ static struct notifier_block nr_dev_notifier = {
.
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
"
;
...
...
@@ -1247,20 +1392,39 @@ static int __init nr_proto_init(void)
return
-
1
;
}
if
((
dev_nr
=
kmalloc
(
nr_ndevs
*
sizeof
(
struct
net_device
),
GFP_KERNEL
))
==
NULL
)
{
printk
(
KERN_ERR
"NET/ROM: nr_proto_init - unable to allocate device structure
\n
"
);
dev_nr
=
kmalloc
(
nr_ndevs
*
sizeof
(
struct
net_device
*
),
GFP_KERNEL
);
if
(
dev_nr
==
NULL
)
{
printk
(
KERN_ERR
"NET/ROM: nr_proto_init - unable to allocate device array
\n
"
);
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
++
)
{
sprintf
(
dev_nr
[
i
].
name
,
"nr%d"
,
i
);
dev_nr
[
i
].
init
=
nr_init
;
register_netdev
(
&
dev_nr
[
i
]);
char
name
[
IFNAMSIZ
];
struct
net_device
*
dev
;
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
;
}
if
(
sock_register
(
&
nr_family_ops
))
{
printk
(
KERN_ERR
"NET/ROM: nr_proto_init - unable to register socket family
\n
"
);
goto
fail
;
}
sock_register
(
&
nr_family_ops
);
register_netdevice_notifier
(
&
nr_dev_notifier
);
printk
(
banner
);
...
...
@@ -1273,10 +1437,16 @@ static int __init nr_proto_init(void)
nr_loopback_init
();
proc_net_
create
(
"nr"
,
0
,
nr_get_info
);
proc_net_
create
(
"nr_neigh"
,
0
,
nr_neigh_get_info
);
proc_net_
create
(
"nr_nodes"
,
0
,
nr_nodes_get_info
);
proc_net_
fops_create
(
"nr"
,
S_IRUGO
,
&
nr_info_fops
);
proc_net_
fops_create
(
"nr_neigh"
,
S_IRUGO
,
&
nr_neigh_fops
);
proc_net_
fops_create
(
"nr_nodes"
,
S_IRUGO
,
&
nr_nodes_fops
);
return
0
;
fail:
while
(
--
i
>=
0
)
unregister_netdev
(
dev_nr
[
i
]);
kfree
(
dev_nr
);
return
-
1
;
}
module_init
(
nr_proto_init
);
...
...
@@ -1300,23 +1470,21 @@ static void __exit nr_exit(void)
nr_rt_free
();
ax25_protocol_release
(
AX25_P_NETROM
);
#ifdef CONFIG_SYSCTL
nr_unregister_sysctl
();
#endif
ax25_linkfail_release
(
nr_link_failed
);
ax25_protocol_release
(
AX25_P_NETROM
);
unregister_netdevice_notifier
(
&
nr_dev_notifier
);
#ifdef CONFIG_SYSCTL
nr_unregister_sysctl
();
#endif
sock_unregister
(
PF_NETROM
);
for
(
i
=
0
;
i
<
nr_ndevs
;
i
++
)
{
if
(
dev_nr
[
i
].
priv
!=
NULL
)
{
kfree
(
dev_nr
[
i
].
priv
);
dev_nr
[
i
].
priv
=
NULL
;
unregister_netdev
(
&
dev_nr
[
i
]);
}
kfree
(
dev_nr
[
i
].
name
);
struct
net_device
*
dev
=
dev_nr
[
i
];
if
(
dev
)
unregister_netdev
(
dev
);
}
kfree
(
dev_nr
);
...
...
net/netrom/nr_dev.c
View file @
293f3e3f
...
...
@@ -159,10 +159,12 @@ static int nr_set_mac_address(struct net_device *dev, void *addr)
{
struct
sockaddr
*
sa
=
addr
;
if
(
dev
->
flags
&
IFF_UP
)
ax25_listen_release
((
ax25_address
*
)
dev
->
dev_addr
,
NULL
);
memcpy
(
dev
->
dev_addr
,
sa
->
sa_data
,
dev
->
addr_len
);
if
(
dev
->
flags
&
IFF_UP
)
ax25_listen_register
((
ax25_address
*
)
dev
->
dev_addr
,
NULL
);
return
0
;
...
...
@@ -177,8 +179,8 @@ static int nr_open(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
);
netif_stop_queue
(
dev
);
return
0
;
}
...
...
@@ -195,30 +197,25 @@ static struct net_device_stats *nr_get_stats(struct net_device *dev)
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
);
dev
->
mtu
=
NR_MAX_PACKET_SIZE
;
dev
->
hard_start_xmit
=
nr_xmit
;
dev
->
open
=
nr_open
;
dev
->
stop
=
nr_close
;
dev
->
destructor
=
(
void
(
*
)(
struct
net_device
*
))
kfree
;
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
->
type
=
ARPHRD_NETROM
;
dev
->
tx_queue_len
=
40
;
dev
->
rebuild_header
=
nr_rebuild_header
;
dev
->
set_mac_address
=
nr_set_mac_address
;
/* New-style flags. */
dev
->
flags
=
0
;
if
((
dev
->
priv
=
kmalloc
(
sizeof
(
struct
net_device_stats
),
GFP_KERNEL
))
==
NULL
)
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)
static
int
nr_state1_machine
(
struct
sock
*
sk
,
struct
sk_buff
*
skb
,
int
frametype
)
{
bh_lock_sock
(
sk
);
switch
(
frametype
)
{
case
NR_CONNACK
:
{
nr_cb
*
nr
=
nr_sk
(
sk
);
...
...
@@ -102,6 +103,7 @@ static int nr_state1_machine(struct sock *sk, struct sk_buff *skb,
default:
break
;
}
bh_unlock_sock
(
sk
);
return
0
;
}
...
...
@@ -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
,
int
frametype
)
{
bh_lock_sock
(
sk
);
switch
(
frametype
)
{
case
NR_CONNACK
|
NR_CHOKE_FLAG
:
nr_disconnect
(
sk
,
ECONNRESET
);
...
...
@@ -129,6 +132,7 @@ static int nr_state2_machine(struct sock *sk, struct sk_buff *skb,
default:
break
;
}
bh_unlock_sock
(
sk
);
return
0
;
}
...
...
@@ -150,6 +154,7 @@ static int nr_state3_machine(struct sock *sk, struct sk_buff *skb, int frametype
nr
=
skb
->
data
[
18
];
ns
=
skb
->
data
[
17
];
bh_lock_sock
(
sk
);
switch
(
frametype
)
{
case
NR_CONNREQ
:
nr_write_internal
(
sk
,
NR_CONNACK
);
...
...
@@ -260,6 +265,7 @@ static int nr_state3_machine(struct sock *sk, struct sk_buff *skb, int frametype
default:
break
;
}
bh_unlock_sock
(
sk
);
return
queued
;
}
...
...
net/netrom/nr_route.c
View file @
293f3e3f
...
...
@@ -36,13 +36,49 @@
#include <linux/init.h>
#include <linux/spinlock.h>
#include <net/netrom.h>
#include <linux/seq_file.h>
static
unsigned
int
nr_neigh_no
=
1
;
static
struct
nr_node
*
nr_node_list
;
static
spinlock_t
nr_node_lock
;
static
struct
nr_neigh
*
nr_neigh_list
;
static
spinlock_t
nr_neigh_lock
;
static
HLIST_HEAD
(
nr_node_list
);
static
spinlock_t
nr_node_list_lock
=
SPIN_LOCK_UNLOCKED
;
static
HLIST_HEAD
(
nr_neigh_list
);
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
*
);
...
...
@@ -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_route
nr_route
;
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
;
}
for
(
nr_node
=
nr_node_list
;
nr_node
!=
NULL
;
nr_node
=
nr_node
->
next
)
if
(
ax25cmp
(
nr
,
&
nr_node
->
callsign
)
==
0
)
break
;
nr_node
=
nr_node_get
(
nr
);
for
(
nr_neigh
=
nr_neigh_list
;
nr_neigh
!=
NULL
;
nr_neigh
=
nr_neigh
->
next
)
if
(
ax25cmp
(
ax25
,
&
nr_neigh
->
callsign
)
==
0
&&
nr_neigh
->
dev
==
dev
)
break
;
nr_neigh
=
nr_neigh_get_dev
(
ax25
,
dev
);
/*
* 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
* routes now (and not wait for a node broadcast).
*/
if
(
nr_neigh
!=
NULL
&&
nr_neigh
->
failed
!=
0
&&
quality
==
0
)
{
struct
nr_node
*
node
;
for
(
node
=
nr_node_list
;
node
!=
NULL
;
node
=
node
->
next
)
for
(
i
=
0
;
i
<
node
->
count
;
i
++
)
if
(
node
->
routes
[
i
].
neighbour
==
nr_neigh
)
if
(
i
<
node
->
which
)
node
->
which
=
i
;
struct
nr_node
*
nr_nodet
;
struct
hlist_node
*
node
;
spin_lock_bh
(
&
nr_node_list_lock
);
nr_node_for_each
(
nr_nodet
,
node
,
&
nr_node_list
)
{
nr_node_lock
(
nr_nodet
);
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
)
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
;
}
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
;
}
nr_neigh
->
callsign
=
*
ax25
;
nr_neigh
->
digipeat
=
NULL
;
...
...
@@ -104,48 +151,58 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
nr_neigh
->
count
=
0
;
nr_neigh
->
number
=
nr_neigh_no
++
;
nr_neigh
->
failed
=
0
;
atomic_set
(
&
nr_neigh
->
refcount
,
1
);
if
(
ax25_digi
!=
NULL
&&
ax25_digi
->
ndigi
>
0
)
{
if
((
nr_neigh
->
digipeat
=
kmalloc
(
sizeof
(
*
ax25_digi
),
GFP_KERNEL
))
==
NULL
)
{
kfree
(
nr_neigh
);
if
(
nr_node
)
nr_node_put
(
nr_node
);
return
-
ENOMEM
;
}
memcpy
(
nr_neigh
->
digipeat
,
ax25_digi
,
sizeof
(
*
ax25_digi
));
}
spin_lock_bh
(
&
nr_neigh_lock
);
nr_neigh
->
next
=
nr_neigh_list
;
nr_neigh_
list
=
nr_neigh
;
spin_unlock_bh
(
&
nr_neigh_lock
);
spin_lock_bh
(
&
nr_neigh_l
ist_l
ock
);
hlist_add_head
(
&
nr_neigh
->
neigh_node
,
&
nr_neigh_list
)
;
nr_neigh_
hold
(
nr_neigh
)
;
spin_unlock_bh
(
&
nr_neigh_l
ist_l
ock
);
}
if
(
quality
!=
0
&&
ax25cmp
(
nr
,
ax25
)
==
0
&&
!
nr_neigh
->
locked
)
nr_neigh
->
quality
=
quality
;
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
;
}
nr_node
->
callsign
=
*
nr
;
strcpy
(
nr_node
->
mnemonic
,
mnemonic
);
nr_node
->
which
=
0
;
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
].
obs_count
=
obs_count
;
nr_node
->
routes
[
0
].
neighbour
=
nr_neigh
;
spin_lock_bh
(
&
nr_node_lock
);
nr_node
->
next
=
nr_node_list
;
nr_node_list
=
nr_node
;
spin_unlock_bh
(
&
nr_node_lock
);
nr_neigh_hold
(
nr_neigh
);
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
;
}
nr_node_lock
(
nr_node
);
if
(
quality
!=
0
)
strcpy
(
nr_node
->
mnemonic
,
mnemonic
);
...
...
@@ -171,11 +228,13 @@ static int nr_add_node(ax25_address *nr, const char *mnemonic, ax25_address *ax2
nr_node
->
which
++
;
nr_node
->
count
++
;
nr_neigh_hold
(
nr_neigh
);
nr_neigh
->
count
++
;
}
else
{
/* It must be better than the worst */
if
(
quality
>
nr_node
->
routes
[
2
].
quality
)
{
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
)
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
nr_node
->
routes
[
2
].
obs_count
=
obs_count
;
nr_node
->
routes
[
2
].
neighbour
=
nr_neigh
;
nr_neigh_hold
(
nr_neigh
);
nr_neigh
->
count
++
;
}
}
...
...
@@ -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
;
}
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
;
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
;
}
hlist_del_init
(
&
nr_node
->
node_node
);
nr_node_put
(
nr_node
);
}
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
;
}
#define nr_remove_node_locked(__node) \
__nr_remove_node(__node)
s
=
s
->
next
;
}
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
;
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
;
}
hlist_del_init
(
&
nr_neigh
->
neigh_node
);
nr_neigh_put
(
nr_neigh
);
}
while
(
s
!=
NULL
&&
s
->
next
!=
NULL
)
{
if
(
s
->
next
==
nr_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
;
}
#define nr_remove_neigh_locked(__neigh) \
__nr_remove_neigh(__neigh)
s
=
s
->
next
;
}
spin_unlock_bh
(
&
nr_neigh_lock
);
static
void
nr_remove_neigh
(
struct
nr_neigh
*
nr_neigh
)
{
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
struct
nr_neigh
*
nr_neigh
;
int
i
;
for
(
nr_node
=
nr_node_list
;
nr_node
!=
NULL
;
nr_node
=
nr_node
->
next
)
if
(
ax25cmp
(
callsign
,
&
nr_node
->
callsign
)
==
0
)
break
;
nr_node
=
nr_node_get
(
callsign
);
if
(
nr_node
==
NULL
)
return
-
EINVAL
;
for
(
nr_neigh
=
nr_neigh_list
;
nr_neigh
!=
NULL
;
nr_neigh
=
nr_neigh
->
next
)
if
(
ax25cmp
(
neighbour
,
&
nr_neigh
->
callsign
)
==
0
&&
nr_neigh
->
dev
==
dev
)
break
;
nr_neigh
=
nr_neigh_get_dev
(
neighbour
,
dev
);
if
(
nr_neigh
==
NULL
)
if
(
nr_neigh
==
NULL
)
{
nr_node_put
(
nr_node
);
return
-
EINVAL
;
}
nr_node_lock
(
nr_node
);
for
(
i
=
0
;
i
<
nr_node
->
count
;
i
++
)
{
if
(
nr_node
->
routes
[
i
].
neighbour
==
nr_neigh
)
{
nr_neigh
->
count
--
;
nr_neigh_put
(
nr_neigh
);
if
(
nr_neigh
->
count
==
0
&&
!
nr_neigh
->
locked
)
nr_remove_neigh
(
nr_neigh
);
nr_neigh_put
(
nr_neigh
);
nr_node
->
count
--
;
...
...
@@ -346,11 +387,16 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
case
2
:
break
;
}
nr_node_put
(
nr_node
);
}
nr_node_unlock
(
nr_node
);
return
0
;
}
}
nr_neigh_put
(
nr_neigh
);
nr_node_unlock
(
nr_node
);
nr_node_put
(
nr_node
);
return
-
EINVAL
;
}
...
...
@@ -362,13 +408,13 @@ static int nr_add_neigh(ax25_address *callsign, ax25_digi *ax25_digi, struct net
{
struct
nr_neigh
*
nr_neigh
;
for
(
nr_neigh
=
nr_neigh_list
;
nr_neigh
!=
NULL
;
nr_neigh
=
nr_neigh
->
next
)
{
if
(
ax25cmp
(
callsign
,
&
nr_neigh
->
callsign
)
==
0
&&
nr_neigh
->
dev
==
dev
)
{
nr_neigh
=
nr_neigh_get_dev
(
callsign
,
dev
);
if
(
nr_neigh
)
{
nr_neigh
->
quality
=
quality
;
nr_neigh
->
locked
=
1
;
nr_neigh_put
(
nr_neigh
);
return
0
;
}
}
if
((
nr_neigh
=
kmalloc
(
sizeof
(
*
nr_neigh
),
GFP_ATOMIC
))
==
NULL
)
return
-
ENOMEM
;
...
...
@@ -382,6 +428,7 @@ static int nr_add_neigh(ax25_address *callsign, ax25_digi *ax25_digi, struct net
nr_neigh
->
count
=
0
;
nr_neigh
->
number
=
nr_neigh_no
++
;
nr_neigh
->
failed
=
0
;
atomic_set
(
&
nr_neigh
->
refcount
,
1
);
if
(
ax25_digi
!=
NULL
&&
ax25_digi
->
ndigi
>
0
)
{
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
memcpy
(
nr_neigh
->
digipeat
,
ax25_digi
,
sizeof
(
*
ax25_digi
));
}
spin_lock_bh
(
&
nr_neigh_lock
);
nr_neigh
->
next
=
nr_neigh_list
;
nr_neigh_list
=
nr_neigh
;
spin_unlock_bh
(
&
nr_neigh_lock
);
spin_lock_bh
(
&
nr_neigh_l
ist_l
ock
);
hlist_add_head
(
&
nr_neigh
->
neigh_node
,
&
nr_neigh_list
)
;
/* refcount is initialized at 1 */
spin_unlock_bh
(
&
nr_neigh_l
ist_l
ock
);
return
0
;
}
...
...
@@ -407,9 +454,7 @@ static int nr_del_neigh(ax25_address *callsign, struct net_device *dev, unsigned
{
struct
nr_neigh
*
nr_neigh
;
for
(
nr_neigh
=
nr_neigh_list
;
nr_neigh
!=
NULL
;
nr_neigh
=
nr_neigh
->
next
)
if
(
ax25cmp
(
callsign
,
&
nr_neigh
->
callsign
)
==
0
&&
nr_neigh
->
dev
==
dev
)
break
;
nr_neigh
=
nr_neigh_get_dev
(
callsign
,
dev
);
if
(
nr_neigh
==
NULL
)
return
-
EINVAL
;
...
...
@@ -418,6 +463,7 @@ static int nr_del_neigh(ax25_address *callsign, struct net_device *dev, unsigned
if
(
nr_neigh
->
count
==
0
)
nr_remove_neigh
(
nr_neigh
);
nr_neigh_put
(
nr_neigh
);
return
0
;
}
...
...
@@ -430,15 +476,13 @@ static int nr_del_neigh(ax25_address *callsign, struct net_device *dev, unsigned
static
int
nr_dec_obs
(
void
)
{
struct
nr_neigh
*
nr_neigh
;
struct
nr_node
*
s
,
*
nr_node
;
struct
nr_node
*
s
;
struct
hlist_node
*
node
,
*
nodet
;
int
i
;
nr_node
=
nr_node_list
;
while
(
nr_node
!=
NULL
)
{
s
=
nr_node
;
nr_node
=
nr_node
->
next
;
spin_lock_bh
(
&
nr_node_list_lock
);
nr_node_for_each_safe
(
s
,
node
,
nodet
,
&
nr_node_list
)
{
nr_node_lock
(
s
);
for
(
i
=
0
;
i
<
s
->
count
;
i
++
)
{
switch
(
s
->
routes
[
i
].
obs_count
)
{
case
0
:
/* A locked entry */
...
...
@@ -448,6 +492,7 @@ static int nr_dec_obs(void)
nr_neigh
=
s
->
routes
[
i
].
neighbour
;
nr_neigh
->
count
--
;
nr_neigh_put
(
nr_neigh
);
if
(
nr_neigh
->
count
==
0
&&
!
nr_neigh
->
locked
)
nr_remove_neigh
(
nr_neigh
);
...
...
@@ -472,8 +517,10 @@ static int nr_dec_obs(void)
}
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
;
}
...
...
@@ -483,21 +530,17 @@ static int nr_dec_obs(void)
*/
void
nr_rt_device_down
(
struct
net_device
*
dev
)
{
struct
nr_neigh
*
s
,
*
nr_neigh
=
nr_neigh_list
;
struct
nr_node
*
t
,
*
nr_node
;
struct
nr_neigh
*
s
;
struct
hlist_node
*
node
,
*
nodet
,
*
node2
,
*
node2t
;
struct
nr_node
*
t
;
int
i
;
while
(
nr_neigh
!=
NULL
)
{
s
=
nr_neigh
;
nr_neigh
=
nr_neigh
->
next
;
spin_lock_bh
(
&
nr_neigh_list_lock
);
nr_neigh_for_each_safe
(
s
,
node
,
nodet
,
&
nr_neigh_list
)
{
if
(
s
->
dev
==
dev
)
{
nr_node
=
nr_node_list
;
while
(
nr_node
!=
NULL
)
{
t
=
nr_node
;
nr_node
=
nr_node
->
next
;
spin_lock_bh
(
&
nr_node_list_lock
);
nr_node_for_each_safe
(
t
,
node2
,
node2t
,
&
nr_node_list
)
{
nr_node_lock
(
t
);
for
(
i
=
0
;
i
<
t
->
count
;
i
++
)
{
if
(
t
->
routes
[
i
].
neighbour
==
s
)
{
t
->
count
--
;
...
...
@@ -514,12 +557,15 @@ void nr_rt_device_down(struct net_device *dev)
}
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)
if
(
first
==
NULL
||
strncmp
(
dev
->
name
,
first
->
name
,
3
)
<
0
)
first
=
dev
;
}
if
(
first
)
dev_hold
(
first
);
read_unlock
(
&
dev_base_lock
);
return
first
;
...
...
@@ -603,6 +651,7 @@ int nr_rt_ioctl(unsigned int cmd, void *arg)
{
struct
nr_route_struct
nr_route
;
struct
net_device
*
dev
;
int
ret
;
switch
(
cmd
)
{
case
SIOCADDRT
:
...
...
@@ -610,23 +659,29 @@ int nr_rt_ioctl(unsigned int cmd, void *arg)
return
-
EFAULT
;
if
((
dev
=
nr_ax25_dev_get
(
nr_route
.
device
))
==
NULL
)
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
;
}
switch
(
nr_route
.
type
)
{
case
NETROM_NODE
:
ret
urn
nr_add_node
(
&
nr_route
.
callsign
,
ret
=
nr_add_node
(
&
nr_route
.
callsign
,
nr_route
.
mnemonic
,
&
nr_route
.
neighbour
,
nr_call_to_digi
(
nr_route
.
ndigis
,
nr_route
.
digipeaters
),
dev
,
nr_route
.
quality
,
nr_route
.
obs_count
);
break
;
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
),
dev
,
nr_route
.
quality
);
break
;
default:
ret
urn
-
EINVAL
;
ret
=
-
EINVAL
;
}
dev_put
(
dev
);
return
ret
;
case
SIOCDELRT
:
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)
return
-
EINVAL
;
switch
(
nr_route
.
type
)
{
case
NETROM_NODE
:
ret
urn
nr_del_node
(
&
nr_route
.
callsign
,
ret
=
nr_del_node
(
&
nr_route
.
callsign
,
&
nr_route
.
neighbour
,
dev
);
break
;
case
NETROM_NEIGH
:
ret
urn
nr_del_neigh
(
&
nr_route
.
callsign
,
ret
=
nr_del_neigh
(
&
nr_route
.
callsign
,
dev
,
nr_route
.
quality
);
break
;
default:
ret
urn
-
EINVAL
;
ret
=
-
EINVAL
;
}
dev_put
(
dev
);
return
ret
;
case
SIOCNRDECOBS
:
return
nr_dec_obs
();
...
...
@@ -660,22 +719,36 @@ int nr_rt_ioctl(unsigned int cmd, void *arg)
*/
void
nr_link_failed
(
ax25_cb
*
ax25
,
int
reason
)
{
struct
nr_neigh
*
nr_neigh
;
struct
nr_node
*
nr_node
;
for
(
nr_neigh
=
nr_neigh_list
;
nr_neigh
!=
NULL
;
nr_neigh
=
nr_neigh
->
next
)
if
(
nr_neigh
->
ax25
==
ax25
)
struct
nr_neigh
*
s
,
*
nr_neigh
=
NULL
;
struct
hlist_node
*
node
;
struct
nr_node
*
nr_node
=
NULL
;
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
;
}
spin_unlock_bh
(
&
nr_neigh_list_lock
);
if
(
nr_neigh
==
NULL
)
return
;
nr_neigh
->
ax25
=
NULL
;
// ax25_cb_put(ax25);
if
(
++
nr_neigh
->
failed
<
sysctl_netrom_link_fails_count
)
return
;
for
(
nr_node
=
nr_node_list
;
nr_node
!=
NULL
;
nr_node
=
nr_node
->
next
)
if
(
++
nr_neigh
->
failed
<
sysctl_netrom_link_fails_count
)
{
nr_neigh_put
(
nr_neigh
);
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
)
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)
struct
nr_node
*
nr_node
;
struct
net_device
*
dev
;
unsigned
char
*
dptr
;
ax25_cb
*
ax25s
;
int
ret
;
struct
sk_buff
*
skbn
;
nr_src
=
(
ax25_address
*
)(
skb
->
data
+
0
);
...
...
@@ -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
(
ax25
==
NULL
)
/* Its from me */
ret
urn
nr_loopback_queue
(
skb
);
ret
=
nr_loopback_queue
(
skb
);
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
)
return
0
;
/* Its Time-To-Live has expired */
if
(
--
skb
->
data
[
14
]
==
0
)
if
(
skb
->
data
[
14
]
==
1
)
{
return
0
;
}
for
(
nr_node
=
nr_node_list
;
nr_node
!=
NULL
;
nr_node
=
nr_node
->
next
)
if
(
ax25cmp
(
nr_dest
,
&
nr_node
->
callsign
)
==
0
)
break
;
nr_node
=
nr_node_get
(
nr_dest
);
if
(
nr_node
==
NULL
)
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
;
}
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
;
}
kfree_skb
(
skb
);
skb
=
skbn
;
skb
->
data
[
14
]
--
;
dptr
=
skb_push
(
skb
,
1
);
*
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
;
int
len
=
0
;
off_t
pos
=
0
;
off_t
begin
=
0
;
int
i
;
struct
hlist_node
*
node
;
int
i
=
1
;
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
;
}
spin_lock_bh
(
&
nr_node_lock
);
len
+=
sprintf
(
buffer
,
"callsign mnemonic w n qual obs neigh qual obs neigh qual obs neigh
\n
"
);
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
);
}
static
int
nr_node_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
int
i
;
for
(
nr_node
=
nr_node_list
;
nr_node
!=
NULL
;
nr_node
=
nr_node
->
next
)
{
len
+=
sprintf
(
buffer
+
len
,
"%-9s %-7s %d %d"
,
if
(
v
==
NETROM_PROC_START
)
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
),
(
nr_node
->
mnemonic
[
0
]
==
'\0'
)
?
"*"
:
nr_node
->
mnemonic
,
nr_node
->
which
+
1
,
nr_node
->
count
);
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
].
obs_count
,
nr_node
->
routes
[
i
].
neighbour
->
number
);
}
nr_node_unlock
(
nr_node
);
len
+=
sprintf
(
buffer
+
len
,
"
\n
"
);
seq_puts
(
seq
,
"
\n
"
);
}
return
0
;
}
pos
=
begin
+
len
;
static
struct
seq_operations
nr_node_seqops
=
{
.
start
=
nr_node_start
,
.
next
=
nr_node_next
,
.
stop
=
nr_node_stop
,
.
show
=
nr_node_show
,
};
if
(
pos
<
offset
)
{
len
=
0
;
begin
=
pos
;
}
static
int
nr_node_info_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
return
seq_open
(
file
,
&
nr_node_seqops
)
;
}
if
(
pos
>
offset
+
length
)
break
;
struct
file_operations
nr_nodes_fops
=
{
.
owner
=
THIS_MODULE
,
.
open
=
nr_node_info_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
seq_release
,
};
static
void
*
nr_neigh_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
struct
nr_neigh
*
nr_neigh
;
struct
hlist_node
*
node
;
int
i
=
1
;
spin_lock_bh
(
&
nr_neigh_list_lock
);
if
(
*
pos
==
0
)
return
NETROM_PROC_START
;
nr_neigh_for_each
(
nr_neigh
,
node
,
&
nr_neigh_list
)
{
if
(
i
==
*
pos
)
return
nr_neigh
;
}
spin_unlock_bh
(
&
nr_node_lock
);
return
NULL
;
}
*
start
=
buffer
+
(
offset
-
begin
);
len
-=
(
offset
-
begin
);
static
void
*
nr_neigh_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
struct
hlist_node
*
node
;
++*
pos
;
if
(
len
>
length
)
len
=
length
;
node
=
(
v
==
NETROM_PROC_START
)
?
nr_neigh_list
.
first
:
((
struct
nr_neigh
*
)
v
)
->
neigh_node
.
next
;
return
len
;
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
;
spin_lock_bh
(
&
nr_neigh_lock
);
len
+=
sprintf
(
buffer
,
"addr callsign dev qual lock count failed digipeaters
\n
"
);
if
(
v
==
NETROM_PROC_START
)
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
)
{
len
+=
sprintf
(
buffer
+
len
,
"%05d %-9s %-4s %3d %d %3d %3d"
,
seq_printf
(
seq
,
"%05d %-9s %-4s %3d %d %3d %3d"
,
nr_neigh
->
number
,
ax2asc
(
&
nr_neigh
->
callsign
),
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)
if
(
nr_neigh
->
digipeat
!=
NULL
)
{
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
)
break
;
seq_puts
(
seq
,
"
\n
"
);
}
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
);
len
-=
(
offset
-
begin
);
static
int
nr_neigh_info_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
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.
*/
void
__exit
nr_rt_free
(
void
)
{
struct
nr_neigh
*
s
,
*
nr_neigh
=
nr_neigh_list
;
struct
nr_node
*
t
,
*
nr_node
=
nr_node_list
;
while
(
nr_node
!=
NULL
)
{
t
=
nr_node
;
nr_node
=
nr_node
->
next
;
nr_remove_node
(
t
);
struct
nr_neigh
*
s
=
NULL
;
struct
nr_node
*
t
=
NULL
;
struct
hlist_node
*
node
,
*
nodet
;
spin_lock_bh
(
&
nr_neigh_list_lock
);
spin_lock_bh
(
&
nr_node_list_lock
);
nr_node_for_each_safe
(
t
,
node
,
nodet
,
&
nr_node_list
)
{
nr_node_lock
(
t
);
nr_remove_node_locked
(
t
);
nr_node_unlock
(
t
);
}
while
(
nr_neigh
!=
NULL
)
{
s
=
nr_neigh
;
nr_neigh
=
nr_neigh
->
next
;
nr_remove_neigh
(
s
);
nr_neigh_for_each_safe
(
s
,
node
,
nodet
,
&
nr_neigh_list
)
{
while
(
s
->
count
)
{
s
->
count
--
;
nr_neigh_put
(
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)
unsigned
char
*
dptr
;
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
)
{
case
NR_CONNREQ
:
...
...
@@ -151,7 +151,7 @@ void nr_write_internal(struct sock *sk, int frametype)
/*
* 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
));
...
...
@@ -219,12 +219,12 @@ void nr_transmit_refusal(struct sk_buff *skb, int mine)
unsigned
char
*
dptr
;
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
)
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
);
...
...
net/netrom/nr_timer.c
View file @
293f3e3f
...
...
@@ -143,7 +143,10 @@ static void nr_heartbeat_expiry(unsigned long param)
is accepted() it isn't 'dead' so doesn't get removed. */
if
(
sock_flag
(
sk
,
SOCK_DESTROY
)
||
(
sk
->
sk_state
==
TCP_LISTEN
&&
sock_flag
(
sk
,
SOCK_DEAD
)))
{
sock_hold
(
sk
);
nr_destroy_socket
(
sk
);
bh_unlock_sock
(
sk
);
sock_put
(
sk
);
return
;
}
break
;
...
...
@@ -227,6 +230,7 @@ static void nr_t1timer_expiry(unsigned long param)
case
NR_STATE_1
:
if
(
nr
->
n2count
==
nr
->
n2
)
{
nr_disconnect
(
sk
,
ETIMEDOUT
);
bh_unlock_sock
(
sk
);
return
;
}
else
{
nr
->
n2count
++
;
...
...
@@ -237,6 +241,7 @@ static void nr_t1timer_expiry(unsigned long param)
case
NR_STATE_2
:
if
(
nr
->
n2count
==
nr
->
n2
)
{
nr_disconnect
(
sk
,
ETIMEDOUT
);
bh_unlock_sock
(
sk
);
return
;
}
else
{
nr
->
n2count
++
;
...
...
@@ -247,6 +252,7 @@ static void nr_t1timer_expiry(unsigned long param)
case
NR_STATE_3
:
if
(
nr
->
n2count
==
nr
->
n2
)
{
nr_disconnect
(
sk
,
ETIMEDOUT
);
bh_unlock_sock
(
sk
);
return
;
}
else
{
nr
->
n2count
++
;
...
...
net/netrom/sysctl_net_netrom.c
View file @
293f3e3f
...
...
@@ -15,9 +15,9 @@
/*
* Values taken from NET/ROM documentation.
*/
static
int
min_quality
[
1
],
max_quality
[]
=
{
255
};
static
int
min_obs
[
1
],
max_obs
[]
=
{
255
};
static
int
min_ttl
[
1
],
max_ttl
[]
=
{
255
};
static
int
min_quality
[
]
=
{
0
},
max_quality
[]
=
{
255
};
static
int
min_obs
[
]
=
{
0
},
max_obs
[]
=
{
255
};
static
int
min_ttl
[
]
=
{
0
},
max_ttl
[]
=
{
255
};
static
int
min_t1
[]
=
{
5
*
HZ
};
static
int
max_t1
[]
=
{
600
*
HZ
};
static
int
min_n2
[]
=
{
2
},
max_n2
[]
=
{
127
};
...
...
@@ -28,7 +28,7 @@ static int max_t4[] = {1000 * HZ};
static
int
min_window
[]
=
{
1
},
max_window
[]
=
{
127
};
static
int
min_idle
[]
=
{
0
*
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
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,
len
=
sprintf
(
tmpbuf
,
"%d"
,
*
(
unsigned
int
*
)
table
->
data
);
if
(
len
>
left
)
len
=
left
;
copy_to_user
(
buffer
,
tmpbuf
,
len
);
__
copy_to_user
(
buffer
,
tmpbuf
,
len
);
if
((
left
-=
len
)
>
0
)
{
put_user
(
'\n'
,
(
char
*
)
buffer
+
len
);
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