xfrm: allow to avoid copying DSCP during encapsulation
By default, DSCP is copying during encapsulation. Copying the DSCP in IPsec tunneling may be a bit dangerous because packets with different DSCP may get reordered relative to each other in the network and then dropped by the remote IPsec GW if the reordering becomes too big compared to the replay window. It is possible to avoid this copy with netfilter rules, but it's very convenient to be able to configure it for each SA directly. This patch adds a toogle for this purpose. By default, it's not set to maintain backward compatibility. Field flags in struct xfrm_usersa_info is full, hence I add a new attribute. Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:

committed by
Steffen Klassert

parent
6fac411572
commit
a947b0a93e
@@ -515,6 +515,9 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,
|
||||
|
||||
copy_from_user_state(x, p);
|
||||
|
||||
if (attrs[XFRMA_SA_EXTRA_FLAGS])
|
||||
x->props.extra_flags = nla_get_u32(attrs[XFRMA_SA_EXTRA_FLAGS]);
|
||||
|
||||
if ((err = attach_aead(&x->aead, &x->props.ealgo,
|
||||
attrs[XFRMA_ALG_AEAD])))
|
||||
goto error;
|
||||
@@ -779,6 +782,13 @@ static int copy_to_user_state_extra(struct xfrm_state *x,
|
||||
|
||||
copy_to_user_state(x, p);
|
||||
|
||||
if (x->props.extra_flags) {
|
||||
ret = nla_put_u32(skb, XFRMA_SA_EXTRA_FLAGS,
|
||||
x->props.extra_flags);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (x->coaddr) {
|
||||
ret = nla_put(skb, XFRMA_COADDR, sizeof(*x->coaddr), x->coaddr);
|
||||
if (ret)
|
||||
@@ -2302,6 +2312,7 @@ static const struct nla_policy xfrma_policy[XFRMA_MAX+1] = {
|
||||
[XFRMA_MARK] = { .len = sizeof(struct xfrm_mark) },
|
||||
[XFRMA_TFCPAD] = { .type = NLA_U32 },
|
||||
[XFRMA_REPLAY_ESN_VAL] = { .len = sizeof(struct xfrm_replay_state_esn) },
|
||||
[XFRMA_SA_EXTRA_FLAGS] = { .type = NLA_U32 },
|
||||
};
|
||||
|
||||
static struct xfrm_link {
|
||||
@@ -2495,6 +2506,8 @@ static inline size_t xfrm_sa_len(struct xfrm_state *x)
|
||||
x->security->ctx_len);
|
||||
if (x->coaddr)
|
||||
l += nla_total_size(sizeof(*x->coaddr));
|
||||
if (x->props.extra_flags)
|
||||
l += nla_total_size(sizeof(x->props.extra_flags));
|
||||
|
||||
/* Must count x->lastused as it may become non-zero behind our back. */
|
||||
l += nla_total_size(sizeof(u64));
|
||||
|
Reference in New Issue
Block a user