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
36fb0cbc
Commit
36fb0cbc
authored
Feb 24, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/davem/net-2.6
into ppc970.osdl.org:/home/torvalds/v2.5/linux
parents
9b91e15b
5c4cee5b
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
127 additions
and
340 deletions
+127
-340
drivers/atm/horizon.c
drivers/atm/horizon.c
+1
-1
drivers/net/wan/sdladrv.c
drivers/net/wan/sdladrv.c
+2
-4
drivers/net/wan/sdlamain.c
drivers/net/wan/sdlamain.c
+3
-4
include/linux/netfilter_ipv4/ip_conntrack_amanda.h
include/linux/netfilter_ipv4/ip_conntrack_amanda.h
+2
-11
net/atm/clip.c
net/atm/clip.c
+4
-10
net/ipv4/ip_sockglue.c
net/ipv4/ip_sockglue.c
+8
-1
net/ipv4/netfilter/ip_conntrack_amanda.c
net/ipv4/netfilter/ip_conntrack_amanda.c
+39
-109
net/ipv4/netfilter/ip_nat_amanda.c
net/ipv4/netfilter/ip_nat_amanda.c
+42
-119
net/ipv6/ipv6_sockglue.c
net/ipv6/ipv6_sockglue.c
+7
-1
net/ipv6/udp.c
net/ipv6/udp.c
+8
-6
net/socket.c
net/socket.c
+0
-12
net/wanrouter/wanmain.c
net/wanrouter/wanmain.c
+7
-56
net/xfrm/xfrm_user.c
net/xfrm/xfrm_user.c
+4
-6
No files found.
drivers/atm/horizon.c
View file @
36fb0cbc
...
...
@@ -1802,7 +1802,7 @@ static int hrz_send (struct atm_vcc * atm_vcc, struct sk_buff * skb) {
/********** reset a card **********/
static
void
__init
hrz_reset
(
const
hrz_dev
*
dev
)
{
static
void
hrz_reset
(
const
hrz_dev
*
dev
)
{
u32
control_0_reg
=
rd_regl
(
dev
,
CONTROL_0_REG
);
// why not set RESET_HORIZON to one and wait for the card to
...
...
drivers/net/wan/sdladrv.c
View file @
36fb0cbc
...
...
@@ -320,7 +320,7 @@ static int pci_slot_ar[MAX_S514_CARDS];
* Context: process
*/
in
t
sdladrv_init
(
void
)
static
int
__ini
t
sdladrv_init
(
void
)
{
int
i
=
0
;
...
...
@@ -340,18 +340,16 @@ int sdladrv_init(void)
return
0
;
}
#ifdef MODULE
/*============================================================================
* Module 'remove' entry point.
* o release all remaining system resources
*/
static
void
sdladrv_cleanup
(
void
)
static
void
__exit
sdladrv_cleanup
(
void
)
{
}
module_init
(
sdladrv_init
);
module_exit
(
sdladrv_cleanup
);
#endif
/******* Kernel APIs ********************************************************/
...
...
drivers/net/wan/sdlamain.c
View file @
36fb0cbc
...
...
@@ -50,6 +50,7 @@
#include <linux/stddef.h>
/* offsetof(), etc. */
#include <linux/errno.h>
/* return codes */
#include <linux/string.h>
/* inline memset(), etc. */
#include <linux/init.h>
#include <linux/slab.h>
/* kmalloc(), kfree() */
#include <linux/kernel.h>
/* printk(), and other useful stuff */
#include <linux/module.h>
/* support for loadable modules */
...
...
@@ -232,7 +233,7 @@ static int wanpipe_bh_critical;
* Context: process
*/
in
t
wanpipe_init
(
void
)
static
int
__ini
t
wanpipe_init
(
void
)
{
int
cnt
,
err
=
0
;
...
...
@@ -297,13 +298,12 @@ int wanpipe_init(void)
return
err
;
}
#ifdef MODULE
/*============================================================================
* Module 'remove' entry point.
* o unregister all adapters from the WAN router
* o release all remaining system resources
*/
static
void
wanpipe_cleanup
(
void
)
static
void
__exit
wanpipe_cleanup
(
void
)
{
int
i
;
...
...
@@ -322,7 +322,6 @@ static void wanpipe_cleanup(void)
module_init
(
wanpipe_init
);
module_exit
(
wanpipe_cleanup
);
#endif
/******* WAN Device Driver Entry Points *************************************/
...
...
include/linux/netfilter_ipv4/ip_conntrack_amanda.h
View file @
36fb0cbc
...
...
@@ -2,20 +2,11 @@
#define _IP_CONNTRACK_AMANDA_H
/* AMANDA tracking. */
#ifdef __KERNEL__
#include <linux/netfilter_ipv4/lockhelp.h>
/* Protects amanda part of conntracks */
DECLARE_LOCK_EXTERN
(
ip_amanda_lock
);
#endif
struct
ip_ct_amanda_expect
{
u_int16_t
port
;
/* port number of this expectation */
u_int16_t
offset
;
/* offset of
the port specification
in ctrl packet */
u_int16_t
len
;
/*
the length of the port number specification
*/
u_int16_t
offset
;
/* offset of
port
in ctrl packet */
u_int16_t
len
;
/*
length of the port number string
*/
};
#endif
/* _IP_CONNTRACK_AMANDA_H */
net/atm/clip.c
View file @
36fb0cbc
...
...
@@ -885,7 +885,7 @@ static void *arp_get_idx(struct arp_state *state, loff_t l)
if
(
v
)
goto
done
;
}
state
->
n
=
clip_tbl
_hook
->
hash_buckets
[
state
->
bucket
+
1
];
state
->
n
=
clip_tbl
.
hash_buckets
[
state
->
bucket
+
1
];
}
done:
return
v
;
...
...
@@ -896,18 +896,12 @@ static void *arp_seq_start(struct seq_file *seq, loff_t *pos)
struct
arp_state
*
state
=
seq
->
private
;
void
*
ret
=
(
void
*
)
1
;
if
(
!
clip_tbl_hook
)
{
state
->
bucket
=
-
1
;
goto
out
;
}
read_lock_bh
(
&
clip_tbl_hook
->
lock
);
read_lock_bh
(
&
clip_tbl
.
lock
);
state
->
bucket
=
0
;
state
->
n
=
clip_tbl
_hook
->
hash_buckets
[
0
];
state
->
n
=
clip_tbl
.
hash_buckets
[
0
];
state
->
vcc
=
(
void
*
)
1
;
if
(
*
pos
)
ret
=
arp_get_idx
(
state
,
*
pos
);
out:
return
ret
;
}
...
...
@@ -916,7 +910,7 @@ static void arp_seq_stop(struct seq_file *seq, void *v)
struct
arp_state
*
state
=
seq
->
private
;
if
(
state
->
bucket
!=
-
1
)
read_unlock_bh
(
&
clip_tbl
_hook
->
lock
);
read_unlock_bh
(
&
clip_tbl
.
lock
);
}
static
void
*
arp_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
...
...
net/ipv4/ip_sockglue.c
View file @
36fb0cbc
...
...
@@ -617,10 +617,15 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt
}
case
IP_MSFILTER
:
{
extern
int
sysctl_optmem_max
;
struct
ip_msfilter
*
msf
;
if
(
optlen
<
IP_MSFILTER_SIZE
(
0
))
goto
e_inval
;
if
(
optlen
>
sysctl_optmem_max
)
{
err
=
-
ENOBUFS
;
break
;
}
msf
=
(
struct
ip_msfilter
*
)
kmalloc
(
optlen
,
GFP_KERNEL
);
if
(
msf
==
0
)
{
err
=
-
ENOBUFS
;
...
...
@@ -631,7 +636,9 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt
kfree
(
msf
);
break
;
}
if
(
IP_MSFILTER_SIZE
(
msf
->
imsf_numsrc
)
>
optlen
)
{
if
(
IP_MSFILTER_SIZE
(
msf
->
imsf_numsrc
)
<
IP_MSFILTER_SIZE
(
0
)
||
IP_MSFILTER_SIZE
(
msf
->
imsf_numsrc
)
>
optlen
)
{
kfree
(
msf
);
err
=
-
EINVAL
;
break
;
...
...
net/ipv4/netfilter/ip_conntrack_amanda.c
View file @
36fb0cbc
...
...
@@ -18,6 +18,7 @@
*
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/netfilter.h>
#include <linux/ip.h>
...
...
@@ -36,50 +37,37 @@ MODULE_LICENSE("GPL");
MODULE_PARM
(
master_timeout
,
"i"
);
MODULE_PARM_DESC
(
master_timeout
,
"timeout for the master connection"
);
DECLARE_LOCK
(
ip_amanda_lock
);
char
*
conns
[]
=
{
"DATA "
,
"MESG "
,
"INDEX "
};
#if 0
#define DEBUGP printk
#else
#define DEBUGP(format, args...)
#endif
static
char
*
conns
[]
=
{
"DATA "
,
"MESG "
,
"INDEX "
};
/* This is slow, but it's simple. --RR */
static
char
amanda_buffer
[
65536
];
static
DECLARE_LOCK
(
amanda_buffer_lock
);
static
int
help
(
struct
sk_buff
*
skb
,
struct
ip_conntrack
*
ct
,
enum
ip_conntrack_info
ctinfo
)
struct
ip_conntrack
*
ct
,
enum
ip_conntrack_info
ctinfo
)
{
char
*
data
,
*
data_limit
;
int
dir
=
CTINFO2DIR
(
ctinfo
);
struct
ip_conntrack_expect
exp
;
struct
ip_ct_amanda_expect
*
exp_amanda_info
;
char
*
data
,
*
data_limit
,
*
tmp
;
unsigned
int
dataoff
,
i
;
struct
ip_ct_amanda
*
info
=
(
struct
ip_ct_amanda
*
)
&
ct
->
help
.
ct_ftp_info
;
/*
Can't track connections formed before we registered
*/
if
(
!
info
)
/*
Only look at packets from the Amanda server
*/
if
(
CTINFO2DIR
(
ctinfo
)
==
IP_CT_DIR_ORIGINAL
)
return
NF_ACCEPT
;
/* increase the UDP timeout of the master connection as replies from
* Amanda clients to the server can be quite delayed */
ip_ct_refresh
(
ct
,
master_timeout
*
HZ
);
/* If packet is coming from Amanda server */
if
(
dir
==
IP_CT_DIR_ORIGINAL
)
return
NF_ACCEPT
;
/* No data? */
dataoff
=
skb
->
nh
.
iph
->
ihl
*
4
+
sizeof
(
struct
udphdr
);
if
(
dataoff
>=
skb
->
len
)
{
if
(
net_ratelimit
())
printk
(
"ip_conntrack_amanda_help: skblen = %u
\n
"
,
(
unsigned
)
skb
->
len
);
printk
(
"amanda_help: skblen = %u
\n
"
,
skb
->
len
);
return
NF_ACCEPT
;
}
LOCK_BH
(
&
ip_amanda
_lock
);
LOCK_BH
(
&
amanda_buffer
_lock
);
skb_copy_bits
(
skb
,
dataoff
,
amanda_buffer
,
skb
->
len
-
dataoff
);
data
=
amanda_buffer
;
data_limit
=
amanda_buffer
+
skb
->
len
-
dataoff
;
...
...
@@ -89,84 +77,39 @@ static int help(struct sk_buff *skb,
data
=
strstr
(
data
,
"CONNECT "
);
if
(
!
data
)
goto
out
;
DEBUGP
(
"ip_conntrack_amanda_help: CONNECT found in connection "
"%u.%u.%u.%u:%u %u.%u.%u.%u:%u
\n
"
,
NIPQUAD
(
iph
->
saddr
),
htons
(
udph
->
source
),
NIPQUAD
(
iph
->
daddr
),
htons
(
udph
->
dest
));
data
+=
strlen
(
"CONNECT "
);
memset
(
&
exp
,
0
,
sizeof
(
exp
));
exp
.
tuple
.
src
.
ip
=
ct
->
tuplehash
[
IP_CT_DIR_ORIGINAL
].
tuple
.
src
.
ip
;
exp
.
tuple
.
dst
.
ip
=
ct
->
tuplehash
[
IP_CT_DIR_ORIGINAL
].
tuple
.
dst
.
ip
;
exp
.
tuple
.
dst
.
protonum
=
IPPROTO_TCP
;
exp
.
mask
.
src
.
ip
=
0xFFFFFFFF
;
exp
.
mask
.
dst
.
ip
=
0xFFFFFFFF
;
exp
.
mask
.
dst
.
protonum
=
0xFFFF
;
exp
.
mask
.
dst
.
u
.
tcp
.
port
=
0xFFFF
;
/* Only search first line. */
if
(
strchr
(
data
,
'\n'
))
*
strchr
(
data
,
'\n'
)
=
'\0'
;
if
(
(
tmp
=
strchr
(
data
,
'\n'
)
))
*
tmp
=
'\0'
;
exp_amanda_info
=
&
exp
.
help
.
exp_amanda_info
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
conns
);
i
++
)
{
char
*
match
=
strstr
(
data
,
conns
[
i
]);
if
(
match
)
{
char
*
portchr
;
struct
ip_conntrack_expect
expect
;
struct
ip_ct_amanda_expect
*
exp_amanda_info
=
&
expect
.
help
.
exp_amanda_info
;
memset
(
&
expect
,
0
,
sizeof
(
expect
));
data
+=
strlen
(
conns
[
i
]);
/* this is not really tcp, but let's steal an
* idea from a tcp stream helper :-) */
// XXX expect.seq = data - amanda_buffer;
exp_amanda_info
->
offset
=
data
-
amanda_buffer
;
// XXX DEBUGP("expect.seq = %p - %p = %d\n", data, amanda_buffer, expect.seq);
DEBUGP
(
"exp_amanda_info->offset = %p - %p = %d
\n
"
,
data
,
amanda_buffer
,
exp_amanda_info
->
offset
);
portchr
=
data
;
exp_amanda_info
->
port
=
simple_strtoul
(
data
,
&
data
,
10
);
exp_amanda_info
->
len
=
data
-
portchr
;
/* eat whitespace */
while
(
*
data
==
' '
)
data
++
;
DEBUGP
(
"ip_conntrack_amanda_help: "
"CONNECT %s request with port "
"%u found
\n
"
,
conns
[
i
],
exp_amanda_info
->
port
);
expect
.
tuple
=
((
struct
ip_conntrack_tuple
)
{
{
ct
->
tuplehash
[
IP_CT_DIR_ORIGINAL
].
tuple
.
src
.
ip
,
{
0
}
},
{
ct
->
tuplehash
[
IP_CT_DIR_ORIGINAL
].
tuple
.
dst
.
ip
,
{
htons
(
exp_amanda_info
->
port
)
},
IPPROTO_TCP
}});
expect
.
mask
=
((
struct
ip_conntrack_tuple
)
{
{
0
,
{
0
}
},
{
0xFFFFFFFF
,
{
0xFFFF
},
0xFFFF
}});
expect
.
expectfn
=
NULL
;
DEBUGP
(
"ip_conntrack_amanda_help: "
"expect_related: %u.%u.%u.%u:%u - "
"%u.%u.%u.%u:%u
\n
"
,
NIPQUAD
(
expect
.
tuple
.
src
.
ip
),
ntohs
(
expect
.
tuple
.
src
.
u
.
tcp
.
port
),
NIPQUAD
(
expect
.
tuple
.
dst
.
ip
),
ntohs
(
expect
.
tuple
.
dst
.
u
.
tcp
.
port
));
if
(
ip_conntrack_expect_related
(
ct
,
&
expect
)
==
-
EEXIST
)
{
;
/* this must be a packet being resent */
/* XXX - how do I get the
* ip_conntrack_expect that
* already exists so that I can
* update the .seq so that the
* nat module rewrites the port
* numbers?
* Perhaps I should use the
* exp_amanda_info instead of
* .seq.
*/
}
}
if
(
!
match
)
continue
;
tmp
=
data
=
match
+
strlen
(
conns
[
i
]);
exp_amanda_info
->
offset
=
data
-
amanda_buffer
;
exp_amanda_info
->
port
=
simple_strtoul
(
data
,
&
data
,
10
);
exp_amanda_info
->
len
=
data
-
tmp
;
if
(
exp_amanda_info
->
port
==
0
||
exp_amanda_info
->
len
>
5
)
break
;
exp
.
tuple
.
dst
.
u
.
tcp
.
port
=
htons
(
exp_amanda_info
->
port
);
ip_conntrack_expect_related
(
ct
,
&
exp
);
}
out:
UNLOCK_BH
(
&
ip_amanda_lock
);
out:
UNLOCK_BH
(
&
amanda_buffer_lock
);
return
NF_ACCEPT
;
}
...
...
@@ -186,29 +129,16 @@ static struct ip_conntrack_helper amanda_helper = {
},
};
static
void
fini
(
void
)
static
void
__exit
fini
(
void
)
{
DEBUGP
(
"ip_ct_amanda: unregistering helper for port 10080
\n
"
);
ip_conntrack_helper_unregister
(
&
amanda_helper
);
}
static
int
__init
init
(
void
)
{
int
ret
;
DEBUGP
(
"ip_ct_amanda: registering helper for port 10080
\n
"
);
ret
=
ip_conntrack_helper_register
(
&
amanda_helper
);
if
(
ret
)
{
printk
(
"ip_ct_amanda: ERROR registering helper
\n
"
);
fini
();
return
-
EBUSY
;
}
return
0
;
return
ip_conntrack_helper_register
(
&
amanda_helper
);
}
PROVIDES_CONNTRACK
(
amanda
);
EXPORT_SYMBOL
(
ip_amanda_lock
);
module_init
(
init
);
module_exit
(
fini
);
net/ipv4/netfilter/ip_nat_amanda.c
View file @
36fb0cbc
...
...
@@ -11,69 +11,45 @@
* insmod ip_nat_amanda.o
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/netfilter_ipv4.h>
#include <linux/netfilter.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/udp.h>
#include <linux/kernel.h>
#include <net/tcp.h>
#include <net/udp.h>
#include <linux/netfilter_ipv4.h>
#include <linux/netfilter_ipv4/ip_nat.h>
#include <linux/netfilter_ipv4/ip_nat_helper.h>
#include <linux/netfilter_ipv4/ip_nat_rule.h>
#include <linux/netfilter_ipv4/ip_conntrack_helper.h>
#include <linux/netfilter_ipv4/ip_conntrack_amanda.h>
#if 0
#define DEBUGP printk
#define DUMP_OFFSET(x) printk("offset_before=%d, offset_after=%d, correction_pos=%u\n", x->offset_before, x->offset_after, x->correction_pos);
#else
#define DEBUGP(format, args...)
#define DUMP_OFFSET(x)
#endif
MODULE_AUTHOR
(
"Brian J. Murrell <netfilter@interlinx.bc.ca>"
);
MODULE_DESCRIPTION
(
"Amanda NAT helper"
);
MODULE_LICENSE
(
"GPL"
);
/* protects amanda part of conntracks */
DECLARE_LOCK_EXTERN
(
ip_amanda_lock
);
static
unsigned
int
amanda_nat_expected
(
struct
sk_buff
**
pskb
,
unsigned
int
hooknum
,
struct
ip_conntrack
*
ct
,
struct
ip_nat_info
*
info
)
unsigned
int
hooknum
,
struct
ip_conntrack
*
ct
,
struct
ip_nat_info
*
info
)
{
struct
ip_nat_multi_range
mr
;
u_int32_t
newdstip
,
newsrcip
,
newip
;
u_int16_t
port
;
struct
ip_ct_amanda_expect
*
exp_info
;
struct
ip_conntrack
*
master
=
master_ct
(
ct
);
struct
ip_ct_amanda_expect
*
exp_amanda_info
;
struct
ip_nat_multi_range
mr
;
u_int32_t
newip
;
IP_NF_ASSERT
(
info
);
IP_NF_ASSERT
(
master
);
IP_NF_ASSERT
(
!
(
info
->
initialized
&
(
1
<<
HOOK2MANIP
(
hooknum
))));
DEBUGP
(
"nat_expected: We have a connection!
\n
"
);
exp_info
=
&
ct
->
master
->
help
.
exp_amanda_info
;
newdstip
=
ct
->
tuplehash
[
IP_CT_DIR_REPLY
].
tuple
.
src
.
ip
;
newsrcip
=
master
->
tuplehash
[
IP_CT_DIR_ORIGINAL
].
tuple
.
src
.
ip
;
DEBUGP
(
"nat_expected: %u.%u.%u.%u->%u.%u.%u.%u
\n
"
,
NIPQUAD
(
newsrcip
),
NIPQUAD
(
newdstip
));
port
=
exp_info
->
port
;
if
(
HOOK2MANIP
(
hooknum
)
==
IP_NAT_MANIP_SRC
)
newip
=
newsrc
ip
;
newip
=
master
->
tuplehash
[
IP_CT_DIR_REPLY
].
tuple
.
dst
.
ip
;
else
newip
=
newdstip
;
DEBUGP
(
"nat_expected: IP to %u.%u.%u.%u
\n
"
,
NIPQUAD
(
newip
));
newip
=
master
->
tuplehash
[
IP_CT_DIR_REPLY
].
tuple
.
src
.
ip
;
mr
.
rangesize
=
1
;
/* We don't want to manip the per-protocol, just the IPs. */
...
...
@@ -81,121 +57,79 @@ amanda_nat_expected(struct sk_buff **pskb,
mr
.
range
[
0
].
min_ip
=
mr
.
range
[
0
].
max_ip
=
newip
;
if
(
HOOK2MANIP
(
hooknum
)
==
IP_NAT_MANIP_DST
)
{
exp_amanda_info
=
&
ct
->
master
->
help
.
exp_amanda_info
;
mr
.
range
[
0
].
flags
|=
IP_NAT_RANGE_PROTO_SPECIFIED
;
mr
.
range
[
0
].
min
=
mr
.
range
[
0
].
max
=
((
union
ip_conntrack_manip_proto
)
{
.
udp
=
{
htons
(
port
)
}
});
{
.
udp
=
{
htons
(
exp_amanda_info
->
port
)
}
});
}
return
ip_nat_setup_info
(
ct
,
&
mr
,
hooknum
);
}
static
int
amanda_data_fixup
(
struct
ip_conntrack
*
ct
,
struct
sk_buff
**
pskb
,
enum
ip_conntrack_info
ctinfo
,
struct
ip_conntrack_expect
*
expect
)
struct
sk_buff
**
pskb
,
enum
ip_conntrack_info
ctinfo
,
struct
ip_conntrack_expect
*
exp
)
{
u_int32_t
newip
;
/* DATA 99999 MESG 99999 INDEX 99999 */
char
buffer
[
6
];
struct
ip_conntrack_expect
*
exp
=
expect
;
struct
ip_ct_amanda_expect
*
ct_amanda_info
=
&
exp
->
help
.
exp_amanda_info
;
struct
ip_ct_amanda_expect
*
exp_amanda_info
;
struct
ip_conntrack_tuple
t
=
exp
->
tuple
;
char
buffer
[
sizeof
(
"65535"
)];
u_int16_t
port
;
MUST_BE_LOCKED
(
&
ip_amanda_lock
);
newip
=
ct
->
tuplehash
[
IP_CT_DIR_ORIGINAL
].
tuple
.
dst
.
ip
;
DEBUGP
(
"ip_nat_amanda_help: newip = %u.%u.%u.%u
\n
"
,
NIPQUAD
(
newip
));
/* Alter conntrack's expectations. */
/* We can read expect here without conntrack lock, since it's
only set in ip_conntrack_amanda, with ip_amanda_lock held
writable */
t
.
dst
.
ip
=
newip
;
for
(
port
=
ct_amanda_info
->
port
;
port
!=
0
;
port
++
)
{
exp_amanda_info
=
&
exp
->
help
.
exp_amanda_info
;
t
.
dst
.
ip
=
ct
->
tuplehash
[
IP_CT_DIR_ORIGINAL
].
tuple
.
dst
.
ip
;
for
(
port
=
exp_amanda_info
->
port
;
port
!=
0
;
port
++
)
{
t
.
dst
.
u
.
tcp
.
port
=
htons
(
port
);
if
(
ip_conntrack_change_expect
(
exp
,
&
t
)
==
0
)
break
;
}
if
(
port
==
0
)
return
0
;
sprintf
(
buffer
,
"%u"
,
port
);
return
ip_nat_mangle_udp_packet
(
pskb
,
ct
,
ctinfo
,
/* XXX exp->seq */
ct_amanda_info
->
offset
,
ct_amanda_info
->
len
,
buffer
,
strlen
(
buffer
));
return
ip_nat_mangle_udp_packet
(
pskb
,
ct
,
ctinfo
,
exp_amanda_info
->
offset
,
exp_amanda_info
->
len
,
buffer
,
strlen
(
buffer
));
}
static
unsigned
int
help
(
struct
ip_conntrack
*
ct
,
struct
ip_conntrack_expect
*
exp
,
struct
ip_nat_info
*
info
,
enum
ip_conntrack_info
ctinfo
,
unsigned
int
hooknum
,
struct
sk_buff
**
pskb
)
struct
ip_conntrack_expect
*
exp
,
struct
ip_nat_info
*
info
,
enum
ip_conntrack_info
ctinfo
,
unsigned
int
hooknum
,
struct
sk_buff
**
pskb
)
{
int
dir
;
int
dir
=
CTINFO2DIR
(
ctinfo
);
int
ret
=
NF_ACCEPT
;
if
(
!
exp
)
DEBUGP
(
"ip_nat_amanda: no exp!!"
);
/* Only mangle things once: original direction in POST_ROUTING
and reply direction on PRE_ROUTING. */
dir
=
CTINFO2DIR
(
ctinfo
);
if
(
!
((
hooknum
==
NF_IP_POST_ROUTING
&&
dir
==
IP_CT_DIR_ORIGINAL
)
||
(
hooknum
==
NF_IP_PRE_ROUTING
&&
dir
==
IP_CT_DIR_REPLY
)))
{
DEBUGP
(
"ip_nat_amanda_help: Not touching dir %s at hook %s
\n
"
,
dir
==
IP_CT_DIR_ORIGINAL
?
"ORIG"
:
"REPLY"
,
hooknum
==
NF_IP_POST_ROUTING
?
"POSTROUTING"
:
hooknum
==
NF_IP_PRE_ROUTING
?
"PREROUTING"
:
hooknum
==
NF_IP_LOCAL_OUT
?
"OUTPUT"
:
hooknum
==
NF_IP_LOCAL_IN
?
"INPUT"
:
"???"
);
||
(
hooknum
==
NF_IP_PRE_ROUTING
&&
dir
==
IP_CT_DIR_REPLY
)))
return
NF_ACCEPT
;
}
DEBUGP
(
"ip_nat_amanda_help: got beyond not touching: dir %s at hook %s for expect: "
,
dir
==
IP_CT_DIR_ORIGINAL
?
"ORIG"
:
"REPLY"
,
hooknum
==
NF_IP_POST_ROUTING
?
"POSTROUTING"
:
hooknum
==
NF_IP_PRE_ROUTING
?
"PREROUTING"
:
hooknum
==
NF_IP_LOCAL_OUT
?
"OUTPUT"
:
hooknum
==
NF_IP_LOCAL_IN
?
"INPUT"
:
"???"
);
DUMP_TUPLE
(
&
exp
->
tuple
);
LOCK_BH
(
&
ip_amanda_lock
);
// XXX if (exp->seq != 0)
/* if this exectation has a "offset" the packet needs to be mangled */
if
(
exp
->
help
.
exp_amanda_info
.
offset
!=
0
)
/* if this packet has a "seq" it needs to have it's content mangled */
if
(
!
amanda_data_fixup
(
ct
,
pskb
,
ctinfo
,
exp
))
{
UNLOCK_BH
(
&
ip_amanda_lock
);
DEBUGP
(
"ip_nat_amanda: NF_DROP
\n
"
);
return
NF_DROP
;
}
if
(
!
amanda_data_fixup
(
ct
,
pskb
,
ctinfo
,
exp
))
ret
=
NF_DROP
;
exp
->
help
.
exp_amanda_info
.
offset
=
0
;
UNLOCK_BH
(
&
ip_amanda_lock
);
DEBUGP
(
"ip_nat_amanda: NF_ACCEPT
\n
"
);
return
NF_ACCEPT
;
return
ret
;
}
static
struct
ip_nat_helper
ip_nat_amanda_helper
;
/* This function is intentionally _NOT_ defined as __exit, because
* it is needed by init() */
static
void
fini
(
void
)
static
void
__exit
fini
(
void
)
{
DEBUGP
(
"ip_nat_amanda: unregistering nat helper
\n
"
);
ip_nat_helper_unregister
(
&
ip_nat_amanda_helper
);
}
static
int
__init
init
(
void
)
{
int
ret
=
0
;
struct
ip_nat_helper
*
hlpr
;
hlpr
=
&
ip_nat_amanda_helper
;
memset
(
hlpr
,
0
,
sizeof
(
struct
ip_nat_helper
));
struct
ip_nat_helper
*
hlpr
=
&
ip_nat_amanda_helper
;
hlpr
->
tuple
.
dst
.
protonum
=
IPPROTO_UDP
;
hlpr
->
tuple
.
src
.
u
.
udp
.
port
=
htons
(
10080
);
...
...
@@ -205,20 +139,9 @@ static int __init init(void)
hlpr
->
flags
=
0
;
hlpr
->
me
=
THIS_MODULE
;
hlpr
->
expect
=
amanda_nat_expected
;
hlpr
->
name
=
"amanda"
;
DEBUGP
(
"ip_nat_amanda: Trying to register nat helper
\n
"
);
ret
=
ip_nat_helper_register
(
hlpr
);
if
(
ret
)
{
printk
(
"ip_nat_amanda: error registering nat helper
\n
"
);
fini
();
return
1
;
}
return
ret
;
return
ip_nat_helper_register
(
hlpr
);
}
NEEDS_CONNTRACK
(
amanda
);
...
...
net/ipv6/ipv6_sockglue.c
View file @
36fb0cbc
...
...
@@ -436,10 +436,15 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname, char *optval,
}
case
MCAST_MSFILTER
:
{
extern
int
sysctl_optmem_max
;
struct
group_filter
*
gsf
;
if
(
optlen
<
GROUP_FILTER_SIZE
(
0
))
goto
e_inval
;
if
(
optlen
>
sysctl_optmem_max
)
{
retv
=
-
ENOBUFS
;
break
;
}
gsf
=
(
struct
group_filter
*
)
kmalloc
(
optlen
,
GFP_KERNEL
);
if
(
gsf
==
0
)
{
retv
=
-
ENOBUFS
;
...
...
@@ -450,7 +455,8 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname, char *optval,
kfree
(
gsf
);
break
;
}
if
(
GROUP_FILTER_SIZE
(
gsf
->
gf_numsrc
)
>
optlen
)
{
if
(
GROUP_FILTER_SIZE
(
gsf
->
gf_numsrc
)
<
GROUP_FILTER_SIZE
(
0
)
||
GROUP_FILTER_SIZE
(
gsf
->
gf_numsrc
)
>
optlen
)
{
kfree
(
gsf
);
retv
=
-
EINVAL
;
break
;
...
...
net/ipv6/udp.c
View file @
36fb0cbc
...
...
@@ -381,6 +381,7 @@ static int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
if
(
flags
&
MSG_ERRQUEUE
)
return
ipv6_recv_error
(
sk
,
msg
,
len
);
try_again:
skb
=
skb_recv_datagram
(
sk
,
flags
,
noblock
,
&
err
);
if
(
!
skb
)
goto
out
;
...
...
@@ -458,12 +459,13 @@ static int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
kfree_skb
(
skb
);
}
/* Error for blocking case is chosen to masquerade
as some normal condition.
*/
err
=
(
flags
&
MSG_DONTWAIT
)
?
-
EAGAIN
:
-
EHOSTUNREACH
;
UDP6_INC_STATS_USER
(
UdpInErrors
);
goto
out_free
;
skb_free_datagram
(
sk
,
skb
);
if
(
flags
&
MSG_DONTWAIT
)
{
UDP6_INC_STATS_USER
(
UdpInErrors
);
return
-
EAGAIN
;
}
goto
try_again
;
}
static
void
udpv6_err
(
struct
sk_buff
*
skb
,
struct
inet6_skb_parm
*
opt
,
...
...
net/socket.c
View file @
36fb0cbc
...
...
@@ -1927,10 +1927,6 @@ int sock_unregister(int family)
extern
void
sk_init
(
void
);
#ifdef CONFIG_WAN_ROUTER
extern
void
wanrouter_init
(
void
);
#endif
void
__init
sock_init
(
void
)
{
int
i
;
...
...
@@ -1955,14 +1951,6 @@ void __init sock_init(void)
skb_init
();
#endif
/*
* Wan router layer.
*/
#ifdef CONFIG_WAN_ROUTER
wanrouter_init
();
#endif
/*
* Initialize the protocols module.
*/
...
...
net/wanrouter/wanmain.c
View file @
36fb0cbc
...
...
@@ -46,6 +46,7 @@
#include <linux/stddef.h>
/* offsetof(), etc. */
#include <linux/errno.h>
/* return codes */
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
/* support for loadable modules */
#include <linux/slab.h>
/* kmalloc(), kfree() */
#include <linux/mm.h>
/* verify_area(), etc. */
...
...
@@ -164,13 +165,9 @@ static unsigned char wanrouter_oui_ether[] = { 0x00, 0x00, 0x00 };
static unsigned char wanrouter_oui_802_2[] = { 0x00, 0x80, 0xC2 };
#endif
#ifndef MODULE
int
wanrouter_init
(
void
)
static
int
__init
wanrouter_init
(
void
)
{
int
err
;
extern
int
wanpipe_init
(
void
);
extern
int
sdladrv_init
(
void
);
printk
(
KERN_INFO
"%s v%u.%u %s
\n
"
,
wanrouter_fullname
,
ROUTER_VERSION
,
ROUTER_RELEASE
,
...
...
@@ -181,15 +178,6 @@ int wanrouter_init(void)
printk
(
KERN_INFO
"%s: can't create entry in proc filesystem!
\n
"
,
wanrouter_modname
);
/*
* Initialise compiled in boards
*/
#ifdef CONFIG_VENDOR_SANGOMA
sdladrv_init
();
wanpipe_init
();
#endif
return
err
;
}
...
...
@@ -198,50 +186,13 @@ static void __exit wanrouter_cleanup (void)
wanrouter_proc_cleanup
();
}
#else
/*
* Kernel Loadable Module Entry Points
*/
/*
* Module 'insert' entry point.
* o print announcement
* o initialize static data
* o create /proc/net/router directory and static entries
*
* Return: 0 Ok
* < 0 error.
* Context: process
* This is just plain dumb. We should move the bugger to drivers/net/wan,
* slap it first in directory and make it module_init(). The only reason
* for subsys_initcall() here is that net goes after drivers (why, BTW?)
*/
int
init_module
(
void
)
{
int
err
;
printk
(
KERN_INFO
"%s v%u.%u %s
\n
"
,
wanrouter_fullname
,
ROUTER_VERSION
,
ROUTER_RELEASE
,
wanrouter_copyright
);
err
=
wanrouter_proc_init
();
if
(
err
)
printk
(
KERN_INFO
"%s: can't create entry in proc filesystem!
\n
"
,
wanrouter_modname
);
return
err
;
}
/*
* Module 'remove' entry point.
* o delete /proc/net/router directory and static entries.
*/
void
cleanup_module
(
void
)
{
wanrouter_proc_cleanup
();
}
#endif
subsys_initcall
(
wanrouter_init
)
module_exit
(
wanrouter_cleanup
)
/*
* Kernel APIs
...
...
net/xfrm/xfrm_user.c
View file @
36fb0cbc
...
...
@@ -1052,9 +1052,8 @@ static int xfrm_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *xt,
struct
sk_buff
*
skb
;
size_t
len
;
len
=
RTA_LENGTH
(
sizeof
(
struct
xfrm_user_tmpl
)
*
xp
->
xfrm_nr
);
len
=
RTA_ALIGN
(
len
);
len
+=
NLMSG_ALIGN
(
NLMSG_LENGTH
(
sizeof
(
struct
xfrm_user_acquire
)));
len
=
RTA_SPACE
(
sizeof
(
struct
xfrm_user_tmpl
)
*
xp
->
xfrm_nr
);
len
+=
NLMSG_SPACE
(
sizeof
(
struct
xfrm_user_acquire
));
skb
=
alloc_skb
(
len
,
GFP_ATOMIC
);
if
(
skb
==
NULL
)
return
-
ENOMEM
;
...
...
@@ -1151,9 +1150,8 @@ static int xfrm_send_policy_notify(struct xfrm_policy *xp, int dir, int hard)
struct
sk_buff
*
skb
;
size_t
len
;
len
=
sizeof
(
struct
xfrm_user_tmpl
)
*
xp
->
xfrm_nr
;
len
=
RTA_ALIGN
(
RTA_LENGTH
(
len
));
len
+=
NLMSG_ALIGN
(
NLMSG_LENGTH
(
sizeof
(
struct
xfrm_userpolicy_info
)));
len
=
RTA_SPACE
(
sizeof
(
struct
xfrm_user_tmpl
)
*
xp
->
xfrm_nr
);
len
+=
NLMSG_SPACE
(
sizeof
(
struct
xfrm_user_polexpire
));
skb
=
alloc_skb
(
len
,
GFP_ATOMIC
);
if
(
skb
==
NULL
)
return
-
ENOMEM
;
...
...
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