File: rtnetlink.3

package info (click to toggle)
manpages 6.15-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 20,184 kB
  • sloc: sh: 575; python: 222; perl: 190; makefile: 29; lisp: 22
file content (120 lines) | stat: -rw-r--r-- 3,027 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
.\" Copyright, the authors of the Linux man-pages project
.\"
.\" SPDX-License-Identifier: Linux-man-pages-1-para
.\"
.TH rtnetlink 3 2025-05-17 "Linux man-pages (unreleased)"
.SH NAME
rtnetlink \- macros to manipulate rtnetlink messages
.SH LIBRARY
Standard C library
.RI ( libc ,\~ \-lc )
.SH SYNOPSIS
.nf
.B #include <asm/types.h>
.B #include <linux/netlink.h>
.B #include <linux/rtnetlink.h>
.B #include <sys/socket.h>
.P
.BI "rtnetlink_socket = socket(AF_NETLINK, int " socket_type \
", NETLINK_ROUTE);"
.P
.BI "int RTA_OK(struct rtattr *" rta ", int " size );
.P
.BI "void *RTA_DATA(struct rtattr *" rta );
.BI "unsigned int RTA_PAYLOAD(struct rtattr *" rta );
.P
.BI "struct rtattr *RTA_NEXT(struct rtattr *" rta \
", unsigned int " size );
.P
.BI "unsigned int RTA_LENGTH(unsigned int " size );
.BI "unsigned int RTA_SPACE(unsigned int "size );
.fi
.SH DESCRIPTION
All
.BR rtnetlink (7)
messages consist of a
.BR netlink (7)
message header and appended attributes.
The attributes should be manipulated only using the macros provided here.
.P
.BI RTA_OK( rta ", " size )
returns true if
.I rta
points to a valid routing attribute;
.I size
is the running size of the attribute buffer.
When not true then you must assume there are no more attributes in the
message, even if
.I size
is nonzero.
.P
.BI RTA_DATA( rta )
returns a pointer to the start of this attribute's data.
.P
.BI RTA_PAYLOAD( rta )
returns the size of this attribute's data.
.P
.BI RTA_NEXT( rta ", " size )
gets the next attribute after
.IR rta .
Calling this macro will update
.IR size .
You should use
.B RTA_OK
to check the validity of the returned pointer.
.P
.BI RTA_LENGTH( size )
returns the size which is required for
.I size
bytes of data plus the header.
.P
.BI RTA_SPACE( size )
returns the amount of space which will be needed in a message with
.I size
bytes of data.
.SH STANDARDS
Linux.
.SH BUGS
This manual page is incomplete.
.SH EXAMPLES
.\" FIXME . ? would be better to use libnetlink in the EXAMPLE code here
Creating a rtnetlink message to set the MTU of a device:
.P
.in +4n
.EX
#include <linux/rtnetlink.h>
\&
\&...
\&
struct {
    struct nlmsghdr  nh;
    struct ifinfomsg if;
    char             attrbuf[512];
} req;
\&
struct rtattr *rta;
unsigned int mtu = 1000;
\&
int rtnetlink_sk = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
\&
memset(&req, 0, sizeof(req));
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(req.if));
req.nh.nlmsg_flags = NLM_F_REQUEST;
req.nh.nlmsg_type = RTM_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(req.nh.nlmsg_len));
rta\->rta_type = IFLA_MTU;
rta\->rta_len = RTA_LENGTH(sizeof(mtu));
req.nh.nlmsg_len = NLMSG_ALIGN(req.nh.nlmsg_len) +
                              RTA_LENGTH(sizeof(mtu));
memcpy(RTA_DATA(rta), &mtu, sizeof(mtu));
send(rtnetlink_sk, &req, req.nh.nlmsg_len, 0);
.EE
.in
.SH SEE ALSO
.BR netlink (3),
.BR netlink (7),
.BR rtnetlink (7)