summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorInaky Perez-Gonzalez <inaky@linux.intel.com>2008-12-12 02:11:40 -0800
committerInaky Perez-Gonzalez <inaky@linux.intel.com>2008-12-12 02:38:15 -0800
commit62014a51da02bea5f22f89373463366cb20f6341 (patch)
treeb407e3b712a1c5805cde508c0cf76d7461c72c8d /include
parent05391ddafc687f06fd2850338387e6064de09f1f (diff)
libwimaxll: callbacks take "void *" priv pointers
Change the callback model not to require a typed context and make it completely up to the application. The reason we had it before using an specific type that could be wrapped was that we had the callback pre-handler, when de-marshalled the arguments for the callback, to store in there the result of the demarshalling. However, that's kind of silly -- there is nothing the callback can do in case of error, as it doesn't even get called. So changed to just print an error message and return to wimaxll_gnl_cb(), which will just skip the bad netlink message. As part of this, we can move all the definitions of 'wimaxll_gnl_cb_context' to internal.h. Note as well that we cannot always set the context passed by wimaxll_recv(), as that'd mean -EBUSY from the user-set callbacks in wmx would leak to wimaxll_recv(), when their mission was to force nl_recvmsgs() to stop processing messages and return to wimaxll_recv()'s caller inmediately. So we need to consider -EBUSY as no error but just a code and in that case, consider that result is "zero". Signed-off-by: Inaky Perez-Gonzalez <inaky@linux.intel.com>
Diffstat (limited to 'include')
-rw-r--r--include/wimaxll.h178
1 files changed, 17 insertions, 161 deletions
diff --git a/include/wimaxll.h b/include/wimaxll.h
index 6dc71ff..fe3275d 100644
--- a/include/wimaxll.h
+++ b/include/wimaxll.h
@@ -227,14 +227,8 @@
#include <stdarg.h>
#include <linux/wimax.h>
-/**
- * A WiMax control pipe handle
- *
- * This type is opaque to the user
- */
struct wimaxll_handle;
-struct wimaxll_gnl_cb_context;
struct nlattr;
@@ -247,18 +241,10 @@ struct nlattr;
* wimaxll_recv().
*
* Callbacks are always passed a pointer to a private context as set
- * by the application. The context is always of type struct
- * wimaxll_gnl_cb_context and is meant to be used wrapped in an
- * application-specific structure where private information can be
- * stored.
- *
- * When an application specific context is created, the
- * wimaxll_gnl_cb_context part of it should be initialized (with
- * WIMAXLL_GNL_CB_CONTEXT_INIT() or
- * wimaxll_gnl_cb_context_init()). Callback functions can safely
- * update it's \e result field with wimaxll_cb_context_set_result().
+ * by the application.
*/
+
/**
* Callback for a \e message \e to \e user generic netlink message
*
@@ -272,20 +258,20 @@ struct nlattr;
* guidelines for using callbacks.
*
* \param wmx WiMAX device handle
- * \param ctx Context passed by the user with
+ * \param priv Context passed by the user with
* wimaxll_pipe_set_cb_msg_to_user().
* \param pipe_name Name of the pipe the message is sent for
* \param data Pointer to a buffer with the message data.
* \param size Size of the buffer
- * \return 0 if it is ok to keep processing messages, -EBUSY if
+ * \return >= 0 if it is ok to keep processing messages, -EBUSY if
* message processing should stop and control be returned to the
- * caller. -EINPROGRESS if the callback wants to ignore the
- * message.
+ * caller. Any other negative error code to continue processing
+ * messages skipping the current one.
*
* \ingroup the_messaging_interface
*/
typedef int (*wimaxll_msg_to_user_cb_f)(struct wimaxll_handle *wmx,
- struct wimaxll_gnl_cb_context *ctx,
+ void *priv,
const char *pipe_name,
const void *data, size_t size);
@@ -300,150 +286,22 @@ typedef int (*wimaxll_msg_to_user_cb_f)(struct wimaxll_handle *wmx,
* guidelines for using callbacks.
*
* \param wmx WiMAX device handle
- * \param ctx Context passed by the user with
- * wimaxll_set_cb_state_change(). This is a pointer to a standard
- * context structure than can be wrapped in application-specific
- * ones.
+ * \param priv ctx Context passed by the user with
+ * wimaxll_set_cb_state_change().
* \param old_state State the WiMAX device left
* \param new_state State the WiMAX device entered
- * \return 0 if it is ok to keep processing messages, -EBUSY if
+ * \return >= 0 if it is ok to keep processing messages, -EBUSY if
* message processing should stop and control be returned to the
- * caller.
+ * caller. Any other negative error code to continue processing
+ * messages skipping the current one.
*
* \ingroup state_change_group
*/
typedef int (*wimaxll_state_change_cb_f)(
- struct wimaxll_handle *, struct wimaxll_gnl_cb_context *,
+ struct wimaxll_handle *, void *priv,
enum wimax_st old_state, enum wimax_st new_state);
-/**
- * General structure for storing callback context
- *
- * \ingroup callbacks
- *
- * Callbacks set by the user receive a user-set pointer to a context
- * structure. The user can wrap this struct in a bigger context struct
- * and use wimaxll_container_of() during the callback to obtain its
- * pointer.
- *
- * Usage:
- *
- * \code
- * ...
- * struct wimaxll_handle *wmx;
- * ...
- * struct my_context {
- * struct wimaxll_gnl_cb_context ctx;
- * <my data>
- * } my_ctx = {
- * .ctx = WIMAXLL_GNL_CB_CONTEXT_INIT(wmx),
- * <my data initialization>
- * };
- * ...
- * wimaxll_set_cb_SOMECALLBACK(wmx, my_callback, &my_ctx.ctx);
- * ...
- * result = wimaxll_pipe_read(wmx);
- * ...
- *
- * // When my_callback() is called
- * my_callback(wmx, ctx, ...)
- * {
- * struct my_context *my_ctx = wimaxll_container_of(
- * ctx, struct my_callback, ctx);
- * ...
- * // do stuff with my_ctx
- * }
- * \endcode
- *
- * \param wmx WiMAX handle this context refers to (for usage by the
- * callback).
- * \param result Result of the handling of the message. For usage by
- * the callback. Should not be set to -EINPROGRESS, as this will
- * be interpreted by the message handler as no processing was done
- * on the message.
- *
- * \internal
- *
- * \param msg_done This is used internally to mark when the acks (or
- * errors) for a message have been received and the message
- * receiving loop can be considered done.
- */
-struct wimaxll_gnl_cb_context {
- struct wimaxll_handle *wmx;
- ssize_t result;
- unsigned msg_done:1; /* internal */
-};
-
-
-/**
- * Initialize a definition of struct wimaxll_gnl_cb_context
- *
- * \param _wmx pointer to the WiMAX device handle this will be
- * associated to
- *
- * Use as:
- *
- * \code
- * struct wimaxll_handle *wmx;
- * ...
- * struct wimaxll_gnl_cb_context my_context = WIMAXLL_GNL_CB_CONTEXT_INIT(wmx);
- * \endcode
- *
- * \ingroup callbacks
- */
-#define WIMAXLL_GNL_CB_CONTEXT_INIT(_wmx) { \
- .wmx = (_wmx), \
- .result = -EINPROGRESS, \
-}
-
-
-static inline // ugly workaround for doxygen
-/**
- * Initialize a struct wimaxll_gnl_cb_context
- *
- * \param ctx Pointer to the struct wimaxll_gnl_cb_context.
- * \param wmx pointer to the WiMAX device handle this will be
- * associated to
- *
- * Use as:
- *
- * \code
- * struct wimaxll_handle *wmx;
- * ...
- * struct wimaxll_gnl_cb_context my_context;
- * ...
- * wimaxll_gnl_cb_context(&my_context, wmx);
- * \endcode
- *
- * \ingroup callbacks
- * \fn static void wimaxll_gnl_cb_context_init(struct wimaxll_gnl_cb_context *ctx, struct wimaxll_handle *wmx)
- */
-void wimaxll_gnl_cb_context_init(struct wimaxll_gnl_cb_context *ctx,
- struct wimaxll_handle *wmx)
-{
- ctx->wmx = wmx;
- ctx->result = -EINPROGRESS;
-}
-
-
-static inline // ugly workaround for doxygen
-/**
- * Set the result value in a callback context
- *
- * \param ctx Context where to set -- if NULL, no action will be taken
- * \param val value to set for \a result
- *
- * \ingroup callbacks
- * \fn static void wimaxll_cb_maybe_set_result(struct wimaxll_gnl_cb_context *ctx, int val)
- */
-void wimaxll_cb_maybe_set_result(struct wimaxll_gnl_cb_context *ctx, int val)
-{
- if (ctx != NULL && ctx->result == -EINPROGRESS)
- ctx->result = val;
-}
-
-
/* Basic handle management */
struct wimaxll_handle *wimaxll_open(const char *device_name);
void wimaxll_close(struct wimaxll_handle *);
@@ -458,11 +316,9 @@ ssize_t wimaxll_msg_write(struct wimaxll_handle *, const char *,
const void *, size_t);
void wimaxll_get_cb_msg_to_user(struct wimaxll_handle *,
- wimaxll_msg_to_user_cb_f *,
- struct wimaxll_gnl_cb_context **);
+ wimaxll_msg_to_user_cb_f *, void **);
void wimaxll_set_cb_msg_to_user(struct wimaxll_handle *,
- wimaxll_msg_to_user_cb_f,
- struct wimaxll_gnl_cb_context *);
+ wimaxll_msg_to_user_cb_f, void *);
#define WIMAX_PIPE_ANY (NULL-1)
ssize_t wimaxll_msg_read(struct wimaxll_handle *, const char *pine_name,
@@ -475,10 +331,10 @@ int wimaxll_reset(struct wimaxll_handle *);
void wimaxll_get_cb_state_change(
struct wimaxll_handle *, wimaxll_state_change_cb_f *,
- struct wimaxll_gnl_cb_context **);
+ void **);
void wimaxll_set_cb_state_change(
struct wimaxll_handle *, wimaxll_state_change_cb_f,
- struct wimaxll_gnl_cb_context *);
+ void *);
ssize_t wimaxll_wait_for_state_change(struct wimaxll_handle *wmx,
enum wimax_st *old_state,
enum wimax_st *new_state);