xref: /aosp_15_r20/external/libnl/lib/idiag/idiag.c (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) 2013 Sassano Systems LLC <[email protected]>
4*4dc78e53SAndroid Build Coastguard Worker  */
5*4dc78e53SAndroid Build Coastguard Worker 
6*4dc78e53SAndroid Build Coastguard Worker /**
7*4dc78e53SAndroid Build Coastguard Worker  * @defgroup  idiag Inet Diag library (libnl-idiag)
8*4dc78e53SAndroid Build Coastguard Worker  * @brief
9*4dc78e53SAndroid Build Coastguard Worker  * @{
10*4dc78e53SAndroid Build Coastguard Worker  */
11*4dc78e53SAndroid Build Coastguard Worker 
12*4dc78e53SAndroid Build Coastguard Worker #include "nl-default.h"
13*4dc78e53SAndroid Build Coastguard Worker 
14*4dc78e53SAndroid Build Coastguard Worker #include <linux/inet_diag.h>
15*4dc78e53SAndroid Build Coastguard Worker 
16*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h>
17*4dc78e53SAndroid Build Coastguard Worker #include <netlink/cache.h>
18*4dc78e53SAndroid Build Coastguard Worker #include <netlink/idiag/idiagnl.h>
19*4dc78e53SAndroid Build Coastguard Worker 
20*4dc78e53SAndroid Build Coastguard Worker #include "nl-priv-dynamic-core/nl-core.h"
21*4dc78e53SAndroid Build Coastguard Worker 
22*4dc78e53SAndroid Build Coastguard Worker /**
23*4dc78e53SAndroid Build Coastguard Worker  * @name Socket Creation
24*4dc78e53SAndroid Build Coastguard Worker  * @{
25*4dc78e53SAndroid Build Coastguard Worker  */
26*4dc78e53SAndroid Build Coastguard Worker 
27*4dc78e53SAndroid Build Coastguard Worker /**
28*4dc78e53SAndroid Build Coastguard Worker  * Create and connect idiag netlink socket.
29*4dc78e53SAndroid Build Coastguard Worker  * @arg sk    Netlink socket.
30*4dc78e53SAndroid Build Coastguard Worker  *
31*4dc78e53SAndroid Build Coastguard Worker  * Creates a NETLINK_INET_DIAG socket, binds the socket, and issues a connection
32*4dc78e53SAndroid Build Coastguard Worker  * attemp.
33*4dc78e53SAndroid Build Coastguard Worker  *
34*4dc78e53SAndroid Build Coastguard Worker  * @see nl_connect()
35*4dc78e53SAndroid Build Coastguard Worker  *
36*4dc78e53SAndroid Build Coastguard Worker  * @return 0 on success or a negative error code.
37*4dc78e53SAndroid Build Coastguard Worker  */
idiagnl_connect(struct nl_sock * sk)38*4dc78e53SAndroid Build Coastguard Worker int idiagnl_connect(struct nl_sock *sk)
39*4dc78e53SAndroid Build Coastguard Worker {
40*4dc78e53SAndroid Build Coastguard Worker 	return nl_connect(sk, NETLINK_INET_DIAG);
41*4dc78e53SAndroid Build Coastguard Worker }
42*4dc78e53SAndroid Build Coastguard Worker 
43*4dc78e53SAndroid Build Coastguard Worker /** @} */
44*4dc78e53SAndroid Build Coastguard Worker 
45*4dc78e53SAndroid Build Coastguard Worker /**
46*4dc78e53SAndroid Build Coastguard Worker  * @name Sending
47*4dc78e53SAndroid Build Coastguard Worker  * @{
48*4dc78e53SAndroid Build Coastguard Worker  */
49*4dc78e53SAndroid Build Coastguard Worker 
50*4dc78e53SAndroid Build Coastguard Worker /**
51*4dc78e53SAndroid Build Coastguard Worker  * Send trivial idiag netlink message
52*4dc78e53SAndroid Build Coastguard Worker  * @arg sk	Netlink socket.
53*4dc78e53SAndroid Build Coastguard Worker  * @arg flags	Message flags
54*4dc78e53SAndroid Build Coastguard Worker  * @arg family	Address family
55*4dc78e53SAndroid Build Coastguard Worker  * @arg states	Socket states to query
56*4dc78e53SAndroid Build Coastguard Worker  * @arg ext	Inet Diag attribute extensions to query. Note that this only supports
57*4dc78e53SAndroid Build Coastguard Worker  *   8 bit arguments. Flags outside uint8_t range are silently ignored.
58*4dc78e53SAndroid Build Coastguard Worker  *
59*4dc78e53SAndroid Build Coastguard Worker  * @return 0 on success or a negative error code. Due to a bug, this function
60*4dc78e53SAndroid Build Coastguard Worker  * returns the number of bytes sent. Treat any non-negative number as success.
61*4dc78e53SAndroid Build Coastguard Worker  */
idiagnl_send_simple(struct nl_sock * sk,int flags,uint8_t family,uint16_t states,uint16_t ext)62*4dc78e53SAndroid Build Coastguard Worker int idiagnl_send_simple(struct nl_sock *sk, int flags, uint8_t family,
63*4dc78e53SAndroid Build Coastguard Worker 		uint16_t states, uint16_t ext)
64*4dc78e53SAndroid Build Coastguard Worker {
65*4dc78e53SAndroid Build Coastguard Worker 	struct inet_diag_req req;
66*4dc78e53SAndroid Build Coastguard Worker 	memset(&req, 0, sizeof(req));
67*4dc78e53SAndroid Build Coastguard Worker 
68*4dc78e53SAndroid Build Coastguard Worker 	flags |= NLM_F_ROOT;
69*4dc78e53SAndroid Build Coastguard Worker 
70*4dc78e53SAndroid Build Coastguard Worker 	req.idiag_family = family;
71*4dc78e53SAndroid Build Coastguard Worker 	req.idiag_states = states;
72*4dc78e53SAndroid Build Coastguard Worker 	req.idiag_ext = ext;
73*4dc78e53SAndroid Build Coastguard Worker 
74*4dc78e53SAndroid Build Coastguard Worker 	return nl_send_simple(sk, TCPDIAG_GETSOCK, flags, &req, sizeof(req));
75*4dc78e53SAndroid Build Coastguard Worker }
76*4dc78e53SAndroid Build Coastguard Worker 
77*4dc78e53SAndroid Build Coastguard Worker /** @} */
78*4dc78e53SAndroid Build Coastguard Worker 
79*4dc78e53SAndroid Build Coastguard Worker /**
80*4dc78e53SAndroid Build Coastguard Worker  * @name Inet Diag flag and attribute conversions
81*4dc78e53SAndroid Build Coastguard Worker  * @{
82*4dc78e53SAndroid Build Coastguard Worker  */
83*4dc78e53SAndroid Build Coastguard Worker 
84*4dc78e53SAndroid Build Coastguard Worker static const struct trans_tbl idiag_states[] = {
85*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_ESTABLISHED, established),
86*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_SYN_SENT, syn_sent),
87*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_SYN_RECV, syn_recv),
88*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_FIN_WAIT1, fin_wait),
89*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_FIN_WAIT2, fin_wait2),
90*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_TIME_WAIT, time_wait),
91*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_CLOSE, close),
92*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_CLOSE_WAIT, close_wait),
93*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_LAST_ACK, last_ack),
94*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_LISTEN, listen),
95*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_CLOSING, closing),
96*4dc78e53SAndroid Build Coastguard Worker };
97*4dc78e53SAndroid Build Coastguard Worker 
98*4dc78e53SAndroid Build Coastguard Worker /**
99*4dc78e53SAndroid Build Coastguard Worker  * Convert inet diag socket states to strings.
100*4dc78e53SAndroid Build Coastguard Worker  * @arg state	  inetdiag socket state (e.g., TCP_ESTABLISHED)
101*4dc78e53SAndroid Build Coastguard Worker  * @arg buf	  output buffer which will hold string result
102*4dc78e53SAndroid Build Coastguard Worker  * @arg len	  length in bytes of the output buffer
103*4dc78e53SAndroid Build Coastguard Worker  *
104*4dc78e53SAndroid Build Coastguard Worker  * @return string representation of the inetdiag socket state or an empty
105*4dc78e53SAndroid Build Coastguard Worker  * string.
106*4dc78e53SAndroid Build Coastguard Worker  */
idiagnl_state2str(int state,char * buf,size_t len)107*4dc78e53SAndroid Build Coastguard Worker char * idiagnl_state2str(int state, char *buf, size_t len)
108*4dc78e53SAndroid Build Coastguard Worker {
109*4dc78e53SAndroid Build Coastguard Worker 	return __type2str(state, buf, len, idiag_states,
110*4dc78e53SAndroid Build Coastguard Worker 			ARRAY_SIZE(idiag_states));
111*4dc78e53SAndroid Build Coastguard Worker }
112*4dc78e53SAndroid Build Coastguard Worker 
113*4dc78e53SAndroid Build Coastguard Worker /**
114*4dc78e53SAndroid Build Coastguard Worker  * Convert inet diag socket state string to int.
115*4dc78e53SAndroid Build Coastguard Worker  * @arg name	inetdiag socket state string
116*4dc78e53SAndroid Build Coastguard Worker  *
117*4dc78e53SAndroid Build Coastguard Worker  * @return the int representation of the socket state strign or a negative error
118*4dc78e53SAndroid Build Coastguard Worker  * code.
119*4dc78e53SAndroid Build Coastguard Worker  */
idiagnl_str2state(const char * name)120*4dc78e53SAndroid Build Coastguard Worker int idiagnl_str2state(const char *name)
121*4dc78e53SAndroid Build Coastguard Worker {
122*4dc78e53SAndroid Build Coastguard Worker 	return __str2type(name, idiag_states, ARRAY_SIZE(idiag_states));
123*4dc78e53SAndroid Build Coastguard Worker }
124*4dc78e53SAndroid Build Coastguard Worker 
125*4dc78e53SAndroid Build Coastguard Worker static const struct trans_tbl idiag_timers[] = {
126*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IDIAGNL_TIMER_OFF, off),
127*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IDIAGNL_TIMER_ON, on),
128*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IDIAGNL_TIMER_KEEPALIVE, keepalive),
129*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IDIAGNL_TIMER_TIMEWAIT, timewait),
130*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IDIAGNL_TIMER_PERSIST, persist),
131*4dc78e53SAndroid Build Coastguard Worker 	__ADD(IDIAGNL_TIMER_UNKNOWN, unknown),
132*4dc78e53SAndroid Build Coastguard Worker };
133*4dc78e53SAndroid Build Coastguard Worker 
134*4dc78e53SAndroid Build Coastguard Worker /**
135*4dc78e53SAndroid Build Coastguard Worker  * Convert inet diag timer types to strings.
136*4dc78e53SAndroid Build Coastguard Worker  * @arg timer	  inetdiag timer (e.g., IDIAGNL_TIMER_ON)
137*4dc78e53SAndroid Build Coastguard Worker  * @arg buf	  output buffer which will hold string result
138*4dc78e53SAndroid Build Coastguard Worker  * @arg len	  length in bytes of the output buffer
139*4dc78e53SAndroid Build Coastguard Worker  *
140*4dc78e53SAndroid Build Coastguard Worker  * @return string representation of the inetdiag timer type or an empty string.
141*4dc78e53SAndroid Build Coastguard Worker  */
idiagnl_timer2str(int timer,char * buf,size_t len)142*4dc78e53SAndroid Build Coastguard Worker char * idiagnl_timer2str(int timer, char *buf, size_t len)
143*4dc78e53SAndroid Build Coastguard Worker {
144*4dc78e53SAndroid Build Coastguard Worker 	return __type2str(timer, buf, len, idiag_timers,
145*4dc78e53SAndroid Build Coastguard Worker 	    ARRAY_SIZE(idiag_timers));
146*4dc78e53SAndroid Build Coastguard Worker }
147*4dc78e53SAndroid Build Coastguard Worker 
148*4dc78e53SAndroid Build Coastguard Worker /**
149*4dc78e53SAndroid Build Coastguard Worker  * Convert inet diag timer string to int.
150*4dc78e53SAndroid Build Coastguard Worker  * @arg name	inetdiag timer string
151*4dc78e53SAndroid Build Coastguard Worker  *
152*4dc78e53SAndroid Build Coastguard Worker  * @return the int representation of the timer string or a negative error code.
153*4dc78e53SAndroid Build Coastguard Worker  */
idiagnl_str2timer(const char * name)154*4dc78e53SAndroid Build Coastguard Worker int idiagnl_str2timer(const char *name)
155*4dc78e53SAndroid Build Coastguard Worker {
156*4dc78e53SAndroid Build Coastguard Worker 	return __str2type(name, idiag_timers, ARRAY_SIZE(idiag_timers));
157*4dc78e53SAndroid Build Coastguard Worker }
158*4dc78e53SAndroid Build Coastguard Worker 
159*4dc78e53SAndroid Build Coastguard Worker static const struct trans_tbl idiag_attrs[] = {
160*4dc78e53SAndroid Build Coastguard Worker 	__ADD(INET_DIAG_NONE, none),
161*4dc78e53SAndroid Build Coastguard Worker 	__ADD(INET_DIAG_MEMINFO, meminfo),
162*4dc78e53SAndroid Build Coastguard Worker 	__ADD(INET_DIAG_INFO, info),
163*4dc78e53SAndroid Build Coastguard Worker 	__ADD(INET_DIAG_VEGASINFO, vegasinfo),
164*4dc78e53SAndroid Build Coastguard Worker 	__ADD(INET_DIAG_CONG, congestion),
165*4dc78e53SAndroid Build Coastguard Worker 	__ADD(INET_DIAG_TOS, tos),
166*4dc78e53SAndroid Build Coastguard Worker 	__ADD(INET_DIAG_TCLASS, tclass),
167*4dc78e53SAndroid Build Coastguard Worker 	__ADD(INET_DIAG_SKMEMINFO, skmeminfo),
168*4dc78e53SAndroid Build Coastguard Worker 	__ADD(INET_DIAG_SHUTDOWN, shutdown),
169*4dc78e53SAndroid Build Coastguard Worker };
170*4dc78e53SAndroid Build Coastguard Worker 
171*4dc78e53SAndroid Build Coastguard Worker /**
172*4dc78e53SAndroid Build Coastguard Worker  * Convert inet diag extension type to a string.
173*4dc78e53SAndroid Build Coastguard Worker  * @arg attrs	  inet diag extension type (e.g. INET_DIAG_MEMINFO)
174*4dc78e53SAndroid Build Coastguard Worker  * @arg buf	  output buffer which will hold string result
175*4dc78e53SAndroid Build Coastguard Worker  * @arg len	  length in bytes of the output buffer
176*4dc78e53SAndroid Build Coastguard Worker  *
177*4dc78e53SAndroid Build Coastguard Worker  * @return string representation of inet diag extension type or an empty string.
178*4dc78e53SAndroid Build Coastguard Worker  * @deprecated: don't use this function. It is not very useful and should
179*4dc78e53SAndroid Build Coastguard Worker  * never have been exposed as public API.
180*4dc78e53SAndroid Build Coastguard Worker  */
idiagnl_attrs2str(int attrs,char * buf,size_t len)181*4dc78e53SAndroid Build Coastguard Worker char *idiagnl_attrs2str(int attrs, char *buf, size_t len)
182*4dc78e53SAndroid Build Coastguard Worker {
183*4dc78e53SAndroid Build Coastguard Worker 	return __type2str(attrs, buf, len, idiag_attrs, ARRAY_SIZE(idiag_attrs));
184*4dc78e53SAndroid Build Coastguard Worker }
185*4dc78e53SAndroid Build Coastguard Worker 
186*4dc78e53SAndroid Build Coastguard Worker static const struct trans_tbl idiag_exts[] = {
187*4dc78e53SAndroid Build Coastguard Worker 	__ADD((1 << (INET_DIAG_MEMINFO - 1)), meminfo),
188*4dc78e53SAndroid Build Coastguard Worker 	__ADD((1 << (INET_DIAG_INFO - 1)), info),
189*4dc78e53SAndroid Build Coastguard Worker 	__ADD((1 << (INET_DIAG_VEGASINFO - 1)), vegasinfo),
190*4dc78e53SAndroid Build Coastguard Worker 	__ADD((1 << (INET_DIAG_CONG - 1)), congestion),
191*4dc78e53SAndroid Build Coastguard Worker 	__ADD((1 << (INET_DIAG_TOS - 1)), tos),
192*4dc78e53SAndroid Build Coastguard Worker 	__ADD((1 << (INET_DIAG_TCLASS - 1)), tclass),
193*4dc78e53SAndroid Build Coastguard Worker 	__ADD((1 << (INET_DIAG_SKMEMINFO - 1)), skmeminfo),
194*4dc78e53SAndroid Build Coastguard Worker 	__ADD((1 << (INET_DIAG_SHUTDOWN - 1)), shutdown),
195*4dc78e53SAndroid Build Coastguard Worker };
196*4dc78e53SAndroid Build Coastguard Worker 
197*4dc78e53SAndroid Build Coastguard Worker /**
198*4dc78e53SAndroid Build Coastguard Worker  * Convert inet diag extension flags to a string.
199*4dc78e53SAndroid Build Coastguard Worker  * @arg attrs	inet diag extension flags (e.g.
200*4dc78e53SAndroid Build Coastguard Worker  *   ( (1<<(INET_DIAG_MEMINFO-1)) | (1<<(INET_DIAG_CONG-1)) | (1<<(INET_DIAG_TOS-1)) ) )
201*4dc78e53SAndroid Build Coastguard Worker  * @arg buf	Output buffer to hold string representation
202*4dc78e53SAndroid Build Coastguard Worker  * @arg len	length in bytes of the output buffer
203*4dc78e53SAndroid Build Coastguard Worker  */
idiagnl_exts2str(uint8_t attrs,char * buf,size_t len)204*4dc78e53SAndroid Build Coastguard Worker char *idiagnl_exts2str(uint8_t attrs, char *buf, size_t len)
205*4dc78e53SAndroid Build Coastguard Worker {
206*4dc78e53SAndroid Build Coastguard Worker 	return __flags2str(attrs, buf, len, idiag_exts, ARRAY_SIZE(idiag_exts));
207*4dc78e53SAndroid Build Coastguard Worker }
208*4dc78e53SAndroid Build Coastguard Worker 
209*4dc78e53SAndroid Build Coastguard Worker static const struct trans_tbl idiagnl_tcpstates[] = {
210*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_CA_Open, open),
211*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_CA_Disorder, disorder),
212*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_CA_CWR, cwr),
213*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_CA_Recovery, recovery),
214*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCP_CA_Loss, loss),
215*4dc78e53SAndroid Build Coastguard Worker };
216*4dc78e53SAndroid Build Coastguard Worker 
217*4dc78e53SAndroid Build Coastguard Worker /**
218*4dc78e53SAndroid Build Coastguard Worker  * Convert inetdiag tcp states to strings.
219*4dc78e53SAndroid Build Coastguard Worker  * @arg state	TCP state (e.g., TCP_CA_Open)
220*4dc78e53SAndroid Build Coastguard Worker  * @arg buf	output buffer which will hold string result
221*4dc78e53SAndroid Build Coastguard Worker  * @arg len	length in bytes of the output buffer
222*4dc78e53SAndroid Build Coastguard Worker  */
idiagnl_tcpstate2str(uint8_t state,char * buf,size_t len)223*4dc78e53SAndroid Build Coastguard Worker char *idiagnl_tcpstate2str(uint8_t state, char *buf, size_t len)
224*4dc78e53SAndroid Build Coastguard Worker {
225*4dc78e53SAndroid Build Coastguard Worker 	return __type2str(state, buf, len, idiagnl_tcpstates,
226*4dc78e53SAndroid Build Coastguard Worker 			ARRAY_SIZE(idiagnl_tcpstates));
227*4dc78e53SAndroid Build Coastguard Worker }
228*4dc78e53SAndroid Build Coastguard Worker 
229*4dc78e53SAndroid Build Coastguard Worker static const struct trans_tbl idiagnl_tcpopt_attrs[] = {
230*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCPI_OPT_TIMESTAMPS, timestamps),
231*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCPI_OPT_SACK, sACK),
232*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCPI_OPT_WSCALE, wscale),
233*4dc78e53SAndroid Build Coastguard Worker 	__ADD(TCPI_OPT_ECN, ecn),
234*4dc78e53SAndroid Build Coastguard Worker };
235*4dc78e53SAndroid Build Coastguard Worker 
236*4dc78e53SAndroid Build Coastguard Worker /**
237*4dc78e53SAndroid Build Coastguard Worker  * Convert TCP option attributes to string
238*4dc78e53SAndroid Build Coastguard Worker  * @arg attrs	  TCP option attributes to convert (e.g., TCPI_OPT_SACK |
239*4dc78e53SAndroid Build Coastguard Worker  *  TCPI_OPT_WSCALE)
240*4dc78e53SAndroid Build Coastguard Worker  * @arg	buf	  Output buffer for string
241*4dc78e53SAndroid Build Coastguard Worker  * @arg len	  Length in bytes of output buffer
242*4dc78e53SAndroid Build Coastguard Worker  *
243*4dc78e53SAndroid Build Coastguard Worker  * @return buffer with string representation or empty string
244*4dc78e53SAndroid Build Coastguard Worker  */
idiagnl_tcpopts2str(uint8_t attrs,char * buf,size_t len)245*4dc78e53SAndroid Build Coastguard Worker char *idiagnl_tcpopts2str(uint8_t attrs, char *buf, size_t len)
246*4dc78e53SAndroid Build Coastguard Worker {
247*4dc78e53SAndroid Build Coastguard Worker 	return __flags2str(attrs, buf, len, idiagnl_tcpopt_attrs,
248*4dc78e53SAndroid Build Coastguard Worker 			ARRAY_SIZE(idiagnl_tcpopt_attrs));
249*4dc78e53SAndroid Build Coastguard Worker }
250*4dc78e53SAndroid Build Coastguard Worker 
251*4dc78e53SAndroid Build Coastguard Worker /**
252*4dc78e53SAndroid Build Coastguard Worker  * Convert shutdown state to string.
253*4dc78e53SAndroid Build Coastguard Worker  * @arg shutdown    Shutdown state (e.g., idiag_msg->shutdown)
254*4dc78e53SAndroid Build Coastguard Worker  * @arg buf	    Ouput buffer to hold string representation
255*4dc78e53SAndroid Build Coastguard Worker  * @arg len	    Length in bytes of output buffer
256*4dc78e53SAndroid Build Coastguard Worker  *
257*4dc78e53SAndroid Build Coastguard Worker  * @return string representation of shutdown state or NULL
258*4dc78e53SAndroid Build Coastguard Worker  */
idiagnl_shutdown2str(uint8_t shutdown,char * buf,size_t len)259*4dc78e53SAndroid Build Coastguard Worker char * idiagnl_shutdown2str(uint8_t shutdown, char *buf, size_t len)
260*4dc78e53SAndroid Build Coastguard Worker {
261*4dc78e53SAndroid Build Coastguard Worker 	if (shutdown == 0) {
262*4dc78e53SAndroid Build Coastguard Worker 		snprintf(buf, len, " ");
263*4dc78e53SAndroid Build Coastguard Worker 		return buf;
264*4dc78e53SAndroid Build Coastguard Worker 	} else if (shutdown == 1) {
265*4dc78e53SAndroid Build Coastguard Worker 		snprintf(buf, len, "receive shutdown");
266*4dc78e53SAndroid Build Coastguard Worker 		return buf;
267*4dc78e53SAndroid Build Coastguard Worker 	} else if (shutdown == 2) {
268*4dc78e53SAndroid Build Coastguard Worker 		snprintf(buf, len, "send shutdown");
269*4dc78e53SAndroid Build Coastguard Worker 		return buf;
270*4dc78e53SAndroid Build Coastguard Worker 	}
271*4dc78e53SAndroid Build Coastguard Worker 
272*4dc78e53SAndroid Build Coastguard Worker 	return NULL;
273*4dc78e53SAndroid Build Coastguard Worker }
274*4dc78e53SAndroid Build Coastguard Worker 
275*4dc78e53SAndroid Build Coastguard Worker /** @} */
276*4dc78e53SAndroid Build Coastguard Worker /** @} */
277