RTNETLINK(3)

NOM
rtnetlink - Macros manipulant des messages rtnetlink

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
Tous les messages rtnetlink(7) consistent en un entête de message netlink(7) et des attributs. Ceux-ci ne devraient être manipulés que par les macros fournies ici.

RTA_OK(rta, attrlen) renvoie vrai si rta pointe sur un attribut de routage valide ; attrlen est la longueur courante du tampon d'attributs. Si elle renvoie 0, vous devez supposer qu'il n'y a pas d'autre attribut dans le message, même si attrlen n'est pas nulle.

RTA_DATA(rta) renvoie un pointeur sur le début des données de cet attribut.

RTA_PAYLOAD(rta) renvoie la longueur des données de cet attribut.

RTA_NEXT(rta, attrlen) renvoie le premier attribut après rta. Un appel à cette macro met à jour attrlen. Vous devriez utiliser RTA_OK pour vérifier la validité du pointeur retourné.

RTA_LENGTH(len) renvoie la longueur requise pour len octets de données plus l'entête.

RTA_SPACE(len) renvoie la quantité de mémoire nécessaire pour un message composé de len octets de données.

CONFORMITÉ
Ces macros sont des extensions Linux non standard.

BOGUES
Cette page de manuel est incomplète.

EXEMPLE
Créer un message rtnetlink pour choisir le MTU d'un périphérique.
    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);

VOIR AUSSI
netlink(3), netlink(7), rtnetlink(7)

TRADUCTION

Ce document est une traduction réalisée par Thierry Vignaud <tvignaud AT mandriva DOT com> en 2000 et révisée le 17 juillet 2008.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 3 rtnetlink ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.