xref: /aosp_15_r20/external/ethtool/netlink/netlink.h (revision 1b481fc3bb1b45d4cf28d1ec12969dc1055f555d)
1*1b481fc3SMaciej Żenczykowski /*
2*1b481fc3SMaciej Żenczykowski  * netlink.h - common interface for all netlink code
3*1b481fc3SMaciej Żenczykowski  *
4*1b481fc3SMaciej Żenczykowski  * Declarations of data structures, global data and helpers for netlink code
5*1b481fc3SMaciej Żenczykowski  */
6*1b481fc3SMaciej Żenczykowski 
7*1b481fc3SMaciej Żenczykowski #ifndef ETHTOOL_NETLINK_INT_H__
8*1b481fc3SMaciej Żenczykowski #define ETHTOOL_NETLINK_INT_H__
9*1b481fc3SMaciej Żenczykowski 
10*1b481fc3SMaciej Żenczykowski #include <libmnl/libmnl.h>
11*1b481fc3SMaciej Żenczykowski #include <linux/netlink.h>
12*1b481fc3SMaciej Żenczykowski #include <linux/genetlink.h>
13*1b481fc3SMaciej Żenczykowski #include <linux/ethtool_netlink.h>
14*1b481fc3SMaciej Żenczykowski #include "nlsock.h"
15*1b481fc3SMaciej Żenczykowski 
16*1b481fc3SMaciej Żenczykowski #define WILDCARD_DEVNAME "*"
17*1b481fc3SMaciej Żenczykowski #define CMDMASK_WORDS DIV_ROUND_UP(__ETHTOOL_MSG_KERNEL_CNT, 32)
18*1b481fc3SMaciej Żenczykowski 
19*1b481fc3SMaciej Żenczykowski enum link_mode_class {
20*1b481fc3SMaciej Żenczykowski 	LM_CLASS_UNKNOWN,
21*1b481fc3SMaciej Żenczykowski 	LM_CLASS_REAL,
22*1b481fc3SMaciej Żenczykowski 	LM_CLASS_AUTONEG,
23*1b481fc3SMaciej Żenczykowski 	LM_CLASS_PORT,
24*1b481fc3SMaciej Żenczykowski 	LM_CLASS_PAUSE,
25*1b481fc3SMaciej Żenczykowski 	LM_CLASS_FEC,
26*1b481fc3SMaciej Żenczykowski };
27*1b481fc3SMaciej Żenczykowski 
28*1b481fc3SMaciej Żenczykowski struct nl_op_info {
29*1b481fc3SMaciej Żenczykowski 	uint32_t		op_flags;
30*1b481fc3SMaciej Żenczykowski 	uint32_t		hdr_flags;
31*1b481fc3SMaciej Żenczykowski 	uint8_t			hdr_policy_loaded:1;
32*1b481fc3SMaciej Żenczykowski };
33*1b481fc3SMaciej Żenczykowski 
34*1b481fc3SMaciej Żenczykowski struct nl_context {
35*1b481fc3SMaciej Żenczykowski 	struct cmd_context	*ctx;
36*1b481fc3SMaciej Żenczykowski 	void			*cmd_private;
37*1b481fc3SMaciej Żenczykowski 	const char		*devname;
38*1b481fc3SMaciej Żenczykowski 	bool			is_dump;
39*1b481fc3SMaciej Żenczykowski 	int			exit_code;
40*1b481fc3SMaciej Żenczykowski 	unsigned int		suppress_nlerr;
41*1b481fc3SMaciej Żenczykowski 	uint16_t		ethnl_fam;
42*1b481fc3SMaciej Żenczykowski 	uint32_t		ethnl_mongrp;
43*1b481fc3SMaciej Żenczykowski 	struct nl_op_info	*ops_info;
44*1b481fc3SMaciej Żenczykowski 	struct nl_socket	*ethnl_socket;
45*1b481fc3SMaciej Żenczykowski 	struct nl_socket	*ethnl2_socket;
46*1b481fc3SMaciej Żenczykowski 	struct nl_socket	*rtnl_socket;
47*1b481fc3SMaciej Żenczykowski 	bool			is_monitor;
48*1b481fc3SMaciej Żenczykowski 	uint32_t		filter_cmds[CMDMASK_WORDS];
49*1b481fc3SMaciej Żenczykowski 	const char		*filter_devname;
50*1b481fc3SMaciej Żenczykowski 	bool			no_banner;
51*1b481fc3SMaciej Żenczykowski 	const char		*cmd;
52*1b481fc3SMaciej Żenczykowski 	const char		*param;
53*1b481fc3SMaciej Żenczykowski 	char			**argp;
54*1b481fc3SMaciej Żenczykowski 	unsigned int		argc;
55*1b481fc3SMaciej Żenczykowski 	bool			ioctl_fallback;
56*1b481fc3SMaciej Żenczykowski 	bool			wildcard_unsupported;
57*1b481fc3SMaciej Żenczykowski };
58*1b481fc3SMaciej Żenczykowski 
59*1b481fc3SMaciej Żenczykowski struct attr_tb_info {
60*1b481fc3SMaciej Żenczykowski 	const struct nlattr **tb;
61*1b481fc3SMaciej Żenczykowski 	unsigned int max_type;
62*1b481fc3SMaciej Żenczykowski };
63*1b481fc3SMaciej Żenczykowski 
64*1b481fc3SMaciej Żenczykowski #define DECLARE_ATTR_TB_INFO(tbl) \
65*1b481fc3SMaciej Żenczykowski 	struct attr_tb_info tbl ## _info = { (tbl), (MNL_ARRAY_SIZE(tbl) - 1) }
66*1b481fc3SMaciej Żenczykowski 
67*1b481fc3SMaciej Żenczykowski int nomsg_reply_cb(const struct nlmsghdr *nlhdr, void *data);
68*1b481fc3SMaciej Żenczykowski int attr_cb(const struct nlattr *attr, void *data);
69*1b481fc3SMaciej Żenczykowski 
70*1b481fc3SMaciej Żenczykowski int netlink_init(struct cmd_context *ctx);
71*1b481fc3SMaciej Żenczykowski bool netlink_cmd_check(struct cmd_context *ctx, unsigned int cmd,
72*1b481fc3SMaciej Żenczykowski 		       bool allow_wildcard);
73*1b481fc3SMaciej Żenczykowski const char *get_dev_name(const struct nlattr *nest);
74*1b481fc3SMaciej Żenczykowski int get_dev_info(const struct nlattr *nest, int *ifindex, char *ifname);
75*1b481fc3SMaciej Żenczykowski u32 get_stats_flag(struct nl_context *nlctx, unsigned int nlcmd,
76*1b481fc3SMaciej Żenczykowski 		   unsigned int hdrattr);
77*1b481fc3SMaciej Żenczykowski 
78*1b481fc3SMaciej Żenczykowski int linkmodes_reply_cb(const struct nlmsghdr *nlhdr, void *data);
79*1b481fc3SMaciej Żenczykowski int linkinfo_reply_cb(const struct nlmsghdr *nlhdr, void *data);
80*1b481fc3SMaciej Żenczykowski int wol_reply_cb(const struct nlmsghdr *nlhdr, void *data);
81*1b481fc3SMaciej Żenczykowski int debug_reply_cb(const struct nlmsghdr *nlhdr, void *data);
82*1b481fc3SMaciej Żenczykowski int features_reply_cb(const struct nlmsghdr *nlhdr, void *data);
83*1b481fc3SMaciej Żenczykowski int privflags_reply_cb(const struct nlmsghdr *nlhdr, void *data);
84*1b481fc3SMaciej Żenczykowski int rings_reply_cb(const struct nlmsghdr *nlhdr, void *data);
85*1b481fc3SMaciej Żenczykowski int channels_reply_cb(const struct nlmsghdr *nlhdr, void *data);
86*1b481fc3SMaciej Żenczykowski int coalesce_reply_cb(const struct nlmsghdr *nlhdr, void *data);
87*1b481fc3SMaciej Żenczykowski int pause_reply_cb(const struct nlmsghdr *nlhdr, void *data);
88*1b481fc3SMaciej Żenczykowski int eee_reply_cb(const struct nlmsghdr *nlhdr, void *data);
89*1b481fc3SMaciej Żenczykowski int cable_test_reply_cb(const struct nlmsghdr *nlhdr, void *data);
90*1b481fc3SMaciej Żenczykowski int cable_test_ntf_cb(const struct nlmsghdr *nlhdr, void *data);
91*1b481fc3SMaciej Żenczykowski int cable_test_tdr_reply_cb(const struct nlmsghdr *nlhdr, void *data);
92*1b481fc3SMaciej Żenczykowski int cable_test_tdr_ntf_cb(const struct nlmsghdr *nlhdr, void *data);
93*1b481fc3SMaciej Żenczykowski int fec_reply_cb(const struct nlmsghdr *nlhdr, void *data);
94*1b481fc3SMaciej Żenczykowski int module_reply_cb(const struct nlmsghdr *nlhdr, void *data);
95*1b481fc3SMaciej Żenczykowski 
96*1b481fc3SMaciej Żenczykowski /* dump helpers */
97*1b481fc3SMaciej Żenczykowski 
98*1b481fc3SMaciej Żenczykowski int dump_link_modes(struct nl_context *nlctx, const struct nlattr *bitset,
99*1b481fc3SMaciej Żenczykowski 		    bool mask, unsigned int class, const char *before,
100*1b481fc3SMaciej Żenczykowski 		    const char *between, const char *after,
101*1b481fc3SMaciej Żenczykowski 		    const char *if_none);
102*1b481fc3SMaciej Żenczykowski 
show_u32(const char * key,const char * fmt,const struct nlattr * attr)103*1b481fc3SMaciej Żenczykowski static inline void show_u32(const char *key,
104*1b481fc3SMaciej Żenczykowski 			    const char *fmt,
105*1b481fc3SMaciej Żenczykowski 			    const struct nlattr *attr)
106*1b481fc3SMaciej Żenczykowski {
107*1b481fc3SMaciej Żenczykowski 	if (is_json_context()) {
108*1b481fc3SMaciej Żenczykowski 		if (attr)
109*1b481fc3SMaciej Żenczykowski 			print_uint(PRINT_JSON, key, NULL,
110*1b481fc3SMaciej Żenczykowski 				   mnl_attr_get_u32(attr));
111*1b481fc3SMaciej Żenczykowski 	} else {
112*1b481fc3SMaciej Żenczykowski 		if (attr)
113*1b481fc3SMaciej Żenczykowski 			printf("%s%u\n", fmt, mnl_attr_get_u32(attr));
114*1b481fc3SMaciej Żenczykowski 		else
115*1b481fc3SMaciej Żenczykowski 			printf("%sn/a\n", fmt);
116*1b481fc3SMaciej Żenczykowski 	}
117*1b481fc3SMaciej Żenczykowski }
118*1b481fc3SMaciej Żenczykowski 
u8_to_bool(const uint8_t * val)119*1b481fc3SMaciej Żenczykowski static inline const char *u8_to_bool(const uint8_t *val)
120*1b481fc3SMaciej Żenczykowski {
121*1b481fc3SMaciej Żenczykowski 	if (val)
122*1b481fc3SMaciej Żenczykowski 		return *val ? "on" : "off";
123*1b481fc3SMaciej Żenczykowski 	else
124*1b481fc3SMaciej Żenczykowski 		return "n/a";
125*1b481fc3SMaciej Żenczykowski }
126*1b481fc3SMaciej Żenczykowski 
show_bool_val(const char * key,const char * fmt,uint8_t * val)127*1b481fc3SMaciej Żenczykowski static inline void show_bool_val(const char *key, const char *fmt, uint8_t *val)
128*1b481fc3SMaciej Żenczykowski {
129*1b481fc3SMaciej Żenczykowski 	if (is_json_context()) {
130*1b481fc3SMaciej Żenczykowski 		if (val)
131*1b481fc3SMaciej Żenczykowski 			print_bool(PRINT_JSON, key, NULL, *val);
132*1b481fc3SMaciej Żenczykowski 	} else {
133*1b481fc3SMaciej Żenczykowski 		print_string(PRINT_FP, NULL, fmt, u8_to_bool(val));
134*1b481fc3SMaciej Żenczykowski 	}
135*1b481fc3SMaciej Żenczykowski }
136*1b481fc3SMaciej Żenczykowski 
show_bool(const char * key,const char * fmt,const struct nlattr * attr)137*1b481fc3SMaciej Żenczykowski static inline void show_bool(const char *key, const char *fmt,
138*1b481fc3SMaciej Żenczykowski 			     const struct nlattr *attr)
139*1b481fc3SMaciej Żenczykowski {
140*1b481fc3SMaciej Żenczykowski 	show_bool_val(key, fmt, attr ? mnl_attr_get_payload(attr) : NULL);
141*1b481fc3SMaciej Żenczykowski }
142*1b481fc3SMaciej Żenczykowski 
show_cr(void)143*1b481fc3SMaciej Żenczykowski static inline void show_cr(void)
144*1b481fc3SMaciej Żenczykowski {
145*1b481fc3SMaciej Żenczykowski 	if (!is_json_context())
146*1b481fc3SMaciej Żenczykowski 		putchar('\n');
147*1b481fc3SMaciej Żenczykowski }
148*1b481fc3SMaciej Żenczykowski 
149*1b481fc3SMaciej Żenczykowski /* misc */
150*1b481fc3SMaciej Żenczykowski 
copy_devname(char * dst,const char * src)151*1b481fc3SMaciej Żenczykowski static inline void copy_devname(char *dst, const char *src)
152*1b481fc3SMaciej Żenczykowski {
153*1b481fc3SMaciej Żenczykowski 	strncpy(dst, src, ALTIFNAMSIZ);
154*1b481fc3SMaciej Żenczykowski 	dst[ALTIFNAMSIZ - 1] = '\0';
155*1b481fc3SMaciej Żenczykowski }
156*1b481fc3SMaciej Żenczykowski 
dev_ok(const struct nl_context * nlctx)157*1b481fc3SMaciej Żenczykowski static inline bool dev_ok(const struct nl_context *nlctx)
158*1b481fc3SMaciej Żenczykowski {
159*1b481fc3SMaciej Żenczykowski 	return !nlctx->filter_devname ||
160*1b481fc3SMaciej Żenczykowski 	       (nlctx->devname &&
161*1b481fc3SMaciej Żenczykowski 		!strcmp(nlctx->devname, nlctx->filter_devname));
162*1b481fc3SMaciej Żenczykowski }
163*1b481fc3SMaciej Żenczykowski 
netlink_init_ethnl2_socket(struct nl_context * nlctx)164*1b481fc3SMaciej Żenczykowski static inline int netlink_init_ethnl2_socket(struct nl_context *nlctx)
165*1b481fc3SMaciej Żenczykowski {
166*1b481fc3SMaciej Żenczykowski 	if (nlctx->ethnl2_socket)
167*1b481fc3SMaciej Żenczykowski 		return 0;
168*1b481fc3SMaciej Żenczykowski 	return nlsock_init(nlctx, &nlctx->ethnl2_socket, NETLINK_GENERIC);
169*1b481fc3SMaciej Żenczykowski }
170*1b481fc3SMaciej Żenczykowski 
netlink_init_rtnl_socket(struct nl_context * nlctx)171*1b481fc3SMaciej Żenczykowski static inline int netlink_init_rtnl_socket(struct nl_context *nlctx)
172*1b481fc3SMaciej Żenczykowski {
173*1b481fc3SMaciej Żenczykowski 	if (nlctx->rtnl_socket)
174*1b481fc3SMaciej Żenczykowski 		return 0;
175*1b481fc3SMaciej Żenczykowski 	return nlsock_init(nlctx, &nlctx->rtnl_socket, NETLINK_ROUTE);
176*1b481fc3SMaciej Żenczykowski }
177*1b481fc3SMaciej Żenczykowski 
178*1b481fc3SMaciej Żenczykowski #endif /* ETHTOOL_NETLINK_INT_H__ */
179