Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 25 Feb 2021 08:15:16 GMT
From:      Lutz Donnerhacke <donner@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 3de9c792eebe - stable/12 - netgraph/ng_bridge: Make simple internal functions read-only
Message-ID:  <202102250815.11P8FGpf074679@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/12 has been updated by donner:

URL: https://cgit.FreeBSD.org/src/commit/?id=3de9c792eebe77ef2cdf1f6aad28cc4df9e8c37d

commit 3de9c792eebe77ef2cdf1f6aad28cc4df9e8c37d
Author:     Lutz Donnerhacke <donner@FreeBSD.org>
AuthorDate: 2021-01-13 22:18:55 +0000
Commit:     Lutz Donnerhacke <donner@FreeBSD.org>
CommitDate: 2021-02-25 08:13:32 +0000

    netgraph/ng_bridge: Make simple internal functions read-only
    
    The data path in netgraph is designed to work on an read only state of
    the whole netgraph network.  Currently this is achived by convention,
    there is no technical enforcment.  In the case of NETGRAPH_DEBUG all
    nodes can be annotated for debugging purposes, so the strict
    enforcment needs to be lifted for this purpose.
    
    This patch is part of a series to make ng_bridge multithreaded, which
    is done by rewrite the data path to operate on const.
    
    Reviewed By:    kp
    Differential Revision: https://reviews.freebsd.org/D28141
    
    (cherry picked from commit 6117aa58fa4f5891badf58b13c759976983f4f04)
---
 sys/netgraph/netgraph.h  |  9 ++++++++-
 sys/netgraph/ng_base.c   |  2 +-
 sys/netgraph/ng_bridge.c | 10 ++++++----
 3 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/sys/netgraph/netgraph.h b/sys/netgraph/netgraph.h
index c7b0e67902cf..452be7c72f0a 100644
--- a/sys/netgraph/netgraph.h
+++ b/sys/netgraph/netgraph.h
@@ -88,6 +88,13 @@ struct ng_item ;
 typedef	struct ng_item *item_p;
 typedef struct ng_node *node_p;
 typedef struct ng_hook *hook_p;
+typedef	struct ng_item const *item_cp;
+typedef struct ng_hook const *hook_cp;
+#ifdef	NETGRAPH_DEBUG
+typedef struct ng_node       *node_cp; /* annotated during debug */
+#else	/* NETGRAPH_DEBUG */
+typedef struct ng_node const *node_cp;
+#endif	/* NETGRAPH_DEBUG */
 
 /* node method definitions */
 typedef	int	ng_constructor_t(node_p node);
@@ -1143,7 +1150,7 @@ int	ng_make_node_common(struct ng_type *typep, node_p *nodep);
 int	ng_name_node(node_p node, const char *name);
 node_p	ng_name2noderef(node_p node, const char *name);
 int	ng_newtype(struct ng_type *tp);
-ng_ID_t ng_node2ID(node_p node);
+ng_ID_t ng_node2ID(node_cp node);
 item_p	ng_package_data(struct mbuf *m, int flags);
 item_p	ng_package_msg(struct ng_mesg *msg, int flags);
 item_p	ng_package_msg_self(node_p here, hook_p hook, struct ng_mesg *msg);
diff --git a/sys/netgraph/ng_base.c b/sys/netgraph/ng_base.c
index cc8df1e45aa6..271397f669be 100644
--- a/sys/netgraph/ng_base.c
+++ b/sys/netgraph/ng_base.c
@@ -835,7 +835,7 @@ ng_ID2noderef(ng_ID_t ID)
 }
 
 ng_ID_t
-ng_node2ID(node_p node)
+ng_node2ID(node_cp node)
 {
 	return (node ? NG_NODE_ID(node) : 0);
 }
diff --git a/sys/netgraph/ng_bridge.c b/sys/netgraph/ng_bridge.c
index ab4e50f51277..c2d0f79a6ca5 100644
--- a/sys/netgraph/ng_bridge.c
+++ b/sys/netgraph/ng_bridge.c
@@ -115,6 +115,7 @@ struct ng_bridge_link {
 					sendUnknown : 1;/* send unknown macs out */
 	struct ng_bridge_link_kernel_stats stats;	/* link stats */
 };
+typedef struct ng_bridge_link const *link_cp;	/* read only access */
 
 /* Per-node private data */
 struct ng_bridge_private {
@@ -130,6 +131,7 @@ struct ng_bridge_private {
 	struct callout		timer;		/* one second periodic timer */
 };
 typedef struct ng_bridge_private *priv_p;
+typedef struct ng_bridge_private const *priv_cp;	/* read only access */
 
 /* Information about a host, stored in a hash table entry */
 struct ng_bridge_hent {
@@ -149,12 +151,12 @@ static ng_rcvdata_t	ng_bridge_rcvdata;
 static ng_disconnect_t	ng_bridge_disconnect;
 
 /* Other internal functions */
-static struct	ng_bridge_host *ng_bridge_get(priv_p priv, const u_char *addr);
+static struct	ng_bridge_host *ng_bridge_get(priv_cp priv, const u_char *addr);
 static int	ng_bridge_put(priv_p priv, const u_char *addr, link_p link);
 static void	ng_bridge_rehash(priv_p priv);
 static void	ng_bridge_remove_hosts(priv_p priv, link_p link);
 static void	ng_bridge_timeout(node_p node, hook_p hook, void *arg1, int arg2);
-static const	char *ng_bridge_nodename(node_p node);
+static const	char *ng_bridge_nodename(node_cp node);
 
 /* Ethernet broadcast */
 static const u_char ng_bridge_bcast_addr[ETHER_ADDR_LEN] =
@@ -995,7 +997,7 @@ ng_bridge_disconnect(hook_p hook)
  * Find a host entry in the table.
  */
 static struct ng_bridge_host *
-ng_bridge_get(priv_p priv, const u_char *addr)
+ng_bridge_get(priv_cp priv, const u_char *addr)
 {
 	const int bucket = HASH(addr, priv->hashMask);
 	struct ng_bridge_hent *hent;
@@ -1207,7 +1209,7 @@ ng_bridge_timeout(node_p node, hook_p hook, void *arg1, int arg2)
  * Return node's "name", even if it doesn't have one.
  */
 static const char *
-ng_bridge_nodename(node_p node)
+ng_bridge_nodename(node_cp node)
 {
 	static char name[NG_NODESIZ];
 



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