12d7be507SJakub Kicinski /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
22d7be507SJakub Kicinski /* Do not edit directly, auto-generated from: */
32d7be507SJakub Kicinski /*	Documentation/netlink/specs/ethtool.yaml */
42d7be507SJakub Kicinski /* YNL-GEN user header */
52d7be507SJakub Kicinski /* YNL-ARG --user-header linux/ethtool_netlink.h --exclude-op stats-get */
62d7be507SJakub Kicinski 
72d7be507SJakub Kicinski #ifndef _LINUX_ETHTOOL_GEN_H
82d7be507SJakub Kicinski #define _LINUX_ETHTOOL_GEN_H
92d7be507SJakub Kicinski 
102d7be507SJakub Kicinski #include <stdlib.h>
112d7be507SJakub Kicinski #include <string.h>
122d7be507SJakub Kicinski #include <linux/types.h>
132d7be507SJakub Kicinski #include <linux/ethtool.h>
142d7be507SJakub Kicinski 
152d7be507SJakub Kicinski struct ynl_sock;
162d7be507SJakub Kicinski 
172d7be507SJakub Kicinski extern const struct ynl_family ynl_ethtool_family;
182d7be507SJakub Kicinski 
192d7be507SJakub Kicinski /* Enums */
202d7be507SJakub Kicinski const char *ethtool_op_str(int op);
212d7be507SJakub Kicinski const char *ethtool_udp_tunnel_type_str(int value);
222d7be507SJakub Kicinski const char *ethtool_stringset_str(enum ethtool_stringset value);
232d7be507SJakub Kicinski 
242d7be507SJakub Kicinski /* Common nested types */
252d7be507SJakub Kicinski struct ethtool_header {
262d7be507SJakub Kicinski 	struct {
272d7be507SJakub Kicinski 		__u32 dev_index:1;
282d7be507SJakub Kicinski 		__u32 dev_name_len;
292d7be507SJakub Kicinski 		__u32 flags:1;
302d7be507SJakub Kicinski 	} _present;
312d7be507SJakub Kicinski 
322d7be507SJakub Kicinski 	__u32 dev_index;
332d7be507SJakub Kicinski 	char *dev_name;
342d7be507SJakub Kicinski 	__u32 flags;
352d7be507SJakub Kicinski };
362d7be507SJakub Kicinski 
372d7be507SJakub Kicinski struct ethtool_pause_stat {
382d7be507SJakub Kicinski 	struct {
392d7be507SJakub Kicinski 		__u32 tx_frames:1;
402d7be507SJakub Kicinski 		__u32 rx_frames:1;
412d7be507SJakub Kicinski 	} _present;
422d7be507SJakub Kicinski 
432d7be507SJakub Kicinski 	__u64 tx_frames;
442d7be507SJakub Kicinski 	__u64 rx_frames;
452d7be507SJakub Kicinski };
462d7be507SJakub Kicinski 
472d7be507SJakub Kicinski struct ethtool_cable_test_tdr_cfg {
482d7be507SJakub Kicinski 	struct {
492d7be507SJakub Kicinski 		__u32 first:1;
502d7be507SJakub Kicinski 		__u32 last:1;
512d7be507SJakub Kicinski 		__u32 step:1;
522d7be507SJakub Kicinski 		__u32 pair:1;
532d7be507SJakub Kicinski 	} _present;
542d7be507SJakub Kicinski 
552d7be507SJakub Kicinski 	__u32 first;
562d7be507SJakub Kicinski 	__u32 last;
572d7be507SJakub Kicinski 	__u32 step;
582d7be507SJakub Kicinski 	__u8 pair;
592d7be507SJakub Kicinski };
602d7be507SJakub Kicinski 
612d7be507SJakub Kicinski struct ethtool_fec_stat {
622d7be507SJakub Kicinski 	struct {
632d7be507SJakub Kicinski 		__u32 corrected_len;
642d7be507SJakub Kicinski 		__u32 uncorr_len;
652d7be507SJakub Kicinski 		__u32 corr_bits_len;
662d7be507SJakub Kicinski 	} _present;
672d7be507SJakub Kicinski 
682d7be507SJakub Kicinski 	void *corrected;
692d7be507SJakub Kicinski 	void *uncorr;
702d7be507SJakub Kicinski 	void *corr_bits;
712d7be507SJakub Kicinski };
722d7be507SJakub Kicinski 
732d7be507SJakub Kicinski struct ethtool_mm_stat {
742d7be507SJakub Kicinski 	struct {
752d7be507SJakub Kicinski 		__u32 reassembly_errors:1;
762d7be507SJakub Kicinski 		__u32 smd_errors:1;
772d7be507SJakub Kicinski 		__u32 reassembly_ok:1;
782d7be507SJakub Kicinski 		__u32 rx_frag_count:1;
792d7be507SJakub Kicinski 		__u32 tx_frag_count:1;
802d7be507SJakub Kicinski 		__u32 hold_count:1;
812d7be507SJakub Kicinski 	} _present;
822d7be507SJakub Kicinski 
832d7be507SJakub Kicinski 	__u64 reassembly_errors;
842d7be507SJakub Kicinski 	__u64 smd_errors;
852d7be507SJakub Kicinski 	__u64 reassembly_ok;
862d7be507SJakub Kicinski 	__u64 rx_frag_count;
872d7be507SJakub Kicinski 	__u64 tx_frag_count;
882d7be507SJakub Kicinski 	__u64 hold_count;
892d7be507SJakub Kicinski };
902d7be507SJakub Kicinski 
912d7be507SJakub Kicinski struct ethtool_cable_result {
922d7be507SJakub Kicinski 	struct {
932d7be507SJakub Kicinski 		__u32 pair:1;
942d7be507SJakub Kicinski 		__u32 code:1;
952d7be507SJakub Kicinski 	} _present;
962d7be507SJakub Kicinski 
972d7be507SJakub Kicinski 	__u8 pair;
982d7be507SJakub Kicinski 	__u8 code;
992d7be507SJakub Kicinski };
1002d7be507SJakub Kicinski 
1012d7be507SJakub Kicinski struct ethtool_cable_fault_length {
1022d7be507SJakub Kicinski 	struct {
1032d7be507SJakub Kicinski 		__u32 pair:1;
1042d7be507SJakub Kicinski 		__u32 cm:1;
1052d7be507SJakub Kicinski 	} _present;
1062d7be507SJakub Kicinski 
1072d7be507SJakub Kicinski 	__u8 pair;
1082d7be507SJakub Kicinski 	__u32 cm;
1092d7be507SJakub Kicinski };
1102d7be507SJakub Kicinski 
1112d7be507SJakub Kicinski struct ethtool_bitset_bit {
1122d7be507SJakub Kicinski 	struct {
1132d7be507SJakub Kicinski 		__u32 index:1;
1142d7be507SJakub Kicinski 		__u32 name_len;
1152d7be507SJakub Kicinski 		__u32 value:1;
1162d7be507SJakub Kicinski 	} _present;
1172d7be507SJakub Kicinski 
1182d7be507SJakub Kicinski 	__u32 index;
1192d7be507SJakub Kicinski 	char *name;
1202d7be507SJakub Kicinski };
1212d7be507SJakub Kicinski 
1222d7be507SJakub Kicinski struct ethtool_tunnel_udp_entry {
1232d7be507SJakub Kicinski 	struct {
1242d7be507SJakub Kicinski 		__u32 port:1;
1252d7be507SJakub Kicinski 		__u32 type:1;
1262d7be507SJakub Kicinski 	} _present;
1272d7be507SJakub Kicinski 
1282d7be507SJakub Kicinski 	__u16 port /* big-endian */;
1292d7be507SJakub Kicinski 	__u32 type;
1302d7be507SJakub Kicinski };
1312d7be507SJakub Kicinski 
1322d7be507SJakub Kicinski struct ethtool_string {
1332d7be507SJakub Kicinski 	struct {
1342d7be507SJakub Kicinski 		__u32 index:1;
1352d7be507SJakub Kicinski 		__u32 value_len;
1362d7be507SJakub Kicinski 	} _present;
1372d7be507SJakub Kicinski 
1382d7be507SJakub Kicinski 	__u32 index;
1392d7be507SJakub Kicinski 	char *value;
1402d7be507SJakub Kicinski };
1412d7be507SJakub Kicinski 
1422d7be507SJakub Kicinski struct ethtool_cable_nest {
1432d7be507SJakub Kicinski 	struct {
1442d7be507SJakub Kicinski 		__u32 result:1;
1452d7be507SJakub Kicinski 		__u32 fault_length:1;
1462d7be507SJakub Kicinski 	} _present;
1472d7be507SJakub Kicinski 
1482d7be507SJakub Kicinski 	struct ethtool_cable_result result;
1492d7be507SJakub Kicinski 	struct ethtool_cable_fault_length fault_length;
1502d7be507SJakub Kicinski };
1512d7be507SJakub Kicinski 
1522d7be507SJakub Kicinski struct ethtool_bitset_bits {
1532d7be507SJakub Kicinski 	unsigned int n_bit;
1542d7be507SJakub Kicinski 	struct ethtool_bitset_bit *bit;
1552d7be507SJakub Kicinski };
1562d7be507SJakub Kicinski 
1572d7be507SJakub Kicinski struct ethtool_strings {
1582d7be507SJakub Kicinski 	unsigned int n_string;
1592d7be507SJakub Kicinski 	struct ethtool_string *string;
1602d7be507SJakub Kicinski };
1612d7be507SJakub Kicinski 
1622d7be507SJakub Kicinski struct ethtool_bitset {
1632d7be507SJakub Kicinski 	struct {
1642d7be507SJakub Kicinski 		__u32 nomask:1;
1652d7be507SJakub Kicinski 		__u32 size:1;
1662d7be507SJakub Kicinski 		__u32 bits:1;
1672d7be507SJakub Kicinski 	} _present;
1682d7be507SJakub Kicinski 
1692d7be507SJakub Kicinski 	__u32 size;
1702d7be507SJakub Kicinski 	struct ethtool_bitset_bits bits;
1712d7be507SJakub Kicinski };
1722d7be507SJakub Kicinski 
1732d7be507SJakub Kicinski struct ethtool_stringset_ {
1742d7be507SJakub Kicinski 	struct {
1752d7be507SJakub Kicinski 		__u32 id:1;
1762d7be507SJakub Kicinski 		__u32 count:1;
1772d7be507SJakub Kicinski 	} _present;
1782d7be507SJakub Kicinski 
1792d7be507SJakub Kicinski 	__u32 id;
1802d7be507SJakub Kicinski 	__u32 count;
1812d7be507SJakub Kicinski 	unsigned int n_strings;
1822d7be507SJakub Kicinski 	struct ethtool_strings *strings;
1832d7be507SJakub Kicinski };
1842d7be507SJakub Kicinski 
1852d7be507SJakub Kicinski struct ethtool_tunnel_udp_table {
1862d7be507SJakub Kicinski 	struct {
1872d7be507SJakub Kicinski 		__u32 size:1;
1882d7be507SJakub Kicinski 		__u32 types:1;
1892d7be507SJakub Kicinski 	} _present;
1902d7be507SJakub Kicinski 
1912d7be507SJakub Kicinski 	__u32 size;
1922d7be507SJakub Kicinski 	struct ethtool_bitset types;
1932d7be507SJakub Kicinski 	unsigned int n_entry;
1942d7be507SJakub Kicinski 	struct ethtool_tunnel_udp_entry *entry;
1952d7be507SJakub Kicinski };
1962d7be507SJakub Kicinski 
1972d7be507SJakub Kicinski struct ethtool_stringsets {
1982d7be507SJakub Kicinski 	unsigned int n_stringset;
1992d7be507SJakub Kicinski 	struct ethtool_stringset_ *stringset;
2002d7be507SJakub Kicinski };
2012d7be507SJakub Kicinski 
2022d7be507SJakub Kicinski struct ethtool_tunnel_udp {
2032d7be507SJakub Kicinski 	struct {
2042d7be507SJakub Kicinski 		__u32 table:1;
2052d7be507SJakub Kicinski 	} _present;
2062d7be507SJakub Kicinski 
2072d7be507SJakub Kicinski 	struct ethtool_tunnel_udp_table table;
2082d7be507SJakub Kicinski };
2092d7be507SJakub Kicinski 
2102d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_STRSET_GET ============== */
2112d7be507SJakub Kicinski /* ETHTOOL_MSG_STRSET_GET - do */
2122d7be507SJakub Kicinski struct ethtool_strset_get_req {
2132d7be507SJakub Kicinski 	struct {
2142d7be507SJakub Kicinski 		__u32 header:1;
2152d7be507SJakub Kicinski 		__u32 stringsets:1;
2162d7be507SJakub Kicinski 		__u32 counts_only:1;
2172d7be507SJakub Kicinski 	} _present;
2182d7be507SJakub Kicinski 
2192d7be507SJakub Kicinski 	struct ethtool_header header;
2202d7be507SJakub Kicinski 	struct ethtool_stringsets stringsets;
2212d7be507SJakub Kicinski };
2222d7be507SJakub Kicinski 
ethtool_strset_get_req_alloc(void)2232d7be507SJakub Kicinski static inline struct ethtool_strset_get_req *ethtool_strset_get_req_alloc(void)
2242d7be507SJakub Kicinski {
2252d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_strset_get_req));
2262d7be507SJakub Kicinski }
2272d7be507SJakub Kicinski void ethtool_strset_get_req_free(struct ethtool_strset_get_req *req);
2282d7be507SJakub Kicinski 
2292d7be507SJakub Kicinski static inline void
ethtool_strset_get_req_set_header_dev_index(struct ethtool_strset_get_req * req,__u32 dev_index)2302d7be507SJakub Kicinski ethtool_strset_get_req_set_header_dev_index(struct ethtool_strset_get_req *req,
2312d7be507SJakub Kicinski 					    __u32 dev_index)
2322d7be507SJakub Kicinski {
2332d7be507SJakub Kicinski 	req->_present.header = 1;
2342d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
2352d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
2362d7be507SJakub Kicinski }
2372d7be507SJakub Kicinski static inline void
ethtool_strset_get_req_set_header_dev_name(struct ethtool_strset_get_req * req,const char * dev_name)2382d7be507SJakub Kicinski ethtool_strset_get_req_set_header_dev_name(struct ethtool_strset_get_req *req,
2392d7be507SJakub Kicinski 					   const char *dev_name)
2402d7be507SJakub Kicinski {
2412d7be507SJakub Kicinski 	free(req->header.dev_name);
2422d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
2432d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
2442d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
2452d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
2462d7be507SJakub Kicinski }
2472d7be507SJakub Kicinski static inline void
ethtool_strset_get_req_set_header_flags(struct ethtool_strset_get_req * req,__u32 flags)2482d7be507SJakub Kicinski ethtool_strset_get_req_set_header_flags(struct ethtool_strset_get_req *req,
2492d7be507SJakub Kicinski 					__u32 flags)
2502d7be507SJakub Kicinski {
2512d7be507SJakub Kicinski 	req->_present.header = 1;
2522d7be507SJakub Kicinski 	req->header._present.flags = 1;
2532d7be507SJakub Kicinski 	req->header.flags = flags;
2542d7be507SJakub Kicinski }
2552d7be507SJakub Kicinski static inline void
__ethtool_strset_get_req_set_stringsets_stringset(struct ethtool_strset_get_req * req,struct ethtool_stringset_ * stringset,unsigned int n_stringset)2562d7be507SJakub Kicinski __ethtool_strset_get_req_set_stringsets_stringset(struct ethtool_strset_get_req *req,
2572d7be507SJakub Kicinski 						  struct ethtool_stringset_ *stringset,
2582d7be507SJakub Kicinski 						  unsigned int n_stringset)
2592d7be507SJakub Kicinski {
2602d7be507SJakub Kicinski 	free(req->stringsets.stringset);
2612d7be507SJakub Kicinski 	req->stringsets.stringset = stringset;
2622d7be507SJakub Kicinski 	req->stringsets.n_stringset = n_stringset;
2632d7be507SJakub Kicinski }
2642d7be507SJakub Kicinski static inline void
ethtool_strset_get_req_set_counts_only(struct ethtool_strset_get_req * req)2652d7be507SJakub Kicinski ethtool_strset_get_req_set_counts_only(struct ethtool_strset_get_req *req)
2662d7be507SJakub Kicinski {
2672d7be507SJakub Kicinski 	req->_present.counts_only = 1;
2682d7be507SJakub Kicinski }
2692d7be507SJakub Kicinski 
2702d7be507SJakub Kicinski struct ethtool_strset_get_rsp {
2712d7be507SJakub Kicinski 	struct {
2722d7be507SJakub Kicinski 		__u32 header:1;
2732d7be507SJakub Kicinski 		__u32 stringsets:1;
2742d7be507SJakub Kicinski 	} _present;
2752d7be507SJakub Kicinski 
2762d7be507SJakub Kicinski 	struct ethtool_header header;
2772d7be507SJakub Kicinski 	struct ethtool_stringsets stringsets;
2782d7be507SJakub Kicinski };
2792d7be507SJakub Kicinski 
2802d7be507SJakub Kicinski void ethtool_strset_get_rsp_free(struct ethtool_strset_get_rsp *rsp);
2812d7be507SJakub Kicinski 
2822d7be507SJakub Kicinski /*
2832d7be507SJakub Kicinski  * Get string set from the kernel.
2842d7be507SJakub Kicinski  */
2852d7be507SJakub Kicinski struct ethtool_strset_get_rsp *
2862d7be507SJakub Kicinski ethtool_strset_get(struct ynl_sock *ys, struct ethtool_strset_get_req *req);
2872d7be507SJakub Kicinski 
2882d7be507SJakub Kicinski /* ETHTOOL_MSG_STRSET_GET - dump */
2892d7be507SJakub Kicinski struct ethtool_strset_get_req_dump {
2902d7be507SJakub Kicinski 	struct {
2912d7be507SJakub Kicinski 		__u32 header:1;
2922d7be507SJakub Kicinski 		__u32 stringsets:1;
2932d7be507SJakub Kicinski 		__u32 counts_only:1;
2942d7be507SJakub Kicinski 	} _present;
2952d7be507SJakub Kicinski 
2962d7be507SJakub Kicinski 	struct ethtool_header header;
2972d7be507SJakub Kicinski 	struct ethtool_stringsets stringsets;
2982d7be507SJakub Kicinski };
2992d7be507SJakub Kicinski 
3002d7be507SJakub Kicinski static inline struct ethtool_strset_get_req_dump *
ethtool_strset_get_req_dump_alloc(void)3012d7be507SJakub Kicinski ethtool_strset_get_req_dump_alloc(void)
3022d7be507SJakub Kicinski {
3032d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_strset_get_req_dump));
3042d7be507SJakub Kicinski }
3052d7be507SJakub Kicinski void ethtool_strset_get_req_dump_free(struct ethtool_strset_get_req_dump *req);
3062d7be507SJakub Kicinski 
3072d7be507SJakub Kicinski static inline void
ethtool_strset_get_req_dump_set_header_dev_index(struct ethtool_strset_get_req_dump * req,__u32 dev_index)3082d7be507SJakub Kicinski ethtool_strset_get_req_dump_set_header_dev_index(struct ethtool_strset_get_req_dump *req,
3092d7be507SJakub Kicinski 						 __u32 dev_index)
3102d7be507SJakub Kicinski {
3112d7be507SJakub Kicinski 	req->_present.header = 1;
3122d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
3132d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
3142d7be507SJakub Kicinski }
3152d7be507SJakub Kicinski static inline void
ethtool_strset_get_req_dump_set_header_dev_name(struct ethtool_strset_get_req_dump * req,const char * dev_name)3162d7be507SJakub Kicinski ethtool_strset_get_req_dump_set_header_dev_name(struct ethtool_strset_get_req_dump *req,
3172d7be507SJakub Kicinski 						const char *dev_name)
3182d7be507SJakub Kicinski {
3192d7be507SJakub Kicinski 	free(req->header.dev_name);
3202d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
3212d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
3222d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
3232d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
3242d7be507SJakub Kicinski }
3252d7be507SJakub Kicinski static inline void
ethtool_strset_get_req_dump_set_header_flags(struct ethtool_strset_get_req_dump * req,__u32 flags)3262d7be507SJakub Kicinski ethtool_strset_get_req_dump_set_header_flags(struct ethtool_strset_get_req_dump *req,
3272d7be507SJakub Kicinski 					     __u32 flags)
3282d7be507SJakub Kicinski {
3292d7be507SJakub Kicinski 	req->_present.header = 1;
3302d7be507SJakub Kicinski 	req->header._present.flags = 1;
3312d7be507SJakub Kicinski 	req->header.flags = flags;
3322d7be507SJakub Kicinski }
3332d7be507SJakub Kicinski static inline void
__ethtool_strset_get_req_dump_set_stringsets_stringset(struct ethtool_strset_get_req_dump * req,struct ethtool_stringset_ * stringset,unsigned int n_stringset)3342d7be507SJakub Kicinski __ethtool_strset_get_req_dump_set_stringsets_stringset(struct ethtool_strset_get_req_dump *req,
3352d7be507SJakub Kicinski 						       struct ethtool_stringset_ *stringset,
3362d7be507SJakub Kicinski 						       unsigned int n_stringset)
3372d7be507SJakub Kicinski {
3382d7be507SJakub Kicinski 	free(req->stringsets.stringset);
3392d7be507SJakub Kicinski 	req->stringsets.stringset = stringset;
3402d7be507SJakub Kicinski 	req->stringsets.n_stringset = n_stringset;
3412d7be507SJakub Kicinski }
3422d7be507SJakub Kicinski static inline void
ethtool_strset_get_req_dump_set_counts_only(struct ethtool_strset_get_req_dump * req)3432d7be507SJakub Kicinski ethtool_strset_get_req_dump_set_counts_only(struct ethtool_strset_get_req_dump *req)
3442d7be507SJakub Kicinski {
3452d7be507SJakub Kicinski 	req->_present.counts_only = 1;
3462d7be507SJakub Kicinski }
3472d7be507SJakub Kicinski 
3482d7be507SJakub Kicinski struct ethtool_strset_get_list {
3492d7be507SJakub Kicinski 	struct ethtool_strset_get_list *next;
3502d7be507SJakub Kicinski 	struct ethtool_strset_get_rsp obj __attribute__ ((aligned (8)));
3512d7be507SJakub Kicinski };
3522d7be507SJakub Kicinski 
3532d7be507SJakub Kicinski void ethtool_strset_get_list_free(struct ethtool_strset_get_list *rsp);
3542d7be507SJakub Kicinski 
3552d7be507SJakub Kicinski struct ethtool_strset_get_list *
3562d7be507SJakub Kicinski ethtool_strset_get_dump(struct ynl_sock *ys,
3572d7be507SJakub Kicinski 			struct ethtool_strset_get_req_dump *req);
3582d7be507SJakub Kicinski 
3592d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_LINKINFO_GET ============== */
3602d7be507SJakub Kicinski /* ETHTOOL_MSG_LINKINFO_GET - do */
3612d7be507SJakub Kicinski struct ethtool_linkinfo_get_req {
3622d7be507SJakub Kicinski 	struct {
3632d7be507SJakub Kicinski 		__u32 header:1;
3642d7be507SJakub Kicinski 	} _present;
3652d7be507SJakub Kicinski 
3662d7be507SJakub Kicinski 	struct ethtool_header header;
3672d7be507SJakub Kicinski };
3682d7be507SJakub Kicinski 
3692d7be507SJakub Kicinski static inline struct ethtool_linkinfo_get_req *
ethtool_linkinfo_get_req_alloc(void)3702d7be507SJakub Kicinski ethtool_linkinfo_get_req_alloc(void)
3712d7be507SJakub Kicinski {
3722d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_linkinfo_get_req));
3732d7be507SJakub Kicinski }
3742d7be507SJakub Kicinski void ethtool_linkinfo_get_req_free(struct ethtool_linkinfo_get_req *req);
3752d7be507SJakub Kicinski 
3762d7be507SJakub Kicinski static inline void
ethtool_linkinfo_get_req_set_header_dev_index(struct ethtool_linkinfo_get_req * req,__u32 dev_index)3772d7be507SJakub Kicinski ethtool_linkinfo_get_req_set_header_dev_index(struct ethtool_linkinfo_get_req *req,
3782d7be507SJakub Kicinski 					      __u32 dev_index)
3792d7be507SJakub Kicinski {
3802d7be507SJakub Kicinski 	req->_present.header = 1;
3812d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
3822d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
3832d7be507SJakub Kicinski }
3842d7be507SJakub Kicinski static inline void
ethtool_linkinfo_get_req_set_header_dev_name(struct ethtool_linkinfo_get_req * req,const char * dev_name)3852d7be507SJakub Kicinski ethtool_linkinfo_get_req_set_header_dev_name(struct ethtool_linkinfo_get_req *req,
3862d7be507SJakub Kicinski 					     const char *dev_name)
3872d7be507SJakub Kicinski {
3882d7be507SJakub Kicinski 	free(req->header.dev_name);
3892d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
3902d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
3912d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
3922d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
3932d7be507SJakub Kicinski }
3942d7be507SJakub Kicinski static inline void
ethtool_linkinfo_get_req_set_header_flags(struct ethtool_linkinfo_get_req * req,__u32 flags)3952d7be507SJakub Kicinski ethtool_linkinfo_get_req_set_header_flags(struct ethtool_linkinfo_get_req *req,
3962d7be507SJakub Kicinski 					  __u32 flags)
3972d7be507SJakub Kicinski {
3982d7be507SJakub Kicinski 	req->_present.header = 1;
3992d7be507SJakub Kicinski 	req->header._present.flags = 1;
4002d7be507SJakub Kicinski 	req->header.flags = flags;
4012d7be507SJakub Kicinski }
4022d7be507SJakub Kicinski 
4032d7be507SJakub Kicinski struct ethtool_linkinfo_get_rsp {
4042d7be507SJakub Kicinski 	struct {
4052d7be507SJakub Kicinski 		__u32 header:1;
4062d7be507SJakub Kicinski 		__u32 port:1;
4072d7be507SJakub Kicinski 		__u32 phyaddr:1;
4082d7be507SJakub Kicinski 		__u32 tp_mdix:1;
4092d7be507SJakub Kicinski 		__u32 tp_mdix_ctrl:1;
4102d7be507SJakub Kicinski 		__u32 transceiver:1;
4112d7be507SJakub Kicinski 	} _present;
4122d7be507SJakub Kicinski 
4132d7be507SJakub Kicinski 	struct ethtool_header header;
4142d7be507SJakub Kicinski 	__u8 port;
4152d7be507SJakub Kicinski 	__u8 phyaddr;
4162d7be507SJakub Kicinski 	__u8 tp_mdix;
4172d7be507SJakub Kicinski 	__u8 tp_mdix_ctrl;
4182d7be507SJakub Kicinski 	__u8 transceiver;
4192d7be507SJakub Kicinski };
4202d7be507SJakub Kicinski 
4212d7be507SJakub Kicinski void ethtool_linkinfo_get_rsp_free(struct ethtool_linkinfo_get_rsp *rsp);
4222d7be507SJakub Kicinski 
4232d7be507SJakub Kicinski /*
4242d7be507SJakub Kicinski  * Get link info.
4252d7be507SJakub Kicinski  */
4262d7be507SJakub Kicinski struct ethtool_linkinfo_get_rsp *
4272d7be507SJakub Kicinski ethtool_linkinfo_get(struct ynl_sock *ys, struct ethtool_linkinfo_get_req *req);
4282d7be507SJakub Kicinski 
4292d7be507SJakub Kicinski /* ETHTOOL_MSG_LINKINFO_GET - dump */
4302d7be507SJakub Kicinski struct ethtool_linkinfo_get_req_dump {
4312d7be507SJakub Kicinski 	struct {
4322d7be507SJakub Kicinski 		__u32 header:1;
4332d7be507SJakub Kicinski 	} _present;
4342d7be507SJakub Kicinski 
4352d7be507SJakub Kicinski 	struct ethtool_header header;
4362d7be507SJakub Kicinski };
4372d7be507SJakub Kicinski 
4382d7be507SJakub Kicinski static inline struct ethtool_linkinfo_get_req_dump *
ethtool_linkinfo_get_req_dump_alloc(void)4392d7be507SJakub Kicinski ethtool_linkinfo_get_req_dump_alloc(void)
4402d7be507SJakub Kicinski {
4412d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_linkinfo_get_req_dump));
4422d7be507SJakub Kicinski }
4432d7be507SJakub Kicinski void
4442d7be507SJakub Kicinski ethtool_linkinfo_get_req_dump_free(struct ethtool_linkinfo_get_req_dump *req);
4452d7be507SJakub Kicinski 
4462d7be507SJakub Kicinski static inline void
ethtool_linkinfo_get_req_dump_set_header_dev_index(struct ethtool_linkinfo_get_req_dump * req,__u32 dev_index)4472d7be507SJakub Kicinski ethtool_linkinfo_get_req_dump_set_header_dev_index(struct ethtool_linkinfo_get_req_dump *req,
4482d7be507SJakub Kicinski 						   __u32 dev_index)
4492d7be507SJakub Kicinski {
4502d7be507SJakub Kicinski 	req->_present.header = 1;
4512d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
4522d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
4532d7be507SJakub Kicinski }
4542d7be507SJakub Kicinski static inline void
ethtool_linkinfo_get_req_dump_set_header_dev_name(struct ethtool_linkinfo_get_req_dump * req,const char * dev_name)4552d7be507SJakub Kicinski ethtool_linkinfo_get_req_dump_set_header_dev_name(struct ethtool_linkinfo_get_req_dump *req,
4562d7be507SJakub Kicinski 						  const char *dev_name)
4572d7be507SJakub Kicinski {
4582d7be507SJakub Kicinski 	free(req->header.dev_name);
4592d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
4602d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
4612d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
4622d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
4632d7be507SJakub Kicinski }
4642d7be507SJakub Kicinski static inline void
ethtool_linkinfo_get_req_dump_set_header_flags(struct ethtool_linkinfo_get_req_dump * req,__u32 flags)4652d7be507SJakub Kicinski ethtool_linkinfo_get_req_dump_set_header_flags(struct ethtool_linkinfo_get_req_dump *req,
4662d7be507SJakub Kicinski 					       __u32 flags)
4672d7be507SJakub Kicinski {
4682d7be507SJakub Kicinski 	req->_present.header = 1;
4692d7be507SJakub Kicinski 	req->header._present.flags = 1;
4702d7be507SJakub Kicinski 	req->header.flags = flags;
4712d7be507SJakub Kicinski }
4722d7be507SJakub Kicinski 
4732d7be507SJakub Kicinski struct ethtool_linkinfo_get_list {
4742d7be507SJakub Kicinski 	struct ethtool_linkinfo_get_list *next;
4752d7be507SJakub Kicinski 	struct ethtool_linkinfo_get_rsp obj __attribute__ ((aligned (8)));
4762d7be507SJakub Kicinski };
4772d7be507SJakub Kicinski 
4782d7be507SJakub Kicinski void ethtool_linkinfo_get_list_free(struct ethtool_linkinfo_get_list *rsp);
4792d7be507SJakub Kicinski 
4802d7be507SJakub Kicinski struct ethtool_linkinfo_get_list *
4812d7be507SJakub Kicinski ethtool_linkinfo_get_dump(struct ynl_sock *ys,
4822d7be507SJakub Kicinski 			  struct ethtool_linkinfo_get_req_dump *req);
4832d7be507SJakub Kicinski 
4842d7be507SJakub Kicinski /* ETHTOOL_MSG_LINKINFO_GET - notify */
4852d7be507SJakub Kicinski struct ethtool_linkinfo_get_ntf {
4862d7be507SJakub Kicinski 	__u16 family;
4872d7be507SJakub Kicinski 	__u8 cmd;
4882d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
4892d7be507SJakub Kicinski 	void (*free)(struct ethtool_linkinfo_get_ntf *ntf);
4902d7be507SJakub Kicinski 	struct ethtool_linkinfo_get_rsp obj __attribute__ ((aligned (8)));
4912d7be507SJakub Kicinski };
4922d7be507SJakub Kicinski 
4932d7be507SJakub Kicinski void ethtool_linkinfo_get_ntf_free(struct ethtool_linkinfo_get_ntf *rsp);
4942d7be507SJakub Kicinski 
4952d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_LINKINFO_SET ============== */
4962d7be507SJakub Kicinski /* ETHTOOL_MSG_LINKINFO_SET - do */
4972d7be507SJakub Kicinski struct ethtool_linkinfo_set_req {
4982d7be507SJakub Kicinski 	struct {
4992d7be507SJakub Kicinski 		__u32 header:1;
5002d7be507SJakub Kicinski 		__u32 port:1;
5012d7be507SJakub Kicinski 		__u32 phyaddr:1;
5022d7be507SJakub Kicinski 		__u32 tp_mdix:1;
5032d7be507SJakub Kicinski 		__u32 tp_mdix_ctrl:1;
5042d7be507SJakub Kicinski 		__u32 transceiver:1;
5052d7be507SJakub Kicinski 	} _present;
5062d7be507SJakub Kicinski 
5072d7be507SJakub Kicinski 	struct ethtool_header header;
5082d7be507SJakub Kicinski 	__u8 port;
5092d7be507SJakub Kicinski 	__u8 phyaddr;
5102d7be507SJakub Kicinski 	__u8 tp_mdix;
5112d7be507SJakub Kicinski 	__u8 tp_mdix_ctrl;
5122d7be507SJakub Kicinski 	__u8 transceiver;
5132d7be507SJakub Kicinski };
5142d7be507SJakub Kicinski 
5152d7be507SJakub Kicinski static inline struct ethtool_linkinfo_set_req *
ethtool_linkinfo_set_req_alloc(void)5162d7be507SJakub Kicinski ethtool_linkinfo_set_req_alloc(void)
5172d7be507SJakub Kicinski {
5182d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_linkinfo_set_req));
5192d7be507SJakub Kicinski }
5202d7be507SJakub Kicinski void ethtool_linkinfo_set_req_free(struct ethtool_linkinfo_set_req *req);
5212d7be507SJakub Kicinski 
5222d7be507SJakub Kicinski static inline void
ethtool_linkinfo_set_req_set_header_dev_index(struct ethtool_linkinfo_set_req * req,__u32 dev_index)5232d7be507SJakub Kicinski ethtool_linkinfo_set_req_set_header_dev_index(struct ethtool_linkinfo_set_req *req,
5242d7be507SJakub Kicinski 					      __u32 dev_index)
5252d7be507SJakub Kicinski {
5262d7be507SJakub Kicinski 	req->_present.header = 1;
5272d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
5282d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
5292d7be507SJakub Kicinski }
5302d7be507SJakub Kicinski static inline void
ethtool_linkinfo_set_req_set_header_dev_name(struct ethtool_linkinfo_set_req * req,const char * dev_name)5312d7be507SJakub Kicinski ethtool_linkinfo_set_req_set_header_dev_name(struct ethtool_linkinfo_set_req *req,
5322d7be507SJakub Kicinski 					     const char *dev_name)
5332d7be507SJakub Kicinski {
5342d7be507SJakub Kicinski 	free(req->header.dev_name);
5352d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
5362d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
5372d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
5382d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
5392d7be507SJakub Kicinski }
5402d7be507SJakub Kicinski static inline void
ethtool_linkinfo_set_req_set_header_flags(struct ethtool_linkinfo_set_req * req,__u32 flags)5412d7be507SJakub Kicinski ethtool_linkinfo_set_req_set_header_flags(struct ethtool_linkinfo_set_req *req,
5422d7be507SJakub Kicinski 					  __u32 flags)
5432d7be507SJakub Kicinski {
5442d7be507SJakub Kicinski 	req->_present.header = 1;
5452d7be507SJakub Kicinski 	req->header._present.flags = 1;
5462d7be507SJakub Kicinski 	req->header.flags = flags;
5472d7be507SJakub Kicinski }
5482d7be507SJakub Kicinski static inline void
ethtool_linkinfo_set_req_set_port(struct ethtool_linkinfo_set_req * req,__u8 port)5492d7be507SJakub Kicinski ethtool_linkinfo_set_req_set_port(struct ethtool_linkinfo_set_req *req,
5502d7be507SJakub Kicinski 				  __u8 port)
5512d7be507SJakub Kicinski {
5522d7be507SJakub Kicinski 	req->_present.port = 1;
5532d7be507SJakub Kicinski 	req->port = port;
5542d7be507SJakub Kicinski }
5552d7be507SJakub Kicinski static inline void
ethtool_linkinfo_set_req_set_phyaddr(struct ethtool_linkinfo_set_req * req,__u8 phyaddr)5562d7be507SJakub Kicinski ethtool_linkinfo_set_req_set_phyaddr(struct ethtool_linkinfo_set_req *req,
5572d7be507SJakub Kicinski 				     __u8 phyaddr)
5582d7be507SJakub Kicinski {
5592d7be507SJakub Kicinski 	req->_present.phyaddr = 1;
5602d7be507SJakub Kicinski 	req->phyaddr = phyaddr;
5612d7be507SJakub Kicinski }
5622d7be507SJakub Kicinski static inline void
ethtool_linkinfo_set_req_set_tp_mdix(struct ethtool_linkinfo_set_req * req,__u8 tp_mdix)5632d7be507SJakub Kicinski ethtool_linkinfo_set_req_set_tp_mdix(struct ethtool_linkinfo_set_req *req,
5642d7be507SJakub Kicinski 				     __u8 tp_mdix)
5652d7be507SJakub Kicinski {
5662d7be507SJakub Kicinski 	req->_present.tp_mdix = 1;
5672d7be507SJakub Kicinski 	req->tp_mdix = tp_mdix;
5682d7be507SJakub Kicinski }
5692d7be507SJakub Kicinski static inline void
ethtool_linkinfo_set_req_set_tp_mdix_ctrl(struct ethtool_linkinfo_set_req * req,__u8 tp_mdix_ctrl)5702d7be507SJakub Kicinski ethtool_linkinfo_set_req_set_tp_mdix_ctrl(struct ethtool_linkinfo_set_req *req,
5712d7be507SJakub Kicinski 					  __u8 tp_mdix_ctrl)
5722d7be507SJakub Kicinski {
5732d7be507SJakub Kicinski 	req->_present.tp_mdix_ctrl = 1;
5742d7be507SJakub Kicinski 	req->tp_mdix_ctrl = tp_mdix_ctrl;
5752d7be507SJakub Kicinski }
5762d7be507SJakub Kicinski static inline void
ethtool_linkinfo_set_req_set_transceiver(struct ethtool_linkinfo_set_req * req,__u8 transceiver)5772d7be507SJakub Kicinski ethtool_linkinfo_set_req_set_transceiver(struct ethtool_linkinfo_set_req *req,
5782d7be507SJakub Kicinski 					 __u8 transceiver)
5792d7be507SJakub Kicinski {
5802d7be507SJakub Kicinski 	req->_present.transceiver = 1;
5812d7be507SJakub Kicinski 	req->transceiver = transceiver;
5822d7be507SJakub Kicinski }
5832d7be507SJakub Kicinski 
5842d7be507SJakub Kicinski /*
5852d7be507SJakub Kicinski  * Set link info.
5862d7be507SJakub Kicinski  */
5872d7be507SJakub Kicinski int ethtool_linkinfo_set(struct ynl_sock *ys,
5882d7be507SJakub Kicinski 			 struct ethtool_linkinfo_set_req *req);
5892d7be507SJakub Kicinski 
5902d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_LINKMODES_GET ============== */
5912d7be507SJakub Kicinski /* ETHTOOL_MSG_LINKMODES_GET - do */
5922d7be507SJakub Kicinski struct ethtool_linkmodes_get_req {
5932d7be507SJakub Kicinski 	struct {
5942d7be507SJakub Kicinski 		__u32 header:1;
5952d7be507SJakub Kicinski 	} _present;
5962d7be507SJakub Kicinski 
5972d7be507SJakub Kicinski 	struct ethtool_header header;
5982d7be507SJakub Kicinski };
5992d7be507SJakub Kicinski 
6002d7be507SJakub Kicinski static inline struct ethtool_linkmodes_get_req *
ethtool_linkmodes_get_req_alloc(void)6012d7be507SJakub Kicinski ethtool_linkmodes_get_req_alloc(void)
6022d7be507SJakub Kicinski {
6032d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_linkmodes_get_req));
6042d7be507SJakub Kicinski }
6052d7be507SJakub Kicinski void ethtool_linkmodes_get_req_free(struct ethtool_linkmodes_get_req *req);
6062d7be507SJakub Kicinski 
6072d7be507SJakub Kicinski static inline void
ethtool_linkmodes_get_req_set_header_dev_index(struct ethtool_linkmodes_get_req * req,__u32 dev_index)6082d7be507SJakub Kicinski ethtool_linkmodes_get_req_set_header_dev_index(struct ethtool_linkmodes_get_req *req,
6092d7be507SJakub Kicinski 					       __u32 dev_index)
6102d7be507SJakub Kicinski {
6112d7be507SJakub Kicinski 	req->_present.header = 1;
6122d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
6132d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
6142d7be507SJakub Kicinski }
6152d7be507SJakub Kicinski static inline void
ethtool_linkmodes_get_req_set_header_dev_name(struct ethtool_linkmodes_get_req * req,const char * dev_name)6162d7be507SJakub Kicinski ethtool_linkmodes_get_req_set_header_dev_name(struct ethtool_linkmodes_get_req *req,
6172d7be507SJakub Kicinski 					      const char *dev_name)
6182d7be507SJakub Kicinski {
6192d7be507SJakub Kicinski 	free(req->header.dev_name);
6202d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
6212d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
6222d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
6232d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
6242d7be507SJakub Kicinski }
6252d7be507SJakub Kicinski static inline void
ethtool_linkmodes_get_req_set_header_flags(struct ethtool_linkmodes_get_req * req,__u32 flags)6262d7be507SJakub Kicinski ethtool_linkmodes_get_req_set_header_flags(struct ethtool_linkmodes_get_req *req,
6272d7be507SJakub Kicinski 					   __u32 flags)
6282d7be507SJakub Kicinski {
6292d7be507SJakub Kicinski 	req->_present.header = 1;
6302d7be507SJakub Kicinski 	req->header._present.flags = 1;
6312d7be507SJakub Kicinski 	req->header.flags = flags;
6322d7be507SJakub Kicinski }
6332d7be507SJakub Kicinski 
6342d7be507SJakub Kicinski struct ethtool_linkmodes_get_rsp {
6352d7be507SJakub Kicinski 	struct {
6362d7be507SJakub Kicinski 		__u32 header:1;
6372d7be507SJakub Kicinski 		__u32 autoneg:1;
6382d7be507SJakub Kicinski 		__u32 ours:1;
6392d7be507SJakub Kicinski 		__u32 peer:1;
6402d7be507SJakub Kicinski 		__u32 speed:1;
6412d7be507SJakub Kicinski 		__u32 duplex:1;
6422d7be507SJakub Kicinski 		__u32 master_slave_cfg:1;
6432d7be507SJakub Kicinski 		__u32 master_slave_state:1;
6442d7be507SJakub Kicinski 		__u32 lanes:1;
6452d7be507SJakub Kicinski 		__u32 rate_matching:1;
6462d7be507SJakub Kicinski 	} _present;
6472d7be507SJakub Kicinski 
6482d7be507SJakub Kicinski 	struct ethtool_header header;
6492d7be507SJakub Kicinski 	__u8 autoneg;
6502d7be507SJakub Kicinski 	struct ethtool_bitset ours;
6512d7be507SJakub Kicinski 	struct ethtool_bitset peer;
6522d7be507SJakub Kicinski 	__u32 speed;
6532d7be507SJakub Kicinski 	__u8 duplex;
6542d7be507SJakub Kicinski 	__u8 master_slave_cfg;
6552d7be507SJakub Kicinski 	__u8 master_slave_state;
6562d7be507SJakub Kicinski 	__u32 lanes;
6572d7be507SJakub Kicinski 	__u8 rate_matching;
6582d7be507SJakub Kicinski };
6592d7be507SJakub Kicinski 
6602d7be507SJakub Kicinski void ethtool_linkmodes_get_rsp_free(struct ethtool_linkmodes_get_rsp *rsp);
6612d7be507SJakub Kicinski 
6622d7be507SJakub Kicinski /*
6632d7be507SJakub Kicinski  * Get link modes.
6642d7be507SJakub Kicinski  */
6652d7be507SJakub Kicinski struct ethtool_linkmodes_get_rsp *
6662d7be507SJakub Kicinski ethtool_linkmodes_get(struct ynl_sock *ys,
6672d7be507SJakub Kicinski 		      struct ethtool_linkmodes_get_req *req);
6682d7be507SJakub Kicinski 
6692d7be507SJakub Kicinski /* ETHTOOL_MSG_LINKMODES_GET - dump */
6702d7be507SJakub Kicinski struct ethtool_linkmodes_get_req_dump {
6712d7be507SJakub Kicinski 	struct {
6722d7be507SJakub Kicinski 		__u32 header:1;
6732d7be507SJakub Kicinski 	} _present;
6742d7be507SJakub Kicinski 
6752d7be507SJakub Kicinski 	struct ethtool_header header;
6762d7be507SJakub Kicinski };
6772d7be507SJakub Kicinski 
6782d7be507SJakub Kicinski static inline struct ethtool_linkmodes_get_req_dump *
ethtool_linkmodes_get_req_dump_alloc(void)6792d7be507SJakub Kicinski ethtool_linkmodes_get_req_dump_alloc(void)
6802d7be507SJakub Kicinski {
6812d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_linkmodes_get_req_dump));
6822d7be507SJakub Kicinski }
6832d7be507SJakub Kicinski void
6842d7be507SJakub Kicinski ethtool_linkmodes_get_req_dump_free(struct ethtool_linkmodes_get_req_dump *req);
6852d7be507SJakub Kicinski 
6862d7be507SJakub Kicinski static inline void
ethtool_linkmodes_get_req_dump_set_header_dev_index(struct ethtool_linkmodes_get_req_dump * req,__u32 dev_index)6872d7be507SJakub Kicinski ethtool_linkmodes_get_req_dump_set_header_dev_index(struct ethtool_linkmodes_get_req_dump *req,
6882d7be507SJakub Kicinski 						    __u32 dev_index)
6892d7be507SJakub Kicinski {
6902d7be507SJakub Kicinski 	req->_present.header = 1;
6912d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
6922d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
6932d7be507SJakub Kicinski }
6942d7be507SJakub Kicinski static inline void
ethtool_linkmodes_get_req_dump_set_header_dev_name(struct ethtool_linkmodes_get_req_dump * req,const char * dev_name)6952d7be507SJakub Kicinski ethtool_linkmodes_get_req_dump_set_header_dev_name(struct ethtool_linkmodes_get_req_dump *req,
6962d7be507SJakub Kicinski 						   const char *dev_name)
6972d7be507SJakub Kicinski {
6982d7be507SJakub Kicinski 	free(req->header.dev_name);
6992d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
7002d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
7012d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
7022d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
7032d7be507SJakub Kicinski }
7042d7be507SJakub Kicinski static inline void
ethtool_linkmodes_get_req_dump_set_header_flags(struct ethtool_linkmodes_get_req_dump * req,__u32 flags)7052d7be507SJakub Kicinski ethtool_linkmodes_get_req_dump_set_header_flags(struct ethtool_linkmodes_get_req_dump *req,
7062d7be507SJakub Kicinski 						__u32 flags)
7072d7be507SJakub Kicinski {
7082d7be507SJakub Kicinski 	req->_present.header = 1;
7092d7be507SJakub Kicinski 	req->header._present.flags = 1;
7102d7be507SJakub Kicinski 	req->header.flags = flags;
7112d7be507SJakub Kicinski }
7122d7be507SJakub Kicinski 
7132d7be507SJakub Kicinski struct ethtool_linkmodes_get_list {
7142d7be507SJakub Kicinski 	struct ethtool_linkmodes_get_list *next;
7152d7be507SJakub Kicinski 	struct ethtool_linkmodes_get_rsp obj __attribute__ ((aligned (8)));
7162d7be507SJakub Kicinski };
7172d7be507SJakub Kicinski 
7182d7be507SJakub Kicinski void ethtool_linkmodes_get_list_free(struct ethtool_linkmodes_get_list *rsp);
7192d7be507SJakub Kicinski 
7202d7be507SJakub Kicinski struct ethtool_linkmodes_get_list *
7212d7be507SJakub Kicinski ethtool_linkmodes_get_dump(struct ynl_sock *ys,
7222d7be507SJakub Kicinski 			   struct ethtool_linkmodes_get_req_dump *req);
7232d7be507SJakub Kicinski 
7242d7be507SJakub Kicinski /* ETHTOOL_MSG_LINKMODES_GET - notify */
7252d7be507SJakub Kicinski struct ethtool_linkmodes_get_ntf {
7262d7be507SJakub Kicinski 	__u16 family;
7272d7be507SJakub Kicinski 	__u8 cmd;
7282d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
7292d7be507SJakub Kicinski 	void (*free)(struct ethtool_linkmodes_get_ntf *ntf);
7302d7be507SJakub Kicinski 	struct ethtool_linkmodes_get_rsp obj __attribute__ ((aligned (8)));
7312d7be507SJakub Kicinski };
7322d7be507SJakub Kicinski 
7332d7be507SJakub Kicinski void ethtool_linkmodes_get_ntf_free(struct ethtool_linkmodes_get_ntf *rsp);
7342d7be507SJakub Kicinski 
7352d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_LINKMODES_SET ============== */
7362d7be507SJakub Kicinski /* ETHTOOL_MSG_LINKMODES_SET - do */
7372d7be507SJakub Kicinski struct ethtool_linkmodes_set_req {
7382d7be507SJakub Kicinski 	struct {
7392d7be507SJakub Kicinski 		__u32 header:1;
7402d7be507SJakub Kicinski 		__u32 autoneg:1;
7412d7be507SJakub Kicinski 		__u32 ours:1;
7422d7be507SJakub Kicinski 		__u32 peer:1;
7432d7be507SJakub Kicinski 		__u32 speed:1;
7442d7be507SJakub Kicinski 		__u32 duplex:1;
7452d7be507SJakub Kicinski 		__u32 master_slave_cfg:1;
7462d7be507SJakub Kicinski 		__u32 master_slave_state:1;
7472d7be507SJakub Kicinski 		__u32 lanes:1;
7482d7be507SJakub Kicinski 		__u32 rate_matching:1;
7492d7be507SJakub Kicinski 	} _present;
7502d7be507SJakub Kicinski 
7512d7be507SJakub Kicinski 	struct ethtool_header header;
7522d7be507SJakub Kicinski 	__u8 autoneg;
7532d7be507SJakub Kicinski 	struct ethtool_bitset ours;
7542d7be507SJakub Kicinski 	struct ethtool_bitset peer;
7552d7be507SJakub Kicinski 	__u32 speed;
7562d7be507SJakub Kicinski 	__u8 duplex;
7572d7be507SJakub Kicinski 	__u8 master_slave_cfg;
7582d7be507SJakub Kicinski 	__u8 master_slave_state;
7592d7be507SJakub Kicinski 	__u32 lanes;
7602d7be507SJakub Kicinski 	__u8 rate_matching;
7612d7be507SJakub Kicinski };
7622d7be507SJakub Kicinski 
7632d7be507SJakub Kicinski static inline struct ethtool_linkmodes_set_req *
ethtool_linkmodes_set_req_alloc(void)7642d7be507SJakub Kicinski ethtool_linkmodes_set_req_alloc(void)
7652d7be507SJakub Kicinski {
7662d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_linkmodes_set_req));
7672d7be507SJakub Kicinski }
7682d7be507SJakub Kicinski void ethtool_linkmodes_set_req_free(struct ethtool_linkmodes_set_req *req);
7692d7be507SJakub Kicinski 
7702d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_header_dev_index(struct ethtool_linkmodes_set_req * req,__u32 dev_index)7712d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_header_dev_index(struct ethtool_linkmodes_set_req *req,
7722d7be507SJakub Kicinski 					       __u32 dev_index)
7732d7be507SJakub Kicinski {
7742d7be507SJakub Kicinski 	req->_present.header = 1;
7752d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
7762d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
7772d7be507SJakub Kicinski }
7782d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_header_dev_name(struct ethtool_linkmodes_set_req * req,const char * dev_name)7792d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_header_dev_name(struct ethtool_linkmodes_set_req *req,
7802d7be507SJakub Kicinski 					      const char *dev_name)
7812d7be507SJakub Kicinski {
7822d7be507SJakub Kicinski 	free(req->header.dev_name);
7832d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
7842d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
7852d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
7862d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
7872d7be507SJakub Kicinski }
7882d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_header_flags(struct ethtool_linkmodes_set_req * req,__u32 flags)7892d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_header_flags(struct ethtool_linkmodes_set_req *req,
7902d7be507SJakub Kicinski 					   __u32 flags)
7912d7be507SJakub Kicinski {
7922d7be507SJakub Kicinski 	req->_present.header = 1;
7932d7be507SJakub Kicinski 	req->header._present.flags = 1;
7942d7be507SJakub Kicinski 	req->header.flags = flags;
7952d7be507SJakub Kicinski }
7962d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_autoneg(struct ethtool_linkmodes_set_req * req,__u8 autoneg)7972d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_autoneg(struct ethtool_linkmodes_set_req *req,
7982d7be507SJakub Kicinski 				      __u8 autoneg)
7992d7be507SJakub Kicinski {
8002d7be507SJakub Kicinski 	req->_present.autoneg = 1;
8012d7be507SJakub Kicinski 	req->autoneg = autoneg;
8022d7be507SJakub Kicinski }
8032d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_ours_nomask(struct ethtool_linkmodes_set_req * req)8042d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_ours_nomask(struct ethtool_linkmodes_set_req *req)
8052d7be507SJakub Kicinski {
8062d7be507SJakub Kicinski 	req->_present.ours = 1;
8072d7be507SJakub Kicinski 	req->ours._present.nomask = 1;
8082d7be507SJakub Kicinski }
8092d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_ours_size(struct ethtool_linkmodes_set_req * req,__u32 size)8102d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_ours_size(struct ethtool_linkmodes_set_req *req,
8112d7be507SJakub Kicinski 					__u32 size)
8122d7be507SJakub Kicinski {
8132d7be507SJakub Kicinski 	req->_present.ours = 1;
8142d7be507SJakub Kicinski 	req->ours._present.size = 1;
8152d7be507SJakub Kicinski 	req->ours.size = size;
8162d7be507SJakub Kicinski }
8172d7be507SJakub Kicinski static inline void
__ethtool_linkmodes_set_req_set_ours_bits_bit(struct ethtool_linkmodes_set_req * req,struct ethtool_bitset_bit * bit,unsigned int n_bit)8182d7be507SJakub Kicinski __ethtool_linkmodes_set_req_set_ours_bits_bit(struct ethtool_linkmodes_set_req *req,
8192d7be507SJakub Kicinski 					      struct ethtool_bitset_bit *bit,
8202d7be507SJakub Kicinski 					      unsigned int n_bit)
8212d7be507SJakub Kicinski {
8222d7be507SJakub Kicinski 	free(req->ours.bits.bit);
8232d7be507SJakub Kicinski 	req->ours.bits.bit = bit;
8242d7be507SJakub Kicinski 	req->ours.bits.n_bit = n_bit;
8252d7be507SJakub Kicinski }
8262d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_peer_nomask(struct ethtool_linkmodes_set_req * req)8272d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_peer_nomask(struct ethtool_linkmodes_set_req *req)
8282d7be507SJakub Kicinski {
8292d7be507SJakub Kicinski 	req->_present.peer = 1;
8302d7be507SJakub Kicinski 	req->peer._present.nomask = 1;
8312d7be507SJakub Kicinski }
8322d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_peer_size(struct ethtool_linkmodes_set_req * req,__u32 size)8332d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_peer_size(struct ethtool_linkmodes_set_req *req,
8342d7be507SJakub Kicinski 					__u32 size)
8352d7be507SJakub Kicinski {
8362d7be507SJakub Kicinski 	req->_present.peer = 1;
8372d7be507SJakub Kicinski 	req->peer._present.size = 1;
8382d7be507SJakub Kicinski 	req->peer.size = size;
8392d7be507SJakub Kicinski }
8402d7be507SJakub Kicinski static inline void
__ethtool_linkmodes_set_req_set_peer_bits_bit(struct ethtool_linkmodes_set_req * req,struct ethtool_bitset_bit * bit,unsigned int n_bit)8412d7be507SJakub Kicinski __ethtool_linkmodes_set_req_set_peer_bits_bit(struct ethtool_linkmodes_set_req *req,
8422d7be507SJakub Kicinski 					      struct ethtool_bitset_bit *bit,
8432d7be507SJakub Kicinski 					      unsigned int n_bit)
8442d7be507SJakub Kicinski {
8452d7be507SJakub Kicinski 	free(req->peer.bits.bit);
8462d7be507SJakub Kicinski 	req->peer.bits.bit = bit;
8472d7be507SJakub Kicinski 	req->peer.bits.n_bit = n_bit;
8482d7be507SJakub Kicinski }
8492d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_speed(struct ethtool_linkmodes_set_req * req,__u32 speed)8502d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_speed(struct ethtool_linkmodes_set_req *req,
8512d7be507SJakub Kicinski 				    __u32 speed)
8522d7be507SJakub Kicinski {
8532d7be507SJakub Kicinski 	req->_present.speed = 1;
8542d7be507SJakub Kicinski 	req->speed = speed;
8552d7be507SJakub Kicinski }
8562d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_duplex(struct ethtool_linkmodes_set_req * req,__u8 duplex)8572d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_duplex(struct ethtool_linkmodes_set_req *req,
8582d7be507SJakub Kicinski 				     __u8 duplex)
8592d7be507SJakub Kicinski {
8602d7be507SJakub Kicinski 	req->_present.duplex = 1;
8612d7be507SJakub Kicinski 	req->duplex = duplex;
8622d7be507SJakub Kicinski }
8632d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_master_slave_cfg(struct ethtool_linkmodes_set_req * req,__u8 master_slave_cfg)8642d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_master_slave_cfg(struct ethtool_linkmodes_set_req *req,
8652d7be507SJakub Kicinski 					       __u8 master_slave_cfg)
8662d7be507SJakub Kicinski {
8672d7be507SJakub Kicinski 	req->_present.master_slave_cfg = 1;
8682d7be507SJakub Kicinski 	req->master_slave_cfg = master_slave_cfg;
8692d7be507SJakub Kicinski }
8702d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_master_slave_state(struct ethtool_linkmodes_set_req * req,__u8 master_slave_state)8712d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_master_slave_state(struct ethtool_linkmodes_set_req *req,
8722d7be507SJakub Kicinski 						 __u8 master_slave_state)
8732d7be507SJakub Kicinski {
8742d7be507SJakub Kicinski 	req->_present.master_slave_state = 1;
8752d7be507SJakub Kicinski 	req->master_slave_state = master_slave_state;
8762d7be507SJakub Kicinski }
8772d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_lanes(struct ethtool_linkmodes_set_req * req,__u32 lanes)8782d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_lanes(struct ethtool_linkmodes_set_req *req,
8792d7be507SJakub Kicinski 				    __u32 lanes)
8802d7be507SJakub Kicinski {
8812d7be507SJakub Kicinski 	req->_present.lanes = 1;
8822d7be507SJakub Kicinski 	req->lanes = lanes;
8832d7be507SJakub Kicinski }
8842d7be507SJakub Kicinski static inline void
ethtool_linkmodes_set_req_set_rate_matching(struct ethtool_linkmodes_set_req * req,__u8 rate_matching)8852d7be507SJakub Kicinski ethtool_linkmodes_set_req_set_rate_matching(struct ethtool_linkmodes_set_req *req,
8862d7be507SJakub Kicinski 					    __u8 rate_matching)
8872d7be507SJakub Kicinski {
8882d7be507SJakub Kicinski 	req->_present.rate_matching = 1;
8892d7be507SJakub Kicinski 	req->rate_matching = rate_matching;
8902d7be507SJakub Kicinski }
8912d7be507SJakub Kicinski 
8922d7be507SJakub Kicinski /*
8932d7be507SJakub Kicinski  * Set link modes.
8942d7be507SJakub Kicinski  */
8952d7be507SJakub Kicinski int ethtool_linkmodes_set(struct ynl_sock *ys,
8962d7be507SJakub Kicinski 			  struct ethtool_linkmodes_set_req *req);
8972d7be507SJakub Kicinski 
8982d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_LINKSTATE_GET ============== */
8992d7be507SJakub Kicinski /* ETHTOOL_MSG_LINKSTATE_GET - do */
9002d7be507SJakub Kicinski struct ethtool_linkstate_get_req {
9012d7be507SJakub Kicinski 	struct {
9022d7be507SJakub Kicinski 		__u32 header:1;
9032d7be507SJakub Kicinski 	} _present;
9042d7be507SJakub Kicinski 
9052d7be507SJakub Kicinski 	struct ethtool_header header;
9062d7be507SJakub Kicinski };
9072d7be507SJakub Kicinski 
9082d7be507SJakub Kicinski static inline struct ethtool_linkstate_get_req *
ethtool_linkstate_get_req_alloc(void)9092d7be507SJakub Kicinski ethtool_linkstate_get_req_alloc(void)
9102d7be507SJakub Kicinski {
9112d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_linkstate_get_req));
9122d7be507SJakub Kicinski }
9132d7be507SJakub Kicinski void ethtool_linkstate_get_req_free(struct ethtool_linkstate_get_req *req);
9142d7be507SJakub Kicinski 
9152d7be507SJakub Kicinski static inline void
ethtool_linkstate_get_req_set_header_dev_index(struct ethtool_linkstate_get_req * req,__u32 dev_index)9162d7be507SJakub Kicinski ethtool_linkstate_get_req_set_header_dev_index(struct ethtool_linkstate_get_req *req,
9172d7be507SJakub Kicinski 					       __u32 dev_index)
9182d7be507SJakub Kicinski {
9192d7be507SJakub Kicinski 	req->_present.header = 1;
9202d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
9212d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
9222d7be507SJakub Kicinski }
9232d7be507SJakub Kicinski static inline void
ethtool_linkstate_get_req_set_header_dev_name(struct ethtool_linkstate_get_req * req,const char * dev_name)9242d7be507SJakub Kicinski ethtool_linkstate_get_req_set_header_dev_name(struct ethtool_linkstate_get_req *req,
9252d7be507SJakub Kicinski 					      const char *dev_name)
9262d7be507SJakub Kicinski {
9272d7be507SJakub Kicinski 	free(req->header.dev_name);
9282d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
9292d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
9302d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
9312d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
9322d7be507SJakub Kicinski }
9332d7be507SJakub Kicinski static inline void
ethtool_linkstate_get_req_set_header_flags(struct ethtool_linkstate_get_req * req,__u32 flags)9342d7be507SJakub Kicinski ethtool_linkstate_get_req_set_header_flags(struct ethtool_linkstate_get_req *req,
9352d7be507SJakub Kicinski 					   __u32 flags)
9362d7be507SJakub Kicinski {
9372d7be507SJakub Kicinski 	req->_present.header = 1;
9382d7be507SJakub Kicinski 	req->header._present.flags = 1;
9392d7be507SJakub Kicinski 	req->header.flags = flags;
9402d7be507SJakub Kicinski }
9412d7be507SJakub Kicinski 
9422d7be507SJakub Kicinski struct ethtool_linkstate_get_rsp {
9432d7be507SJakub Kicinski 	struct {
9442d7be507SJakub Kicinski 		__u32 header:1;
9452d7be507SJakub Kicinski 		__u32 link:1;
9462d7be507SJakub Kicinski 		__u32 sqi:1;
9472d7be507SJakub Kicinski 		__u32 sqi_max:1;
9482d7be507SJakub Kicinski 		__u32 ext_state:1;
9492d7be507SJakub Kicinski 		__u32 ext_substate:1;
9502d7be507SJakub Kicinski 		__u32 ext_down_cnt:1;
9512d7be507SJakub Kicinski 	} _present;
9522d7be507SJakub Kicinski 
9532d7be507SJakub Kicinski 	struct ethtool_header header;
9542d7be507SJakub Kicinski 	__u8 link;
9552d7be507SJakub Kicinski 	__u32 sqi;
9562d7be507SJakub Kicinski 	__u32 sqi_max;
9572d7be507SJakub Kicinski 	__u8 ext_state;
9582d7be507SJakub Kicinski 	__u8 ext_substate;
9592d7be507SJakub Kicinski 	__u32 ext_down_cnt;
9602d7be507SJakub Kicinski };
9612d7be507SJakub Kicinski 
9622d7be507SJakub Kicinski void ethtool_linkstate_get_rsp_free(struct ethtool_linkstate_get_rsp *rsp);
9632d7be507SJakub Kicinski 
9642d7be507SJakub Kicinski /*
9652d7be507SJakub Kicinski  * Get link state.
9662d7be507SJakub Kicinski  */
9672d7be507SJakub Kicinski struct ethtool_linkstate_get_rsp *
9682d7be507SJakub Kicinski ethtool_linkstate_get(struct ynl_sock *ys,
9692d7be507SJakub Kicinski 		      struct ethtool_linkstate_get_req *req);
9702d7be507SJakub Kicinski 
9712d7be507SJakub Kicinski /* ETHTOOL_MSG_LINKSTATE_GET - dump */
9722d7be507SJakub Kicinski struct ethtool_linkstate_get_req_dump {
9732d7be507SJakub Kicinski 	struct {
9742d7be507SJakub Kicinski 		__u32 header:1;
9752d7be507SJakub Kicinski 	} _present;
9762d7be507SJakub Kicinski 
9772d7be507SJakub Kicinski 	struct ethtool_header header;
9782d7be507SJakub Kicinski };
9792d7be507SJakub Kicinski 
9802d7be507SJakub Kicinski static inline struct ethtool_linkstate_get_req_dump *
ethtool_linkstate_get_req_dump_alloc(void)9812d7be507SJakub Kicinski ethtool_linkstate_get_req_dump_alloc(void)
9822d7be507SJakub Kicinski {
9832d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_linkstate_get_req_dump));
9842d7be507SJakub Kicinski }
9852d7be507SJakub Kicinski void
9862d7be507SJakub Kicinski ethtool_linkstate_get_req_dump_free(struct ethtool_linkstate_get_req_dump *req);
9872d7be507SJakub Kicinski 
9882d7be507SJakub Kicinski static inline void
ethtool_linkstate_get_req_dump_set_header_dev_index(struct ethtool_linkstate_get_req_dump * req,__u32 dev_index)9892d7be507SJakub Kicinski ethtool_linkstate_get_req_dump_set_header_dev_index(struct ethtool_linkstate_get_req_dump *req,
9902d7be507SJakub Kicinski 						    __u32 dev_index)
9912d7be507SJakub Kicinski {
9922d7be507SJakub Kicinski 	req->_present.header = 1;
9932d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
9942d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
9952d7be507SJakub Kicinski }
9962d7be507SJakub Kicinski static inline void
ethtool_linkstate_get_req_dump_set_header_dev_name(struct ethtool_linkstate_get_req_dump * req,const char * dev_name)9972d7be507SJakub Kicinski ethtool_linkstate_get_req_dump_set_header_dev_name(struct ethtool_linkstate_get_req_dump *req,
9982d7be507SJakub Kicinski 						   const char *dev_name)
9992d7be507SJakub Kicinski {
10002d7be507SJakub Kicinski 	free(req->header.dev_name);
10012d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
10022d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
10032d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
10042d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
10052d7be507SJakub Kicinski }
10062d7be507SJakub Kicinski static inline void
ethtool_linkstate_get_req_dump_set_header_flags(struct ethtool_linkstate_get_req_dump * req,__u32 flags)10072d7be507SJakub Kicinski ethtool_linkstate_get_req_dump_set_header_flags(struct ethtool_linkstate_get_req_dump *req,
10082d7be507SJakub Kicinski 						__u32 flags)
10092d7be507SJakub Kicinski {
10102d7be507SJakub Kicinski 	req->_present.header = 1;
10112d7be507SJakub Kicinski 	req->header._present.flags = 1;
10122d7be507SJakub Kicinski 	req->header.flags = flags;
10132d7be507SJakub Kicinski }
10142d7be507SJakub Kicinski 
10152d7be507SJakub Kicinski struct ethtool_linkstate_get_list {
10162d7be507SJakub Kicinski 	struct ethtool_linkstate_get_list *next;
10172d7be507SJakub Kicinski 	struct ethtool_linkstate_get_rsp obj __attribute__ ((aligned (8)));
10182d7be507SJakub Kicinski };
10192d7be507SJakub Kicinski 
10202d7be507SJakub Kicinski void ethtool_linkstate_get_list_free(struct ethtool_linkstate_get_list *rsp);
10212d7be507SJakub Kicinski 
10222d7be507SJakub Kicinski struct ethtool_linkstate_get_list *
10232d7be507SJakub Kicinski ethtool_linkstate_get_dump(struct ynl_sock *ys,
10242d7be507SJakub Kicinski 			   struct ethtool_linkstate_get_req_dump *req);
10252d7be507SJakub Kicinski 
10262d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_DEBUG_GET ============== */
10272d7be507SJakub Kicinski /* ETHTOOL_MSG_DEBUG_GET - do */
10282d7be507SJakub Kicinski struct ethtool_debug_get_req {
10292d7be507SJakub Kicinski 	struct {
10302d7be507SJakub Kicinski 		__u32 header:1;
10312d7be507SJakub Kicinski 	} _present;
10322d7be507SJakub Kicinski 
10332d7be507SJakub Kicinski 	struct ethtool_header header;
10342d7be507SJakub Kicinski };
10352d7be507SJakub Kicinski 
ethtool_debug_get_req_alloc(void)10362d7be507SJakub Kicinski static inline struct ethtool_debug_get_req *ethtool_debug_get_req_alloc(void)
10372d7be507SJakub Kicinski {
10382d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_debug_get_req));
10392d7be507SJakub Kicinski }
10402d7be507SJakub Kicinski void ethtool_debug_get_req_free(struct ethtool_debug_get_req *req);
10412d7be507SJakub Kicinski 
10422d7be507SJakub Kicinski static inline void
ethtool_debug_get_req_set_header_dev_index(struct ethtool_debug_get_req * req,__u32 dev_index)10432d7be507SJakub Kicinski ethtool_debug_get_req_set_header_dev_index(struct ethtool_debug_get_req *req,
10442d7be507SJakub Kicinski 					   __u32 dev_index)
10452d7be507SJakub Kicinski {
10462d7be507SJakub Kicinski 	req->_present.header = 1;
10472d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
10482d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
10492d7be507SJakub Kicinski }
10502d7be507SJakub Kicinski static inline void
ethtool_debug_get_req_set_header_dev_name(struct ethtool_debug_get_req * req,const char * dev_name)10512d7be507SJakub Kicinski ethtool_debug_get_req_set_header_dev_name(struct ethtool_debug_get_req *req,
10522d7be507SJakub Kicinski 					  const char *dev_name)
10532d7be507SJakub Kicinski {
10542d7be507SJakub Kicinski 	free(req->header.dev_name);
10552d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
10562d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
10572d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
10582d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
10592d7be507SJakub Kicinski }
10602d7be507SJakub Kicinski static inline void
ethtool_debug_get_req_set_header_flags(struct ethtool_debug_get_req * req,__u32 flags)10612d7be507SJakub Kicinski ethtool_debug_get_req_set_header_flags(struct ethtool_debug_get_req *req,
10622d7be507SJakub Kicinski 				       __u32 flags)
10632d7be507SJakub Kicinski {
10642d7be507SJakub Kicinski 	req->_present.header = 1;
10652d7be507SJakub Kicinski 	req->header._present.flags = 1;
10662d7be507SJakub Kicinski 	req->header.flags = flags;
10672d7be507SJakub Kicinski }
10682d7be507SJakub Kicinski 
10692d7be507SJakub Kicinski struct ethtool_debug_get_rsp {
10702d7be507SJakub Kicinski 	struct {
10712d7be507SJakub Kicinski 		__u32 header:1;
10722d7be507SJakub Kicinski 		__u32 msgmask:1;
10732d7be507SJakub Kicinski 	} _present;
10742d7be507SJakub Kicinski 
10752d7be507SJakub Kicinski 	struct ethtool_header header;
10762d7be507SJakub Kicinski 	struct ethtool_bitset msgmask;
10772d7be507SJakub Kicinski };
10782d7be507SJakub Kicinski 
10792d7be507SJakub Kicinski void ethtool_debug_get_rsp_free(struct ethtool_debug_get_rsp *rsp);
10802d7be507SJakub Kicinski 
10812d7be507SJakub Kicinski /*
10822d7be507SJakub Kicinski  * Get debug message mask.
10832d7be507SJakub Kicinski  */
10842d7be507SJakub Kicinski struct ethtool_debug_get_rsp *
10852d7be507SJakub Kicinski ethtool_debug_get(struct ynl_sock *ys, struct ethtool_debug_get_req *req);
10862d7be507SJakub Kicinski 
10872d7be507SJakub Kicinski /* ETHTOOL_MSG_DEBUG_GET - dump */
10882d7be507SJakub Kicinski struct ethtool_debug_get_req_dump {
10892d7be507SJakub Kicinski 	struct {
10902d7be507SJakub Kicinski 		__u32 header:1;
10912d7be507SJakub Kicinski 	} _present;
10922d7be507SJakub Kicinski 
10932d7be507SJakub Kicinski 	struct ethtool_header header;
10942d7be507SJakub Kicinski };
10952d7be507SJakub Kicinski 
10962d7be507SJakub Kicinski static inline struct ethtool_debug_get_req_dump *
ethtool_debug_get_req_dump_alloc(void)10972d7be507SJakub Kicinski ethtool_debug_get_req_dump_alloc(void)
10982d7be507SJakub Kicinski {
10992d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_debug_get_req_dump));
11002d7be507SJakub Kicinski }
11012d7be507SJakub Kicinski void ethtool_debug_get_req_dump_free(struct ethtool_debug_get_req_dump *req);
11022d7be507SJakub Kicinski 
11032d7be507SJakub Kicinski static inline void
ethtool_debug_get_req_dump_set_header_dev_index(struct ethtool_debug_get_req_dump * req,__u32 dev_index)11042d7be507SJakub Kicinski ethtool_debug_get_req_dump_set_header_dev_index(struct ethtool_debug_get_req_dump *req,
11052d7be507SJakub Kicinski 						__u32 dev_index)
11062d7be507SJakub Kicinski {
11072d7be507SJakub Kicinski 	req->_present.header = 1;
11082d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
11092d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
11102d7be507SJakub Kicinski }
11112d7be507SJakub Kicinski static inline void
ethtool_debug_get_req_dump_set_header_dev_name(struct ethtool_debug_get_req_dump * req,const char * dev_name)11122d7be507SJakub Kicinski ethtool_debug_get_req_dump_set_header_dev_name(struct ethtool_debug_get_req_dump *req,
11132d7be507SJakub Kicinski 					       const char *dev_name)
11142d7be507SJakub Kicinski {
11152d7be507SJakub Kicinski 	free(req->header.dev_name);
11162d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
11172d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
11182d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
11192d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
11202d7be507SJakub Kicinski }
11212d7be507SJakub Kicinski static inline void
ethtool_debug_get_req_dump_set_header_flags(struct ethtool_debug_get_req_dump * req,__u32 flags)11222d7be507SJakub Kicinski ethtool_debug_get_req_dump_set_header_flags(struct ethtool_debug_get_req_dump *req,
11232d7be507SJakub Kicinski 					    __u32 flags)
11242d7be507SJakub Kicinski {
11252d7be507SJakub Kicinski 	req->_present.header = 1;
11262d7be507SJakub Kicinski 	req->header._present.flags = 1;
11272d7be507SJakub Kicinski 	req->header.flags = flags;
11282d7be507SJakub Kicinski }
11292d7be507SJakub Kicinski 
11302d7be507SJakub Kicinski struct ethtool_debug_get_list {
11312d7be507SJakub Kicinski 	struct ethtool_debug_get_list *next;
11322d7be507SJakub Kicinski 	struct ethtool_debug_get_rsp obj __attribute__ ((aligned (8)));
11332d7be507SJakub Kicinski };
11342d7be507SJakub Kicinski 
11352d7be507SJakub Kicinski void ethtool_debug_get_list_free(struct ethtool_debug_get_list *rsp);
11362d7be507SJakub Kicinski 
11372d7be507SJakub Kicinski struct ethtool_debug_get_list *
11382d7be507SJakub Kicinski ethtool_debug_get_dump(struct ynl_sock *ys,
11392d7be507SJakub Kicinski 		       struct ethtool_debug_get_req_dump *req);
11402d7be507SJakub Kicinski 
11412d7be507SJakub Kicinski /* ETHTOOL_MSG_DEBUG_GET - notify */
11422d7be507SJakub Kicinski struct ethtool_debug_get_ntf {
11432d7be507SJakub Kicinski 	__u16 family;
11442d7be507SJakub Kicinski 	__u8 cmd;
11452d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
11462d7be507SJakub Kicinski 	void (*free)(struct ethtool_debug_get_ntf *ntf);
11472d7be507SJakub Kicinski 	struct ethtool_debug_get_rsp obj __attribute__ ((aligned (8)));
11482d7be507SJakub Kicinski };
11492d7be507SJakub Kicinski 
11502d7be507SJakub Kicinski void ethtool_debug_get_ntf_free(struct ethtool_debug_get_ntf *rsp);
11512d7be507SJakub Kicinski 
11522d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_DEBUG_SET ============== */
11532d7be507SJakub Kicinski /* ETHTOOL_MSG_DEBUG_SET - do */
11542d7be507SJakub Kicinski struct ethtool_debug_set_req {
11552d7be507SJakub Kicinski 	struct {
11562d7be507SJakub Kicinski 		__u32 header:1;
11572d7be507SJakub Kicinski 		__u32 msgmask:1;
11582d7be507SJakub Kicinski 	} _present;
11592d7be507SJakub Kicinski 
11602d7be507SJakub Kicinski 	struct ethtool_header header;
11612d7be507SJakub Kicinski 	struct ethtool_bitset msgmask;
11622d7be507SJakub Kicinski };
11632d7be507SJakub Kicinski 
ethtool_debug_set_req_alloc(void)11642d7be507SJakub Kicinski static inline struct ethtool_debug_set_req *ethtool_debug_set_req_alloc(void)
11652d7be507SJakub Kicinski {
11662d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_debug_set_req));
11672d7be507SJakub Kicinski }
11682d7be507SJakub Kicinski void ethtool_debug_set_req_free(struct ethtool_debug_set_req *req);
11692d7be507SJakub Kicinski 
11702d7be507SJakub Kicinski static inline void
ethtool_debug_set_req_set_header_dev_index(struct ethtool_debug_set_req * req,__u32 dev_index)11712d7be507SJakub Kicinski ethtool_debug_set_req_set_header_dev_index(struct ethtool_debug_set_req *req,
11722d7be507SJakub Kicinski 					   __u32 dev_index)
11732d7be507SJakub Kicinski {
11742d7be507SJakub Kicinski 	req->_present.header = 1;
11752d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
11762d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
11772d7be507SJakub Kicinski }
11782d7be507SJakub Kicinski static inline void
ethtool_debug_set_req_set_header_dev_name(struct ethtool_debug_set_req * req,const char * dev_name)11792d7be507SJakub Kicinski ethtool_debug_set_req_set_header_dev_name(struct ethtool_debug_set_req *req,
11802d7be507SJakub Kicinski 					  const char *dev_name)
11812d7be507SJakub Kicinski {
11822d7be507SJakub Kicinski 	free(req->header.dev_name);
11832d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
11842d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
11852d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
11862d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
11872d7be507SJakub Kicinski }
11882d7be507SJakub Kicinski static inline void
ethtool_debug_set_req_set_header_flags(struct ethtool_debug_set_req * req,__u32 flags)11892d7be507SJakub Kicinski ethtool_debug_set_req_set_header_flags(struct ethtool_debug_set_req *req,
11902d7be507SJakub Kicinski 				       __u32 flags)
11912d7be507SJakub Kicinski {
11922d7be507SJakub Kicinski 	req->_present.header = 1;
11932d7be507SJakub Kicinski 	req->header._present.flags = 1;
11942d7be507SJakub Kicinski 	req->header.flags = flags;
11952d7be507SJakub Kicinski }
11962d7be507SJakub Kicinski static inline void
ethtool_debug_set_req_set_msgmask_nomask(struct ethtool_debug_set_req * req)11972d7be507SJakub Kicinski ethtool_debug_set_req_set_msgmask_nomask(struct ethtool_debug_set_req *req)
11982d7be507SJakub Kicinski {
11992d7be507SJakub Kicinski 	req->_present.msgmask = 1;
12002d7be507SJakub Kicinski 	req->msgmask._present.nomask = 1;
12012d7be507SJakub Kicinski }
12022d7be507SJakub Kicinski static inline void
ethtool_debug_set_req_set_msgmask_size(struct ethtool_debug_set_req * req,__u32 size)12032d7be507SJakub Kicinski ethtool_debug_set_req_set_msgmask_size(struct ethtool_debug_set_req *req,
12042d7be507SJakub Kicinski 				       __u32 size)
12052d7be507SJakub Kicinski {
12062d7be507SJakub Kicinski 	req->_present.msgmask = 1;
12072d7be507SJakub Kicinski 	req->msgmask._present.size = 1;
12082d7be507SJakub Kicinski 	req->msgmask.size = size;
12092d7be507SJakub Kicinski }
12102d7be507SJakub Kicinski static inline void
__ethtool_debug_set_req_set_msgmask_bits_bit(struct ethtool_debug_set_req * req,struct ethtool_bitset_bit * bit,unsigned int n_bit)12112d7be507SJakub Kicinski __ethtool_debug_set_req_set_msgmask_bits_bit(struct ethtool_debug_set_req *req,
12122d7be507SJakub Kicinski 					     struct ethtool_bitset_bit *bit,
12132d7be507SJakub Kicinski 					     unsigned int n_bit)
12142d7be507SJakub Kicinski {
12152d7be507SJakub Kicinski 	free(req->msgmask.bits.bit);
12162d7be507SJakub Kicinski 	req->msgmask.bits.bit = bit;
12172d7be507SJakub Kicinski 	req->msgmask.bits.n_bit = n_bit;
12182d7be507SJakub Kicinski }
12192d7be507SJakub Kicinski 
12202d7be507SJakub Kicinski /*
12212d7be507SJakub Kicinski  * Set debug message mask.
12222d7be507SJakub Kicinski  */
12232d7be507SJakub Kicinski int ethtool_debug_set(struct ynl_sock *ys, struct ethtool_debug_set_req *req);
12242d7be507SJakub Kicinski 
12252d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_WOL_GET ============== */
12262d7be507SJakub Kicinski /* ETHTOOL_MSG_WOL_GET - do */
12272d7be507SJakub Kicinski struct ethtool_wol_get_req {
12282d7be507SJakub Kicinski 	struct {
12292d7be507SJakub Kicinski 		__u32 header:1;
12302d7be507SJakub Kicinski 	} _present;
12312d7be507SJakub Kicinski 
12322d7be507SJakub Kicinski 	struct ethtool_header header;
12332d7be507SJakub Kicinski };
12342d7be507SJakub Kicinski 
ethtool_wol_get_req_alloc(void)12352d7be507SJakub Kicinski static inline struct ethtool_wol_get_req *ethtool_wol_get_req_alloc(void)
12362d7be507SJakub Kicinski {
12372d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_wol_get_req));
12382d7be507SJakub Kicinski }
12392d7be507SJakub Kicinski void ethtool_wol_get_req_free(struct ethtool_wol_get_req *req);
12402d7be507SJakub Kicinski 
12412d7be507SJakub Kicinski static inline void
ethtool_wol_get_req_set_header_dev_index(struct ethtool_wol_get_req * req,__u32 dev_index)12422d7be507SJakub Kicinski ethtool_wol_get_req_set_header_dev_index(struct ethtool_wol_get_req *req,
12432d7be507SJakub Kicinski 					 __u32 dev_index)
12442d7be507SJakub Kicinski {
12452d7be507SJakub Kicinski 	req->_present.header = 1;
12462d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
12472d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
12482d7be507SJakub Kicinski }
12492d7be507SJakub Kicinski static inline void
ethtool_wol_get_req_set_header_dev_name(struct ethtool_wol_get_req * req,const char * dev_name)12502d7be507SJakub Kicinski ethtool_wol_get_req_set_header_dev_name(struct ethtool_wol_get_req *req,
12512d7be507SJakub Kicinski 					const char *dev_name)
12522d7be507SJakub Kicinski {
12532d7be507SJakub Kicinski 	free(req->header.dev_name);
12542d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
12552d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
12562d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
12572d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
12582d7be507SJakub Kicinski }
12592d7be507SJakub Kicinski static inline void
ethtool_wol_get_req_set_header_flags(struct ethtool_wol_get_req * req,__u32 flags)12602d7be507SJakub Kicinski ethtool_wol_get_req_set_header_flags(struct ethtool_wol_get_req *req,
12612d7be507SJakub Kicinski 				     __u32 flags)
12622d7be507SJakub Kicinski {
12632d7be507SJakub Kicinski 	req->_present.header = 1;
12642d7be507SJakub Kicinski 	req->header._present.flags = 1;
12652d7be507SJakub Kicinski 	req->header.flags = flags;
12662d7be507SJakub Kicinski }
12672d7be507SJakub Kicinski 
12682d7be507SJakub Kicinski struct ethtool_wol_get_rsp {
12692d7be507SJakub Kicinski 	struct {
12702d7be507SJakub Kicinski 		__u32 header:1;
12712d7be507SJakub Kicinski 		__u32 modes:1;
12722d7be507SJakub Kicinski 		__u32 sopass_len;
12732d7be507SJakub Kicinski 	} _present;
12742d7be507SJakub Kicinski 
12752d7be507SJakub Kicinski 	struct ethtool_header header;
12762d7be507SJakub Kicinski 	struct ethtool_bitset modes;
12772d7be507SJakub Kicinski 	void *sopass;
12782d7be507SJakub Kicinski };
12792d7be507SJakub Kicinski 
12802d7be507SJakub Kicinski void ethtool_wol_get_rsp_free(struct ethtool_wol_get_rsp *rsp);
12812d7be507SJakub Kicinski 
12822d7be507SJakub Kicinski /*
12832d7be507SJakub Kicinski  * Get WOL params.
12842d7be507SJakub Kicinski  */
12852d7be507SJakub Kicinski struct ethtool_wol_get_rsp *
12862d7be507SJakub Kicinski ethtool_wol_get(struct ynl_sock *ys, struct ethtool_wol_get_req *req);
12872d7be507SJakub Kicinski 
12882d7be507SJakub Kicinski /* ETHTOOL_MSG_WOL_GET - dump */
12892d7be507SJakub Kicinski struct ethtool_wol_get_req_dump {
12902d7be507SJakub Kicinski 	struct {
12912d7be507SJakub Kicinski 		__u32 header:1;
12922d7be507SJakub Kicinski 	} _present;
12932d7be507SJakub Kicinski 
12942d7be507SJakub Kicinski 	struct ethtool_header header;
12952d7be507SJakub Kicinski };
12962d7be507SJakub Kicinski 
12972d7be507SJakub Kicinski static inline struct ethtool_wol_get_req_dump *
ethtool_wol_get_req_dump_alloc(void)12982d7be507SJakub Kicinski ethtool_wol_get_req_dump_alloc(void)
12992d7be507SJakub Kicinski {
13002d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_wol_get_req_dump));
13012d7be507SJakub Kicinski }
13022d7be507SJakub Kicinski void ethtool_wol_get_req_dump_free(struct ethtool_wol_get_req_dump *req);
13032d7be507SJakub Kicinski 
13042d7be507SJakub Kicinski static inline void
ethtool_wol_get_req_dump_set_header_dev_index(struct ethtool_wol_get_req_dump * req,__u32 dev_index)13052d7be507SJakub Kicinski ethtool_wol_get_req_dump_set_header_dev_index(struct ethtool_wol_get_req_dump *req,
13062d7be507SJakub Kicinski 					      __u32 dev_index)
13072d7be507SJakub Kicinski {
13082d7be507SJakub Kicinski 	req->_present.header = 1;
13092d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
13102d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
13112d7be507SJakub Kicinski }
13122d7be507SJakub Kicinski static inline void
ethtool_wol_get_req_dump_set_header_dev_name(struct ethtool_wol_get_req_dump * req,const char * dev_name)13132d7be507SJakub Kicinski ethtool_wol_get_req_dump_set_header_dev_name(struct ethtool_wol_get_req_dump *req,
13142d7be507SJakub Kicinski 					     const char *dev_name)
13152d7be507SJakub Kicinski {
13162d7be507SJakub Kicinski 	free(req->header.dev_name);
13172d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
13182d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
13192d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
13202d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
13212d7be507SJakub Kicinski }
13222d7be507SJakub Kicinski static inline void
ethtool_wol_get_req_dump_set_header_flags(struct ethtool_wol_get_req_dump * req,__u32 flags)13232d7be507SJakub Kicinski ethtool_wol_get_req_dump_set_header_flags(struct ethtool_wol_get_req_dump *req,
13242d7be507SJakub Kicinski 					  __u32 flags)
13252d7be507SJakub Kicinski {
13262d7be507SJakub Kicinski 	req->_present.header = 1;
13272d7be507SJakub Kicinski 	req->header._present.flags = 1;
13282d7be507SJakub Kicinski 	req->header.flags = flags;
13292d7be507SJakub Kicinski }
13302d7be507SJakub Kicinski 
13312d7be507SJakub Kicinski struct ethtool_wol_get_list {
13322d7be507SJakub Kicinski 	struct ethtool_wol_get_list *next;
13332d7be507SJakub Kicinski 	struct ethtool_wol_get_rsp obj __attribute__ ((aligned (8)));
13342d7be507SJakub Kicinski };
13352d7be507SJakub Kicinski 
13362d7be507SJakub Kicinski void ethtool_wol_get_list_free(struct ethtool_wol_get_list *rsp);
13372d7be507SJakub Kicinski 
13382d7be507SJakub Kicinski struct ethtool_wol_get_list *
13392d7be507SJakub Kicinski ethtool_wol_get_dump(struct ynl_sock *ys, struct ethtool_wol_get_req_dump *req);
13402d7be507SJakub Kicinski 
13412d7be507SJakub Kicinski /* ETHTOOL_MSG_WOL_GET - notify */
13422d7be507SJakub Kicinski struct ethtool_wol_get_ntf {
13432d7be507SJakub Kicinski 	__u16 family;
13442d7be507SJakub Kicinski 	__u8 cmd;
13452d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
13462d7be507SJakub Kicinski 	void (*free)(struct ethtool_wol_get_ntf *ntf);
13472d7be507SJakub Kicinski 	struct ethtool_wol_get_rsp obj __attribute__ ((aligned (8)));
13482d7be507SJakub Kicinski };
13492d7be507SJakub Kicinski 
13502d7be507SJakub Kicinski void ethtool_wol_get_ntf_free(struct ethtool_wol_get_ntf *rsp);
13512d7be507SJakub Kicinski 
13522d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_WOL_SET ============== */
13532d7be507SJakub Kicinski /* ETHTOOL_MSG_WOL_SET - do */
13542d7be507SJakub Kicinski struct ethtool_wol_set_req {
13552d7be507SJakub Kicinski 	struct {
13562d7be507SJakub Kicinski 		__u32 header:1;
13572d7be507SJakub Kicinski 		__u32 modes:1;
13582d7be507SJakub Kicinski 		__u32 sopass_len;
13592d7be507SJakub Kicinski 	} _present;
13602d7be507SJakub Kicinski 
13612d7be507SJakub Kicinski 	struct ethtool_header header;
13622d7be507SJakub Kicinski 	struct ethtool_bitset modes;
13632d7be507SJakub Kicinski 	void *sopass;
13642d7be507SJakub Kicinski };
13652d7be507SJakub Kicinski 
ethtool_wol_set_req_alloc(void)13662d7be507SJakub Kicinski static inline struct ethtool_wol_set_req *ethtool_wol_set_req_alloc(void)
13672d7be507SJakub Kicinski {
13682d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_wol_set_req));
13692d7be507SJakub Kicinski }
13702d7be507SJakub Kicinski void ethtool_wol_set_req_free(struct ethtool_wol_set_req *req);
13712d7be507SJakub Kicinski 
13722d7be507SJakub Kicinski static inline void
ethtool_wol_set_req_set_header_dev_index(struct ethtool_wol_set_req * req,__u32 dev_index)13732d7be507SJakub Kicinski ethtool_wol_set_req_set_header_dev_index(struct ethtool_wol_set_req *req,
13742d7be507SJakub Kicinski 					 __u32 dev_index)
13752d7be507SJakub Kicinski {
13762d7be507SJakub Kicinski 	req->_present.header = 1;
13772d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
13782d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
13792d7be507SJakub Kicinski }
13802d7be507SJakub Kicinski static inline void
ethtool_wol_set_req_set_header_dev_name(struct ethtool_wol_set_req * req,const char * dev_name)13812d7be507SJakub Kicinski ethtool_wol_set_req_set_header_dev_name(struct ethtool_wol_set_req *req,
13822d7be507SJakub Kicinski 					const char *dev_name)
13832d7be507SJakub Kicinski {
13842d7be507SJakub Kicinski 	free(req->header.dev_name);
13852d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
13862d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
13872d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
13882d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
13892d7be507SJakub Kicinski }
13902d7be507SJakub Kicinski static inline void
ethtool_wol_set_req_set_header_flags(struct ethtool_wol_set_req * req,__u32 flags)13912d7be507SJakub Kicinski ethtool_wol_set_req_set_header_flags(struct ethtool_wol_set_req *req,
13922d7be507SJakub Kicinski 				     __u32 flags)
13932d7be507SJakub Kicinski {
13942d7be507SJakub Kicinski 	req->_present.header = 1;
13952d7be507SJakub Kicinski 	req->header._present.flags = 1;
13962d7be507SJakub Kicinski 	req->header.flags = flags;
13972d7be507SJakub Kicinski }
13982d7be507SJakub Kicinski static inline void
ethtool_wol_set_req_set_modes_nomask(struct ethtool_wol_set_req * req)13992d7be507SJakub Kicinski ethtool_wol_set_req_set_modes_nomask(struct ethtool_wol_set_req *req)
14002d7be507SJakub Kicinski {
14012d7be507SJakub Kicinski 	req->_present.modes = 1;
14022d7be507SJakub Kicinski 	req->modes._present.nomask = 1;
14032d7be507SJakub Kicinski }
14042d7be507SJakub Kicinski static inline void
ethtool_wol_set_req_set_modes_size(struct ethtool_wol_set_req * req,__u32 size)14052d7be507SJakub Kicinski ethtool_wol_set_req_set_modes_size(struct ethtool_wol_set_req *req, __u32 size)
14062d7be507SJakub Kicinski {
14072d7be507SJakub Kicinski 	req->_present.modes = 1;
14082d7be507SJakub Kicinski 	req->modes._present.size = 1;
14092d7be507SJakub Kicinski 	req->modes.size = size;
14102d7be507SJakub Kicinski }
14112d7be507SJakub Kicinski static inline void
__ethtool_wol_set_req_set_modes_bits_bit(struct ethtool_wol_set_req * req,struct ethtool_bitset_bit * bit,unsigned int n_bit)14122d7be507SJakub Kicinski __ethtool_wol_set_req_set_modes_bits_bit(struct ethtool_wol_set_req *req,
14132d7be507SJakub Kicinski 					 struct ethtool_bitset_bit *bit,
14142d7be507SJakub Kicinski 					 unsigned int n_bit)
14152d7be507SJakub Kicinski {
14162d7be507SJakub Kicinski 	free(req->modes.bits.bit);
14172d7be507SJakub Kicinski 	req->modes.bits.bit = bit;
14182d7be507SJakub Kicinski 	req->modes.bits.n_bit = n_bit;
14192d7be507SJakub Kicinski }
14202d7be507SJakub Kicinski static inline void
ethtool_wol_set_req_set_sopass(struct ethtool_wol_set_req * req,const void * sopass,size_t len)14212d7be507SJakub Kicinski ethtool_wol_set_req_set_sopass(struct ethtool_wol_set_req *req,
14222d7be507SJakub Kicinski 			       const void *sopass, size_t len)
14232d7be507SJakub Kicinski {
14242d7be507SJakub Kicinski 	free(req->sopass);
1425*a149a3a1SJakub Kicinski 	req->_present.sopass_len = len;
14262d7be507SJakub Kicinski 	req->sopass = malloc(req->_present.sopass_len);
14272d7be507SJakub Kicinski 	memcpy(req->sopass, sopass, req->_present.sopass_len);
14282d7be507SJakub Kicinski }
14292d7be507SJakub Kicinski 
14302d7be507SJakub Kicinski /*
14312d7be507SJakub Kicinski  * Set WOL params.
14322d7be507SJakub Kicinski  */
14332d7be507SJakub Kicinski int ethtool_wol_set(struct ynl_sock *ys, struct ethtool_wol_set_req *req);
14342d7be507SJakub Kicinski 
14352d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_FEATURES_GET ============== */
14362d7be507SJakub Kicinski /* ETHTOOL_MSG_FEATURES_GET - do */
14372d7be507SJakub Kicinski struct ethtool_features_get_req {
14382d7be507SJakub Kicinski 	struct {
14392d7be507SJakub Kicinski 		__u32 header:1;
14402d7be507SJakub Kicinski 	} _present;
14412d7be507SJakub Kicinski 
14422d7be507SJakub Kicinski 	struct ethtool_header header;
14432d7be507SJakub Kicinski };
14442d7be507SJakub Kicinski 
14452d7be507SJakub Kicinski static inline struct ethtool_features_get_req *
ethtool_features_get_req_alloc(void)14462d7be507SJakub Kicinski ethtool_features_get_req_alloc(void)
14472d7be507SJakub Kicinski {
14482d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_features_get_req));
14492d7be507SJakub Kicinski }
14502d7be507SJakub Kicinski void ethtool_features_get_req_free(struct ethtool_features_get_req *req);
14512d7be507SJakub Kicinski 
14522d7be507SJakub Kicinski static inline void
ethtool_features_get_req_set_header_dev_index(struct ethtool_features_get_req * req,__u32 dev_index)14532d7be507SJakub Kicinski ethtool_features_get_req_set_header_dev_index(struct ethtool_features_get_req *req,
14542d7be507SJakub Kicinski 					      __u32 dev_index)
14552d7be507SJakub Kicinski {
14562d7be507SJakub Kicinski 	req->_present.header = 1;
14572d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
14582d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
14592d7be507SJakub Kicinski }
14602d7be507SJakub Kicinski static inline void
ethtool_features_get_req_set_header_dev_name(struct ethtool_features_get_req * req,const char * dev_name)14612d7be507SJakub Kicinski ethtool_features_get_req_set_header_dev_name(struct ethtool_features_get_req *req,
14622d7be507SJakub Kicinski 					     const char *dev_name)
14632d7be507SJakub Kicinski {
14642d7be507SJakub Kicinski 	free(req->header.dev_name);
14652d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
14662d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
14672d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
14682d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
14692d7be507SJakub Kicinski }
14702d7be507SJakub Kicinski static inline void
ethtool_features_get_req_set_header_flags(struct ethtool_features_get_req * req,__u32 flags)14712d7be507SJakub Kicinski ethtool_features_get_req_set_header_flags(struct ethtool_features_get_req *req,
14722d7be507SJakub Kicinski 					  __u32 flags)
14732d7be507SJakub Kicinski {
14742d7be507SJakub Kicinski 	req->_present.header = 1;
14752d7be507SJakub Kicinski 	req->header._present.flags = 1;
14762d7be507SJakub Kicinski 	req->header.flags = flags;
14772d7be507SJakub Kicinski }
14782d7be507SJakub Kicinski 
14792d7be507SJakub Kicinski struct ethtool_features_get_rsp {
14802d7be507SJakub Kicinski 	struct {
14812d7be507SJakub Kicinski 		__u32 header:1;
14822d7be507SJakub Kicinski 		__u32 hw:1;
14832d7be507SJakub Kicinski 		__u32 wanted:1;
14842d7be507SJakub Kicinski 		__u32 active:1;
14852d7be507SJakub Kicinski 		__u32 nochange:1;
14862d7be507SJakub Kicinski 	} _present;
14872d7be507SJakub Kicinski 
14882d7be507SJakub Kicinski 	struct ethtool_header header;
14892d7be507SJakub Kicinski 	struct ethtool_bitset hw;
14902d7be507SJakub Kicinski 	struct ethtool_bitset wanted;
14912d7be507SJakub Kicinski 	struct ethtool_bitset active;
14922d7be507SJakub Kicinski 	struct ethtool_bitset nochange;
14932d7be507SJakub Kicinski };
14942d7be507SJakub Kicinski 
14952d7be507SJakub Kicinski void ethtool_features_get_rsp_free(struct ethtool_features_get_rsp *rsp);
14962d7be507SJakub Kicinski 
14972d7be507SJakub Kicinski /*
14982d7be507SJakub Kicinski  * Get features.
14992d7be507SJakub Kicinski  */
15002d7be507SJakub Kicinski struct ethtool_features_get_rsp *
15012d7be507SJakub Kicinski ethtool_features_get(struct ynl_sock *ys, struct ethtool_features_get_req *req);
15022d7be507SJakub Kicinski 
15032d7be507SJakub Kicinski /* ETHTOOL_MSG_FEATURES_GET - dump */
15042d7be507SJakub Kicinski struct ethtool_features_get_req_dump {
15052d7be507SJakub Kicinski 	struct {
15062d7be507SJakub Kicinski 		__u32 header:1;
15072d7be507SJakub Kicinski 	} _present;
15082d7be507SJakub Kicinski 
15092d7be507SJakub Kicinski 	struct ethtool_header header;
15102d7be507SJakub Kicinski };
15112d7be507SJakub Kicinski 
15122d7be507SJakub Kicinski static inline struct ethtool_features_get_req_dump *
ethtool_features_get_req_dump_alloc(void)15132d7be507SJakub Kicinski ethtool_features_get_req_dump_alloc(void)
15142d7be507SJakub Kicinski {
15152d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_features_get_req_dump));
15162d7be507SJakub Kicinski }
15172d7be507SJakub Kicinski void
15182d7be507SJakub Kicinski ethtool_features_get_req_dump_free(struct ethtool_features_get_req_dump *req);
15192d7be507SJakub Kicinski 
15202d7be507SJakub Kicinski static inline void
ethtool_features_get_req_dump_set_header_dev_index(struct ethtool_features_get_req_dump * req,__u32 dev_index)15212d7be507SJakub Kicinski ethtool_features_get_req_dump_set_header_dev_index(struct ethtool_features_get_req_dump *req,
15222d7be507SJakub Kicinski 						   __u32 dev_index)
15232d7be507SJakub Kicinski {
15242d7be507SJakub Kicinski 	req->_present.header = 1;
15252d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
15262d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
15272d7be507SJakub Kicinski }
15282d7be507SJakub Kicinski static inline void
ethtool_features_get_req_dump_set_header_dev_name(struct ethtool_features_get_req_dump * req,const char * dev_name)15292d7be507SJakub Kicinski ethtool_features_get_req_dump_set_header_dev_name(struct ethtool_features_get_req_dump *req,
15302d7be507SJakub Kicinski 						  const char *dev_name)
15312d7be507SJakub Kicinski {
15322d7be507SJakub Kicinski 	free(req->header.dev_name);
15332d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
15342d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
15352d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
15362d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
15372d7be507SJakub Kicinski }
15382d7be507SJakub Kicinski static inline void
ethtool_features_get_req_dump_set_header_flags(struct ethtool_features_get_req_dump * req,__u32 flags)15392d7be507SJakub Kicinski ethtool_features_get_req_dump_set_header_flags(struct ethtool_features_get_req_dump *req,
15402d7be507SJakub Kicinski 					       __u32 flags)
15412d7be507SJakub Kicinski {
15422d7be507SJakub Kicinski 	req->_present.header = 1;
15432d7be507SJakub Kicinski 	req->header._present.flags = 1;
15442d7be507SJakub Kicinski 	req->header.flags = flags;
15452d7be507SJakub Kicinski }
15462d7be507SJakub Kicinski 
15472d7be507SJakub Kicinski struct ethtool_features_get_list {
15482d7be507SJakub Kicinski 	struct ethtool_features_get_list *next;
15492d7be507SJakub Kicinski 	struct ethtool_features_get_rsp obj __attribute__ ((aligned (8)));
15502d7be507SJakub Kicinski };
15512d7be507SJakub Kicinski 
15522d7be507SJakub Kicinski void ethtool_features_get_list_free(struct ethtool_features_get_list *rsp);
15532d7be507SJakub Kicinski 
15542d7be507SJakub Kicinski struct ethtool_features_get_list *
15552d7be507SJakub Kicinski ethtool_features_get_dump(struct ynl_sock *ys,
15562d7be507SJakub Kicinski 			  struct ethtool_features_get_req_dump *req);
15572d7be507SJakub Kicinski 
15582d7be507SJakub Kicinski /* ETHTOOL_MSG_FEATURES_GET - notify */
15592d7be507SJakub Kicinski struct ethtool_features_get_ntf {
15602d7be507SJakub Kicinski 	__u16 family;
15612d7be507SJakub Kicinski 	__u8 cmd;
15622d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
15632d7be507SJakub Kicinski 	void (*free)(struct ethtool_features_get_ntf *ntf);
15642d7be507SJakub Kicinski 	struct ethtool_features_get_rsp obj __attribute__ ((aligned (8)));
15652d7be507SJakub Kicinski };
15662d7be507SJakub Kicinski 
15672d7be507SJakub Kicinski void ethtool_features_get_ntf_free(struct ethtool_features_get_ntf *rsp);
15682d7be507SJakub Kicinski 
15692d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_FEATURES_SET ============== */
15702d7be507SJakub Kicinski /* ETHTOOL_MSG_FEATURES_SET - do */
15712d7be507SJakub Kicinski struct ethtool_features_set_req {
15722d7be507SJakub Kicinski 	struct {
15732d7be507SJakub Kicinski 		__u32 header:1;
15742d7be507SJakub Kicinski 		__u32 hw:1;
15752d7be507SJakub Kicinski 		__u32 wanted:1;
15762d7be507SJakub Kicinski 		__u32 active:1;
15772d7be507SJakub Kicinski 		__u32 nochange:1;
15782d7be507SJakub Kicinski 	} _present;
15792d7be507SJakub Kicinski 
15802d7be507SJakub Kicinski 	struct ethtool_header header;
15812d7be507SJakub Kicinski 	struct ethtool_bitset hw;
15822d7be507SJakub Kicinski 	struct ethtool_bitset wanted;
15832d7be507SJakub Kicinski 	struct ethtool_bitset active;
15842d7be507SJakub Kicinski 	struct ethtool_bitset nochange;
15852d7be507SJakub Kicinski };
15862d7be507SJakub Kicinski 
15872d7be507SJakub Kicinski static inline struct ethtool_features_set_req *
ethtool_features_set_req_alloc(void)15882d7be507SJakub Kicinski ethtool_features_set_req_alloc(void)
15892d7be507SJakub Kicinski {
15902d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_features_set_req));
15912d7be507SJakub Kicinski }
15922d7be507SJakub Kicinski void ethtool_features_set_req_free(struct ethtool_features_set_req *req);
15932d7be507SJakub Kicinski 
15942d7be507SJakub Kicinski static inline void
ethtool_features_set_req_set_header_dev_index(struct ethtool_features_set_req * req,__u32 dev_index)15952d7be507SJakub Kicinski ethtool_features_set_req_set_header_dev_index(struct ethtool_features_set_req *req,
15962d7be507SJakub Kicinski 					      __u32 dev_index)
15972d7be507SJakub Kicinski {
15982d7be507SJakub Kicinski 	req->_present.header = 1;
15992d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
16002d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
16012d7be507SJakub Kicinski }
16022d7be507SJakub Kicinski static inline void
ethtool_features_set_req_set_header_dev_name(struct ethtool_features_set_req * req,const char * dev_name)16032d7be507SJakub Kicinski ethtool_features_set_req_set_header_dev_name(struct ethtool_features_set_req *req,
16042d7be507SJakub Kicinski 					     const char *dev_name)
16052d7be507SJakub Kicinski {
16062d7be507SJakub Kicinski 	free(req->header.dev_name);
16072d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
16082d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
16092d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
16102d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
16112d7be507SJakub Kicinski }
16122d7be507SJakub Kicinski static inline void
ethtool_features_set_req_set_header_flags(struct ethtool_features_set_req * req,__u32 flags)16132d7be507SJakub Kicinski ethtool_features_set_req_set_header_flags(struct ethtool_features_set_req *req,
16142d7be507SJakub Kicinski 					  __u32 flags)
16152d7be507SJakub Kicinski {
16162d7be507SJakub Kicinski 	req->_present.header = 1;
16172d7be507SJakub Kicinski 	req->header._present.flags = 1;
16182d7be507SJakub Kicinski 	req->header.flags = flags;
16192d7be507SJakub Kicinski }
16202d7be507SJakub Kicinski static inline void
ethtool_features_set_req_set_hw_nomask(struct ethtool_features_set_req * req)16212d7be507SJakub Kicinski ethtool_features_set_req_set_hw_nomask(struct ethtool_features_set_req *req)
16222d7be507SJakub Kicinski {
16232d7be507SJakub Kicinski 	req->_present.hw = 1;
16242d7be507SJakub Kicinski 	req->hw._present.nomask = 1;
16252d7be507SJakub Kicinski }
16262d7be507SJakub Kicinski static inline void
ethtool_features_set_req_set_hw_size(struct ethtool_features_set_req * req,__u32 size)16272d7be507SJakub Kicinski ethtool_features_set_req_set_hw_size(struct ethtool_features_set_req *req,
16282d7be507SJakub Kicinski 				     __u32 size)
16292d7be507SJakub Kicinski {
16302d7be507SJakub Kicinski 	req->_present.hw = 1;
16312d7be507SJakub Kicinski 	req->hw._present.size = 1;
16322d7be507SJakub Kicinski 	req->hw.size = size;
16332d7be507SJakub Kicinski }
16342d7be507SJakub Kicinski static inline void
__ethtool_features_set_req_set_hw_bits_bit(struct ethtool_features_set_req * req,struct ethtool_bitset_bit * bit,unsigned int n_bit)16352d7be507SJakub Kicinski __ethtool_features_set_req_set_hw_bits_bit(struct ethtool_features_set_req *req,
16362d7be507SJakub Kicinski 					   struct ethtool_bitset_bit *bit,
16372d7be507SJakub Kicinski 					   unsigned int n_bit)
16382d7be507SJakub Kicinski {
16392d7be507SJakub Kicinski 	free(req->hw.bits.bit);
16402d7be507SJakub Kicinski 	req->hw.bits.bit = bit;
16412d7be507SJakub Kicinski 	req->hw.bits.n_bit = n_bit;
16422d7be507SJakub Kicinski }
16432d7be507SJakub Kicinski static inline void
ethtool_features_set_req_set_wanted_nomask(struct ethtool_features_set_req * req)16442d7be507SJakub Kicinski ethtool_features_set_req_set_wanted_nomask(struct ethtool_features_set_req *req)
16452d7be507SJakub Kicinski {
16462d7be507SJakub Kicinski 	req->_present.wanted = 1;
16472d7be507SJakub Kicinski 	req->wanted._present.nomask = 1;
16482d7be507SJakub Kicinski }
16492d7be507SJakub Kicinski static inline void
ethtool_features_set_req_set_wanted_size(struct ethtool_features_set_req * req,__u32 size)16502d7be507SJakub Kicinski ethtool_features_set_req_set_wanted_size(struct ethtool_features_set_req *req,
16512d7be507SJakub Kicinski 					 __u32 size)
16522d7be507SJakub Kicinski {
16532d7be507SJakub Kicinski 	req->_present.wanted = 1;
16542d7be507SJakub Kicinski 	req->wanted._present.size = 1;
16552d7be507SJakub Kicinski 	req->wanted.size = size;
16562d7be507SJakub Kicinski }
16572d7be507SJakub Kicinski static inline void
__ethtool_features_set_req_set_wanted_bits_bit(struct ethtool_features_set_req * req,struct ethtool_bitset_bit * bit,unsigned int n_bit)16582d7be507SJakub Kicinski __ethtool_features_set_req_set_wanted_bits_bit(struct ethtool_features_set_req *req,
16592d7be507SJakub Kicinski 					       struct ethtool_bitset_bit *bit,
16602d7be507SJakub Kicinski 					       unsigned int n_bit)
16612d7be507SJakub Kicinski {
16622d7be507SJakub Kicinski 	free(req->wanted.bits.bit);
16632d7be507SJakub Kicinski 	req->wanted.bits.bit = bit;
16642d7be507SJakub Kicinski 	req->wanted.bits.n_bit = n_bit;
16652d7be507SJakub Kicinski }
16662d7be507SJakub Kicinski static inline void
ethtool_features_set_req_set_active_nomask(struct ethtool_features_set_req * req)16672d7be507SJakub Kicinski ethtool_features_set_req_set_active_nomask(struct ethtool_features_set_req *req)
16682d7be507SJakub Kicinski {
16692d7be507SJakub Kicinski 	req->_present.active = 1;
16702d7be507SJakub Kicinski 	req->active._present.nomask = 1;
16712d7be507SJakub Kicinski }
16722d7be507SJakub Kicinski static inline void
ethtool_features_set_req_set_active_size(struct ethtool_features_set_req * req,__u32 size)16732d7be507SJakub Kicinski ethtool_features_set_req_set_active_size(struct ethtool_features_set_req *req,
16742d7be507SJakub Kicinski 					 __u32 size)
16752d7be507SJakub Kicinski {
16762d7be507SJakub Kicinski 	req->_present.active = 1;
16772d7be507SJakub Kicinski 	req->active._present.size = 1;
16782d7be507SJakub Kicinski 	req->active.size = size;
16792d7be507SJakub Kicinski }
16802d7be507SJakub Kicinski static inline void
__ethtool_features_set_req_set_active_bits_bit(struct ethtool_features_set_req * req,struct ethtool_bitset_bit * bit,unsigned int n_bit)16812d7be507SJakub Kicinski __ethtool_features_set_req_set_active_bits_bit(struct ethtool_features_set_req *req,
16822d7be507SJakub Kicinski 					       struct ethtool_bitset_bit *bit,
16832d7be507SJakub Kicinski 					       unsigned int n_bit)
16842d7be507SJakub Kicinski {
16852d7be507SJakub Kicinski 	free(req->active.bits.bit);
16862d7be507SJakub Kicinski 	req->active.bits.bit = bit;
16872d7be507SJakub Kicinski 	req->active.bits.n_bit = n_bit;
16882d7be507SJakub Kicinski }
16892d7be507SJakub Kicinski static inline void
ethtool_features_set_req_set_nochange_nomask(struct ethtool_features_set_req * req)16902d7be507SJakub Kicinski ethtool_features_set_req_set_nochange_nomask(struct ethtool_features_set_req *req)
16912d7be507SJakub Kicinski {
16922d7be507SJakub Kicinski 	req->_present.nochange = 1;
16932d7be507SJakub Kicinski 	req->nochange._present.nomask = 1;
16942d7be507SJakub Kicinski }
16952d7be507SJakub Kicinski static inline void
ethtool_features_set_req_set_nochange_size(struct ethtool_features_set_req * req,__u32 size)16962d7be507SJakub Kicinski ethtool_features_set_req_set_nochange_size(struct ethtool_features_set_req *req,
16972d7be507SJakub Kicinski 					   __u32 size)
16982d7be507SJakub Kicinski {
16992d7be507SJakub Kicinski 	req->_present.nochange = 1;
17002d7be507SJakub Kicinski 	req->nochange._present.size = 1;
17012d7be507SJakub Kicinski 	req->nochange.size = size;
17022d7be507SJakub Kicinski }
17032d7be507SJakub Kicinski static inline void
__ethtool_features_set_req_set_nochange_bits_bit(struct ethtool_features_set_req * req,struct ethtool_bitset_bit * bit,unsigned int n_bit)17042d7be507SJakub Kicinski __ethtool_features_set_req_set_nochange_bits_bit(struct ethtool_features_set_req *req,
17052d7be507SJakub Kicinski 						 struct ethtool_bitset_bit *bit,
17062d7be507SJakub Kicinski 						 unsigned int n_bit)
17072d7be507SJakub Kicinski {
17082d7be507SJakub Kicinski 	free(req->nochange.bits.bit);
17092d7be507SJakub Kicinski 	req->nochange.bits.bit = bit;
17102d7be507SJakub Kicinski 	req->nochange.bits.n_bit = n_bit;
17112d7be507SJakub Kicinski }
17122d7be507SJakub Kicinski 
17132d7be507SJakub Kicinski struct ethtool_features_set_rsp {
17142d7be507SJakub Kicinski 	struct {
17152d7be507SJakub Kicinski 		__u32 header:1;
17162d7be507SJakub Kicinski 		__u32 hw:1;
17172d7be507SJakub Kicinski 		__u32 wanted:1;
17182d7be507SJakub Kicinski 		__u32 active:1;
17192d7be507SJakub Kicinski 		__u32 nochange:1;
17202d7be507SJakub Kicinski 	} _present;
17212d7be507SJakub Kicinski 
17222d7be507SJakub Kicinski 	struct ethtool_header header;
17232d7be507SJakub Kicinski 	struct ethtool_bitset hw;
17242d7be507SJakub Kicinski 	struct ethtool_bitset wanted;
17252d7be507SJakub Kicinski 	struct ethtool_bitset active;
17262d7be507SJakub Kicinski 	struct ethtool_bitset nochange;
17272d7be507SJakub Kicinski };
17282d7be507SJakub Kicinski 
17292d7be507SJakub Kicinski void ethtool_features_set_rsp_free(struct ethtool_features_set_rsp *rsp);
17302d7be507SJakub Kicinski 
17312d7be507SJakub Kicinski /*
17322d7be507SJakub Kicinski  * Set features.
17332d7be507SJakub Kicinski  */
17342d7be507SJakub Kicinski struct ethtool_features_set_rsp *
17352d7be507SJakub Kicinski ethtool_features_set(struct ynl_sock *ys, struct ethtool_features_set_req *req);
17362d7be507SJakub Kicinski 
17372d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_PRIVFLAGS_GET ============== */
17382d7be507SJakub Kicinski /* ETHTOOL_MSG_PRIVFLAGS_GET - do */
17392d7be507SJakub Kicinski struct ethtool_privflags_get_req {
17402d7be507SJakub Kicinski 	struct {
17412d7be507SJakub Kicinski 		__u32 header:1;
17422d7be507SJakub Kicinski 	} _present;
17432d7be507SJakub Kicinski 
17442d7be507SJakub Kicinski 	struct ethtool_header header;
17452d7be507SJakub Kicinski };
17462d7be507SJakub Kicinski 
17472d7be507SJakub Kicinski static inline struct ethtool_privflags_get_req *
ethtool_privflags_get_req_alloc(void)17482d7be507SJakub Kicinski ethtool_privflags_get_req_alloc(void)
17492d7be507SJakub Kicinski {
17502d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_privflags_get_req));
17512d7be507SJakub Kicinski }
17522d7be507SJakub Kicinski void ethtool_privflags_get_req_free(struct ethtool_privflags_get_req *req);
17532d7be507SJakub Kicinski 
17542d7be507SJakub Kicinski static inline void
ethtool_privflags_get_req_set_header_dev_index(struct ethtool_privflags_get_req * req,__u32 dev_index)17552d7be507SJakub Kicinski ethtool_privflags_get_req_set_header_dev_index(struct ethtool_privflags_get_req *req,
17562d7be507SJakub Kicinski 					       __u32 dev_index)
17572d7be507SJakub Kicinski {
17582d7be507SJakub Kicinski 	req->_present.header = 1;
17592d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
17602d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
17612d7be507SJakub Kicinski }
17622d7be507SJakub Kicinski static inline void
ethtool_privflags_get_req_set_header_dev_name(struct ethtool_privflags_get_req * req,const char * dev_name)17632d7be507SJakub Kicinski ethtool_privflags_get_req_set_header_dev_name(struct ethtool_privflags_get_req *req,
17642d7be507SJakub Kicinski 					      const char *dev_name)
17652d7be507SJakub Kicinski {
17662d7be507SJakub Kicinski 	free(req->header.dev_name);
17672d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
17682d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
17692d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
17702d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
17712d7be507SJakub Kicinski }
17722d7be507SJakub Kicinski static inline void
ethtool_privflags_get_req_set_header_flags(struct ethtool_privflags_get_req * req,__u32 flags)17732d7be507SJakub Kicinski ethtool_privflags_get_req_set_header_flags(struct ethtool_privflags_get_req *req,
17742d7be507SJakub Kicinski 					   __u32 flags)
17752d7be507SJakub Kicinski {
17762d7be507SJakub Kicinski 	req->_present.header = 1;
17772d7be507SJakub Kicinski 	req->header._present.flags = 1;
17782d7be507SJakub Kicinski 	req->header.flags = flags;
17792d7be507SJakub Kicinski }
17802d7be507SJakub Kicinski 
17812d7be507SJakub Kicinski struct ethtool_privflags_get_rsp {
17822d7be507SJakub Kicinski 	struct {
17832d7be507SJakub Kicinski 		__u32 header:1;
17842d7be507SJakub Kicinski 		__u32 flags:1;
17852d7be507SJakub Kicinski 	} _present;
17862d7be507SJakub Kicinski 
17872d7be507SJakub Kicinski 	struct ethtool_header header;
17882d7be507SJakub Kicinski 	struct ethtool_bitset flags;
17892d7be507SJakub Kicinski };
17902d7be507SJakub Kicinski 
17912d7be507SJakub Kicinski void ethtool_privflags_get_rsp_free(struct ethtool_privflags_get_rsp *rsp);
17922d7be507SJakub Kicinski 
17932d7be507SJakub Kicinski /*
17942d7be507SJakub Kicinski  * Get device private flags.
17952d7be507SJakub Kicinski  */
17962d7be507SJakub Kicinski struct ethtool_privflags_get_rsp *
17972d7be507SJakub Kicinski ethtool_privflags_get(struct ynl_sock *ys,
17982d7be507SJakub Kicinski 		      struct ethtool_privflags_get_req *req);
17992d7be507SJakub Kicinski 
18002d7be507SJakub Kicinski /* ETHTOOL_MSG_PRIVFLAGS_GET - dump */
18012d7be507SJakub Kicinski struct ethtool_privflags_get_req_dump {
18022d7be507SJakub Kicinski 	struct {
18032d7be507SJakub Kicinski 		__u32 header:1;
18042d7be507SJakub Kicinski 	} _present;
18052d7be507SJakub Kicinski 
18062d7be507SJakub Kicinski 	struct ethtool_header header;
18072d7be507SJakub Kicinski };
18082d7be507SJakub Kicinski 
18092d7be507SJakub Kicinski static inline struct ethtool_privflags_get_req_dump *
ethtool_privflags_get_req_dump_alloc(void)18102d7be507SJakub Kicinski ethtool_privflags_get_req_dump_alloc(void)
18112d7be507SJakub Kicinski {
18122d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_privflags_get_req_dump));
18132d7be507SJakub Kicinski }
18142d7be507SJakub Kicinski void
18152d7be507SJakub Kicinski ethtool_privflags_get_req_dump_free(struct ethtool_privflags_get_req_dump *req);
18162d7be507SJakub Kicinski 
18172d7be507SJakub Kicinski static inline void
ethtool_privflags_get_req_dump_set_header_dev_index(struct ethtool_privflags_get_req_dump * req,__u32 dev_index)18182d7be507SJakub Kicinski ethtool_privflags_get_req_dump_set_header_dev_index(struct ethtool_privflags_get_req_dump *req,
18192d7be507SJakub Kicinski 						    __u32 dev_index)
18202d7be507SJakub Kicinski {
18212d7be507SJakub Kicinski 	req->_present.header = 1;
18222d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
18232d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
18242d7be507SJakub Kicinski }
18252d7be507SJakub Kicinski static inline void
ethtool_privflags_get_req_dump_set_header_dev_name(struct ethtool_privflags_get_req_dump * req,const char * dev_name)18262d7be507SJakub Kicinski ethtool_privflags_get_req_dump_set_header_dev_name(struct ethtool_privflags_get_req_dump *req,
18272d7be507SJakub Kicinski 						   const char *dev_name)
18282d7be507SJakub Kicinski {
18292d7be507SJakub Kicinski 	free(req->header.dev_name);
18302d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
18312d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
18322d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
18332d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
18342d7be507SJakub Kicinski }
18352d7be507SJakub Kicinski static inline void
ethtool_privflags_get_req_dump_set_header_flags(struct ethtool_privflags_get_req_dump * req,__u32 flags)18362d7be507SJakub Kicinski ethtool_privflags_get_req_dump_set_header_flags(struct ethtool_privflags_get_req_dump *req,
18372d7be507SJakub Kicinski 						__u32 flags)
18382d7be507SJakub Kicinski {
18392d7be507SJakub Kicinski 	req->_present.header = 1;
18402d7be507SJakub Kicinski 	req->header._present.flags = 1;
18412d7be507SJakub Kicinski 	req->header.flags = flags;
18422d7be507SJakub Kicinski }
18432d7be507SJakub Kicinski 
18442d7be507SJakub Kicinski struct ethtool_privflags_get_list {
18452d7be507SJakub Kicinski 	struct ethtool_privflags_get_list *next;
18462d7be507SJakub Kicinski 	struct ethtool_privflags_get_rsp obj __attribute__ ((aligned (8)));
18472d7be507SJakub Kicinski };
18482d7be507SJakub Kicinski 
18492d7be507SJakub Kicinski void ethtool_privflags_get_list_free(struct ethtool_privflags_get_list *rsp);
18502d7be507SJakub Kicinski 
18512d7be507SJakub Kicinski struct ethtool_privflags_get_list *
18522d7be507SJakub Kicinski ethtool_privflags_get_dump(struct ynl_sock *ys,
18532d7be507SJakub Kicinski 			   struct ethtool_privflags_get_req_dump *req);
18542d7be507SJakub Kicinski 
18552d7be507SJakub Kicinski /* ETHTOOL_MSG_PRIVFLAGS_GET - notify */
18562d7be507SJakub Kicinski struct ethtool_privflags_get_ntf {
18572d7be507SJakub Kicinski 	__u16 family;
18582d7be507SJakub Kicinski 	__u8 cmd;
18592d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
18602d7be507SJakub Kicinski 	void (*free)(struct ethtool_privflags_get_ntf *ntf);
18612d7be507SJakub Kicinski 	struct ethtool_privflags_get_rsp obj __attribute__ ((aligned (8)));
18622d7be507SJakub Kicinski };
18632d7be507SJakub Kicinski 
18642d7be507SJakub Kicinski void ethtool_privflags_get_ntf_free(struct ethtool_privflags_get_ntf *rsp);
18652d7be507SJakub Kicinski 
18662d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_PRIVFLAGS_SET ============== */
18672d7be507SJakub Kicinski /* ETHTOOL_MSG_PRIVFLAGS_SET - do */
18682d7be507SJakub Kicinski struct ethtool_privflags_set_req {
18692d7be507SJakub Kicinski 	struct {
18702d7be507SJakub Kicinski 		__u32 header:1;
18712d7be507SJakub Kicinski 		__u32 flags:1;
18722d7be507SJakub Kicinski 	} _present;
18732d7be507SJakub Kicinski 
18742d7be507SJakub Kicinski 	struct ethtool_header header;
18752d7be507SJakub Kicinski 	struct ethtool_bitset flags;
18762d7be507SJakub Kicinski };
18772d7be507SJakub Kicinski 
18782d7be507SJakub Kicinski static inline struct ethtool_privflags_set_req *
ethtool_privflags_set_req_alloc(void)18792d7be507SJakub Kicinski ethtool_privflags_set_req_alloc(void)
18802d7be507SJakub Kicinski {
18812d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_privflags_set_req));
18822d7be507SJakub Kicinski }
18832d7be507SJakub Kicinski void ethtool_privflags_set_req_free(struct ethtool_privflags_set_req *req);
18842d7be507SJakub Kicinski 
18852d7be507SJakub Kicinski static inline void
ethtool_privflags_set_req_set_header_dev_index(struct ethtool_privflags_set_req * req,__u32 dev_index)18862d7be507SJakub Kicinski ethtool_privflags_set_req_set_header_dev_index(struct ethtool_privflags_set_req *req,
18872d7be507SJakub Kicinski 					       __u32 dev_index)
18882d7be507SJakub Kicinski {
18892d7be507SJakub Kicinski 	req->_present.header = 1;
18902d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
18912d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
18922d7be507SJakub Kicinski }
18932d7be507SJakub Kicinski static inline void
ethtool_privflags_set_req_set_header_dev_name(struct ethtool_privflags_set_req * req,const char * dev_name)18942d7be507SJakub Kicinski ethtool_privflags_set_req_set_header_dev_name(struct ethtool_privflags_set_req *req,
18952d7be507SJakub Kicinski 					      const char *dev_name)
18962d7be507SJakub Kicinski {
18972d7be507SJakub Kicinski 	free(req->header.dev_name);
18982d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
18992d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
19002d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
19012d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
19022d7be507SJakub Kicinski }
19032d7be507SJakub Kicinski static inline void
ethtool_privflags_set_req_set_header_flags(struct ethtool_privflags_set_req * req,__u32 flags)19042d7be507SJakub Kicinski ethtool_privflags_set_req_set_header_flags(struct ethtool_privflags_set_req *req,
19052d7be507SJakub Kicinski 					   __u32 flags)
19062d7be507SJakub Kicinski {
19072d7be507SJakub Kicinski 	req->_present.header = 1;
19082d7be507SJakub Kicinski 	req->header._present.flags = 1;
19092d7be507SJakub Kicinski 	req->header.flags = flags;
19102d7be507SJakub Kicinski }
19112d7be507SJakub Kicinski static inline void
ethtool_privflags_set_req_set_flags_nomask(struct ethtool_privflags_set_req * req)19122d7be507SJakub Kicinski ethtool_privflags_set_req_set_flags_nomask(struct ethtool_privflags_set_req *req)
19132d7be507SJakub Kicinski {
19142d7be507SJakub Kicinski 	req->_present.flags = 1;
19152d7be507SJakub Kicinski 	req->flags._present.nomask = 1;
19162d7be507SJakub Kicinski }
19172d7be507SJakub Kicinski static inline void
ethtool_privflags_set_req_set_flags_size(struct ethtool_privflags_set_req * req,__u32 size)19182d7be507SJakub Kicinski ethtool_privflags_set_req_set_flags_size(struct ethtool_privflags_set_req *req,
19192d7be507SJakub Kicinski 					 __u32 size)
19202d7be507SJakub Kicinski {
19212d7be507SJakub Kicinski 	req->_present.flags = 1;
19222d7be507SJakub Kicinski 	req->flags._present.size = 1;
19232d7be507SJakub Kicinski 	req->flags.size = size;
19242d7be507SJakub Kicinski }
19252d7be507SJakub Kicinski static inline void
__ethtool_privflags_set_req_set_flags_bits_bit(struct ethtool_privflags_set_req * req,struct ethtool_bitset_bit * bit,unsigned int n_bit)19262d7be507SJakub Kicinski __ethtool_privflags_set_req_set_flags_bits_bit(struct ethtool_privflags_set_req *req,
19272d7be507SJakub Kicinski 					       struct ethtool_bitset_bit *bit,
19282d7be507SJakub Kicinski 					       unsigned int n_bit)
19292d7be507SJakub Kicinski {
19302d7be507SJakub Kicinski 	free(req->flags.bits.bit);
19312d7be507SJakub Kicinski 	req->flags.bits.bit = bit;
19322d7be507SJakub Kicinski 	req->flags.bits.n_bit = n_bit;
19332d7be507SJakub Kicinski }
19342d7be507SJakub Kicinski 
19352d7be507SJakub Kicinski /*
19362d7be507SJakub Kicinski  * Set device private flags.
19372d7be507SJakub Kicinski  */
19382d7be507SJakub Kicinski int ethtool_privflags_set(struct ynl_sock *ys,
19392d7be507SJakub Kicinski 			  struct ethtool_privflags_set_req *req);
19402d7be507SJakub Kicinski 
19412d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_RINGS_GET ============== */
19422d7be507SJakub Kicinski /* ETHTOOL_MSG_RINGS_GET - do */
19432d7be507SJakub Kicinski struct ethtool_rings_get_req {
19442d7be507SJakub Kicinski 	struct {
19452d7be507SJakub Kicinski 		__u32 header:1;
19462d7be507SJakub Kicinski 	} _present;
19472d7be507SJakub Kicinski 
19482d7be507SJakub Kicinski 	struct ethtool_header header;
19492d7be507SJakub Kicinski };
19502d7be507SJakub Kicinski 
ethtool_rings_get_req_alloc(void)19512d7be507SJakub Kicinski static inline struct ethtool_rings_get_req *ethtool_rings_get_req_alloc(void)
19522d7be507SJakub Kicinski {
19532d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_rings_get_req));
19542d7be507SJakub Kicinski }
19552d7be507SJakub Kicinski void ethtool_rings_get_req_free(struct ethtool_rings_get_req *req);
19562d7be507SJakub Kicinski 
19572d7be507SJakub Kicinski static inline void
ethtool_rings_get_req_set_header_dev_index(struct ethtool_rings_get_req * req,__u32 dev_index)19582d7be507SJakub Kicinski ethtool_rings_get_req_set_header_dev_index(struct ethtool_rings_get_req *req,
19592d7be507SJakub Kicinski 					   __u32 dev_index)
19602d7be507SJakub Kicinski {
19612d7be507SJakub Kicinski 	req->_present.header = 1;
19622d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
19632d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
19642d7be507SJakub Kicinski }
19652d7be507SJakub Kicinski static inline void
ethtool_rings_get_req_set_header_dev_name(struct ethtool_rings_get_req * req,const char * dev_name)19662d7be507SJakub Kicinski ethtool_rings_get_req_set_header_dev_name(struct ethtool_rings_get_req *req,
19672d7be507SJakub Kicinski 					  const char *dev_name)
19682d7be507SJakub Kicinski {
19692d7be507SJakub Kicinski 	free(req->header.dev_name);
19702d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
19712d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
19722d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
19732d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
19742d7be507SJakub Kicinski }
19752d7be507SJakub Kicinski static inline void
ethtool_rings_get_req_set_header_flags(struct ethtool_rings_get_req * req,__u32 flags)19762d7be507SJakub Kicinski ethtool_rings_get_req_set_header_flags(struct ethtool_rings_get_req *req,
19772d7be507SJakub Kicinski 				       __u32 flags)
19782d7be507SJakub Kicinski {
19792d7be507SJakub Kicinski 	req->_present.header = 1;
19802d7be507SJakub Kicinski 	req->header._present.flags = 1;
19812d7be507SJakub Kicinski 	req->header.flags = flags;
19822d7be507SJakub Kicinski }
19832d7be507SJakub Kicinski 
19842d7be507SJakub Kicinski struct ethtool_rings_get_rsp {
19852d7be507SJakub Kicinski 	struct {
19862d7be507SJakub Kicinski 		__u32 header:1;
19872d7be507SJakub Kicinski 		__u32 rx_max:1;
19882d7be507SJakub Kicinski 		__u32 rx_mini_max:1;
19892d7be507SJakub Kicinski 		__u32 rx_jumbo_max:1;
19902d7be507SJakub Kicinski 		__u32 tx_max:1;
19912d7be507SJakub Kicinski 		__u32 rx:1;
19922d7be507SJakub Kicinski 		__u32 rx_mini:1;
19932d7be507SJakub Kicinski 		__u32 rx_jumbo:1;
19942d7be507SJakub Kicinski 		__u32 tx:1;
19952d7be507SJakub Kicinski 		__u32 rx_buf_len:1;
19962d7be507SJakub Kicinski 		__u32 tcp_data_split:1;
19972d7be507SJakub Kicinski 		__u32 cqe_size:1;
19982d7be507SJakub Kicinski 		__u32 tx_push:1;
19992d7be507SJakub Kicinski 		__u32 rx_push:1;
20002d7be507SJakub Kicinski 		__u32 tx_push_buf_len:1;
20012d7be507SJakub Kicinski 		__u32 tx_push_buf_len_max:1;
20022d7be507SJakub Kicinski 	} _present;
20032d7be507SJakub Kicinski 
20042d7be507SJakub Kicinski 	struct ethtool_header header;
20052d7be507SJakub Kicinski 	__u32 rx_max;
20062d7be507SJakub Kicinski 	__u32 rx_mini_max;
20072d7be507SJakub Kicinski 	__u32 rx_jumbo_max;
20082d7be507SJakub Kicinski 	__u32 tx_max;
20092d7be507SJakub Kicinski 	__u32 rx;
20102d7be507SJakub Kicinski 	__u32 rx_mini;
20112d7be507SJakub Kicinski 	__u32 rx_jumbo;
20122d7be507SJakub Kicinski 	__u32 tx;
20132d7be507SJakub Kicinski 	__u32 rx_buf_len;
20142d7be507SJakub Kicinski 	__u8 tcp_data_split;
20152d7be507SJakub Kicinski 	__u32 cqe_size;
20162d7be507SJakub Kicinski 	__u8 tx_push;
20172d7be507SJakub Kicinski 	__u8 rx_push;
20182d7be507SJakub Kicinski 	__u32 tx_push_buf_len;
20192d7be507SJakub Kicinski 	__u32 tx_push_buf_len_max;
20202d7be507SJakub Kicinski };
20212d7be507SJakub Kicinski 
20222d7be507SJakub Kicinski void ethtool_rings_get_rsp_free(struct ethtool_rings_get_rsp *rsp);
20232d7be507SJakub Kicinski 
20242d7be507SJakub Kicinski /*
20252d7be507SJakub Kicinski  * Get ring params.
20262d7be507SJakub Kicinski  */
20272d7be507SJakub Kicinski struct ethtool_rings_get_rsp *
20282d7be507SJakub Kicinski ethtool_rings_get(struct ynl_sock *ys, struct ethtool_rings_get_req *req);
20292d7be507SJakub Kicinski 
20302d7be507SJakub Kicinski /* ETHTOOL_MSG_RINGS_GET - dump */
20312d7be507SJakub Kicinski struct ethtool_rings_get_req_dump {
20322d7be507SJakub Kicinski 	struct {
20332d7be507SJakub Kicinski 		__u32 header:1;
20342d7be507SJakub Kicinski 	} _present;
20352d7be507SJakub Kicinski 
20362d7be507SJakub Kicinski 	struct ethtool_header header;
20372d7be507SJakub Kicinski };
20382d7be507SJakub Kicinski 
20392d7be507SJakub Kicinski static inline struct ethtool_rings_get_req_dump *
ethtool_rings_get_req_dump_alloc(void)20402d7be507SJakub Kicinski ethtool_rings_get_req_dump_alloc(void)
20412d7be507SJakub Kicinski {
20422d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_rings_get_req_dump));
20432d7be507SJakub Kicinski }
20442d7be507SJakub Kicinski void ethtool_rings_get_req_dump_free(struct ethtool_rings_get_req_dump *req);
20452d7be507SJakub Kicinski 
20462d7be507SJakub Kicinski static inline void
ethtool_rings_get_req_dump_set_header_dev_index(struct ethtool_rings_get_req_dump * req,__u32 dev_index)20472d7be507SJakub Kicinski ethtool_rings_get_req_dump_set_header_dev_index(struct ethtool_rings_get_req_dump *req,
20482d7be507SJakub Kicinski 						__u32 dev_index)
20492d7be507SJakub Kicinski {
20502d7be507SJakub Kicinski 	req->_present.header = 1;
20512d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
20522d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
20532d7be507SJakub Kicinski }
20542d7be507SJakub Kicinski static inline void
ethtool_rings_get_req_dump_set_header_dev_name(struct ethtool_rings_get_req_dump * req,const char * dev_name)20552d7be507SJakub Kicinski ethtool_rings_get_req_dump_set_header_dev_name(struct ethtool_rings_get_req_dump *req,
20562d7be507SJakub Kicinski 					       const char *dev_name)
20572d7be507SJakub Kicinski {
20582d7be507SJakub Kicinski 	free(req->header.dev_name);
20592d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
20602d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
20612d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
20622d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
20632d7be507SJakub Kicinski }
20642d7be507SJakub Kicinski static inline void
ethtool_rings_get_req_dump_set_header_flags(struct ethtool_rings_get_req_dump * req,__u32 flags)20652d7be507SJakub Kicinski ethtool_rings_get_req_dump_set_header_flags(struct ethtool_rings_get_req_dump *req,
20662d7be507SJakub Kicinski 					    __u32 flags)
20672d7be507SJakub Kicinski {
20682d7be507SJakub Kicinski 	req->_present.header = 1;
20692d7be507SJakub Kicinski 	req->header._present.flags = 1;
20702d7be507SJakub Kicinski 	req->header.flags = flags;
20712d7be507SJakub Kicinski }
20722d7be507SJakub Kicinski 
20732d7be507SJakub Kicinski struct ethtool_rings_get_list {
20742d7be507SJakub Kicinski 	struct ethtool_rings_get_list *next;
20752d7be507SJakub Kicinski 	struct ethtool_rings_get_rsp obj __attribute__ ((aligned (8)));
20762d7be507SJakub Kicinski };
20772d7be507SJakub Kicinski 
20782d7be507SJakub Kicinski void ethtool_rings_get_list_free(struct ethtool_rings_get_list *rsp);
20792d7be507SJakub Kicinski 
20802d7be507SJakub Kicinski struct ethtool_rings_get_list *
20812d7be507SJakub Kicinski ethtool_rings_get_dump(struct ynl_sock *ys,
20822d7be507SJakub Kicinski 		       struct ethtool_rings_get_req_dump *req);
20832d7be507SJakub Kicinski 
20842d7be507SJakub Kicinski /* ETHTOOL_MSG_RINGS_GET - notify */
20852d7be507SJakub Kicinski struct ethtool_rings_get_ntf {
20862d7be507SJakub Kicinski 	__u16 family;
20872d7be507SJakub Kicinski 	__u8 cmd;
20882d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
20892d7be507SJakub Kicinski 	void (*free)(struct ethtool_rings_get_ntf *ntf);
20902d7be507SJakub Kicinski 	struct ethtool_rings_get_rsp obj __attribute__ ((aligned (8)));
20912d7be507SJakub Kicinski };
20922d7be507SJakub Kicinski 
20932d7be507SJakub Kicinski void ethtool_rings_get_ntf_free(struct ethtool_rings_get_ntf *rsp);
20942d7be507SJakub Kicinski 
20952d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_RINGS_SET ============== */
20962d7be507SJakub Kicinski /* ETHTOOL_MSG_RINGS_SET - do */
20972d7be507SJakub Kicinski struct ethtool_rings_set_req {
20982d7be507SJakub Kicinski 	struct {
20992d7be507SJakub Kicinski 		__u32 header:1;
21002d7be507SJakub Kicinski 		__u32 rx_max:1;
21012d7be507SJakub Kicinski 		__u32 rx_mini_max:1;
21022d7be507SJakub Kicinski 		__u32 rx_jumbo_max:1;
21032d7be507SJakub Kicinski 		__u32 tx_max:1;
21042d7be507SJakub Kicinski 		__u32 rx:1;
21052d7be507SJakub Kicinski 		__u32 rx_mini:1;
21062d7be507SJakub Kicinski 		__u32 rx_jumbo:1;
21072d7be507SJakub Kicinski 		__u32 tx:1;
21082d7be507SJakub Kicinski 		__u32 rx_buf_len:1;
21092d7be507SJakub Kicinski 		__u32 tcp_data_split:1;
21102d7be507SJakub Kicinski 		__u32 cqe_size:1;
21112d7be507SJakub Kicinski 		__u32 tx_push:1;
21122d7be507SJakub Kicinski 		__u32 rx_push:1;
21132d7be507SJakub Kicinski 		__u32 tx_push_buf_len:1;
21142d7be507SJakub Kicinski 		__u32 tx_push_buf_len_max:1;
21152d7be507SJakub Kicinski 	} _present;
21162d7be507SJakub Kicinski 
21172d7be507SJakub Kicinski 	struct ethtool_header header;
21182d7be507SJakub Kicinski 	__u32 rx_max;
21192d7be507SJakub Kicinski 	__u32 rx_mini_max;
21202d7be507SJakub Kicinski 	__u32 rx_jumbo_max;
21212d7be507SJakub Kicinski 	__u32 tx_max;
21222d7be507SJakub Kicinski 	__u32 rx;
21232d7be507SJakub Kicinski 	__u32 rx_mini;
21242d7be507SJakub Kicinski 	__u32 rx_jumbo;
21252d7be507SJakub Kicinski 	__u32 tx;
21262d7be507SJakub Kicinski 	__u32 rx_buf_len;
21272d7be507SJakub Kicinski 	__u8 tcp_data_split;
21282d7be507SJakub Kicinski 	__u32 cqe_size;
21292d7be507SJakub Kicinski 	__u8 tx_push;
21302d7be507SJakub Kicinski 	__u8 rx_push;
21312d7be507SJakub Kicinski 	__u32 tx_push_buf_len;
21322d7be507SJakub Kicinski 	__u32 tx_push_buf_len_max;
21332d7be507SJakub Kicinski };
21342d7be507SJakub Kicinski 
ethtool_rings_set_req_alloc(void)21352d7be507SJakub Kicinski static inline struct ethtool_rings_set_req *ethtool_rings_set_req_alloc(void)
21362d7be507SJakub Kicinski {
21372d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_rings_set_req));
21382d7be507SJakub Kicinski }
21392d7be507SJakub Kicinski void ethtool_rings_set_req_free(struct ethtool_rings_set_req *req);
21402d7be507SJakub Kicinski 
21412d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_header_dev_index(struct ethtool_rings_set_req * req,__u32 dev_index)21422d7be507SJakub Kicinski ethtool_rings_set_req_set_header_dev_index(struct ethtool_rings_set_req *req,
21432d7be507SJakub Kicinski 					   __u32 dev_index)
21442d7be507SJakub Kicinski {
21452d7be507SJakub Kicinski 	req->_present.header = 1;
21462d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
21472d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
21482d7be507SJakub Kicinski }
21492d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_header_dev_name(struct ethtool_rings_set_req * req,const char * dev_name)21502d7be507SJakub Kicinski ethtool_rings_set_req_set_header_dev_name(struct ethtool_rings_set_req *req,
21512d7be507SJakub Kicinski 					  const char *dev_name)
21522d7be507SJakub Kicinski {
21532d7be507SJakub Kicinski 	free(req->header.dev_name);
21542d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
21552d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
21562d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
21572d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
21582d7be507SJakub Kicinski }
21592d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_header_flags(struct ethtool_rings_set_req * req,__u32 flags)21602d7be507SJakub Kicinski ethtool_rings_set_req_set_header_flags(struct ethtool_rings_set_req *req,
21612d7be507SJakub Kicinski 				       __u32 flags)
21622d7be507SJakub Kicinski {
21632d7be507SJakub Kicinski 	req->_present.header = 1;
21642d7be507SJakub Kicinski 	req->header._present.flags = 1;
21652d7be507SJakub Kicinski 	req->header.flags = flags;
21662d7be507SJakub Kicinski }
21672d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_rx_max(struct ethtool_rings_set_req * req,__u32 rx_max)21682d7be507SJakub Kicinski ethtool_rings_set_req_set_rx_max(struct ethtool_rings_set_req *req,
21692d7be507SJakub Kicinski 				 __u32 rx_max)
21702d7be507SJakub Kicinski {
21712d7be507SJakub Kicinski 	req->_present.rx_max = 1;
21722d7be507SJakub Kicinski 	req->rx_max = rx_max;
21732d7be507SJakub Kicinski }
21742d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_rx_mini_max(struct ethtool_rings_set_req * req,__u32 rx_mini_max)21752d7be507SJakub Kicinski ethtool_rings_set_req_set_rx_mini_max(struct ethtool_rings_set_req *req,
21762d7be507SJakub Kicinski 				      __u32 rx_mini_max)
21772d7be507SJakub Kicinski {
21782d7be507SJakub Kicinski 	req->_present.rx_mini_max = 1;
21792d7be507SJakub Kicinski 	req->rx_mini_max = rx_mini_max;
21802d7be507SJakub Kicinski }
21812d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_rx_jumbo_max(struct ethtool_rings_set_req * req,__u32 rx_jumbo_max)21822d7be507SJakub Kicinski ethtool_rings_set_req_set_rx_jumbo_max(struct ethtool_rings_set_req *req,
21832d7be507SJakub Kicinski 				       __u32 rx_jumbo_max)
21842d7be507SJakub Kicinski {
21852d7be507SJakub Kicinski 	req->_present.rx_jumbo_max = 1;
21862d7be507SJakub Kicinski 	req->rx_jumbo_max = rx_jumbo_max;
21872d7be507SJakub Kicinski }
21882d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_tx_max(struct ethtool_rings_set_req * req,__u32 tx_max)21892d7be507SJakub Kicinski ethtool_rings_set_req_set_tx_max(struct ethtool_rings_set_req *req,
21902d7be507SJakub Kicinski 				 __u32 tx_max)
21912d7be507SJakub Kicinski {
21922d7be507SJakub Kicinski 	req->_present.tx_max = 1;
21932d7be507SJakub Kicinski 	req->tx_max = tx_max;
21942d7be507SJakub Kicinski }
21952d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_rx(struct ethtool_rings_set_req * req,__u32 rx)21962d7be507SJakub Kicinski ethtool_rings_set_req_set_rx(struct ethtool_rings_set_req *req, __u32 rx)
21972d7be507SJakub Kicinski {
21982d7be507SJakub Kicinski 	req->_present.rx = 1;
21992d7be507SJakub Kicinski 	req->rx = rx;
22002d7be507SJakub Kicinski }
22012d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_rx_mini(struct ethtool_rings_set_req * req,__u32 rx_mini)22022d7be507SJakub Kicinski ethtool_rings_set_req_set_rx_mini(struct ethtool_rings_set_req *req,
22032d7be507SJakub Kicinski 				  __u32 rx_mini)
22042d7be507SJakub Kicinski {
22052d7be507SJakub Kicinski 	req->_present.rx_mini = 1;
22062d7be507SJakub Kicinski 	req->rx_mini = rx_mini;
22072d7be507SJakub Kicinski }
22082d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_rx_jumbo(struct ethtool_rings_set_req * req,__u32 rx_jumbo)22092d7be507SJakub Kicinski ethtool_rings_set_req_set_rx_jumbo(struct ethtool_rings_set_req *req,
22102d7be507SJakub Kicinski 				   __u32 rx_jumbo)
22112d7be507SJakub Kicinski {
22122d7be507SJakub Kicinski 	req->_present.rx_jumbo = 1;
22132d7be507SJakub Kicinski 	req->rx_jumbo = rx_jumbo;
22142d7be507SJakub Kicinski }
22152d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_tx(struct ethtool_rings_set_req * req,__u32 tx)22162d7be507SJakub Kicinski ethtool_rings_set_req_set_tx(struct ethtool_rings_set_req *req, __u32 tx)
22172d7be507SJakub Kicinski {
22182d7be507SJakub Kicinski 	req->_present.tx = 1;
22192d7be507SJakub Kicinski 	req->tx = tx;
22202d7be507SJakub Kicinski }
22212d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_rx_buf_len(struct ethtool_rings_set_req * req,__u32 rx_buf_len)22222d7be507SJakub Kicinski ethtool_rings_set_req_set_rx_buf_len(struct ethtool_rings_set_req *req,
22232d7be507SJakub Kicinski 				     __u32 rx_buf_len)
22242d7be507SJakub Kicinski {
22252d7be507SJakub Kicinski 	req->_present.rx_buf_len = 1;
22262d7be507SJakub Kicinski 	req->rx_buf_len = rx_buf_len;
22272d7be507SJakub Kicinski }
22282d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_tcp_data_split(struct ethtool_rings_set_req * req,__u8 tcp_data_split)22292d7be507SJakub Kicinski ethtool_rings_set_req_set_tcp_data_split(struct ethtool_rings_set_req *req,
22302d7be507SJakub Kicinski 					 __u8 tcp_data_split)
22312d7be507SJakub Kicinski {
22322d7be507SJakub Kicinski 	req->_present.tcp_data_split = 1;
22332d7be507SJakub Kicinski 	req->tcp_data_split = tcp_data_split;
22342d7be507SJakub Kicinski }
22352d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_cqe_size(struct ethtool_rings_set_req * req,__u32 cqe_size)22362d7be507SJakub Kicinski ethtool_rings_set_req_set_cqe_size(struct ethtool_rings_set_req *req,
22372d7be507SJakub Kicinski 				   __u32 cqe_size)
22382d7be507SJakub Kicinski {
22392d7be507SJakub Kicinski 	req->_present.cqe_size = 1;
22402d7be507SJakub Kicinski 	req->cqe_size = cqe_size;
22412d7be507SJakub Kicinski }
22422d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_tx_push(struct ethtool_rings_set_req * req,__u8 tx_push)22432d7be507SJakub Kicinski ethtool_rings_set_req_set_tx_push(struct ethtool_rings_set_req *req,
22442d7be507SJakub Kicinski 				  __u8 tx_push)
22452d7be507SJakub Kicinski {
22462d7be507SJakub Kicinski 	req->_present.tx_push = 1;
22472d7be507SJakub Kicinski 	req->tx_push = tx_push;
22482d7be507SJakub Kicinski }
22492d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_rx_push(struct ethtool_rings_set_req * req,__u8 rx_push)22502d7be507SJakub Kicinski ethtool_rings_set_req_set_rx_push(struct ethtool_rings_set_req *req,
22512d7be507SJakub Kicinski 				  __u8 rx_push)
22522d7be507SJakub Kicinski {
22532d7be507SJakub Kicinski 	req->_present.rx_push = 1;
22542d7be507SJakub Kicinski 	req->rx_push = rx_push;
22552d7be507SJakub Kicinski }
22562d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_tx_push_buf_len(struct ethtool_rings_set_req * req,__u32 tx_push_buf_len)22572d7be507SJakub Kicinski ethtool_rings_set_req_set_tx_push_buf_len(struct ethtool_rings_set_req *req,
22582d7be507SJakub Kicinski 					  __u32 tx_push_buf_len)
22592d7be507SJakub Kicinski {
22602d7be507SJakub Kicinski 	req->_present.tx_push_buf_len = 1;
22612d7be507SJakub Kicinski 	req->tx_push_buf_len = tx_push_buf_len;
22622d7be507SJakub Kicinski }
22632d7be507SJakub Kicinski static inline void
ethtool_rings_set_req_set_tx_push_buf_len_max(struct ethtool_rings_set_req * req,__u32 tx_push_buf_len_max)22642d7be507SJakub Kicinski ethtool_rings_set_req_set_tx_push_buf_len_max(struct ethtool_rings_set_req *req,
22652d7be507SJakub Kicinski 					      __u32 tx_push_buf_len_max)
22662d7be507SJakub Kicinski {
22672d7be507SJakub Kicinski 	req->_present.tx_push_buf_len_max = 1;
22682d7be507SJakub Kicinski 	req->tx_push_buf_len_max = tx_push_buf_len_max;
22692d7be507SJakub Kicinski }
22702d7be507SJakub Kicinski 
22712d7be507SJakub Kicinski /*
22722d7be507SJakub Kicinski  * Set ring params.
22732d7be507SJakub Kicinski  */
22742d7be507SJakub Kicinski int ethtool_rings_set(struct ynl_sock *ys, struct ethtool_rings_set_req *req);
22752d7be507SJakub Kicinski 
22762d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_CHANNELS_GET ============== */
22772d7be507SJakub Kicinski /* ETHTOOL_MSG_CHANNELS_GET - do */
22782d7be507SJakub Kicinski struct ethtool_channels_get_req {
22792d7be507SJakub Kicinski 	struct {
22802d7be507SJakub Kicinski 		__u32 header:1;
22812d7be507SJakub Kicinski 	} _present;
22822d7be507SJakub Kicinski 
22832d7be507SJakub Kicinski 	struct ethtool_header header;
22842d7be507SJakub Kicinski };
22852d7be507SJakub Kicinski 
22862d7be507SJakub Kicinski static inline struct ethtool_channels_get_req *
ethtool_channels_get_req_alloc(void)22872d7be507SJakub Kicinski ethtool_channels_get_req_alloc(void)
22882d7be507SJakub Kicinski {
22892d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_channels_get_req));
22902d7be507SJakub Kicinski }
22912d7be507SJakub Kicinski void ethtool_channels_get_req_free(struct ethtool_channels_get_req *req);
22922d7be507SJakub Kicinski 
22932d7be507SJakub Kicinski static inline void
ethtool_channels_get_req_set_header_dev_index(struct ethtool_channels_get_req * req,__u32 dev_index)22942d7be507SJakub Kicinski ethtool_channels_get_req_set_header_dev_index(struct ethtool_channels_get_req *req,
22952d7be507SJakub Kicinski 					      __u32 dev_index)
22962d7be507SJakub Kicinski {
22972d7be507SJakub Kicinski 	req->_present.header = 1;
22982d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
22992d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
23002d7be507SJakub Kicinski }
23012d7be507SJakub Kicinski static inline void
ethtool_channels_get_req_set_header_dev_name(struct ethtool_channels_get_req * req,const char * dev_name)23022d7be507SJakub Kicinski ethtool_channels_get_req_set_header_dev_name(struct ethtool_channels_get_req *req,
23032d7be507SJakub Kicinski 					     const char *dev_name)
23042d7be507SJakub Kicinski {
23052d7be507SJakub Kicinski 	free(req->header.dev_name);
23062d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
23072d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
23082d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
23092d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
23102d7be507SJakub Kicinski }
23112d7be507SJakub Kicinski static inline void
ethtool_channels_get_req_set_header_flags(struct ethtool_channels_get_req * req,__u32 flags)23122d7be507SJakub Kicinski ethtool_channels_get_req_set_header_flags(struct ethtool_channels_get_req *req,
23132d7be507SJakub Kicinski 					  __u32 flags)
23142d7be507SJakub Kicinski {
23152d7be507SJakub Kicinski 	req->_present.header = 1;
23162d7be507SJakub Kicinski 	req->header._present.flags = 1;
23172d7be507SJakub Kicinski 	req->header.flags = flags;
23182d7be507SJakub Kicinski }
23192d7be507SJakub Kicinski 
23202d7be507SJakub Kicinski struct ethtool_channels_get_rsp {
23212d7be507SJakub Kicinski 	struct {
23222d7be507SJakub Kicinski 		__u32 header:1;
23232d7be507SJakub Kicinski 		__u32 rx_max:1;
23242d7be507SJakub Kicinski 		__u32 tx_max:1;
23252d7be507SJakub Kicinski 		__u32 other_max:1;
23262d7be507SJakub Kicinski 		__u32 combined_max:1;
23272d7be507SJakub Kicinski 		__u32 rx_count:1;
23282d7be507SJakub Kicinski 		__u32 tx_count:1;
23292d7be507SJakub Kicinski 		__u32 other_count:1;
23302d7be507SJakub Kicinski 		__u32 combined_count:1;
23312d7be507SJakub Kicinski 	} _present;
23322d7be507SJakub Kicinski 
23332d7be507SJakub Kicinski 	struct ethtool_header header;
23342d7be507SJakub Kicinski 	__u32 rx_max;
23352d7be507SJakub Kicinski 	__u32 tx_max;
23362d7be507SJakub Kicinski 	__u32 other_max;
23372d7be507SJakub Kicinski 	__u32 combined_max;
23382d7be507SJakub Kicinski 	__u32 rx_count;
23392d7be507SJakub Kicinski 	__u32 tx_count;
23402d7be507SJakub Kicinski 	__u32 other_count;
23412d7be507SJakub Kicinski 	__u32 combined_count;
23422d7be507SJakub Kicinski };
23432d7be507SJakub Kicinski 
23442d7be507SJakub Kicinski void ethtool_channels_get_rsp_free(struct ethtool_channels_get_rsp *rsp);
23452d7be507SJakub Kicinski 
23462d7be507SJakub Kicinski /*
23472d7be507SJakub Kicinski  * Get channel params.
23482d7be507SJakub Kicinski  */
23492d7be507SJakub Kicinski struct ethtool_channels_get_rsp *
23502d7be507SJakub Kicinski ethtool_channels_get(struct ynl_sock *ys, struct ethtool_channels_get_req *req);
23512d7be507SJakub Kicinski 
23522d7be507SJakub Kicinski /* ETHTOOL_MSG_CHANNELS_GET - dump */
23532d7be507SJakub Kicinski struct ethtool_channels_get_req_dump {
23542d7be507SJakub Kicinski 	struct {
23552d7be507SJakub Kicinski 		__u32 header:1;
23562d7be507SJakub Kicinski 	} _present;
23572d7be507SJakub Kicinski 
23582d7be507SJakub Kicinski 	struct ethtool_header header;
23592d7be507SJakub Kicinski };
23602d7be507SJakub Kicinski 
23612d7be507SJakub Kicinski static inline struct ethtool_channels_get_req_dump *
ethtool_channels_get_req_dump_alloc(void)23622d7be507SJakub Kicinski ethtool_channels_get_req_dump_alloc(void)
23632d7be507SJakub Kicinski {
23642d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_channels_get_req_dump));
23652d7be507SJakub Kicinski }
23662d7be507SJakub Kicinski void
23672d7be507SJakub Kicinski ethtool_channels_get_req_dump_free(struct ethtool_channels_get_req_dump *req);
23682d7be507SJakub Kicinski 
23692d7be507SJakub Kicinski static inline void
ethtool_channels_get_req_dump_set_header_dev_index(struct ethtool_channels_get_req_dump * req,__u32 dev_index)23702d7be507SJakub Kicinski ethtool_channels_get_req_dump_set_header_dev_index(struct ethtool_channels_get_req_dump *req,
23712d7be507SJakub Kicinski 						   __u32 dev_index)
23722d7be507SJakub Kicinski {
23732d7be507SJakub Kicinski 	req->_present.header = 1;
23742d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
23752d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
23762d7be507SJakub Kicinski }
23772d7be507SJakub Kicinski static inline void
ethtool_channels_get_req_dump_set_header_dev_name(struct ethtool_channels_get_req_dump * req,const char * dev_name)23782d7be507SJakub Kicinski ethtool_channels_get_req_dump_set_header_dev_name(struct ethtool_channels_get_req_dump *req,
23792d7be507SJakub Kicinski 						  const char *dev_name)
23802d7be507SJakub Kicinski {
23812d7be507SJakub Kicinski 	free(req->header.dev_name);
23822d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
23832d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
23842d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
23852d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
23862d7be507SJakub Kicinski }
23872d7be507SJakub Kicinski static inline void
ethtool_channels_get_req_dump_set_header_flags(struct ethtool_channels_get_req_dump * req,__u32 flags)23882d7be507SJakub Kicinski ethtool_channels_get_req_dump_set_header_flags(struct ethtool_channels_get_req_dump *req,
23892d7be507SJakub Kicinski 					       __u32 flags)
23902d7be507SJakub Kicinski {
23912d7be507SJakub Kicinski 	req->_present.header = 1;
23922d7be507SJakub Kicinski 	req->header._present.flags = 1;
23932d7be507SJakub Kicinski 	req->header.flags = flags;
23942d7be507SJakub Kicinski }
23952d7be507SJakub Kicinski 
23962d7be507SJakub Kicinski struct ethtool_channels_get_list {
23972d7be507SJakub Kicinski 	struct ethtool_channels_get_list *next;
23982d7be507SJakub Kicinski 	struct ethtool_channels_get_rsp obj __attribute__ ((aligned (8)));
23992d7be507SJakub Kicinski };
24002d7be507SJakub Kicinski 
24012d7be507SJakub Kicinski void ethtool_channels_get_list_free(struct ethtool_channels_get_list *rsp);
24022d7be507SJakub Kicinski 
24032d7be507SJakub Kicinski struct ethtool_channels_get_list *
24042d7be507SJakub Kicinski ethtool_channels_get_dump(struct ynl_sock *ys,
24052d7be507SJakub Kicinski 			  struct ethtool_channels_get_req_dump *req);
24062d7be507SJakub Kicinski 
24072d7be507SJakub Kicinski /* ETHTOOL_MSG_CHANNELS_GET - notify */
24082d7be507SJakub Kicinski struct ethtool_channels_get_ntf {
24092d7be507SJakub Kicinski 	__u16 family;
24102d7be507SJakub Kicinski 	__u8 cmd;
24112d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
24122d7be507SJakub Kicinski 	void (*free)(struct ethtool_channels_get_ntf *ntf);
24132d7be507SJakub Kicinski 	struct ethtool_channels_get_rsp obj __attribute__ ((aligned (8)));
24142d7be507SJakub Kicinski };
24152d7be507SJakub Kicinski 
24162d7be507SJakub Kicinski void ethtool_channels_get_ntf_free(struct ethtool_channels_get_ntf *rsp);
24172d7be507SJakub Kicinski 
24182d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_CHANNELS_SET ============== */
24192d7be507SJakub Kicinski /* ETHTOOL_MSG_CHANNELS_SET - do */
24202d7be507SJakub Kicinski struct ethtool_channels_set_req {
24212d7be507SJakub Kicinski 	struct {
24222d7be507SJakub Kicinski 		__u32 header:1;
24232d7be507SJakub Kicinski 		__u32 rx_max:1;
24242d7be507SJakub Kicinski 		__u32 tx_max:1;
24252d7be507SJakub Kicinski 		__u32 other_max:1;
24262d7be507SJakub Kicinski 		__u32 combined_max:1;
24272d7be507SJakub Kicinski 		__u32 rx_count:1;
24282d7be507SJakub Kicinski 		__u32 tx_count:1;
24292d7be507SJakub Kicinski 		__u32 other_count:1;
24302d7be507SJakub Kicinski 		__u32 combined_count:1;
24312d7be507SJakub Kicinski 	} _present;
24322d7be507SJakub Kicinski 
24332d7be507SJakub Kicinski 	struct ethtool_header header;
24342d7be507SJakub Kicinski 	__u32 rx_max;
24352d7be507SJakub Kicinski 	__u32 tx_max;
24362d7be507SJakub Kicinski 	__u32 other_max;
24372d7be507SJakub Kicinski 	__u32 combined_max;
24382d7be507SJakub Kicinski 	__u32 rx_count;
24392d7be507SJakub Kicinski 	__u32 tx_count;
24402d7be507SJakub Kicinski 	__u32 other_count;
24412d7be507SJakub Kicinski 	__u32 combined_count;
24422d7be507SJakub Kicinski };
24432d7be507SJakub Kicinski 
24442d7be507SJakub Kicinski static inline struct ethtool_channels_set_req *
ethtool_channels_set_req_alloc(void)24452d7be507SJakub Kicinski ethtool_channels_set_req_alloc(void)
24462d7be507SJakub Kicinski {
24472d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_channels_set_req));
24482d7be507SJakub Kicinski }
24492d7be507SJakub Kicinski void ethtool_channels_set_req_free(struct ethtool_channels_set_req *req);
24502d7be507SJakub Kicinski 
24512d7be507SJakub Kicinski static inline void
ethtool_channels_set_req_set_header_dev_index(struct ethtool_channels_set_req * req,__u32 dev_index)24522d7be507SJakub Kicinski ethtool_channels_set_req_set_header_dev_index(struct ethtool_channels_set_req *req,
24532d7be507SJakub Kicinski 					      __u32 dev_index)
24542d7be507SJakub Kicinski {
24552d7be507SJakub Kicinski 	req->_present.header = 1;
24562d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
24572d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
24582d7be507SJakub Kicinski }
24592d7be507SJakub Kicinski static inline void
ethtool_channels_set_req_set_header_dev_name(struct ethtool_channels_set_req * req,const char * dev_name)24602d7be507SJakub Kicinski ethtool_channels_set_req_set_header_dev_name(struct ethtool_channels_set_req *req,
24612d7be507SJakub Kicinski 					     const char *dev_name)
24622d7be507SJakub Kicinski {
24632d7be507SJakub Kicinski 	free(req->header.dev_name);
24642d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
24652d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
24662d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
24672d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
24682d7be507SJakub Kicinski }
24692d7be507SJakub Kicinski static inline void
ethtool_channels_set_req_set_header_flags(struct ethtool_channels_set_req * req,__u32 flags)24702d7be507SJakub Kicinski ethtool_channels_set_req_set_header_flags(struct ethtool_channels_set_req *req,
24712d7be507SJakub Kicinski 					  __u32 flags)
24722d7be507SJakub Kicinski {
24732d7be507SJakub Kicinski 	req->_present.header = 1;
24742d7be507SJakub Kicinski 	req->header._present.flags = 1;
24752d7be507SJakub Kicinski 	req->header.flags = flags;
24762d7be507SJakub Kicinski }
24772d7be507SJakub Kicinski static inline void
ethtool_channels_set_req_set_rx_max(struct ethtool_channels_set_req * req,__u32 rx_max)24782d7be507SJakub Kicinski ethtool_channels_set_req_set_rx_max(struct ethtool_channels_set_req *req,
24792d7be507SJakub Kicinski 				    __u32 rx_max)
24802d7be507SJakub Kicinski {
24812d7be507SJakub Kicinski 	req->_present.rx_max = 1;
24822d7be507SJakub Kicinski 	req->rx_max = rx_max;
24832d7be507SJakub Kicinski }
24842d7be507SJakub Kicinski static inline void
ethtool_channels_set_req_set_tx_max(struct ethtool_channels_set_req * req,__u32 tx_max)24852d7be507SJakub Kicinski ethtool_channels_set_req_set_tx_max(struct ethtool_channels_set_req *req,
24862d7be507SJakub Kicinski 				    __u32 tx_max)
24872d7be507SJakub Kicinski {
24882d7be507SJakub Kicinski 	req->_present.tx_max = 1;
24892d7be507SJakub Kicinski 	req->tx_max = tx_max;
24902d7be507SJakub Kicinski }
24912d7be507SJakub Kicinski static inline void
ethtool_channels_set_req_set_other_max(struct ethtool_channels_set_req * req,__u32 other_max)24922d7be507SJakub Kicinski ethtool_channels_set_req_set_other_max(struct ethtool_channels_set_req *req,
24932d7be507SJakub Kicinski 				       __u32 other_max)
24942d7be507SJakub Kicinski {
24952d7be507SJakub Kicinski 	req->_present.other_max = 1;
24962d7be507SJakub Kicinski 	req->other_max = other_max;
24972d7be507SJakub Kicinski }
24982d7be507SJakub Kicinski static inline void
ethtool_channels_set_req_set_combined_max(struct ethtool_channels_set_req * req,__u32 combined_max)24992d7be507SJakub Kicinski ethtool_channels_set_req_set_combined_max(struct ethtool_channels_set_req *req,
25002d7be507SJakub Kicinski 					  __u32 combined_max)
25012d7be507SJakub Kicinski {
25022d7be507SJakub Kicinski 	req->_present.combined_max = 1;
25032d7be507SJakub Kicinski 	req->combined_max = combined_max;
25042d7be507SJakub Kicinski }
25052d7be507SJakub Kicinski static inline void
ethtool_channels_set_req_set_rx_count(struct ethtool_channels_set_req * req,__u32 rx_count)25062d7be507SJakub Kicinski ethtool_channels_set_req_set_rx_count(struct ethtool_channels_set_req *req,
25072d7be507SJakub Kicinski 				      __u32 rx_count)
25082d7be507SJakub Kicinski {
25092d7be507SJakub Kicinski 	req->_present.rx_count = 1;
25102d7be507SJakub Kicinski 	req->rx_count = rx_count;
25112d7be507SJakub Kicinski }
25122d7be507SJakub Kicinski static inline void
ethtool_channels_set_req_set_tx_count(struct ethtool_channels_set_req * req,__u32 tx_count)25132d7be507SJakub Kicinski ethtool_channels_set_req_set_tx_count(struct ethtool_channels_set_req *req,
25142d7be507SJakub Kicinski 				      __u32 tx_count)
25152d7be507SJakub Kicinski {
25162d7be507SJakub Kicinski 	req->_present.tx_count = 1;
25172d7be507SJakub Kicinski 	req->tx_count = tx_count;
25182d7be507SJakub Kicinski }
25192d7be507SJakub Kicinski static inline void
ethtool_channels_set_req_set_other_count(struct ethtool_channels_set_req * req,__u32 other_count)25202d7be507SJakub Kicinski ethtool_channels_set_req_set_other_count(struct ethtool_channels_set_req *req,
25212d7be507SJakub Kicinski 					 __u32 other_count)
25222d7be507SJakub Kicinski {
25232d7be507SJakub Kicinski 	req->_present.other_count = 1;
25242d7be507SJakub Kicinski 	req->other_count = other_count;
25252d7be507SJakub Kicinski }
25262d7be507SJakub Kicinski static inline void
ethtool_channels_set_req_set_combined_count(struct ethtool_channels_set_req * req,__u32 combined_count)25272d7be507SJakub Kicinski ethtool_channels_set_req_set_combined_count(struct ethtool_channels_set_req *req,
25282d7be507SJakub Kicinski 					    __u32 combined_count)
25292d7be507SJakub Kicinski {
25302d7be507SJakub Kicinski 	req->_present.combined_count = 1;
25312d7be507SJakub Kicinski 	req->combined_count = combined_count;
25322d7be507SJakub Kicinski }
25332d7be507SJakub Kicinski 
25342d7be507SJakub Kicinski /*
25352d7be507SJakub Kicinski  * Set channel params.
25362d7be507SJakub Kicinski  */
25372d7be507SJakub Kicinski int ethtool_channels_set(struct ynl_sock *ys,
25382d7be507SJakub Kicinski 			 struct ethtool_channels_set_req *req);
25392d7be507SJakub Kicinski 
25402d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_COALESCE_GET ============== */
25412d7be507SJakub Kicinski /* ETHTOOL_MSG_COALESCE_GET - do */
25422d7be507SJakub Kicinski struct ethtool_coalesce_get_req {
25432d7be507SJakub Kicinski 	struct {
25442d7be507SJakub Kicinski 		__u32 header:1;
25452d7be507SJakub Kicinski 	} _present;
25462d7be507SJakub Kicinski 
25472d7be507SJakub Kicinski 	struct ethtool_header header;
25482d7be507SJakub Kicinski };
25492d7be507SJakub Kicinski 
25502d7be507SJakub Kicinski static inline struct ethtool_coalesce_get_req *
ethtool_coalesce_get_req_alloc(void)25512d7be507SJakub Kicinski ethtool_coalesce_get_req_alloc(void)
25522d7be507SJakub Kicinski {
25532d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_coalesce_get_req));
25542d7be507SJakub Kicinski }
25552d7be507SJakub Kicinski void ethtool_coalesce_get_req_free(struct ethtool_coalesce_get_req *req);
25562d7be507SJakub Kicinski 
25572d7be507SJakub Kicinski static inline void
ethtool_coalesce_get_req_set_header_dev_index(struct ethtool_coalesce_get_req * req,__u32 dev_index)25582d7be507SJakub Kicinski ethtool_coalesce_get_req_set_header_dev_index(struct ethtool_coalesce_get_req *req,
25592d7be507SJakub Kicinski 					      __u32 dev_index)
25602d7be507SJakub Kicinski {
25612d7be507SJakub Kicinski 	req->_present.header = 1;
25622d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
25632d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
25642d7be507SJakub Kicinski }
25652d7be507SJakub Kicinski static inline void
ethtool_coalesce_get_req_set_header_dev_name(struct ethtool_coalesce_get_req * req,const char * dev_name)25662d7be507SJakub Kicinski ethtool_coalesce_get_req_set_header_dev_name(struct ethtool_coalesce_get_req *req,
25672d7be507SJakub Kicinski 					     const char *dev_name)
25682d7be507SJakub Kicinski {
25692d7be507SJakub Kicinski 	free(req->header.dev_name);
25702d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
25712d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
25722d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
25732d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
25742d7be507SJakub Kicinski }
25752d7be507SJakub Kicinski static inline void
ethtool_coalesce_get_req_set_header_flags(struct ethtool_coalesce_get_req * req,__u32 flags)25762d7be507SJakub Kicinski ethtool_coalesce_get_req_set_header_flags(struct ethtool_coalesce_get_req *req,
25772d7be507SJakub Kicinski 					  __u32 flags)
25782d7be507SJakub Kicinski {
25792d7be507SJakub Kicinski 	req->_present.header = 1;
25802d7be507SJakub Kicinski 	req->header._present.flags = 1;
25812d7be507SJakub Kicinski 	req->header.flags = flags;
25822d7be507SJakub Kicinski }
25832d7be507SJakub Kicinski 
25842d7be507SJakub Kicinski struct ethtool_coalesce_get_rsp {
25852d7be507SJakub Kicinski 	struct {
25862d7be507SJakub Kicinski 		__u32 header:1;
25872d7be507SJakub Kicinski 		__u32 rx_usecs:1;
25882d7be507SJakub Kicinski 		__u32 rx_max_frames:1;
25892d7be507SJakub Kicinski 		__u32 rx_usecs_irq:1;
25902d7be507SJakub Kicinski 		__u32 rx_max_frames_irq:1;
25912d7be507SJakub Kicinski 		__u32 tx_usecs:1;
25922d7be507SJakub Kicinski 		__u32 tx_max_frames:1;
25932d7be507SJakub Kicinski 		__u32 tx_usecs_irq:1;
25942d7be507SJakub Kicinski 		__u32 tx_max_frames_irq:1;
25952d7be507SJakub Kicinski 		__u32 stats_block_usecs:1;
25962d7be507SJakub Kicinski 		__u32 use_adaptive_rx:1;
25972d7be507SJakub Kicinski 		__u32 use_adaptive_tx:1;
25982d7be507SJakub Kicinski 		__u32 pkt_rate_low:1;
25992d7be507SJakub Kicinski 		__u32 rx_usecs_low:1;
26002d7be507SJakub Kicinski 		__u32 rx_max_frames_low:1;
26012d7be507SJakub Kicinski 		__u32 tx_usecs_low:1;
26022d7be507SJakub Kicinski 		__u32 tx_max_frames_low:1;
26032d7be507SJakub Kicinski 		__u32 pkt_rate_high:1;
26042d7be507SJakub Kicinski 		__u32 rx_usecs_high:1;
26052d7be507SJakub Kicinski 		__u32 rx_max_frames_high:1;
26062d7be507SJakub Kicinski 		__u32 tx_usecs_high:1;
26072d7be507SJakub Kicinski 		__u32 tx_max_frames_high:1;
26082d7be507SJakub Kicinski 		__u32 rate_sample_interval:1;
26092d7be507SJakub Kicinski 		__u32 use_cqe_mode_tx:1;
26102d7be507SJakub Kicinski 		__u32 use_cqe_mode_rx:1;
26112d7be507SJakub Kicinski 		__u32 tx_aggr_max_bytes:1;
26122d7be507SJakub Kicinski 		__u32 tx_aggr_max_frames:1;
26132d7be507SJakub Kicinski 		__u32 tx_aggr_time_usecs:1;
26142d7be507SJakub Kicinski 	} _present;
26152d7be507SJakub Kicinski 
26162d7be507SJakub Kicinski 	struct ethtool_header header;
26172d7be507SJakub Kicinski 	__u32 rx_usecs;
26182d7be507SJakub Kicinski 	__u32 rx_max_frames;
26192d7be507SJakub Kicinski 	__u32 rx_usecs_irq;
26202d7be507SJakub Kicinski 	__u32 rx_max_frames_irq;
26212d7be507SJakub Kicinski 	__u32 tx_usecs;
26222d7be507SJakub Kicinski 	__u32 tx_max_frames;
26232d7be507SJakub Kicinski 	__u32 tx_usecs_irq;
26242d7be507SJakub Kicinski 	__u32 tx_max_frames_irq;
26252d7be507SJakub Kicinski 	__u32 stats_block_usecs;
26262d7be507SJakub Kicinski 	__u8 use_adaptive_rx;
26272d7be507SJakub Kicinski 	__u8 use_adaptive_tx;
26282d7be507SJakub Kicinski 	__u32 pkt_rate_low;
26292d7be507SJakub Kicinski 	__u32 rx_usecs_low;
26302d7be507SJakub Kicinski 	__u32 rx_max_frames_low;
26312d7be507SJakub Kicinski 	__u32 tx_usecs_low;
26322d7be507SJakub Kicinski 	__u32 tx_max_frames_low;
26332d7be507SJakub Kicinski 	__u32 pkt_rate_high;
26342d7be507SJakub Kicinski 	__u32 rx_usecs_high;
26352d7be507SJakub Kicinski 	__u32 rx_max_frames_high;
26362d7be507SJakub Kicinski 	__u32 tx_usecs_high;
26372d7be507SJakub Kicinski 	__u32 tx_max_frames_high;
26382d7be507SJakub Kicinski 	__u32 rate_sample_interval;
26392d7be507SJakub Kicinski 	__u8 use_cqe_mode_tx;
26402d7be507SJakub Kicinski 	__u8 use_cqe_mode_rx;
26412d7be507SJakub Kicinski 	__u32 tx_aggr_max_bytes;
26422d7be507SJakub Kicinski 	__u32 tx_aggr_max_frames;
26432d7be507SJakub Kicinski 	__u32 tx_aggr_time_usecs;
26442d7be507SJakub Kicinski };
26452d7be507SJakub Kicinski 
26462d7be507SJakub Kicinski void ethtool_coalesce_get_rsp_free(struct ethtool_coalesce_get_rsp *rsp);
26472d7be507SJakub Kicinski 
26482d7be507SJakub Kicinski /*
26492d7be507SJakub Kicinski  * Get coalesce params.
26502d7be507SJakub Kicinski  */
26512d7be507SJakub Kicinski struct ethtool_coalesce_get_rsp *
26522d7be507SJakub Kicinski ethtool_coalesce_get(struct ynl_sock *ys, struct ethtool_coalesce_get_req *req);
26532d7be507SJakub Kicinski 
26542d7be507SJakub Kicinski /* ETHTOOL_MSG_COALESCE_GET - dump */
26552d7be507SJakub Kicinski struct ethtool_coalesce_get_req_dump {
26562d7be507SJakub Kicinski 	struct {
26572d7be507SJakub Kicinski 		__u32 header:1;
26582d7be507SJakub Kicinski 	} _present;
26592d7be507SJakub Kicinski 
26602d7be507SJakub Kicinski 	struct ethtool_header header;
26612d7be507SJakub Kicinski };
26622d7be507SJakub Kicinski 
26632d7be507SJakub Kicinski static inline struct ethtool_coalesce_get_req_dump *
ethtool_coalesce_get_req_dump_alloc(void)26642d7be507SJakub Kicinski ethtool_coalesce_get_req_dump_alloc(void)
26652d7be507SJakub Kicinski {
26662d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_coalesce_get_req_dump));
26672d7be507SJakub Kicinski }
26682d7be507SJakub Kicinski void
26692d7be507SJakub Kicinski ethtool_coalesce_get_req_dump_free(struct ethtool_coalesce_get_req_dump *req);
26702d7be507SJakub Kicinski 
26712d7be507SJakub Kicinski static inline void
ethtool_coalesce_get_req_dump_set_header_dev_index(struct ethtool_coalesce_get_req_dump * req,__u32 dev_index)26722d7be507SJakub Kicinski ethtool_coalesce_get_req_dump_set_header_dev_index(struct ethtool_coalesce_get_req_dump *req,
26732d7be507SJakub Kicinski 						   __u32 dev_index)
26742d7be507SJakub Kicinski {
26752d7be507SJakub Kicinski 	req->_present.header = 1;
26762d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
26772d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
26782d7be507SJakub Kicinski }
26792d7be507SJakub Kicinski static inline void
ethtool_coalesce_get_req_dump_set_header_dev_name(struct ethtool_coalesce_get_req_dump * req,const char * dev_name)26802d7be507SJakub Kicinski ethtool_coalesce_get_req_dump_set_header_dev_name(struct ethtool_coalesce_get_req_dump *req,
26812d7be507SJakub Kicinski 						  const char *dev_name)
26822d7be507SJakub Kicinski {
26832d7be507SJakub Kicinski 	free(req->header.dev_name);
26842d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
26852d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
26862d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
26872d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
26882d7be507SJakub Kicinski }
26892d7be507SJakub Kicinski static inline void
ethtool_coalesce_get_req_dump_set_header_flags(struct ethtool_coalesce_get_req_dump * req,__u32 flags)26902d7be507SJakub Kicinski ethtool_coalesce_get_req_dump_set_header_flags(struct ethtool_coalesce_get_req_dump *req,
26912d7be507SJakub Kicinski 					       __u32 flags)
26922d7be507SJakub Kicinski {
26932d7be507SJakub Kicinski 	req->_present.header = 1;
26942d7be507SJakub Kicinski 	req->header._present.flags = 1;
26952d7be507SJakub Kicinski 	req->header.flags = flags;
26962d7be507SJakub Kicinski }
26972d7be507SJakub Kicinski 
26982d7be507SJakub Kicinski struct ethtool_coalesce_get_list {
26992d7be507SJakub Kicinski 	struct ethtool_coalesce_get_list *next;
27002d7be507SJakub Kicinski 	struct ethtool_coalesce_get_rsp obj __attribute__ ((aligned (8)));
27012d7be507SJakub Kicinski };
27022d7be507SJakub Kicinski 
27032d7be507SJakub Kicinski void ethtool_coalesce_get_list_free(struct ethtool_coalesce_get_list *rsp);
27042d7be507SJakub Kicinski 
27052d7be507SJakub Kicinski struct ethtool_coalesce_get_list *
27062d7be507SJakub Kicinski ethtool_coalesce_get_dump(struct ynl_sock *ys,
27072d7be507SJakub Kicinski 			  struct ethtool_coalesce_get_req_dump *req);
27082d7be507SJakub Kicinski 
27092d7be507SJakub Kicinski /* ETHTOOL_MSG_COALESCE_GET - notify */
27102d7be507SJakub Kicinski struct ethtool_coalesce_get_ntf {
27112d7be507SJakub Kicinski 	__u16 family;
27122d7be507SJakub Kicinski 	__u8 cmd;
27132d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
27142d7be507SJakub Kicinski 	void (*free)(struct ethtool_coalesce_get_ntf *ntf);
27152d7be507SJakub Kicinski 	struct ethtool_coalesce_get_rsp obj __attribute__ ((aligned (8)));
27162d7be507SJakub Kicinski };
27172d7be507SJakub Kicinski 
27182d7be507SJakub Kicinski void ethtool_coalesce_get_ntf_free(struct ethtool_coalesce_get_ntf *rsp);
27192d7be507SJakub Kicinski 
27202d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_COALESCE_SET ============== */
27212d7be507SJakub Kicinski /* ETHTOOL_MSG_COALESCE_SET - do */
27222d7be507SJakub Kicinski struct ethtool_coalesce_set_req {
27232d7be507SJakub Kicinski 	struct {
27242d7be507SJakub Kicinski 		__u32 header:1;
27252d7be507SJakub Kicinski 		__u32 rx_usecs:1;
27262d7be507SJakub Kicinski 		__u32 rx_max_frames:1;
27272d7be507SJakub Kicinski 		__u32 rx_usecs_irq:1;
27282d7be507SJakub Kicinski 		__u32 rx_max_frames_irq:1;
27292d7be507SJakub Kicinski 		__u32 tx_usecs:1;
27302d7be507SJakub Kicinski 		__u32 tx_max_frames:1;
27312d7be507SJakub Kicinski 		__u32 tx_usecs_irq:1;
27322d7be507SJakub Kicinski 		__u32 tx_max_frames_irq:1;
27332d7be507SJakub Kicinski 		__u32 stats_block_usecs:1;
27342d7be507SJakub Kicinski 		__u32 use_adaptive_rx:1;
27352d7be507SJakub Kicinski 		__u32 use_adaptive_tx:1;
27362d7be507SJakub Kicinski 		__u32 pkt_rate_low:1;
27372d7be507SJakub Kicinski 		__u32 rx_usecs_low:1;
27382d7be507SJakub Kicinski 		__u32 rx_max_frames_low:1;
27392d7be507SJakub Kicinski 		__u32 tx_usecs_low:1;
27402d7be507SJakub Kicinski 		__u32 tx_max_frames_low:1;
27412d7be507SJakub Kicinski 		__u32 pkt_rate_high:1;
27422d7be507SJakub Kicinski 		__u32 rx_usecs_high:1;
27432d7be507SJakub Kicinski 		__u32 rx_max_frames_high:1;
27442d7be507SJakub Kicinski 		__u32 tx_usecs_high:1;
27452d7be507SJakub Kicinski 		__u32 tx_max_frames_high:1;
27462d7be507SJakub Kicinski 		__u32 rate_sample_interval:1;
27472d7be507SJakub Kicinski 		__u32 use_cqe_mode_tx:1;
27482d7be507SJakub Kicinski 		__u32 use_cqe_mode_rx:1;
27492d7be507SJakub Kicinski 		__u32 tx_aggr_max_bytes:1;
27502d7be507SJakub Kicinski 		__u32 tx_aggr_max_frames:1;
27512d7be507SJakub Kicinski 		__u32 tx_aggr_time_usecs:1;
27522d7be507SJakub Kicinski 	} _present;
27532d7be507SJakub Kicinski 
27542d7be507SJakub Kicinski 	struct ethtool_header header;
27552d7be507SJakub Kicinski 	__u32 rx_usecs;
27562d7be507SJakub Kicinski 	__u32 rx_max_frames;
27572d7be507SJakub Kicinski 	__u32 rx_usecs_irq;
27582d7be507SJakub Kicinski 	__u32 rx_max_frames_irq;
27592d7be507SJakub Kicinski 	__u32 tx_usecs;
27602d7be507SJakub Kicinski 	__u32 tx_max_frames;
27612d7be507SJakub Kicinski 	__u32 tx_usecs_irq;
27622d7be507SJakub Kicinski 	__u32 tx_max_frames_irq;
27632d7be507SJakub Kicinski 	__u32 stats_block_usecs;
27642d7be507SJakub Kicinski 	__u8 use_adaptive_rx;
27652d7be507SJakub Kicinski 	__u8 use_adaptive_tx;
27662d7be507SJakub Kicinski 	__u32 pkt_rate_low;
27672d7be507SJakub Kicinski 	__u32 rx_usecs_low;
27682d7be507SJakub Kicinski 	__u32 rx_max_frames_low;
27692d7be507SJakub Kicinski 	__u32 tx_usecs_low;
27702d7be507SJakub Kicinski 	__u32 tx_max_frames_low;
27712d7be507SJakub Kicinski 	__u32 pkt_rate_high;
27722d7be507SJakub Kicinski 	__u32 rx_usecs_high;
27732d7be507SJakub Kicinski 	__u32 rx_max_frames_high;
27742d7be507SJakub Kicinski 	__u32 tx_usecs_high;
27752d7be507SJakub Kicinski 	__u32 tx_max_frames_high;
27762d7be507SJakub Kicinski 	__u32 rate_sample_interval;
27772d7be507SJakub Kicinski 	__u8 use_cqe_mode_tx;
27782d7be507SJakub Kicinski 	__u8 use_cqe_mode_rx;
27792d7be507SJakub Kicinski 	__u32 tx_aggr_max_bytes;
27802d7be507SJakub Kicinski 	__u32 tx_aggr_max_frames;
27812d7be507SJakub Kicinski 	__u32 tx_aggr_time_usecs;
27822d7be507SJakub Kicinski };
27832d7be507SJakub Kicinski 
27842d7be507SJakub Kicinski static inline struct ethtool_coalesce_set_req *
ethtool_coalesce_set_req_alloc(void)27852d7be507SJakub Kicinski ethtool_coalesce_set_req_alloc(void)
27862d7be507SJakub Kicinski {
27872d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_coalesce_set_req));
27882d7be507SJakub Kicinski }
27892d7be507SJakub Kicinski void ethtool_coalesce_set_req_free(struct ethtool_coalesce_set_req *req);
27902d7be507SJakub Kicinski 
27912d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_header_dev_index(struct ethtool_coalesce_set_req * req,__u32 dev_index)27922d7be507SJakub Kicinski ethtool_coalesce_set_req_set_header_dev_index(struct ethtool_coalesce_set_req *req,
27932d7be507SJakub Kicinski 					      __u32 dev_index)
27942d7be507SJakub Kicinski {
27952d7be507SJakub Kicinski 	req->_present.header = 1;
27962d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
27972d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
27982d7be507SJakub Kicinski }
27992d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_header_dev_name(struct ethtool_coalesce_set_req * req,const char * dev_name)28002d7be507SJakub Kicinski ethtool_coalesce_set_req_set_header_dev_name(struct ethtool_coalesce_set_req *req,
28012d7be507SJakub Kicinski 					     const char *dev_name)
28022d7be507SJakub Kicinski {
28032d7be507SJakub Kicinski 	free(req->header.dev_name);
28042d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
28052d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
28062d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
28072d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
28082d7be507SJakub Kicinski }
28092d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_header_flags(struct ethtool_coalesce_set_req * req,__u32 flags)28102d7be507SJakub Kicinski ethtool_coalesce_set_req_set_header_flags(struct ethtool_coalesce_set_req *req,
28112d7be507SJakub Kicinski 					  __u32 flags)
28122d7be507SJakub Kicinski {
28132d7be507SJakub Kicinski 	req->_present.header = 1;
28142d7be507SJakub Kicinski 	req->header._present.flags = 1;
28152d7be507SJakub Kicinski 	req->header.flags = flags;
28162d7be507SJakub Kicinski }
28172d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_rx_usecs(struct ethtool_coalesce_set_req * req,__u32 rx_usecs)28182d7be507SJakub Kicinski ethtool_coalesce_set_req_set_rx_usecs(struct ethtool_coalesce_set_req *req,
28192d7be507SJakub Kicinski 				      __u32 rx_usecs)
28202d7be507SJakub Kicinski {
28212d7be507SJakub Kicinski 	req->_present.rx_usecs = 1;
28222d7be507SJakub Kicinski 	req->rx_usecs = rx_usecs;
28232d7be507SJakub Kicinski }
28242d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_rx_max_frames(struct ethtool_coalesce_set_req * req,__u32 rx_max_frames)28252d7be507SJakub Kicinski ethtool_coalesce_set_req_set_rx_max_frames(struct ethtool_coalesce_set_req *req,
28262d7be507SJakub Kicinski 					   __u32 rx_max_frames)
28272d7be507SJakub Kicinski {
28282d7be507SJakub Kicinski 	req->_present.rx_max_frames = 1;
28292d7be507SJakub Kicinski 	req->rx_max_frames = rx_max_frames;
28302d7be507SJakub Kicinski }
28312d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_rx_usecs_irq(struct ethtool_coalesce_set_req * req,__u32 rx_usecs_irq)28322d7be507SJakub Kicinski ethtool_coalesce_set_req_set_rx_usecs_irq(struct ethtool_coalesce_set_req *req,
28332d7be507SJakub Kicinski 					  __u32 rx_usecs_irq)
28342d7be507SJakub Kicinski {
28352d7be507SJakub Kicinski 	req->_present.rx_usecs_irq = 1;
28362d7be507SJakub Kicinski 	req->rx_usecs_irq = rx_usecs_irq;
28372d7be507SJakub Kicinski }
28382d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_rx_max_frames_irq(struct ethtool_coalesce_set_req * req,__u32 rx_max_frames_irq)28392d7be507SJakub Kicinski ethtool_coalesce_set_req_set_rx_max_frames_irq(struct ethtool_coalesce_set_req *req,
28402d7be507SJakub Kicinski 					       __u32 rx_max_frames_irq)
28412d7be507SJakub Kicinski {
28422d7be507SJakub Kicinski 	req->_present.rx_max_frames_irq = 1;
28432d7be507SJakub Kicinski 	req->rx_max_frames_irq = rx_max_frames_irq;
28442d7be507SJakub Kicinski }
28452d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_tx_usecs(struct ethtool_coalesce_set_req * req,__u32 tx_usecs)28462d7be507SJakub Kicinski ethtool_coalesce_set_req_set_tx_usecs(struct ethtool_coalesce_set_req *req,
28472d7be507SJakub Kicinski 				      __u32 tx_usecs)
28482d7be507SJakub Kicinski {
28492d7be507SJakub Kicinski 	req->_present.tx_usecs = 1;
28502d7be507SJakub Kicinski 	req->tx_usecs = tx_usecs;
28512d7be507SJakub Kicinski }
28522d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_tx_max_frames(struct ethtool_coalesce_set_req * req,__u32 tx_max_frames)28532d7be507SJakub Kicinski ethtool_coalesce_set_req_set_tx_max_frames(struct ethtool_coalesce_set_req *req,
28542d7be507SJakub Kicinski 					   __u32 tx_max_frames)
28552d7be507SJakub Kicinski {
28562d7be507SJakub Kicinski 	req->_present.tx_max_frames = 1;
28572d7be507SJakub Kicinski 	req->tx_max_frames = tx_max_frames;
28582d7be507SJakub Kicinski }
28592d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_tx_usecs_irq(struct ethtool_coalesce_set_req * req,__u32 tx_usecs_irq)28602d7be507SJakub Kicinski ethtool_coalesce_set_req_set_tx_usecs_irq(struct ethtool_coalesce_set_req *req,
28612d7be507SJakub Kicinski 					  __u32 tx_usecs_irq)
28622d7be507SJakub Kicinski {
28632d7be507SJakub Kicinski 	req->_present.tx_usecs_irq = 1;
28642d7be507SJakub Kicinski 	req->tx_usecs_irq = tx_usecs_irq;
28652d7be507SJakub Kicinski }
28662d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_tx_max_frames_irq(struct ethtool_coalesce_set_req * req,__u32 tx_max_frames_irq)28672d7be507SJakub Kicinski ethtool_coalesce_set_req_set_tx_max_frames_irq(struct ethtool_coalesce_set_req *req,
28682d7be507SJakub Kicinski 					       __u32 tx_max_frames_irq)
28692d7be507SJakub Kicinski {
28702d7be507SJakub Kicinski 	req->_present.tx_max_frames_irq = 1;
28712d7be507SJakub Kicinski 	req->tx_max_frames_irq = tx_max_frames_irq;
28722d7be507SJakub Kicinski }
28732d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_stats_block_usecs(struct ethtool_coalesce_set_req * req,__u32 stats_block_usecs)28742d7be507SJakub Kicinski ethtool_coalesce_set_req_set_stats_block_usecs(struct ethtool_coalesce_set_req *req,
28752d7be507SJakub Kicinski 					       __u32 stats_block_usecs)
28762d7be507SJakub Kicinski {
28772d7be507SJakub Kicinski 	req->_present.stats_block_usecs = 1;
28782d7be507SJakub Kicinski 	req->stats_block_usecs = stats_block_usecs;
28792d7be507SJakub Kicinski }
28802d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_use_adaptive_rx(struct ethtool_coalesce_set_req * req,__u8 use_adaptive_rx)28812d7be507SJakub Kicinski ethtool_coalesce_set_req_set_use_adaptive_rx(struct ethtool_coalesce_set_req *req,
28822d7be507SJakub Kicinski 					     __u8 use_adaptive_rx)
28832d7be507SJakub Kicinski {
28842d7be507SJakub Kicinski 	req->_present.use_adaptive_rx = 1;
28852d7be507SJakub Kicinski 	req->use_adaptive_rx = use_adaptive_rx;
28862d7be507SJakub Kicinski }
28872d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_use_adaptive_tx(struct ethtool_coalesce_set_req * req,__u8 use_adaptive_tx)28882d7be507SJakub Kicinski ethtool_coalesce_set_req_set_use_adaptive_tx(struct ethtool_coalesce_set_req *req,
28892d7be507SJakub Kicinski 					     __u8 use_adaptive_tx)
28902d7be507SJakub Kicinski {
28912d7be507SJakub Kicinski 	req->_present.use_adaptive_tx = 1;
28922d7be507SJakub Kicinski 	req->use_adaptive_tx = use_adaptive_tx;
28932d7be507SJakub Kicinski }
28942d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_pkt_rate_low(struct ethtool_coalesce_set_req * req,__u32 pkt_rate_low)28952d7be507SJakub Kicinski ethtool_coalesce_set_req_set_pkt_rate_low(struct ethtool_coalesce_set_req *req,
28962d7be507SJakub Kicinski 					  __u32 pkt_rate_low)
28972d7be507SJakub Kicinski {
28982d7be507SJakub Kicinski 	req->_present.pkt_rate_low = 1;
28992d7be507SJakub Kicinski 	req->pkt_rate_low = pkt_rate_low;
29002d7be507SJakub Kicinski }
29012d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_rx_usecs_low(struct ethtool_coalesce_set_req * req,__u32 rx_usecs_low)29022d7be507SJakub Kicinski ethtool_coalesce_set_req_set_rx_usecs_low(struct ethtool_coalesce_set_req *req,
29032d7be507SJakub Kicinski 					  __u32 rx_usecs_low)
29042d7be507SJakub Kicinski {
29052d7be507SJakub Kicinski 	req->_present.rx_usecs_low = 1;
29062d7be507SJakub Kicinski 	req->rx_usecs_low = rx_usecs_low;
29072d7be507SJakub Kicinski }
29082d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_rx_max_frames_low(struct ethtool_coalesce_set_req * req,__u32 rx_max_frames_low)29092d7be507SJakub Kicinski ethtool_coalesce_set_req_set_rx_max_frames_low(struct ethtool_coalesce_set_req *req,
29102d7be507SJakub Kicinski 					       __u32 rx_max_frames_low)
29112d7be507SJakub Kicinski {
29122d7be507SJakub Kicinski 	req->_present.rx_max_frames_low = 1;
29132d7be507SJakub Kicinski 	req->rx_max_frames_low = rx_max_frames_low;
29142d7be507SJakub Kicinski }
29152d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_tx_usecs_low(struct ethtool_coalesce_set_req * req,__u32 tx_usecs_low)29162d7be507SJakub Kicinski ethtool_coalesce_set_req_set_tx_usecs_low(struct ethtool_coalesce_set_req *req,
29172d7be507SJakub Kicinski 					  __u32 tx_usecs_low)
29182d7be507SJakub Kicinski {
29192d7be507SJakub Kicinski 	req->_present.tx_usecs_low = 1;
29202d7be507SJakub Kicinski 	req->tx_usecs_low = tx_usecs_low;
29212d7be507SJakub Kicinski }
29222d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_tx_max_frames_low(struct ethtool_coalesce_set_req * req,__u32 tx_max_frames_low)29232d7be507SJakub Kicinski ethtool_coalesce_set_req_set_tx_max_frames_low(struct ethtool_coalesce_set_req *req,
29242d7be507SJakub Kicinski 					       __u32 tx_max_frames_low)
29252d7be507SJakub Kicinski {
29262d7be507SJakub Kicinski 	req->_present.tx_max_frames_low = 1;
29272d7be507SJakub Kicinski 	req->tx_max_frames_low = tx_max_frames_low;
29282d7be507SJakub Kicinski }
29292d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_pkt_rate_high(struct ethtool_coalesce_set_req * req,__u32 pkt_rate_high)29302d7be507SJakub Kicinski ethtool_coalesce_set_req_set_pkt_rate_high(struct ethtool_coalesce_set_req *req,
29312d7be507SJakub Kicinski 					   __u32 pkt_rate_high)
29322d7be507SJakub Kicinski {
29332d7be507SJakub Kicinski 	req->_present.pkt_rate_high = 1;
29342d7be507SJakub Kicinski 	req->pkt_rate_high = pkt_rate_high;
29352d7be507SJakub Kicinski }
29362d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_rx_usecs_high(struct ethtool_coalesce_set_req * req,__u32 rx_usecs_high)29372d7be507SJakub Kicinski ethtool_coalesce_set_req_set_rx_usecs_high(struct ethtool_coalesce_set_req *req,
29382d7be507SJakub Kicinski 					   __u32 rx_usecs_high)
29392d7be507SJakub Kicinski {
29402d7be507SJakub Kicinski 	req->_present.rx_usecs_high = 1;
29412d7be507SJakub Kicinski 	req->rx_usecs_high = rx_usecs_high;
29422d7be507SJakub Kicinski }
29432d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_rx_max_frames_high(struct ethtool_coalesce_set_req * req,__u32 rx_max_frames_high)29442d7be507SJakub Kicinski ethtool_coalesce_set_req_set_rx_max_frames_high(struct ethtool_coalesce_set_req *req,
29452d7be507SJakub Kicinski 						__u32 rx_max_frames_high)
29462d7be507SJakub Kicinski {
29472d7be507SJakub Kicinski 	req->_present.rx_max_frames_high = 1;
29482d7be507SJakub Kicinski 	req->rx_max_frames_high = rx_max_frames_high;
29492d7be507SJakub Kicinski }
29502d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_tx_usecs_high(struct ethtool_coalesce_set_req * req,__u32 tx_usecs_high)29512d7be507SJakub Kicinski ethtool_coalesce_set_req_set_tx_usecs_high(struct ethtool_coalesce_set_req *req,
29522d7be507SJakub Kicinski 					   __u32 tx_usecs_high)
29532d7be507SJakub Kicinski {
29542d7be507SJakub Kicinski 	req->_present.tx_usecs_high = 1;
29552d7be507SJakub Kicinski 	req->tx_usecs_high = tx_usecs_high;
29562d7be507SJakub Kicinski }
29572d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_tx_max_frames_high(struct ethtool_coalesce_set_req * req,__u32 tx_max_frames_high)29582d7be507SJakub Kicinski ethtool_coalesce_set_req_set_tx_max_frames_high(struct ethtool_coalesce_set_req *req,
29592d7be507SJakub Kicinski 						__u32 tx_max_frames_high)
29602d7be507SJakub Kicinski {
29612d7be507SJakub Kicinski 	req->_present.tx_max_frames_high = 1;
29622d7be507SJakub Kicinski 	req->tx_max_frames_high = tx_max_frames_high;
29632d7be507SJakub Kicinski }
29642d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_rate_sample_interval(struct ethtool_coalesce_set_req * req,__u32 rate_sample_interval)29652d7be507SJakub Kicinski ethtool_coalesce_set_req_set_rate_sample_interval(struct ethtool_coalesce_set_req *req,
29662d7be507SJakub Kicinski 						  __u32 rate_sample_interval)
29672d7be507SJakub Kicinski {
29682d7be507SJakub Kicinski 	req->_present.rate_sample_interval = 1;
29692d7be507SJakub Kicinski 	req->rate_sample_interval = rate_sample_interval;
29702d7be507SJakub Kicinski }
29712d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_use_cqe_mode_tx(struct ethtool_coalesce_set_req * req,__u8 use_cqe_mode_tx)29722d7be507SJakub Kicinski ethtool_coalesce_set_req_set_use_cqe_mode_tx(struct ethtool_coalesce_set_req *req,
29732d7be507SJakub Kicinski 					     __u8 use_cqe_mode_tx)
29742d7be507SJakub Kicinski {
29752d7be507SJakub Kicinski 	req->_present.use_cqe_mode_tx = 1;
29762d7be507SJakub Kicinski 	req->use_cqe_mode_tx = use_cqe_mode_tx;
29772d7be507SJakub Kicinski }
29782d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_use_cqe_mode_rx(struct ethtool_coalesce_set_req * req,__u8 use_cqe_mode_rx)29792d7be507SJakub Kicinski ethtool_coalesce_set_req_set_use_cqe_mode_rx(struct ethtool_coalesce_set_req *req,
29802d7be507SJakub Kicinski 					     __u8 use_cqe_mode_rx)
29812d7be507SJakub Kicinski {
29822d7be507SJakub Kicinski 	req->_present.use_cqe_mode_rx = 1;
29832d7be507SJakub Kicinski 	req->use_cqe_mode_rx = use_cqe_mode_rx;
29842d7be507SJakub Kicinski }
29852d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_tx_aggr_max_bytes(struct ethtool_coalesce_set_req * req,__u32 tx_aggr_max_bytes)29862d7be507SJakub Kicinski ethtool_coalesce_set_req_set_tx_aggr_max_bytes(struct ethtool_coalesce_set_req *req,
29872d7be507SJakub Kicinski 					       __u32 tx_aggr_max_bytes)
29882d7be507SJakub Kicinski {
29892d7be507SJakub Kicinski 	req->_present.tx_aggr_max_bytes = 1;
29902d7be507SJakub Kicinski 	req->tx_aggr_max_bytes = tx_aggr_max_bytes;
29912d7be507SJakub Kicinski }
29922d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_tx_aggr_max_frames(struct ethtool_coalesce_set_req * req,__u32 tx_aggr_max_frames)29932d7be507SJakub Kicinski ethtool_coalesce_set_req_set_tx_aggr_max_frames(struct ethtool_coalesce_set_req *req,
29942d7be507SJakub Kicinski 						__u32 tx_aggr_max_frames)
29952d7be507SJakub Kicinski {
29962d7be507SJakub Kicinski 	req->_present.tx_aggr_max_frames = 1;
29972d7be507SJakub Kicinski 	req->tx_aggr_max_frames = tx_aggr_max_frames;
29982d7be507SJakub Kicinski }
29992d7be507SJakub Kicinski static inline void
ethtool_coalesce_set_req_set_tx_aggr_time_usecs(struct ethtool_coalesce_set_req * req,__u32 tx_aggr_time_usecs)30002d7be507SJakub Kicinski ethtool_coalesce_set_req_set_tx_aggr_time_usecs(struct ethtool_coalesce_set_req *req,
30012d7be507SJakub Kicinski 						__u32 tx_aggr_time_usecs)
30022d7be507SJakub Kicinski {
30032d7be507SJakub Kicinski 	req->_present.tx_aggr_time_usecs = 1;
30042d7be507SJakub Kicinski 	req->tx_aggr_time_usecs = tx_aggr_time_usecs;
30052d7be507SJakub Kicinski }
30062d7be507SJakub Kicinski 
30072d7be507SJakub Kicinski /*
30082d7be507SJakub Kicinski  * Set coalesce params.
30092d7be507SJakub Kicinski  */
30102d7be507SJakub Kicinski int ethtool_coalesce_set(struct ynl_sock *ys,
30112d7be507SJakub Kicinski 			 struct ethtool_coalesce_set_req *req);
30122d7be507SJakub Kicinski 
30132d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_PAUSE_GET ============== */
30142d7be507SJakub Kicinski /* ETHTOOL_MSG_PAUSE_GET - do */
30152d7be507SJakub Kicinski struct ethtool_pause_get_req {
30162d7be507SJakub Kicinski 	struct {
30172d7be507SJakub Kicinski 		__u32 header:1;
30182d7be507SJakub Kicinski 	} _present;
30192d7be507SJakub Kicinski 
30202d7be507SJakub Kicinski 	struct ethtool_header header;
30212d7be507SJakub Kicinski };
30222d7be507SJakub Kicinski 
ethtool_pause_get_req_alloc(void)30232d7be507SJakub Kicinski static inline struct ethtool_pause_get_req *ethtool_pause_get_req_alloc(void)
30242d7be507SJakub Kicinski {
30252d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_pause_get_req));
30262d7be507SJakub Kicinski }
30272d7be507SJakub Kicinski void ethtool_pause_get_req_free(struct ethtool_pause_get_req *req);
30282d7be507SJakub Kicinski 
30292d7be507SJakub Kicinski static inline void
ethtool_pause_get_req_set_header_dev_index(struct ethtool_pause_get_req * req,__u32 dev_index)30302d7be507SJakub Kicinski ethtool_pause_get_req_set_header_dev_index(struct ethtool_pause_get_req *req,
30312d7be507SJakub Kicinski 					   __u32 dev_index)
30322d7be507SJakub Kicinski {
30332d7be507SJakub Kicinski 	req->_present.header = 1;
30342d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
30352d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
30362d7be507SJakub Kicinski }
30372d7be507SJakub Kicinski static inline void
ethtool_pause_get_req_set_header_dev_name(struct ethtool_pause_get_req * req,const char * dev_name)30382d7be507SJakub Kicinski ethtool_pause_get_req_set_header_dev_name(struct ethtool_pause_get_req *req,
30392d7be507SJakub Kicinski 					  const char *dev_name)
30402d7be507SJakub Kicinski {
30412d7be507SJakub Kicinski 	free(req->header.dev_name);
30422d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
30432d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
30442d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
30452d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
30462d7be507SJakub Kicinski }
30472d7be507SJakub Kicinski static inline void
ethtool_pause_get_req_set_header_flags(struct ethtool_pause_get_req * req,__u32 flags)30482d7be507SJakub Kicinski ethtool_pause_get_req_set_header_flags(struct ethtool_pause_get_req *req,
30492d7be507SJakub Kicinski 				       __u32 flags)
30502d7be507SJakub Kicinski {
30512d7be507SJakub Kicinski 	req->_present.header = 1;
30522d7be507SJakub Kicinski 	req->header._present.flags = 1;
30532d7be507SJakub Kicinski 	req->header.flags = flags;
30542d7be507SJakub Kicinski }
30552d7be507SJakub Kicinski 
30562d7be507SJakub Kicinski struct ethtool_pause_get_rsp {
30572d7be507SJakub Kicinski 	struct {
30582d7be507SJakub Kicinski 		__u32 header:1;
30592d7be507SJakub Kicinski 		__u32 autoneg:1;
30602d7be507SJakub Kicinski 		__u32 rx:1;
30612d7be507SJakub Kicinski 		__u32 tx:1;
30622d7be507SJakub Kicinski 		__u32 stats:1;
30632d7be507SJakub Kicinski 		__u32 stats_src:1;
30642d7be507SJakub Kicinski 	} _present;
30652d7be507SJakub Kicinski 
30662d7be507SJakub Kicinski 	struct ethtool_header header;
30672d7be507SJakub Kicinski 	__u8 autoneg;
30682d7be507SJakub Kicinski 	__u8 rx;
30692d7be507SJakub Kicinski 	__u8 tx;
30702d7be507SJakub Kicinski 	struct ethtool_pause_stat stats;
30712d7be507SJakub Kicinski 	__u32 stats_src;
30722d7be507SJakub Kicinski };
30732d7be507SJakub Kicinski 
30742d7be507SJakub Kicinski void ethtool_pause_get_rsp_free(struct ethtool_pause_get_rsp *rsp);
30752d7be507SJakub Kicinski 
30762d7be507SJakub Kicinski /*
30772d7be507SJakub Kicinski  * Get pause params.
30782d7be507SJakub Kicinski  */
30792d7be507SJakub Kicinski struct ethtool_pause_get_rsp *
30802d7be507SJakub Kicinski ethtool_pause_get(struct ynl_sock *ys, struct ethtool_pause_get_req *req);
30812d7be507SJakub Kicinski 
30822d7be507SJakub Kicinski /* ETHTOOL_MSG_PAUSE_GET - dump */
30832d7be507SJakub Kicinski struct ethtool_pause_get_req_dump {
30842d7be507SJakub Kicinski 	struct {
30852d7be507SJakub Kicinski 		__u32 header:1;
30862d7be507SJakub Kicinski 	} _present;
30872d7be507SJakub Kicinski 
30882d7be507SJakub Kicinski 	struct ethtool_header header;
30892d7be507SJakub Kicinski };
30902d7be507SJakub Kicinski 
30912d7be507SJakub Kicinski static inline struct ethtool_pause_get_req_dump *
ethtool_pause_get_req_dump_alloc(void)30922d7be507SJakub Kicinski ethtool_pause_get_req_dump_alloc(void)
30932d7be507SJakub Kicinski {
30942d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_pause_get_req_dump));
30952d7be507SJakub Kicinski }
30962d7be507SJakub Kicinski void ethtool_pause_get_req_dump_free(struct ethtool_pause_get_req_dump *req);
30972d7be507SJakub Kicinski 
30982d7be507SJakub Kicinski static inline void
ethtool_pause_get_req_dump_set_header_dev_index(struct ethtool_pause_get_req_dump * req,__u32 dev_index)30992d7be507SJakub Kicinski ethtool_pause_get_req_dump_set_header_dev_index(struct ethtool_pause_get_req_dump *req,
31002d7be507SJakub Kicinski 						__u32 dev_index)
31012d7be507SJakub Kicinski {
31022d7be507SJakub Kicinski 	req->_present.header = 1;
31032d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
31042d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
31052d7be507SJakub Kicinski }
31062d7be507SJakub Kicinski static inline void
ethtool_pause_get_req_dump_set_header_dev_name(struct ethtool_pause_get_req_dump * req,const char * dev_name)31072d7be507SJakub Kicinski ethtool_pause_get_req_dump_set_header_dev_name(struct ethtool_pause_get_req_dump *req,
31082d7be507SJakub Kicinski 					       const char *dev_name)
31092d7be507SJakub Kicinski {
31102d7be507SJakub Kicinski 	free(req->header.dev_name);
31112d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
31122d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
31132d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
31142d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
31152d7be507SJakub Kicinski }
31162d7be507SJakub Kicinski static inline void
ethtool_pause_get_req_dump_set_header_flags(struct ethtool_pause_get_req_dump * req,__u32 flags)31172d7be507SJakub Kicinski ethtool_pause_get_req_dump_set_header_flags(struct ethtool_pause_get_req_dump *req,
31182d7be507SJakub Kicinski 					    __u32 flags)
31192d7be507SJakub Kicinski {
31202d7be507SJakub Kicinski 	req->_present.header = 1;
31212d7be507SJakub Kicinski 	req->header._present.flags = 1;
31222d7be507SJakub Kicinski 	req->header.flags = flags;
31232d7be507SJakub Kicinski }
31242d7be507SJakub Kicinski 
31252d7be507SJakub Kicinski struct ethtool_pause_get_list {
31262d7be507SJakub Kicinski 	struct ethtool_pause_get_list *next;
31272d7be507SJakub Kicinski 	struct ethtool_pause_get_rsp obj __attribute__ ((aligned (8)));
31282d7be507SJakub Kicinski };
31292d7be507SJakub Kicinski 
31302d7be507SJakub Kicinski void ethtool_pause_get_list_free(struct ethtool_pause_get_list *rsp);
31312d7be507SJakub Kicinski 
31322d7be507SJakub Kicinski struct ethtool_pause_get_list *
31332d7be507SJakub Kicinski ethtool_pause_get_dump(struct ynl_sock *ys,
31342d7be507SJakub Kicinski 		       struct ethtool_pause_get_req_dump *req);
31352d7be507SJakub Kicinski 
31362d7be507SJakub Kicinski /* ETHTOOL_MSG_PAUSE_GET - notify */
31372d7be507SJakub Kicinski struct ethtool_pause_get_ntf {
31382d7be507SJakub Kicinski 	__u16 family;
31392d7be507SJakub Kicinski 	__u8 cmd;
31402d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
31412d7be507SJakub Kicinski 	void (*free)(struct ethtool_pause_get_ntf *ntf);
31422d7be507SJakub Kicinski 	struct ethtool_pause_get_rsp obj __attribute__ ((aligned (8)));
31432d7be507SJakub Kicinski };
31442d7be507SJakub Kicinski 
31452d7be507SJakub Kicinski void ethtool_pause_get_ntf_free(struct ethtool_pause_get_ntf *rsp);
31462d7be507SJakub Kicinski 
31472d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_PAUSE_SET ============== */
31482d7be507SJakub Kicinski /* ETHTOOL_MSG_PAUSE_SET - do */
31492d7be507SJakub Kicinski struct ethtool_pause_set_req {
31502d7be507SJakub Kicinski 	struct {
31512d7be507SJakub Kicinski 		__u32 header:1;
31522d7be507SJakub Kicinski 		__u32 autoneg:1;
31532d7be507SJakub Kicinski 		__u32 rx:1;
31542d7be507SJakub Kicinski 		__u32 tx:1;
31552d7be507SJakub Kicinski 		__u32 stats:1;
31562d7be507SJakub Kicinski 		__u32 stats_src:1;
31572d7be507SJakub Kicinski 	} _present;
31582d7be507SJakub Kicinski 
31592d7be507SJakub Kicinski 	struct ethtool_header header;
31602d7be507SJakub Kicinski 	__u8 autoneg;
31612d7be507SJakub Kicinski 	__u8 rx;
31622d7be507SJakub Kicinski 	__u8 tx;
31632d7be507SJakub Kicinski 	struct ethtool_pause_stat stats;
31642d7be507SJakub Kicinski 	__u32 stats_src;
31652d7be507SJakub Kicinski };
31662d7be507SJakub Kicinski 
ethtool_pause_set_req_alloc(void)31672d7be507SJakub Kicinski static inline struct ethtool_pause_set_req *ethtool_pause_set_req_alloc(void)
31682d7be507SJakub Kicinski {
31692d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_pause_set_req));
31702d7be507SJakub Kicinski }
31712d7be507SJakub Kicinski void ethtool_pause_set_req_free(struct ethtool_pause_set_req *req);
31722d7be507SJakub Kicinski 
31732d7be507SJakub Kicinski static inline void
ethtool_pause_set_req_set_header_dev_index(struct ethtool_pause_set_req * req,__u32 dev_index)31742d7be507SJakub Kicinski ethtool_pause_set_req_set_header_dev_index(struct ethtool_pause_set_req *req,
31752d7be507SJakub Kicinski 					   __u32 dev_index)
31762d7be507SJakub Kicinski {
31772d7be507SJakub Kicinski 	req->_present.header = 1;
31782d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
31792d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
31802d7be507SJakub Kicinski }
31812d7be507SJakub Kicinski static inline void
ethtool_pause_set_req_set_header_dev_name(struct ethtool_pause_set_req * req,const char * dev_name)31822d7be507SJakub Kicinski ethtool_pause_set_req_set_header_dev_name(struct ethtool_pause_set_req *req,
31832d7be507SJakub Kicinski 					  const char *dev_name)
31842d7be507SJakub Kicinski {
31852d7be507SJakub Kicinski 	free(req->header.dev_name);
31862d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
31872d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
31882d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
31892d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
31902d7be507SJakub Kicinski }
31912d7be507SJakub Kicinski static inline void
ethtool_pause_set_req_set_header_flags(struct ethtool_pause_set_req * req,__u32 flags)31922d7be507SJakub Kicinski ethtool_pause_set_req_set_header_flags(struct ethtool_pause_set_req *req,
31932d7be507SJakub Kicinski 				       __u32 flags)
31942d7be507SJakub Kicinski {
31952d7be507SJakub Kicinski 	req->_present.header = 1;
31962d7be507SJakub Kicinski 	req->header._present.flags = 1;
31972d7be507SJakub Kicinski 	req->header.flags = flags;
31982d7be507SJakub Kicinski }
31992d7be507SJakub Kicinski static inline void
ethtool_pause_set_req_set_autoneg(struct ethtool_pause_set_req * req,__u8 autoneg)32002d7be507SJakub Kicinski ethtool_pause_set_req_set_autoneg(struct ethtool_pause_set_req *req,
32012d7be507SJakub Kicinski 				  __u8 autoneg)
32022d7be507SJakub Kicinski {
32032d7be507SJakub Kicinski 	req->_present.autoneg = 1;
32042d7be507SJakub Kicinski 	req->autoneg = autoneg;
32052d7be507SJakub Kicinski }
32062d7be507SJakub Kicinski static inline void
ethtool_pause_set_req_set_rx(struct ethtool_pause_set_req * req,__u8 rx)32072d7be507SJakub Kicinski ethtool_pause_set_req_set_rx(struct ethtool_pause_set_req *req, __u8 rx)
32082d7be507SJakub Kicinski {
32092d7be507SJakub Kicinski 	req->_present.rx = 1;
32102d7be507SJakub Kicinski 	req->rx = rx;
32112d7be507SJakub Kicinski }
32122d7be507SJakub Kicinski static inline void
ethtool_pause_set_req_set_tx(struct ethtool_pause_set_req * req,__u8 tx)32132d7be507SJakub Kicinski ethtool_pause_set_req_set_tx(struct ethtool_pause_set_req *req, __u8 tx)
32142d7be507SJakub Kicinski {
32152d7be507SJakub Kicinski 	req->_present.tx = 1;
32162d7be507SJakub Kicinski 	req->tx = tx;
32172d7be507SJakub Kicinski }
32182d7be507SJakub Kicinski static inline void
ethtool_pause_set_req_set_stats_tx_frames(struct ethtool_pause_set_req * req,__u64 tx_frames)32192d7be507SJakub Kicinski ethtool_pause_set_req_set_stats_tx_frames(struct ethtool_pause_set_req *req,
32202d7be507SJakub Kicinski 					  __u64 tx_frames)
32212d7be507SJakub Kicinski {
32222d7be507SJakub Kicinski 	req->_present.stats = 1;
32232d7be507SJakub Kicinski 	req->stats._present.tx_frames = 1;
32242d7be507SJakub Kicinski 	req->stats.tx_frames = tx_frames;
32252d7be507SJakub Kicinski }
32262d7be507SJakub Kicinski static inline void
ethtool_pause_set_req_set_stats_rx_frames(struct ethtool_pause_set_req * req,__u64 rx_frames)32272d7be507SJakub Kicinski ethtool_pause_set_req_set_stats_rx_frames(struct ethtool_pause_set_req *req,
32282d7be507SJakub Kicinski 					  __u64 rx_frames)
32292d7be507SJakub Kicinski {
32302d7be507SJakub Kicinski 	req->_present.stats = 1;
32312d7be507SJakub Kicinski 	req->stats._present.rx_frames = 1;
32322d7be507SJakub Kicinski 	req->stats.rx_frames = rx_frames;
32332d7be507SJakub Kicinski }
32342d7be507SJakub Kicinski static inline void
ethtool_pause_set_req_set_stats_src(struct ethtool_pause_set_req * req,__u32 stats_src)32352d7be507SJakub Kicinski ethtool_pause_set_req_set_stats_src(struct ethtool_pause_set_req *req,
32362d7be507SJakub Kicinski 				    __u32 stats_src)
32372d7be507SJakub Kicinski {
32382d7be507SJakub Kicinski 	req->_present.stats_src = 1;
32392d7be507SJakub Kicinski 	req->stats_src = stats_src;
32402d7be507SJakub Kicinski }
32412d7be507SJakub Kicinski 
32422d7be507SJakub Kicinski /*
32432d7be507SJakub Kicinski  * Set pause params.
32442d7be507SJakub Kicinski  */
32452d7be507SJakub Kicinski int ethtool_pause_set(struct ynl_sock *ys, struct ethtool_pause_set_req *req);
32462d7be507SJakub Kicinski 
32472d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_EEE_GET ============== */
32482d7be507SJakub Kicinski /* ETHTOOL_MSG_EEE_GET - do */
32492d7be507SJakub Kicinski struct ethtool_eee_get_req {
32502d7be507SJakub Kicinski 	struct {
32512d7be507SJakub Kicinski 		__u32 header:1;
32522d7be507SJakub Kicinski 	} _present;
32532d7be507SJakub Kicinski 
32542d7be507SJakub Kicinski 	struct ethtool_header header;
32552d7be507SJakub Kicinski };
32562d7be507SJakub Kicinski 
ethtool_eee_get_req_alloc(void)32572d7be507SJakub Kicinski static inline struct ethtool_eee_get_req *ethtool_eee_get_req_alloc(void)
32582d7be507SJakub Kicinski {
32592d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_eee_get_req));
32602d7be507SJakub Kicinski }
32612d7be507SJakub Kicinski void ethtool_eee_get_req_free(struct ethtool_eee_get_req *req);
32622d7be507SJakub Kicinski 
32632d7be507SJakub Kicinski static inline void
ethtool_eee_get_req_set_header_dev_index(struct ethtool_eee_get_req * req,__u32 dev_index)32642d7be507SJakub Kicinski ethtool_eee_get_req_set_header_dev_index(struct ethtool_eee_get_req *req,
32652d7be507SJakub Kicinski 					 __u32 dev_index)
32662d7be507SJakub Kicinski {
32672d7be507SJakub Kicinski 	req->_present.header = 1;
32682d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
32692d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
32702d7be507SJakub Kicinski }
32712d7be507SJakub Kicinski static inline void
ethtool_eee_get_req_set_header_dev_name(struct ethtool_eee_get_req * req,const char * dev_name)32722d7be507SJakub Kicinski ethtool_eee_get_req_set_header_dev_name(struct ethtool_eee_get_req *req,
32732d7be507SJakub Kicinski 					const char *dev_name)
32742d7be507SJakub Kicinski {
32752d7be507SJakub Kicinski 	free(req->header.dev_name);
32762d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
32772d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
32782d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
32792d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
32802d7be507SJakub Kicinski }
32812d7be507SJakub Kicinski static inline void
ethtool_eee_get_req_set_header_flags(struct ethtool_eee_get_req * req,__u32 flags)32822d7be507SJakub Kicinski ethtool_eee_get_req_set_header_flags(struct ethtool_eee_get_req *req,
32832d7be507SJakub Kicinski 				     __u32 flags)
32842d7be507SJakub Kicinski {
32852d7be507SJakub Kicinski 	req->_present.header = 1;
32862d7be507SJakub Kicinski 	req->header._present.flags = 1;
32872d7be507SJakub Kicinski 	req->header.flags = flags;
32882d7be507SJakub Kicinski }
32892d7be507SJakub Kicinski 
32902d7be507SJakub Kicinski struct ethtool_eee_get_rsp {
32912d7be507SJakub Kicinski 	struct {
32922d7be507SJakub Kicinski 		__u32 header:1;
32932d7be507SJakub Kicinski 		__u32 modes_ours:1;
32942d7be507SJakub Kicinski 		__u32 modes_peer:1;
32952d7be507SJakub Kicinski 		__u32 active:1;
32962d7be507SJakub Kicinski 		__u32 enabled:1;
32972d7be507SJakub Kicinski 		__u32 tx_lpi_enabled:1;
32982d7be507SJakub Kicinski 		__u32 tx_lpi_timer:1;
32992d7be507SJakub Kicinski 	} _present;
33002d7be507SJakub Kicinski 
33012d7be507SJakub Kicinski 	struct ethtool_header header;
33022d7be507SJakub Kicinski 	struct ethtool_bitset modes_ours;
33032d7be507SJakub Kicinski 	struct ethtool_bitset modes_peer;
33042d7be507SJakub Kicinski 	__u8 active;
33052d7be507SJakub Kicinski 	__u8 enabled;
33062d7be507SJakub Kicinski 	__u8 tx_lpi_enabled;
33072d7be507SJakub Kicinski 	__u32 tx_lpi_timer;
33082d7be507SJakub Kicinski };
33092d7be507SJakub Kicinski 
33102d7be507SJakub Kicinski void ethtool_eee_get_rsp_free(struct ethtool_eee_get_rsp *rsp);
33112d7be507SJakub Kicinski 
33122d7be507SJakub Kicinski /*
33132d7be507SJakub Kicinski  * Get eee params.
33142d7be507SJakub Kicinski  */
33152d7be507SJakub Kicinski struct ethtool_eee_get_rsp *
33162d7be507SJakub Kicinski ethtool_eee_get(struct ynl_sock *ys, struct ethtool_eee_get_req *req);
33172d7be507SJakub Kicinski 
33182d7be507SJakub Kicinski /* ETHTOOL_MSG_EEE_GET - dump */
33192d7be507SJakub Kicinski struct ethtool_eee_get_req_dump {
33202d7be507SJakub Kicinski 	struct {
33212d7be507SJakub Kicinski 		__u32 header:1;
33222d7be507SJakub Kicinski 	} _present;
33232d7be507SJakub Kicinski 
33242d7be507SJakub Kicinski 	struct ethtool_header header;
33252d7be507SJakub Kicinski };
33262d7be507SJakub Kicinski 
33272d7be507SJakub Kicinski static inline struct ethtool_eee_get_req_dump *
ethtool_eee_get_req_dump_alloc(void)33282d7be507SJakub Kicinski ethtool_eee_get_req_dump_alloc(void)
33292d7be507SJakub Kicinski {
33302d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_eee_get_req_dump));
33312d7be507SJakub Kicinski }
33322d7be507SJakub Kicinski void ethtool_eee_get_req_dump_free(struct ethtool_eee_get_req_dump *req);
33332d7be507SJakub Kicinski 
33342d7be507SJakub Kicinski static inline void
ethtool_eee_get_req_dump_set_header_dev_index(struct ethtool_eee_get_req_dump * req,__u32 dev_index)33352d7be507SJakub Kicinski ethtool_eee_get_req_dump_set_header_dev_index(struct ethtool_eee_get_req_dump *req,
33362d7be507SJakub Kicinski 					      __u32 dev_index)
33372d7be507SJakub Kicinski {
33382d7be507SJakub Kicinski 	req->_present.header = 1;
33392d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
33402d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
33412d7be507SJakub Kicinski }
33422d7be507SJakub Kicinski static inline void
ethtool_eee_get_req_dump_set_header_dev_name(struct ethtool_eee_get_req_dump * req,const char * dev_name)33432d7be507SJakub Kicinski ethtool_eee_get_req_dump_set_header_dev_name(struct ethtool_eee_get_req_dump *req,
33442d7be507SJakub Kicinski 					     const char *dev_name)
33452d7be507SJakub Kicinski {
33462d7be507SJakub Kicinski 	free(req->header.dev_name);
33472d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
33482d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
33492d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
33502d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
33512d7be507SJakub Kicinski }
33522d7be507SJakub Kicinski static inline void
ethtool_eee_get_req_dump_set_header_flags(struct ethtool_eee_get_req_dump * req,__u32 flags)33532d7be507SJakub Kicinski ethtool_eee_get_req_dump_set_header_flags(struct ethtool_eee_get_req_dump *req,
33542d7be507SJakub Kicinski 					  __u32 flags)
33552d7be507SJakub Kicinski {
33562d7be507SJakub Kicinski 	req->_present.header = 1;
33572d7be507SJakub Kicinski 	req->header._present.flags = 1;
33582d7be507SJakub Kicinski 	req->header.flags = flags;
33592d7be507SJakub Kicinski }
33602d7be507SJakub Kicinski 
33612d7be507SJakub Kicinski struct ethtool_eee_get_list {
33622d7be507SJakub Kicinski 	struct ethtool_eee_get_list *next;
33632d7be507SJakub Kicinski 	struct ethtool_eee_get_rsp obj __attribute__ ((aligned (8)));
33642d7be507SJakub Kicinski };
33652d7be507SJakub Kicinski 
33662d7be507SJakub Kicinski void ethtool_eee_get_list_free(struct ethtool_eee_get_list *rsp);
33672d7be507SJakub Kicinski 
33682d7be507SJakub Kicinski struct ethtool_eee_get_list *
33692d7be507SJakub Kicinski ethtool_eee_get_dump(struct ynl_sock *ys, struct ethtool_eee_get_req_dump *req);
33702d7be507SJakub Kicinski 
33712d7be507SJakub Kicinski /* ETHTOOL_MSG_EEE_GET - notify */
33722d7be507SJakub Kicinski struct ethtool_eee_get_ntf {
33732d7be507SJakub Kicinski 	__u16 family;
33742d7be507SJakub Kicinski 	__u8 cmd;
33752d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
33762d7be507SJakub Kicinski 	void (*free)(struct ethtool_eee_get_ntf *ntf);
33772d7be507SJakub Kicinski 	struct ethtool_eee_get_rsp obj __attribute__ ((aligned (8)));
33782d7be507SJakub Kicinski };
33792d7be507SJakub Kicinski 
33802d7be507SJakub Kicinski void ethtool_eee_get_ntf_free(struct ethtool_eee_get_ntf *rsp);
33812d7be507SJakub Kicinski 
33822d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_EEE_SET ============== */
33832d7be507SJakub Kicinski /* ETHTOOL_MSG_EEE_SET - do */
33842d7be507SJakub Kicinski struct ethtool_eee_set_req {
33852d7be507SJakub Kicinski 	struct {
33862d7be507SJakub Kicinski 		__u32 header:1;
33872d7be507SJakub Kicinski 		__u32 modes_ours:1;
33882d7be507SJakub Kicinski 		__u32 modes_peer:1;
33892d7be507SJakub Kicinski 		__u32 active:1;
33902d7be507SJakub Kicinski 		__u32 enabled:1;
33912d7be507SJakub Kicinski 		__u32 tx_lpi_enabled:1;
33922d7be507SJakub Kicinski 		__u32 tx_lpi_timer:1;
33932d7be507SJakub Kicinski 	} _present;
33942d7be507SJakub Kicinski 
33952d7be507SJakub Kicinski 	struct ethtool_header header;
33962d7be507SJakub Kicinski 	struct ethtool_bitset modes_ours;
33972d7be507SJakub Kicinski 	struct ethtool_bitset modes_peer;
33982d7be507SJakub Kicinski 	__u8 active;
33992d7be507SJakub Kicinski 	__u8 enabled;
34002d7be507SJakub Kicinski 	__u8 tx_lpi_enabled;
34012d7be507SJakub Kicinski 	__u32 tx_lpi_timer;
34022d7be507SJakub Kicinski };
34032d7be507SJakub Kicinski 
ethtool_eee_set_req_alloc(void)34042d7be507SJakub Kicinski static inline struct ethtool_eee_set_req *ethtool_eee_set_req_alloc(void)
34052d7be507SJakub Kicinski {
34062d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_eee_set_req));
34072d7be507SJakub Kicinski }
34082d7be507SJakub Kicinski void ethtool_eee_set_req_free(struct ethtool_eee_set_req *req);
34092d7be507SJakub Kicinski 
34102d7be507SJakub Kicinski static inline void
ethtool_eee_set_req_set_header_dev_index(struct ethtool_eee_set_req * req,__u32 dev_index)34112d7be507SJakub Kicinski ethtool_eee_set_req_set_header_dev_index(struct ethtool_eee_set_req *req,
34122d7be507SJakub Kicinski 					 __u32 dev_index)
34132d7be507SJakub Kicinski {
34142d7be507SJakub Kicinski 	req->_present.header = 1;
34152d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
34162d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
34172d7be507SJakub Kicinski }
34182d7be507SJakub Kicinski static inline void
ethtool_eee_set_req_set_header_dev_name(struct ethtool_eee_set_req * req,const char * dev_name)34192d7be507SJakub Kicinski ethtool_eee_set_req_set_header_dev_name(struct ethtool_eee_set_req *req,
34202d7be507SJakub Kicinski 					const char *dev_name)
34212d7be507SJakub Kicinski {
34222d7be507SJakub Kicinski 	free(req->header.dev_name);
34232d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
34242d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
34252d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
34262d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
34272d7be507SJakub Kicinski }
34282d7be507SJakub Kicinski static inline void
ethtool_eee_set_req_set_header_flags(struct ethtool_eee_set_req * req,__u32 flags)34292d7be507SJakub Kicinski ethtool_eee_set_req_set_header_flags(struct ethtool_eee_set_req *req,
34302d7be507SJakub Kicinski 				     __u32 flags)
34312d7be507SJakub Kicinski {
34322d7be507SJakub Kicinski 	req->_present.header = 1;
34332d7be507SJakub Kicinski 	req->header._present.flags = 1;
34342d7be507SJakub Kicinski 	req->header.flags = flags;
34352d7be507SJakub Kicinski }
34362d7be507SJakub Kicinski static inline void
ethtool_eee_set_req_set_modes_ours_nomask(struct ethtool_eee_set_req * req)34372d7be507SJakub Kicinski ethtool_eee_set_req_set_modes_ours_nomask(struct ethtool_eee_set_req *req)
34382d7be507SJakub Kicinski {
34392d7be507SJakub Kicinski 	req->_present.modes_ours = 1;
34402d7be507SJakub Kicinski 	req->modes_ours._present.nomask = 1;
34412d7be507SJakub Kicinski }
34422d7be507SJakub Kicinski static inline void
ethtool_eee_set_req_set_modes_ours_size(struct ethtool_eee_set_req * req,__u32 size)34432d7be507SJakub Kicinski ethtool_eee_set_req_set_modes_ours_size(struct ethtool_eee_set_req *req,
34442d7be507SJakub Kicinski 					__u32 size)
34452d7be507SJakub Kicinski {
34462d7be507SJakub Kicinski 	req->_present.modes_ours = 1;
34472d7be507SJakub Kicinski 	req->modes_ours._present.size = 1;
34482d7be507SJakub Kicinski 	req->modes_ours.size = size;
34492d7be507SJakub Kicinski }
34502d7be507SJakub Kicinski static inline void
__ethtool_eee_set_req_set_modes_ours_bits_bit(struct ethtool_eee_set_req * req,struct ethtool_bitset_bit * bit,unsigned int n_bit)34512d7be507SJakub Kicinski __ethtool_eee_set_req_set_modes_ours_bits_bit(struct ethtool_eee_set_req *req,
34522d7be507SJakub Kicinski 					      struct ethtool_bitset_bit *bit,
34532d7be507SJakub Kicinski 					      unsigned int n_bit)
34542d7be507SJakub Kicinski {
34552d7be507SJakub Kicinski 	free(req->modes_ours.bits.bit);
34562d7be507SJakub Kicinski 	req->modes_ours.bits.bit = bit;
34572d7be507SJakub Kicinski 	req->modes_ours.bits.n_bit = n_bit;
34582d7be507SJakub Kicinski }
34592d7be507SJakub Kicinski static inline void
ethtool_eee_set_req_set_modes_peer_nomask(struct ethtool_eee_set_req * req)34602d7be507SJakub Kicinski ethtool_eee_set_req_set_modes_peer_nomask(struct ethtool_eee_set_req *req)
34612d7be507SJakub Kicinski {
34622d7be507SJakub Kicinski 	req->_present.modes_peer = 1;
34632d7be507SJakub Kicinski 	req->modes_peer._present.nomask = 1;
34642d7be507SJakub Kicinski }
34652d7be507SJakub Kicinski static inline void
ethtool_eee_set_req_set_modes_peer_size(struct ethtool_eee_set_req * req,__u32 size)34662d7be507SJakub Kicinski ethtool_eee_set_req_set_modes_peer_size(struct ethtool_eee_set_req *req,
34672d7be507SJakub Kicinski 					__u32 size)
34682d7be507SJakub Kicinski {
34692d7be507SJakub Kicinski 	req->_present.modes_peer = 1;
34702d7be507SJakub Kicinski 	req->modes_peer._present.size = 1;
34712d7be507SJakub Kicinski 	req->modes_peer.size = size;
34722d7be507SJakub Kicinski }
34732d7be507SJakub Kicinski static inline void
__ethtool_eee_set_req_set_modes_peer_bits_bit(struct ethtool_eee_set_req * req,struct ethtool_bitset_bit * bit,unsigned int n_bit)34742d7be507SJakub Kicinski __ethtool_eee_set_req_set_modes_peer_bits_bit(struct ethtool_eee_set_req *req,
34752d7be507SJakub Kicinski 					      struct ethtool_bitset_bit *bit,
34762d7be507SJakub Kicinski 					      unsigned int n_bit)
34772d7be507SJakub Kicinski {
34782d7be507SJakub Kicinski 	free(req->modes_peer.bits.bit);
34792d7be507SJakub Kicinski 	req->modes_peer.bits.bit = bit;
34802d7be507SJakub Kicinski 	req->modes_peer.bits.n_bit = n_bit;
34812d7be507SJakub Kicinski }
34822d7be507SJakub Kicinski static inline void
ethtool_eee_set_req_set_active(struct ethtool_eee_set_req * req,__u8 active)34832d7be507SJakub Kicinski ethtool_eee_set_req_set_active(struct ethtool_eee_set_req *req, __u8 active)
34842d7be507SJakub Kicinski {
34852d7be507SJakub Kicinski 	req->_present.active = 1;
34862d7be507SJakub Kicinski 	req->active = active;
34872d7be507SJakub Kicinski }
34882d7be507SJakub Kicinski static inline void
ethtool_eee_set_req_set_enabled(struct ethtool_eee_set_req * req,__u8 enabled)34892d7be507SJakub Kicinski ethtool_eee_set_req_set_enabled(struct ethtool_eee_set_req *req, __u8 enabled)
34902d7be507SJakub Kicinski {
34912d7be507SJakub Kicinski 	req->_present.enabled = 1;
34922d7be507SJakub Kicinski 	req->enabled = enabled;
34932d7be507SJakub Kicinski }
34942d7be507SJakub Kicinski static inline void
ethtool_eee_set_req_set_tx_lpi_enabled(struct ethtool_eee_set_req * req,__u8 tx_lpi_enabled)34952d7be507SJakub Kicinski ethtool_eee_set_req_set_tx_lpi_enabled(struct ethtool_eee_set_req *req,
34962d7be507SJakub Kicinski 				       __u8 tx_lpi_enabled)
34972d7be507SJakub Kicinski {
34982d7be507SJakub Kicinski 	req->_present.tx_lpi_enabled = 1;
34992d7be507SJakub Kicinski 	req->tx_lpi_enabled = tx_lpi_enabled;
35002d7be507SJakub Kicinski }
35012d7be507SJakub Kicinski static inline void
ethtool_eee_set_req_set_tx_lpi_timer(struct ethtool_eee_set_req * req,__u32 tx_lpi_timer)35022d7be507SJakub Kicinski ethtool_eee_set_req_set_tx_lpi_timer(struct ethtool_eee_set_req *req,
35032d7be507SJakub Kicinski 				     __u32 tx_lpi_timer)
35042d7be507SJakub Kicinski {
35052d7be507SJakub Kicinski 	req->_present.tx_lpi_timer = 1;
35062d7be507SJakub Kicinski 	req->tx_lpi_timer = tx_lpi_timer;
35072d7be507SJakub Kicinski }
35082d7be507SJakub Kicinski 
35092d7be507SJakub Kicinski /*
35102d7be507SJakub Kicinski  * Set eee params.
35112d7be507SJakub Kicinski  */
35122d7be507SJakub Kicinski int ethtool_eee_set(struct ynl_sock *ys, struct ethtool_eee_set_req *req);
35132d7be507SJakub Kicinski 
35142d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_TSINFO_GET ============== */
35152d7be507SJakub Kicinski /* ETHTOOL_MSG_TSINFO_GET - do */
35162d7be507SJakub Kicinski struct ethtool_tsinfo_get_req {
35172d7be507SJakub Kicinski 	struct {
35182d7be507SJakub Kicinski 		__u32 header:1;
35192d7be507SJakub Kicinski 	} _present;
35202d7be507SJakub Kicinski 
35212d7be507SJakub Kicinski 	struct ethtool_header header;
35222d7be507SJakub Kicinski };
35232d7be507SJakub Kicinski 
ethtool_tsinfo_get_req_alloc(void)35242d7be507SJakub Kicinski static inline struct ethtool_tsinfo_get_req *ethtool_tsinfo_get_req_alloc(void)
35252d7be507SJakub Kicinski {
35262d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_tsinfo_get_req));
35272d7be507SJakub Kicinski }
35282d7be507SJakub Kicinski void ethtool_tsinfo_get_req_free(struct ethtool_tsinfo_get_req *req);
35292d7be507SJakub Kicinski 
35302d7be507SJakub Kicinski static inline void
ethtool_tsinfo_get_req_set_header_dev_index(struct ethtool_tsinfo_get_req * req,__u32 dev_index)35312d7be507SJakub Kicinski ethtool_tsinfo_get_req_set_header_dev_index(struct ethtool_tsinfo_get_req *req,
35322d7be507SJakub Kicinski 					    __u32 dev_index)
35332d7be507SJakub Kicinski {
35342d7be507SJakub Kicinski 	req->_present.header = 1;
35352d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
35362d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
35372d7be507SJakub Kicinski }
35382d7be507SJakub Kicinski static inline void
ethtool_tsinfo_get_req_set_header_dev_name(struct ethtool_tsinfo_get_req * req,const char * dev_name)35392d7be507SJakub Kicinski ethtool_tsinfo_get_req_set_header_dev_name(struct ethtool_tsinfo_get_req *req,
35402d7be507SJakub Kicinski 					   const char *dev_name)
35412d7be507SJakub Kicinski {
35422d7be507SJakub Kicinski 	free(req->header.dev_name);
35432d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
35442d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
35452d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
35462d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
35472d7be507SJakub Kicinski }
35482d7be507SJakub Kicinski static inline void
ethtool_tsinfo_get_req_set_header_flags(struct ethtool_tsinfo_get_req * req,__u32 flags)35492d7be507SJakub Kicinski ethtool_tsinfo_get_req_set_header_flags(struct ethtool_tsinfo_get_req *req,
35502d7be507SJakub Kicinski 					__u32 flags)
35512d7be507SJakub Kicinski {
35522d7be507SJakub Kicinski 	req->_present.header = 1;
35532d7be507SJakub Kicinski 	req->header._present.flags = 1;
35542d7be507SJakub Kicinski 	req->header.flags = flags;
35552d7be507SJakub Kicinski }
35562d7be507SJakub Kicinski 
35572d7be507SJakub Kicinski struct ethtool_tsinfo_get_rsp {
35582d7be507SJakub Kicinski 	struct {
35592d7be507SJakub Kicinski 		__u32 header:1;
35602d7be507SJakub Kicinski 		__u32 timestamping:1;
35612d7be507SJakub Kicinski 		__u32 tx_types:1;
35622d7be507SJakub Kicinski 		__u32 rx_filters:1;
35632d7be507SJakub Kicinski 		__u32 phc_index:1;
35642d7be507SJakub Kicinski 	} _present;
35652d7be507SJakub Kicinski 
35662d7be507SJakub Kicinski 	struct ethtool_header header;
35672d7be507SJakub Kicinski 	struct ethtool_bitset timestamping;
35682d7be507SJakub Kicinski 	struct ethtool_bitset tx_types;
35692d7be507SJakub Kicinski 	struct ethtool_bitset rx_filters;
35702d7be507SJakub Kicinski 	__u32 phc_index;
35712d7be507SJakub Kicinski };
35722d7be507SJakub Kicinski 
35732d7be507SJakub Kicinski void ethtool_tsinfo_get_rsp_free(struct ethtool_tsinfo_get_rsp *rsp);
35742d7be507SJakub Kicinski 
35752d7be507SJakub Kicinski /*
35762d7be507SJakub Kicinski  * Get tsinfo params.
35772d7be507SJakub Kicinski  */
35782d7be507SJakub Kicinski struct ethtool_tsinfo_get_rsp *
35792d7be507SJakub Kicinski ethtool_tsinfo_get(struct ynl_sock *ys, struct ethtool_tsinfo_get_req *req);
35802d7be507SJakub Kicinski 
35812d7be507SJakub Kicinski /* ETHTOOL_MSG_TSINFO_GET - dump */
35822d7be507SJakub Kicinski struct ethtool_tsinfo_get_req_dump {
35832d7be507SJakub Kicinski 	struct {
35842d7be507SJakub Kicinski 		__u32 header:1;
35852d7be507SJakub Kicinski 	} _present;
35862d7be507SJakub Kicinski 
35872d7be507SJakub Kicinski 	struct ethtool_header header;
35882d7be507SJakub Kicinski };
35892d7be507SJakub Kicinski 
35902d7be507SJakub Kicinski static inline struct ethtool_tsinfo_get_req_dump *
ethtool_tsinfo_get_req_dump_alloc(void)35912d7be507SJakub Kicinski ethtool_tsinfo_get_req_dump_alloc(void)
35922d7be507SJakub Kicinski {
35932d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_tsinfo_get_req_dump));
35942d7be507SJakub Kicinski }
35952d7be507SJakub Kicinski void ethtool_tsinfo_get_req_dump_free(struct ethtool_tsinfo_get_req_dump *req);
35962d7be507SJakub Kicinski 
35972d7be507SJakub Kicinski static inline void
ethtool_tsinfo_get_req_dump_set_header_dev_index(struct ethtool_tsinfo_get_req_dump * req,__u32 dev_index)35982d7be507SJakub Kicinski ethtool_tsinfo_get_req_dump_set_header_dev_index(struct ethtool_tsinfo_get_req_dump *req,
35992d7be507SJakub Kicinski 						 __u32 dev_index)
36002d7be507SJakub Kicinski {
36012d7be507SJakub Kicinski 	req->_present.header = 1;
36022d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
36032d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
36042d7be507SJakub Kicinski }
36052d7be507SJakub Kicinski static inline void
ethtool_tsinfo_get_req_dump_set_header_dev_name(struct ethtool_tsinfo_get_req_dump * req,const char * dev_name)36062d7be507SJakub Kicinski ethtool_tsinfo_get_req_dump_set_header_dev_name(struct ethtool_tsinfo_get_req_dump *req,
36072d7be507SJakub Kicinski 						const char *dev_name)
36082d7be507SJakub Kicinski {
36092d7be507SJakub Kicinski 	free(req->header.dev_name);
36102d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
36112d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
36122d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
36132d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
36142d7be507SJakub Kicinski }
36152d7be507SJakub Kicinski static inline void
ethtool_tsinfo_get_req_dump_set_header_flags(struct ethtool_tsinfo_get_req_dump * req,__u32 flags)36162d7be507SJakub Kicinski ethtool_tsinfo_get_req_dump_set_header_flags(struct ethtool_tsinfo_get_req_dump *req,
36172d7be507SJakub Kicinski 					     __u32 flags)
36182d7be507SJakub Kicinski {
36192d7be507SJakub Kicinski 	req->_present.header = 1;
36202d7be507SJakub Kicinski 	req->header._present.flags = 1;
36212d7be507SJakub Kicinski 	req->header.flags = flags;
36222d7be507SJakub Kicinski }
36232d7be507SJakub Kicinski 
36242d7be507SJakub Kicinski struct ethtool_tsinfo_get_list {
36252d7be507SJakub Kicinski 	struct ethtool_tsinfo_get_list *next;
36262d7be507SJakub Kicinski 	struct ethtool_tsinfo_get_rsp obj __attribute__ ((aligned (8)));
36272d7be507SJakub Kicinski };
36282d7be507SJakub Kicinski 
36292d7be507SJakub Kicinski void ethtool_tsinfo_get_list_free(struct ethtool_tsinfo_get_list *rsp);
36302d7be507SJakub Kicinski 
36312d7be507SJakub Kicinski struct ethtool_tsinfo_get_list *
36322d7be507SJakub Kicinski ethtool_tsinfo_get_dump(struct ynl_sock *ys,
36332d7be507SJakub Kicinski 			struct ethtool_tsinfo_get_req_dump *req);
36342d7be507SJakub Kicinski 
36352d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_CABLE_TEST_ACT ============== */
36362d7be507SJakub Kicinski /* ETHTOOL_MSG_CABLE_TEST_ACT - do */
36372d7be507SJakub Kicinski struct ethtool_cable_test_act_req {
36382d7be507SJakub Kicinski 	struct {
36392d7be507SJakub Kicinski 		__u32 header:1;
36402d7be507SJakub Kicinski 	} _present;
36412d7be507SJakub Kicinski 
36422d7be507SJakub Kicinski 	struct ethtool_header header;
36432d7be507SJakub Kicinski };
36442d7be507SJakub Kicinski 
36452d7be507SJakub Kicinski static inline struct ethtool_cable_test_act_req *
ethtool_cable_test_act_req_alloc(void)36462d7be507SJakub Kicinski ethtool_cable_test_act_req_alloc(void)
36472d7be507SJakub Kicinski {
36482d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_cable_test_act_req));
36492d7be507SJakub Kicinski }
36502d7be507SJakub Kicinski void ethtool_cable_test_act_req_free(struct ethtool_cable_test_act_req *req);
36512d7be507SJakub Kicinski 
36522d7be507SJakub Kicinski static inline void
ethtool_cable_test_act_req_set_header_dev_index(struct ethtool_cable_test_act_req * req,__u32 dev_index)36532d7be507SJakub Kicinski ethtool_cable_test_act_req_set_header_dev_index(struct ethtool_cable_test_act_req *req,
36542d7be507SJakub Kicinski 						__u32 dev_index)
36552d7be507SJakub Kicinski {
36562d7be507SJakub Kicinski 	req->_present.header = 1;
36572d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
36582d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
36592d7be507SJakub Kicinski }
36602d7be507SJakub Kicinski static inline void
ethtool_cable_test_act_req_set_header_dev_name(struct ethtool_cable_test_act_req * req,const char * dev_name)36612d7be507SJakub Kicinski ethtool_cable_test_act_req_set_header_dev_name(struct ethtool_cable_test_act_req *req,
36622d7be507SJakub Kicinski 					       const char *dev_name)
36632d7be507SJakub Kicinski {
36642d7be507SJakub Kicinski 	free(req->header.dev_name);
36652d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
36662d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
36672d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
36682d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
36692d7be507SJakub Kicinski }
36702d7be507SJakub Kicinski static inline void
ethtool_cable_test_act_req_set_header_flags(struct ethtool_cable_test_act_req * req,__u32 flags)36712d7be507SJakub Kicinski ethtool_cable_test_act_req_set_header_flags(struct ethtool_cable_test_act_req *req,
36722d7be507SJakub Kicinski 					    __u32 flags)
36732d7be507SJakub Kicinski {
36742d7be507SJakub Kicinski 	req->_present.header = 1;
36752d7be507SJakub Kicinski 	req->header._present.flags = 1;
36762d7be507SJakub Kicinski 	req->header.flags = flags;
36772d7be507SJakub Kicinski }
36782d7be507SJakub Kicinski 
36792d7be507SJakub Kicinski /*
36802d7be507SJakub Kicinski  * Cable test.
36812d7be507SJakub Kicinski  */
36822d7be507SJakub Kicinski int ethtool_cable_test_act(struct ynl_sock *ys,
36832d7be507SJakub Kicinski 			   struct ethtool_cable_test_act_req *req);
36842d7be507SJakub Kicinski 
36852d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_CABLE_TEST_TDR_ACT ============== */
36862d7be507SJakub Kicinski /* ETHTOOL_MSG_CABLE_TEST_TDR_ACT - do */
36872d7be507SJakub Kicinski struct ethtool_cable_test_tdr_act_req {
36882d7be507SJakub Kicinski 	struct {
36892d7be507SJakub Kicinski 		__u32 header:1;
36902d7be507SJakub Kicinski 	} _present;
36912d7be507SJakub Kicinski 
36922d7be507SJakub Kicinski 	struct ethtool_header header;
36932d7be507SJakub Kicinski };
36942d7be507SJakub Kicinski 
36952d7be507SJakub Kicinski static inline struct ethtool_cable_test_tdr_act_req *
ethtool_cable_test_tdr_act_req_alloc(void)36962d7be507SJakub Kicinski ethtool_cable_test_tdr_act_req_alloc(void)
36972d7be507SJakub Kicinski {
36982d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_cable_test_tdr_act_req));
36992d7be507SJakub Kicinski }
37002d7be507SJakub Kicinski void
37012d7be507SJakub Kicinski ethtool_cable_test_tdr_act_req_free(struct ethtool_cable_test_tdr_act_req *req);
37022d7be507SJakub Kicinski 
37032d7be507SJakub Kicinski static inline void
ethtool_cable_test_tdr_act_req_set_header_dev_index(struct ethtool_cable_test_tdr_act_req * req,__u32 dev_index)37042d7be507SJakub Kicinski ethtool_cable_test_tdr_act_req_set_header_dev_index(struct ethtool_cable_test_tdr_act_req *req,
37052d7be507SJakub Kicinski 						    __u32 dev_index)
37062d7be507SJakub Kicinski {
37072d7be507SJakub Kicinski 	req->_present.header = 1;
37082d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
37092d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
37102d7be507SJakub Kicinski }
37112d7be507SJakub Kicinski static inline void
ethtool_cable_test_tdr_act_req_set_header_dev_name(struct ethtool_cable_test_tdr_act_req * req,const char * dev_name)37122d7be507SJakub Kicinski ethtool_cable_test_tdr_act_req_set_header_dev_name(struct ethtool_cable_test_tdr_act_req *req,
37132d7be507SJakub Kicinski 						   const char *dev_name)
37142d7be507SJakub Kicinski {
37152d7be507SJakub Kicinski 	free(req->header.dev_name);
37162d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
37172d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
37182d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
37192d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
37202d7be507SJakub Kicinski }
37212d7be507SJakub Kicinski static inline void
ethtool_cable_test_tdr_act_req_set_header_flags(struct ethtool_cable_test_tdr_act_req * req,__u32 flags)37222d7be507SJakub Kicinski ethtool_cable_test_tdr_act_req_set_header_flags(struct ethtool_cable_test_tdr_act_req *req,
37232d7be507SJakub Kicinski 						__u32 flags)
37242d7be507SJakub Kicinski {
37252d7be507SJakub Kicinski 	req->_present.header = 1;
37262d7be507SJakub Kicinski 	req->header._present.flags = 1;
37272d7be507SJakub Kicinski 	req->header.flags = flags;
37282d7be507SJakub Kicinski }
37292d7be507SJakub Kicinski 
37302d7be507SJakub Kicinski /*
37312d7be507SJakub Kicinski  * Cable test TDR.
37322d7be507SJakub Kicinski  */
37332d7be507SJakub Kicinski int ethtool_cable_test_tdr_act(struct ynl_sock *ys,
37342d7be507SJakub Kicinski 			       struct ethtool_cable_test_tdr_act_req *req);
37352d7be507SJakub Kicinski 
37362d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_TUNNEL_INFO_GET ============== */
37372d7be507SJakub Kicinski /* ETHTOOL_MSG_TUNNEL_INFO_GET - do */
37382d7be507SJakub Kicinski struct ethtool_tunnel_info_get_req {
37392d7be507SJakub Kicinski 	struct {
37402d7be507SJakub Kicinski 		__u32 header:1;
37412d7be507SJakub Kicinski 	} _present;
37422d7be507SJakub Kicinski 
37432d7be507SJakub Kicinski 	struct ethtool_header header;
37442d7be507SJakub Kicinski };
37452d7be507SJakub Kicinski 
37462d7be507SJakub Kicinski static inline struct ethtool_tunnel_info_get_req *
ethtool_tunnel_info_get_req_alloc(void)37472d7be507SJakub Kicinski ethtool_tunnel_info_get_req_alloc(void)
37482d7be507SJakub Kicinski {
37492d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_tunnel_info_get_req));
37502d7be507SJakub Kicinski }
37512d7be507SJakub Kicinski void ethtool_tunnel_info_get_req_free(struct ethtool_tunnel_info_get_req *req);
37522d7be507SJakub Kicinski 
37532d7be507SJakub Kicinski static inline void
ethtool_tunnel_info_get_req_set_header_dev_index(struct ethtool_tunnel_info_get_req * req,__u32 dev_index)37542d7be507SJakub Kicinski ethtool_tunnel_info_get_req_set_header_dev_index(struct ethtool_tunnel_info_get_req *req,
37552d7be507SJakub Kicinski 						 __u32 dev_index)
37562d7be507SJakub Kicinski {
37572d7be507SJakub Kicinski 	req->_present.header = 1;
37582d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
37592d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
37602d7be507SJakub Kicinski }
37612d7be507SJakub Kicinski static inline void
ethtool_tunnel_info_get_req_set_header_dev_name(struct ethtool_tunnel_info_get_req * req,const char * dev_name)37622d7be507SJakub Kicinski ethtool_tunnel_info_get_req_set_header_dev_name(struct ethtool_tunnel_info_get_req *req,
37632d7be507SJakub Kicinski 						const char *dev_name)
37642d7be507SJakub Kicinski {
37652d7be507SJakub Kicinski 	free(req->header.dev_name);
37662d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
37672d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
37682d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
37692d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
37702d7be507SJakub Kicinski }
37712d7be507SJakub Kicinski static inline void
ethtool_tunnel_info_get_req_set_header_flags(struct ethtool_tunnel_info_get_req * req,__u32 flags)37722d7be507SJakub Kicinski ethtool_tunnel_info_get_req_set_header_flags(struct ethtool_tunnel_info_get_req *req,
37732d7be507SJakub Kicinski 					     __u32 flags)
37742d7be507SJakub Kicinski {
37752d7be507SJakub Kicinski 	req->_present.header = 1;
37762d7be507SJakub Kicinski 	req->header._present.flags = 1;
37772d7be507SJakub Kicinski 	req->header.flags = flags;
37782d7be507SJakub Kicinski }
37792d7be507SJakub Kicinski 
37802d7be507SJakub Kicinski struct ethtool_tunnel_info_get_rsp {
37812d7be507SJakub Kicinski 	struct {
37822d7be507SJakub Kicinski 		__u32 header:1;
37832d7be507SJakub Kicinski 		__u32 udp_ports:1;
37842d7be507SJakub Kicinski 	} _present;
37852d7be507SJakub Kicinski 
37862d7be507SJakub Kicinski 	struct ethtool_header header;
37872d7be507SJakub Kicinski 	struct ethtool_tunnel_udp udp_ports;
37882d7be507SJakub Kicinski };
37892d7be507SJakub Kicinski 
37902d7be507SJakub Kicinski void ethtool_tunnel_info_get_rsp_free(struct ethtool_tunnel_info_get_rsp *rsp);
37912d7be507SJakub Kicinski 
37922d7be507SJakub Kicinski /*
37932d7be507SJakub Kicinski  * Get tsinfo params.
37942d7be507SJakub Kicinski  */
37952d7be507SJakub Kicinski struct ethtool_tunnel_info_get_rsp *
37962d7be507SJakub Kicinski ethtool_tunnel_info_get(struct ynl_sock *ys,
37972d7be507SJakub Kicinski 			struct ethtool_tunnel_info_get_req *req);
37982d7be507SJakub Kicinski 
37992d7be507SJakub Kicinski /* ETHTOOL_MSG_TUNNEL_INFO_GET - dump */
38002d7be507SJakub Kicinski struct ethtool_tunnel_info_get_req_dump {
38012d7be507SJakub Kicinski 	struct {
38022d7be507SJakub Kicinski 		__u32 header:1;
38032d7be507SJakub Kicinski 	} _present;
38042d7be507SJakub Kicinski 
38052d7be507SJakub Kicinski 	struct ethtool_header header;
38062d7be507SJakub Kicinski };
38072d7be507SJakub Kicinski 
38082d7be507SJakub Kicinski static inline struct ethtool_tunnel_info_get_req_dump *
ethtool_tunnel_info_get_req_dump_alloc(void)38092d7be507SJakub Kicinski ethtool_tunnel_info_get_req_dump_alloc(void)
38102d7be507SJakub Kicinski {
38112d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_tunnel_info_get_req_dump));
38122d7be507SJakub Kicinski }
38132d7be507SJakub Kicinski void
38142d7be507SJakub Kicinski ethtool_tunnel_info_get_req_dump_free(struct ethtool_tunnel_info_get_req_dump *req);
38152d7be507SJakub Kicinski 
38162d7be507SJakub Kicinski static inline void
ethtool_tunnel_info_get_req_dump_set_header_dev_index(struct ethtool_tunnel_info_get_req_dump * req,__u32 dev_index)38172d7be507SJakub Kicinski ethtool_tunnel_info_get_req_dump_set_header_dev_index(struct ethtool_tunnel_info_get_req_dump *req,
38182d7be507SJakub Kicinski 						      __u32 dev_index)
38192d7be507SJakub Kicinski {
38202d7be507SJakub Kicinski 	req->_present.header = 1;
38212d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
38222d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
38232d7be507SJakub Kicinski }
38242d7be507SJakub Kicinski static inline void
ethtool_tunnel_info_get_req_dump_set_header_dev_name(struct ethtool_tunnel_info_get_req_dump * req,const char * dev_name)38252d7be507SJakub Kicinski ethtool_tunnel_info_get_req_dump_set_header_dev_name(struct ethtool_tunnel_info_get_req_dump *req,
38262d7be507SJakub Kicinski 						     const char *dev_name)
38272d7be507SJakub Kicinski {
38282d7be507SJakub Kicinski 	free(req->header.dev_name);
38292d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
38302d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
38312d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
38322d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
38332d7be507SJakub Kicinski }
38342d7be507SJakub Kicinski static inline void
ethtool_tunnel_info_get_req_dump_set_header_flags(struct ethtool_tunnel_info_get_req_dump * req,__u32 flags)38352d7be507SJakub Kicinski ethtool_tunnel_info_get_req_dump_set_header_flags(struct ethtool_tunnel_info_get_req_dump *req,
38362d7be507SJakub Kicinski 						  __u32 flags)
38372d7be507SJakub Kicinski {
38382d7be507SJakub Kicinski 	req->_present.header = 1;
38392d7be507SJakub Kicinski 	req->header._present.flags = 1;
38402d7be507SJakub Kicinski 	req->header.flags = flags;
38412d7be507SJakub Kicinski }
38422d7be507SJakub Kicinski 
38432d7be507SJakub Kicinski struct ethtool_tunnel_info_get_list {
38442d7be507SJakub Kicinski 	struct ethtool_tunnel_info_get_list *next;
38452d7be507SJakub Kicinski 	struct ethtool_tunnel_info_get_rsp obj __attribute__ ((aligned (8)));
38462d7be507SJakub Kicinski };
38472d7be507SJakub Kicinski 
38482d7be507SJakub Kicinski void
38492d7be507SJakub Kicinski ethtool_tunnel_info_get_list_free(struct ethtool_tunnel_info_get_list *rsp);
38502d7be507SJakub Kicinski 
38512d7be507SJakub Kicinski struct ethtool_tunnel_info_get_list *
38522d7be507SJakub Kicinski ethtool_tunnel_info_get_dump(struct ynl_sock *ys,
38532d7be507SJakub Kicinski 			     struct ethtool_tunnel_info_get_req_dump *req);
38542d7be507SJakub Kicinski 
38552d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_FEC_GET ============== */
38562d7be507SJakub Kicinski /* ETHTOOL_MSG_FEC_GET - do */
38572d7be507SJakub Kicinski struct ethtool_fec_get_req {
38582d7be507SJakub Kicinski 	struct {
38592d7be507SJakub Kicinski 		__u32 header:1;
38602d7be507SJakub Kicinski 	} _present;
38612d7be507SJakub Kicinski 
38622d7be507SJakub Kicinski 	struct ethtool_header header;
38632d7be507SJakub Kicinski };
38642d7be507SJakub Kicinski 
ethtool_fec_get_req_alloc(void)38652d7be507SJakub Kicinski static inline struct ethtool_fec_get_req *ethtool_fec_get_req_alloc(void)
38662d7be507SJakub Kicinski {
38672d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_fec_get_req));
38682d7be507SJakub Kicinski }
38692d7be507SJakub Kicinski void ethtool_fec_get_req_free(struct ethtool_fec_get_req *req);
38702d7be507SJakub Kicinski 
38712d7be507SJakub Kicinski static inline void
ethtool_fec_get_req_set_header_dev_index(struct ethtool_fec_get_req * req,__u32 dev_index)38722d7be507SJakub Kicinski ethtool_fec_get_req_set_header_dev_index(struct ethtool_fec_get_req *req,
38732d7be507SJakub Kicinski 					 __u32 dev_index)
38742d7be507SJakub Kicinski {
38752d7be507SJakub Kicinski 	req->_present.header = 1;
38762d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
38772d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
38782d7be507SJakub Kicinski }
38792d7be507SJakub Kicinski static inline void
ethtool_fec_get_req_set_header_dev_name(struct ethtool_fec_get_req * req,const char * dev_name)38802d7be507SJakub Kicinski ethtool_fec_get_req_set_header_dev_name(struct ethtool_fec_get_req *req,
38812d7be507SJakub Kicinski 					const char *dev_name)
38822d7be507SJakub Kicinski {
38832d7be507SJakub Kicinski 	free(req->header.dev_name);
38842d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
38852d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
38862d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
38872d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
38882d7be507SJakub Kicinski }
38892d7be507SJakub Kicinski static inline void
ethtool_fec_get_req_set_header_flags(struct ethtool_fec_get_req * req,__u32 flags)38902d7be507SJakub Kicinski ethtool_fec_get_req_set_header_flags(struct ethtool_fec_get_req *req,
38912d7be507SJakub Kicinski 				     __u32 flags)
38922d7be507SJakub Kicinski {
38932d7be507SJakub Kicinski 	req->_present.header = 1;
38942d7be507SJakub Kicinski 	req->header._present.flags = 1;
38952d7be507SJakub Kicinski 	req->header.flags = flags;
38962d7be507SJakub Kicinski }
38972d7be507SJakub Kicinski 
38982d7be507SJakub Kicinski struct ethtool_fec_get_rsp {
38992d7be507SJakub Kicinski 	struct {
39002d7be507SJakub Kicinski 		__u32 header:1;
39012d7be507SJakub Kicinski 		__u32 modes:1;
39022d7be507SJakub Kicinski 		__u32 auto_:1;
39032d7be507SJakub Kicinski 		__u32 active:1;
39042d7be507SJakub Kicinski 		__u32 stats:1;
39052d7be507SJakub Kicinski 	} _present;
39062d7be507SJakub Kicinski 
39072d7be507SJakub Kicinski 	struct ethtool_header header;
39082d7be507SJakub Kicinski 	struct ethtool_bitset modes;
39092d7be507SJakub Kicinski 	__u8 auto_;
39102d7be507SJakub Kicinski 	__u32 active;
39112d7be507SJakub Kicinski 	struct ethtool_fec_stat stats;
39122d7be507SJakub Kicinski };
39132d7be507SJakub Kicinski 
39142d7be507SJakub Kicinski void ethtool_fec_get_rsp_free(struct ethtool_fec_get_rsp *rsp);
39152d7be507SJakub Kicinski 
39162d7be507SJakub Kicinski /*
39172d7be507SJakub Kicinski  * Get FEC params.
39182d7be507SJakub Kicinski  */
39192d7be507SJakub Kicinski struct ethtool_fec_get_rsp *
39202d7be507SJakub Kicinski ethtool_fec_get(struct ynl_sock *ys, struct ethtool_fec_get_req *req);
39212d7be507SJakub Kicinski 
39222d7be507SJakub Kicinski /* ETHTOOL_MSG_FEC_GET - dump */
39232d7be507SJakub Kicinski struct ethtool_fec_get_req_dump {
39242d7be507SJakub Kicinski 	struct {
39252d7be507SJakub Kicinski 		__u32 header:1;
39262d7be507SJakub Kicinski 	} _present;
39272d7be507SJakub Kicinski 
39282d7be507SJakub Kicinski 	struct ethtool_header header;
39292d7be507SJakub Kicinski };
39302d7be507SJakub Kicinski 
39312d7be507SJakub Kicinski static inline struct ethtool_fec_get_req_dump *
ethtool_fec_get_req_dump_alloc(void)39322d7be507SJakub Kicinski ethtool_fec_get_req_dump_alloc(void)
39332d7be507SJakub Kicinski {
39342d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_fec_get_req_dump));
39352d7be507SJakub Kicinski }
39362d7be507SJakub Kicinski void ethtool_fec_get_req_dump_free(struct ethtool_fec_get_req_dump *req);
39372d7be507SJakub Kicinski 
39382d7be507SJakub Kicinski static inline void
ethtool_fec_get_req_dump_set_header_dev_index(struct ethtool_fec_get_req_dump * req,__u32 dev_index)39392d7be507SJakub Kicinski ethtool_fec_get_req_dump_set_header_dev_index(struct ethtool_fec_get_req_dump *req,
39402d7be507SJakub Kicinski 					      __u32 dev_index)
39412d7be507SJakub Kicinski {
39422d7be507SJakub Kicinski 	req->_present.header = 1;
39432d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
39442d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
39452d7be507SJakub Kicinski }
39462d7be507SJakub Kicinski static inline void
ethtool_fec_get_req_dump_set_header_dev_name(struct ethtool_fec_get_req_dump * req,const char * dev_name)39472d7be507SJakub Kicinski ethtool_fec_get_req_dump_set_header_dev_name(struct ethtool_fec_get_req_dump *req,
39482d7be507SJakub Kicinski 					     const char *dev_name)
39492d7be507SJakub Kicinski {
39502d7be507SJakub Kicinski 	free(req->header.dev_name);
39512d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
39522d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
39532d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
39542d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
39552d7be507SJakub Kicinski }
39562d7be507SJakub Kicinski static inline void
ethtool_fec_get_req_dump_set_header_flags(struct ethtool_fec_get_req_dump * req,__u32 flags)39572d7be507SJakub Kicinski ethtool_fec_get_req_dump_set_header_flags(struct ethtool_fec_get_req_dump *req,
39582d7be507SJakub Kicinski 					  __u32 flags)
39592d7be507SJakub Kicinski {
39602d7be507SJakub Kicinski 	req->_present.header = 1;
39612d7be507SJakub Kicinski 	req->header._present.flags = 1;
39622d7be507SJakub Kicinski 	req->header.flags = flags;
39632d7be507SJakub Kicinski }
39642d7be507SJakub Kicinski 
39652d7be507SJakub Kicinski struct ethtool_fec_get_list {
39662d7be507SJakub Kicinski 	struct ethtool_fec_get_list *next;
39672d7be507SJakub Kicinski 	struct ethtool_fec_get_rsp obj __attribute__ ((aligned (8)));
39682d7be507SJakub Kicinski };
39692d7be507SJakub Kicinski 
39702d7be507SJakub Kicinski void ethtool_fec_get_list_free(struct ethtool_fec_get_list *rsp);
39712d7be507SJakub Kicinski 
39722d7be507SJakub Kicinski struct ethtool_fec_get_list *
39732d7be507SJakub Kicinski ethtool_fec_get_dump(struct ynl_sock *ys, struct ethtool_fec_get_req_dump *req);
39742d7be507SJakub Kicinski 
39752d7be507SJakub Kicinski /* ETHTOOL_MSG_FEC_GET - notify */
39762d7be507SJakub Kicinski struct ethtool_fec_get_ntf {
39772d7be507SJakub Kicinski 	__u16 family;
39782d7be507SJakub Kicinski 	__u8 cmd;
39792d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
39802d7be507SJakub Kicinski 	void (*free)(struct ethtool_fec_get_ntf *ntf);
39812d7be507SJakub Kicinski 	struct ethtool_fec_get_rsp obj __attribute__ ((aligned (8)));
39822d7be507SJakub Kicinski };
39832d7be507SJakub Kicinski 
39842d7be507SJakub Kicinski void ethtool_fec_get_ntf_free(struct ethtool_fec_get_ntf *rsp);
39852d7be507SJakub Kicinski 
39862d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_FEC_SET ============== */
39872d7be507SJakub Kicinski /* ETHTOOL_MSG_FEC_SET - do */
39882d7be507SJakub Kicinski struct ethtool_fec_set_req {
39892d7be507SJakub Kicinski 	struct {
39902d7be507SJakub Kicinski 		__u32 header:1;
39912d7be507SJakub Kicinski 		__u32 modes:1;
39922d7be507SJakub Kicinski 		__u32 auto_:1;
39932d7be507SJakub Kicinski 		__u32 active:1;
39942d7be507SJakub Kicinski 		__u32 stats:1;
39952d7be507SJakub Kicinski 	} _present;
39962d7be507SJakub Kicinski 
39972d7be507SJakub Kicinski 	struct ethtool_header header;
39982d7be507SJakub Kicinski 	struct ethtool_bitset modes;
39992d7be507SJakub Kicinski 	__u8 auto_;
40002d7be507SJakub Kicinski 	__u32 active;
40012d7be507SJakub Kicinski 	struct ethtool_fec_stat stats;
40022d7be507SJakub Kicinski };
40032d7be507SJakub Kicinski 
ethtool_fec_set_req_alloc(void)40042d7be507SJakub Kicinski static inline struct ethtool_fec_set_req *ethtool_fec_set_req_alloc(void)
40052d7be507SJakub Kicinski {
40062d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_fec_set_req));
40072d7be507SJakub Kicinski }
40082d7be507SJakub Kicinski void ethtool_fec_set_req_free(struct ethtool_fec_set_req *req);
40092d7be507SJakub Kicinski 
40102d7be507SJakub Kicinski static inline void
ethtool_fec_set_req_set_header_dev_index(struct ethtool_fec_set_req * req,__u32 dev_index)40112d7be507SJakub Kicinski ethtool_fec_set_req_set_header_dev_index(struct ethtool_fec_set_req *req,
40122d7be507SJakub Kicinski 					 __u32 dev_index)
40132d7be507SJakub Kicinski {
40142d7be507SJakub Kicinski 	req->_present.header = 1;
40152d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
40162d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
40172d7be507SJakub Kicinski }
40182d7be507SJakub Kicinski static inline void
ethtool_fec_set_req_set_header_dev_name(struct ethtool_fec_set_req * req,const char * dev_name)40192d7be507SJakub Kicinski ethtool_fec_set_req_set_header_dev_name(struct ethtool_fec_set_req *req,
40202d7be507SJakub Kicinski 					const char *dev_name)
40212d7be507SJakub Kicinski {
40222d7be507SJakub Kicinski 	free(req->header.dev_name);
40232d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
40242d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
40252d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
40262d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
40272d7be507SJakub Kicinski }
40282d7be507SJakub Kicinski static inline void
ethtool_fec_set_req_set_header_flags(struct ethtool_fec_set_req * req,__u32 flags)40292d7be507SJakub Kicinski ethtool_fec_set_req_set_header_flags(struct ethtool_fec_set_req *req,
40302d7be507SJakub Kicinski 				     __u32 flags)
40312d7be507SJakub Kicinski {
40322d7be507SJakub Kicinski 	req->_present.header = 1;
40332d7be507SJakub Kicinski 	req->header._present.flags = 1;
40342d7be507SJakub Kicinski 	req->header.flags = flags;
40352d7be507SJakub Kicinski }
40362d7be507SJakub Kicinski static inline void
ethtool_fec_set_req_set_modes_nomask(struct ethtool_fec_set_req * req)40372d7be507SJakub Kicinski ethtool_fec_set_req_set_modes_nomask(struct ethtool_fec_set_req *req)
40382d7be507SJakub Kicinski {
40392d7be507SJakub Kicinski 	req->_present.modes = 1;
40402d7be507SJakub Kicinski 	req->modes._present.nomask = 1;
40412d7be507SJakub Kicinski }
40422d7be507SJakub Kicinski static inline void
ethtool_fec_set_req_set_modes_size(struct ethtool_fec_set_req * req,__u32 size)40432d7be507SJakub Kicinski ethtool_fec_set_req_set_modes_size(struct ethtool_fec_set_req *req, __u32 size)
40442d7be507SJakub Kicinski {
40452d7be507SJakub Kicinski 	req->_present.modes = 1;
40462d7be507SJakub Kicinski 	req->modes._present.size = 1;
40472d7be507SJakub Kicinski 	req->modes.size = size;
40482d7be507SJakub Kicinski }
40492d7be507SJakub Kicinski static inline void
__ethtool_fec_set_req_set_modes_bits_bit(struct ethtool_fec_set_req * req,struct ethtool_bitset_bit * bit,unsigned int n_bit)40502d7be507SJakub Kicinski __ethtool_fec_set_req_set_modes_bits_bit(struct ethtool_fec_set_req *req,
40512d7be507SJakub Kicinski 					 struct ethtool_bitset_bit *bit,
40522d7be507SJakub Kicinski 					 unsigned int n_bit)
40532d7be507SJakub Kicinski {
40542d7be507SJakub Kicinski 	free(req->modes.bits.bit);
40552d7be507SJakub Kicinski 	req->modes.bits.bit = bit;
40562d7be507SJakub Kicinski 	req->modes.bits.n_bit = n_bit;
40572d7be507SJakub Kicinski }
40582d7be507SJakub Kicinski static inline void
ethtool_fec_set_req_set_auto_(struct ethtool_fec_set_req * req,__u8 auto_)40592d7be507SJakub Kicinski ethtool_fec_set_req_set_auto_(struct ethtool_fec_set_req *req, __u8 auto_)
40602d7be507SJakub Kicinski {
40612d7be507SJakub Kicinski 	req->_present.auto_ = 1;
40622d7be507SJakub Kicinski 	req->auto_ = auto_;
40632d7be507SJakub Kicinski }
40642d7be507SJakub Kicinski static inline void
ethtool_fec_set_req_set_active(struct ethtool_fec_set_req * req,__u32 active)40652d7be507SJakub Kicinski ethtool_fec_set_req_set_active(struct ethtool_fec_set_req *req, __u32 active)
40662d7be507SJakub Kicinski {
40672d7be507SJakub Kicinski 	req->_present.active = 1;
40682d7be507SJakub Kicinski 	req->active = active;
40692d7be507SJakub Kicinski }
40702d7be507SJakub Kicinski static inline void
ethtool_fec_set_req_set_stats_corrected(struct ethtool_fec_set_req * req,const void * corrected,size_t len)40712d7be507SJakub Kicinski ethtool_fec_set_req_set_stats_corrected(struct ethtool_fec_set_req *req,
40722d7be507SJakub Kicinski 					const void *corrected, size_t len)
40732d7be507SJakub Kicinski {
40742d7be507SJakub Kicinski 	free(req->stats.corrected);
4075*a149a3a1SJakub Kicinski 	req->stats._present.corrected_len = len;
40762d7be507SJakub Kicinski 	req->stats.corrected = malloc(req->stats._present.corrected_len);
40772d7be507SJakub Kicinski 	memcpy(req->stats.corrected, corrected, req->stats._present.corrected_len);
40782d7be507SJakub Kicinski }
40792d7be507SJakub Kicinski static inline void
ethtool_fec_set_req_set_stats_uncorr(struct ethtool_fec_set_req * req,const void * uncorr,size_t len)40802d7be507SJakub Kicinski ethtool_fec_set_req_set_stats_uncorr(struct ethtool_fec_set_req *req,
40812d7be507SJakub Kicinski 				     const void *uncorr, size_t len)
40822d7be507SJakub Kicinski {
40832d7be507SJakub Kicinski 	free(req->stats.uncorr);
4084*a149a3a1SJakub Kicinski 	req->stats._present.uncorr_len = len;
40852d7be507SJakub Kicinski 	req->stats.uncorr = malloc(req->stats._present.uncorr_len);
40862d7be507SJakub Kicinski 	memcpy(req->stats.uncorr, uncorr, req->stats._present.uncorr_len);
40872d7be507SJakub Kicinski }
40882d7be507SJakub Kicinski static inline void
ethtool_fec_set_req_set_stats_corr_bits(struct ethtool_fec_set_req * req,const void * corr_bits,size_t len)40892d7be507SJakub Kicinski ethtool_fec_set_req_set_stats_corr_bits(struct ethtool_fec_set_req *req,
40902d7be507SJakub Kicinski 					const void *corr_bits, size_t len)
40912d7be507SJakub Kicinski {
40922d7be507SJakub Kicinski 	free(req->stats.corr_bits);
4093*a149a3a1SJakub Kicinski 	req->stats._present.corr_bits_len = len;
40942d7be507SJakub Kicinski 	req->stats.corr_bits = malloc(req->stats._present.corr_bits_len);
40952d7be507SJakub Kicinski 	memcpy(req->stats.corr_bits, corr_bits, req->stats._present.corr_bits_len);
40962d7be507SJakub Kicinski }
40972d7be507SJakub Kicinski 
40982d7be507SJakub Kicinski /*
40992d7be507SJakub Kicinski  * Set FEC params.
41002d7be507SJakub Kicinski  */
41012d7be507SJakub Kicinski int ethtool_fec_set(struct ynl_sock *ys, struct ethtool_fec_set_req *req);
41022d7be507SJakub Kicinski 
41032d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_MODULE_EEPROM_GET ============== */
41042d7be507SJakub Kicinski /* ETHTOOL_MSG_MODULE_EEPROM_GET - do */
41052d7be507SJakub Kicinski struct ethtool_module_eeprom_get_req {
41062d7be507SJakub Kicinski 	struct {
41072d7be507SJakub Kicinski 		__u32 header:1;
41082d7be507SJakub Kicinski 	} _present;
41092d7be507SJakub Kicinski 
41102d7be507SJakub Kicinski 	struct ethtool_header header;
41112d7be507SJakub Kicinski };
41122d7be507SJakub Kicinski 
41132d7be507SJakub Kicinski static inline struct ethtool_module_eeprom_get_req *
ethtool_module_eeprom_get_req_alloc(void)41142d7be507SJakub Kicinski ethtool_module_eeprom_get_req_alloc(void)
41152d7be507SJakub Kicinski {
41162d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_module_eeprom_get_req));
41172d7be507SJakub Kicinski }
41182d7be507SJakub Kicinski void
41192d7be507SJakub Kicinski ethtool_module_eeprom_get_req_free(struct ethtool_module_eeprom_get_req *req);
41202d7be507SJakub Kicinski 
41212d7be507SJakub Kicinski static inline void
ethtool_module_eeprom_get_req_set_header_dev_index(struct ethtool_module_eeprom_get_req * req,__u32 dev_index)41222d7be507SJakub Kicinski ethtool_module_eeprom_get_req_set_header_dev_index(struct ethtool_module_eeprom_get_req *req,
41232d7be507SJakub Kicinski 						   __u32 dev_index)
41242d7be507SJakub Kicinski {
41252d7be507SJakub Kicinski 	req->_present.header = 1;
41262d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
41272d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
41282d7be507SJakub Kicinski }
41292d7be507SJakub Kicinski static inline void
ethtool_module_eeprom_get_req_set_header_dev_name(struct ethtool_module_eeprom_get_req * req,const char * dev_name)41302d7be507SJakub Kicinski ethtool_module_eeprom_get_req_set_header_dev_name(struct ethtool_module_eeprom_get_req *req,
41312d7be507SJakub Kicinski 						  const char *dev_name)
41322d7be507SJakub Kicinski {
41332d7be507SJakub Kicinski 	free(req->header.dev_name);
41342d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
41352d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
41362d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
41372d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
41382d7be507SJakub Kicinski }
41392d7be507SJakub Kicinski static inline void
ethtool_module_eeprom_get_req_set_header_flags(struct ethtool_module_eeprom_get_req * req,__u32 flags)41402d7be507SJakub Kicinski ethtool_module_eeprom_get_req_set_header_flags(struct ethtool_module_eeprom_get_req *req,
41412d7be507SJakub Kicinski 					       __u32 flags)
41422d7be507SJakub Kicinski {
41432d7be507SJakub Kicinski 	req->_present.header = 1;
41442d7be507SJakub Kicinski 	req->header._present.flags = 1;
41452d7be507SJakub Kicinski 	req->header.flags = flags;
41462d7be507SJakub Kicinski }
41472d7be507SJakub Kicinski 
41482d7be507SJakub Kicinski struct ethtool_module_eeprom_get_rsp {
41492d7be507SJakub Kicinski 	struct {
41502d7be507SJakub Kicinski 		__u32 header:1;
41512d7be507SJakub Kicinski 		__u32 offset:1;
41522d7be507SJakub Kicinski 		__u32 length:1;
41532d7be507SJakub Kicinski 		__u32 page:1;
41542d7be507SJakub Kicinski 		__u32 bank:1;
41552d7be507SJakub Kicinski 		__u32 i2c_address:1;
41562d7be507SJakub Kicinski 		__u32 data_len;
41572d7be507SJakub Kicinski 	} _present;
41582d7be507SJakub Kicinski 
41592d7be507SJakub Kicinski 	struct ethtool_header header;
41602d7be507SJakub Kicinski 	__u32 offset;
41612d7be507SJakub Kicinski 	__u32 length;
41622d7be507SJakub Kicinski 	__u8 page;
41632d7be507SJakub Kicinski 	__u8 bank;
41642d7be507SJakub Kicinski 	__u8 i2c_address;
41652d7be507SJakub Kicinski 	void *data;
41662d7be507SJakub Kicinski };
41672d7be507SJakub Kicinski 
41682d7be507SJakub Kicinski void
41692d7be507SJakub Kicinski ethtool_module_eeprom_get_rsp_free(struct ethtool_module_eeprom_get_rsp *rsp);
41702d7be507SJakub Kicinski 
41712d7be507SJakub Kicinski /*
41722d7be507SJakub Kicinski  * Get module EEPROM params.
41732d7be507SJakub Kicinski  */
41742d7be507SJakub Kicinski struct ethtool_module_eeprom_get_rsp *
41752d7be507SJakub Kicinski ethtool_module_eeprom_get(struct ynl_sock *ys,
41762d7be507SJakub Kicinski 			  struct ethtool_module_eeprom_get_req *req);
41772d7be507SJakub Kicinski 
41782d7be507SJakub Kicinski /* ETHTOOL_MSG_MODULE_EEPROM_GET - dump */
41792d7be507SJakub Kicinski struct ethtool_module_eeprom_get_req_dump {
41802d7be507SJakub Kicinski 	struct {
41812d7be507SJakub Kicinski 		__u32 header:1;
41822d7be507SJakub Kicinski 	} _present;
41832d7be507SJakub Kicinski 
41842d7be507SJakub Kicinski 	struct ethtool_header header;
41852d7be507SJakub Kicinski };
41862d7be507SJakub Kicinski 
41872d7be507SJakub Kicinski static inline struct ethtool_module_eeprom_get_req_dump *
ethtool_module_eeprom_get_req_dump_alloc(void)41882d7be507SJakub Kicinski ethtool_module_eeprom_get_req_dump_alloc(void)
41892d7be507SJakub Kicinski {
41902d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_module_eeprom_get_req_dump));
41912d7be507SJakub Kicinski }
41922d7be507SJakub Kicinski void
41932d7be507SJakub Kicinski ethtool_module_eeprom_get_req_dump_free(struct ethtool_module_eeprom_get_req_dump *req);
41942d7be507SJakub Kicinski 
41952d7be507SJakub Kicinski static inline void
ethtool_module_eeprom_get_req_dump_set_header_dev_index(struct ethtool_module_eeprom_get_req_dump * req,__u32 dev_index)41962d7be507SJakub Kicinski ethtool_module_eeprom_get_req_dump_set_header_dev_index(struct ethtool_module_eeprom_get_req_dump *req,
41972d7be507SJakub Kicinski 							__u32 dev_index)
41982d7be507SJakub Kicinski {
41992d7be507SJakub Kicinski 	req->_present.header = 1;
42002d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
42012d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
42022d7be507SJakub Kicinski }
42032d7be507SJakub Kicinski static inline void
ethtool_module_eeprom_get_req_dump_set_header_dev_name(struct ethtool_module_eeprom_get_req_dump * req,const char * dev_name)42042d7be507SJakub Kicinski ethtool_module_eeprom_get_req_dump_set_header_dev_name(struct ethtool_module_eeprom_get_req_dump *req,
42052d7be507SJakub Kicinski 						       const char *dev_name)
42062d7be507SJakub Kicinski {
42072d7be507SJakub Kicinski 	free(req->header.dev_name);
42082d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
42092d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
42102d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
42112d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
42122d7be507SJakub Kicinski }
42132d7be507SJakub Kicinski static inline void
ethtool_module_eeprom_get_req_dump_set_header_flags(struct ethtool_module_eeprom_get_req_dump * req,__u32 flags)42142d7be507SJakub Kicinski ethtool_module_eeprom_get_req_dump_set_header_flags(struct ethtool_module_eeprom_get_req_dump *req,
42152d7be507SJakub Kicinski 						    __u32 flags)
42162d7be507SJakub Kicinski {
42172d7be507SJakub Kicinski 	req->_present.header = 1;
42182d7be507SJakub Kicinski 	req->header._present.flags = 1;
42192d7be507SJakub Kicinski 	req->header.flags = flags;
42202d7be507SJakub Kicinski }
42212d7be507SJakub Kicinski 
42222d7be507SJakub Kicinski struct ethtool_module_eeprom_get_list {
42232d7be507SJakub Kicinski 	struct ethtool_module_eeprom_get_list *next;
42242d7be507SJakub Kicinski 	struct ethtool_module_eeprom_get_rsp obj __attribute__ ((aligned (8)));
42252d7be507SJakub Kicinski };
42262d7be507SJakub Kicinski 
42272d7be507SJakub Kicinski void
42282d7be507SJakub Kicinski ethtool_module_eeprom_get_list_free(struct ethtool_module_eeprom_get_list *rsp);
42292d7be507SJakub Kicinski 
42302d7be507SJakub Kicinski struct ethtool_module_eeprom_get_list *
42312d7be507SJakub Kicinski ethtool_module_eeprom_get_dump(struct ynl_sock *ys,
42322d7be507SJakub Kicinski 			       struct ethtool_module_eeprom_get_req_dump *req);
42332d7be507SJakub Kicinski 
42342d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_PHC_VCLOCKS_GET ============== */
42352d7be507SJakub Kicinski /* ETHTOOL_MSG_PHC_VCLOCKS_GET - do */
42362d7be507SJakub Kicinski struct ethtool_phc_vclocks_get_req {
42372d7be507SJakub Kicinski 	struct {
42382d7be507SJakub Kicinski 		__u32 header:1;
42392d7be507SJakub Kicinski 	} _present;
42402d7be507SJakub Kicinski 
42412d7be507SJakub Kicinski 	struct ethtool_header header;
42422d7be507SJakub Kicinski };
42432d7be507SJakub Kicinski 
42442d7be507SJakub Kicinski static inline struct ethtool_phc_vclocks_get_req *
ethtool_phc_vclocks_get_req_alloc(void)42452d7be507SJakub Kicinski ethtool_phc_vclocks_get_req_alloc(void)
42462d7be507SJakub Kicinski {
42472d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_phc_vclocks_get_req));
42482d7be507SJakub Kicinski }
42492d7be507SJakub Kicinski void ethtool_phc_vclocks_get_req_free(struct ethtool_phc_vclocks_get_req *req);
42502d7be507SJakub Kicinski 
42512d7be507SJakub Kicinski static inline void
ethtool_phc_vclocks_get_req_set_header_dev_index(struct ethtool_phc_vclocks_get_req * req,__u32 dev_index)42522d7be507SJakub Kicinski ethtool_phc_vclocks_get_req_set_header_dev_index(struct ethtool_phc_vclocks_get_req *req,
42532d7be507SJakub Kicinski 						 __u32 dev_index)
42542d7be507SJakub Kicinski {
42552d7be507SJakub Kicinski 	req->_present.header = 1;
42562d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
42572d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
42582d7be507SJakub Kicinski }
42592d7be507SJakub Kicinski static inline void
ethtool_phc_vclocks_get_req_set_header_dev_name(struct ethtool_phc_vclocks_get_req * req,const char * dev_name)42602d7be507SJakub Kicinski ethtool_phc_vclocks_get_req_set_header_dev_name(struct ethtool_phc_vclocks_get_req *req,
42612d7be507SJakub Kicinski 						const char *dev_name)
42622d7be507SJakub Kicinski {
42632d7be507SJakub Kicinski 	free(req->header.dev_name);
42642d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
42652d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
42662d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
42672d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
42682d7be507SJakub Kicinski }
42692d7be507SJakub Kicinski static inline void
ethtool_phc_vclocks_get_req_set_header_flags(struct ethtool_phc_vclocks_get_req * req,__u32 flags)42702d7be507SJakub Kicinski ethtool_phc_vclocks_get_req_set_header_flags(struct ethtool_phc_vclocks_get_req *req,
42712d7be507SJakub Kicinski 					     __u32 flags)
42722d7be507SJakub Kicinski {
42732d7be507SJakub Kicinski 	req->_present.header = 1;
42742d7be507SJakub Kicinski 	req->header._present.flags = 1;
42752d7be507SJakub Kicinski 	req->header.flags = flags;
42762d7be507SJakub Kicinski }
42772d7be507SJakub Kicinski 
42782d7be507SJakub Kicinski struct ethtool_phc_vclocks_get_rsp {
42792d7be507SJakub Kicinski 	struct {
42802d7be507SJakub Kicinski 		__u32 header:1;
42812d7be507SJakub Kicinski 		__u32 num:1;
42822d7be507SJakub Kicinski 	} _present;
42832d7be507SJakub Kicinski 
42842d7be507SJakub Kicinski 	struct ethtool_header header;
42852d7be507SJakub Kicinski 	__u32 num;
42862d7be507SJakub Kicinski };
42872d7be507SJakub Kicinski 
42882d7be507SJakub Kicinski void ethtool_phc_vclocks_get_rsp_free(struct ethtool_phc_vclocks_get_rsp *rsp);
42892d7be507SJakub Kicinski 
42902d7be507SJakub Kicinski /*
42912d7be507SJakub Kicinski  * Get PHC VCLOCKs.
42922d7be507SJakub Kicinski  */
42932d7be507SJakub Kicinski struct ethtool_phc_vclocks_get_rsp *
42942d7be507SJakub Kicinski ethtool_phc_vclocks_get(struct ynl_sock *ys,
42952d7be507SJakub Kicinski 			struct ethtool_phc_vclocks_get_req *req);
42962d7be507SJakub Kicinski 
42972d7be507SJakub Kicinski /* ETHTOOL_MSG_PHC_VCLOCKS_GET - dump */
42982d7be507SJakub Kicinski struct ethtool_phc_vclocks_get_req_dump {
42992d7be507SJakub Kicinski 	struct {
43002d7be507SJakub Kicinski 		__u32 header:1;
43012d7be507SJakub Kicinski 	} _present;
43022d7be507SJakub Kicinski 
43032d7be507SJakub Kicinski 	struct ethtool_header header;
43042d7be507SJakub Kicinski };
43052d7be507SJakub Kicinski 
43062d7be507SJakub Kicinski static inline struct ethtool_phc_vclocks_get_req_dump *
ethtool_phc_vclocks_get_req_dump_alloc(void)43072d7be507SJakub Kicinski ethtool_phc_vclocks_get_req_dump_alloc(void)
43082d7be507SJakub Kicinski {
43092d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_phc_vclocks_get_req_dump));
43102d7be507SJakub Kicinski }
43112d7be507SJakub Kicinski void
43122d7be507SJakub Kicinski ethtool_phc_vclocks_get_req_dump_free(struct ethtool_phc_vclocks_get_req_dump *req);
43132d7be507SJakub Kicinski 
43142d7be507SJakub Kicinski static inline void
ethtool_phc_vclocks_get_req_dump_set_header_dev_index(struct ethtool_phc_vclocks_get_req_dump * req,__u32 dev_index)43152d7be507SJakub Kicinski ethtool_phc_vclocks_get_req_dump_set_header_dev_index(struct ethtool_phc_vclocks_get_req_dump *req,
43162d7be507SJakub Kicinski 						      __u32 dev_index)
43172d7be507SJakub Kicinski {
43182d7be507SJakub Kicinski 	req->_present.header = 1;
43192d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
43202d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
43212d7be507SJakub Kicinski }
43222d7be507SJakub Kicinski static inline void
ethtool_phc_vclocks_get_req_dump_set_header_dev_name(struct ethtool_phc_vclocks_get_req_dump * req,const char * dev_name)43232d7be507SJakub Kicinski ethtool_phc_vclocks_get_req_dump_set_header_dev_name(struct ethtool_phc_vclocks_get_req_dump *req,
43242d7be507SJakub Kicinski 						     const char *dev_name)
43252d7be507SJakub Kicinski {
43262d7be507SJakub Kicinski 	free(req->header.dev_name);
43272d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
43282d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
43292d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
43302d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
43312d7be507SJakub Kicinski }
43322d7be507SJakub Kicinski static inline void
ethtool_phc_vclocks_get_req_dump_set_header_flags(struct ethtool_phc_vclocks_get_req_dump * req,__u32 flags)43332d7be507SJakub Kicinski ethtool_phc_vclocks_get_req_dump_set_header_flags(struct ethtool_phc_vclocks_get_req_dump *req,
43342d7be507SJakub Kicinski 						  __u32 flags)
43352d7be507SJakub Kicinski {
43362d7be507SJakub Kicinski 	req->_present.header = 1;
43372d7be507SJakub Kicinski 	req->header._present.flags = 1;
43382d7be507SJakub Kicinski 	req->header.flags = flags;
43392d7be507SJakub Kicinski }
43402d7be507SJakub Kicinski 
43412d7be507SJakub Kicinski struct ethtool_phc_vclocks_get_list {
43422d7be507SJakub Kicinski 	struct ethtool_phc_vclocks_get_list *next;
43432d7be507SJakub Kicinski 	struct ethtool_phc_vclocks_get_rsp obj __attribute__ ((aligned (8)));
43442d7be507SJakub Kicinski };
43452d7be507SJakub Kicinski 
43462d7be507SJakub Kicinski void
43472d7be507SJakub Kicinski ethtool_phc_vclocks_get_list_free(struct ethtool_phc_vclocks_get_list *rsp);
43482d7be507SJakub Kicinski 
43492d7be507SJakub Kicinski struct ethtool_phc_vclocks_get_list *
43502d7be507SJakub Kicinski ethtool_phc_vclocks_get_dump(struct ynl_sock *ys,
43512d7be507SJakub Kicinski 			     struct ethtool_phc_vclocks_get_req_dump *req);
43522d7be507SJakub Kicinski 
43532d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_MODULE_GET ============== */
43542d7be507SJakub Kicinski /* ETHTOOL_MSG_MODULE_GET - do */
43552d7be507SJakub Kicinski struct ethtool_module_get_req {
43562d7be507SJakub Kicinski 	struct {
43572d7be507SJakub Kicinski 		__u32 header:1;
43582d7be507SJakub Kicinski 	} _present;
43592d7be507SJakub Kicinski 
43602d7be507SJakub Kicinski 	struct ethtool_header header;
43612d7be507SJakub Kicinski };
43622d7be507SJakub Kicinski 
ethtool_module_get_req_alloc(void)43632d7be507SJakub Kicinski static inline struct ethtool_module_get_req *ethtool_module_get_req_alloc(void)
43642d7be507SJakub Kicinski {
43652d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_module_get_req));
43662d7be507SJakub Kicinski }
43672d7be507SJakub Kicinski void ethtool_module_get_req_free(struct ethtool_module_get_req *req);
43682d7be507SJakub Kicinski 
43692d7be507SJakub Kicinski static inline void
ethtool_module_get_req_set_header_dev_index(struct ethtool_module_get_req * req,__u32 dev_index)43702d7be507SJakub Kicinski ethtool_module_get_req_set_header_dev_index(struct ethtool_module_get_req *req,
43712d7be507SJakub Kicinski 					    __u32 dev_index)
43722d7be507SJakub Kicinski {
43732d7be507SJakub Kicinski 	req->_present.header = 1;
43742d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
43752d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
43762d7be507SJakub Kicinski }
43772d7be507SJakub Kicinski static inline void
ethtool_module_get_req_set_header_dev_name(struct ethtool_module_get_req * req,const char * dev_name)43782d7be507SJakub Kicinski ethtool_module_get_req_set_header_dev_name(struct ethtool_module_get_req *req,
43792d7be507SJakub Kicinski 					   const char *dev_name)
43802d7be507SJakub Kicinski {
43812d7be507SJakub Kicinski 	free(req->header.dev_name);
43822d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
43832d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
43842d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
43852d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
43862d7be507SJakub Kicinski }
43872d7be507SJakub Kicinski static inline void
ethtool_module_get_req_set_header_flags(struct ethtool_module_get_req * req,__u32 flags)43882d7be507SJakub Kicinski ethtool_module_get_req_set_header_flags(struct ethtool_module_get_req *req,
43892d7be507SJakub Kicinski 					__u32 flags)
43902d7be507SJakub Kicinski {
43912d7be507SJakub Kicinski 	req->_present.header = 1;
43922d7be507SJakub Kicinski 	req->header._present.flags = 1;
43932d7be507SJakub Kicinski 	req->header.flags = flags;
43942d7be507SJakub Kicinski }
43952d7be507SJakub Kicinski 
43962d7be507SJakub Kicinski struct ethtool_module_get_rsp {
43972d7be507SJakub Kicinski 	struct {
43982d7be507SJakub Kicinski 		__u32 header:1;
43992d7be507SJakub Kicinski 		__u32 power_mode_policy:1;
44002d7be507SJakub Kicinski 		__u32 power_mode:1;
44012d7be507SJakub Kicinski 	} _present;
44022d7be507SJakub Kicinski 
44032d7be507SJakub Kicinski 	struct ethtool_header header;
44042d7be507SJakub Kicinski 	__u8 power_mode_policy;
44052d7be507SJakub Kicinski 	__u8 power_mode;
44062d7be507SJakub Kicinski };
44072d7be507SJakub Kicinski 
44082d7be507SJakub Kicinski void ethtool_module_get_rsp_free(struct ethtool_module_get_rsp *rsp);
44092d7be507SJakub Kicinski 
44102d7be507SJakub Kicinski /*
44112d7be507SJakub Kicinski  * Get module params.
44122d7be507SJakub Kicinski  */
44132d7be507SJakub Kicinski struct ethtool_module_get_rsp *
44142d7be507SJakub Kicinski ethtool_module_get(struct ynl_sock *ys, struct ethtool_module_get_req *req);
44152d7be507SJakub Kicinski 
44162d7be507SJakub Kicinski /* ETHTOOL_MSG_MODULE_GET - dump */
44172d7be507SJakub Kicinski struct ethtool_module_get_req_dump {
44182d7be507SJakub Kicinski 	struct {
44192d7be507SJakub Kicinski 		__u32 header:1;
44202d7be507SJakub Kicinski 	} _present;
44212d7be507SJakub Kicinski 
44222d7be507SJakub Kicinski 	struct ethtool_header header;
44232d7be507SJakub Kicinski };
44242d7be507SJakub Kicinski 
44252d7be507SJakub Kicinski static inline struct ethtool_module_get_req_dump *
ethtool_module_get_req_dump_alloc(void)44262d7be507SJakub Kicinski ethtool_module_get_req_dump_alloc(void)
44272d7be507SJakub Kicinski {
44282d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_module_get_req_dump));
44292d7be507SJakub Kicinski }
44302d7be507SJakub Kicinski void ethtool_module_get_req_dump_free(struct ethtool_module_get_req_dump *req);
44312d7be507SJakub Kicinski 
44322d7be507SJakub Kicinski static inline void
ethtool_module_get_req_dump_set_header_dev_index(struct ethtool_module_get_req_dump * req,__u32 dev_index)44332d7be507SJakub Kicinski ethtool_module_get_req_dump_set_header_dev_index(struct ethtool_module_get_req_dump *req,
44342d7be507SJakub Kicinski 						 __u32 dev_index)
44352d7be507SJakub Kicinski {
44362d7be507SJakub Kicinski 	req->_present.header = 1;
44372d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
44382d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
44392d7be507SJakub Kicinski }
44402d7be507SJakub Kicinski static inline void
ethtool_module_get_req_dump_set_header_dev_name(struct ethtool_module_get_req_dump * req,const char * dev_name)44412d7be507SJakub Kicinski ethtool_module_get_req_dump_set_header_dev_name(struct ethtool_module_get_req_dump *req,
44422d7be507SJakub Kicinski 						const char *dev_name)
44432d7be507SJakub Kicinski {
44442d7be507SJakub Kicinski 	free(req->header.dev_name);
44452d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
44462d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
44472d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
44482d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
44492d7be507SJakub Kicinski }
44502d7be507SJakub Kicinski static inline void
ethtool_module_get_req_dump_set_header_flags(struct ethtool_module_get_req_dump * req,__u32 flags)44512d7be507SJakub Kicinski ethtool_module_get_req_dump_set_header_flags(struct ethtool_module_get_req_dump *req,
44522d7be507SJakub Kicinski 					     __u32 flags)
44532d7be507SJakub Kicinski {
44542d7be507SJakub Kicinski 	req->_present.header = 1;
44552d7be507SJakub Kicinski 	req->header._present.flags = 1;
44562d7be507SJakub Kicinski 	req->header.flags = flags;
44572d7be507SJakub Kicinski }
44582d7be507SJakub Kicinski 
44592d7be507SJakub Kicinski struct ethtool_module_get_list {
44602d7be507SJakub Kicinski 	struct ethtool_module_get_list *next;
44612d7be507SJakub Kicinski 	struct ethtool_module_get_rsp obj __attribute__ ((aligned (8)));
44622d7be507SJakub Kicinski };
44632d7be507SJakub Kicinski 
44642d7be507SJakub Kicinski void ethtool_module_get_list_free(struct ethtool_module_get_list *rsp);
44652d7be507SJakub Kicinski 
44662d7be507SJakub Kicinski struct ethtool_module_get_list *
44672d7be507SJakub Kicinski ethtool_module_get_dump(struct ynl_sock *ys,
44682d7be507SJakub Kicinski 			struct ethtool_module_get_req_dump *req);
44692d7be507SJakub Kicinski 
44702d7be507SJakub Kicinski /* ETHTOOL_MSG_MODULE_GET - notify */
44712d7be507SJakub Kicinski struct ethtool_module_get_ntf {
44722d7be507SJakub Kicinski 	__u16 family;
44732d7be507SJakub Kicinski 	__u8 cmd;
44742d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
44752d7be507SJakub Kicinski 	void (*free)(struct ethtool_module_get_ntf *ntf);
44762d7be507SJakub Kicinski 	struct ethtool_module_get_rsp obj __attribute__ ((aligned (8)));
44772d7be507SJakub Kicinski };
44782d7be507SJakub Kicinski 
44792d7be507SJakub Kicinski void ethtool_module_get_ntf_free(struct ethtool_module_get_ntf *rsp);
44802d7be507SJakub Kicinski 
44812d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_MODULE_SET ============== */
44822d7be507SJakub Kicinski /* ETHTOOL_MSG_MODULE_SET - do */
44832d7be507SJakub Kicinski struct ethtool_module_set_req {
44842d7be507SJakub Kicinski 	struct {
44852d7be507SJakub Kicinski 		__u32 header:1;
44862d7be507SJakub Kicinski 		__u32 power_mode_policy:1;
44872d7be507SJakub Kicinski 		__u32 power_mode:1;
44882d7be507SJakub Kicinski 	} _present;
44892d7be507SJakub Kicinski 
44902d7be507SJakub Kicinski 	struct ethtool_header header;
44912d7be507SJakub Kicinski 	__u8 power_mode_policy;
44922d7be507SJakub Kicinski 	__u8 power_mode;
44932d7be507SJakub Kicinski };
44942d7be507SJakub Kicinski 
ethtool_module_set_req_alloc(void)44952d7be507SJakub Kicinski static inline struct ethtool_module_set_req *ethtool_module_set_req_alloc(void)
44962d7be507SJakub Kicinski {
44972d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_module_set_req));
44982d7be507SJakub Kicinski }
44992d7be507SJakub Kicinski void ethtool_module_set_req_free(struct ethtool_module_set_req *req);
45002d7be507SJakub Kicinski 
45012d7be507SJakub Kicinski static inline void
ethtool_module_set_req_set_header_dev_index(struct ethtool_module_set_req * req,__u32 dev_index)45022d7be507SJakub Kicinski ethtool_module_set_req_set_header_dev_index(struct ethtool_module_set_req *req,
45032d7be507SJakub Kicinski 					    __u32 dev_index)
45042d7be507SJakub Kicinski {
45052d7be507SJakub Kicinski 	req->_present.header = 1;
45062d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
45072d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
45082d7be507SJakub Kicinski }
45092d7be507SJakub Kicinski static inline void
ethtool_module_set_req_set_header_dev_name(struct ethtool_module_set_req * req,const char * dev_name)45102d7be507SJakub Kicinski ethtool_module_set_req_set_header_dev_name(struct ethtool_module_set_req *req,
45112d7be507SJakub Kicinski 					   const char *dev_name)
45122d7be507SJakub Kicinski {
45132d7be507SJakub Kicinski 	free(req->header.dev_name);
45142d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
45152d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
45162d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
45172d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
45182d7be507SJakub Kicinski }
45192d7be507SJakub Kicinski static inline void
ethtool_module_set_req_set_header_flags(struct ethtool_module_set_req * req,__u32 flags)45202d7be507SJakub Kicinski ethtool_module_set_req_set_header_flags(struct ethtool_module_set_req *req,
45212d7be507SJakub Kicinski 					__u32 flags)
45222d7be507SJakub Kicinski {
45232d7be507SJakub Kicinski 	req->_present.header = 1;
45242d7be507SJakub Kicinski 	req->header._present.flags = 1;
45252d7be507SJakub Kicinski 	req->header.flags = flags;
45262d7be507SJakub Kicinski }
45272d7be507SJakub Kicinski static inline void
ethtool_module_set_req_set_power_mode_policy(struct ethtool_module_set_req * req,__u8 power_mode_policy)45282d7be507SJakub Kicinski ethtool_module_set_req_set_power_mode_policy(struct ethtool_module_set_req *req,
45292d7be507SJakub Kicinski 					     __u8 power_mode_policy)
45302d7be507SJakub Kicinski {
45312d7be507SJakub Kicinski 	req->_present.power_mode_policy = 1;
45322d7be507SJakub Kicinski 	req->power_mode_policy = power_mode_policy;
45332d7be507SJakub Kicinski }
45342d7be507SJakub Kicinski static inline void
ethtool_module_set_req_set_power_mode(struct ethtool_module_set_req * req,__u8 power_mode)45352d7be507SJakub Kicinski ethtool_module_set_req_set_power_mode(struct ethtool_module_set_req *req,
45362d7be507SJakub Kicinski 				      __u8 power_mode)
45372d7be507SJakub Kicinski {
45382d7be507SJakub Kicinski 	req->_present.power_mode = 1;
45392d7be507SJakub Kicinski 	req->power_mode = power_mode;
45402d7be507SJakub Kicinski }
45412d7be507SJakub Kicinski 
45422d7be507SJakub Kicinski /*
45432d7be507SJakub Kicinski  * Set module params.
45442d7be507SJakub Kicinski  */
45452d7be507SJakub Kicinski int ethtool_module_set(struct ynl_sock *ys, struct ethtool_module_set_req *req);
45462d7be507SJakub Kicinski 
45472d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_PSE_GET ============== */
45482d7be507SJakub Kicinski /* ETHTOOL_MSG_PSE_GET - do */
45492d7be507SJakub Kicinski struct ethtool_pse_get_req {
45502d7be507SJakub Kicinski 	struct {
45512d7be507SJakub Kicinski 		__u32 header:1;
45522d7be507SJakub Kicinski 	} _present;
45532d7be507SJakub Kicinski 
45542d7be507SJakub Kicinski 	struct ethtool_header header;
45552d7be507SJakub Kicinski };
45562d7be507SJakub Kicinski 
ethtool_pse_get_req_alloc(void)45572d7be507SJakub Kicinski static inline struct ethtool_pse_get_req *ethtool_pse_get_req_alloc(void)
45582d7be507SJakub Kicinski {
45592d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_pse_get_req));
45602d7be507SJakub Kicinski }
45612d7be507SJakub Kicinski void ethtool_pse_get_req_free(struct ethtool_pse_get_req *req);
45622d7be507SJakub Kicinski 
45632d7be507SJakub Kicinski static inline void
ethtool_pse_get_req_set_header_dev_index(struct ethtool_pse_get_req * req,__u32 dev_index)45642d7be507SJakub Kicinski ethtool_pse_get_req_set_header_dev_index(struct ethtool_pse_get_req *req,
45652d7be507SJakub Kicinski 					 __u32 dev_index)
45662d7be507SJakub Kicinski {
45672d7be507SJakub Kicinski 	req->_present.header = 1;
45682d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
45692d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
45702d7be507SJakub Kicinski }
45712d7be507SJakub Kicinski static inline void
ethtool_pse_get_req_set_header_dev_name(struct ethtool_pse_get_req * req,const char * dev_name)45722d7be507SJakub Kicinski ethtool_pse_get_req_set_header_dev_name(struct ethtool_pse_get_req *req,
45732d7be507SJakub Kicinski 					const char *dev_name)
45742d7be507SJakub Kicinski {
45752d7be507SJakub Kicinski 	free(req->header.dev_name);
45762d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
45772d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
45782d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
45792d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
45802d7be507SJakub Kicinski }
45812d7be507SJakub Kicinski static inline void
ethtool_pse_get_req_set_header_flags(struct ethtool_pse_get_req * req,__u32 flags)45822d7be507SJakub Kicinski ethtool_pse_get_req_set_header_flags(struct ethtool_pse_get_req *req,
45832d7be507SJakub Kicinski 				     __u32 flags)
45842d7be507SJakub Kicinski {
45852d7be507SJakub Kicinski 	req->_present.header = 1;
45862d7be507SJakub Kicinski 	req->header._present.flags = 1;
45872d7be507SJakub Kicinski 	req->header.flags = flags;
45882d7be507SJakub Kicinski }
45892d7be507SJakub Kicinski 
45902d7be507SJakub Kicinski struct ethtool_pse_get_rsp {
45912d7be507SJakub Kicinski 	struct {
45922d7be507SJakub Kicinski 		__u32 header:1;
45932d7be507SJakub Kicinski 		__u32 admin_state:1;
45942d7be507SJakub Kicinski 		__u32 admin_control:1;
45952d7be507SJakub Kicinski 		__u32 pw_d_status:1;
45962d7be507SJakub Kicinski 	} _present;
45972d7be507SJakub Kicinski 
45982d7be507SJakub Kicinski 	struct ethtool_header header;
45992d7be507SJakub Kicinski 	__u32 admin_state;
46002d7be507SJakub Kicinski 	__u32 admin_control;
46012d7be507SJakub Kicinski 	__u32 pw_d_status;
46022d7be507SJakub Kicinski };
46032d7be507SJakub Kicinski 
46042d7be507SJakub Kicinski void ethtool_pse_get_rsp_free(struct ethtool_pse_get_rsp *rsp);
46052d7be507SJakub Kicinski 
46062d7be507SJakub Kicinski /*
46072d7be507SJakub Kicinski  * Get Power Sourcing Equipment params.
46082d7be507SJakub Kicinski  */
46092d7be507SJakub Kicinski struct ethtool_pse_get_rsp *
46102d7be507SJakub Kicinski ethtool_pse_get(struct ynl_sock *ys, struct ethtool_pse_get_req *req);
46112d7be507SJakub Kicinski 
46122d7be507SJakub Kicinski /* ETHTOOL_MSG_PSE_GET - dump */
46132d7be507SJakub Kicinski struct ethtool_pse_get_req_dump {
46142d7be507SJakub Kicinski 	struct {
46152d7be507SJakub Kicinski 		__u32 header:1;
46162d7be507SJakub Kicinski 	} _present;
46172d7be507SJakub Kicinski 
46182d7be507SJakub Kicinski 	struct ethtool_header header;
46192d7be507SJakub Kicinski };
46202d7be507SJakub Kicinski 
46212d7be507SJakub Kicinski static inline struct ethtool_pse_get_req_dump *
ethtool_pse_get_req_dump_alloc(void)46222d7be507SJakub Kicinski ethtool_pse_get_req_dump_alloc(void)
46232d7be507SJakub Kicinski {
46242d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_pse_get_req_dump));
46252d7be507SJakub Kicinski }
46262d7be507SJakub Kicinski void ethtool_pse_get_req_dump_free(struct ethtool_pse_get_req_dump *req);
46272d7be507SJakub Kicinski 
46282d7be507SJakub Kicinski static inline void
ethtool_pse_get_req_dump_set_header_dev_index(struct ethtool_pse_get_req_dump * req,__u32 dev_index)46292d7be507SJakub Kicinski ethtool_pse_get_req_dump_set_header_dev_index(struct ethtool_pse_get_req_dump *req,
46302d7be507SJakub Kicinski 					      __u32 dev_index)
46312d7be507SJakub Kicinski {
46322d7be507SJakub Kicinski 	req->_present.header = 1;
46332d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
46342d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
46352d7be507SJakub Kicinski }
46362d7be507SJakub Kicinski static inline void
ethtool_pse_get_req_dump_set_header_dev_name(struct ethtool_pse_get_req_dump * req,const char * dev_name)46372d7be507SJakub Kicinski ethtool_pse_get_req_dump_set_header_dev_name(struct ethtool_pse_get_req_dump *req,
46382d7be507SJakub Kicinski 					     const char *dev_name)
46392d7be507SJakub Kicinski {
46402d7be507SJakub Kicinski 	free(req->header.dev_name);
46412d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
46422d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
46432d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
46442d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
46452d7be507SJakub Kicinski }
46462d7be507SJakub Kicinski static inline void
ethtool_pse_get_req_dump_set_header_flags(struct ethtool_pse_get_req_dump * req,__u32 flags)46472d7be507SJakub Kicinski ethtool_pse_get_req_dump_set_header_flags(struct ethtool_pse_get_req_dump *req,
46482d7be507SJakub Kicinski 					  __u32 flags)
46492d7be507SJakub Kicinski {
46502d7be507SJakub Kicinski 	req->_present.header = 1;
46512d7be507SJakub Kicinski 	req->header._present.flags = 1;
46522d7be507SJakub Kicinski 	req->header.flags = flags;
46532d7be507SJakub Kicinski }
46542d7be507SJakub Kicinski 
46552d7be507SJakub Kicinski struct ethtool_pse_get_list {
46562d7be507SJakub Kicinski 	struct ethtool_pse_get_list *next;
46572d7be507SJakub Kicinski 	struct ethtool_pse_get_rsp obj __attribute__ ((aligned (8)));
46582d7be507SJakub Kicinski };
46592d7be507SJakub Kicinski 
46602d7be507SJakub Kicinski void ethtool_pse_get_list_free(struct ethtool_pse_get_list *rsp);
46612d7be507SJakub Kicinski 
46622d7be507SJakub Kicinski struct ethtool_pse_get_list *
46632d7be507SJakub Kicinski ethtool_pse_get_dump(struct ynl_sock *ys, struct ethtool_pse_get_req_dump *req);
46642d7be507SJakub Kicinski 
46652d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_PSE_SET ============== */
46662d7be507SJakub Kicinski /* ETHTOOL_MSG_PSE_SET - do */
46672d7be507SJakub Kicinski struct ethtool_pse_set_req {
46682d7be507SJakub Kicinski 	struct {
46692d7be507SJakub Kicinski 		__u32 header:1;
46702d7be507SJakub Kicinski 		__u32 admin_state:1;
46712d7be507SJakub Kicinski 		__u32 admin_control:1;
46722d7be507SJakub Kicinski 		__u32 pw_d_status:1;
46732d7be507SJakub Kicinski 	} _present;
46742d7be507SJakub Kicinski 
46752d7be507SJakub Kicinski 	struct ethtool_header header;
46762d7be507SJakub Kicinski 	__u32 admin_state;
46772d7be507SJakub Kicinski 	__u32 admin_control;
46782d7be507SJakub Kicinski 	__u32 pw_d_status;
46792d7be507SJakub Kicinski };
46802d7be507SJakub Kicinski 
ethtool_pse_set_req_alloc(void)46812d7be507SJakub Kicinski static inline struct ethtool_pse_set_req *ethtool_pse_set_req_alloc(void)
46822d7be507SJakub Kicinski {
46832d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_pse_set_req));
46842d7be507SJakub Kicinski }
46852d7be507SJakub Kicinski void ethtool_pse_set_req_free(struct ethtool_pse_set_req *req);
46862d7be507SJakub Kicinski 
46872d7be507SJakub Kicinski static inline void
ethtool_pse_set_req_set_header_dev_index(struct ethtool_pse_set_req * req,__u32 dev_index)46882d7be507SJakub Kicinski ethtool_pse_set_req_set_header_dev_index(struct ethtool_pse_set_req *req,
46892d7be507SJakub Kicinski 					 __u32 dev_index)
46902d7be507SJakub Kicinski {
46912d7be507SJakub Kicinski 	req->_present.header = 1;
46922d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
46932d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
46942d7be507SJakub Kicinski }
46952d7be507SJakub Kicinski static inline void
ethtool_pse_set_req_set_header_dev_name(struct ethtool_pse_set_req * req,const char * dev_name)46962d7be507SJakub Kicinski ethtool_pse_set_req_set_header_dev_name(struct ethtool_pse_set_req *req,
46972d7be507SJakub Kicinski 					const char *dev_name)
46982d7be507SJakub Kicinski {
46992d7be507SJakub Kicinski 	free(req->header.dev_name);
47002d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
47012d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
47022d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
47032d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
47042d7be507SJakub Kicinski }
47052d7be507SJakub Kicinski static inline void
ethtool_pse_set_req_set_header_flags(struct ethtool_pse_set_req * req,__u32 flags)47062d7be507SJakub Kicinski ethtool_pse_set_req_set_header_flags(struct ethtool_pse_set_req *req,
47072d7be507SJakub Kicinski 				     __u32 flags)
47082d7be507SJakub Kicinski {
47092d7be507SJakub Kicinski 	req->_present.header = 1;
47102d7be507SJakub Kicinski 	req->header._present.flags = 1;
47112d7be507SJakub Kicinski 	req->header.flags = flags;
47122d7be507SJakub Kicinski }
47132d7be507SJakub Kicinski static inline void
ethtool_pse_set_req_set_admin_state(struct ethtool_pse_set_req * req,__u32 admin_state)47142d7be507SJakub Kicinski ethtool_pse_set_req_set_admin_state(struct ethtool_pse_set_req *req,
47152d7be507SJakub Kicinski 				    __u32 admin_state)
47162d7be507SJakub Kicinski {
47172d7be507SJakub Kicinski 	req->_present.admin_state = 1;
47182d7be507SJakub Kicinski 	req->admin_state = admin_state;
47192d7be507SJakub Kicinski }
47202d7be507SJakub Kicinski static inline void
ethtool_pse_set_req_set_admin_control(struct ethtool_pse_set_req * req,__u32 admin_control)47212d7be507SJakub Kicinski ethtool_pse_set_req_set_admin_control(struct ethtool_pse_set_req *req,
47222d7be507SJakub Kicinski 				      __u32 admin_control)
47232d7be507SJakub Kicinski {
47242d7be507SJakub Kicinski 	req->_present.admin_control = 1;
47252d7be507SJakub Kicinski 	req->admin_control = admin_control;
47262d7be507SJakub Kicinski }
47272d7be507SJakub Kicinski static inline void
ethtool_pse_set_req_set_pw_d_status(struct ethtool_pse_set_req * req,__u32 pw_d_status)47282d7be507SJakub Kicinski ethtool_pse_set_req_set_pw_d_status(struct ethtool_pse_set_req *req,
47292d7be507SJakub Kicinski 				    __u32 pw_d_status)
47302d7be507SJakub Kicinski {
47312d7be507SJakub Kicinski 	req->_present.pw_d_status = 1;
47322d7be507SJakub Kicinski 	req->pw_d_status = pw_d_status;
47332d7be507SJakub Kicinski }
47342d7be507SJakub Kicinski 
47352d7be507SJakub Kicinski /*
47362d7be507SJakub Kicinski  * Set Power Sourcing Equipment params.
47372d7be507SJakub Kicinski  */
47382d7be507SJakub Kicinski int ethtool_pse_set(struct ynl_sock *ys, struct ethtool_pse_set_req *req);
47392d7be507SJakub Kicinski 
47402d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_RSS_GET ============== */
47412d7be507SJakub Kicinski /* ETHTOOL_MSG_RSS_GET - do */
47422d7be507SJakub Kicinski struct ethtool_rss_get_req {
47432d7be507SJakub Kicinski 	struct {
47442d7be507SJakub Kicinski 		__u32 header:1;
47452d7be507SJakub Kicinski 	} _present;
47462d7be507SJakub Kicinski 
47472d7be507SJakub Kicinski 	struct ethtool_header header;
47482d7be507SJakub Kicinski };
47492d7be507SJakub Kicinski 
ethtool_rss_get_req_alloc(void)47502d7be507SJakub Kicinski static inline struct ethtool_rss_get_req *ethtool_rss_get_req_alloc(void)
47512d7be507SJakub Kicinski {
47522d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_rss_get_req));
47532d7be507SJakub Kicinski }
47542d7be507SJakub Kicinski void ethtool_rss_get_req_free(struct ethtool_rss_get_req *req);
47552d7be507SJakub Kicinski 
47562d7be507SJakub Kicinski static inline void
ethtool_rss_get_req_set_header_dev_index(struct ethtool_rss_get_req * req,__u32 dev_index)47572d7be507SJakub Kicinski ethtool_rss_get_req_set_header_dev_index(struct ethtool_rss_get_req *req,
47582d7be507SJakub Kicinski 					 __u32 dev_index)
47592d7be507SJakub Kicinski {
47602d7be507SJakub Kicinski 	req->_present.header = 1;
47612d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
47622d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
47632d7be507SJakub Kicinski }
47642d7be507SJakub Kicinski static inline void
ethtool_rss_get_req_set_header_dev_name(struct ethtool_rss_get_req * req,const char * dev_name)47652d7be507SJakub Kicinski ethtool_rss_get_req_set_header_dev_name(struct ethtool_rss_get_req *req,
47662d7be507SJakub Kicinski 					const char *dev_name)
47672d7be507SJakub Kicinski {
47682d7be507SJakub Kicinski 	free(req->header.dev_name);
47692d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
47702d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
47712d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
47722d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
47732d7be507SJakub Kicinski }
47742d7be507SJakub Kicinski static inline void
ethtool_rss_get_req_set_header_flags(struct ethtool_rss_get_req * req,__u32 flags)47752d7be507SJakub Kicinski ethtool_rss_get_req_set_header_flags(struct ethtool_rss_get_req *req,
47762d7be507SJakub Kicinski 				     __u32 flags)
47772d7be507SJakub Kicinski {
47782d7be507SJakub Kicinski 	req->_present.header = 1;
47792d7be507SJakub Kicinski 	req->header._present.flags = 1;
47802d7be507SJakub Kicinski 	req->header.flags = flags;
47812d7be507SJakub Kicinski }
47822d7be507SJakub Kicinski 
47832d7be507SJakub Kicinski struct ethtool_rss_get_rsp {
47842d7be507SJakub Kicinski 	struct {
47852d7be507SJakub Kicinski 		__u32 header:1;
47862d7be507SJakub Kicinski 		__u32 context:1;
47872d7be507SJakub Kicinski 		__u32 hfunc:1;
47882d7be507SJakub Kicinski 		__u32 indir_len;
47892d7be507SJakub Kicinski 		__u32 hkey_len;
47902d7be507SJakub Kicinski 	} _present;
47912d7be507SJakub Kicinski 
47922d7be507SJakub Kicinski 	struct ethtool_header header;
47932d7be507SJakub Kicinski 	__u32 context;
47942d7be507SJakub Kicinski 	__u32 hfunc;
47952d7be507SJakub Kicinski 	void *indir;
47962d7be507SJakub Kicinski 	void *hkey;
47972d7be507SJakub Kicinski };
47982d7be507SJakub Kicinski 
47992d7be507SJakub Kicinski void ethtool_rss_get_rsp_free(struct ethtool_rss_get_rsp *rsp);
48002d7be507SJakub Kicinski 
48012d7be507SJakub Kicinski /*
48022d7be507SJakub Kicinski  * Get RSS params.
48032d7be507SJakub Kicinski  */
48042d7be507SJakub Kicinski struct ethtool_rss_get_rsp *
48052d7be507SJakub Kicinski ethtool_rss_get(struct ynl_sock *ys, struct ethtool_rss_get_req *req);
48062d7be507SJakub Kicinski 
48072d7be507SJakub Kicinski /* ETHTOOL_MSG_RSS_GET - dump */
48082d7be507SJakub Kicinski struct ethtool_rss_get_req_dump {
48092d7be507SJakub Kicinski 	struct {
48102d7be507SJakub Kicinski 		__u32 header:1;
48112d7be507SJakub Kicinski 	} _present;
48122d7be507SJakub Kicinski 
48132d7be507SJakub Kicinski 	struct ethtool_header header;
48142d7be507SJakub Kicinski };
48152d7be507SJakub Kicinski 
48162d7be507SJakub Kicinski static inline struct ethtool_rss_get_req_dump *
ethtool_rss_get_req_dump_alloc(void)48172d7be507SJakub Kicinski ethtool_rss_get_req_dump_alloc(void)
48182d7be507SJakub Kicinski {
48192d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_rss_get_req_dump));
48202d7be507SJakub Kicinski }
48212d7be507SJakub Kicinski void ethtool_rss_get_req_dump_free(struct ethtool_rss_get_req_dump *req);
48222d7be507SJakub Kicinski 
48232d7be507SJakub Kicinski static inline void
ethtool_rss_get_req_dump_set_header_dev_index(struct ethtool_rss_get_req_dump * req,__u32 dev_index)48242d7be507SJakub Kicinski ethtool_rss_get_req_dump_set_header_dev_index(struct ethtool_rss_get_req_dump *req,
48252d7be507SJakub Kicinski 					      __u32 dev_index)
48262d7be507SJakub Kicinski {
48272d7be507SJakub Kicinski 	req->_present.header = 1;
48282d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
48292d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
48302d7be507SJakub Kicinski }
48312d7be507SJakub Kicinski static inline void
ethtool_rss_get_req_dump_set_header_dev_name(struct ethtool_rss_get_req_dump * req,const char * dev_name)48322d7be507SJakub Kicinski ethtool_rss_get_req_dump_set_header_dev_name(struct ethtool_rss_get_req_dump *req,
48332d7be507SJakub Kicinski 					     const char *dev_name)
48342d7be507SJakub Kicinski {
48352d7be507SJakub Kicinski 	free(req->header.dev_name);
48362d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
48372d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
48382d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
48392d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
48402d7be507SJakub Kicinski }
48412d7be507SJakub Kicinski static inline void
ethtool_rss_get_req_dump_set_header_flags(struct ethtool_rss_get_req_dump * req,__u32 flags)48422d7be507SJakub Kicinski ethtool_rss_get_req_dump_set_header_flags(struct ethtool_rss_get_req_dump *req,
48432d7be507SJakub Kicinski 					  __u32 flags)
48442d7be507SJakub Kicinski {
48452d7be507SJakub Kicinski 	req->_present.header = 1;
48462d7be507SJakub Kicinski 	req->header._present.flags = 1;
48472d7be507SJakub Kicinski 	req->header.flags = flags;
48482d7be507SJakub Kicinski }
48492d7be507SJakub Kicinski 
48502d7be507SJakub Kicinski struct ethtool_rss_get_list {
48512d7be507SJakub Kicinski 	struct ethtool_rss_get_list *next;
48522d7be507SJakub Kicinski 	struct ethtool_rss_get_rsp obj __attribute__ ((aligned (8)));
48532d7be507SJakub Kicinski };
48542d7be507SJakub Kicinski 
48552d7be507SJakub Kicinski void ethtool_rss_get_list_free(struct ethtool_rss_get_list *rsp);
48562d7be507SJakub Kicinski 
48572d7be507SJakub Kicinski struct ethtool_rss_get_list *
48582d7be507SJakub Kicinski ethtool_rss_get_dump(struct ynl_sock *ys, struct ethtool_rss_get_req_dump *req);
48592d7be507SJakub Kicinski 
48602d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_PLCA_GET_CFG ============== */
48612d7be507SJakub Kicinski /* ETHTOOL_MSG_PLCA_GET_CFG - do */
48622d7be507SJakub Kicinski struct ethtool_plca_get_cfg_req {
48632d7be507SJakub Kicinski 	struct {
48642d7be507SJakub Kicinski 		__u32 header:1;
48652d7be507SJakub Kicinski 	} _present;
48662d7be507SJakub Kicinski 
48672d7be507SJakub Kicinski 	struct ethtool_header header;
48682d7be507SJakub Kicinski };
48692d7be507SJakub Kicinski 
48702d7be507SJakub Kicinski static inline struct ethtool_plca_get_cfg_req *
ethtool_plca_get_cfg_req_alloc(void)48712d7be507SJakub Kicinski ethtool_plca_get_cfg_req_alloc(void)
48722d7be507SJakub Kicinski {
48732d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_plca_get_cfg_req));
48742d7be507SJakub Kicinski }
48752d7be507SJakub Kicinski void ethtool_plca_get_cfg_req_free(struct ethtool_plca_get_cfg_req *req);
48762d7be507SJakub Kicinski 
48772d7be507SJakub Kicinski static inline void
ethtool_plca_get_cfg_req_set_header_dev_index(struct ethtool_plca_get_cfg_req * req,__u32 dev_index)48782d7be507SJakub Kicinski ethtool_plca_get_cfg_req_set_header_dev_index(struct ethtool_plca_get_cfg_req *req,
48792d7be507SJakub Kicinski 					      __u32 dev_index)
48802d7be507SJakub Kicinski {
48812d7be507SJakub Kicinski 	req->_present.header = 1;
48822d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
48832d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
48842d7be507SJakub Kicinski }
48852d7be507SJakub Kicinski static inline void
ethtool_plca_get_cfg_req_set_header_dev_name(struct ethtool_plca_get_cfg_req * req,const char * dev_name)48862d7be507SJakub Kicinski ethtool_plca_get_cfg_req_set_header_dev_name(struct ethtool_plca_get_cfg_req *req,
48872d7be507SJakub Kicinski 					     const char *dev_name)
48882d7be507SJakub Kicinski {
48892d7be507SJakub Kicinski 	free(req->header.dev_name);
48902d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
48912d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
48922d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
48932d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
48942d7be507SJakub Kicinski }
48952d7be507SJakub Kicinski static inline void
ethtool_plca_get_cfg_req_set_header_flags(struct ethtool_plca_get_cfg_req * req,__u32 flags)48962d7be507SJakub Kicinski ethtool_plca_get_cfg_req_set_header_flags(struct ethtool_plca_get_cfg_req *req,
48972d7be507SJakub Kicinski 					  __u32 flags)
48982d7be507SJakub Kicinski {
48992d7be507SJakub Kicinski 	req->_present.header = 1;
49002d7be507SJakub Kicinski 	req->header._present.flags = 1;
49012d7be507SJakub Kicinski 	req->header.flags = flags;
49022d7be507SJakub Kicinski }
49032d7be507SJakub Kicinski 
49042d7be507SJakub Kicinski struct ethtool_plca_get_cfg_rsp {
49052d7be507SJakub Kicinski 	struct {
49062d7be507SJakub Kicinski 		__u32 header:1;
49072d7be507SJakub Kicinski 		__u32 version:1;
49082d7be507SJakub Kicinski 		__u32 enabled:1;
49092d7be507SJakub Kicinski 		__u32 status:1;
49102d7be507SJakub Kicinski 		__u32 node_cnt:1;
49112d7be507SJakub Kicinski 		__u32 node_id:1;
49122d7be507SJakub Kicinski 		__u32 to_tmr:1;
49132d7be507SJakub Kicinski 		__u32 burst_cnt:1;
49142d7be507SJakub Kicinski 		__u32 burst_tmr:1;
49152d7be507SJakub Kicinski 	} _present;
49162d7be507SJakub Kicinski 
49172d7be507SJakub Kicinski 	struct ethtool_header header;
49182d7be507SJakub Kicinski 	__u16 version;
49192d7be507SJakub Kicinski 	__u8 enabled;
49202d7be507SJakub Kicinski 	__u8 status;
49212d7be507SJakub Kicinski 	__u32 node_cnt;
49222d7be507SJakub Kicinski 	__u32 node_id;
49232d7be507SJakub Kicinski 	__u32 to_tmr;
49242d7be507SJakub Kicinski 	__u32 burst_cnt;
49252d7be507SJakub Kicinski 	__u32 burst_tmr;
49262d7be507SJakub Kicinski };
49272d7be507SJakub Kicinski 
49282d7be507SJakub Kicinski void ethtool_plca_get_cfg_rsp_free(struct ethtool_plca_get_cfg_rsp *rsp);
49292d7be507SJakub Kicinski 
49302d7be507SJakub Kicinski /*
49312d7be507SJakub Kicinski  * Get PLCA params.
49322d7be507SJakub Kicinski  */
49332d7be507SJakub Kicinski struct ethtool_plca_get_cfg_rsp *
49342d7be507SJakub Kicinski ethtool_plca_get_cfg(struct ynl_sock *ys, struct ethtool_plca_get_cfg_req *req);
49352d7be507SJakub Kicinski 
49362d7be507SJakub Kicinski /* ETHTOOL_MSG_PLCA_GET_CFG - dump */
49372d7be507SJakub Kicinski struct ethtool_plca_get_cfg_req_dump {
49382d7be507SJakub Kicinski 	struct {
49392d7be507SJakub Kicinski 		__u32 header:1;
49402d7be507SJakub Kicinski 	} _present;
49412d7be507SJakub Kicinski 
49422d7be507SJakub Kicinski 	struct ethtool_header header;
49432d7be507SJakub Kicinski };
49442d7be507SJakub Kicinski 
49452d7be507SJakub Kicinski static inline struct ethtool_plca_get_cfg_req_dump *
ethtool_plca_get_cfg_req_dump_alloc(void)49462d7be507SJakub Kicinski ethtool_plca_get_cfg_req_dump_alloc(void)
49472d7be507SJakub Kicinski {
49482d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_plca_get_cfg_req_dump));
49492d7be507SJakub Kicinski }
49502d7be507SJakub Kicinski void
49512d7be507SJakub Kicinski ethtool_plca_get_cfg_req_dump_free(struct ethtool_plca_get_cfg_req_dump *req);
49522d7be507SJakub Kicinski 
49532d7be507SJakub Kicinski static inline void
ethtool_plca_get_cfg_req_dump_set_header_dev_index(struct ethtool_plca_get_cfg_req_dump * req,__u32 dev_index)49542d7be507SJakub Kicinski ethtool_plca_get_cfg_req_dump_set_header_dev_index(struct ethtool_plca_get_cfg_req_dump *req,
49552d7be507SJakub Kicinski 						   __u32 dev_index)
49562d7be507SJakub Kicinski {
49572d7be507SJakub Kicinski 	req->_present.header = 1;
49582d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
49592d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
49602d7be507SJakub Kicinski }
49612d7be507SJakub Kicinski static inline void
ethtool_plca_get_cfg_req_dump_set_header_dev_name(struct ethtool_plca_get_cfg_req_dump * req,const char * dev_name)49622d7be507SJakub Kicinski ethtool_plca_get_cfg_req_dump_set_header_dev_name(struct ethtool_plca_get_cfg_req_dump *req,
49632d7be507SJakub Kicinski 						  const char *dev_name)
49642d7be507SJakub Kicinski {
49652d7be507SJakub Kicinski 	free(req->header.dev_name);
49662d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
49672d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
49682d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
49692d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
49702d7be507SJakub Kicinski }
49712d7be507SJakub Kicinski static inline void
ethtool_plca_get_cfg_req_dump_set_header_flags(struct ethtool_plca_get_cfg_req_dump * req,__u32 flags)49722d7be507SJakub Kicinski ethtool_plca_get_cfg_req_dump_set_header_flags(struct ethtool_plca_get_cfg_req_dump *req,
49732d7be507SJakub Kicinski 					       __u32 flags)
49742d7be507SJakub Kicinski {
49752d7be507SJakub Kicinski 	req->_present.header = 1;
49762d7be507SJakub Kicinski 	req->header._present.flags = 1;
49772d7be507SJakub Kicinski 	req->header.flags = flags;
49782d7be507SJakub Kicinski }
49792d7be507SJakub Kicinski 
49802d7be507SJakub Kicinski struct ethtool_plca_get_cfg_list {
49812d7be507SJakub Kicinski 	struct ethtool_plca_get_cfg_list *next;
49822d7be507SJakub Kicinski 	struct ethtool_plca_get_cfg_rsp obj __attribute__ ((aligned (8)));
49832d7be507SJakub Kicinski };
49842d7be507SJakub Kicinski 
49852d7be507SJakub Kicinski void ethtool_plca_get_cfg_list_free(struct ethtool_plca_get_cfg_list *rsp);
49862d7be507SJakub Kicinski 
49872d7be507SJakub Kicinski struct ethtool_plca_get_cfg_list *
49882d7be507SJakub Kicinski ethtool_plca_get_cfg_dump(struct ynl_sock *ys,
49892d7be507SJakub Kicinski 			  struct ethtool_plca_get_cfg_req_dump *req);
49902d7be507SJakub Kicinski 
49912d7be507SJakub Kicinski /* ETHTOOL_MSG_PLCA_GET_CFG - notify */
49922d7be507SJakub Kicinski struct ethtool_plca_get_cfg_ntf {
49932d7be507SJakub Kicinski 	__u16 family;
49942d7be507SJakub Kicinski 	__u8 cmd;
49952d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
49962d7be507SJakub Kicinski 	void (*free)(struct ethtool_plca_get_cfg_ntf *ntf);
49972d7be507SJakub Kicinski 	struct ethtool_plca_get_cfg_rsp obj __attribute__ ((aligned (8)));
49982d7be507SJakub Kicinski };
49992d7be507SJakub Kicinski 
50002d7be507SJakub Kicinski void ethtool_plca_get_cfg_ntf_free(struct ethtool_plca_get_cfg_ntf *rsp);
50012d7be507SJakub Kicinski 
50022d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_PLCA_SET_CFG ============== */
50032d7be507SJakub Kicinski /* ETHTOOL_MSG_PLCA_SET_CFG - do */
50042d7be507SJakub Kicinski struct ethtool_plca_set_cfg_req {
50052d7be507SJakub Kicinski 	struct {
50062d7be507SJakub Kicinski 		__u32 header:1;
50072d7be507SJakub Kicinski 		__u32 version:1;
50082d7be507SJakub Kicinski 		__u32 enabled:1;
50092d7be507SJakub Kicinski 		__u32 status:1;
50102d7be507SJakub Kicinski 		__u32 node_cnt:1;
50112d7be507SJakub Kicinski 		__u32 node_id:1;
50122d7be507SJakub Kicinski 		__u32 to_tmr:1;
50132d7be507SJakub Kicinski 		__u32 burst_cnt:1;
50142d7be507SJakub Kicinski 		__u32 burst_tmr:1;
50152d7be507SJakub Kicinski 	} _present;
50162d7be507SJakub Kicinski 
50172d7be507SJakub Kicinski 	struct ethtool_header header;
50182d7be507SJakub Kicinski 	__u16 version;
50192d7be507SJakub Kicinski 	__u8 enabled;
50202d7be507SJakub Kicinski 	__u8 status;
50212d7be507SJakub Kicinski 	__u32 node_cnt;
50222d7be507SJakub Kicinski 	__u32 node_id;
50232d7be507SJakub Kicinski 	__u32 to_tmr;
50242d7be507SJakub Kicinski 	__u32 burst_cnt;
50252d7be507SJakub Kicinski 	__u32 burst_tmr;
50262d7be507SJakub Kicinski };
50272d7be507SJakub Kicinski 
50282d7be507SJakub Kicinski static inline struct ethtool_plca_set_cfg_req *
ethtool_plca_set_cfg_req_alloc(void)50292d7be507SJakub Kicinski ethtool_plca_set_cfg_req_alloc(void)
50302d7be507SJakub Kicinski {
50312d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_plca_set_cfg_req));
50322d7be507SJakub Kicinski }
50332d7be507SJakub Kicinski void ethtool_plca_set_cfg_req_free(struct ethtool_plca_set_cfg_req *req);
50342d7be507SJakub Kicinski 
50352d7be507SJakub Kicinski static inline void
ethtool_plca_set_cfg_req_set_header_dev_index(struct ethtool_plca_set_cfg_req * req,__u32 dev_index)50362d7be507SJakub Kicinski ethtool_plca_set_cfg_req_set_header_dev_index(struct ethtool_plca_set_cfg_req *req,
50372d7be507SJakub Kicinski 					      __u32 dev_index)
50382d7be507SJakub Kicinski {
50392d7be507SJakub Kicinski 	req->_present.header = 1;
50402d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
50412d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
50422d7be507SJakub Kicinski }
50432d7be507SJakub Kicinski static inline void
ethtool_plca_set_cfg_req_set_header_dev_name(struct ethtool_plca_set_cfg_req * req,const char * dev_name)50442d7be507SJakub Kicinski ethtool_plca_set_cfg_req_set_header_dev_name(struct ethtool_plca_set_cfg_req *req,
50452d7be507SJakub Kicinski 					     const char *dev_name)
50462d7be507SJakub Kicinski {
50472d7be507SJakub Kicinski 	free(req->header.dev_name);
50482d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
50492d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
50502d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
50512d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
50522d7be507SJakub Kicinski }
50532d7be507SJakub Kicinski static inline void
ethtool_plca_set_cfg_req_set_header_flags(struct ethtool_plca_set_cfg_req * req,__u32 flags)50542d7be507SJakub Kicinski ethtool_plca_set_cfg_req_set_header_flags(struct ethtool_plca_set_cfg_req *req,
50552d7be507SJakub Kicinski 					  __u32 flags)
50562d7be507SJakub Kicinski {
50572d7be507SJakub Kicinski 	req->_present.header = 1;
50582d7be507SJakub Kicinski 	req->header._present.flags = 1;
50592d7be507SJakub Kicinski 	req->header.flags = flags;
50602d7be507SJakub Kicinski }
50612d7be507SJakub Kicinski static inline void
ethtool_plca_set_cfg_req_set_version(struct ethtool_plca_set_cfg_req * req,__u16 version)50622d7be507SJakub Kicinski ethtool_plca_set_cfg_req_set_version(struct ethtool_plca_set_cfg_req *req,
50632d7be507SJakub Kicinski 				     __u16 version)
50642d7be507SJakub Kicinski {
50652d7be507SJakub Kicinski 	req->_present.version = 1;
50662d7be507SJakub Kicinski 	req->version = version;
50672d7be507SJakub Kicinski }
50682d7be507SJakub Kicinski static inline void
ethtool_plca_set_cfg_req_set_enabled(struct ethtool_plca_set_cfg_req * req,__u8 enabled)50692d7be507SJakub Kicinski ethtool_plca_set_cfg_req_set_enabled(struct ethtool_plca_set_cfg_req *req,
50702d7be507SJakub Kicinski 				     __u8 enabled)
50712d7be507SJakub Kicinski {
50722d7be507SJakub Kicinski 	req->_present.enabled = 1;
50732d7be507SJakub Kicinski 	req->enabled = enabled;
50742d7be507SJakub Kicinski }
50752d7be507SJakub Kicinski static inline void
ethtool_plca_set_cfg_req_set_status(struct ethtool_plca_set_cfg_req * req,__u8 status)50762d7be507SJakub Kicinski ethtool_plca_set_cfg_req_set_status(struct ethtool_plca_set_cfg_req *req,
50772d7be507SJakub Kicinski 				    __u8 status)
50782d7be507SJakub Kicinski {
50792d7be507SJakub Kicinski 	req->_present.status = 1;
50802d7be507SJakub Kicinski 	req->status = status;
50812d7be507SJakub Kicinski }
50822d7be507SJakub Kicinski static inline void
ethtool_plca_set_cfg_req_set_node_cnt(struct ethtool_plca_set_cfg_req * req,__u32 node_cnt)50832d7be507SJakub Kicinski ethtool_plca_set_cfg_req_set_node_cnt(struct ethtool_plca_set_cfg_req *req,
50842d7be507SJakub Kicinski 				      __u32 node_cnt)
50852d7be507SJakub Kicinski {
50862d7be507SJakub Kicinski 	req->_present.node_cnt = 1;
50872d7be507SJakub Kicinski 	req->node_cnt = node_cnt;
50882d7be507SJakub Kicinski }
50892d7be507SJakub Kicinski static inline void
ethtool_plca_set_cfg_req_set_node_id(struct ethtool_plca_set_cfg_req * req,__u32 node_id)50902d7be507SJakub Kicinski ethtool_plca_set_cfg_req_set_node_id(struct ethtool_plca_set_cfg_req *req,
50912d7be507SJakub Kicinski 				     __u32 node_id)
50922d7be507SJakub Kicinski {
50932d7be507SJakub Kicinski 	req->_present.node_id = 1;
50942d7be507SJakub Kicinski 	req->node_id = node_id;
50952d7be507SJakub Kicinski }
50962d7be507SJakub Kicinski static inline void
ethtool_plca_set_cfg_req_set_to_tmr(struct ethtool_plca_set_cfg_req * req,__u32 to_tmr)50972d7be507SJakub Kicinski ethtool_plca_set_cfg_req_set_to_tmr(struct ethtool_plca_set_cfg_req *req,
50982d7be507SJakub Kicinski 				    __u32 to_tmr)
50992d7be507SJakub Kicinski {
51002d7be507SJakub Kicinski 	req->_present.to_tmr = 1;
51012d7be507SJakub Kicinski 	req->to_tmr = to_tmr;
51022d7be507SJakub Kicinski }
51032d7be507SJakub Kicinski static inline void
ethtool_plca_set_cfg_req_set_burst_cnt(struct ethtool_plca_set_cfg_req * req,__u32 burst_cnt)51042d7be507SJakub Kicinski ethtool_plca_set_cfg_req_set_burst_cnt(struct ethtool_plca_set_cfg_req *req,
51052d7be507SJakub Kicinski 				       __u32 burst_cnt)
51062d7be507SJakub Kicinski {
51072d7be507SJakub Kicinski 	req->_present.burst_cnt = 1;
51082d7be507SJakub Kicinski 	req->burst_cnt = burst_cnt;
51092d7be507SJakub Kicinski }
51102d7be507SJakub Kicinski static inline void
ethtool_plca_set_cfg_req_set_burst_tmr(struct ethtool_plca_set_cfg_req * req,__u32 burst_tmr)51112d7be507SJakub Kicinski ethtool_plca_set_cfg_req_set_burst_tmr(struct ethtool_plca_set_cfg_req *req,
51122d7be507SJakub Kicinski 				       __u32 burst_tmr)
51132d7be507SJakub Kicinski {
51142d7be507SJakub Kicinski 	req->_present.burst_tmr = 1;
51152d7be507SJakub Kicinski 	req->burst_tmr = burst_tmr;
51162d7be507SJakub Kicinski }
51172d7be507SJakub Kicinski 
51182d7be507SJakub Kicinski /*
51192d7be507SJakub Kicinski  * Set PLCA params.
51202d7be507SJakub Kicinski  */
51212d7be507SJakub Kicinski int ethtool_plca_set_cfg(struct ynl_sock *ys,
51222d7be507SJakub Kicinski 			 struct ethtool_plca_set_cfg_req *req);
51232d7be507SJakub Kicinski 
51242d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_PLCA_GET_STATUS ============== */
51252d7be507SJakub Kicinski /* ETHTOOL_MSG_PLCA_GET_STATUS - do */
51262d7be507SJakub Kicinski struct ethtool_plca_get_status_req {
51272d7be507SJakub Kicinski 	struct {
51282d7be507SJakub Kicinski 		__u32 header:1;
51292d7be507SJakub Kicinski 	} _present;
51302d7be507SJakub Kicinski 
51312d7be507SJakub Kicinski 	struct ethtool_header header;
51322d7be507SJakub Kicinski };
51332d7be507SJakub Kicinski 
51342d7be507SJakub Kicinski static inline struct ethtool_plca_get_status_req *
ethtool_plca_get_status_req_alloc(void)51352d7be507SJakub Kicinski ethtool_plca_get_status_req_alloc(void)
51362d7be507SJakub Kicinski {
51372d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_plca_get_status_req));
51382d7be507SJakub Kicinski }
51392d7be507SJakub Kicinski void ethtool_plca_get_status_req_free(struct ethtool_plca_get_status_req *req);
51402d7be507SJakub Kicinski 
51412d7be507SJakub Kicinski static inline void
ethtool_plca_get_status_req_set_header_dev_index(struct ethtool_plca_get_status_req * req,__u32 dev_index)51422d7be507SJakub Kicinski ethtool_plca_get_status_req_set_header_dev_index(struct ethtool_plca_get_status_req *req,
51432d7be507SJakub Kicinski 						 __u32 dev_index)
51442d7be507SJakub Kicinski {
51452d7be507SJakub Kicinski 	req->_present.header = 1;
51462d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
51472d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
51482d7be507SJakub Kicinski }
51492d7be507SJakub Kicinski static inline void
ethtool_plca_get_status_req_set_header_dev_name(struct ethtool_plca_get_status_req * req,const char * dev_name)51502d7be507SJakub Kicinski ethtool_plca_get_status_req_set_header_dev_name(struct ethtool_plca_get_status_req *req,
51512d7be507SJakub Kicinski 						const char *dev_name)
51522d7be507SJakub Kicinski {
51532d7be507SJakub Kicinski 	free(req->header.dev_name);
51542d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
51552d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
51562d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
51572d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
51582d7be507SJakub Kicinski }
51592d7be507SJakub Kicinski static inline void
ethtool_plca_get_status_req_set_header_flags(struct ethtool_plca_get_status_req * req,__u32 flags)51602d7be507SJakub Kicinski ethtool_plca_get_status_req_set_header_flags(struct ethtool_plca_get_status_req *req,
51612d7be507SJakub Kicinski 					     __u32 flags)
51622d7be507SJakub Kicinski {
51632d7be507SJakub Kicinski 	req->_present.header = 1;
51642d7be507SJakub Kicinski 	req->header._present.flags = 1;
51652d7be507SJakub Kicinski 	req->header.flags = flags;
51662d7be507SJakub Kicinski }
51672d7be507SJakub Kicinski 
51682d7be507SJakub Kicinski struct ethtool_plca_get_status_rsp {
51692d7be507SJakub Kicinski 	struct {
51702d7be507SJakub Kicinski 		__u32 header:1;
51712d7be507SJakub Kicinski 		__u32 version:1;
51722d7be507SJakub Kicinski 		__u32 enabled:1;
51732d7be507SJakub Kicinski 		__u32 status:1;
51742d7be507SJakub Kicinski 		__u32 node_cnt:1;
51752d7be507SJakub Kicinski 		__u32 node_id:1;
51762d7be507SJakub Kicinski 		__u32 to_tmr:1;
51772d7be507SJakub Kicinski 		__u32 burst_cnt:1;
51782d7be507SJakub Kicinski 		__u32 burst_tmr:1;
51792d7be507SJakub Kicinski 	} _present;
51802d7be507SJakub Kicinski 
51812d7be507SJakub Kicinski 	struct ethtool_header header;
51822d7be507SJakub Kicinski 	__u16 version;
51832d7be507SJakub Kicinski 	__u8 enabled;
51842d7be507SJakub Kicinski 	__u8 status;
51852d7be507SJakub Kicinski 	__u32 node_cnt;
51862d7be507SJakub Kicinski 	__u32 node_id;
51872d7be507SJakub Kicinski 	__u32 to_tmr;
51882d7be507SJakub Kicinski 	__u32 burst_cnt;
51892d7be507SJakub Kicinski 	__u32 burst_tmr;
51902d7be507SJakub Kicinski };
51912d7be507SJakub Kicinski 
51922d7be507SJakub Kicinski void ethtool_plca_get_status_rsp_free(struct ethtool_plca_get_status_rsp *rsp);
51932d7be507SJakub Kicinski 
51942d7be507SJakub Kicinski /*
51952d7be507SJakub Kicinski  * Get PLCA status params.
51962d7be507SJakub Kicinski  */
51972d7be507SJakub Kicinski struct ethtool_plca_get_status_rsp *
51982d7be507SJakub Kicinski ethtool_plca_get_status(struct ynl_sock *ys,
51992d7be507SJakub Kicinski 			struct ethtool_plca_get_status_req *req);
52002d7be507SJakub Kicinski 
52012d7be507SJakub Kicinski /* ETHTOOL_MSG_PLCA_GET_STATUS - dump */
52022d7be507SJakub Kicinski struct ethtool_plca_get_status_req_dump {
52032d7be507SJakub Kicinski 	struct {
52042d7be507SJakub Kicinski 		__u32 header:1;
52052d7be507SJakub Kicinski 	} _present;
52062d7be507SJakub Kicinski 
52072d7be507SJakub Kicinski 	struct ethtool_header header;
52082d7be507SJakub Kicinski };
52092d7be507SJakub Kicinski 
52102d7be507SJakub Kicinski static inline struct ethtool_plca_get_status_req_dump *
ethtool_plca_get_status_req_dump_alloc(void)52112d7be507SJakub Kicinski ethtool_plca_get_status_req_dump_alloc(void)
52122d7be507SJakub Kicinski {
52132d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_plca_get_status_req_dump));
52142d7be507SJakub Kicinski }
52152d7be507SJakub Kicinski void
52162d7be507SJakub Kicinski ethtool_plca_get_status_req_dump_free(struct ethtool_plca_get_status_req_dump *req);
52172d7be507SJakub Kicinski 
52182d7be507SJakub Kicinski static inline void
ethtool_plca_get_status_req_dump_set_header_dev_index(struct ethtool_plca_get_status_req_dump * req,__u32 dev_index)52192d7be507SJakub Kicinski ethtool_plca_get_status_req_dump_set_header_dev_index(struct ethtool_plca_get_status_req_dump *req,
52202d7be507SJakub Kicinski 						      __u32 dev_index)
52212d7be507SJakub Kicinski {
52222d7be507SJakub Kicinski 	req->_present.header = 1;
52232d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
52242d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
52252d7be507SJakub Kicinski }
52262d7be507SJakub Kicinski static inline void
ethtool_plca_get_status_req_dump_set_header_dev_name(struct ethtool_plca_get_status_req_dump * req,const char * dev_name)52272d7be507SJakub Kicinski ethtool_plca_get_status_req_dump_set_header_dev_name(struct ethtool_plca_get_status_req_dump *req,
52282d7be507SJakub Kicinski 						     const char *dev_name)
52292d7be507SJakub Kicinski {
52302d7be507SJakub Kicinski 	free(req->header.dev_name);
52312d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
52322d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
52332d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
52342d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
52352d7be507SJakub Kicinski }
52362d7be507SJakub Kicinski static inline void
ethtool_plca_get_status_req_dump_set_header_flags(struct ethtool_plca_get_status_req_dump * req,__u32 flags)52372d7be507SJakub Kicinski ethtool_plca_get_status_req_dump_set_header_flags(struct ethtool_plca_get_status_req_dump *req,
52382d7be507SJakub Kicinski 						  __u32 flags)
52392d7be507SJakub Kicinski {
52402d7be507SJakub Kicinski 	req->_present.header = 1;
52412d7be507SJakub Kicinski 	req->header._present.flags = 1;
52422d7be507SJakub Kicinski 	req->header.flags = flags;
52432d7be507SJakub Kicinski }
52442d7be507SJakub Kicinski 
52452d7be507SJakub Kicinski struct ethtool_plca_get_status_list {
52462d7be507SJakub Kicinski 	struct ethtool_plca_get_status_list *next;
52472d7be507SJakub Kicinski 	struct ethtool_plca_get_status_rsp obj __attribute__ ((aligned (8)));
52482d7be507SJakub Kicinski };
52492d7be507SJakub Kicinski 
52502d7be507SJakub Kicinski void
52512d7be507SJakub Kicinski ethtool_plca_get_status_list_free(struct ethtool_plca_get_status_list *rsp);
52522d7be507SJakub Kicinski 
52532d7be507SJakub Kicinski struct ethtool_plca_get_status_list *
52542d7be507SJakub Kicinski ethtool_plca_get_status_dump(struct ynl_sock *ys,
52552d7be507SJakub Kicinski 			     struct ethtool_plca_get_status_req_dump *req);
52562d7be507SJakub Kicinski 
52572d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_MM_GET ============== */
52582d7be507SJakub Kicinski /* ETHTOOL_MSG_MM_GET - do */
52592d7be507SJakub Kicinski struct ethtool_mm_get_req {
52602d7be507SJakub Kicinski 	struct {
52612d7be507SJakub Kicinski 		__u32 header:1;
52622d7be507SJakub Kicinski 	} _present;
52632d7be507SJakub Kicinski 
52642d7be507SJakub Kicinski 	struct ethtool_header header;
52652d7be507SJakub Kicinski };
52662d7be507SJakub Kicinski 
ethtool_mm_get_req_alloc(void)52672d7be507SJakub Kicinski static inline struct ethtool_mm_get_req *ethtool_mm_get_req_alloc(void)
52682d7be507SJakub Kicinski {
52692d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_mm_get_req));
52702d7be507SJakub Kicinski }
52712d7be507SJakub Kicinski void ethtool_mm_get_req_free(struct ethtool_mm_get_req *req);
52722d7be507SJakub Kicinski 
52732d7be507SJakub Kicinski static inline void
ethtool_mm_get_req_set_header_dev_index(struct ethtool_mm_get_req * req,__u32 dev_index)52742d7be507SJakub Kicinski ethtool_mm_get_req_set_header_dev_index(struct ethtool_mm_get_req *req,
52752d7be507SJakub Kicinski 					__u32 dev_index)
52762d7be507SJakub Kicinski {
52772d7be507SJakub Kicinski 	req->_present.header = 1;
52782d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
52792d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
52802d7be507SJakub Kicinski }
52812d7be507SJakub Kicinski static inline void
ethtool_mm_get_req_set_header_dev_name(struct ethtool_mm_get_req * req,const char * dev_name)52822d7be507SJakub Kicinski ethtool_mm_get_req_set_header_dev_name(struct ethtool_mm_get_req *req,
52832d7be507SJakub Kicinski 				       const char *dev_name)
52842d7be507SJakub Kicinski {
52852d7be507SJakub Kicinski 	free(req->header.dev_name);
52862d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
52872d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
52882d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
52892d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
52902d7be507SJakub Kicinski }
52912d7be507SJakub Kicinski static inline void
ethtool_mm_get_req_set_header_flags(struct ethtool_mm_get_req * req,__u32 flags)52922d7be507SJakub Kicinski ethtool_mm_get_req_set_header_flags(struct ethtool_mm_get_req *req,
52932d7be507SJakub Kicinski 				    __u32 flags)
52942d7be507SJakub Kicinski {
52952d7be507SJakub Kicinski 	req->_present.header = 1;
52962d7be507SJakub Kicinski 	req->header._present.flags = 1;
52972d7be507SJakub Kicinski 	req->header.flags = flags;
52982d7be507SJakub Kicinski }
52992d7be507SJakub Kicinski 
53002d7be507SJakub Kicinski struct ethtool_mm_get_rsp {
53012d7be507SJakub Kicinski 	struct {
53022d7be507SJakub Kicinski 		__u32 header:1;
53032d7be507SJakub Kicinski 		__u32 pmac_enabled:1;
53042d7be507SJakub Kicinski 		__u32 tx_enabled:1;
53052d7be507SJakub Kicinski 		__u32 tx_active:1;
53062d7be507SJakub Kicinski 		__u32 tx_min_frag_size:1;
53072d7be507SJakub Kicinski 		__u32 rx_min_frag_size:1;
53082d7be507SJakub Kicinski 		__u32 verify_enabled:1;
53092d7be507SJakub Kicinski 		__u32 verify_time:1;
53102d7be507SJakub Kicinski 		__u32 max_verify_time:1;
53112d7be507SJakub Kicinski 		__u32 stats:1;
53122d7be507SJakub Kicinski 	} _present;
53132d7be507SJakub Kicinski 
53142d7be507SJakub Kicinski 	struct ethtool_header header;
53152d7be507SJakub Kicinski 	__u8 pmac_enabled;
53162d7be507SJakub Kicinski 	__u8 tx_enabled;
53172d7be507SJakub Kicinski 	__u8 tx_active;
53182d7be507SJakub Kicinski 	__u32 tx_min_frag_size;
53192d7be507SJakub Kicinski 	__u32 rx_min_frag_size;
53202d7be507SJakub Kicinski 	__u8 verify_enabled;
53212d7be507SJakub Kicinski 	__u32 verify_time;
53222d7be507SJakub Kicinski 	__u32 max_verify_time;
53232d7be507SJakub Kicinski 	struct ethtool_mm_stat stats;
53242d7be507SJakub Kicinski };
53252d7be507SJakub Kicinski 
53262d7be507SJakub Kicinski void ethtool_mm_get_rsp_free(struct ethtool_mm_get_rsp *rsp);
53272d7be507SJakub Kicinski 
53282d7be507SJakub Kicinski /*
53292d7be507SJakub Kicinski  * Get MAC Merge configuration and state
53302d7be507SJakub Kicinski  */
53312d7be507SJakub Kicinski struct ethtool_mm_get_rsp *
53322d7be507SJakub Kicinski ethtool_mm_get(struct ynl_sock *ys, struct ethtool_mm_get_req *req);
53332d7be507SJakub Kicinski 
53342d7be507SJakub Kicinski /* ETHTOOL_MSG_MM_GET - dump */
53352d7be507SJakub Kicinski struct ethtool_mm_get_req_dump {
53362d7be507SJakub Kicinski 	struct {
53372d7be507SJakub Kicinski 		__u32 header:1;
53382d7be507SJakub Kicinski 	} _present;
53392d7be507SJakub Kicinski 
53402d7be507SJakub Kicinski 	struct ethtool_header header;
53412d7be507SJakub Kicinski };
53422d7be507SJakub Kicinski 
53432d7be507SJakub Kicinski static inline struct ethtool_mm_get_req_dump *
ethtool_mm_get_req_dump_alloc(void)53442d7be507SJakub Kicinski ethtool_mm_get_req_dump_alloc(void)
53452d7be507SJakub Kicinski {
53462d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_mm_get_req_dump));
53472d7be507SJakub Kicinski }
53482d7be507SJakub Kicinski void ethtool_mm_get_req_dump_free(struct ethtool_mm_get_req_dump *req);
53492d7be507SJakub Kicinski 
53502d7be507SJakub Kicinski static inline void
ethtool_mm_get_req_dump_set_header_dev_index(struct ethtool_mm_get_req_dump * req,__u32 dev_index)53512d7be507SJakub Kicinski ethtool_mm_get_req_dump_set_header_dev_index(struct ethtool_mm_get_req_dump *req,
53522d7be507SJakub Kicinski 					     __u32 dev_index)
53532d7be507SJakub Kicinski {
53542d7be507SJakub Kicinski 	req->_present.header = 1;
53552d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
53562d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
53572d7be507SJakub Kicinski }
53582d7be507SJakub Kicinski static inline void
ethtool_mm_get_req_dump_set_header_dev_name(struct ethtool_mm_get_req_dump * req,const char * dev_name)53592d7be507SJakub Kicinski ethtool_mm_get_req_dump_set_header_dev_name(struct ethtool_mm_get_req_dump *req,
53602d7be507SJakub Kicinski 					    const char *dev_name)
53612d7be507SJakub Kicinski {
53622d7be507SJakub Kicinski 	free(req->header.dev_name);
53632d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
53642d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
53652d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
53662d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
53672d7be507SJakub Kicinski }
53682d7be507SJakub Kicinski static inline void
ethtool_mm_get_req_dump_set_header_flags(struct ethtool_mm_get_req_dump * req,__u32 flags)53692d7be507SJakub Kicinski ethtool_mm_get_req_dump_set_header_flags(struct ethtool_mm_get_req_dump *req,
53702d7be507SJakub Kicinski 					 __u32 flags)
53712d7be507SJakub Kicinski {
53722d7be507SJakub Kicinski 	req->_present.header = 1;
53732d7be507SJakub Kicinski 	req->header._present.flags = 1;
53742d7be507SJakub Kicinski 	req->header.flags = flags;
53752d7be507SJakub Kicinski }
53762d7be507SJakub Kicinski 
53772d7be507SJakub Kicinski struct ethtool_mm_get_list {
53782d7be507SJakub Kicinski 	struct ethtool_mm_get_list *next;
53792d7be507SJakub Kicinski 	struct ethtool_mm_get_rsp obj __attribute__ ((aligned (8)));
53802d7be507SJakub Kicinski };
53812d7be507SJakub Kicinski 
53822d7be507SJakub Kicinski void ethtool_mm_get_list_free(struct ethtool_mm_get_list *rsp);
53832d7be507SJakub Kicinski 
53842d7be507SJakub Kicinski struct ethtool_mm_get_list *
53852d7be507SJakub Kicinski ethtool_mm_get_dump(struct ynl_sock *ys, struct ethtool_mm_get_req_dump *req);
53862d7be507SJakub Kicinski 
53872d7be507SJakub Kicinski /* ETHTOOL_MSG_MM_GET - notify */
53882d7be507SJakub Kicinski struct ethtool_mm_get_ntf {
53892d7be507SJakub Kicinski 	__u16 family;
53902d7be507SJakub Kicinski 	__u8 cmd;
53912d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
53922d7be507SJakub Kicinski 	void (*free)(struct ethtool_mm_get_ntf *ntf);
53932d7be507SJakub Kicinski 	struct ethtool_mm_get_rsp obj __attribute__ ((aligned (8)));
53942d7be507SJakub Kicinski };
53952d7be507SJakub Kicinski 
53962d7be507SJakub Kicinski void ethtool_mm_get_ntf_free(struct ethtool_mm_get_ntf *rsp);
53972d7be507SJakub Kicinski 
53982d7be507SJakub Kicinski /* ============== ETHTOOL_MSG_MM_SET ============== */
53992d7be507SJakub Kicinski /* ETHTOOL_MSG_MM_SET - do */
54002d7be507SJakub Kicinski struct ethtool_mm_set_req {
54012d7be507SJakub Kicinski 	struct {
54022d7be507SJakub Kicinski 		__u32 header:1;
54032d7be507SJakub Kicinski 		__u32 verify_enabled:1;
54042d7be507SJakub Kicinski 		__u32 verify_time:1;
54052d7be507SJakub Kicinski 		__u32 tx_enabled:1;
54062d7be507SJakub Kicinski 		__u32 pmac_enabled:1;
54072d7be507SJakub Kicinski 		__u32 tx_min_frag_size:1;
54082d7be507SJakub Kicinski 	} _present;
54092d7be507SJakub Kicinski 
54102d7be507SJakub Kicinski 	struct ethtool_header header;
54112d7be507SJakub Kicinski 	__u8 verify_enabled;
54122d7be507SJakub Kicinski 	__u32 verify_time;
54132d7be507SJakub Kicinski 	__u8 tx_enabled;
54142d7be507SJakub Kicinski 	__u8 pmac_enabled;
54152d7be507SJakub Kicinski 	__u32 tx_min_frag_size;
54162d7be507SJakub Kicinski };
54172d7be507SJakub Kicinski 
ethtool_mm_set_req_alloc(void)54182d7be507SJakub Kicinski static inline struct ethtool_mm_set_req *ethtool_mm_set_req_alloc(void)
54192d7be507SJakub Kicinski {
54202d7be507SJakub Kicinski 	return calloc(1, sizeof(struct ethtool_mm_set_req));
54212d7be507SJakub Kicinski }
54222d7be507SJakub Kicinski void ethtool_mm_set_req_free(struct ethtool_mm_set_req *req);
54232d7be507SJakub Kicinski 
54242d7be507SJakub Kicinski static inline void
ethtool_mm_set_req_set_header_dev_index(struct ethtool_mm_set_req * req,__u32 dev_index)54252d7be507SJakub Kicinski ethtool_mm_set_req_set_header_dev_index(struct ethtool_mm_set_req *req,
54262d7be507SJakub Kicinski 					__u32 dev_index)
54272d7be507SJakub Kicinski {
54282d7be507SJakub Kicinski 	req->_present.header = 1;
54292d7be507SJakub Kicinski 	req->header._present.dev_index = 1;
54302d7be507SJakub Kicinski 	req->header.dev_index = dev_index;
54312d7be507SJakub Kicinski }
54322d7be507SJakub Kicinski static inline void
ethtool_mm_set_req_set_header_dev_name(struct ethtool_mm_set_req * req,const char * dev_name)54332d7be507SJakub Kicinski ethtool_mm_set_req_set_header_dev_name(struct ethtool_mm_set_req *req,
54342d7be507SJakub Kicinski 				       const char *dev_name)
54352d7be507SJakub Kicinski {
54362d7be507SJakub Kicinski 	free(req->header.dev_name);
54372d7be507SJakub Kicinski 	req->header._present.dev_name_len = strlen(dev_name);
54382d7be507SJakub Kicinski 	req->header.dev_name = malloc(req->header._present.dev_name_len + 1);
54392d7be507SJakub Kicinski 	memcpy(req->header.dev_name, dev_name, req->header._present.dev_name_len);
54402d7be507SJakub Kicinski 	req->header.dev_name[req->header._present.dev_name_len] = 0;
54412d7be507SJakub Kicinski }
54422d7be507SJakub Kicinski static inline void
ethtool_mm_set_req_set_header_flags(struct ethtool_mm_set_req * req,__u32 flags)54432d7be507SJakub Kicinski ethtool_mm_set_req_set_header_flags(struct ethtool_mm_set_req *req,
54442d7be507SJakub Kicinski 				    __u32 flags)
54452d7be507SJakub Kicinski {
54462d7be507SJakub Kicinski 	req->_present.header = 1;
54472d7be507SJakub Kicinski 	req->header._present.flags = 1;
54482d7be507SJakub Kicinski 	req->header.flags = flags;
54492d7be507SJakub Kicinski }
54502d7be507SJakub Kicinski static inline void
ethtool_mm_set_req_set_verify_enabled(struct ethtool_mm_set_req * req,__u8 verify_enabled)54512d7be507SJakub Kicinski ethtool_mm_set_req_set_verify_enabled(struct ethtool_mm_set_req *req,
54522d7be507SJakub Kicinski 				      __u8 verify_enabled)
54532d7be507SJakub Kicinski {
54542d7be507SJakub Kicinski 	req->_present.verify_enabled = 1;
54552d7be507SJakub Kicinski 	req->verify_enabled = verify_enabled;
54562d7be507SJakub Kicinski }
54572d7be507SJakub Kicinski static inline void
ethtool_mm_set_req_set_verify_time(struct ethtool_mm_set_req * req,__u32 verify_time)54582d7be507SJakub Kicinski ethtool_mm_set_req_set_verify_time(struct ethtool_mm_set_req *req,
54592d7be507SJakub Kicinski 				   __u32 verify_time)
54602d7be507SJakub Kicinski {
54612d7be507SJakub Kicinski 	req->_present.verify_time = 1;
54622d7be507SJakub Kicinski 	req->verify_time = verify_time;
54632d7be507SJakub Kicinski }
54642d7be507SJakub Kicinski static inline void
ethtool_mm_set_req_set_tx_enabled(struct ethtool_mm_set_req * req,__u8 tx_enabled)54652d7be507SJakub Kicinski ethtool_mm_set_req_set_tx_enabled(struct ethtool_mm_set_req *req,
54662d7be507SJakub Kicinski 				  __u8 tx_enabled)
54672d7be507SJakub Kicinski {
54682d7be507SJakub Kicinski 	req->_present.tx_enabled = 1;
54692d7be507SJakub Kicinski 	req->tx_enabled = tx_enabled;
54702d7be507SJakub Kicinski }
54712d7be507SJakub Kicinski static inline void
ethtool_mm_set_req_set_pmac_enabled(struct ethtool_mm_set_req * req,__u8 pmac_enabled)54722d7be507SJakub Kicinski ethtool_mm_set_req_set_pmac_enabled(struct ethtool_mm_set_req *req,
54732d7be507SJakub Kicinski 				    __u8 pmac_enabled)
54742d7be507SJakub Kicinski {
54752d7be507SJakub Kicinski 	req->_present.pmac_enabled = 1;
54762d7be507SJakub Kicinski 	req->pmac_enabled = pmac_enabled;
54772d7be507SJakub Kicinski }
54782d7be507SJakub Kicinski static inline void
ethtool_mm_set_req_set_tx_min_frag_size(struct ethtool_mm_set_req * req,__u32 tx_min_frag_size)54792d7be507SJakub Kicinski ethtool_mm_set_req_set_tx_min_frag_size(struct ethtool_mm_set_req *req,
54802d7be507SJakub Kicinski 					__u32 tx_min_frag_size)
54812d7be507SJakub Kicinski {
54822d7be507SJakub Kicinski 	req->_present.tx_min_frag_size = 1;
54832d7be507SJakub Kicinski 	req->tx_min_frag_size = tx_min_frag_size;
54842d7be507SJakub Kicinski }
54852d7be507SJakub Kicinski 
54862d7be507SJakub Kicinski /*
54872d7be507SJakub Kicinski  * Set MAC Merge configuration
54882d7be507SJakub Kicinski  */
54892d7be507SJakub Kicinski int ethtool_mm_set(struct ynl_sock *ys, struct ethtool_mm_set_req *req);
54902d7be507SJakub Kicinski 
54912d7be507SJakub Kicinski /* ETHTOOL_MSG_CABLE_TEST_NTF - event */
54922d7be507SJakub Kicinski struct ethtool_cable_test_ntf_rsp {
54932d7be507SJakub Kicinski 	struct {
54942d7be507SJakub Kicinski 		__u32 header:1;
54952d7be507SJakub Kicinski 		__u32 status:1;
54962d7be507SJakub Kicinski 	} _present;
54972d7be507SJakub Kicinski 
54982d7be507SJakub Kicinski 	struct ethtool_header header;
54992d7be507SJakub Kicinski 	__u8 status;
55002d7be507SJakub Kicinski };
55012d7be507SJakub Kicinski 
55022d7be507SJakub Kicinski struct ethtool_cable_test_ntf {
55032d7be507SJakub Kicinski 	__u16 family;
55042d7be507SJakub Kicinski 	__u8 cmd;
55052d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
55062d7be507SJakub Kicinski 	void (*free)(struct ethtool_cable_test_ntf *ntf);
55072d7be507SJakub Kicinski 	struct ethtool_cable_test_ntf_rsp obj __attribute__ ((aligned (8)));
55082d7be507SJakub Kicinski };
55092d7be507SJakub Kicinski 
55102d7be507SJakub Kicinski void ethtool_cable_test_ntf_free(struct ethtool_cable_test_ntf *rsp);
55112d7be507SJakub Kicinski 
55122d7be507SJakub Kicinski /* ETHTOOL_MSG_CABLE_TEST_TDR_NTF - event */
55132d7be507SJakub Kicinski struct ethtool_cable_test_tdr_ntf_rsp {
55142d7be507SJakub Kicinski 	struct {
55152d7be507SJakub Kicinski 		__u32 header:1;
55162d7be507SJakub Kicinski 		__u32 status:1;
55172d7be507SJakub Kicinski 		__u32 nest:1;
55182d7be507SJakub Kicinski 	} _present;
55192d7be507SJakub Kicinski 
55202d7be507SJakub Kicinski 	struct ethtool_header header;
55212d7be507SJakub Kicinski 	__u8 status;
55222d7be507SJakub Kicinski 	struct ethtool_cable_nest nest;
55232d7be507SJakub Kicinski };
55242d7be507SJakub Kicinski 
55252d7be507SJakub Kicinski struct ethtool_cable_test_tdr_ntf {
55262d7be507SJakub Kicinski 	__u16 family;
55272d7be507SJakub Kicinski 	__u8 cmd;
55282d7be507SJakub Kicinski 	struct ynl_ntf_base_type *next;
55292d7be507SJakub Kicinski 	void (*free)(struct ethtool_cable_test_tdr_ntf *ntf);
55302d7be507SJakub Kicinski 	struct ethtool_cable_test_tdr_ntf_rsp obj __attribute__ ((aligned (8)));
55312d7be507SJakub Kicinski };
55322d7be507SJakub Kicinski 
55332d7be507SJakub Kicinski void ethtool_cable_test_tdr_ntf_free(struct ethtool_cable_test_tdr_ntf *rsp);
55342d7be507SJakub Kicinski 
55352d7be507SJakub Kicinski #endif /* _LINUX_ETHTOOL_GEN_H */
5536