/* SPDX-License-Identifier: GPL-2.0 */ /* * Shared generic netlink helpers for the acct selftests. */ #ifndef ACSELFTESTS_ACCT_NETLINK_HELPER_H #define ACSELFTESTS_ACCT_NETLINK_HELPER_H #include #include #ifndef NLA_ALIGNTO #define NLA_ALIGNTO 4 #define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) #define NLA_HDRLEN ((int)NLA_ALIGN(sizeof(struct nlattr))) #endif /* Fail an individual test case instead of hanging the whole binary. */ #define ACCT_RCV_TIMEOUT_SEC 2 static inline void *nla_data(const struct nlattr *na) { return (void *)((char *)na + NLA_HDRLEN); } static inline bool nla_ok(const struct nlattr *na, int remaining) { return remaining >= (int)sizeof(*na) && na->nla_len >= sizeof(*na) && na->nla_len <= remaining; } static inline struct nlattr *nla_next(const struct nlattr *na, int *remaining) { int aligned_len = NLA_ALIGN(na->nla_len); *remaining -= aligned_len; return (struct nlattr *)((char *)na + aligned_len); } int netlink_open(void); int send_request(int fd, void *buf, size_t len); int get_family_id(int fd, const char *name); #endif /* ACSELFTESTS_ACCT_NETLINK_HELPER_H */