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 
     20 /* We can use bionic's <linux/netlink.h>. */
     21 #include <linux/netlink.h>
     22 
     23 #ifdef __cplusplus
     24 extern "C" {
     25 #endif
     26 
     27 struct nl_cb;
     28 struct nl_sock;
     29 struct nl_msg;
     30 struct ucred;
     31 
     32 /**
     33  * @name Callback Typedefs
     34  * @{
     35  */
     36 
     37 /**
     38  * nl_recvmsgs() callback for message processing customization
     39  * @ingroup cb
     40  * @arg msg		netlink message being processed
     41  * @arg arg		argument passwd on through caller
     42  */
     43 typedef int (*nl_recvmsg_msg_cb_t)(struct nl_msg *msg, void *arg);
     44 
     45 /**
     46  * nl_recvmsgs() callback for error message processing customization
     47  * @ingroup cb
     48  * @arg nla		netlink address of the peer
     49  * @arg nlerr		netlink error message being processed
     50  * @arg arg		argument passed on through caller
     51  */
     52 typedef int (*nl_recvmsg_err_cb_t)(struct sockaddr_nl *nla,
     53 				   struct nlmsgerr *nlerr, void *arg);
     54 
     55 /** @} */
     56 
     57 /**
     58  * Callback actions
     59  * @ingroup cb
     60  */
     61 enum nl_cb_action {
     62 	/** Proceed with wathever would come next */
     63 	NL_OK,
     64 	/** Skip this message */
     65 	NL_SKIP,
     66 	/** Stop parsing altogether and discard remaining messages */
     67 	NL_STOP,
     68 };
     69 
     70 /**
     71  * Callback kinds
     72  * @ingroup cb
     73  */
     74 enum nl_cb_kind {
     75 	/** Default handlers (quiet) */
     76 	NL_CB_DEFAULT,
     77 	/** Verbose default handlers (error messages printed) */
     78 	NL_CB_VERBOSE,
     79 	/** Debug handlers for debugging */
     80 	NL_CB_DEBUG,
     81 	/** Customized handler specified by the user */
     82 	NL_CB_CUSTOM,
     83 	__NL_CB_KIND_MAX,
     84 };
     85 
     86 #define NL_CB_KIND_MAX (__NL_CB_KIND_MAX - 1)
     87 
     88 /**
     89  * Callback types
     90  * @ingroup cb
     91  */
     92 enum nl_cb_type {
     93 	/** Message is valid */
     94 	NL_CB_VALID,
     95 	/** Last message in a series of multi part messages received */
     96 	NL_CB_FINISH,
     97 	/** Report received that data was lost */
     98 	NL_CB_OVERRUN,
     99 	/** Message wants to be skipped */
    100 	NL_CB_SKIPPED,
    101 	/** Message is an acknowledge */
    102 	NL_CB_ACK,
    103 	/** Called for every message received */
    104 	NL_CB_MSG_IN,
    105 	/** Called for every message sent out except for nl_sendto() */
    106 	NL_CB_MSG_OUT,
    107 	/** Message is malformed and invalid */
    108 	NL_CB_INVALID,
    109 	/** Called instead of internal sequence number checking */
    110 	NL_CB_SEQ_CHECK,
    111 	/** Sending of an acknowledge message has been requested */
    112 	NL_CB_SEND_ACK,
    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 #ifdef __cplusplus
    143 }
    144 #endif
    145 
    146 #endif
    147