def nlmsg_reserve(n, len_, pad):
    """Reserve room for additional data in a Netlink message.

    https://github.com/thom311/libnl/blob/libnl3_2_25/lib/msg.c#L407

    Reserves room for additional data at the tail of the an existing netlink message. Eventual padding required will be
    zeroed out.

    bytearray_ptr() at the start of additional data or None.
    """
    nlmsg_len_ = n.nm_nlh.nlmsg_len
    tlen = len_ if not pad else ((len_ + (pad - 1)) & ~(pad - 1))

    if tlen + nlmsg_len_ > n.nm_size:
        return None

    buf = bytearray_ptr(n.nm_nlh.bytearray, nlmsg_len_)
    n.nm_nlh.nlmsg_len += tlen
    if tlen > len_:
        bytearray_ptr(buf, len_, tlen)[:] = bytearray(b'\0') * (tlen - len_)

    _LOGGER.debug('msg 0x%x: Reserved %d (%d) bytes, pad=%d, nlmsg_len=%d', id(n), tlen, len_, pad, n.nm_nlh.nlmsg_len)
    return buf
Reserve room for additional data in a Netlink message.

    https://github.com/thom311/libnl/blob/libnl3_2_25/lib/msg.c#L407

    Reserves room for additional data at the tail of the an existing netlink message. Eventual padding required will be
    zeroed out.

    bytearray_ptr() at the start of additional data or None.