1 /* 2 * An implementation of key value pair (KVP) functionality for Linux. 3 * 4 * 5 * Copyright (C) 2010, Novell, Inc. 6 * Author : K. Y. Srinivasan <ksrinivasan@novell.com> 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License version 2 as published 10 * by the Free Software Foundation. 11 * 12 * This program is distributed in the hope that it will be useful, but 13 * WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 15 * NON INFRINGEMENT. See the GNU General Public License for more 16 * details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 21 * 22 */ 23 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 24 25 #include <linux/net.h> 26 #include <linux/nls.h> 27 #include <linux/connector.h> 28 #include <linux/workqueue.h> 29 #include <linux/hyperv.h> 30 31 32 /* 33 * Pre win8 version numbers used in ws2008 and ws 2008 r2 (win7) 34 */ 35 #define WS2008_SRV_MAJOR 1 36 #define WS2008_SRV_MINOR 0 37 #define WS2008_SRV_VERSION (WS2008_SRV_MAJOR << 16 | WS2008_SRV_MINOR) 38 39 #define WIN7_SRV_MAJOR 3 40 #define WIN7_SRV_MINOR 0 41 #define WIN7_SRV_VERSION (WIN7_SRV_MAJOR << 16 | WIN7_SRV_MINOR) 42 43 #define WIN8_SRV_MAJOR 4 44 #define WIN8_SRV_MINOR 0 45 #define WIN8_SRV_VERSION (WIN8_SRV_MAJOR << 16 | WIN8_SRV_MINOR) 46 47 /* 48 * Global state maintained for transaction that is being processed. 49 * Note that only one transaction can be active at any point in time. 50 * 51 * This state is set when we receive a request from the host; we 52 * cleanup this state when the transaction is completed - when we respond 53 * to the host with the key value. 54 */ 55 56 static struct { 57 bool active; /* transaction status - active or not */ 58 int recv_len; /* number of bytes received. */ 59 struct hv_kvp_msg *kvp_msg; /* current message */ 60 struct vmbus_channel *recv_channel; /* chn we got the request */ 61 u64 recv_req_id; /* request ID. */ 62 void *kvp_context; /* for the channel callback */ 63 } kvp_transaction; 64 65 /* 66 * Before we can accept KVP messages from the host, we need 67 * to handshake with the user level daemon. This state tracks 68 * if we are in the handshake phase. 69 */ 70 static bool in_hand_shake = true; 71 72 /* 73 * This state maintains the version number registered by the daemon. 74 */ 75 static int dm_reg_value; 76 77 static void kvp_send_key(struct work_struct *dummy); 78 79 80 static void kvp_respond_to_host(struct hv_kvp_msg *msg, int error); 81 static void kvp_work_func(struct work_struct *dummy); 82 static void kvp_register(int); 83 84 static DECLARE_DELAYED_WORK(kvp_work, kvp_work_func); 85 static DECLARE_WORK(kvp_sendkey_work, kvp_send_key); 86 87 static struct cb_id kvp_id = { CN_KVP_IDX, CN_KVP_VAL }; 88 static const char kvp_name[] = "kvp_kernel_module"; 89 static u8 *recv_buffer; 90 /* 91 * Register the kernel component with the user-level daemon. 92 * As part of this registration, pass the LIC version number. 93 * This number has no meaning, it satisfies the registration protocol. 94 */ 95 #define HV_DRV_VERSION "3.1" 96 97 static void 98 kvp_register(int reg_value) 99 { 100 101 struct cn_msg *msg; 102 struct hv_kvp_msg *kvp_msg; 103 char *version; 104 105 msg = kzalloc(sizeof(*msg) + sizeof(struct hv_kvp_msg), GFP_ATOMIC); 106 107 if (msg) { 108 kvp_msg = (struct hv_kvp_msg *)msg->data; 109 version = kvp_msg->body.kvp_register.version; 110 msg->id.idx = CN_KVP_IDX; 111 msg->id.val = CN_KVP_VAL; 112 113 kvp_msg->kvp_hdr.operation = reg_value; 114 strcpy(version, HV_DRV_VERSION); 115 msg->len = sizeof(struct hv_kvp_msg); 116 cn_netlink_send(msg, 0, 0, GFP_ATOMIC); 117 kfree(msg); 118 } 119 } 120 static void 121 kvp_work_func(struct work_struct *dummy) 122 { 123 /* 124 * If the timer fires, the user-mode component has not responded; 125 * process the pending transaction. 126 */ 127 kvp_respond_to_host(NULL, HV_E_FAIL); 128 } 129 130 static void poll_channel(struct vmbus_channel *channel) 131 { 132 if (channel->target_cpu != smp_processor_id()) 133 smp_call_function_single(channel->target_cpu, 134 hv_kvp_onchannelcallback, 135 channel, true); 136 else 137 hv_kvp_onchannelcallback(channel); 138 } 139 140 141 static int kvp_handle_handshake(struct hv_kvp_msg *msg) 142 { 143 int ret = 1; 144 145 switch (msg->kvp_hdr.operation) { 146 case KVP_OP_REGISTER: 147 dm_reg_value = KVP_OP_REGISTER; 148 pr_info("KVP: IP injection functionality not available\n"); 149 pr_info("KVP: Upgrade the KVP daemon\n"); 150 break; 151 case KVP_OP_REGISTER1: 152 dm_reg_value = KVP_OP_REGISTER1; 153 break; 154 default: 155 pr_info("KVP: incompatible daemon\n"); 156 pr_info("KVP: KVP version: %d, Daemon version: %d\n", 157 KVP_OP_REGISTER1, msg->kvp_hdr.operation); 158 ret = 0; 159 } 160 161 if (ret) { 162 /* 163 * We have a compatible daemon; complete the handshake. 164 */ 165 pr_info("KVP: user-mode registering done.\n"); 166 kvp_register(dm_reg_value); 167 kvp_transaction.active = false; 168 if (kvp_transaction.kvp_context) 169 poll_channel(kvp_transaction.kvp_context); 170 } 171 return ret; 172 } 173 174 175 /* 176 * Callback when data is received from user mode. 177 */ 178 179 static void 180 kvp_cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) 181 { 182 struct hv_kvp_msg *message; 183 struct hv_kvp_msg_enumerate *data; 184 int error = 0; 185 186 message = (struct hv_kvp_msg *)msg->data; 187 188 /* 189 * If we are negotiating the version information 190 * with the daemon; handle that first. 191 */ 192 193 if (in_hand_shake) { 194 if (kvp_handle_handshake(message)) 195 in_hand_shake = false; 196 return; 197 } 198 199 /* 200 * Based on the version of the daemon, we propagate errors from the 201 * daemon differently. 202 */ 203 204 data = &message->body.kvp_enum_data; 205 206 switch (dm_reg_value) { 207 case KVP_OP_REGISTER: 208 /* 209 * Null string is used to pass back error condition. 210 */ 211 if (data->data.key[0] == 0) 212 error = HV_S_CONT; 213 break; 214 215 case KVP_OP_REGISTER1: 216 /* 217 * We use the message header information from 218 * the user level daemon to transmit errors. 219 */ 220 error = message->error; 221 break; 222 } 223 224 /* 225 * Complete the transaction by forwarding the key value 226 * to the host. But first, cancel the timeout. 227 */ 228 if (cancel_delayed_work_sync(&kvp_work)) 229 kvp_respond_to_host(message, error); 230 } 231 232 233 static int process_ob_ipinfo(void *in_msg, void *out_msg, int op) 234 { 235 struct hv_kvp_msg *in = in_msg; 236 struct hv_kvp_ip_msg *out = out_msg; 237 int len; 238 239 switch (op) { 240 case KVP_OP_GET_IP_INFO: 241 /* 242 * Transform all parameters into utf16 encoding. 243 */ 244 len = utf8s_to_utf16s((char *)in->body.kvp_ip_val.ip_addr, 245 strlen((char *)in->body.kvp_ip_val.ip_addr), 246 UTF16_HOST_ENDIAN, 247 (wchar_t *)out->kvp_ip_val.ip_addr, 248 MAX_IP_ADDR_SIZE); 249 if (len < 0) 250 return len; 251 252 len = utf8s_to_utf16s((char *)in->body.kvp_ip_val.sub_net, 253 strlen((char *)in->body.kvp_ip_val.sub_net), 254 UTF16_HOST_ENDIAN, 255 (wchar_t *)out->kvp_ip_val.sub_net, 256 MAX_IP_ADDR_SIZE); 257 if (len < 0) 258 return len; 259 260 len = utf8s_to_utf16s((char *)in->body.kvp_ip_val.gate_way, 261 strlen((char *)in->body.kvp_ip_val.gate_way), 262 UTF16_HOST_ENDIAN, 263 (wchar_t *)out->kvp_ip_val.gate_way, 264 MAX_GATEWAY_SIZE); 265 if (len < 0) 266 return len; 267 268 len = utf8s_to_utf16s((char *)in->body.kvp_ip_val.dns_addr, 269 strlen((char *)in->body.kvp_ip_val.dns_addr), 270 UTF16_HOST_ENDIAN, 271 (wchar_t *)out->kvp_ip_val.dns_addr, 272 MAX_IP_ADDR_SIZE); 273 if (len < 0) 274 return len; 275 276 len = utf8s_to_utf16s((char *)in->body.kvp_ip_val.adapter_id, 277 strlen((char *)in->body.kvp_ip_val.adapter_id), 278 UTF16_HOST_ENDIAN, 279 (wchar_t *)out->kvp_ip_val.adapter_id, 280 MAX_IP_ADDR_SIZE); 281 if (len < 0) 282 return len; 283 284 out->kvp_ip_val.dhcp_enabled = 285 in->body.kvp_ip_val.dhcp_enabled; 286 out->kvp_ip_val.addr_family = 287 in->body.kvp_ip_val.addr_family; 288 } 289 290 return 0; 291 } 292 293 static void process_ib_ipinfo(void *in_msg, void *out_msg, int op) 294 { 295 struct hv_kvp_ip_msg *in = in_msg; 296 struct hv_kvp_msg *out = out_msg; 297 298 switch (op) { 299 case KVP_OP_SET_IP_INFO: 300 /* 301 * Transform all parameters into utf8 encoding. 302 */ 303 utf16s_to_utf8s((wchar_t *)in->kvp_ip_val.ip_addr, 304 MAX_IP_ADDR_SIZE, 305 UTF16_LITTLE_ENDIAN, 306 (__u8 *)out->body.kvp_ip_val.ip_addr, 307 MAX_IP_ADDR_SIZE); 308 309 utf16s_to_utf8s((wchar_t *)in->kvp_ip_val.sub_net, 310 MAX_IP_ADDR_SIZE, 311 UTF16_LITTLE_ENDIAN, 312 (__u8 *)out->body.kvp_ip_val.sub_net, 313 MAX_IP_ADDR_SIZE); 314 315 utf16s_to_utf8s((wchar_t *)in->kvp_ip_val.gate_way, 316 MAX_GATEWAY_SIZE, 317 UTF16_LITTLE_ENDIAN, 318 (__u8 *)out->body.kvp_ip_val.gate_way, 319 MAX_GATEWAY_SIZE); 320 321 utf16s_to_utf8s((wchar_t *)in->kvp_ip_val.dns_addr, 322 MAX_IP_ADDR_SIZE, 323 UTF16_LITTLE_ENDIAN, 324 (__u8 *)out->body.kvp_ip_val.dns_addr, 325 MAX_IP_ADDR_SIZE); 326 327 out->body.kvp_ip_val.dhcp_enabled = in->kvp_ip_val.dhcp_enabled; 328 329 default: 330 utf16s_to_utf8s((wchar_t *)in->kvp_ip_val.adapter_id, 331 MAX_ADAPTER_ID_SIZE, 332 UTF16_LITTLE_ENDIAN, 333 (__u8 *)out->body.kvp_ip_val.adapter_id, 334 MAX_ADAPTER_ID_SIZE); 335 336 out->body.kvp_ip_val.addr_family = in->kvp_ip_val.addr_family; 337 } 338 } 339 340 341 342 343 static void 344 kvp_send_key(struct work_struct *dummy) 345 { 346 struct cn_msg *msg; 347 struct hv_kvp_msg *message; 348 struct hv_kvp_msg *in_msg; 349 __u8 operation = kvp_transaction.kvp_msg->kvp_hdr.operation; 350 __u8 pool = kvp_transaction.kvp_msg->kvp_hdr.pool; 351 __u32 val32; 352 __u64 val64; 353 int rc; 354 355 msg = kzalloc(sizeof(*msg) + sizeof(struct hv_kvp_msg) , GFP_ATOMIC); 356 if (!msg) 357 return; 358 359 msg->id.idx = CN_KVP_IDX; 360 msg->id.val = CN_KVP_VAL; 361 362 message = (struct hv_kvp_msg *)msg->data; 363 message->kvp_hdr.operation = operation; 364 message->kvp_hdr.pool = pool; 365 in_msg = kvp_transaction.kvp_msg; 366 367 /* 368 * The key/value strings sent from the host are encoded in 369 * in utf16; convert it to utf8 strings. 370 * The host assures us that the utf16 strings will not exceed 371 * the max lengths specified. We will however, reserve room 372 * for the string terminating character - in the utf16s_utf8s() 373 * function we limit the size of the buffer where the converted 374 * string is placed to HV_KVP_EXCHANGE_MAX_*_SIZE -1 to gaurantee 375 * that the strings can be properly terminated! 376 */ 377 378 switch (message->kvp_hdr.operation) { 379 case KVP_OP_SET_IP_INFO: 380 process_ib_ipinfo(in_msg, message, KVP_OP_SET_IP_INFO); 381 break; 382 case KVP_OP_GET_IP_INFO: 383 process_ib_ipinfo(in_msg, message, KVP_OP_GET_IP_INFO); 384 break; 385 case KVP_OP_SET: 386 switch (in_msg->body.kvp_set.data.value_type) { 387 case REG_SZ: 388 /* 389 * The value is a string - utf16 encoding. 390 */ 391 message->body.kvp_set.data.value_size = 392 utf16s_to_utf8s( 393 (wchar_t *)in_msg->body.kvp_set.data.value, 394 in_msg->body.kvp_set.data.value_size, 395 UTF16_LITTLE_ENDIAN, 396 message->body.kvp_set.data.value, 397 HV_KVP_EXCHANGE_MAX_VALUE_SIZE - 1) + 1; 398 break; 399 400 case REG_U32: 401 /* 402 * The value is a 32 bit scalar. 403 * We save this as a utf8 string. 404 */ 405 val32 = in_msg->body.kvp_set.data.value_u32; 406 message->body.kvp_set.data.value_size = 407 sprintf(message->body.kvp_set.data.value, 408 "%d", val32) + 1; 409 break; 410 411 case REG_U64: 412 /* 413 * The value is a 64 bit scalar. 414 * We save this as a utf8 string. 415 */ 416 val64 = in_msg->body.kvp_set.data.value_u64; 417 message->body.kvp_set.data.value_size = 418 sprintf(message->body.kvp_set.data.value, 419 "%llu", val64) + 1; 420 break; 421 422 } 423 case KVP_OP_GET: 424 message->body.kvp_set.data.key_size = 425 utf16s_to_utf8s( 426 (wchar_t *)in_msg->body.kvp_set.data.key, 427 in_msg->body.kvp_set.data.key_size, 428 UTF16_LITTLE_ENDIAN, 429 message->body.kvp_set.data.key, 430 HV_KVP_EXCHANGE_MAX_KEY_SIZE - 1) + 1; 431 break; 432 433 case KVP_OP_DELETE: 434 message->body.kvp_delete.key_size = 435 utf16s_to_utf8s( 436 (wchar_t *)in_msg->body.kvp_delete.key, 437 in_msg->body.kvp_delete.key_size, 438 UTF16_LITTLE_ENDIAN, 439 message->body.kvp_delete.key, 440 HV_KVP_EXCHANGE_MAX_KEY_SIZE - 1) + 1; 441 break; 442 443 case KVP_OP_ENUMERATE: 444 message->body.kvp_enum_data.index = 445 in_msg->body.kvp_enum_data.index; 446 break; 447 } 448 449 msg->len = sizeof(struct hv_kvp_msg); 450 rc = cn_netlink_send(msg, 0, 0, GFP_ATOMIC); 451 if (rc) { 452 pr_debug("KVP: failed to communicate to the daemon: %d\n", rc); 453 if (cancel_delayed_work_sync(&kvp_work)) 454 kvp_respond_to_host(message, HV_E_FAIL); 455 } 456 457 kfree(msg); 458 459 return; 460 } 461 462 /* 463 * Send a response back to the host. 464 */ 465 466 static void 467 kvp_respond_to_host(struct hv_kvp_msg *msg_to_host, int error) 468 { 469 struct hv_kvp_msg *kvp_msg; 470 struct hv_kvp_exchg_msg_value *kvp_data; 471 char *key_name; 472 char *value; 473 struct icmsg_hdr *icmsghdrp; 474 int keylen = 0; 475 int valuelen = 0; 476 u32 buf_len; 477 struct vmbus_channel *channel; 478 u64 req_id; 479 int ret; 480 481 /* 482 * If a transaction is not active; log and return. 483 */ 484 485 if (!kvp_transaction.active) { 486 /* 487 * This is a spurious call! 488 */ 489 pr_warn("KVP: Transaction not active\n"); 490 return; 491 } 492 /* 493 * Copy the global state for completing the transaction. Note that 494 * only one transaction can be active at a time. 495 */ 496 497 buf_len = kvp_transaction.recv_len; 498 channel = kvp_transaction.recv_channel; 499 req_id = kvp_transaction.recv_req_id; 500 501 kvp_transaction.active = false; 502 503 icmsghdrp = (struct icmsg_hdr *) 504 &recv_buffer[sizeof(struct vmbuspipe_hdr)]; 505 506 if (channel->onchannel_callback == NULL) 507 /* 508 * We have raced with util driver being unloaded; 509 * silently return. 510 */ 511 return; 512 513 icmsghdrp->status = error; 514 515 /* 516 * If the error parameter is set, terminate the host's enumeration 517 * on this pool. 518 */ 519 if (error) { 520 /* 521 * Something failed or we have timedout; 522 * terminate the current host-side iteration. 523 */ 524 goto response_done; 525 } 526 527 kvp_msg = (struct hv_kvp_msg *) 528 &recv_buffer[sizeof(struct vmbuspipe_hdr) + 529 sizeof(struct icmsg_hdr)]; 530 531 switch (kvp_transaction.kvp_msg->kvp_hdr.operation) { 532 case KVP_OP_GET_IP_INFO: 533 ret = process_ob_ipinfo(msg_to_host, 534 (struct hv_kvp_ip_msg *)kvp_msg, 535 KVP_OP_GET_IP_INFO); 536 if (ret < 0) 537 icmsghdrp->status = HV_E_FAIL; 538 539 goto response_done; 540 case KVP_OP_SET_IP_INFO: 541 goto response_done; 542 case KVP_OP_GET: 543 kvp_data = &kvp_msg->body.kvp_get.data; 544 goto copy_value; 545 546 case KVP_OP_SET: 547 case KVP_OP_DELETE: 548 goto response_done; 549 550 default: 551 break; 552 } 553 554 kvp_data = &kvp_msg->body.kvp_enum_data.data; 555 key_name = msg_to_host->body.kvp_enum_data.data.key; 556 557 /* 558 * The windows host expects the key/value pair to be encoded 559 * in utf16. Ensure that the key/value size reported to the host 560 * will be less than or equal to the MAX size (including the 561 * terminating character). 562 */ 563 keylen = utf8s_to_utf16s(key_name, strlen(key_name), UTF16_HOST_ENDIAN, 564 (wchar_t *) kvp_data->key, 565 (HV_KVP_EXCHANGE_MAX_KEY_SIZE / 2) - 2); 566 kvp_data->key_size = 2*(keylen + 1); /* utf16 encoding */ 567 568 copy_value: 569 value = msg_to_host->body.kvp_enum_data.data.value; 570 valuelen = utf8s_to_utf16s(value, strlen(value), UTF16_HOST_ENDIAN, 571 (wchar_t *) kvp_data->value, 572 (HV_KVP_EXCHANGE_MAX_VALUE_SIZE / 2) - 2); 573 kvp_data->value_size = 2*(valuelen + 1); /* utf16 encoding */ 574 575 /* 576 * If the utf8s to utf16s conversion failed; notify host 577 * of the error. 578 */ 579 if ((keylen < 0) || (valuelen < 0)) 580 icmsghdrp->status = HV_E_FAIL; 581 582 kvp_data->value_type = REG_SZ; /* all our values are strings */ 583 584 response_done: 585 icmsghdrp->icflags = ICMSGHDRFLAG_TRANSACTION | ICMSGHDRFLAG_RESPONSE; 586 587 vmbus_sendpacket(channel, recv_buffer, buf_len, req_id, 588 VM_PKT_DATA_INBAND, 0); 589 poll_channel(channel); 590 } 591 592 /* 593 * This callback is invoked when we get a KVP message from the host. 594 * The host ensures that only one KVP transaction can be active at a time. 595 * KVP implementation in Linux needs to forward the key to a user-mde 596 * component to retrive the corresponding value. Consequently, we cannot 597 * respond to the host in the conext of this callback. Since the host 598 * guarantees that at most only one transaction can be active at a time, 599 * we stash away the transaction state in a set of global variables. 600 */ 601 602 void hv_kvp_onchannelcallback(void *context) 603 { 604 struct vmbus_channel *channel = context; 605 u32 recvlen; 606 u64 requestid; 607 608 struct hv_kvp_msg *kvp_msg; 609 610 struct icmsg_hdr *icmsghdrp; 611 struct icmsg_negotiate *negop = NULL; 612 int util_fw_version; 613 int kvp_srv_version; 614 615 if (kvp_transaction.active) { 616 /* 617 * We will defer processing this callback once 618 * the current transaction is complete. 619 */ 620 kvp_transaction.kvp_context = context; 621 return; 622 } 623 624 vmbus_recvpacket(channel, recv_buffer, PAGE_SIZE * 4, &recvlen, 625 &requestid); 626 627 if (recvlen > 0) { 628 icmsghdrp = (struct icmsg_hdr *)&recv_buffer[ 629 sizeof(struct vmbuspipe_hdr)]; 630 631 if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) { 632 /* 633 * Based on the host, select appropriate 634 * framework and service versions we will 635 * negotiate. 636 */ 637 switch (vmbus_proto_version) { 638 case (VERSION_WS2008): 639 util_fw_version = UTIL_WS2K8_FW_VERSION; 640 kvp_srv_version = WS2008_SRV_VERSION; 641 break; 642 case (VERSION_WIN7): 643 util_fw_version = UTIL_FW_VERSION; 644 kvp_srv_version = WIN7_SRV_VERSION; 645 break; 646 default: 647 util_fw_version = UTIL_FW_VERSION; 648 kvp_srv_version = WIN8_SRV_VERSION; 649 } 650 vmbus_prep_negotiate_resp(icmsghdrp, negop, 651 recv_buffer, util_fw_version, 652 kvp_srv_version); 653 654 } else { 655 kvp_msg = (struct hv_kvp_msg *)&recv_buffer[ 656 sizeof(struct vmbuspipe_hdr) + 657 sizeof(struct icmsg_hdr)]; 658 659 /* 660 * Stash away this global state for completing the 661 * transaction; note transactions are serialized. 662 */ 663 664 kvp_transaction.recv_len = recvlen; 665 kvp_transaction.recv_channel = channel; 666 kvp_transaction.recv_req_id = requestid; 667 kvp_transaction.active = true; 668 kvp_transaction.kvp_msg = kvp_msg; 669 670 /* 671 * Get the information from the 672 * user-mode component. 673 * component. This transaction will be 674 * completed when we get the value from 675 * the user-mode component. 676 * Set a timeout to deal with 677 * user-mode not responding. 678 */ 679 schedule_work(&kvp_sendkey_work); 680 schedule_delayed_work(&kvp_work, 5*HZ); 681 682 return; 683 684 } 685 686 icmsghdrp->icflags = ICMSGHDRFLAG_TRANSACTION 687 | ICMSGHDRFLAG_RESPONSE; 688 689 vmbus_sendpacket(channel, recv_buffer, 690 recvlen, requestid, 691 VM_PKT_DATA_INBAND, 0); 692 } 693 694 } 695 696 int 697 hv_kvp_init(struct hv_util_service *srv) 698 { 699 int err; 700 701 err = cn_add_callback(&kvp_id, kvp_name, kvp_cn_callback); 702 if (err) 703 return err; 704 recv_buffer = srv->recv_buffer; 705 706 /* 707 * When this driver loads, the user level daemon that 708 * processes the host requests may not yet be running. 709 * Defer processing channel callbacks until the daemon 710 * has registered. 711 */ 712 kvp_transaction.active = true; 713 714 return 0; 715 } 716 717 void hv_kvp_deinit(void) 718 { 719 cn_del_callback(&kvp_id); 720 cancel_delayed_work_sync(&kvp_work); 721 cancel_work_sync(&kvp_sendkey_work); 722 } 723