]>
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>
14 static int error_handler(struct sockaddr_nl
*nla
, struct nlmsgerr
*err
,
22 static int ack_handler(struct nl_msg
*msg
, void *arg
)
34 static int family_handler(struct nl_msg
*msg
, void *arg
)
36 struct handler_args
*grp
= arg
;
37 struct nlattr
*tb
[CTRL_ATTR_MAX
+ 1];
38 struct genlmsghdr
*gnlh
= nlmsg_data(nlmsg_hdr(msg
));
42 nla_parse(tb
, CTRL_ATTR_MAX
, genlmsg_attrdata(gnlh
, 0),
43 genlmsg_attrlen(gnlh
, 0), NULL
);
45 if (!tb
[CTRL_ATTR_MCAST_GROUPS
])
48 nla_for_each_nested(mcgrp
, tb
[CTRL_ATTR_MCAST_GROUPS
], rem_mcgrp
) {
49 struct nlattr
*tb_mcgrp
[CTRL_ATTR_MCAST_GRP_MAX
+ 1];
51 nla_parse(tb_mcgrp
, CTRL_ATTR_MCAST_GRP_MAX
,
52 nla_data(mcgrp
), nla_len(mcgrp
), NULL
);
54 if (!tb_mcgrp
[CTRL_ATTR_MCAST_GRP_NAME
] ||
55 !tb_mcgrp
[CTRL_ATTR_MCAST_GRP_ID
])
57 if (strncmp(nla_data(tb_mcgrp
[CTRL_ATTR_MCAST_GRP_NAME
]),
58 grp
->group
, nla_len(tb_mcgrp
[CTRL_ATTR_MCAST_GRP_NAME
])))
60 grp
->id
= nla_get_u32(tb_mcgrp
[CTRL_ATTR_MCAST_GRP_ID
]);
67 int nl_get_multicast_id(struct nl_sock
*sock
, const char *family
, const char *group
)
72 struct handler_args grp
= {
81 cb
= nl_cb_alloc(NL_CB_DEFAULT
);
87 ctrlid
= genl_ctrl_resolve(sock
, "nlctrl");
89 genlmsg_put(msg
, 0, 0, ctrlid
, 0,
90 0, CTRL_CMD_GETFAMILY
, 0);
93 NLA_PUT_STRING(msg
, CTRL_ATTR_FAMILY_NAME
, family
);
95 ret
= nl_send_auto_complete(sock
, msg
);
101 nl_cb_err(cb
, NL_CB_CUSTOM
, error_handler
, &ret
);
102 nl_cb_set(cb
, NL_CB_ACK
, NL_CB_CUSTOM
, ack_handler
, &ret
);
103 nl_cb_set(cb
, NL_CB_VALID
, NL_CB_CUSTOM
, family_handler
, &grp
);
106 nl_recvmsgs(sock
, cb
);