+static int __nl_error_handler(struct sockaddr_nl* nla, struct nlmsgerr* err, void* data) {
+ struct network_netlink_message_status* status = data;
+ status->r = 0;
+
+ struct nlattr *attrs;
+ struct nlattr *tb[NLMSGERR_ATTR_MAX + 1];
+ struct nlmsghdr* nlh = (struct nlmsghdr*)err - 1;
+
+ size_t len = nlh->nlmsg_len;
+ size_t ack_len = sizeof(*nlh) + sizeof(int) + sizeof(*nlh);
+
+ status->r = err->error;
+ if (!(nlh->nlmsg_flags & NLM_F_ACK_TLVS))
+ return NL_STOP;
+
+ if (!(nlh->nlmsg_flags & NLM_F_CAPPED))
+ ack_len += err->msg.nlmsg_len - sizeof(*nlh);
+
+ if (len <= ack_len)
+ return NL_STOP;
+
+ attrs = (void *)((unsigned char *)nlh + ack_len);
+ len -= ack_len;
+
+ nla_parse(tb, NLMSGERR_ATTR_MAX, attrs, len, NULL);
+ if (tb[NLMSGERR_ATTR_MSG]) {
+ len = strnlen((char *)nla_data(tb[NLMSGERR_ATTR_MSG]),
+ nla_len(tb[NLMSGERR_ATTR_MSG]));
+
+ ERROR(status->ctx, "Kernel reports: %*s\n", len,
+ (const char *)nla_data(tb[NLMSGERR_ATTR_MSG]));
+ }
+
+ return NL_STOP;
+}
+