rtnetlink - макросы для обработки сообщений rtnetlink
НАЗВАНИЕrtnetlink - макросы для обработки сообщений rtnetlink
СИНТАКСИС
#include
#include
#include
#include 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);
ОПИСАНИЕ
Все сообщения rtnetlink(7) состоят из заголовков сообщений
netlink(7) и приcоединенных к ним атрибутов. Атрибуты
могут быть обработаны только описанными здесь макросами.
RTA_OK(rta, attrlen) возвращает значение "истина" в
случае, если rta указывает на правильный атрибут
маршрутизации; attrlen - рабочая длина буфера атрибутов.
Если возвращенное значение ложно, то в сообщении больше
нет атрибутов, даже если attrlen не равно нулю.
RTA_DATA(rta) возвращает указатель на начало данных
атрибута.
RTA_PAYLOAD(rta) возвращает длину данных атрибута.
RTA_NEXT(rta, attrlen) считывает следующий за rta атрибут.
Вызов этого макроса обновит attrlen. Для проверки
правильности указателя используйте RTA_OK.
RTA_LENGTH(len) возвращает длину размером len байтов
данных (плюс заголовок).
RTA_SPACE(len) возвращает объем памяти, требуемый для
сообщения и равный len байтам.
ПРИМЕР
Создание сообщения rtnetlink для установки MTU устройства:
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);
НАЙДЕННЫЕ ОШИБКИ
Это руководство является незаконченным.