]>
git.ipfire.org Git - thirdparty/iw.git/blob - genl.c
2 * This ought to be provided by libnl
6 #include <netlink/genl/genl.h>
7 #include <netlink/genl/family.h>
8 #include <netlink/genl/ctrl.h>
9 #include <netlink/msg.h>
10 #include <netlink/attr.h>
12 static int error_handler(struct sockaddr_nl
*nla
, struct nlmsgerr
*err
,
20 static int ack_handler(struct nl_msg
*msg
, void *arg
)
32 static int family_handler(struct nl_msg
*msg
, void *arg
)
34 struct handler_args
*grp
= arg
;
35 struct nlattr
*tb
[CTRL_ATTR_MAX
+ 1];
36 struct genlmsghdr
*gnlh
= nlmsg_data(nlmsg_hdr(msg
));
40 nla_parse(tb
, CTRL_ATTR_MAX
, genlmsg_attrdata(gnlh
, 0),
41 genlmsg_attrlen(gnlh
, 0), NULL
);
43 if (!tb
[CTRL_ATTR_MCAST_GROUPS
])
46 nla_for_each_nested(mcgrp
, tb
[CTRL_ATTR_MCAST_GROUPS
], rem_mcgrp
) {
47 struct nlattr
*tb_mcgrp
[CTRL_ATTR_MCAST_GRP_MAX
+ 1];
49 nla_parse(tb_mcgrp
, CTRL_ATTR_MCAST_GRP_MAX
,
50 nla_data(mcgrp
), nla_len(mcgrp
), NULL
);
52 if (!tb_mcgrp
[CTRL_ATTR_MCAST_GRP_NAME
] ||
53 !tb_mcgrp
[CTRL_ATTR_MCAST_GRP_ID
])
55 if (strncmp(nla_data(tb_mcgrp
[CTRL_ATTR_MCAST_GRP_NAME
]),
56 grp
->group
, nla_len(tb_mcgrp
[CTRL_ATTR_MCAST_GRP_NAME
])))
58 grp
->id
= nla_get_u32(tb_mcgrp
[CTRL_ATTR_MCAST_GRP_ID
]);
65 int nl_get_multicast_id(struct nl_handle
*handle
, const char *family
, const char *group
)
70 struct handler_args grp
= {
79 cb
= nl_cb_alloc(NL_CB_DEFAULT
);
85 ctrlid
= genl_ctrl_resolve(handle
, "nlctrl");
87 genlmsg_put(msg
, 0, 0, ctrlid
, 0,
88 0, CTRL_CMD_GETFAMILY
, 0);
91 NLA_PUT_STRING(msg
, CTRL_ATTR_FAMILY_NAME
, family
);
93 ret
= nl_send_auto_complete(handle
, msg
);
99 nl_cb_err(cb
, NL_CB_CUSTOM
, error_handler
, &ret
);
100 nl_cb_set(cb
, NL_CB_ACK
, NL_CB_CUSTOM
, ack_handler
, &ret
);
101 nl_cb_set(cb
, NL_CB_VALID
, NL_CB_CUSTOM
, family_handler
, &grp
);
104 nl_recvmsgs(handle
, cb
);