xref: /aosp_15_r20/external/libnl/include/netlink/handlers.h (revision 4dc78e53d49367fa8e61b07018507c90983a077d)
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