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
байтам.
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);
|
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |