[PATCH 5/8] nl_cb: store nl_cb_type in struct nl_cb

Arend van Spriel arend at broadcom.com
Thu Sep 5 08:11:29 EDT 2013


The application could use the same handler for multiple
nl_cb_type events. This patch stores the nl_cb_type in
the nl_cb struct during the callback. This allows the
application to obtain that information using the new
nl_cb_active_type() function. This way the callback
signature remains as is so existing applications are
not affected.

Signed-off-by: Arend van Spriel <arend at broadcom.com>
---
 include/netlink-private/netlink.h |    7 ++++++-
 include/netlink-private/types.h   |   16 +++++++++-------
 include/netlink/handlers.h        |    2 ++
 lib/handlers.c                    |   24 ++++++++++++++++++------
 4 files changed, 35 insertions(+), 14 deletions(-)

diff --git a/include/netlink-private/netlink.h b/include/netlink-private/netlink.h
index 2e511bf..25d09ba 100644
--- a/include/netlink-private/netlink.h
+++ b/include/netlink-private/netlink.h
@@ -126,7 +126,12 @@ extern void dump_from_ops(struct nl_object *, struct nl_dump_params *);
 
 static inline int nl_cb_call(struct nl_cb *cb, int type, struct nl_msg *msg)
 {
-	return cb->cb_set[type](msg, cb->cb_args[type]);
+	int ret;
+
+	cb->cb_active = type;
+	ret = cb->cb_set[type](msg, cb->cb_args[type]);
+	cb->cb_active = __NL_CB_TYPE_MAX;
+	return ret;
 }
 
 #define ARRAY_SIZE(X) (sizeof(X) / sizeof((X)[0]))
diff --git a/include/netlink-private/types.h b/include/netlink-private/types.h
index 05a6a45..9f66307 100644
--- a/include/netlink-private/types.h
+++ b/include/netlink-private/types.h
@@ -38,7 +38,7 @@ struct nl_cb
 {
 	nl_recvmsg_msg_cb_t	cb_set[NL_CB_TYPE_MAX+1];
 	void *			cb_args[NL_CB_TYPE_MAX+1];
-	
+
 	nl_recvmsg_err_cb_t	cb_err;
 	void *			cb_err_arg;
 
@@ -60,6 +60,8 @@ struct nl_cb
 					      struct nl_msg *);
 
 	int			cb_refcnt;
+	/** indicates the callback that is currently active */
+	enum nl_cb_type		cb_active;
 };
 
 struct nl_sock
@@ -165,7 +167,7 @@ struct rtnl_link
 	uint32_t			l_txqlen;
 	uint32_t			l_weight;
 	uint32_t			l_master;
-	struct nl_addr *		l_addr;	
+	struct nl_addr *		l_addr;
 	struct nl_addr *		l_bcast;
 	char				l_qdisc[IFQDISCSIZ];
 	struct rtnl_link_map		l_map;
@@ -206,9 +208,9 @@ struct rtnl_neigh
 	uint32_t	n_ifindex;
 	uint16_t	n_state;
 	uint8_t		n_flags;
-	uint8_t		n_type;	
+	uint8_t		n_type;
 	struct nl_addr *n_lladdr;
-	struct nl_addr *n_dst;	
+	struct nl_addr *n_dst;
 	uint32_t	n_probes;
 	struct rtnl_ncacheinfo n_cacheinfo;
 	uint32_t                n_state_mask;
@@ -242,14 +244,14 @@ struct rtnl_addr
 	uint8_t		a_scope;
 	uint32_t	a_ifindex;
 
-	struct nl_addr *a_peer;	
+	struct nl_addr *a_peer;
 	struct nl_addr *a_local;
 	struct nl_addr *a_bcast;
 	struct nl_addr *a_anycast;
 	struct nl_addr *a_multicast;
 
 	struct rtnl_addr_cacheinfo a_cacheinfo;
-	
+
 	char a_label[IFNAMSIZ];
 	uint32_t a_flag_mask;
 	struct rtnl_link *a_link;
@@ -401,7 +403,7 @@ struct rtnl_neightbl_parms
 	 * Queue length for the delayed proxy arp requests.
 	 */
 	uint32_t		ntp_proxy_qlen;
-	
+
 	/**
 	 * Mask of available parameter attributes
 	 */
diff --git a/include/netlink/handlers.h b/include/netlink/handlers.h
index dfa2809..e94cd34 100644
--- a/include/netlink/handlers.h
+++ b/include/netlink/handlers.h
@@ -139,6 +139,8 @@ extern void nl_cb_overwrite_send(struct nl_cb *,
 				 int (*func)(struct nl_sock *,
 					     struct nl_msg *));
 
+extern enum nl_cb_type nl_cb_active_type(struct nl_cb *cb);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/handlers.c b/lib/handlers.c
index e52c850..a6a97bb 100644
--- a/lib/handlers.c
+++ b/lib/handlers.c
@@ -35,7 +35,7 @@ static void print_header_content(FILE *ofd, struct nlmsghdr *n)
 {
 	char flags[128];
 	char type[32];
-	
+
 	fprintf(ofd, "type=%s length=%u flags=<%s> sequence-nr=%u pid=%u",
 		nl_nlmsgtype2str(n->nlmsg_type, type, sizeof(type)),
 		n->nlmsg_len, nl_nlmsg_flags2str(n->nlmsg_flags, flags,
@@ -71,7 +71,7 @@ static int nl_overrun_handler_verbose(struct nl_msg *msg, void *arg)
 	fprintf(ofd, "-- Error: Netlink Overrun: ");
 	print_header_content(ofd, nlmsg_hdr(msg));
 	fprintf(ofd, "\n");
-	
+
 	return NL_STOP;
 }
 
@@ -107,7 +107,7 @@ static int nl_finish_handler_debug(struct nl_msg *msg, void *arg)
 	fprintf(ofd, "-- Debug: End of multipart message block: ");
 	print_header_content(ofd, nlmsg_hdr(msg));
 	fprintf(ofd, "\n");
-	
+
 	return NL_STOP;
 }
 
@@ -117,7 +117,7 @@ static int nl_msg_in_handler_debug(struct nl_msg *msg, void *arg)
 
 	fprintf(ofd, "-- Debug: Received Message:\n");
 	nl_msg_dump(msg, ofd);
-	
+
 	return NL_OK;
 }
 
@@ -211,6 +211,7 @@ struct nl_cb *nl_cb_alloc(enum nl_cb_kind kind)
 		return NULL;
 
 	cb->cb_refcnt = 1;
+	cb->cb_active = NL_CB_TYPE_MAX + 1;
 
 	for (i = 0; i <= NL_CB_TYPE_MAX; i++)
 		nl_cb_set(cb, i, kind, NULL, NULL);
@@ -229,7 +230,7 @@ struct nl_cb *nl_cb_alloc(enum nl_cb_kind kind)
 struct nl_cb *nl_cb_clone(struct nl_cb *orig)
 {
 	struct nl_cb *cb;
-	
+
 	cb = nl_cb_alloc(NL_CB_DEFAULT);
 	if (!cb)
 		return NULL;
@@ -261,6 +262,17 @@ void nl_cb_put(struct nl_cb *cb)
 		free(cb);
 }
 
+/**
+ * Obtain type of current active callback
+ * @arg cb		callback to query
+ *
+ * @return type or __NL_CB_TYPE_MAX if none active
+ */
+enum nl_cb_type nl_cb_active_type(struct nl_cb *cb)
+{
+	return cb->cb_active;
+}
+
 /** @} */
 
 /**
@@ -269,7 +281,7 @@ void nl_cb_put(struct nl_cb *cb)
  */
 
 /**
- * Set up a callback 
+ * Set up a callback
  * @arg cb		callback set
  * @arg type		callback to modify
  * @arg kind		kind of implementation
-- 
1.7.10.4





More information about the libnl mailing list