Subj. Also add NET_ASSERT_LOCKED() to pipex_{link,unlink,rele}_session()
to be sure they called under NET_LOCK().
Index: sys/net/pipex.c
===================================================================
RCS file: /cvs/src/sys/net/pipex.c,v
retrieving revision 1.120
diff -u -p -r1.120 pipex.c
--- sys/net/pipex.c 17 Jul 2020 08:57:27 -0000 1.120
+++ sys/net/pipex.c 17 Jul 2020 14:01:10 -0000
@@ -83,19 +83,24 @@ struct pool pipex_session_pool;
struct pool mppe_key_pool;
/*
- * static/global variables
+ * Global data
+ * Locks used to protect global data
+ * A atomic operation
+ * I immutable after creation
+ * N net lock
*/
-int pipex_enable = 0;
+
+int pipex_enable = 0; /* [N] */
struct pipex_hash_head
- pipex_session_list, /* master session list
*/
- pipex_close_wait_list, /* expired session list */
- pipex_peer_addr_hashtable[PIPEX_HASH_SIZE], /* peer's address hash
*/
- pipex_id_hashtable[PIPEX_HASH_SIZE]; /* peer id hash */
+ pipex_session_list, /* [N] master session
list */
+ pipex_close_wait_list, /* [N] expired session list */
+ pipex_peer_addr_hashtable[PIPEX_HASH_SIZE], /* [N] peer's address
hash */
+ pipex_id_hashtable[PIPEX_HASH_SIZE]; /* [N] peer id hash */
-struct radix_node_head *pipex_rd_head4 = NULL;
-struct radix_node_head *pipex_rd_head6 = NULL;
+struct radix_node_head *pipex_rd_head4 = NULL; /* [N] */
+struct radix_node_head *pipex_rd_head6 = NULL; /* [N] */
struct timeout pipex_timer_ch; /* callout timer context */
-int pipex_prune = 1; /* walk list every seconds */
+int pipex_prune = 1; /* [I] walk list every seconds */
/* pipex traffic queue */
struct mbuf_queue pipexinq = MBUF_QUEUE_INITIALIZER(IFQ_MAXLEN, IPL_NET);
@@ -105,7 +110,7 @@ struct mbuf_queue pipexoutq = MBUF_QUEUE
#define ph_ppp_proto ether_vtag
#ifdef PIPEX_DEBUG
-int pipex_debug = 0; /* systcl net.inet.ip.pipex_debug */
+int pipex_debug = 0; /* [A] systcl net.inet.ip.pipex_debug */
#endif
/* PPP compression == MPPE is assumed, so don't answer CCP Reset-Request. */
@@ -419,6 +424,8 @@ pipex_init_session(struct pipex_session
void
pipex_rele_session(struct pipex_session *session)
{
+ NET_ASSERT_LOCKED();
+
if (session->mppe_recv.old_session_keys)
pool_put(&mppe_key_pool, session->mppe_recv.old_session_keys);
pool_put(&pipex_session_pool, session);
@@ -430,6 +437,8 @@ pipex_link_session(struct pipex_session
{
struct pipex_hash_head *chain;
+ NET_ASSERT_LOCKED();
+
if (!iface->pipexmode)
return (ENXIO);
if (pipex_lookup_by_session_id(session->protocol,
@@ -463,6 +472,8 @@ pipex_link_session(struct pipex_session
void
pipex_unlink_session(struct pipex_session *session)
{
+ NET_ASSERT_LOCKED();
+
session->ifindex = 0;
LIST_REMOVE(session, id_chain);