NAME
"Socket::Netlink" - interface to Linux's "PF_NETLINK" socket family
SYNOPSIS
use Socket;
use Socket::Netlink qw( :DEFAULT pack_nlmsghdr unpack_nlmsghdr );
socket( my $sock, PF_NETLINK, SOCK_RAW, 0 ) or die "socket: $!";
send( $sock, pack_nlmsghdr( 18, NLM_F_REQUEST|NLM_F_DUMP, 0, 0,
"\0\0\0\0\0\0\0\0" ), 0 )
or die "send: $!";
recv( $sock, my $buffer, 65536, 0 ) or die "recv: $!";
printf "Received type=%d flags=%x:\n%v02x\n",
( unpack_nlmsghdr( $buffer ) )[ 0, 1, 4 ];
DESCRIPTION
This module contains the low-level constants and structure handling
functions required to use Linux's "PF_NETLINK" socket family. It is
suggested to use the high-level object interface to this instead; see
IO::Socket::Netlink.
CONSTANTS
The following constants are exported
PF_NETLINK
The packet family (for "socket()" calls)
AF_NETLINK
The address family
ADDRESS FUNCTIONS
The following pair of functions operate on "AF_NETLINK" address
structures. The meainings of the parameters are:
pid The unique endpoint number for this netlink socket. If given as
0 to the "bind()" syscall, the kernel will allocate an endpoint
number of the process's PID.
groups A 32-bit bitmask of the multicast groups to join.
$addr = pack_sockaddr_nl( $pid, $groups )
Returns a "sockaddr_nl" structure with the fields packed into it.
( $pid, $groups ) = unpack_sockaddr_nl( $addr )
Takes a "sockaddr_nl" structure and returns the unpacked fields from it.
STRUCTURE FUNCTIONS
The following function pairs operate on structure types used by netlink
$buffer = pack_nlmsghdr( $type, $flags, $seq, $pid, $body )
( $type, $flags, $seq, $pid, $body, $morebuffer ) = unpack_nlmsghdr( $buffer )
Pack or unpack a "struct nlmsghdr" and its payload body.
Because a single netlink message can contain more than payload body, the
"unpack_nlmsghdr" function will return the remaining buffer after
unpacking the first message, in case there are others. If there are no
more, the $morebuffer list element will not be returned.
while( defined $buffer ) {
( my ( $type, $flags, $seq, $pid, $body ), $buffer ) = unpack_nlmsghdr( $buffer );
...
}
There is no similar functionallity for "pack_nlmsghdr"; simply
concatenate multiple results together to send more than one message.
$buffer = pack_nlmsgerr( $error, $msg )
( $error, $msg ) = unpack_nlmsgerr( $buffer )
Pack or unpack a "struct nlmsgerr". The kernel expects or reports
negative integers in its structures; these functions take or return
normal positive error values suitable for use with $!.
$buffer = pack_nlattrs( %attrs )
%attrs = unpack_nlattrs( $buffer )
Pack or unpack a list of netlink attributes.
These functions take or return even-sized lists of "$type, $value"
pairs. The type will be the number in the netlink attribute message, and
the value will be a plain packed string buffer. It is the caller's
responsibilty to further pack/unpack this buffer as appropriate for the
specific type.
Because these functions take/return even-sized lists, they may be passed
or returned into hashes.
SEE ALSO
* netlink(7) - netlink - Communication between kernel and userspace
(AF_NETLINK)
* IO::Socket::Netlink - Object interface to "AF_NETLINK" domain
sockets
AUTHOR
Paul Evans <leonerd@leonerd.org.uk>