Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
cad8e944
Commit
cad8e944
authored
Nov 09, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
parents
8ca2bdc7
9f0ede52
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
92 additions
and
72 deletions
+92
-72
include/linux/netfilter/nfnetlink.h
include/linux/netfilter/nfnetlink.h
+1
-1
net/ipv4/netfilter/ip_conntrack_netlink.c
net/ipv4/netfilter/ip_conntrack_netlink.c
+37
-46
net/ipv4/netfilter/ip_conntrack_proto_icmp.c
net/ipv4/netfilter/ip_conntrack_proto_icmp.c
+8
-7
net/ipv4/netfilter/ip_conntrack_proto_tcp.c
net/ipv4/netfilter/ip_conntrack_proto_tcp.c
+6
-5
net/ipv4/netfilter/ip_nat_helper_pptp.c
net/ipv4/netfilter/ip_nat_helper_pptp.c
+26
-2
net/ipv6/addrconf.c
net/ipv6/addrconf.c
+2
-1
net/ipv6/ip6_tunnel.c
net/ipv6/ip6_tunnel.c
+1
-0
net/netfilter/nfnetlink.c
net/netfilter/nfnetlink.c
+11
-10
No files found.
include/linux/netfilter/nfnetlink.h
View file @
cad8e944
...
...
@@ -146,7 +146,7 @@ extern void nfnl_unlock(void);
extern
int
nfnetlink_subsys_register
(
struct
nfnetlink_subsystem
*
n
);
extern
int
nfnetlink_subsys_unregister
(
struct
nfnetlink_subsystem
*
n
);
extern
int
nfattr_parse
(
struct
nfattr
*
tb
[],
int
maxattr
,
extern
void
nfattr_parse
(
struct
nfattr
*
tb
[],
int
maxattr
,
struct
nfattr
*
nfa
,
int
len
);
#define nfattr_parse_nested(tb, max, nfa) \
...
...
net/ipv4/netfilter/ip_conntrack_netlink.c
View file @
cad8e944
...
...
@@ -28,11 +28,8 @@
#include <linux/netlink.h>
#include <linux/spinlock.h>
#include <linux/notifier.h>
#include <linux/rtnetlink.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#include <linux/netfilter_ipv4/ip_conntrack.h>
#include <linux/netfilter_ipv4/ip_conntrack_core.h>
#include <linux/netfilter_ipv4/ip_conntrack_helper.h>
...
...
@@ -58,14 +55,17 @@ ctnetlink_dump_tuples_proto(struct sk_buff *skb,
const
struct
ip_conntrack_tuple
*
tuple
)
{
struct
ip_conntrack_protocol
*
proto
;
int
ret
=
0
;
NFA_PUT
(
skb
,
CTA_PROTO_NUM
,
sizeof
(
u_int8_t
),
&
tuple
->
dst
.
protonum
);
proto
=
ip_conntrack_proto_find_get
(
tuple
->
dst
.
protonum
);
if
(
proto
&&
proto
->
tuple_to_nfattr
)
return
proto
->
tuple_to_nfattr
(
skb
,
tuple
);
if
(
likely
(
proto
&&
proto
->
tuple_to_nfattr
))
{
ret
=
proto
->
tuple_to_nfattr
(
skb
,
tuple
);
ip_conntrack_proto_put
(
proto
);
}
return
0
;
return
ret
;
nfattr_failure:
return
-
1
;
...
...
@@ -175,7 +175,7 @@ ctnetlink_dump_counters(struct sk_buff *skb, const struct ip_conntrack *ct,
{
enum
ctattr_type
type
=
dir
?
CTA_COUNTERS_REPLY
:
CTA_COUNTERS_ORIG
;
struct
nfattr
*
nest_count
=
NFA_NEST
(
skb
,
type
);
u_int
64
_t
tmp
;
u_int
32
_t
tmp
;
tmp
=
htonl
(
ct
->
counters
[
dir
].
packets
);
NFA_PUT
(
skb
,
CTA_COUNTERS32_PACKETS
,
sizeof
(
u_int32_t
),
&
tmp
);
...
...
@@ -479,9 +479,7 @@ ctnetlink_parse_tuple_ip(struct nfattr *attr, struct ip_conntrack_tuple *tuple)
DEBUGP
(
"entered %s
\n
"
,
__FUNCTION__
);
if
(
nfattr_parse_nested
(
tb
,
CTA_IP_MAX
,
attr
)
<
0
)
goto
nfattr_failure
;
nfattr_parse_nested
(
tb
,
CTA_IP_MAX
,
attr
);
if
(
nfattr_bad_size
(
tb
,
CTA_IP_MAX
,
cta_min_ip
))
return
-
EINVAL
;
...
...
@@ -497,9 +495,6 @@ ctnetlink_parse_tuple_ip(struct nfattr *attr, struct ip_conntrack_tuple *tuple)
DEBUGP
(
"leaving
\n
"
);
return
0
;
nfattr_failure:
return
-
1
;
}
static
const
int
cta_min_proto
[
CTA_PROTO_MAX
]
=
{
...
...
@@ -521,8 +516,7 @@ ctnetlink_parse_tuple_proto(struct nfattr *attr,
DEBUGP
(
"entered %s
\n
"
,
__FUNCTION__
);
if
(
nfattr_parse_nested
(
tb
,
CTA_PROTO_MAX
,
attr
)
<
0
)
goto
nfattr_failure
;
nfattr_parse_nested
(
tb
,
CTA_PROTO_MAX
,
attr
);
if
(
nfattr_bad_size
(
tb
,
CTA_PROTO_MAX
,
cta_min_proto
))
return
-
EINVAL
;
...
...
@@ -539,9 +533,6 @@ ctnetlink_parse_tuple_proto(struct nfattr *attr,
}
return
ret
;
nfattr_failure:
return
-
1
;
}
static
inline
int
...
...
@@ -555,8 +546,7 @@ ctnetlink_parse_tuple(struct nfattr *cda[], struct ip_conntrack_tuple *tuple,
memset
(
tuple
,
0
,
sizeof
(
*
tuple
));
if
(
nfattr_parse_nested
(
tb
,
CTA_TUPLE_MAX
,
cda
[
type
-
1
])
<
0
)
goto
nfattr_failure
;
nfattr_parse_nested
(
tb
,
CTA_TUPLE_MAX
,
cda
[
type
-
1
]);
if
(
!
tb
[
CTA_TUPLE_IP
-
1
])
return
-
EINVAL
;
...
...
@@ -583,9 +573,6 @@ ctnetlink_parse_tuple(struct nfattr *cda[], struct ip_conntrack_tuple *tuple,
DEBUGP
(
"leaving
\n
"
);
return
0
;
nfattr_failure:
return
-
1
;
}
#ifdef CONFIG_IP_NF_NAT_NEEDED
...
...
@@ -603,11 +590,10 @@ static int ctnetlink_parse_nat_proto(struct nfattr *attr,
DEBUGP
(
"entered %s
\n
"
,
__FUNCTION__
);
if
(
nfattr_parse_nested
(
tb
,
CTA_PROTONAT_MAX
,
attr
)
<
0
)
goto
nfattr_failure
;
nfattr_parse_nested
(
tb
,
CTA_PROTONAT_MAX
,
attr
);
if
(
nfattr_bad_size
(
tb
,
CTA_PROTONAT_MAX
,
cta_min_protonat
))
goto
nfattr_failure
;
return
-
EINVAL
;
npt
=
ip_nat_proto_find_get
(
ct
->
tuplehash
[
IP_CT_DIR_ORIGINAL
].
tuple
.
dst
.
protonum
);
if
(
!
npt
)
...
...
@@ -626,9 +612,6 @@ static int ctnetlink_parse_nat_proto(struct nfattr *attr,
DEBUGP
(
"leaving
\n
"
);
return
0
;
nfattr_failure:
return
-
1
;
}
static
inline
int
...
...
@@ -642,8 +625,7 @@ ctnetlink_parse_nat(struct nfattr *cda[],
memset
(
range
,
0
,
sizeof
(
*
range
));
if
(
nfattr_parse_nested
(
tb
,
CTA_NAT_MAX
,
cda
[
CTA_NAT
-
1
])
<
0
)
goto
nfattr_failure
;
nfattr_parse_nested
(
tb
,
CTA_NAT_MAX
,
cda
[
CTA_NAT
-
1
]);
if
(
tb
[
CTA_NAT_MINIP
-
1
])
range
->
min_ip
=
*
(
u_int32_t
*
)
NFA_DATA
(
tb
[
CTA_NAT_MINIP
-
1
]);
...
...
@@ -665,9 +647,6 @@ ctnetlink_parse_nat(struct nfattr *cda[],
DEBUGP
(
"leaving
\n
"
);
return
0
;
nfattr_failure:
return
-
1
;
}
#endif
...
...
@@ -678,8 +657,7 @@ ctnetlink_parse_help(struct nfattr *attr, char **helper_name)
DEBUGP
(
"entered %s
\n
"
,
__FUNCTION__
);
if
(
nfattr_parse_nested
(
tb
,
CTA_HELP_MAX
,
attr
)
<
0
)
goto
nfattr_failure
;
nfattr_parse_nested
(
tb
,
CTA_HELP_MAX
,
attr
);
if
(
!
tb
[
CTA_HELP_NAME
-
1
])
return
-
EINVAL
;
...
...
@@ -687,9 +665,6 @@ ctnetlink_parse_help(struct nfattr *attr, char **helper_name)
*
helper_name
=
NFA_DATA
(
tb
[
CTA_HELP_NAME
-
1
]);
return
0
;
nfattr_failure:
return
-
1
;
}
static
int
...
...
@@ -804,7 +779,7 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
ct
=
tuplehash_to_ctrack
(
h
);
err
=
-
ENOMEM
;
skb2
=
alloc_skb
(
NLMSG_GOODSIZE
,
GFP_
ATOMIC
);
skb2
=
alloc_skb
(
NLMSG_GOODSIZE
,
GFP_
KERNEL
);
if
(
!
skb2
)
{
ip_conntrack_put
(
ct
);
return
-
ENOMEM
;
...
...
@@ -827,7 +802,7 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb,
free:
kfree_skb
(
skb2
);
out:
return
-
1
;
return
err
;
}
static
inline
int
...
...
@@ -957,8 +932,7 @@ ctnetlink_change_protoinfo(struct ip_conntrack *ct, struct nfattr *cda[])
u_int16_t
npt
=
ct
->
tuplehash
[
IP_CT_DIR_ORIGINAL
].
tuple
.
dst
.
protonum
;
int
err
=
0
;
if
(
nfattr_parse_nested
(
tb
,
CTA_PROTOINFO_MAX
,
attr
)
<
0
)
goto
nfattr_failure
;
nfattr_parse_nested
(
tb
,
CTA_PROTOINFO_MAX
,
attr
);
proto
=
ip_conntrack_proto_find_get
(
npt
);
if
(
!
proto
)
...
...
@@ -969,9 +943,6 @@ ctnetlink_change_protoinfo(struct ip_conntrack *ct, struct nfattr *cda[])
ip_conntrack_proto_put
(
proto
);
return
err
;
nfattr_failure:
return
-
ENOMEM
;
}
static
int
...
...
@@ -1005,6 +976,11 @@ ctnetlink_change_conntrack(struct ip_conntrack *ct, struct nfattr *cda[])
return
err
;
}
#if defined(CONFIG_IP_NF_CONNTRACK_MARK)
if
(
cda
[
CTA_MARK
-
1
])
ct
->
mark
=
ntohl
(
*
(
u_int32_t
*
)
NFA_DATA
(
cda
[
CTA_MARK
-
1
]));
#endif
DEBUGP
(
"all done
\n
"
);
return
0
;
}
...
...
@@ -1048,6 +1024,11 @@ ctnetlink_create_conntrack(struct nfattr *cda[],
if
(
ct
->
helper
)
ip_conntrack_helper_put
(
ct
->
helper
);
#if defined(CONFIG_IP_NF_CONNTRACK_MARK)
if
(
cda
[
CTA_MARK
-
1
])
ct
->
mark
=
ntohl
(
*
(
u_int32_t
*
)
NFA_DATA
(
cda
[
CTA_MARK
-
1
]));
#endif
DEBUGP
(
"conntrack with id %u inserted
\n
"
,
ct
->
id
);
return
0
;
...
...
@@ -1312,6 +1293,14 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb,
if
(
!
exp
)
return
-
ENOENT
;
if
(
cda
[
CTA_EXPECT_ID
-
1
])
{
u_int32_t
id
=
*
(
u_int32_t
*
)
NFA_DATA
(
cda
[
CTA_EXPECT_ID
-
1
]);
if
(
exp
->
id
!=
ntohl
(
id
))
{
ip_conntrack_expect_put
(
exp
);
return
-
ENOENT
;
}
}
err
=
-
ENOMEM
;
skb2
=
alloc_skb
(
NLMSG_GOODSIZE
,
GFP_KERNEL
);
if
(
!
skb2
)
...
...
@@ -1554,6 +1543,8 @@ static struct nfnetlink_subsystem ctnl_exp_subsys = {
.
cb
=
ctnl_exp_cb
,
};
MODULE_ALIAS_NFNL_SUBSYS
(
NFNL_SUBSYS_CTNETLINK
);
static
int
__init
ctnetlink_init
(
void
)
{
int
ret
;
...
...
net/ipv4/netfilter/ip_conntrack_proto_icmp.c
View file @
cad8e944
...
...
@@ -151,13 +151,13 @@ icmp_error_message(struct sk_buff *skb,
/* Not enough header? */
inside
=
skb_header_pointer
(
skb
,
skb
->
nh
.
iph
->
ihl
*
4
,
sizeof
(
_in
),
&
_in
);
if
(
inside
==
NULL
)
return
NF_ACCEPT
;
return
-
NF_ACCEPT
;
/* Ignore ICMP's containing fragments (shouldn't happen) */
if
(
inside
->
ip
.
frag_off
&
htons
(
IP_OFFSET
))
{
DEBUGP
(
"icmp_error_track: fragment of proto %u
\n
"
,
inside
->
ip
.
protocol
);
return
NF_ACCEPT
;
return
-
NF_ACCEPT
;
}
innerproto
=
ip_conntrack_proto_find_get
(
inside
->
ip
.
protocol
);
...
...
@@ -166,7 +166,7 @@ icmp_error_message(struct sk_buff *skb,
if
(
!
ip_ct_get_tuple
(
&
inside
->
ip
,
skb
,
dataoff
,
&
origtuple
,
innerproto
))
{
DEBUGP
(
"icmp_error: ! get_tuple p=%u"
,
inside
->
ip
.
protocol
);
ip_conntrack_proto_put
(
innerproto
);
return
NF_ACCEPT
;
return
-
NF_ACCEPT
;
}
/* Ordinarily, we'd expect the inverted tupleproto, but it's
...
...
@@ -174,7 +174,7 @@ icmp_error_message(struct sk_buff *skb,
if
(
!
ip_ct_invert_tuple
(
&
innertuple
,
&
origtuple
,
innerproto
))
{
DEBUGP
(
"icmp_error_track: Can't invert tuple
\n
"
);
ip_conntrack_proto_put
(
innerproto
);
return
NF_ACCEPT
;
return
-
NF_ACCEPT
;
}
ip_conntrack_proto_put
(
innerproto
);
...
...
@@ -190,7 +190,7 @@ icmp_error_message(struct sk_buff *skb,
if
(
!
h
)
{
DEBUGP
(
"icmp_error_track: no match
\n
"
);
return
NF_ACCEPT
;
return
-
NF_ACCEPT
;
}
/* Reverse direction from that found */
if
(
DIRECTION
(
h
)
!=
IP_CT_DIR_REPLY
)
...
...
@@ -296,7 +296,8 @@ static int icmp_nfattr_to_tuple(struct nfattr *tb[],
struct
ip_conntrack_tuple
*
tuple
)
{
if
(
!
tb
[
CTA_PROTO_ICMP_TYPE
-
1
]
||
!
tb
[
CTA_PROTO_ICMP_CODE
-
1
])
||
!
tb
[
CTA_PROTO_ICMP_CODE
-
1
]
||
!
tb
[
CTA_PROTO_ICMP_ID
-
1
])
return
-
1
;
tuple
->
dst
.
u
.
icmp
.
type
=
...
...
@@ -304,7 +305,7 @@ static int icmp_nfattr_to_tuple(struct nfattr *tb[],
tuple
->
dst
.
u
.
icmp
.
code
=
*
(
u_int8_t
*
)
NFA_DATA
(
tb
[
CTA_PROTO_ICMP_CODE
-
1
]);
tuple
->
src
.
u
.
icmp
.
id
=
*
(
u_int
8
_t
*
)
NFA_DATA
(
tb
[
CTA_PROTO_ICMP_ID
-
1
]);
*
(
u_int
16
_t
*
)
NFA_DATA
(
tb
[
CTA_PROTO_ICMP_ID
-
1
]);
return
0
;
}
...
...
net/ipv4/netfilter/ip_conntrack_proto_tcp.c
View file @
cad8e944
...
...
@@ -362,8 +362,12 @@ static int nfattr_to_tcp(struct nfattr *cda[], struct ip_conntrack *ct)
struct
nfattr
*
attr
=
cda
[
CTA_PROTOINFO_TCP
-
1
];
struct
nfattr
*
tb
[
CTA_PROTOINFO_TCP_MAX
];
if
(
nfattr_parse_nested
(
tb
,
CTA_PROTOINFO_TCP_MAX
,
attr
)
<
0
)
goto
nfattr_failure
;
/* updates could not contain anything about the private
* protocol info, in that case skip the parsing */
if
(
!
attr
)
return
0
;
nfattr_parse_nested
(
tb
,
CTA_PROTOINFO_TCP_MAX
,
attr
);
if
(
!
tb
[
CTA_PROTOINFO_TCP_STATE
-
1
])
return
-
EINVAL
;
...
...
@@ -374,9 +378,6 @@ static int nfattr_to_tcp(struct nfattr *cda[], struct ip_conntrack *ct)
write_unlock_bh
(
&
tcp_lock
);
return
0
;
nfattr_failure:
return
-
1
;
}
#endif
...
...
net/ipv4/netfilter/ip_nat_helper_pptp.c
View file @
cad8e944
...
...
@@ -73,6 +73,7 @@ static void pptp_nat_expected(struct ip_conntrack *ct,
struct
ip_conntrack_tuple
t
;
struct
ip_ct_pptp_master
*
ct_pptp_info
;
struct
ip_nat_pptp
*
nat_pptp_info
;
struct
ip_nat_range
range
;
ct_pptp_info
=
&
master
->
help
.
ct_pptp_info
;
nat_pptp_info
=
&
master
->
nat
.
help
.
nat_pptp_info
;
...
...
@@ -110,7 +111,30 @@ static void pptp_nat_expected(struct ip_conntrack *ct,
DEBUGP
(
"not found!
\n
"
);
}
ip_nat_follow_master
(
ct
,
exp
);
/* This must be a fresh one. */
BUG_ON
(
ct
->
status
&
IPS_NAT_DONE_MASK
);
/* Change src to where master sends to */
range
.
flags
=
IP_NAT_RANGE_MAP_IPS
;
range
.
min_ip
=
range
.
max_ip
=
ct
->
master
->
tuplehash
[
!
exp
->
dir
].
tuple
.
dst
.
ip
;
if
(
exp
->
dir
==
IP_CT_DIR_ORIGINAL
)
{
range
.
flags
|=
IP_NAT_RANGE_PROTO_SPECIFIED
;
range
.
min
=
range
.
max
=
exp
->
saved_proto
;
}
/* hook doesn't matter, but it has to do source manip */
ip_nat_setup_info
(
ct
,
&
range
,
NF_IP_POST_ROUTING
);
/* For DST manip, map port here to where it's expected. */
range
.
flags
=
IP_NAT_RANGE_MAP_IPS
;
range
.
min_ip
=
range
.
max_ip
=
ct
->
master
->
tuplehash
[
!
exp
->
dir
].
tuple
.
src
.
ip
;
if
(
exp
->
dir
==
IP_CT_DIR_REPLY
)
{
range
.
flags
|=
IP_NAT_RANGE_PROTO_SPECIFIED
;
range
.
min
=
range
.
max
=
exp
->
saved_proto
;
}
/* hook doesn't matter, but it has to do destination manip */
ip_nat_setup_info
(
ct
,
&
range
,
NF_IP_PRE_ROUTING
);
}
/* outbound packets == from PNS to PAC */
...
...
@@ -213,7 +237,7 @@ pptp_exp_gre(struct ip_conntrack_expect *expect_orig,
/* alter expectation for PNS->PAC direction */
invert_tuplepr
(
&
inv_t
,
&
expect_orig
->
tuple
);
expect_orig
->
saved_proto
.
gre
.
key
=
htons
(
nat_pptp_info
->
pac
_call_id
);
expect_orig
->
saved_proto
.
gre
.
key
=
htons
(
ct_pptp_info
->
pns
_call_id
);
expect_orig
->
tuple
.
src
.
u
.
gre
.
key
=
htons
(
nat_pptp_info
->
pns_call_id
);
expect_orig
->
tuple
.
dst
.
u
.
gre
.
key
=
htons
(
ct_pptp_info
->
pac_call_id
);
expect_orig
->
dir
=
IP_CT_DIR_ORIGINAL
;
...
...
net/ipv6/addrconf.c
View file @
cad8e944
...
...
@@ -1022,6 +1022,7 @@ int ipv6_dev_get_saddr(struct net_device *daddr_dev,
continue
;
}
#ifdef CONFIG_IPV6_PRIVACY
/* Rule 7: Prefer public address
* Note: prefer temprary address if use_tempaddr >= 2
*/
...
...
@@ -1042,7 +1043,7 @@ int ipv6_dev_get_saddr(struct net_device *daddr_dev,
if
(
hiscore
.
attrs
&
IPV6_SADDR_SCORE_PRIVACY
)
continue
;
}
#endif
/* Rule 8: Use longest matching prefix */
if
(
hiscore
.
rule
<
8
)
hiscore
.
matchlen
=
ipv6_addr_diff
(
&
ifa_result
->
addr
,
daddr
);
...
...
net/ipv6/ip6_tunnel.c
View file @
cad8e944
...
...
@@ -525,6 +525,7 @@ ip6ip6_rcv(struct sk_buff **pskb, unsigned int *nhoffp)
if
((
t
=
ip6ip6_tnl_lookup
(
&
ipv6h
->
saddr
,
&
ipv6h
->
daddr
))
!=
NULL
)
{
if
(
!
xfrm6_policy_check
(
NULL
,
XFRM_POLICY_IN
,
skb
))
{
read_unlock
(
&
ip6ip6_lock
);
kfree_skb
(
skb
);
return
0
;
}
...
...
net/netfilter/nfnetlink.c
View file @
cad8e944
...
...
@@ -128,7 +128,7 @@ void __nfa_fill(struct sk_buff *skb, int attrtype, int attrlen,
memset
(
NFA_DATA
(
nfa
)
+
attrlen
,
0
,
NFA_ALIGN
(
size
)
-
size
);
}
int
nfattr_parse
(
struct
nfattr
*
tb
[],
int
maxattr
,
struct
nfattr
*
nfa
,
int
len
)
void
nfattr_parse
(
struct
nfattr
*
tb
[],
int
maxattr
,
struct
nfattr
*
nfa
,
int
len
)
{
memset
(
tb
,
0
,
sizeof
(
struct
nfattr
*
)
*
maxattr
);
...
...
@@ -138,8 +138,6 @@ int nfattr_parse(struct nfattr *tb[], int maxattr, struct nfattr *nfa, int len)
tb
[
flavor
-
1
]
=
nfa
;
nfa
=
NFA_NEXT
(
nfa
,
len
);
}
return
0
;
}
/**
...
...
@@ -242,15 +240,18 @@ static inline int nfnetlink_rcv_msg(struct sk_buff *skb,
ss
=
nfnetlink_get_subsys
(
type
);
if
(
!
ss
)
{
#ifdef CONFIG_KMOD
/* don't call nfnl_shunlock, since it would reenter
* with further packet processing */
up
(
&
nfnl_sem
);
request_module
(
"nfnetlink-subsys-%d"
,
NFNL_SUBSYS_ID
(
type
));
nfnl_shlock
();
ss
=
nfnetlink_get_subsys
(
type
);
if
(
cap_raised
(
NETLINK_CB
(
skb
).
eff_cap
,
CAP_NET_ADMIN
))
{
/* don't call nfnl_shunlock, since it would reenter
* with further packet processing */
up
(
&
nfnl_sem
);
request_module
(
"nfnetlink-subsys-%d"
,
NFNL_SUBSYS_ID
(
type
));
nfnl_shlock
();
ss
=
nfnetlink_get_subsys
(
type
);
}
if
(
!
ss
)
#endif
goto
err_inval
;
goto
err_inval
;
}
nc
=
nfnetlink_find_client
(
type
,
ss
);
...
...
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