rtnetlink - macros para manipular mensajes rtnetlink
Biblioteca Estándar C (
libc,
-lc)
#include <asm/types.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <sys/socket.h>
rtnetlink_socket = socket(AF_NETLINK, int tipo_conector, 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 longitud);
unsigned int RTA_SPACE(unsigned int longitud);
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.
Estas macros son extensiones no estándar de Linux
Esta página de manual esta incompleta.
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);
netlink(3),
netlink(7),
rtnetlink(7)
La traducción al español de esta página del manual fue
creada por Juan Piernas <
[email protected]> y Marcos Fouces
<
[email protected]>
Esta traducción es documentación libre; lea la
GNU
General Public License Version 3 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
[email protected]