Drivers: hv: Add new message types to enhance KVP
authorK. Y. Srinivasan <kys@microsoft.com>
Sat, 10 Mar 2012 23:32:08 +0000 (15:32 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 13 Mar 2012 21:35:25 +0000 (14:35 -0700)
Add additional KVP (Key Value Pair) protocol  messages to
enhance KVP functionality for Linux guests on Hyper-V. As part of this,
patch define an explicit version negoitiation message.

Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hv/hv_kvp.c
include/linux/hyperv.h
tools/hv/hv_kvp_daemon.c

index 0ef4c1f6ca54b5c8325dbc1e36b1a379ae8f4cec..779109b6f4f02665684a6928fd444c163b65d26c 100644 (file)
@@ -78,7 +78,7 @@ kvp_register(void)
 
        if (msg) {
                kvp_msg = (struct hv_kvp_msg *)msg->data;
-               version = kvp_msg->body.kvp_version;
+               version = kvp_msg->body.kvp_register.version;
                msg->id.idx =  CN_KVP_IDX;
                msg->id.val = CN_KVP_VAL;
 
@@ -122,7 +122,8 @@ kvp_cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp)
                 * to the host. But first, cancel the timeout.
                 */
                if (cancel_delayed_work_sync(&kvp_work))
-                       kvp_respond_to_host(data->data.key, data->data.value,
+                       kvp_respond_to_host(data->data.key,
+                                        data->data.value,
                                        !strlen(data->data.key));
        }
 }
index e57a6c6ee0e86370ffc543b7716062a8868c483e..a2d8c547f91b14b7d9d47869bf82f3b6eb90dc23 100644 (file)
@@ -149,7 +149,11 @@ struct hv_kvp_exchg_msg_value {
        __u32 key_size;
        __u32 value_size;
        __u8 key[HV_KVP_EXCHANGE_MAX_KEY_SIZE];
-       __u8 value[HV_KVP_EXCHANGE_MAX_VALUE_SIZE];
+       union {
+               __u8 value[HV_KVP_EXCHANGE_MAX_VALUE_SIZE];
+               __u32 value_u32;
+               __u64 value_u64;
+       };
 } __attribute__((packed));
 
 struct hv_kvp_msg_enumerate {
@@ -157,11 +161,31 @@ struct hv_kvp_msg_enumerate {
        struct hv_kvp_exchg_msg_value data;
 } __attribute__((packed));
 
+struct hv_kvp_msg_get {
+       struct hv_kvp_exchg_msg_value data;
+};
+
+struct hv_kvp_msg_set {
+       struct hv_kvp_exchg_msg_value data;
+};
+
+struct hv_kvp_msg_delete {
+       __u32 key_size;
+       __u8 key[HV_KVP_EXCHANGE_MAX_KEY_SIZE];
+};
+
+struct hv_kvp_register {
+       __u8 version[HV_KVP_EXCHANGE_MAX_KEY_SIZE];
+};
+
 struct hv_kvp_msg {
        struct hv_kvp_hdr       kvp_hdr;
        union {
-               struct hv_kvp_msg_enumerate     kvp_enum_data;
-               char    kvp_version[HV_KVP_EXCHANGE_MAX_KEY_SIZE];
+               struct hv_kvp_msg_get           kvp_get;
+               struct hv_kvp_msg_set           kvp_set;
+               struct hv_kvp_msg_delete        kvp_delete;
+               struct hv_kvp_msg_enumerate     kvp_enum_data;
+               struct hv_kvp_register          kvp_register;
        } body;
 } __attribute__((packed));
 
index 4ebf70380582e31f168418d0d656e2b128d10b2d..00d3f7c099e0c64a19699eccd9470cdab3e0e8a9 100644 (file)
@@ -378,7 +378,7 @@ int main(void)
                         * Driver is registering with us; stash away the version
                         * information.
                         */
-                       p = (char *)hv_msg->body.kvp_version;
+                       p = (char *)hv_msg->body.kvp_register.version;
                        lic_version = malloc(strlen(p) + 1);
                        if (lic_version) {
                                strcpy(lic_version, p);