Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 Nov 2016 10:39:41 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r308976 - projects/ipsec/sys/netipsec
Message-ID:  <201611221039.uAMAdfDX084210@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Tue Nov 22 10:39:41 2016
New Revision: 308976
URL: https://svnweb.freebsd.org/changeset/base/308976

Log:
  Add key_unlinksav() function that unlinks a SA from SAH's TAILQ.

Modified:
  projects/ipsec/sys/netipsec/key.c

Modified: projects/ipsec/sys/netipsec/key.c
==============================================================================
--- projects/ipsec/sys/netipsec/key.c	Tue Nov 22 10:36:00 2016	(r308975)
+++ projects/ipsec/sys/netipsec/key.c	Tue Nov 22 10:39:41 2016	(r308976)
@@ -1070,6 +1070,41 @@ key_freesav(struct secasvar **psav)
 	key_delsav(sav);
 }
 
+/*
+ * Unlink SA from SAH and SPI hash under SAHTREE_WLOCK.
+ * Expect that SA has extra reference due to lookup.
+ * Release this references, also release SAH reference after unlink.
+ */
+static void
+key_unlinksav(struct secasvar *sav)
+{
+	struct secashead *sah;
+
+	KEYDBG(KEY_STAMP,
+	    printf("%s: SA(%p)\n", __func__, sav));
+
+	SAHTREE_UNLOCK_ASSERT();
+	SAHTREE_WLOCK();
+	if (sav->state == SADB_SASTATE_DEAD) {
+		/* SA is already unlinked */
+		SAHTREE_WUNLOCK();
+		return;
+	}
+	/* Unlink from SAH */
+	if (sav->state == SADB_SASTATE_LARVAL)
+		TAILQ_REMOVE(&sav->sah->savtree_larval, sav, chain);
+	else
+		TAILQ_REMOVE(&sav->sah->savtree_alive, sav, chain);
+	/* Unlink from SPI hash */
+	LIST_REMOVE(sav, spihash);
+	sav->state = SADB_SASTATE_DEAD;
+	sah = sav->sah;
+	SAHTREE_WUNLOCK();
+	key_freesav(&sav);
+	/* Since we are unlinked, release reference to SAH */
+	key_freesah(&sah);
+}
+
 /* %%% SPD management */
 /*
  * search SPD



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201611221039.uAMAdfDX084210>