Provided by:
manpages-es_1.55-10_all 
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)