Provided by: manpages-es_1.55-10_all bug

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

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.

EJEMPLO

       Crear un mensaje rtnetlink para configurar la MTU de un dispositivo.
            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);

FALLOS

       Esta página de manual es escasa e incompleta.

VÉASE TAMBIÉN

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