Manpages

名 前

rtnetlink − rtnetlink メ ッ セ ー ジ を 操 作 す る マ ク ロ

書 式

#include <asm/types.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <sys/socket.h>

rtnetlink_socket = socket(AF_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) メ ッ セ ー ジ ヘ ッ ダ ー と 追 加 属 性 か ら な る 。 属 性 の 操 作 は 、 必 ず こ こ に 挙 げ た マ ク ロ だ け を 使 っ て 行 う べ き で あ る 。

RTA_OK(rta, attrlen)rta が 有 効 な ル ー テ ィ ン グ 属 性 へ の ポ イ ン タ ー で あ れ ば 真 を 返 す 。 attrlen は 属 性 バ ッ フ ァ ー の 実 働 時 の 長 さ (running length) で あ る 。 真 で な け れ ば 、 例 え attrlen が ゼ ロ で な く て も 、 メ ッ セ ー ジ 中 に は も う そ れ 以 上 属 性 は 無 い と 考 え な け れ ば な ら な い 。

RTA_DATA(rta) は こ の 属 性 デ ー タ の 先 頭 へ の ポ イ ン タ ー を 返 す 。

RTA_PAYLOAD(rta) は こ の 属 性 デ ー タ の 長 さ を 返 す 。

RTA_NEXT(rta, attrlen)rta の 次 に あ る 属 性 を 取 得 す る 。 こ の マ ク ロ を 呼 ぶ と attrlen が 更 新 さ れ る 。 RTA_OK を 使 っ て 、 返 さ れ た ポ イ ン タ ー が 正 し い か を チ ェ ッ ク す べ き で あ る 。

RTA_LENGTH(len)len バ イ ト の デ ー タ + ヘ ッ ダ ー に 必 要 な 長 さ を 返 す 。

RTA_SPACE(len)len バ イ ト の デ ー タ を 持 つ メ ッ セ ー ジ に 必 要 と さ れ る 容 量 を 返 す 。

準 拠

こ れ ら の マ ク ロ は 非 標 準 で 、 Linux で の 拡 張 で あ る 。

バ グ

こ の マ ニ ュ ア ル は 完 全 で は な い 。

デ バ イ ス の MTU を セ ッ ト す る rtnetlink メ ッ セ ー ジ を 生 成 す る

#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(struct ifinfomsg));
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(unsigned int));
req.n.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)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。