rtnetlink — macros to manipulate rtnetlink messages
#include <asm/types.h> #include <linux/netlink.h> #include <linux/rtnetlink.h> #include <sys/socket.h>
rtnetlink_socket = socket( |
PF_NETLINK, | |
int | socket_type, | |
NETLINK_ROUTE) ; |
int
RTA_OK( |
struct rtattr * | rta, |
int | rtabuflen) ; |
void
*RTA_DATA( |
struct rtattr * | rta) ; |
unsigned int RTA_PAYLOAD( |
struct rtattr * | rta) ; |
struct rtattr *RTA_NEXT( |
struct rtattr * | rta, |
unsigned int | rtabuflen) ; |
unsigned int RTA_LENGTH( |
unsigned int | length) ; |
unsigned int RTA_SPACE( |
unsigned int | length) ; |
All rtnetlink(7) messages consist of a netlink(7) message header and appended attributes. The attributes should be only manipulated using the macros provided here.
RTA_OK
(rta
, attrlen
) returns true if
rta
points to a valid
routing attribute; attrlen
is the running length
of the attribute buffer. When not true then you must assume
there are no more attributes in the message, even if
attrlen
is
nonzero.
RTA_DATA
(rta
) returns a pointer to the
start of this attribute's data.
RTA_PAYLOAD
(rta
) returns the length of this
attribute's data.
RTA_NEXT
(rta
, attrlen
) gets the next
attribute after rta
.
Calling this macro will update attrlen
. You should use
RTA_OK
to check the validity of
the returned pointer.
RTA_LENGTH
(len
) returns the length which
is required for len
bytes of data plus the header.
RTA_SPACE
(len
) returns the amount of
space which will be needed in a message with len
bytes of data.
Creating a rtnetlink message to set the MTU of a device:
struct { struct nlmsghdr nh; struct ifinfomsg if; char attrbuf[512]; } req; struct rtattr *rta; unsigned int mtu = 1000; int rtnetlink_sk = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE); memset(&req, 0, sizeof(req)); req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); req.nh.nlmsg_flags = NLM_F_REQUEST; req.nh.nlmsg_type = RTML_NEWLINK; req.if.ifi_family = AF_UNSPEC; req.if.ifi_index = INTERFACE_INDEX; req.if.ifi_change = 0xffffffff; /* ???*/ rta = (struct rtattr *)(((char *) &req) + NLMSG_ALIGN(n−>nlmsg_len)); rta−>rta_type = IFLA_MTU; rta−>rta_len = sizeof(unsigned int); req.n.nlmsg_len = NLMSG_ALIGN(req.n.nlmsg_len) + RTA_LENGTH(sizeof(mtu)); memcpy(RTA_DATA(rta), &mtu, sizeof(mtu)); send(rtnetlink_sk, &req, req.n.nlmsg_len);
This page is part of release 2.79 of the Linux man-pages
project. A
description of the project, and information about reporting
bugs, can be found at
http://www.kernel.org/doc/man-pages/.
This man page is Copyright (C) 1999 Andi Kleen <akmuc.de>. Permission is granted to distribute possibly modified copies of this page provided the header is included verbatim, and in case of nontrivial modification author and date of the modification is added to the header. $Id: rtnetlink.3,v 1.2 1999/05/18 10:35:10 freitag Exp $ |