1*0a2418c3SYiyang Chen /* SPDX-License-Identifier: GPL-2.0 */ 2*0a2418c3SYiyang Chen /* 3*0a2418c3SYiyang Chen * Shared generic netlink helpers for the acct selftests. 4*0a2418c3SYiyang Chen */ 5*0a2418c3SYiyang Chen #ifndef ACSELFTESTS_ACCT_NETLINK_HELPER_H 6*0a2418c3SYiyang Chen #define ACSELFTESTS_ACCT_NETLINK_HELPER_H 7*0a2418c3SYiyang Chen 8*0a2418c3SYiyang Chen #include <stdbool.h> 9*0a2418c3SYiyang Chen #include <linux/netlink.h> 10*0a2418c3SYiyang Chen 11*0a2418c3SYiyang Chen #ifndef NLA_ALIGNTO 12*0a2418c3SYiyang Chen #define NLA_ALIGNTO 4 13*0a2418c3SYiyang Chen #define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) 14*0a2418c3SYiyang Chen #define NLA_HDRLEN ((int)NLA_ALIGN(sizeof(struct nlattr))) 15*0a2418c3SYiyang Chen #endif 16*0a2418c3SYiyang Chen 17*0a2418c3SYiyang Chen /* Fail an individual test case instead of hanging the whole binary. */ 18*0a2418c3SYiyang Chen #define ACCT_RCV_TIMEOUT_SEC 2 19*0a2418c3SYiyang Chen 20*0a2418c3SYiyang Chen static inline void *nla_data(const struct nlattr *na) 21*0a2418c3SYiyang Chen { 22*0a2418c3SYiyang Chen return (void *)((char *)na + NLA_HDRLEN); 23*0a2418c3SYiyang Chen } 24*0a2418c3SYiyang Chen 25*0a2418c3SYiyang Chen static inline bool nla_ok(const struct nlattr *na, int remaining) 26*0a2418c3SYiyang Chen { 27*0a2418c3SYiyang Chen return remaining >= (int)sizeof(*na) && 28*0a2418c3SYiyang Chen na->nla_len >= sizeof(*na) && 29*0a2418c3SYiyang Chen na->nla_len <= remaining; 30*0a2418c3SYiyang Chen } 31*0a2418c3SYiyang Chen 32*0a2418c3SYiyang Chen static inline struct nlattr *nla_next(const struct nlattr *na, int *remaining) 33*0a2418c3SYiyang Chen { 34*0a2418c3SYiyang Chen int aligned_len = NLA_ALIGN(na->nla_len); 35*0a2418c3SYiyang Chen 36*0a2418c3SYiyang Chen *remaining -= aligned_len; 37*0a2418c3SYiyang Chen return (struct nlattr *)((char *)na + aligned_len); 38*0a2418c3SYiyang Chen } 39*0a2418c3SYiyang Chen 40*0a2418c3SYiyang Chen int netlink_open(void); 41*0a2418c3SYiyang Chen int send_request(int fd, void *buf, size_t len); 42*0a2418c3SYiyang Chen int get_family_id(int fd, const char *name); 43*0a2418c3SYiyang Chen 44*0a2418c3SYiyang Chen #endif /* ACSELFTESTS_ACCT_NETLINK_HELPER_H */ 45