summaryrefslogtreecommitdiff
path: root/sys/dev/hyperv/utilities
diff options
context:
space:
mode:
authorSepherosa Ziehau <sephe@FreeBSD.org>2016-08-25 05:24:57 +0000
committerSepherosa Ziehau <sephe@FreeBSD.org>2016-08-25 05:24:57 +0000
commitc72fc9d2b916b4e85de8eb2c75d52520d0c27c3e (patch)
tree8dd65528f15845a3d2f078ce57477cc835b6c304 /sys/dev/hyperv/utilities
parent97b84d344d4a7bb9e34703948e31be5247318a71 (diff)
Notes
Diffstat (limited to 'sys/dev/hyperv/utilities')
-rw-r--r--sys/dev/hyperv/utilities/hv_heartbeat.c2
-rw-r--r--sys/dev/hyperv/utilities/hv_shutdown.c2
-rw-r--r--sys/dev/hyperv/utilities/hv_timesync.c2
-rw-r--r--sys/dev/hyperv/utilities/hv_util.c19
-rw-r--r--sys/dev/hyperv/utilities/hv_util.h2
5 files changed, 17 insertions, 10 deletions
diff --git a/sys/dev/hyperv/utilities/hv_heartbeat.c b/sys/dev/hyperv/utilities/hv_heartbeat.c
index 233f0b8a0f47..5e91cd1a692b 100644
--- a/sys/dev/hyperv/utilities/hv_heartbeat.c
+++ b/sys/dev/hyperv/utilities/hv_heartbeat.c
@@ -80,7 +80,7 @@ vmbus_heartbeat_cb(struct vmbus_channel *chan, void *xsc)
*/
switch (hdr->ic_type) {
case VMBUS_ICMSG_TYPE_NEGOTIATE:
- error = vmbus_ic_negomsg(sc, data, dlen);
+ error = vmbus_ic_negomsg(sc, data, &dlen);
if (error)
return;
break;
diff --git a/sys/dev/hyperv/utilities/hv_shutdown.c b/sys/dev/hyperv/utilities/hv_shutdown.c
index 042935c1bdda..abc82fa09e38 100644
--- a/sys/dev/hyperv/utilities/hv_shutdown.c
+++ b/sys/dev/hyperv/utilities/hv_shutdown.c
@@ -87,7 +87,7 @@ hv_shutdown_cb(struct vmbus_channel *channel, void *context)
if (icmsghdrp->icmsgtype == HV_ICMSGTYPE_NEGOTIATE) {
int error;
- error = vmbus_ic_negomsg(softc, buf, recv_len);
+ error = vmbus_ic_negomsg(softc, buf, &recv_len);
if (error)
return;
} else {
diff --git a/sys/dev/hyperv/utilities/hv_timesync.c b/sys/dev/hyperv/utilities/hv_timesync.c
index a71eeb438625..632a45e65960 100644
--- a/sys/dev/hyperv/utilities/hv_timesync.c
+++ b/sys/dev/hyperv/utilities/hv_timesync.c
@@ -162,7 +162,7 @@ hv_timesync_cb(struct vmbus_channel *channel, void *context)
if (icmsghdrp->icmsgtype == HV_ICMSGTYPE_NEGOTIATE) {
int error;
- error = vmbus_ic_negomsg(&softc->util_sc, time_buf, recvlen);
+ error = vmbus_ic_negomsg(&softc->util_sc, time_buf, &recvlen);
if (error)
return;
} else {
diff --git a/sys/dev/hyperv/utilities/hv_util.c b/sys/dev/hyperv/utilities/hv_util.c
index bb5b11045134..3fc16c951d4a 100644
--- a/sys/dev/hyperv/utilities/hv_util.c
+++ b/sys/dev/hyperv/utilities/hv_util.c
@@ -48,13 +48,16 @@
#define VMBUS_IC_BRSIZE (4 * PAGE_SIZE)
-CTASSERT(sizeof(struct vmbus_icmsg_negotiate) < VMBUS_IC_BRSIZE);
+#define VMBUS_IC_VERCNT 2
+#define VMBUS_IC_NEGOSZ \
+ __offsetof(struct vmbus_icmsg_negotiate, ic_ver[VMBUS_IC_VERCNT])
+CTASSERT(VMBUS_IC_NEGOSZ < VMBUS_IC_BRSIZE);
int
-vmbus_ic_negomsg(struct hv_util_sc *sc, void *data, int dlen)
+vmbus_ic_negomsg(struct hv_util_sc *sc, void *data, int *dlen0)
{
struct vmbus_icmsg_negotiate *nego;
- int cnt, major;
+ int cnt, major, dlen = *dlen0;
/*
* Preliminary message size verification
@@ -87,9 +90,13 @@ vmbus_ic_negomsg(struct hv_util_sc *sc, void *data, int dlen)
nego->ic_msgver_cnt = 1;
nego->ic_ver[1] = VMBUS_IC_VERSION(major, 0);
- /* Data contains two versions */
- nego->ic_hdr.ic_dsize = __offsetof(struct vmbus_icmsg_negotiate,
- ic_ver[2]) - sizeof(struct vmbus_icmsg_hdr);
+ /* Update data size */
+ nego->ic_hdr.ic_dsize = VMBUS_IC_NEGOSZ -
+ sizeof(struct vmbus_icmsg_hdr);
+
+ /* Update total size, if necessary */
+ if (dlen < VMBUS_IC_NEGOSZ)
+ *dlen0 = VMBUS_IC_NEGOSZ;
return 0;
}
diff --git a/sys/dev/hyperv/utilities/hv_util.h b/sys/dev/hyperv/utilities/hv_util.h
index 130e4b799c0f..012cdeec3ed6 100644
--- a/sys/dev/hyperv/utilities/hv_util.h
+++ b/sys/dev/hyperv/utilities/hv_util.h
@@ -54,6 +54,6 @@ struct vmbus_ic_desc {
int hv_util_attach(device_t dev, vmbus_chan_callback_t cb);
int hv_util_detach(device_t dev);
int vmbus_ic_probe(device_t dev, const struct vmbus_ic_desc descs[]);
-int vmbus_ic_negomsg(struct hv_util_sc *, void *data, int dlen);
+int vmbus_ic_negomsg(struct hv_util_sc *, void *data, int *dlen);
#endif