]>
git.proxmox.com Git - mirror_iproute2.git/blob - lib/libgenl.c
2 * libgenl.c GENL library
9 #include <linux/genetlink.h>
12 static int genl_parse_getfamily(struct nlmsghdr
*nlh
)
14 struct rtattr
*tb
[CTRL_ATTR_MAX
+ 1];
15 struct genlmsghdr
*ghdr
= NLMSG_DATA(nlh
);
16 int len
= nlh
->nlmsg_len
;
19 if (nlh
->nlmsg_type
!= GENL_ID_CTRL
) {
20 fprintf(stderr
, "Not a controller message, nlmsg_len=%d "
21 "nlmsg_type=0x%x\n", nlh
->nlmsg_len
, nlh
->nlmsg_type
);
25 len
-= NLMSG_LENGTH(GENL_HDRLEN
);
28 fprintf(stderr
, "wrong controller message len %d\n", len
);
32 if (ghdr
->cmd
!= CTRL_CMD_NEWFAMILY
) {
33 fprintf(stderr
, "Unknown controller command %d\n", ghdr
->cmd
);
37 attrs
= (struct rtattr
*) ((char *) ghdr
+ GENL_HDRLEN
);
38 parse_rtattr(tb
, CTRL_ATTR_MAX
, attrs
, len
);
40 if (tb
[CTRL_ATTR_FAMILY_ID
] == NULL
) {
41 fprintf(stderr
, "Missing family id TLV\n");
45 return rta_getattr_u16(tb
[CTRL_ATTR_FAMILY_ID
]);
48 int genl_resolve_family(struct rtnl_handle
*grth
, const char *family
)
50 GENL_REQUEST(req
, 1024, GENL_ID_CTRL
, 0, 0, CTRL_CMD_GETFAMILY
,
53 addattr_l(&req
.n
, sizeof(req
), CTRL_ATTR_FAMILY_NAME
,
54 family
, strlen(family
) + 1);
56 if (rtnl_talk(grth
, &req
.n
, &req
.n
, sizeof(req
)) < 0) {
57 fprintf(stderr
, "Error talking to the kernel\n");
61 return genl_parse_getfamily(&req
.n
);