1 .\" This man page is Copyright (C) 1999 Andi Kleen <ak@muc.de>.
2 .\" Permission is granted to distribute possibly modified copies
3 .\" of this page provided the header is included verbatim,
4 .\" and in case of nontrivial modification author and date
5 .\" of the modification is added to the header.
6 .\" $Id: rtnetlink.3,v 1.2 1999/05/18 10:35:10 freitag Exp $
7 .TH RTNETLINK 3 1999-05-14 "GNU" "Linux Programmer's Manual"
9 rtnetlink \- macros to manipulate rtnetlink messages
11 .B #include <asm/types.h>
13 .B #include <linux/netlink.h>
15 .B #include <linux/rtnetlink.h>
17 .B #include <sys/socket.h>
19 .BI "rtnetlink_socket = socket(PF_NETLINK, int " socket_type \
22 .BI "int RTA_OK(struct rtattr *" rta ", int " rtabuflen );
24 .BI "void *RTA_DATA(struct rtattr *" rta );
26 .BI "unsigned int RTA_PAYLOAD(struct rtattr *" rta );
28 .BI "struct rtattr *RTA_NEXT(struct rtattr *" rta \
29 ", unsigned int " rtabuflen );
31 .BI "unsigned int RTA_LENGTH(unsigned int " length );
33 .BI "unsigned int RTA_SPACE(unsigned int "length );
39 message header and appended attributes.
40 The attributes should be only
41 manipulated using the macros provided here.
43 .BI RTA_OK( rta ", " attrlen )
46 points to a valid routing attribute;
48 is the running length of the attribute buffer.
49 When not true then you must assume there are no more attributes in the
55 returns a pointer to the start of this attribute's data.
57 .BI RTA_PAYLOAD( rta )
58 returns the length of this attribute's data.
60 .BI RTA_NEXT( rta ", " attrlen )
61 gets the next attribute after
63 Calling this macro will update
67 to check the validity of the returned pointer.
70 returns the length which is required for
72 bytes of data plus the header.
75 returns the amount of space which will be needed in a message with
79 These macros are non-standard Linux extensions.
81 This manual page is incomplete.
83 .\" FIXME ? would be better to use libnetlink in the EXAMPLE code here
85 Creating a rtnetlink message to set the MTU of a device:
95 unsigned int mtu = 1000;
97 int rtnetlink_sk = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
99 memset(&req, 0, sizeof(req));
100 req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
101 req.nh.nlmsg_flags = NLM_F_REQUEST;
102 req.nh.nlmsg_type = RTML_NEWLINK;
103 req.if.ifi_family = AF_UNSPEC;
104 req.if.ifi_index = INTERFACE_INDEX;
105 req.if.ifi_change = 0xffffffff; /* ???*/
106 rta = (struct rtattr *)(((char *) &req) +
107 NLMSG_ALIGN(n->nlmsg_len));
108 rta->rta_type = IFLA_MTU;
109 rta->rta_len = sizeof(unsigned int);
110 req.n.nlmsg_len = NLMSG_ALIGN(req.n.nlmsg_len) +
111 RTA_LENGTH(sizeof(mtu));
112 memcpy(RTA_DATA(rta), &mtu, sizeof(mtu));
113 send(rtnetlink_sk, &req, req.n.nlmsg_len);