[ovs-dev] [PATCH] User mode event read for Windows
Eitan Eliahu
eliahue at vmware.com
Tue Sep 30 02:16:23 UTC 2014
User mode sends down three distinct Read ioctl commands for Events, Packet
Reads and Dumps. In case the Packet Read socket can not be distinguished a
Set function will be provided.
Signed-off-by: Eitan Eliahu <eliahue at vmware.com>
---
lib/netlink-socket.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
diff --git a/lib/netlink-socket.c b/lib/netlink-socket.c
index 1717ab8..88d36b1 100644
--- a/lib/netlink-socket.c
+++ b/lib/netlink-socket.c
@@ -81,6 +81,7 @@ struct nl_sock {
#ifdef _WIN32
HANDLE handle;
OVERLAPPED overlapped;
+ DWORD readIoctl;
#else
int fd;
#endif
@@ -157,7 +158,8 @@ nl_sock_create(int protocol, struct nl_sock **sockp)
VLOG_ERR("fcntl: %s", ovs_lasterror_to_string());
goto error;
}
-
+ /* Initialize the type/ioctl to Generic */
+ sock->readIoctl = OVS_IOCTL_READ;
#else
sock->fd = socket(AF_NETLINK, SOCK_RAW, protocol);
if (sock->fd < 0) {
@@ -374,8 +376,11 @@ int
nl_sock_join_mcgroup(struct nl_sock *sock, unsigned int multicast_group)
{
#ifdef _WIN32
+ /* Set the socket type as a "multicast" socket */
+ sock->readIoctl = OVS_IOCTL_READ_EVENT;
int error = nl_sock_mcgroup(sock, multicast_group, true);
if (error) {
+ sock->readIoctl = OVS_IOCTL_READ;
VLOG_WARN("could not join multicast group %u (%s)",
multicast_group, ovs_strerror(errno));
return errno;
@@ -411,6 +416,7 @@ nl_sock_leave_mcgroup(struct nl_sock *sock, unsigned int multicast_group)
multicast_group, ovs_strerror(errno));
return errno;
}
+ sock->readIoctl = OVS_IOCTL_READ;
#else
if (setsockopt(sock->fd, SOL_NETLINK, NETLINK_DROP_MEMBERSHIP,
&multicast_group, sizeof multicast_group) < 0) {
@@ -530,7 +536,7 @@ nl_sock_recv__(struct nl_sock *sock, struct ofpbuf *buf, bool wait)
nlmsghdr->nlmsg_len = UINT32_MAX;
#ifdef _WIN32
DWORD bytes;
- if (!DeviceIoControl(sock->handle, OVS_IOCTL_READ,
+ if (!DeviceIoControl(sock->handle, sock->readIoctl,
NULL, 0, tail, sizeof tail, &bytes, NULL)) {
retval = -1;
errno = EINVAL;
@@ -1126,7 +1132,7 @@ pend_io_request(const struct nl_sock *sock)
int retval;
int error;
DWORD bytes;
- OVERLAPPED *overlapped = &sock->overlapped;
+ OVERLAPPED *overlapped = CONST_CAST(OVERLAPPED *, &sock->overlapped);
int ovs_msg_size = sizeof (struct nlmsghdr) + sizeof (struct genlmsghdr) +
sizeof (struct ovs_header);
--
1.9.4.msysgit.0
More information about the dev
mailing list