11 #include <libmnl/libmnl.h>
14 static int mnl_cb_noop(
const struct nlmsghdr *nlh,
void *data)
19 static int mnl_cb_error(
const struct nlmsghdr *nlh,
void *data)
33 return err->error == 0 ? MNL_CB_STOP : MNL_CB_ERROR;
36 static int mnl_cb_stop(
const struct nlmsghdr *nlh,
void *data)
41 static const mnl_cb_t default_cb_array[NLMSG_MIN_TYPE] = {
42 [NLMSG_NOOP] = mnl_cb_noop,
43 [NLMSG_ERROR] = mnl_cb_error,
44 [NLMSG_DONE] = mnl_cb_stop,
45 [NLMSG_OVERRUN] = mnl_cb_noop,
49 __mnl_cb_run(
const void *buf,
size_t numbytes,
unsigned int seq,
50 unsigned int portid, mnl_cb_t cb_data,
void *data,
51 mnl_cb_t *cb_ctl_array,
unsigned int cb_ctl_array_len)
53 int ret = MNL_CB_OK, len = numbytes;
54 const struct nlmsghdr *nlh = buf;
69 if (nlh->nlmsg_type >= NLMSG_MIN_TYPE) {
71 ret = cb_data(nlh, data);
72 if (ret <= MNL_CB_STOP)
75 }
else if (nlh->nlmsg_type < cb_ctl_array_len) {
76 if (cb_ctl_array && cb_ctl_array[nlh->nlmsg_type]) {
77 ret = cb_ctl_array[nlh->nlmsg_type](nlh, data);
78 if (ret <= MNL_CB_STOP)
81 }
else if (default_cb_array[nlh->nlmsg_type]) {
82 ret = default_cb_array[nlh->nlmsg_type](nlh, data);
83 if (ret <= MNL_CB_STOP)
124 unsigned int portid, mnl_cb_t cb_data,
void *data,
125 mnl_cb_t *cb_ctl_array,
unsigned int cb_ctl_array_len)
127 return __mnl_cb_run(buf, numbytes, seq, portid, cb_data, data,
128 cb_ctl_array, cb_ctl_array_len);
152 mnl_cb_run(
const void *buf,
size_t numbytes,
unsigned int seq,
153 unsigned int portid, mnl_cb_t cb_data,
void *data)
155 return __mnl_cb_run(buf, numbytes, seq, portid, cb_data, data, NULL, 0);