What does this mean?  If you've accumulated acks then you should add
them to the commit message, not follow up with them.

On Fri, Sep 05, 2014 at 07:01:39PM +0000, Eitan Eliahu wrote:
> Acked-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions.com>
> Acked-by: Ankur Sharma <ankursha...@vmware.com>
> 
> -----Original Message-----
> From: Eitan Eliahu [mailto:elia...@vmware.com] 
> Sent: Friday, September 05, 2014 7:39 PM
> To: dev@openvswitch.org
> Cc: Eitan Eliahu
> Subject: [PATCH v3] Windows NetLink Socket - Support for asynchronous event 
> notification
> 
> We keep an outstanding, out of band, I/O request in the driver at all time.
> Once an event generated the driver queues the event message, completes the 
> pending I/O and unblocks the calling thread through setting the event in the 
> overlapped structure n the  NL socket. The thread will read all all event 
> messages synchronous through the call of nl_sock_recv()
> 
> Addressing review comments in v2.
> 
> Signed-off-by: Eitan Eliahu elia...@vmware.com
> ---
>  datapath-windows/include/OvsDpInterfaceExt.h |  1 +
>  lib/netlink-socket.c                         | 87 
> +++++++++++++++++++++++++---
>  2 files changed, 81 insertions(+), 7 deletions(-)
> 
> diff --git a/datapath-windows/include/OvsDpInterfaceExt.h 
> b/datapath-windows/include/OvsDpInterfaceExt.h
> index 73dfcbe..ab2088a 100644
> --- a/datapath-windows/include/OvsDpInterfaceExt.h
> +++ b/datapath-windows/include/OvsDpInterfaceExt.h
> @@ -70,6 +70,7 @@
>  /* Commands available under the OVS_WIN_CONTROL_FAMILY. */  enum 
> ovs_win_control_cmd {
>      OVS_CTRL_CMD_WIN_GET_PID,
> +    OVS_CTRL_CMD_WIN_PEND_REQ
>  };
>  
>  #endif /* __OVS_DP_INTERFACE_EXT_H_ */
> diff --git a/lib/netlink-socket.c b/lib/netlink-socket.c index 
> a6be186..61f840a 100644
> --- a/lib/netlink-socket.c
> +++ b/lib/netlink-socket.c
> @@ -80,6 +80,7 @@ static int get_sock_pid_from_kernel(struct nl_sock *sock);  
> struct nl_sock {  #ifdef _WIN32
>      HANDLE handle;
> +    OVERLAPPED overlapped;
>  #else
>      int fd;
>  #endif
> @@ -139,18 +140,26 @@ nl_sock_create(int protocol, struct nl_sock **sockp)
>      sock = xmalloc(sizeof *sock);
>  
>  #ifdef _WIN32
> -    sock->handle = CreateFileA("\\\\.\\OpenVSwitchDevice",
> -                               GENERIC_READ | GENERIC_WRITE,
> -                               FILE_SHARE_READ | FILE_SHARE_WRITE,
> -                               NULL, OPEN_EXISTING,
> -                               FILE_ATTRIBUTE_NORMAL, NULL);
> -
> -    int last_error = GetLastError();
> +    sock->handle = CreateFile(OVS_DEVICE_NAME_USER,
> +                              GENERIC_READ | GENERIC_WRITE,
> +                              FILE_SHARE_READ | FILE_SHARE_WRITE,
> +                              NULL, OPEN_EXISTING,
> +                              FILE_FLAG_OVERLAPPED, NULL);
>  
>      if (sock->handle == INVALID_HANDLE_VALUE) {
> +        int last_error = GetLastError();
> +        VLOG_ERR("fcntl: %s", ovs_strerror(last_error));
> +        goto error;
> +    }
> +
> +    memset(&sock->overlapped, 0, sizeof sock->overlapped);
> +    sock->overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
> +    if (sock->overlapped.hEvent == NULL) {
> +        int last_error = GetLastError();
>          VLOG_ERR("fcntl: %s", ovs_strerror(last_error));
>          goto error;
>      }
> +
>  #else
>      sock->fd = socket(AF_NETLINK, SOCK_RAW, protocol);
>      if (sock->fd < 0) {
> @@ -221,6 +230,9 @@ error:
>          }
>      }
>  #ifdef _WIN32
> +    if (sock->overlapped.hEvent) {
> +        CloseHandle(sock->overlapped.hEvent);
> +    }
>      if (sock->handle != INVALID_HANDLE_VALUE) {
>          CloseHandle(sock->handle);
>      }
> @@ -248,6 +260,9 @@ nl_sock_destroy(struct nl_sock *sock)  {
>      if (sock) {
>  #ifdef _WIN32
> +        if (sock->overlapped.hEvent) {
> +            CloseHandle(sock->overlapped.hEvent);
> +        }
>          CloseHandle(sock->handle);
>  #else
>          close(sock->fd);
> @@ -1040,12 +1055,70 @@ nl_dump_done(struct nl_dump *dump)
>      return status == EOF ? 0 : status;
>  }
>  
> +#ifdef _WIN32
> +/* Pend an I/O request in the driver. The driver completes the I/O 
> +whenever
> + * an event or a packet is ready to be read. Once the I/O is completed
> + * the overlapped structure event associated with the pending I/O will 
> +be set  */ static int pend_io_request(const struct nl_sock *sock) {
> +    struct ofpbuf request;
> +    uint64_t request_stub[128];
> +    struct ovs_header *ovs_header;
> +    struct nlmsghdr *nlmsg;
> +    uint32_t seq;
> +    int retval;
> +    int error;
> +    DWORD bytes;
> +    OVERLAPPED *overlapped = &sock->overlapped;
> +
> +    int ovs_msg_size = sizeof (struct nlmsghdr) + sizeof (struct genlmsghdr) 
> +
> +                               sizeof (struct ovs_header);
> +
> +    ofpbuf_use_stub(&request, request_stub, sizeof request_stub);
> +
> +    seq = nl_sock_allocate_seq(sock, 1);
> +    nl_msg_put_genlmsghdr(&request, 0, OVS_WIN_NL_CTRL_FAMILY_ID, 0,
> +                          OVS_CTRL_CMD_WIN_PEND_REQ, 
> OVS_WIN_CONTROL_VERSION);
> +    nlmsg = nl_msg_nlmsghdr(&request);
> +    nlmsg->nlmsg_seq = seq;
> +
> +    ovs_header = ofpbuf_put_uninit(&request, sizeof *ovs_header);
> +    ovs_header->dp_ifindex = 0;
> +
> +    if (!DeviceIoControl(sock->handle, OVS_IOCTL_WRITE,
> +                         ofpbuf_data(&request), ofpbuf_size(&request),
> +                         NULL, 0, &bytes, overlapped)) {
> +        error = GetLastError();
> +        /* Check if the I/O got pended */
> +        if (error != ERROR_IO_INCOMPLETE && error != ERROR_IO_PENDING) {
> +            VLOG_ERR("nl_sock_wait failed - %s\n", 
> ovs_format_message(error));
> +            retval = EINVAL;
> +            goto done;
> +        }
> +    }
> +    else {
> +        /* The I/O was completed synchronously */
> +        poll_immediate_wake();
> +    }
> +    retval = 0;
> +
> +done:
> +    ofpbuf_uninit(&request);
> +    return retval;
> +}
> +#endif  /* _WIN32 */
> +
>  /* Causes poll_block() to wake up when any of the specified 'events' (which 
> is
>   * a OR'd combination of POLLIN, POLLOUT, etc.) occur on 'sock'. */  void  
> nl_sock_wait(const struct nl_sock *sock, short int events)  {  #ifdef _WIN32
> +    if (sock->overlapped.Internal != STATUS_PENDING) {
> +        pend_io_request(sock);
> +    }
>      poll_fd_wait(sock->handle, events);  #else
>      poll_fd_wait(sock->fd, events);
> --
> 1.9.4.msysgit.0
> 
> _______________________________________________
> dev mailing list
> dev@openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to