]> git.ipfire.org Git - thirdparty/libnl.git/commitdiff
nl_cb: store nl_cb_type in struct nl_cb
authorArend van Spriel <arend@broadcom.com>
Thu, 5 Sep 2013 12:11:29 +0000 (14:11 +0200)
committerThomas Graf <tgraf@suug.ch>
Thu, 5 Sep 2013 15:46:00 +0000 (17:46 +0200)
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@broadcom.com>
Signed-off-by: Thomas Graf <tgraf@suug.ch>
include/netlink-private/netlink.h
include/netlink-private/types.h
include/netlink/handlers.h
lib/handlers.c

index 2315e71bebba55e8c4545f84ce1db0890db5e666..2b1a68e44fc3d3864daad5c27d9f86238d4274db 100644 (file)
@@ -128,7 +128,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]))
index 0fda9ac68e268038afd9b48ef794e40c08391bba..aef230ce6a7cff5eeca9d894be4d4982c13aef36 100644 (file)
@@ -39,7 +39,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;
 
@@ -61,6 +61,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
@@ -166,7 +168,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;
@@ -207,9 +209,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;
@@ -243,14 +245,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;
@@ -402,7 +404,7 @@ struct rtnl_neightbl_parms
         * Queue length for the delayed proxy arp requests.
         */
        uint32_t                ntp_proxy_qlen;
-       
+
        /**
         * Mask of available parameter attributes
         */
index dfa280925ba6a3fd25aea119e99d345428974bdd..e94cd348e264c187d0569ad85f92508c3add5bcd 100644 (file)
@@ -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
index e52c850f22ac08debcbc6b03ad19b2e20f5a981d..a6a97bb8d63156da0a86c0a80f1a9f0a8eea462d 100644 (file)
@@ -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