123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- /*
- * netlink/handlers.c default netlink message handlers
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation version 2.1
- * of the License.
- *
- * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch>
- */
- #ifndef NETLINK_HANDLERS_H_
- #define NETLINK_HANDLERS_H_
- #include <stdio.h>
- #include <stdint.h>
- #include <sys/socket.h>
- #include <sys/types.h>
- #include <netlink/netlink-compat.h>
- #include <netlink/netlink-kernel.h>
- #include <netlink/types.h>
- #ifdef __cplusplus
- extern "C" {
- #endif
- struct nl_sock;
- struct nl_msg;
- struct nl_cb;
- /**
- * @name Callback Typedefs
- * @{
- */
- /**
- * nl_recvmsgs() callback for message processing customization
- * @ingroup cb
- * @arg msg netlink message being processed
- * @arg arg argument passwd on through caller
- */
- typedef int (*nl_recvmsg_msg_cb_t)(struct nl_msg *msg, void *arg);
- /**
- * nl_recvmsgs() callback for error message processing customization
- * @ingroup cb
- * @arg nla netlink address of the peer
- * @arg nlerr netlink error message being processed
- * @arg arg argument passed on through caller
- */
- typedef int (*nl_recvmsg_err_cb_t)(struct sockaddr_nl *nla,
- struct nlmsgerr *nlerr, void *arg);
- /** @} */
- /**
- * Callback actions
- * @ingroup cb
- */
- enum nl_cb_action {
- /** Proceed with wathever would come next */
- NL_OK,
- /** Skip this message */
- NL_SKIP,
- /** Stop parsing altogether and discard remaining messages */
- NL_STOP,
- };
- /**
- * Callback kinds
- * @ingroup cb
- */
- enum nl_cb_kind {
- /** Default handlers (quiet) */
- NL_CB_DEFAULT,
- /** Verbose default handlers (error messages printed) */
- NL_CB_VERBOSE,
- /** Debug handlers for debugging */
- NL_CB_DEBUG,
- /** Customized handler specified by the user */
- NL_CB_CUSTOM,
- __NL_CB_KIND_MAX,
- };
- #define NL_CB_KIND_MAX (__NL_CB_KIND_MAX - 1)
- /**
- * Callback types
- * @ingroup cb
- */
- enum nl_cb_type {
- /** Message is valid */
- NL_CB_VALID,
- /** Last message in a series of multi part messages received */
- NL_CB_FINISH,
- /** Report received that data was lost */
- NL_CB_OVERRUN,
- /** Message wants to be skipped */
- NL_CB_SKIPPED,
- /** Message is an acknowledge */
- NL_CB_ACK,
- /** Called for every message received */
- NL_CB_MSG_IN,
- /** Called for every message sent out except for nl_sendto() */
- NL_CB_MSG_OUT,
- /** Message is malformed and invalid */
- NL_CB_INVALID,
- /** Called instead of internal sequence number checking */
- NL_CB_SEQ_CHECK,
- /** Sending of an acknowledge message has been requested */
- NL_CB_SEND_ACK,
- __NL_CB_TYPE_MAX,
- };
- #define NL_CB_TYPE_MAX (__NL_CB_TYPE_MAX - 1)
- 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;
- /** May be used to replace nl_recvmsgs with your own implementation
- * in all internal calls to nl_recvmsgs. */
- int (*cb_recvmsgs_ow)(struct nl_sock *,
- struct nl_cb *);
- /** Overwrite internal calls to nl_recv, must return the number of
- * octets read and allocate a buffer for the received data. */
- int (*cb_recv_ow)(struct nl_sock *,
- struct sockaddr_nl *,
- unsigned char **,
- struct ucred **);
- /** Overwrites internal calls to nl_send, must send the netlink
- * message. */
- int (*cb_send_ow)(struct nl_sock *,
- struct nl_msg *);
- int cb_refcnt;
- };
- extern struct nl_cb * nl_cb_alloc(enum nl_cb_kind);
- extern struct nl_cb * nl_cb_clone(struct nl_cb *);
- extern void nl_cb_put(struct nl_cb *);
- extern int nl_cb_set(struct nl_cb *, enum nl_cb_type, enum nl_cb_kind,
- nl_recvmsg_msg_cb_t, void *);
- extern int nl_cb_err(struct nl_cb *, enum nl_cb_kind, nl_recvmsg_err_cb_t,
- void *);
- static inline struct nl_cb *nl_cb_get(struct nl_cb *cb)
- {
- cb->cb_refcnt++;
- return cb;
- }
- /**
- * Set up a all callbacks
- * @arg cb callback set
- * @arg kind kind of callback
- * @arg func callback function
- * @arg arg argument to be passwd to callback function
- *
- * @return 0 on success or a negative error code
- */
- static inline int nl_cb_set_all(struct nl_cb *cb, enum nl_cb_kind kind,
- nl_recvmsg_msg_cb_t func, void *arg)
- {
- int i, err;
- for (i = 0; i <= NL_CB_TYPE_MAX; i++) {
- err = nl_cb_set(cb,(enum nl_cb_type)i, kind, func, arg);
- if (err < 0)
- return err;
- }
- return 0;
- }
- /**
- * @name Overwriting
- * @{
- */
- /**
- * Overwrite internal calls to nl_recvmsgs()
- * @arg cb callback set
- * @arg func replacement callback for nl_recvmsgs()
- */
- static inline void nl_cb_overwrite_recvmsgs(struct nl_cb *cb,
- int (*func)(struct nl_sock *, struct nl_cb *))
- {
- cb->cb_recvmsgs_ow = func;
- }
- /**
- * Overwrite internal calls to nl_recv()
- * @arg cb callback set
- * @arg func replacement callback for nl_recv()
- */
- static inline void nl_cb_overwrite_recv(struct nl_cb *cb,
- int (*func)(struct nl_sock *, struct sockaddr_nl *,
- unsigned char **, struct ucred **))
- {
- cb->cb_recv_ow = func;
- }
- /**
- * Overwrite internal calls to nl_send()
- * @arg cb callback set
- * @arg func replacement callback for nl_send()
- */
- static inline void nl_cb_overwrite_send(struct nl_cb *cb,
- int (*func)(struct nl_sock *, struct nl_msg *))
- {
- cb->cb_send_ow = func;
- }
- /** @} */
- #ifdef __cplusplus
- }
- #endif
- #endif
|