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