linux/tools/lib/bpf/nlattr.h
<<
>>
Prefs
   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