Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
c40dad8b
Commit
c40dad8b
authored
Aug 14, 2003
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge nuts.ninka.net:/home/davem/src/BK/network-2.5
into nuts.ninka.net:/home/davem/src/BK/net-2.5
parents
310b411f
edab0449
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
1463 additions
and
465 deletions
+1463
-465
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/wan/lapbether.c
drivers/net/wan/lapbether.c
+86
-153
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/ipconfig.c
net/ipv4/ipconfig.c
+6
-6
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/sunrpc/sysctl.c
net/sunrpc/sysctl.c
+1
-1
No files found.
Documentation/crypto/api-intro.txt
View file @
c40dad8b
...
...
@@ -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 @
c40dad8b
...
...
@@ -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 @
c40dad8b
...
...
@@ -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 @
c40dad8b
/* 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 @
c40dad8b
...
...
@@ -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 @
c40dad8b
...
...
@@ -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 @
c40dad8b
...
...
@@ -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
)
return
-
ENOMEM
;
atmvcc
->
dev_data
=
lvcc
;
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 @
c40dad8b
...
...
@@ -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
net_device
*
ethdev
;
/* link to ethernet device */
struct
net_device
axdev
;
/* bpq device (bpq#) */
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_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
);
len
+=
sprintf
(
buffer
,
"dev ether destination accept from
\n
"
);
for
(
bpqdev
=
bpq_devices
;
bpqdev
!=
NULL
;
bpqdev
=
bpqdev
->
next
)
{
len
+=
sprintf
(
buffer
+
len
,
"%-5s %-10s %s "
,
bpqdev
->
axdev
.
name
,
bpqdev
->
ethname
,
bpq_print_ethaddr
(
bpqdev
->
dest_addr
));
len
+=
sprintf
(
buffer
+
len
,
"%s
\n
"
,
(
bpqdev
->
acpt_addr
[
0
]
&
0x01
)
?
"*"
:
bpq_print_ethaddr
(
bpqdev
->
acpt_addr
));
rcu_read_lock
();
pos
=
begin
+
len
;
if
(
pos
<
offset
)
{
len
=
0
;
begin
=
pos
;
}
if
(
pos
>
offset
+
length
)
break
;
if
(
*
pos
==
0
)
return
BPQ_PROC_START
;
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
;
memset
(
bpq
,
0
,
sizeof
(
struct
bpqdev
));
rcu_read_unlock
();
}
bpq
->
ethdev
=
dev
;
bpq
->
ethname
[
sizeof
(
bpq
->
ethname
)
-
1
]
=
'\0'
;
strncpy
(
bpq
->
ethname
,
dev
->
name
,
sizeof
(
bpq
->
ethname
)
-
1
);
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
));
memcpy
(
bpq
->
dest_addr
,
bcast_addr
,
sizeof
(
bpq_eth_addr
));
memcpy
(
bpq
->
acpt_addr
,
bcast_addr
,
sizeof
(
bpq_eth_addr
));
seq_printf
(
seq
,
"%s
\n
"
,
(
bpqdev
->
acpt_addr
[
0
]
&
0x01
)
?
"*"
:
bpq_print_ethaddr
(
bpqdev
->
acpt_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
;
spin_unlock_irqrestore
(
&
bpq_lock
,
flags
);
ndev
=
alloc_netdev
(
sizeof
(
struct
bpqdev
),
"bpq%d"
,
bpq_setup
);
if
(
!
ndev
)
return
-
ENOMEM
;
bpq
=
ndev
->
priv
;
dev_hold
(
edev
);
bpq
->
ethdev
=
edev
;
bpq
->
axdev
=
ndev
;
memcpy
(
bpq
->
dest_addr
,
bcast_addr
,
sizeof
(
bpq_eth_addr
));
memcpy
(
bpq
->
acpt_addr
,
bcast_addr
,
sizeof
(
bpq_eth_addr
));
err
=
dev_alloc_name
(
ndev
,
ndev
->
name
);
if
(
err
<
0
)
goto
error
;
err
=
register_netdevice
(
ndev
);
if
(
err
)
goto
error
;
/* List protected by RTNL */
list_add_rcu
(
&
bpq
->
bpq_list
,
&
bpq_devices
);
return
0
;
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,22 +563,27 @@ 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 */
if
(
bpq_get_ax25_dev
(
dev
)
==
NULL
)
bpq_new_device
(
dev
);
break
;
case
NETDEV_DOWN
:
/* ethernet device closed -> close BPQ interface */
if
((
dev
=
bpq_get_ax25_dev
(
dev
))
!=
NULL
)
dev_close
(
dev
);
break
;
default:
break
;
case
NETDEV_UP
:
/* new ethernet device -> new BPQ interface */
if
(
bpq_get_ax25_dev
(
dev
)
==
NULL
)
bpq_new_device
(
dev
);
break
;
case
NETDEV_DOWN
:
/* ethernet device closed -> close BPQ interface */
if
((
dev
=
bpq_get_ax25_dev
(
dev
))
!=
NULL
)
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/wan/lapbether.c
View file @
c40dad8b
...
...
@@ -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
*/
lapbeth
=
lapbeth_get_x25_dev
(
dev
);
if
(
lapbeth
)
lapbeth_put
(
lapbeth
);
else
/* New ethernet device -> new LAPB interface */
if
(
lapbeth_get_x25_dev
(
dev
)
==
NULL
)
lapbeth_new_device
(
dev
);
break
;
case
NETDEV_
GOING_DOWN
:
case
NETDEV_DOWN
:
/* ethernet device closed -> close LAPB interface */
case
NETDEV_
DOWN
:
/* ethernet device closed -> close LAPB interface */
lapbeth
=
lapbeth_get_x25_dev
(
dev
);
if
(
lapbeth
)
{
dev_close
(
lapbeth
->
ethdev
);
lapbeth_put
(
lapbeth
);
}
if
(
lapbeth
)
dev_close
(
lapbeth
->
axdev
);
break
;
case
NETDEV_UNREGISTER
:
/* ethernet device disappears -> remove LAPB interface */
lapbeth
=
lapbeth_get_x25_dev
(
dev
);
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
);
...
...
net/bridge/br_stp_bpdu.c
View file @
c40dad8b
...
...
@@ -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 @
c40dad8b
...
...
@@ -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/ipconfig.c
View file @
c40dad8b
...
...
@@ -125,14 +125,14 @@ int ic_proto_enabled __initdata = 0
int
ic_host_name_set
__initdata
=
0
;
/* Host name set by us? */
u32
ic_myaddr
__initdata
=
INADDR_NONE
;
/* My IP address */
u32
ic_netmask
__initdata
=
INADDR_NONE
;
/* Netmask for local subnet */
u32
ic_gateway
__initdata
=
INADDR_NONE
;
/* Gateway IP address */
u32
ic_myaddr
=
INADDR_NONE
;
/* My IP address */
u32
ic_netmask
=
INADDR_NONE
;
/* Netmask for local subnet */
u32
ic_gateway
=
INADDR_NONE
;
/* Gateway IP address */
u32
ic_servaddr
__initdata
=
INADDR_NONE
;
/* Boot server IP address */
u32
ic_servaddr
=
INADDR_NONE
;
/* Boot server IP address */
u32
root_server_addr
__initdata
=
INADDR_NONE
;
/* Address of NFS server */
u8
root_server_path
[
256
]
__initdata
=
{
0
,
};
/* Path to mount as root */
u32
root_server_addr
=
INADDR_NONE
;
/* Address of NFS server */
u8
root_server_path
[
256
]
=
{
0
,
};
/* Path to mount as root */
/* Persistent data: */
...
...
net/ipv4/netfilter/ipt_MASQUERADE.c
View file @
c40dad8b
...
...
@@ -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 @
c40dad8b
...
...
@@ -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 @
c40dad8b
...
...
@@ -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/sunrpc/sysctl.c
View file @
c40dad8b
...
...
@@ -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