Drivers: hv: Add new message types to enhance KVP

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>
This commit is contained in:
K. Y. Srinivasan 2012-03-10 15:32:08 -08:00 committed by Greg Kroah-Hartman
parent 04bf30115f
commit e485ceac9e
3 changed files with 31 additions and 6 deletions

View File

@ -78,7 +78,7 @@ kvp_register(void)
if (msg) { if (msg) {
kvp_msg = (struct hv_kvp_msg *)msg->data; 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.idx = CN_KVP_IDX;
msg->id.val = CN_KVP_VAL; 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. * to the host. But first, cancel the timeout.
*/ */
if (cancel_delayed_work_sync(&kvp_work)) 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)); !strlen(data->data.key));
} }
} }

View File

@ -149,7 +149,11 @@ struct hv_kvp_exchg_msg_value {
__u32 key_size; __u32 key_size;
__u32 value_size; __u32 value_size;
__u8 key[HV_KVP_EXCHANGE_MAX_KEY_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)); } __attribute__((packed));
struct hv_kvp_msg_enumerate { struct hv_kvp_msg_enumerate {
@ -157,11 +161,31 @@ struct hv_kvp_msg_enumerate {
struct hv_kvp_exchg_msg_value data; struct hv_kvp_exchg_msg_value data;
} __attribute__((packed)); } __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_msg {
struct hv_kvp_hdr kvp_hdr; struct hv_kvp_hdr kvp_hdr;
union { union {
struct hv_kvp_msg_enumerate kvp_enum_data; struct hv_kvp_msg_get kvp_get;
char kvp_version[HV_KVP_EXCHANGE_MAX_KEY_SIZE]; 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; } body;
} __attribute__((packed)); } __attribute__((packed));

View File

@ -378,7 +378,7 @@ int main(void)
* Driver is registering with us; stash away the version * Driver is registering with us; stash away the version
* information. * information.
*/ */
p = (char *)hv_msg->body.kvp_version; p = (char *)hv_msg->body.kvp_register.version;
lic_version = malloc(strlen(p) + 1); lic_version = malloc(strlen(p) + 1);
if (lic_version) { if (lic_version) {
strcpy(lic_version, p); strcpy(lic_version, p);