]>
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
,
52 struct nlmsghdr
*answer
;
55 addattr_l(&req
.n
, sizeof(req
), CTRL_ATTR_FAMILY_NAME
,
56 family
, strlen(family
) + 1);
58 if (rtnl_talk(grth
, &req
.n
, &answer
) < 0) {
59 fprintf(stderr
, "Error talking to the kernel\n");
63 fnum
= genl_parse_getfamily(answer
);
69 int genl_init_handle(struct rtnl_handle
*grth
, const char *family
,
72 if (*genl_family
>= 0)
75 if (rtnl_open_byproto(grth
, 0, NETLINK_GENERIC
) < 0) {
76 fprintf(stderr
, "Cannot open generic netlink socket\n");
80 *genl_family
= genl_resolve_family(grth
, family
);