diff options
author | David S. Miller <davem@davemloft.net> | 2013-04-11 16:14:37 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-04-11 16:14:37 -0400 |
commit | 16e3d9648add0b3839587fd77f510537baf88c3a (patch) | |
tree | 67831545a57cf08820b7f59d0e745e3b30d1a0ee /net/xfrm | |
parent | c59fec207bc73612c9a124539b99d186ad6d2a99 (diff) | |
parent | 05600a799f6c67b139f2bc565e358b913b230cf5 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/klassert/ipsec-next
Steffen Klassert says:
====================
1) Allow to avoid copying DSCP during encapsulation
by setting a SA flag. From Nicolas Dichtel.
2) Constify the netlink dispatch table, no need to modify it
at runtime. From Mathias Krause.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/xfrm')
-rw-r--r-- | net/xfrm/xfrm_state.c | 1 | ||||
-rw-r--r-- | net/xfrm/xfrm_user.c | 17 |
2 files changed, 16 insertions, 2 deletions
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 2c341bdaf47c..78f66fa92449 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
@@ -1187,6 +1187,7 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp) | |||
1187 | goto error; | 1187 | goto error; |
1188 | 1188 | ||
1189 | x->props.flags = orig->props.flags; | 1189 | x->props.flags = orig->props.flags; |
1190 | x->props.extra_flags = orig->props.extra_flags; | ||
1190 | 1191 | ||
1191 | x->curlft.add_time = orig->curlft.add_time; | 1192 | x->curlft.add_time = orig->curlft.add_time; |
1192 | x->km.state = orig->km.state; | 1193 | x->km.state = orig->km.state; |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index fbd9e6cd0fd7..aa778748c565 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -515,6 +515,9 @@ static struct xfrm_state *xfrm_state_construct(struct net *net, | |||
515 | 515 | ||
516 | copy_from_user_state(x, p); | 516 | copy_from_user_state(x, p); |
517 | 517 | ||
518 | if (attrs[XFRMA_SA_EXTRA_FLAGS]) | ||
519 | x->props.extra_flags = nla_get_u32(attrs[XFRMA_SA_EXTRA_FLAGS]); | ||
520 | |||
518 | if ((err = attach_aead(&x->aead, &x->props.ealgo, | 521 | if ((err = attach_aead(&x->aead, &x->props.ealgo, |
519 | attrs[XFRMA_ALG_AEAD]))) | 522 | attrs[XFRMA_ALG_AEAD]))) |
520 | goto error; | 523 | goto error; |
@@ -779,6 +782,13 @@ static int copy_to_user_state_extra(struct xfrm_state *x, | |||
779 | 782 | ||
780 | copy_to_user_state(x, p); | 783 | copy_to_user_state(x, p); |
781 | 784 | ||
785 | if (x->props.extra_flags) { | ||
786 | ret = nla_put_u32(skb, XFRMA_SA_EXTRA_FLAGS, | ||
787 | x->props.extra_flags); | ||
788 | if (ret) | ||
789 | goto out; | ||
790 | } | ||
791 | |||
782 | if (x->coaddr) { | 792 | if (x->coaddr) { |
783 | ret = nla_put(skb, XFRMA_COADDR, sizeof(*x->coaddr), x->coaddr); | 793 | ret = nla_put(skb, XFRMA_COADDR, sizeof(*x->coaddr), x->coaddr); |
784 | if (ret) | 794 | if (ret) |
@@ -2302,9 +2312,10 @@ static const struct nla_policy xfrma_policy[XFRMA_MAX+1] = { | |||
2302 | [XFRMA_MARK] = { .len = sizeof(struct xfrm_mark) }, | 2312 | [XFRMA_MARK] = { .len = sizeof(struct xfrm_mark) }, |
2303 | [XFRMA_TFCPAD] = { .type = NLA_U32 }, | 2313 | [XFRMA_TFCPAD] = { .type = NLA_U32 }, |
2304 | [XFRMA_REPLAY_ESN_VAL] = { .len = sizeof(struct xfrm_replay_state_esn) }, | 2314 | [XFRMA_REPLAY_ESN_VAL] = { .len = sizeof(struct xfrm_replay_state_esn) }, |
2315 | [XFRMA_SA_EXTRA_FLAGS] = { .type = NLA_U32 }, | ||
2305 | }; | 2316 | }; |
2306 | 2317 | ||
2307 | static struct xfrm_link { | 2318 | static const struct xfrm_link { |
2308 | int (*doit)(struct sk_buff *, struct nlmsghdr *, struct nlattr **); | 2319 | int (*doit)(struct sk_buff *, struct nlmsghdr *, struct nlattr **); |
2309 | int (*dump)(struct sk_buff *, struct netlink_callback *); | 2320 | int (*dump)(struct sk_buff *, struct netlink_callback *); |
2310 | int (*done)(struct netlink_callback *); | 2321 | int (*done)(struct netlink_callback *); |
@@ -2338,7 +2349,7 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
2338 | { | 2349 | { |
2339 | struct net *net = sock_net(skb->sk); | 2350 | struct net *net = sock_net(skb->sk); |
2340 | struct nlattr *attrs[XFRMA_MAX+1]; | 2351 | struct nlattr *attrs[XFRMA_MAX+1]; |
2341 | struct xfrm_link *link; | 2352 | const struct xfrm_link *link; |
2342 | int type, err; | 2353 | int type, err; |
2343 | 2354 | ||
2344 | type = nlh->nlmsg_type; | 2355 | type = nlh->nlmsg_type; |
@@ -2495,6 +2506,8 @@ static inline size_t xfrm_sa_len(struct xfrm_state *x) | |||
2495 | x->security->ctx_len); | 2506 | x->security->ctx_len); |
2496 | if (x->coaddr) | 2507 | if (x->coaddr) |
2497 | l += nla_total_size(sizeof(*x->coaddr)); | 2508 | l += nla_total_size(sizeof(*x->coaddr)); |
2509 | if (x->props.extra_flags) | ||
2510 | l += nla_total_size(sizeof(x->props.extra_flags)); | ||
2498 | 2511 | ||
2499 | /* Must count x->lastused as it may become non-zero behind our back. */ | 2512 | /* Must count x->lastused as it may become non-zero behind our back. */ |
2500 | l += nla_total_size(sizeof(u64)); | 2513 | l += nla_total_size(sizeof(u64)); |