1*4dc78e53SAndroid Build Coastguard Worker /* SPDX-License-Identifier: LGPL-2.1-only */ 2*4dc78e53SAndroid Build Coastguard Worker /* 3*4dc78e53SAndroid Build Coastguard Worker * Copyright (c) 2003-2013 Thomas Graf <[email protected]> 4*4dc78e53SAndroid Build Coastguard Worker */ 5*4dc78e53SAndroid Build Coastguard Worker 6*4dc78e53SAndroid Build Coastguard Worker #ifndef NETLINK_ATTR_H_ 7*4dc78e53SAndroid Build Coastguard Worker #define NETLINK_ATTR_H_ 8*4dc78e53SAndroid Build Coastguard Worker 9*4dc78e53SAndroid Build Coastguard Worker #include <netlink/netlink.h> 10*4dc78e53SAndroid Build Coastguard Worker #include <netlink/object.h> 11*4dc78e53SAndroid Build Coastguard Worker #include <netlink/addr.h> 12*4dc78e53SAndroid Build Coastguard Worker #include <netlink/data.h> 13*4dc78e53SAndroid Build Coastguard Worker 14*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus 15*4dc78e53SAndroid Build Coastguard Worker extern "C" { 16*4dc78e53SAndroid Build Coastguard Worker #endif 17*4dc78e53SAndroid Build Coastguard Worker 18*4dc78e53SAndroid Build Coastguard Worker struct nlattr; 19*4dc78e53SAndroid Build Coastguard Worker 20*4dc78e53SAndroid Build Coastguard Worker struct nl_msg; 21*4dc78e53SAndroid Build Coastguard Worker 22*4dc78e53SAndroid Build Coastguard Worker /** 23*4dc78e53SAndroid Build Coastguard Worker * @name Basic Attribute Data Types 24*4dc78e53SAndroid Build Coastguard Worker * @{ 25*4dc78e53SAndroid Build Coastguard Worker */ 26*4dc78e53SAndroid Build Coastguard Worker 27*4dc78e53SAndroid Build Coastguard Worker /** 28*4dc78e53SAndroid Build Coastguard Worker * @ingroup attr 29*4dc78e53SAndroid Build Coastguard Worker * Basic attribute data types 30*4dc78e53SAndroid Build Coastguard Worker * 31*4dc78e53SAndroid Build Coastguard Worker * See section @core_doc{core_attr_parse,Attribute Parsing} for more details. 32*4dc78e53SAndroid Build Coastguard Worker */ 33*4dc78e53SAndroid Build Coastguard Worker enum { 34*4dc78e53SAndroid Build Coastguard Worker NLA_UNSPEC, /**< Unspecified type, binary data chunk */ 35*4dc78e53SAndroid Build Coastguard Worker NLA_U8, /**< 8 bit integer */ 36*4dc78e53SAndroid Build Coastguard Worker NLA_U16, /**< 16 bit integer */ 37*4dc78e53SAndroid Build Coastguard Worker NLA_U32, /**< 32 bit integer */ 38*4dc78e53SAndroid Build Coastguard Worker NLA_U64, /**< 64 bit integer */ 39*4dc78e53SAndroid Build Coastguard Worker NLA_STRING, /**< NUL terminated character string */ 40*4dc78e53SAndroid Build Coastguard Worker NLA_FLAG, /**< Flag */ 41*4dc78e53SAndroid Build Coastguard Worker NLA_MSECS, /**< Micro seconds (64bit) */ 42*4dc78e53SAndroid Build Coastguard Worker NLA_NESTED, /**< Nested attributes */ 43*4dc78e53SAndroid Build Coastguard Worker NLA_NESTED_COMPAT, 44*4dc78e53SAndroid Build Coastguard Worker NLA_NUL_STRING, 45*4dc78e53SAndroid Build Coastguard Worker NLA_BINARY, 46*4dc78e53SAndroid Build Coastguard Worker NLA_S8, 47*4dc78e53SAndroid Build Coastguard Worker NLA_S16, 48*4dc78e53SAndroid Build Coastguard Worker NLA_S32, 49*4dc78e53SAndroid Build Coastguard Worker NLA_S64, 50*4dc78e53SAndroid Build Coastguard Worker __NLA_TYPE_MAX, 51*4dc78e53SAndroid Build Coastguard Worker }; 52*4dc78e53SAndroid Build Coastguard Worker 53*4dc78e53SAndroid Build Coastguard Worker #define NLA_TYPE_MAX (__NLA_TYPE_MAX - 1) 54*4dc78e53SAndroid Build Coastguard Worker 55*4dc78e53SAndroid Build Coastguard Worker /** @} */ 56*4dc78e53SAndroid Build Coastguard Worker 57*4dc78e53SAndroid Build Coastguard Worker /** 58*4dc78e53SAndroid Build Coastguard Worker * @ingroup attr 59*4dc78e53SAndroid Build Coastguard Worker * Attribute validation policy. 60*4dc78e53SAndroid Build Coastguard Worker * 61*4dc78e53SAndroid Build Coastguard Worker * See section @core_doc{core_attr_parse,Attribute Parsing} for more details. 62*4dc78e53SAndroid Build Coastguard Worker */ 63*4dc78e53SAndroid Build Coastguard Worker struct nla_policy { 64*4dc78e53SAndroid Build Coastguard Worker /** Type of attribute or NLA_UNSPEC */ 65*4dc78e53SAndroid Build Coastguard Worker uint16_t type; 66*4dc78e53SAndroid Build Coastguard Worker 67*4dc78e53SAndroid Build Coastguard Worker /** Minimal length of payload required */ 68*4dc78e53SAndroid Build Coastguard Worker uint16_t minlen; 69*4dc78e53SAndroid Build Coastguard Worker 70*4dc78e53SAndroid Build Coastguard Worker /** Maximal length of payload allowed */ 71*4dc78e53SAndroid Build Coastguard Worker uint16_t maxlen; 72*4dc78e53SAndroid Build Coastguard Worker }; 73*4dc78e53SAndroid Build Coastguard Worker 74*4dc78e53SAndroid Build Coastguard Worker /* Size calculations */ 75*4dc78e53SAndroid Build Coastguard Worker extern int nla_attr_size(int payload); 76*4dc78e53SAndroid Build Coastguard Worker extern int nla_total_size(int payload); 77*4dc78e53SAndroid Build Coastguard Worker extern int nla_padlen(int payload); 78*4dc78e53SAndroid Build Coastguard Worker 79*4dc78e53SAndroid Build Coastguard Worker /* Attribute parsing */ 80*4dc78e53SAndroid Build Coastguard Worker extern int nla_type(const struct nlattr *); 81*4dc78e53SAndroid Build Coastguard Worker extern void * nla_data(const struct nlattr *); 82*4dc78e53SAndroid Build Coastguard Worker extern int nla_len(const struct nlattr *); 83*4dc78e53SAndroid Build Coastguard Worker extern int nla_ok(const struct nlattr *, int); 84*4dc78e53SAndroid Build Coastguard Worker extern struct nlattr * nla_next(const struct nlattr *, int *); 85*4dc78e53SAndroid Build Coastguard Worker extern int nla_parse(struct nlattr **, int, struct nlattr *, 86*4dc78e53SAndroid Build Coastguard Worker int, const struct nla_policy *); 87*4dc78e53SAndroid Build Coastguard Worker extern int nla_validate(const struct nlattr *, int, int, 88*4dc78e53SAndroid Build Coastguard Worker const struct nla_policy *); 89*4dc78e53SAndroid Build Coastguard Worker extern struct nlattr * nla_find(const struct nlattr *, int, int); 90*4dc78e53SAndroid Build Coastguard Worker 91*4dc78e53SAndroid Build Coastguard Worker /* Helper Functions */ 92*4dc78e53SAndroid Build Coastguard Worker extern int nla_memcpy(void *, const struct nlattr *, int); 93*4dc78e53SAndroid Build Coastguard Worker extern size_t nla_strlcpy(char *, const struct nlattr *, size_t); 94*4dc78e53SAndroid Build Coastguard Worker extern int nla_memcmp(const struct nlattr *, const void *, size_t); 95*4dc78e53SAndroid Build Coastguard Worker extern int nla_strcmp(const struct nlattr *, const char *); 96*4dc78e53SAndroid Build Coastguard Worker 97*4dc78e53SAndroid Build Coastguard Worker /* Unspecific attribute */ 98*4dc78e53SAndroid Build Coastguard Worker extern struct nlattr * nla_reserve(struct nl_msg *, int, int); 99*4dc78e53SAndroid Build Coastguard Worker extern int nla_put(struct nl_msg *, int, int, const void *); 100*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_data(struct nl_msg *, int, 101*4dc78e53SAndroid Build Coastguard Worker const struct nl_data *); 102*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_addr(struct nl_msg *, int, struct nl_addr *); 103*4dc78e53SAndroid Build Coastguard Worker 104*4dc78e53SAndroid Build Coastguard Worker /* Integer attribute */ 105*4dc78e53SAndroid Build Coastguard Worker extern int8_t nla_get_s8(const struct nlattr *); 106*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_s8(struct nl_msg *, int, int8_t); 107*4dc78e53SAndroid Build Coastguard Worker extern uint8_t nla_get_u8(const struct nlattr *); 108*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_u8(struct nl_msg *, int, uint8_t); 109*4dc78e53SAndroid Build Coastguard Worker extern int16_t nla_get_s16(const struct nlattr *); 110*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_s16(struct nl_msg *, int, int16_t); 111*4dc78e53SAndroid Build Coastguard Worker extern uint16_t nla_get_u16(const struct nlattr *); 112*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_u16(struct nl_msg *, int, uint16_t); 113*4dc78e53SAndroid Build Coastguard Worker extern int32_t nla_get_s32(const struct nlattr *); 114*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_s32(struct nl_msg *, int, int32_t); 115*4dc78e53SAndroid Build Coastguard Worker extern uint32_t nla_get_u32(const struct nlattr *); 116*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_u32(struct nl_msg *, int, uint32_t); 117*4dc78e53SAndroid Build Coastguard Worker extern int64_t nla_get_s64(const struct nlattr *); 118*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_s64(struct nl_msg *, int, int64_t); 119*4dc78e53SAndroid Build Coastguard Worker extern uint64_t nla_get_u64(const struct nlattr *); 120*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_u64(struct nl_msg *, int, uint64_t); 121*4dc78e53SAndroid Build Coastguard Worker 122*4dc78e53SAndroid Build Coastguard Worker /* String attribute */ 123*4dc78e53SAndroid Build Coastguard Worker extern char * nla_get_string(const struct nlattr *); 124*4dc78e53SAndroid Build Coastguard Worker extern char * nla_strdup(const struct nlattr *); 125*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_string(struct nl_msg *, int, const char *); 126*4dc78e53SAndroid Build Coastguard Worker 127*4dc78e53SAndroid Build Coastguard Worker /* Flag attribute */ 128*4dc78e53SAndroid Build Coastguard Worker extern int nla_get_flag(const struct nlattr *); 129*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_flag(struct nl_msg *, int); 130*4dc78e53SAndroid Build Coastguard Worker 131*4dc78e53SAndroid Build Coastguard Worker /* Msec attribute */ 132*4dc78e53SAndroid Build Coastguard Worker extern unsigned long nla_get_msecs(const struct nlattr *); 133*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_msecs(struct nl_msg *, int, unsigned long); 134*4dc78e53SAndroid Build Coastguard Worker 135*4dc78e53SAndroid Build Coastguard Worker /* Attribute nesting */ 136*4dc78e53SAndroid Build Coastguard Worker extern int nla_put_nested(struct nl_msg *, int, 137*4dc78e53SAndroid Build Coastguard Worker const struct nl_msg *); 138*4dc78e53SAndroid Build Coastguard Worker extern struct nlattr * nla_nest_start(struct nl_msg *, int); 139*4dc78e53SAndroid Build Coastguard Worker extern int nla_nest_end(struct nl_msg *, struct nlattr *); 140*4dc78e53SAndroid Build Coastguard Worker extern int nla_nest_end_keep_empty(struct nl_msg *, struct nlattr *); 141*4dc78e53SAndroid Build Coastguard Worker extern void nla_nest_cancel(struct nl_msg *, const struct nlattr *); 142*4dc78e53SAndroid Build Coastguard Worker extern int nla_parse_nested(struct nlattr **, int, struct nlattr *, 143*4dc78e53SAndroid Build Coastguard Worker const struct nla_policy *); 144*4dc78e53SAndroid Build Coastguard Worker extern int nla_is_nested(const struct nlattr *); 145*4dc78e53SAndroid Build Coastguard Worker 146*4dc78e53SAndroid Build Coastguard Worker /** 147*4dc78e53SAndroid Build Coastguard Worker * @name Attribute Construction (Exception Based) 148*4dc78e53SAndroid Build Coastguard Worker * @{ 149*4dc78e53SAndroid Build Coastguard Worker */ 150*4dc78e53SAndroid Build Coastguard Worker 151*4dc78e53SAndroid Build Coastguard Worker /** 152*4dc78e53SAndroid Build Coastguard Worker * @ingroup attr 153*4dc78e53SAndroid Build Coastguard Worker * Add unspecific attribute to netlink message. 154*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 155*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 156*4dc78e53SAndroid Build Coastguard Worker * @arg attrlen Length of attribute payload. 157*4dc78e53SAndroid Build Coastguard Worker * @arg data Head of attribute payload. 158*4dc78e53SAndroid Build Coastguard Worker */ 159*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT(msg, attrtype, attrlen, data) \ 160*4dc78e53SAndroid Build Coastguard Worker do { \ 161*4dc78e53SAndroid Build Coastguard Worker if (nla_put(msg, attrtype, attrlen, data) < 0) \ 162*4dc78e53SAndroid Build Coastguard Worker goto nla_put_failure; \ 163*4dc78e53SAndroid Build Coastguard Worker } while(0) 164*4dc78e53SAndroid Build Coastguard Worker 165*4dc78e53SAndroid Build Coastguard Worker /** 166*4dc78e53SAndroid Build Coastguard Worker * @ingroup attr 167*4dc78e53SAndroid Build Coastguard Worker * Add atomic type attribute to netlink message. 168*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 169*4dc78e53SAndroid Build Coastguard Worker * @arg type Atomic type. 170*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 171*4dc78e53SAndroid Build Coastguard Worker * @arg value Head of attribute payload. 172*4dc78e53SAndroid Build Coastguard Worker */ 173*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_TYPE(msg, type, attrtype, value) \ 174*4dc78e53SAndroid Build Coastguard Worker do { \ 175*4dc78e53SAndroid Build Coastguard Worker type __tmp = value; \ 176*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, attrtype, sizeof(type), &__tmp); \ 177*4dc78e53SAndroid Build Coastguard Worker } while(0) 178*4dc78e53SAndroid Build Coastguard Worker 179*4dc78e53SAndroid Build Coastguard Worker /** 180*4dc78e53SAndroid Build Coastguard Worker * Add 8 bit signed integer attribute to netlink message. 181*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 182*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 183*4dc78e53SAndroid Build Coastguard Worker * @arg value Numeric value. 184*4dc78e53SAndroid Build Coastguard Worker */ 185*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_S8(msg, attrtype, value) \ 186*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_TYPE(msg, int8_t, attrtype, value) 187*4dc78e53SAndroid Build Coastguard Worker 188*4dc78e53SAndroid Build Coastguard Worker /** 189*4dc78e53SAndroid Build Coastguard Worker * Add 8 bit integer attribute to netlink message. 190*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 191*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 192*4dc78e53SAndroid Build Coastguard Worker * @arg value Numeric value. 193*4dc78e53SAndroid Build Coastguard Worker */ 194*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_U8(msg, attrtype, value) \ 195*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_TYPE(msg, uint8_t, attrtype, value) 196*4dc78e53SAndroid Build Coastguard Worker 197*4dc78e53SAndroid Build Coastguard Worker /** 198*4dc78e53SAndroid Build Coastguard Worker * Add 16 bit signed integer attribute to netlink message. 199*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 200*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 201*4dc78e53SAndroid Build Coastguard Worker * @arg value Numeric value. 202*4dc78e53SAndroid Build Coastguard Worker */ 203*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_S16(msg, attrtype, value) \ 204*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_TYPE(msg, int16_t, attrtype, value) 205*4dc78e53SAndroid Build Coastguard Worker 206*4dc78e53SAndroid Build Coastguard Worker /** 207*4dc78e53SAndroid Build Coastguard Worker * Add 16 bit integer attribute to netlink message. 208*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 209*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 210*4dc78e53SAndroid Build Coastguard Worker * @arg value Numeric value. 211*4dc78e53SAndroid Build Coastguard Worker */ 212*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_U16(msg, attrtype, value) \ 213*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_TYPE(msg, uint16_t, attrtype, value) 214*4dc78e53SAndroid Build Coastguard Worker 215*4dc78e53SAndroid Build Coastguard Worker /** 216*4dc78e53SAndroid Build Coastguard Worker * Add 32 bit signed integer attribute to netlink message. 217*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 218*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 219*4dc78e53SAndroid Build Coastguard Worker * @arg value Numeric value. 220*4dc78e53SAndroid Build Coastguard Worker */ 221*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_S32(msg, attrtype, value) \ 222*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_TYPE(msg, int32_t, attrtype, value) 223*4dc78e53SAndroid Build Coastguard Worker 224*4dc78e53SAndroid Build Coastguard Worker /** 225*4dc78e53SAndroid Build Coastguard Worker * Add 32 bit integer attribute to netlink message. 226*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 227*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 228*4dc78e53SAndroid Build Coastguard Worker * @arg value Numeric value. 229*4dc78e53SAndroid Build Coastguard Worker */ 230*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_U32(msg, attrtype, value) \ 231*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_TYPE(msg, uint32_t, attrtype, value) 232*4dc78e53SAndroid Build Coastguard Worker 233*4dc78e53SAndroid Build Coastguard Worker /** 234*4dc78e53SAndroid Build Coastguard Worker * Add 64 bit signed integer attribute to netlink message. 235*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 236*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 237*4dc78e53SAndroid Build Coastguard Worker * @arg value Numeric value. 238*4dc78e53SAndroid Build Coastguard Worker */ 239*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_S64(msg, attrtype, value) \ 240*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_TYPE(msg, int64_t, attrtype, value) 241*4dc78e53SAndroid Build Coastguard Worker 242*4dc78e53SAndroid Build Coastguard Worker /** 243*4dc78e53SAndroid Build Coastguard Worker * Add 64 bit integer attribute to netlink message. 244*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 245*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 246*4dc78e53SAndroid Build Coastguard Worker * @arg value Numeric value. 247*4dc78e53SAndroid Build Coastguard Worker */ 248*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_U64(msg, attrtype, value) \ 249*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_TYPE(msg, uint64_t, attrtype, value) 250*4dc78e53SAndroid Build Coastguard Worker 251*4dc78e53SAndroid Build Coastguard Worker /** 252*4dc78e53SAndroid Build Coastguard Worker * Add string attribute to netlink message. 253*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 254*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 255*4dc78e53SAndroid Build Coastguard Worker * @arg value NUL terminated character string. 256*4dc78e53SAndroid Build Coastguard Worker */ 257*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_STRING(msg, attrtype, value) \ 258*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, attrtype, (int) strlen(value) + 1, value) 259*4dc78e53SAndroid Build Coastguard Worker 260*4dc78e53SAndroid Build Coastguard Worker /** 261*4dc78e53SAndroid Build Coastguard Worker * Add flag attribute to netlink message. 262*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 263*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 264*4dc78e53SAndroid Build Coastguard Worker */ 265*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_FLAG(msg, attrtype) \ 266*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, attrtype, 0, NULL) 267*4dc78e53SAndroid Build Coastguard Worker 268*4dc78e53SAndroid Build Coastguard Worker /** 269*4dc78e53SAndroid Build Coastguard Worker * Add msecs attribute to netlink message. 270*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 271*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 272*4dc78e53SAndroid Build Coastguard Worker * @arg msecs Numeric value in micro seconds. 273*4dc78e53SAndroid Build Coastguard Worker */ 274*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_MSECS(msg, attrtype, msecs) \ 275*4dc78e53SAndroid Build Coastguard Worker NLA_PUT_U64(msg, attrtype, msecs) 276*4dc78e53SAndroid Build Coastguard Worker 277*4dc78e53SAndroid Build Coastguard Worker /** 278*4dc78e53SAndroid Build Coastguard Worker * Add address attribute to netlink message. 279*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 280*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 281*4dc78e53SAndroid Build Coastguard Worker * @arg addr Abstract address object. 282*4dc78e53SAndroid Build Coastguard Worker */ 283*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_ADDR(msg, attrtype, addr) \ 284*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, attrtype, nl_addr_get_len(addr), \ 285*4dc78e53SAndroid Build Coastguard Worker nl_addr_get_binary_addr(addr)) 286*4dc78e53SAndroid Build Coastguard Worker 287*4dc78e53SAndroid Build Coastguard Worker /** 288*4dc78e53SAndroid Build Coastguard Worker * Add abstract data attribute to netlink message. 289*4dc78e53SAndroid Build Coastguard Worker * @arg msg Netlink message. 290*4dc78e53SAndroid Build Coastguard Worker * @arg attrtype Attribute type. 291*4dc78e53SAndroid Build Coastguard Worker * @arg data Abstract data object. 292*4dc78e53SAndroid Build Coastguard Worker */ 293*4dc78e53SAndroid Build Coastguard Worker #define NLA_PUT_DATA(msg, attrtype, data) \ 294*4dc78e53SAndroid Build Coastguard Worker NLA_PUT(msg, attrtype, nl_data_get_size(data), \ 295*4dc78e53SAndroid Build Coastguard Worker nl_data_get(data)) 296*4dc78e53SAndroid Build Coastguard Worker 297*4dc78e53SAndroid Build Coastguard Worker /** @} */ 298*4dc78e53SAndroid Build Coastguard Worker 299*4dc78e53SAndroid Build Coastguard Worker /** 300*4dc78e53SAndroid Build Coastguard Worker * @name Iterators 301*4dc78e53SAndroid Build Coastguard Worker * @{ 302*4dc78e53SAndroid Build Coastguard Worker */ 303*4dc78e53SAndroid Build Coastguard Worker 304*4dc78e53SAndroid Build Coastguard Worker /** 305*4dc78e53SAndroid Build Coastguard Worker * @ingroup attr 306*4dc78e53SAndroid Build Coastguard Worker * Iterate over a stream of attributes 307*4dc78e53SAndroid Build Coastguard Worker * @arg pos loop counter, set to current attribute 308*4dc78e53SAndroid Build Coastguard Worker * @arg head head of attribute stream 309*4dc78e53SAndroid Build Coastguard Worker * @arg len length of attribute stream 310*4dc78e53SAndroid Build Coastguard Worker * @arg rem initialized to len, holds bytes currently remaining in stream 311*4dc78e53SAndroid Build Coastguard Worker */ 312*4dc78e53SAndroid Build Coastguard Worker #define nla_for_each_attr(pos, head, len, rem) \ 313*4dc78e53SAndroid Build Coastguard Worker for (pos = head, rem = len; \ 314*4dc78e53SAndroid Build Coastguard Worker nla_ok(pos, rem); \ 315*4dc78e53SAndroid Build Coastguard Worker pos = nla_next(pos, &(rem))) 316*4dc78e53SAndroid Build Coastguard Worker 317*4dc78e53SAndroid Build Coastguard Worker /** 318*4dc78e53SAndroid Build Coastguard Worker * @ingroup attr 319*4dc78e53SAndroid Build Coastguard Worker * Iterate over a stream of nested attributes 320*4dc78e53SAndroid Build Coastguard Worker * @arg pos loop counter, set to current attribute 321*4dc78e53SAndroid Build Coastguard Worker * @arg nla attribute containing the nested attributes 322*4dc78e53SAndroid Build Coastguard Worker * @arg rem initialized to len, holds bytes currently remaining in stream 323*4dc78e53SAndroid Build Coastguard Worker */ 324*4dc78e53SAndroid Build Coastguard Worker #define nla_for_each_nested(pos, nla, rem) \ 325*4dc78e53SAndroid Build Coastguard Worker for (pos = (struct nlattr *) nla_data(nla), rem = nla_len(nla); \ 326*4dc78e53SAndroid Build Coastguard Worker nla_ok(pos, rem); \ 327*4dc78e53SAndroid Build Coastguard Worker pos = nla_next(pos, &(rem))) 328*4dc78e53SAndroid Build Coastguard Worker 329*4dc78e53SAndroid Build Coastguard Worker /** @} */ 330*4dc78e53SAndroid Build Coastguard Worker 331*4dc78e53SAndroid Build Coastguard Worker #ifdef __cplusplus 332*4dc78e53SAndroid Build Coastguard Worker } 333*4dc78e53SAndroid Build Coastguard Worker #endif 334*4dc78e53SAndroid Build Coastguard Worker 335*4dc78e53SAndroid Build Coastguard Worker #endif 336