Home | History | Annotate | Download | only in netlink
      1 /*
      2  * netlink/handlers.c	default netlink message handlers
      3  *
      4  *	This library is free software; you can redistribute it and/or
      5  *	modify it under the terms of the GNU Lesser General Public
      6  *	License as published by the Free Software Foundation version 2.1
      7  *	of the License.
      8  *
      9  * Copyright (c) 2003-2006 Thomas Graf <tgraf (at) suug.ch>
     10  */
     11 
     12 #ifndef NETLINK_HANDLERS_H_
     13 #define NETLINK_HANDLERS_H_
     14 
     15 #include <stdio.h>
     16 #include <stdint.h>
     17 #include <sys/types.h>
     18 #include <netlink/netlink-compat.h>
     19 #include <netlink/netlink-kernel.h>
     20 
     21 #ifdef __cplusplus
     22 extern "C" {
     23 #endif
     24 
     25 struct nl_cb;
     26 struct nl_sock;
     27 struct nl_msg;
     28 struct ucred;
     29 
     30 /**
     31  * @name Callback Typedefs
     32  * @{
     33  */
     34 
     35 /**
     36  * nl_recvmsgs() callback for message processing customization
     37  * @ingroup cb
     38  * @arg msg		netlink message being processed
     39  * @arg arg		argument passwd on through caller
     40  */
     41 typedef int (*nl_recvmsg_msg_cb_t)(struct nl_msg *msg, void *arg);
     42 
     43 /**
     44  * nl_recvmsgs() callback for error message processing customization
     45  * @ingroup cb
     46  * @arg nla		netlink address of the peer
     47  * @arg nlerr		netlink error message being processed
     48  * @arg arg		argument passed on through caller
     49  */
     50 typedef int (*nl_recvmsg_err_cb_t)(struct sockaddr_nl *nla,
     51 				   struct nlmsgerr *nlerr, void *arg);
     52 
     53 /** @} */
     54 
     55 /**
     56  * Callback actions
     57  * @ingroup cb
     58  */
     59 enum nl_cb_action {
     60 	/** Proceed with wathever would come next */
     61 	NL_OK,
     62 	/** Skip this message */
     63 	NL_SKIP,
     64 	/** Stop parsing altogether and discard remaining messages */
     65 	NL_STOP,
     66 };
     67 
     68 /**
     69  * Callback kinds
     70  * @ingroup cb
     71  */
     72 enum nl_cb_kind {
     73 	/** Default handlers (quiet) */
     74 	NL_CB_DEFAULT,
     75 	/** Verbose default handlers (error messages printed) */
     76 	NL_CB_VERBOSE,
     77 	/** Debug handlers for debugging */
     78 	NL_CB_DEBUG,
     79 	/** Customized handler specified by the user */
     80 	NL_CB_CUSTOM,
     81 	__NL_CB_KIND_MAX,
     82 };
     83 
     84 #define NL_CB_KIND_MAX (__NL_CB_KIND_MAX - 1)
     85 
     86 /**
     87  * Callback types
     88  * @ingroup cb
     89  */
     90 enum nl_cb_type {
     91 	/** Message is valid */
     92 	NL_CB_VALID,
     93 	/** Last message in a series of multi part messages received */
     94 	NL_CB_FINISH,
     95 	/** Report received that data was lost */
     96 	NL_CB_OVERRUN,
     97 	/** Message wants to be skipped */
     98 	NL_CB_SKIPPED,
     99 	/** Message is an acknowledge */
    100 	NL_CB_ACK,
    101 	/** Called for every message received */
    102 	NL_CB_MSG_IN,
    103 	/** Called for every message sent out except for nl_sendto() */
    104 	NL_CB_MSG_OUT,
    105 	/** Message is malformed and invalid */
    106 	NL_CB_INVALID,
    107 	/** Called instead of internal sequence number checking */
    108 	NL_CB_SEQ_CHECK,
    109 	/** Sending of an acknowledge message has been requested */
    110 	NL_CB_SEND_ACK,
    111 	/** Flag NLM_F_DUMP_INTR is set in message */
    112 	NL_CB_DUMP_INTR,
    113 	__NL_CB_TYPE_MAX,
    114 };
    115 
    116 #define NL_CB_TYPE_MAX (__NL_CB_TYPE_MAX - 1)
    117 
    118 extern struct nl_cb *	nl_cb_alloc(enum nl_cb_kind);
    119 extern struct nl_cb *	nl_cb_clone(struct nl_cb *);
    120 extern struct nl_cb *	nl_cb_get(struct nl_cb *);
    121 extern void		nl_cb_put(struct nl_cb *);
    122 
    123 extern int  nl_cb_set(struct nl_cb *, enum nl_cb_type, enum nl_cb_kind,
    124 		      nl_recvmsg_msg_cb_t, void *);
    125 extern int  nl_cb_set_all(struct nl_cb *, enum nl_cb_kind,
    126 			  nl_recvmsg_msg_cb_t, void *);
    127 extern int  nl_cb_err(struct nl_cb *, enum nl_cb_kind, nl_recvmsg_err_cb_t,
    128 		      void *);
    129 
    130 extern void nl_cb_overwrite_recvmsgs(struct nl_cb *,
    131 				     int (*func)(struct nl_sock *,
    132 						 struct nl_cb *));
    133 extern void nl_cb_overwrite_recv(struct nl_cb *,
    134 				 int (*func)(struct nl_sock *,
    135 					     struct sockaddr_nl *,
    136 					     unsigned char **,
    137 					     struct ucred **));
    138 extern void nl_cb_overwrite_send(struct nl_cb *,
    139 				 int (*func)(struct nl_sock *,
    140 					     struct nl_msg *));
    141 
    142 extern enum nl_cb_type nl_cb_active_type(struct nl_cb *cb);
    143 
    144 #ifdef __cplusplus
    145 }
    146 #endif
    147 
    148 #endif
    149