From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nathan Harold Subject: [PATCH ipsec-next] xfrm: Allow Set Mark to be Updated Using UPDSA Date: Fri, 29 Jun 2018 15:07:10 -0700 Message-ID: <20180629220710.190783-1-nharold@google.com> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Cc: Nathan Harold To: netdev@vger.kernel.org Return-path: Received: from mail-qt0-f202.google.com ([209.85.216.202]:42487 "EHLO mail-qt0-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932935AbeF2WHf (ORCPT ); Fri, 29 Jun 2018 18:07:35 -0400 Received: by mail-qt0-f202.google.com with SMTP id f8-v6so10782172qth.9 for ; Fri, 29 Jun 2018 15:07:35 -0700 (PDT) Sender: netdev-owner@vger.kernel.org List-ID: 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 Change-Id: Ia05c6733a94c1901cd1e54eb7c7e237704678d71 --- net/xfrm/xfrm_state.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index e04a510ec992..c9ffcdfa89f6 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -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); -- 2.18.0.399.gad0ab374a1-goog