Manpages

Manpage of RTNETLINK

RTNETLINK

Section: Linux Programmer's Manual (3)
Updated: 1999-05-14
Index
Return to Main Contents
 

NAME

rtnetlink - Macros to manipuate rtnetlink messages  

SYNOPSIS

#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);
 

DESCRIPTION

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 non-zero.
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 for 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 the message with len bytes of data.

 

EXAMPLE

Creating a rtnetlink message to set a 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); 

 

BUGS

This manual page is lacking and incomplete.

 

SEE ALSO

rtnetlink(7), netlink(7), netlink(3)


 

Index

NAME
SYNOPSIS
DESCRIPTION
EXAMPLE
BUGS
SEE ALSO

This document was created by man2html, using the manual pages.
Time: 02:43:38 GMT, April 26, 2024