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
e438edaa
Commit
e438edaa
authored
Jun 20, 2023
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge tag 'ipsec-2023-06-20' of
git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec
ipsec-2023-06-20
parents
440d71e2
f015b900
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
79 additions
and
8 deletions
+79
-8
include/net/xfrm.h
include/net/xfrm.h
+1
-0
net/ipv4/esp4_offload.c
net/ipv4/esp4_offload.c
+3
-0
net/ipv4/xfrm4_input.c
net/ipv4/xfrm4_input.c
+1
-0
net/ipv6/esp6_offload.c
net/ipv6/esp6_offload.c
+3
-0
net/ipv6/xfrm6_input.c
net/ipv6/xfrm6_input.c
+3
-0
net/xfrm/xfrm_input.c
net/xfrm/xfrm_input.c
+4
-4
net/xfrm/xfrm_interface_core.c
net/xfrm/xfrm_interface_core.c
+50
-4
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_policy.c
+14
-0
No files found.
include/net/xfrm.h
View file @
e438edaa
...
...
@@ -1054,6 +1054,7 @@ struct xfrm_offload {
struct
sec_path
{
int
len
;
int
olen
;
int
verified_cnt
;
struct
xfrm_state
*
xvec
[
XFRM_MAX_DEPTH
];
struct
xfrm_offload
ovec
[
XFRM_MAX_OFFLOAD_DEPTH
];
...
...
net/ipv4/esp4_offload.c
View file @
e438edaa
...
...
@@ -340,6 +340,9 @@ static int esp_xmit(struct xfrm_state *x, struct sk_buff *skb, netdev_features_
secpath_reset
(
skb
);
if
(
skb_needs_linearize
(
skb
,
skb
->
dev
->
features
)
&&
__skb_linearize
(
skb
))
return
-
ENOMEM
;
return
0
;
}
...
...
net/ipv4/xfrm4_input.c
View file @
e438edaa
...
...
@@ -164,6 +164,7 @@ int xfrm4_udp_encap_rcv(struct sock *sk, struct sk_buff *skb)
kfree_skb
(
skb
);
return
0
;
}
EXPORT_SYMBOL
(
xfrm4_udp_encap_rcv
);
int
xfrm4_rcv
(
struct
sk_buff
*
skb
)
{
...
...
net/ipv6/esp6_offload.c
View file @
e438edaa
...
...
@@ -374,6 +374,9 @@ static int esp6_xmit(struct xfrm_state *x, struct sk_buff *skb, netdev_features
secpath_reset
(
skb
);
if
(
skb_needs_linearize
(
skb
,
skb
->
dev
->
features
)
&&
__skb_linearize
(
skb
))
return
-
ENOMEM
;
return
0
;
}
...
...
net/ipv6/xfrm6_input.c
View file @
e438edaa
...
...
@@ -86,6 +86,9 @@ int xfrm6_udp_encap_rcv(struct sock *sk, struct sk_buff *skb)
__be32
*
udpdata32
;
__u16
encap_type
=
up
->
encap_type
;
if
(
skb
->
protocol
==
htons
(
ETH_P_IP
))
return
xfrm4_udp_encap_rcv
(
sk
,
skb
);
/* if this is not encapsulated socket, then just return now */
if
(
!
encap_type
)
return
1
;
...
...
net/xfrm/xfrm_input.c
View file @
e438edaa
...
...
@@ -131,6 +131,7 @@ struct sec_path *secpath_set(struct sk_buff *skb)
memset
(
sp
->
ovec
,
0
,
sizeof
(
sp
->
ovec
));
sp
->
olen
=
0
;
sp
->
len
=
0
;
sp
->
verified_cnt
=
0
;
return
sp
;
}
...
...
@@ -330,11 +331,10 @@ xfrm_inner_mode_encap_remove(struct xfrm_state *x,
{
switch
(
x
->
props
.
mode
)
{
case
XFRM_MODE_BEET
:
switch
(
XFRM_MODE_SKB_CB
(
skb
)
->
protocol
)
{
case
IPPROTO_IPIP
:
case
IPPROTO_BEETPH
:
switch
(
x
->
sel
.
family
)
{
case
AF_INET
:
return
xfrm4_remove_beet_encap
(
x
,
skb
);
case
IPPROTO_IPV
6
:
case
AF_INET
6
:
return
xfrm6_remove_beet_encap
(
x
,
skb
);
}
break
;
...
...
net/xfrm/xfrm_interface_core.c
View file @
e438edaa
...
...
@@ -310,6 +310,52 @@ static void xfrmi_scrub_packet(struct sk_buff *skb, bool xnet)
skb
->
mark
=
0
;
}
static
int
xfrmi_input
(
struct
sk_buff
*
skb
,
int
nexthdr
,
__be32
spi
,
int
encap_type
,
unsigned
short
family
)
{
struct
sec_path
*
sp
;
sp
=
skb_sec_path
(
skb
);
if
(
sp
&&
(
sp
->
len
||
sp
->
olen
)
&&
!
xfrm_policy_check
(
NULL
,
XFRM_POLICY_IN
,
skb
,
family
))
goto
discard
;
XFRM_SPI_SKB_CB
(
skb
)
->
family
=
family
;
if
(
family
==
AF_INET
)
{
XFRM_SPI_SKB_CB
(
skb
)
->
daddroff
=
offsetof
(
struct
iphdr
,
daddr
);
XFRM_TUNNEL_SKB_CB
(
skb
)
->
tunnel
.
ip4
=
NULL
;
}
else
{
XFRM_SPI_SKB_CB
(
skb
)
->
daddroff
=
offsetof
(
struct
ipv6hdr
,
daddr
);
XFRM_TUNNEL_SKB_CB
(
skb
)
->
tunnel
.
ip6
=
NULL
;
}
return
xfrm_input
(
skb
,
nexthdr
,
spi
,
encap_type
);
discard:
kfree_skb
(
skb
);
return
0
;
}
static
int
xfrmi4_rcv
(
struct
sk_buff
*
skb
)
{
return
xfrmi_input
(
skb
,
ip_hdr
(
skb
)
->
protocol
,
0
,
0
,
AF_INET
);
}
static
int
xfrmi6_rcv
(
struct
sk_buff
*
skb
)
{
return
xfrmi_input
(
skb
,
skb_network_header
(
skb
)[
IP6CB
(
skb
)
->
nhoff
],
0
,
0
,
AF_INET6
);
}
static
int
xfrmi4_input
(
struct
sk_buff
*
skb
,
int
nexthdr
,
__be32
spi
,
int
encap_type
)
{
return
xfrmi_input
(
skb
,
nexthdr
,
spi
,
encap_type
,
AF_INET
);
}
static
int
xfrmi6_input
(
struct
sk_buff
*
skb
,
int
nexthdr
,
__be32
spi
,
int
encap_type
)
{
return
xfrmi_input
(
skb
,
nexthdr
,
spi
,
encap_type
,
AF_INET6
);
}
static
int
xfrmi_rcv_cb
(
struct
sk_buff
*
skb
,
int
err
)
{
const
struct
xfrm_mode
*
inner_mode
;
...
...
@@ -945,8 +991,8 @@ static struct pernet_operations xfrmi_net_ops = {
};
static
struct
xfrm6_protocol
xfrmi_esp6_protocol
__read_mostly
=
{
.
handler
=
xfrm6_rcv
,
.
input_handler
=
xfrm_input
,
.
handler
=
xfrm
i
6_rcv
,
.
input_handler
=
xfrm
i6
_input
,
.
cb_handler
=
xfrmi_rcv_cb
,
.
err_handler
=
xfrmi6_err
,
.
priority
=
10
,
...
...
@@ -996,8 +1042,8 @@ static struct xfrm6_tunnel xfrmi_ip6ip_handler __read_mostly = {
#endif
static
struct
xfrm4_protocol
xfrmi_esp4_protocol
__read_mostly
=
{
.
handler
=
xfrm4_rcv
,
.
input_handler
=
xfrm_input
,
.
handler
=
xfrm
i
4_rcv
,
.
input_handler
=
xfrm
i4
_input
,
.
cb_handler
=
xfrmi_rcv_cb
,
.
err_handler
=
xfrmi4_err
,
.
priority
=
10
,
...
...
net/xfrm/xfrm_policy.c
View file @
e438edaa
...
...
@@ -1831,6 +1831,7 @@ int xfrm_policy_flush(struct net *net, u8 type, bool task_valid)
__xfrm_policy_unlink
(
pol
,
dir
);
spin_unlock_bh
(
&
net
->
xfrm
.
xfrm_policy_lock
);
xfrm_dev_policy_delete
(
pol
);
cnt
++
;
xfrm_audit_policy_delete
(
pol
,
1
,
task_valid
);
xfrm_policy_kill
(
pol
);
...
...
@@ -1869,6 +1870,7 @@ int xfrm_dev_policy_flush(struct net *net, struct net_device *dev,
__xfrm_policy_unlink
(
pol
,
dir
);
spin_unlock_bh
(
&
net
->
xfrm
.
xfrm_policy_lock
);
xfrm_dev_policy_delete
(
pol
);
cnt
++
;
xfrm_audit_policy_delete
(
pol
,
1
,
task_valid
);
xfrm_policy_kill
(
pol
);
...
...
@@ -3349,6 +3351,13 @@ xfrm_policy_ok(const struct xfrm_tmpl *tmpl, const struct sec_path *sp, int star
if
(
xfrm_state_ok
(
tmpl
,
sp
->
xvec
[
idx
],
family
,
if_id
))
return
++
idx
;
if
(
sp
->
xvec
[
idx
]
->
props
.
mode
!=
XFRM_MODE_TRANSPORT
)
{
if
(
idx
<
sp
->
verified_cnt
)
{
/* Secpath entry previously verified, consider optional and
* continue searching
*/
continue
;
}
if
(
start
==
-
1
)
start
=
-
2
-
idx
;
break
;
...
...
@@ -3723,6 +3732,9 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
* Order is _important_. Later we will implement
* some barriers, but at the moment barriers
* are implied between each two transformations.
* Upon success, marks secpath entries as having been
* verified to allow them to be skipped in future policy
* checks (e.g. nested tunnels).
*/
for
(
i
=
xfrm_nr
-
1
,
k
=
0
;
i
>=
0
;
i
--
)
{
k
=
xfrm_policy_ok
(
tpp
[
i
],
sp
,
k
,
family
,
if_id
);
...
...
@@ -3741,6 +3753,8 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
}
xfrm_pols_put
(
pols
,
npols
);
sp
->
verified_cnt
=
k
;
return
1
;
}
XFRM_INC_STATS
(
net
,
LINUX_MIB_XFRMINPOLBLOCK
);
...
...
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