1/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ 2 3/* 4 * NETLINK Netlink attributes 5 * 6 * Copyright (c) 2003-2013 Thomas Graf <tgraf@suug.ch> 7 */ 8 9#ifndef __LIBBPF_NLATTR_H 10#define __LIBBPF_NLATTR_H 11 12#include <stdint.h> 13#include <linux/netlink.h> 14/* avoid multiple definition of netlink features */ 15#define __LINUX_NETLINK_H 16 17/** 18 * Standard attribute types to specify validation policy 19 */ 20enum { 21 LIBBPF_NLA_UNSPEC, /**< Unspecified type, binary data chunk */ 22 LIBBPF_NLA_U8, /**< 8 bit integer */ 23 LIBBPF_NLA_U16, /**< 16 bit integer */ 24 LIBBPF_NLA_U32, /**< 32 bit integer */ 25 LIBBPF_NLA_U64, /**< 64 bit integer */ 26 LIBBPF_NLA_STRING, /**< NUL terminated character string */ 27 LIBBPF_NLA_FLAG, /**< Flag */ 28 LIBBPF_NLA_MSECS, /**< Micro seconds (64bit) */ 29 LIBBPF_NLA_NESTED, /**< Nested attributes */ 30 __LIBBPF_NLA_TYPE_MAX, 31}; 32 33#define LIBBPF_NLA_TYPE_MAX (__LIBBPF_NLA_TYPE_MAX - 1) 34 35/** 36 * @ingroup attr 37 * Attribute validation policy. 38 * 39 * See section @core_doc{core_attr_parse,Attribute Parsing} for more details. 40 */ 41struct libbpf_nla_policy { 42 /** Type of attribute or LIBBPF_NLA_UNSPEC */ 43 uint16_t type; 44 45 /** Minimal length of payload required */ 46 uint16_t minlen; 47 48 /** Maximal length of payload allowed */ 49 uint16_t maxlen; 50}; 51 52/** 53 * @ingroup attr 54 * Iterate over a stream of attributes 55 * @arg pos loop counter, set to current attribute 56 * @arg head head of attribute stream 57 * @arg len length of attribute stream 58 * @arg rem initialized to len, holds bytes currently remaining in stream 59 */ 60#define libbpf_nla_for_each_attr(pos, head, len, rem) \ 61 for (pos = head, rem = len; \ 62 nla_ok(pos, rem); \ 63 pos = nla_next(pos, &(rem))) 64 65/** 66 * libbpf_nla_data - head of payload 67 * @nla: netlink attribute 68 */ 69static inline void *libbpf_nla_data(const struct nlattr *nla) 70{ 71 return (char *) nla + NLA_HDRLEN; 72} 73 74static inline uint8_t libbpf_nla_getattr_u8(const struct nlattr *nla) 75{ 76 return *(uint8_t *)libbpf_nla_data(nla); 77} 78 79static inline uint32_t libbpf_nla_getattr_u32(const struct nlattr *nla) 80{ 81 return *(uint32_t *)libbpf_nla_data(nla); 82} 83 84static inline const char *libbpf_nla_getattr_str(const struct nlattr *nla) 85{ 86 return (const char *)libbpf_nla_data(nla); 87} 88 89/** 90 * libbpf_nla_len - length of payload 91 * @nla: netlink attribute 92 */ 93static inline int libbpf_nla_len(const struct nlattr *nla) 94{ 95 return nla->nla_len - NLA_HDRLEN; 96} 97 98int libbpf_nla_parse(struct nlattr *tb[], int maxtype, struct nlattr *head, 99 int len, struct libbpf_nla_policy *policy); 100int libbpf_nla_parse_nested(struct nlattr *tb[], int maxtype, 101 struct nlattr *nla, 102 struct libbpf_nla_policy *policy); 103 104int libbpf_nla_dump_errormsg(struct nlmsghdr *nlh); 105 106#endif /* __LIBBPF_NLATTR_H */ 107