int netlink_policy_dump_attr_size_estimate(conststruct nla_policy *pt)
{ /* nested + type */ int common = 2 * nla_attr_size(sizeof(u32));
switch (pt->type) { case NLA_UNSPEC: case NLA_REJECT: /* these actually don't need any space */ return0; case NLA_NESTED: case NLA_NESTED_ARRAY: /* common, policy idx, policy maxattr */ return common + 2 * nla_attr_size(sizeof(u32)); case NLA_U8: case NLA_U16: case NLA_U32: case NLA_U64: case NLA_MSECS: case NLA_S8: case NLA_S16: case NLA_S32: case NLA_S64: case NLA_SINT: case NLA_UINT: /* maximum is common, u64 min/max with padding */ return common + 2 * (nla_attr_size(0) + nla_attr_size(sizeof(u64))); case NLA_BITFIELD32: return common + nla_attr_size(sizeof(u32)); case NLA_STRING: case NLA_NUL_STRING: case NLA_BINARY: /* maximum is common, u32 min-length/max-length */ return common + 2 * nla_attr_size(sizeof(u32)); case NLA_FLAG: return common;
}
/* this should then cause a warning later */ return0;
}
attr = nla_nest_start(skb, nestattr); if (!attr) return -ENOBUFS;
switch (pt->type) { default: case NLA_UNSPEC: case NLA_REJECT: /* skip - use NLA_MIN_LEN to advertise such */
nla_nest_cancel(skb, attr); return -ENODATA; case NLA_NESTED:
type = NL_ATTR_TYPE_NESTED;
fallthrough; case NLA_NESTED_ARRAY: if (pt->type == NLA_NESTED_ARRAY)
type = NL_ATTR_TYPE_NESTED_ARRAY; if (state && pt->nested_policy && pt->len &&
(nla_put_u32(skb, NL_POLICY_TYPE_ATTR_POLICY_IDX,
netlink_policy_dump_get_policy_idx(state,
pt->nested_policy,
pt->len)) ||
nla_put_u32(skb, NL_POLICY_TYPE_ATTR_POLICY_MAXTYPE,
pt->len))) goto nla_put_failure; break; case NLA_U8: case NLA_U16: case NLA_U32: case NLA_U64: case NLA_UINT: case NLA_MSECS: { struct netlink_range_validation range;
if (pt->type == NLA_U8)
type = NL_ATTR_TYPE_U8; elseif (pt->type == NLA_U16)
type = NL_ATTR_TYPE_U16; elseif (pt->type == NLA_U32)
type = NL_ATTR_TYPE_U32; elseif (pt->type == NLA_U64)
type = NL_ATTR_TYPE_U64; else
type = NL_ATTR_TYPE_UINT;
if (nla_put_u64_64bit(skb, NL_POLICY_TYPE_ATTR_MIN_VALUE_U,
range.min, NL_POLICY_TYPE_ATTR_PAD) ||
nla_put_u64_64bit(skb, NL_POLICY_TYPE_ATTR_MAX_VALUE_U,
range.max, NL_POLICY_TYPE_ATTR_PAD)) goto nla_put_failure; break;
} case NLA_S8: case NLA_S16: case NLA_S32: case NLA_S64: case NLA_SINT: { struct netlink_range_validation_signed range;
if (pt->type == NLA_S8)
type = NL_ATTR_TYPE_S8; elseif (pt->type == NLA_S16)
type = NL_ATTR_TYPE_S16; elseif (pt->type == NLA_S32)
type = NL_ATTR_TYPE_S32; elseif (pt->type == NLA_S64)
type = NL_ATTR_TYPE_S64; else
type = NL_ATTR_TYPE_SINT;
if (pt->validation_type == NLA_VALIDATE_FUNCTION) break;
nla_get_range_signed(pt, &range);
if (nla_put_s64(skb, NL_POLICY_TYPE_ATTR_MIN_VALUE_S,
range.min, NL_POLICY_TYPE_ATTR_PAD) ||
nla_put_s64(skb, NL_POLICY_TYPE_ATTR_MAX_VALUE_S,
range.max, NL_POLICY_TYPE_ATTR_PAD)) goto nla_put_failure; break;
} case NLA_BITFIELD32:
type = NL_ATTR_TYPE_BITFIELD32; if (nla_put_u32(skb, NL_POLICY_TYPE_ATTR_BITFIELD32_MASK,
pt->bitfield32_valid)) goto nla_put_failure; break; case NLA_STRING: case NLA_NUL_STRING: case NLA_BINARY: if (pt->type == NLA_STRING)
type = NL_ATTR_TYPE_STRING; elseif (pt->type == NLA_NUL_STRING)
type = NL_ATTR_TYPE_NUL_STRING; else
type = NL_ATTR_TYPE_BINARY;
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.13Bemerkung:
(vorverarbeitet am 2026-09-29)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.