]>
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>
11 #include <linux/genetlink.h>
15 static int error_handler(struct sockaddr_nl
*nla
, struct nlmsgerr
*err
,
23 static int ack_handler(struct nl_msg
*msg
, void *arg
)
35 static int family_handler(struct nl_msg
*msg
, void *arg
)
37 struct handler_args
*grp
= arg
;
38 struct nlattr
*tb
[CTRL_ATTR_MAX
+ 1];
39 struct genlmsghdr
*gnlh
= nlmsg_data(nlmsg_hdr(msg
));
43 nla_parse(tb
, CTRL_ATTR_MAX
, genlmsg_attrdata(gnlh
, 0),
44 genlmsg_attrlen(gnlh
, 0), NULL
);
46 if (!tb
[CTRL_ATTR_MCAST_GROUPS
])
49 nla_for_each_nested(mcgrp
, tb
[CTRL_ATTR_MCAST_GROUPS
], rem_mcgrp
) {
50 struct nlattr
*tb_mcgrp
[CTRL_ATTR_MCAST_GRP_MAX
+ 1];
52 nla_parse(tb_mcgrp
, CTRL_ATTR_MCAST_GRP_MAX
,
53 nla_data(mcgrp
), nla_len(mcgrp
), NULL
);
55 if (!tb_mcgrp
[CTRL_ATTR_MCAST_GRP_NAME
] ||
56 !tb_mcgrp
[CTRL_ATTR_MCAST_GRP_ID
])
58 if (strncmp(nla_data(tb_mcgrp
[CTRL_ATTR_MCAST_GRP_NAME
]),
59 grp
->group
, nla_len(tb_mcgrp
[CTRL_ATTR_MCAST_GRP_NAME
])))
61 grp
->id
= nla_get_u32(tb_mcgrp
[CTRL_ATTR_MCAST_GRP_ID
]);
68 int nl_get_multicast_id(struct nl_sock
*sock
, const char *family
, const char *group
)
73 struct handler_args grp
= {
82 cb
= nl_cb_alloc(NL_CB_DEFAULT
);
88 ctrlid
= genl_ctrl_resolve(sock
, "nlctrl");
90 genlmsg_put(msg
, 0, 0, ctrlid
, 0,
91 0, CTRL_CMD_GETFAMILY
, 0);
94 NLA_PUT_STRING(msg
, CTRL_ATTR_FAMILY_NAME
, family
);
96 ret
= nl_send_auto_complete(sock
, msg
);
102 nl_cb_err(cb
, NL_CB_CUSTOM
, error_handler
, &ret
);
103 nl_cb_set(cb
, NL_CB_ACK
, NL_CB_CUSTOM
, ack_handler
, &ret
);
104 nl_cb_set(cb
, NL_CB_VALID
, NL_CB_CUSTOM
, family_handler
, &grp
);
107 nl_recvmsgs(sock
, cb
);