/** * This module implements parsing / formatting routines for * Netlink and Generic Netlink structures. * * **Important:** These structures use the host endianness. * This module will serialize messages differently depending * on that. * * @module */ /// export declare const readF64: (offset?: number | undefined) => number; export declare const readF32: (offset?: number | undefined) => number; export declare const readU64: (offset?: number | undefined) => bigint; export declare const readS64: (offset?: number | undefined) => bigint; export declare const readU32: (offset?: number | undefined) => number; export declare const readS32: (offset?: number | undefined) => number; export declare const readU16: (offset?: number | undefined) => number; export declare const readS16: (offset?: number | undefined) => number; export declare const readU8: (offset?: number | undefined) => number; export declare const readS8: (offset?: number | undefined) => number; export declare const readU32be: (offset?: number | undefined) => number; export declare const readU16be: (offset?: number | undefined) => number; export declare const writeF64: (value: number, offset?: number | undefined) => number; export declare const writeF32: (value: number, offset?: number | undefined) => number; export declare const writeU64: (value: bigint, offset?: number | undefined) => number; export declare const writeS64: (value: bigint, offset?: number | undefined) => number; export declare const writeU32: (value: number, offset?: number | undefined) => number; export declare const writeS32: (value: number, offset?: number | undefined) => number; export declare const writeU16: (value: number, offset?: number | undefined) => number; export declare const writeS16: (value: number, offset?: number | undefined) => number; export declare const writeU8: (value: number, offset?: number | undefined) => number; export declare const writeS8: (value: number, offset?: number | undefined) => number; export declare const writeU32be: (value: number, offset?: number | undefined) => number; export declare const writeU16be: (value: number, offset?: number | undefined) => number; export declare const ensureArray: (x: Uint8Array | Uint8Array[]) => Uint8Array[]; export declare function countLength(x: Uint8Array | Uint8Array[]): number; /** Get the amount of padding (in bytes) to add after length */ export declare const padding: (x: number) => number; /** Like {@link padding} but returns a zero-filled buffer of that length */ export declare const getPadding: (x: number) => Buffer; /** Append necessary padding to data. THIS MODIFIES THE ORIGINAL ARRAY */ export declare function pad(x: Uint8Array[]): Uint8Array[]; /** Round the passed length up to align it */ export declare const align: (x: number) => number; export declare type ParseResult = { x: T; consumed: number; }; /** Length of netlink headers */ export declare const HEADER_LENGTH = 16; /** Header for Netlink messages */ export interface NetlinkHeader { /** Message length, including header */ length: number; /** Message type */ type: number; /** Message flags */ flags: number; /** Sequence number */ seq: number; /** Port number (i.e. pid) that sends the message */ port: number; } /** * Parses a Netlink header * @param x Header data * @returns Parsed header * @throws If `x` contains less than `HEADER_LENGTH` */ export declare function parseHeader(r: Buffer): ParseResult; /** * Encodes a Netlink header * @param x Header data * @returns Serialized header */ export declare function formatHeader(x: NetlinkHeader): Buffer; /** Combination of a valid {@link NetlinkHeader} with payload */ export interface NetlinkMessage_ { /** Message type */ type: number; /** Message flags */ flags: number; /** Sequence number */ seq: number; /** Port number (i.e. pid) that sends the message */ port: number; /** Message payload */ data: Uint8Array | Uint8Array[]; } /** Combination of a valid {@link link NetlinkHeader} with payload */ export interface NetlinkMessage extends NetlinkMessage_ { data: Buffer; } export declare function formatMessage(x: NetlinkMessage_): Uint8Array[]; export declare function parseMessage(r: Buffer): ParseResult; /** * Calls {@link parseMessage} repeatedly, ignoring padding * between messages, until there's no data left (other than padding). * * @param x Message data * @retrns Array of parsed messages */ export declare function parseMessages(r: Buffer): NetlinkMessage[]; export interface NetlinkErrorMessage { errno: number; code?: string; header: NetlinkHeader; tlvData?: Buffer; } export declare function parseError(r: Buffer, flags: number): NetlinkErrorMessage; /** Netlink attribute (TLV) */ export interface NetlinkAttribute_ { /** True if the payload carries nested attributes */ nested?: boolean; /** True if the payload is stored in network byte order */ no?: boolean; /** Attribute type (14 bits) */ type: number; /** Message payload */ data: Uint8Array | Uint8Array[]; } /** Netlink attribute (TLV) */ export interface NetlinkAttribute extends NetlinkAttribute_ { data: Buffer; } /** * Object allowing efficient construction of an attribute stream. */ export declare type StreamData = Uint8Array | Uint8Array[] | ((out: AttrStream) => any); export declare class AttrStream { readonly bufs: Uint8Array[]; private offset; emit(data: StreamData): void; push(type: number, data: StreamData): void; } export declare function formatAttribute(x: NetlinkAttribute_): Uint8Array[]; export declare function parseAttribute(r: Buffer): ParseResult; /** * Calls {@link parseMessage} repeatedly, supplying each result to * the passed callback and ignoring padding, until there's no * data left (other than padding). * * @param x Attributes stream data * @retrns Array of parsed messages */ export declare function parseAttributes(r: Buffer, fn: (item: NetlinkAttribute) => any): void; export declare const getU8: (x: Buffer) => number; export declare const putU8: (x: number) => Buffer; export declare const getU16: (x: Buffer) => number; export declare const putU16: (x: number) => Buffer; export declare const getU32: (x: Buffer) => number; export declare const putU32: (x: number) => Buffer; export declare const getU64: (x: Buffer) => bigint; export declare const putU64: (x: bigint) => Buffer; export declare const getS8: (x: Buffer) => number; export declare const putS8: (x: number) => Buffer; export declare const getS16: (x: Buffer) => number; export declare const putS16: (x: number) => Buffer; export declare const getS32: (x: Buffer) => number; export declare const putS32: (x: number) => Buffer; export declare const getS64: (x: Buffer) => bigint; export declare const putS64: (x: bigint) => Buffer; export declare const getU16be: (x: Buffer) => number; export declare const putU16be: (x: number) => Buffer; export declare const getU32be: (x: Buffer) => number; export declare const putU32be: (x: number) => Buffer; export declare const getF32: (x: Buffer) => number; export declare const putF32: (x: number) => Buffer; export declare const getF64: (x: Buffer) => number; export declare const putF64: (x: number) => Buffer; export declare const getFlag: (x: Buffer) => true; export declare const putFlag: (x: true) => Buffer; export declare function getBool(x: Buffer): boolean; export declare const putBool: (x: boolean) => Buffer; export declare function getString(x: Buffer, options?: { encoding?: BufferEncoding; maxLength: number; }): string; export declare function putString(x: string, options?: { encoding?: BufferEncoding; maxLength: number; }): Buffer; export declare function getMap(x: Buffer, fn: (item: Buffer) => T): Map; export declare type GetArrayOptions = { zero?: boolean; }; export declare function getArray(x: Buffer, fn: (item: Buffer) => T, options?: GetArrayOptions): T[]; export declare function putArray(x: T[], fn: (item: T) => StreamData, options?: GetArrayOptions): StreamData; export declare function putMap(x: Map, fn: (item: T) => StreamData): StreamData; /** * Common base interface for parsed structs that are "expandable"; meaning * they could see new fields appended to them in future versions of the kernel. */ export interface BaseExpandableStruct { /** * Extra data present at the end of the struct, if any. This is normal for * fields that were added to the struct on newer versions of the kernel and * not yet added to the type definitions. * * **This is not part of the stable API**; depending on it may break your * code even on minor releases, since the new fields could be finally * added and no longer be present here. The type of this field could also * change in the future. */ __unparsed?: Buffer; } /** Common base interface for parsed Netlink objects (series of attributes). */ export interface BaseObject { /** * List of attributes that were discarded when parsing because their * type did not match any known value (if any). This is normal for * attributes that have been implemented into the kernel and not yet * added to the type definitions. The main use of this field is to * preserve those attributes when the struct is reformatted; you may * otherwise ignore it or even want to remove it. * * **This is not part of the stable API**; depending on it may break * your code even on minor releases, since the new attributes * could be finally added and no longer be present here. The type of * this field could also change in the future. Right now every item * is a `[type, data]` pair (see {@link NetlinkAttribute}). */ __unparsed?: [number, Buffer][]; } export declare function getObject(x: Buffer, fns: { [key: number]: (data: Buffer, obj: T) => any; }): T; export declare function putObject(x: T, fns: { [key: string]: (data: AttrStream, obj: T) => any; }): StreamData; export declare function getEnum(mapping: { [key: number]: string; }, x: number): number | keyof R; export declare function putEnum(mapping: { [key in keyof R]: number; }, x: number | keyof R): number; /** Length of generic netlink headers */ export declare const GENL_HEADER_LENGTH = 4; /** Header for Generic Netlink message payload */ export interface GenericNetlinkHeader { cmd: number; version: number; reserved?: number; } /** * Parses a Generic Netlink header * @param x Header data * @returns Parsed header * @throws If `x` contains less than `GENL_HEADER_LENGTH` */ export declare function parseGenlHeader(r: Buffer): ParseResult; /** * Encodes a Generic Netlink header * @param x Header data * @returns Serialized header */ export declare function formatGenlHeader(x: GenericNetlinkHeader): Buffer;