Skip to content

Commit

Permalink
xfrm: Allow Set Mark to be Updated Using UPDSA
Browse files Browse the repository at this point in the history
Allow UPDSA to change "set mark" to permit
policy separation of packet routing decisions from
SA keying in systems that use mark-based routing.

The set mark, used as a routing and firewall mark
for outbound packets, is made update-able which
allows routing decisions to be handled independently
of keying/SA creation. To maintain consistency with
other optional attributes, the set mark is only
updated if sent with a non-zero value.

The per-SA lock and the xfrm_state_lock are taken in
that order to avoid a deadlock with
xfrm_timer_handler(), which also takes the locks in
that order.

Signed-off-by: Nathan Harold <nharold@google.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
  • Loading branch information
Nathan Harold authored and klassert committed Jul 1, 2018
1 parent e4db5b6 commit 6d8e85f
Showing 1 changed file with 9 additions and 0 deletions.
9 changes: 9 additions & 0 deletions net/xfrm/xfrm_state.c
Original file line number Diff line number Diff line change
Expand Up @@ -1562,6 +1562,15 @@ int xfrm_state_update(struct xfrm_state *x)
if (x1->curlft.use_time)
xfrm_state_check_expire(x1);

if (x->props.smark.m || x->props.smark.v) {
spin_lock_bh(&net->xfrm.xfrm_state_lock);

x1->props.smark = x->props.smark;

__xfrm_state_bump_genids(x1);
spin_unlock_bh(&net->xfrm.xfrm_state_lock);
}

err = 0;
x->km.state = XFRM_STATE_DEAD;
__xfrm_state_put(x);
Expand Down

0 comments on commit 6d8e85f

Please sign in to comment.