RTNETLINK(3)

NOMBRE
rtnetlink - macros para manipular mensajes rtnetlink

SINOPSIS
#include <asm/types.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <sys/socket.h>

rtnetlink_socket = socket(AF_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);

DESCRIPCIÓN
Todos los mensajes rtnetlink(7) están formados por una cabecera de mensaje netlink(7) y atributos añadidos. Los atributos sólo deberían ser manipulados usando las macros suministradas aquí.

RTA_OK(rta, attrlen) devuelve verdadero si rta apunta a un atributo de enrutamiento válido. attrlen es la longitud actual del buffer de atributos. Cuando es falso debe asumir que no hay más atributos en el mensaje, aunque attrlen no sea cero.

RTA_DATA(rta) devuelve un puntero al principio de los datos de este atributo.

RTA_PAYLOAD(rta) devuelve la longitud de los datos de este atributo.

RTA_NEXT(rta, attrlen) obtiene el siguiente atributo después de rta. Al llamar a esta macro se actualizará attrlen. Debería usar RTA_OK para comprobar la validez del puntero devuelto.

RTA_LENGTH(len) devuelve la longitud que se necesita para len bytes de datos más la cabecera.

RTA_SPACE(len) devuelve la cantidad de espacio que se necesitarán en el mensaje con len bytes de datos.

CONFORME A
These macros are nonstandard Linux extensions.

ERRORES
This manual page is incomplete.

EJEMPLOS
Crear un mensaje rtnetlink para configurar la MTU de un dispositivo:

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

VÉASE TAMBIÉN
netlink(3), netlink(7), rtnetlink(7)

COLOFÓN
Esta página es parte de la versión 5.10 del proyecto Linux man-pages. Puede encontrar una descripción del proyecto, información sobre cómo informar errores y la última versión de esta página en https://www.kernel.org/doc/man-pages/.

TRADUCCIÓN
La traducción al español de esta página del manual fue creada por Juan Piernas <piernas@ditec.um.es>

Esta traducción es documentación libre; lea la GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.

Si encuentra algún error en la traducción de esta página del manual, envíe un correo electrónico a debian-l10n-spanish@lists.debian.org.