rtnetlink - Macros manipulant des messages rtnetlink
Bibliothèque C standard (
libc,
-lc)
#include <asm/types.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <sys/socket.h>
rtnetlink_socket = socket(AF_NETLINK, int type_socket, 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);
Tous les messages
rtnetlink(7) consistent en un en-tê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 attributs 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'en-tête.
RTA_SPACE(len) renvoie la quantité de mémoire
nécessaire pour un message composé de
len octets de
données.
Ces macros sont des extensions de Linux non standard.
Cette page de manuel est incomplète.
Créer un message rtnetlink pour choisir le MTU d'un
périphérique.
#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);
netlink(3),
netlink(7),
rtnetlink(7)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Jean-Pierre Giraud <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]