diff options
Diffstat (limited to 'include/linux/hyperv.h')
-rw-r--r-- | include/linux/hyperv.h | 101 |
1 files changed, 90 insertions, 11 deletions
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index 68ed7f7e1fc9..e73b852156b1 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h | |||
@@ -122,12 +122,53 @@ | |||
122 | #define REG_U32 4 | 122 | #define REG_U32 4 |
123 | #define REG_U64 8 | 123 | #define REG_U64 8 |
124 | 124 | ||
125 | /* | ||
126 | * As we look at expanding the KVP functionality to include | ||
127 | * IP injection functionality, we need to maintain binary | ||
128 | * compatibility with older daemons. | ||
129 | * | ||
130 | * The KVP opcodes are defined by the host and it was unfortunate | ||
131 | * that I chose to treat the registration operation as part of the | ||
132 | * KVP operations defined by the host. | ||
133 | * Here is the level of compatibility | ||
134 | * (between the user level daemon and the kernel KVP driver) that we | ||
135 | * will implement: | ||
136 | * | ||
137 | * An older daemon will always be supported on a newer driver. | ||
138 | * A given user level daemon will require a minimal version of the | ||
139 | * kernel driver. | ||
140 | * If we cannot handle the version differences, we will fail gracefully | ||
141 | * (this can happen when we have a user level daemon that is more | ||
142 | * advanced than the KVP driver. | ||
143 | * | ||
144 | * We will use values used in this handshake for determining if we have | ||
145 | * workable user level daemon and the kernel driver. We begin by taking the | ||
146 | * registration opcode out of the KVP opcode namespace. We will however, | ||
147 | * maintain compatibility with the existing user-level daemon code. | ||
148 | */ | ||
149 | |||
150 | /* | ||
151 | * Daemon code not supporting IP injection (legacy daemon). | ||
152 | */ | ||
153 | |||
154 | #define KVP_OP_REGISTER 4 | ||
155 | |||
156 | /* | ||
157 | * Daemon code supporting IP injection. | ||
158 | * The KVP opcode field is used to communicate the | ||
159 | * registration information; so define a namespace that | ||
160 | * will be distinct from the host defined KVP opcode. | ||
161 | */ | ||
162 | |||
163 | #define KVP_OP_REGISTER1 100 | ||
164 | |||
125 | enum hv_kvp_exchg_op { | 165 | enum hv_kvp_exchg_op { |
126 | KVP_OP_GET = 0, | 166 | KVP_OP_GET = 0, |
127 | KVP_OP_SET, | 167 | KVP_OP_SET, |
128 | KVP_OP_DELETE, | 168 | KVP_OP_DELETE, |
129 | KVP_OP_ENUMERATE, | 169 | KVP_OP_ENUMERATE, |
130 | KVP_OP_REGISTER, | 170 | KVP_OP_GET_IP_INFO, |
171 | KVP_OP_SET_IP_INFO, | ||
131 | KVP_OP_COUNT /* Number of operations, must be last. */ | 172 | KVP_OP_COUNT /* Number of operations, must be last. */ |
132 | }; | 173 | }; |
133 | 174 | ||
@@ -140,6 +181,39 @@ enum hv_kvp_exchg_pool { | |||
140 | KVP_POOL_COUNT /* Number of pools, must be last. */ | 181 | KVP_POOL_COUNT /* Number of pools, must be last. */ |
141 | }; | 182 | }; |
142 | 183 | ||
184 | /* | ||
185 | * Some Hyper-V status codes. | ||
186 | */ | ||
187 | |||
188 | #define HV_S_OK 0x00000000 | ||
189 | #define HV_E_FAIL 0x80004005 | ||
190 | #define HV_S_CONT 0x80070103 | ||
191 | #define HV_ERROR_NOT_SUPPORTED 0x80070032 | ||
192 | #define HV_ERROR_MACHINE_LOCKED 0x800704F7 | ||
193 | #define HV_ERROR_DEVICE_NOT_CONNECTED 0x8007048F | ||
194 | #define HV_INVALIDARG 0x80070057 | ||
195 | #define HV_GUID_NOTFOUND 0x80041002 | ||
196 | |||
197 | #define ADDR_FAMILY_NONE 0x00 | ||
198 | #define ADDR_FAMILY_IPV4 0x01 | ||
199 | #define ADDR_FAMILY_IPV6 0x02 | ||
200 | |||
201 | #define MAX_ADAPTER_ID_SIZE 128 | ||
202 | #define MAX_IP_ADDR_SIZE 1024 | ||
203 | #define MAX_GATEWAY_SIZE 512 | ||
204 | |||
205 | |||
206 | struct hv_kvp_ipaddr_value { | ||
207 | __u16 adapter_id[MAX_ADAPTER_ID_SIZE]; | ||
208 | __u8 addr_family; | ||
209 | __u8 dhcp_enabled; | ||
210 | __u16 ip_addr[MAX_IP_ADDR_SIZE]; | ||
211 | __u16 sub_net[MAX_IP_ADDR_SIZE]; | ||
212 | __u16 gate_way[MAX_GATEWAY_SIZE]; | ||
213 | __u16 dns_addr[MAX_IP_ADDR_SIZE]; | ||
214 | } __attribute__((packed)); | ||
215 | |||
216 | |||
143 | struct hv_kvp_hdr { | 217 | struct hv_kvp_hdr { |
144 | __u8 operation; | 218 | __u8 operation; |
145 | __u8 pool; | 219 | __u8 pool; |
@@ -181,16 +255,26 @@ struct hv_kvp_register { | |||
181 | }; | 255 | }; |
182 | 256 | ||
183 | struct hv_kvp_msg { | 257 | struct hv_kvp_msg { |
184 | struct hv_kvp_hdr kvp_hdr; | 258 | union { |
259 | struct hv_kvp_hdr kvp_hdr; | ||
260 | int error; | ||
261 | }; | ||
185 | union { | 262 | union { |
186 | struct hv_kvp_msg_get kvp_get; | 263 | struct hv_kvp_msg_get kvp_get; |
187 | struct hv_kvp_msg_set kvp_set; | 264 | struct hv_kvp_msg_set kvp_set; |
188 | struct hv_kvp_msg_delete kvp_delete; | 265 | struct hv_kvp_msg_delete kvp_delete; |
189 | struct hv_kvp_msg_enumerate kvp_enum_data; | 266 | struct hv_kvp_msg_enumerate kvp_enum_data; |
267 | struct hv_kvp_ipaddr_value kvp_ip_val; | ||
190 | struct hv_kvp_register kvp_register; | 268 | struct hv_kvp_register kvp_register; |
191 | } body; | 269 | } body; |
192 | } __attribute__((packed)); | 270 | } __attribute__((packed)); |
193 | 271 | ||
272 | struct hv_kvp_ip_msg { | ||
273 | __u8 operation; | ||
274 | __u8 pool; | ||
275 | struct hv_kvp_ipaddr_value kvp_ip_val; | ||
276 | } __attribute__((packed)); | ||
277 | |||
194 | #ifdef __KERNEL__ | 278 | #ifdef __KERNEL__ |
195 | #include <linux/scatterlist.h> | 279 | #include <linux/scatterlist.h> |
196 | #include <linux/list.h> | 280 | #include <linux/list.h> |
@@ -405,7 +489,7 @@ struct vmtransfer_page_range { | |||
405 | struct vmtransfer_page_packet_header { | 489 | struct vmtransfer_page_packet_header { |
406 | struct vmpacket_descriptor d; | 490 | struct vmpacket_descriptor d; |
407 | u16 xfer_pageset_id; | 491 | u16 xfer_pageset_id; |
408 | bool sender_owns_set; | 492 | u8 sender_owns_set; |
409 | u8 reserved; | 493 | u8 reserved; |
410 | u32 range_cnt; | 494 | u32 range_cnt; |
411 | struct vmtransfer_page_range ranges[1]; | 495 | struct vmtransfer_page_range ranges[1]; |
@@ -559,7 +643,7 @@ struct vmbus_channel_query_vmbus_version { | |||
559 | /* VMBus Version Supported parameters */ | 643 | /* VMBus Version Supported parameters */ |
560 | struct vmbus_channel_version_supported { | 644 | struct vmbus_channel_version_supported { |
561 | struct vmbus_channel_message_header header; | 645 | struct vmbus_channel_message_header header; |
562 | bool version_supported; | 646 | u8 version_supported; |
563 | } __packed; | 647 | } __packed; |
564 | 648 | ||
565 | /* Offer Channel parameters */ | 649 | /* Offer Channel parameters */ |
@@ -568,7 +652,7 @@ struct vmbus_channel_offer_channel { | |||
568 | struct vmbus_channel_offer offer; | 652 | struct vmbus_channel_offer offer; |
569 | u32 child_relid; | 653 | u32 child_relid; |
570 | u8 monitorid; | 654 | u8 monitorid; |
571 | bool monitor_allocated; | 655 | u8 monitor_allocated; |
572 | } __packed; | 656 | } __packed; |
573 | 657 | ||
574 | /* Rescind Offer parameters */ | 658 | /* Rescind Offer parameters */ |
@@ -704,7 +788,7 @@ struct vmbus_channel_initiate_contact { | |||
704 | 788 | ||
705 | struct vmbus_channel_version_response { | 789 | struct vmbus_channel_version_response { |
706 | struct vmbus_channel_message_header header; | 790 | struct vmbus_channel_message_header header; |
707 | bool version_supported; | 791 | u8 version_supported; |
708 | } __packed; | 792 | } __packed; |
709 | 793 | ||
710 | enum vmbus_channel_state { | 794 | enum vmbus_channel_state { |
@@ -977,11 +1061,6 @@ void vmbus_driver_unregister(struct hv_driver *hv_driver); | |||
977 | #define ICMSGHDRFLAG_REQUEST 2 | 1061 | #define ICMSGHDRFLAG_REQUEST 2 |
978 | #define ICMSGHDRFLAG_RESPONSE 4 | 1062 | #define ICMSGHDRFLAG_RESPONSE 4 |
979 | 1063 | ||
980 | #define HV_S_OK 0x00000000 | ||
981 | #define HV_E_FAIL 0x80004005 | ||
982 | #define HV_S_CONT 0x80070103 | ||
983 | #define HV_ERROR_NOT_SUPPORTED 0x80070032 | ||
984 | #define HV_ERROR_MACHINE_LOCKED 0x800704F7 | ||
985 | 1064 | ||
986 | /* | 1065 | /* |
987 | * While we want to handle util services as regular devices, | 1066 | * While we want to handle util services as regular devices, |