Ejemplo n.º 1
0
/**
 * @note "ACK messages also use the message type NLMSG_ERROR and payload format
 * but the error code is set to 0."
 * (http://www.infradead.org/~tgr/libnl/doc/core.html#core_msg_ack)
 */
static int respond_error(struct nlmsghdr *nl_hdr_in, int error)
{
	struct nlmsgerr hdr_out;
	__u8 *payload = NULL;
	char *error_msg;
	unsigned int error_msg_len;

	hdr_out.error = abs(error);
	hdr_out.msg = *nl_hdr_in;
	hdr_out.msg.nlmsg_len = 0;

	if (error_pool_get_message(&error_msg, &error_msg_len)) {
		pr_err("could not get error message from pool.\n");
		goto respond_error_on_failure;
	}

	hdr_out.msg.nlmsg_len = sizeof(hdr_out) + error_msg_len + 1;

	payload = kmalloc(hdr_out.msg.nlmsg_len, GFP_KERNEL);
	if (!payload) {
		pr_err("could not allocate memory for error payload!\n");
		kfree(error_msg);
		goto respond_error_on_failure;
	}

	memcpy(payload, (__u8*)&hdr_out, sizeof(hdr_out));
	memcpy(payload + sizeof(hdr_out), (__u8*)error_msg, error_msg_len + 1);

	error = respond_single_msg(nl_hdr_in, NLMSG_ERROR, payload,
			hdr_out.msg.nlmsg_len);

	kfree(error_msg);
	kfree(payload);

	return error;

respond_error_on_failure:
	return respond_single_msg(nl_hdr_in, NLMSG_ERROR, &hdr_out,
			sizeof(hdr_out));
}
Ejemplo n.º 2
0
/**
 * @note "ACK messages also use the message type NLMSG_ERROR and payload format but the error code
 * is set to 0." (http://www.infradead.org/~tgr/libnl/doc/core.html#core_msg_ack).
 */
static int respond_error(struct nlmsghdr *nl_hdr_in, int error)
{
	struct nlmsgerr payload = { abs(error), *nl_hdr_in };
	return respond_single_msg(nl_hdr_in, NLMSG_ERROR, &payload, sizeof(payload));
}
Ejemplo n.º 3
0
static int respond_setcfg(struct nlmsghdr *nl_hdr_in, void *payload, int payload_len)
{
	return respond_single_msg(nl_hdr_in, MSG_SETCFG, payload, payload_len);
}