static int kvp_handle_handshake(struct hv_kvp_msg *msg) { switch (msg->kvp_hdr.operation) { case KVP_OP_REGISTER: dm_reg_value = KVP_OP_REGISTER; pr_info("KVP: IP injection functionality not available\n"); pr_info("KVP: Upgrade the KVP daemon\n"); break; case KVP_OP_REGISTER1: dm_reg_value = KVP_OP_REGISTER1; break; default: pr_info("KVP: incompatible daemon\n"); pr_info("KVP: KVP version: %d, Daemon version: %d\n", KVP_OP_REGISTER1, msg->kvp_hdr.operation); return -EINVAL; } /* * We have a compatible daemon; complete the handshake. */ pr_debug("KVP: userspace daemon ver. %d registered\n", KVP_OP_REGISTER); kvp_register(dm_reg_value); hv_poll_channel(kvp_transaction.recv_channel, kvp_poll_wrapper); return 0; }
static int kvp_handle_handshake(struct hv_kvp_msg *msg) { int ret = 1; switch (msg->kvp_hdr.operation) { case KVP_OP_REGISTER: dm_reg_value = KVP_OP_REGISTER; pr_info("KVP: IP injection functionality not available\n"); pr_info("KVP: Upgrade the KVP daemon\n"); break; case KVP_OP_REGISTER1: dm_reg_value = KVP_OP_REGISTER1; break; default: pr_info("KVP: incompatible daemon\n"); pr_info("KVP: KVP version: %d, Daemon version: %d\n", KVP_OP_REGISTER1, msg->kvp_hdr.operation); ret = 0; } if (ret) { /* * We have a compatible daemon; complete the handshake. */ pr_info("KVP: user-mode registering done.\n"); kvp_register(dm_reg_value); kvp_transaction.active = false; if (kvp_transaction.kvp_context) poll_channel(kvp_transaction.kvp_context); } return ret; }
static void kvp_cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) { struct hv_ku_msg *message; message = (struct hv_ku_msg *)msg->data; if (msg->seq == KVP_REGISTER) { pr_info("KVP: user-mode registering done.\n"); kvp_register(); } if (msg->seq == KVP_USER_SET) { /* * Complete the transaction by forwarding the key value * to the host. But first, cancel the timeout. */ if (cancel_delayed_work_sync(&kvp_work)) kvp_respond_to_host(message->kvp_key, message->kvp_value, !strlen(message->kvp_key)); } }