Skip to content

Commit d1716d5

Browse files
choppsv1klassert
authored andcommitted
xfrm: add generic iptfs defines and functionality
Define `XFRM_MODE_IPTFS` and `IPSEC_MODE_IPTFS` constants, and add these to switch case and conditionals adjacent with the existing TUNNEL modes. Signed-off-by: Christian Hopps <[email protected]> Tested-by: Antony Antony <[email protected]> Signed-off-by: Steffen Klassert <[email protected]>
1 parent 7ac64f4 commit d1716d5

File tree

12 files changed

+48
-6
lines changed

12 files changed

+48
-6
lines changed

include/net/xfrm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#define XFRM_PROTO_COMP 108
3939
#define XFRM_PROTO_IPIP 4
4040
#define XFRM_PROTO_IPV6 41
41+
#define XFRM_PROTO_IPTFS IPPROTO_AGGFRAG
4142
#define XFRM_PROTO_ROUTING IPPROTO_ROUTING
4243
#define XFRM_PROTO_DSTOPTS IPPROTO_DSTOPTS
4344

include/uapi/linux/ipsec.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ enum {
1414
IPSEC_MODE_ANY = 0, /* We do not support this for SA */
1515
IPSEC_MODE_TRANSPORT = 1,
1616
IPSEC_MODE_TUNNEL = 2,
17-
IPSEC_MODE_BEET = 3
17+
IPSEC_MODE_BEET = 3,
18+
IPSEC_MODE_IPTFS = 4
1819
};
1920

2021
enum {

include/uapi/linux/snmp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,8 @@ enum
339339
LINUX_MIB_XFRMACQUIREERROR, /* XfrmAcquireError */
340340
LINUX_MIB_XFRMOUTSTATEDIRERROR, /* XfrmOutStateDirError */
341341
LINUX_MIB_XFRMINSTATEDIRERROR, /* XfrmInStateDirError */
342+
LINUX_MIB_XFRMINIPTFSERROR, /* XfrmInIptfsError */
343+
LINUX_MIB_XFRMOUTNOQSPACE, /* XfrmOutNoQueueSpace */
342344
__LINUX_MIB_XFRMMAX
343345
};
344346

net/ipv4/esp4.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,8 @@ int esp_input_done2(struct sk_buff *skb, int err)
816816
}
817817

818818
skb_pull_rcsum(skb, hlen);
819-
if (x->props.mode == XFRM_MODE_TUNNEL)
819+
if (x->props.mode == XFRM_MODE_TUNNEL ||
820+
x->props.mode == XFRM_MODE_IPTFS)
820821
skb_reset_transport_header(skb);
821822
else
822823
skb_set_transport_header(skb, -ihl);

net/ipv6/esp6.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,8 @@ int esp6_input_done2(struct sk_buff *skb, int err)
859859
skb_postpull_rcsum(skb, skb_network_header(skb),
860860
skb_network_header_len(skb));
861861
skb_pull_rcsum(skb, hlen);
862-
if (x->props.mode == XFRM_MODE_TUNNEL)
862+
if (x->props.mode == XFRM_MODE_TUNNEL ||
863+
x->props.mode == XFRM_MODE_IPTFS)
863864
skb_reset_transport_header(skb);
864865
else
865866
skb_set_transport_header(skb, -hdr_len);

net/netfilter/nft_xfrm.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ static bool xfrm_state_addr_ok(enum nft_xfrm_keys k, u8 family, u8 mode)
112112
return true;
113113
}
114114

115-
return mode == XFRM_MODE_BEET || mode == XFRM_MODE_TUNNEL;
115+
return mode == XFRM_MODE_BEET || mode == XFRM_MODE_TUNNEL ||
116+
mode == XFRM_MODE_IPTFS;
116117
}
117118

118119
static void nft_xfrm_state_get_key(const struct nft_xfrm *priv,

net/xfrm/xfrm_device.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ static void __xfrm_mode_beet_prep(struct xfrm_state *x, struct sk_buff *skb,
6969
static void xfrm_outer_mode_prep(struct xfrm_state *x, struct sk_buff *skb)
7070
{
7171
switch (x->outer_mode.encap) {
72+
case XFRM_MODE_IPTFS:
7273
case XFRM_MODE_TUNNEL:
7374
if (x->outer_mode.family == AF_INET)
7475
return __xfrm_mode_tunnel_prep(x, skb,

net/xfrm/xfrm_output.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,10 @@ static void xfrm_get_inner_ipproto(struct sk_buff *skb, struct xfrm_state *x)
677677

678678
return;
679679
}
680+
if (x->outer_mode.encap == XFRM_MODE_IPTFS) {
681+
xo->inner_ipproto = IPPROTO_AGGFRAG;
682+
return;
683+
}
680684

681685
/* non-Tunnel Mode */
682686
if (!skb->encapsulation)

net/xfrm/xfrm_policy.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2497,6 +2497,7 @@ xfrm_tmpl_resolve_one(struct xfrm_policy *policy, const struct flowi *fl,
24972497
struct xfrm_tmpl *tmpl = &policy->xfrm_vec[i];
24982498

24992499
if (tmpl->mode == XFRM_MODE_TUNNEL ||
2500+
tmpl->mode == XFRM_MODE_IPTFS ||
25002501
tmpl->mode == XFRM_MODE_BEET) {
25012502
remote = &tmpl->id.daddr;
25022503
local = &tmpl->saddr;
@@ -3294,7 +3295,8 @@ struct dst_entry *xfrm_lookup_with_ifid(struct net *net,
32943295
ok:
32953296
xfrm_pols_put(pols, drop_pols);
32963297
if (dst && dst->xfrm &&
3297-
dst->xfrm->props.mode == XFRM_MODE_TUNNEL)
3298+
(dst->xfrm->props.mode == XFRM_MODE_TUNNEL ||
3299+
dst->xfrm->props.mode == XFRM_MODE_IPTFS))
32983300
dst->flags |= DST_XFRM_TUNNEL;
32993301
return dst;
33003302

@@ -4523,6 +4525,7 @@ static int migrate_tmpl_match(const struct xfrm_migrate *m, const struct xfrm_tm
45234525
switch (t->mode) {
45244526
case XFRM_MODE_TUNNEL:
45254527
case XFRM_MODE_BEET:
4528+
case XFRM_MODE_IPTFS:
45264529
if (xfrm_addr_equal(&t->id.daddr, &m->old_daddr,
45274530
m->old_family) &&
45284531
xfrm_addr_equal(&t->saddr, &m->old_saddr,
@@ -4565,7 +4568,8 @@ static int xfrm_policy_migrate(struct xfrm_policy *pol,
45654568
continue;
45664569
n++;
45674570
if (pol->xfrm_vec[i].mode != XFRM_MODE_TUNNEL &&
4568-
pol->xfrm_vec[i].mode != XFRM_MODE_BEET)
4571+
pol->xfrm_vec[i].mode != XFRM_MODE_BEET &&
4572+
pol->xfrm_vec[i].mode != XFRM_MODE_IPTFS)
45694573
continue;
45704574
/* update endpoints */
45714575
memcpy(&pol->xfrm_vec[i].id.daddr, &mp->new_daddr,

net/xfrm/xfrm_proc.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ static const struct snmp_mib xfrm_mib_list[] = {
4343
SNMP_MIB_ITEM("XfrmAcquireError", LINUX_MIB_XFRMACQUIREERROR),
4444
SNMP_MIB_ITEM("XfrmOutStateDirError", LINUX_MIB_XFRMOUTSTATEDIRERROR),
4545
SNMP_MIB_ITEM("XfrmInStateDirError", LINUX_MIB_XFRMINSTATEDIRERROR),
46+
SNMP_MIB_ITEM("XfrmInIptfsError", LINUX_MIB_XFRMINIPTFSERROR),
47+
SNMP_MIB_ITEM("XfrmOutNoQueueSpace", LINUX_MIB_XFRMOUTNOQSPACE),
4648
SNMP_MIB_SENTINEL
4749
};
4850

0 commit comments

Comments
 (0)