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'ON

       Todos  los  mensajes  rtnetlink(7)  estan  formados por una cabecera de
       mensaje netlink(7) y atributos anadidos. Los  atributos  solo  deberian
       ser manipulados usando las macros suministradas aqui.

       RTA_OK(rta,  attrlen) devuelve verdadero si rta apunta a un atributo de
       enrutamiento valido.  attrlen es  la  longitud  actual  del  buffer  de
       atributos.   Cuando es falso debe asumir que no hay mas 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 despues de rta.
       Al llamar a esta macro se actualizara  attrlen.   Deberia  usar  RTA_OK
       para comprobar la validez del puntero devuelto.
       RTA_LENGTH(len)  devuelve la longitud que se necesita para len bytes de
       datos mas la cabecera.
       RTA_SPACE(len) devuelve la cantidad de espacio que se necesitaran 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 pagina de manual es escasa e incompleta.

V'EASE TAMBI'EN

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

Pagina man de Linux              14 mayo 1999                     RTNETLINK(3)