summaryrefslogtreecommitdiffstats
path: root/man3/rtnetlink.3
diff options
context:
space:
mode:
Diffstat (limited to 'man3/rtnetlink.3')
-rw-r--r--man3/rtnetlink.3115
1 files changed, 115 insertions, 0 deletions
diff --git a/man3/rtnetlink.3 b/man3/rtnetlink.3
new file mode 100644
index 000000000..51b998a77
--- /dev/null
+++ b/man3/rtnetlink.3
@@ -0,0 +1,115 @@
+.\" This man page is Copyright (C) 1999 Andi Kleen <ak@muc.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 $
+.TH RTNETLINK 3 1999-05-14 "Linux Man Page" "Linux Programmer's Manual"
+.SH NAME
+rtnetlink \- Macros to manipuate rtnetlink messages
+.SH SYNOPSIS
+.B #include <asm/types.h>
+.br
+.B #include <linux/netlink.h>
+.br
+.B #include <linux/rtnetlink.h>
+.br
+.B #include <sys/socket.h>
+
+.BI "rtnetlink_socket = socket(PF_NETLINK, int " socket_type ", NETLINK_ROUTE);"
+.br
+.B int RTA_OK(struct rtattr *rta, int rtabuflen);
+.br
+.B void *RTA_DATA(struct rtattr *rta);
+.br
+.B unsigned int RTA_PAYLOAD(struct rtattr *rta);
+.br
+.B struct rtattr *RTA_NEXT(struct rtattr *rta, unsigned int rtabuflen);
+.br
+.B unsigned int RTA_LENGTH(unsigned int length);
+.br
+.B unsigned int RTA_SPACE(unsigned int length);
+.br
+.SH DESCRIPTION
+All
+.BR rtnetlink (7)
+messages consist of a
+.BR netlink (7)
+message header and appended attributes. The attributes should be only
+manipulated using the macros provided here.
+
+.PP
+.BI RTA_OK( rta ", " attrlen )
+returns true if
+.I rta
+points to a valid routing attribute;
+.I 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
+.I attrlen
+is non-zero.
+.br
+.BI RTA_DATA( rta )
+returns a pointer to the start of this attribute's data.
+.br
+.BI RTA_PAYLOAD( rta )
+returns the length of this attribute's data.
+.br
+.BI RTA_NEXT( rta ", " attrlen )
+gets the next attribute after
+.IR rta .
+Calling this macro will update
+.IR attrlen .
+You should use
+.B RTA_OK
+to check for the validity of the returned pointer.
+.br
+.BI RTA_LENGTH( len )
+returns the length which is required for
+.I len
+bytes of data plus the header.
+.br
+.BI RTA_SPACE( len )
+returns the amount of space which will be needed in the message with
+.I len
+bytes of data.
+
+.SH EXAMPLE
+.\" XXX would be better to use libnetlink here
+
+Creating a rtnetlink message to set a MTU of a device.
+.nf
+ 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);
+.fi
+
+.SH BUGS
+This manual page is lacking and incomplete.
+
+.SH "SEE ALSO"
+.BR netlink (3),
+.BR netlink (7),
+.BR rtnetlink (7)