diff mbox

[ovs-dev,1/4] datapath-windows: move packet read code to User.c

Message ID 1442343149-52881-1-git-send-email-nithin@vmware.com
State Superseded
Headers show

Commit Message

Nithin Raju Sept. 15, 2015, 6:52 p.m. UTC
Simple code motion.

Signed-off-by: Nithin Raju <nithin@vmware.com>
---
 datapath-windows/ovsext/Datapath.c | 118 ++-----------------------------------
 datapath-windows/ovsext/User.c     | 108 +++++++++++++++++++++++++++++++++
 datapath-windows/ovsext/User.h     |   7 +++
 3 files changed, 120 insertions(+), 113 deletions(-)

Comments

Sairam Venugopal Sept. 19, 2015, 12:45 a.m. UTC | #1
Acked-by: Sairam Venugopal <vsairam@vmware.com>



On 9/15/15, 11:52 AM, "Nithin Raju" <nithin@vmware.com> wrote:

>Simple code motion.
>
>Signed-off-by: Nithin Raju <nithin@vmware.com>
>---
> datapath-windows/ovsext/Datapath.c | 118
>++-----------------------------------
> datapath-windows/ovsext/User.c     | 108
>+++++++++++++++++++++++++++++++++
> datapath-windows/ovsext/User.h     |   7 +++
> 3 files changed, 120 insertions(+), 113 deletions(-)
>
>diff --git a/datapath-windows/ovsext/Datapath.c
>b/datapath-windows/ovsext/Datapath.c
>index b7bbf80..409c4bb 100644
>--- a/datapath-windows/ovsext/Datapath.c
>+++ b/datapath-windows/ovsext/Datapath.c
>@@ -89,11 +89,8 @@ typedef struct _NETLINK_FAMILY {
> 
> /* Handlers for the various netlink commands. */
> static NetlinkCmdHandler OvsPendEventCmdHandler,
>-                         OvsPendPacketCmdHandler,
>                          OvsSubscribeEventCmdHandler,
>-                         OvsSubscribePacketCmdHandler,
>                          OvsReadEventCmdHandler,
>-                         OvsReadPacketCmdHandler,
>                          OvsNewDpCmdHandler,
>                          OvsGetDpCmdHandler,
>                          OvsSetDpCmdHandler;
>@@ -102,7 +99,10 @@ NetlinkCmdHandler        OvsGetNetdevCmdHandler,
>                          OvsGetVportCmdHandler,
>                          OvsSetVportCmdHandler,
>                          OvsNewVportCmdHandler,
>-                         OvsDeleteVportCmdHandler;
>+                         OvsDeleteVportCmdHandler,
>+                         OvsPendPacketCmdHandler,
>+                         OvsSubscribePacketCmdHandler,
>+                         OvsReadPacketCmdHandler;
> 
> static NTSTATUS HandleGetDpTransaction(POVS_USER_PARAMS_CONTEXT
>usrParamsCtx,
>                                        UINT32 *replyLen);
>@@ -1591,112 +1591,4 @@ OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT
>usrParamsCtx,
> 
> cleanup:
>     return status;
>-}
>-
>-/*
>- * 
>--------------------------------------------------------------------------
>- * Handler for reading missed pacckets from the driver event queue. This
>- * handler is executed when user modes issues a socket receive on a
>socket
>- * 
>--------------------------------------------------------------------------
>- */
>-static NTSTATUS
>-OvsReadPacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
>-                       UINT32 *replyLen)
>-{
>-#ifdef DBG
>-    POVS_MESSAGE msgOut = (POVS_MESSAGE)usrParamsCtx->outputBuffer;
>-#endif
>-    POVS_OPEN_INSTANCE instance =
>-        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
>-    NTSTATUS status;
>-
>-    ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
>-
>-    /* Should never read events with a dump socket */
>-    ASSERT(instance->dumpState.ovsMsg == NULL);
>-
>-    /* Must have an packet queue */
>-    ASSERT(instance->packetQueue != NULL);
>-
>-    /* Output buffer has been validated while validating read dev op. */
>-    ASSERT(msgOut != NULL && usrParamsCtx->outputLength >= sizeof
>*msgOut);
>-
>-    /* Read a packet from the instance queue */
>-    status = OvsReadDpIoctl(instance->fileObject,
>usrParamsCtx->outputBuffer,
>-                            usrParamsCtx->outputLength, replyLen);
>-    return status;
>-}
>-
>-/*
>- * 
>--------------------------------------------------------------------------
>- *  Handler for the subscription for a packet queue
>- * 
>--------------------------------------------------------------------------
>- */
>-static NTSTATUS
>-OvsSubscribePacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
>-                            UINT32 *replyLen)
>-{
>-    NDIS_STATUS status;
>-    BOOLEAN rc;
>-    UINT8 join;
>-    UINT32 pid;
>-    const NL_POLICY policy[] =  {
>-        [OVS_NL_ATTR_PACKET_PID] = {.type = NL_A_U32 },
>-        [OVS_NL_ATTR_PACKET_SUBSCRIBE] = {.type = NL_A_U8 }
>-        };
>-    PNL_ATTR attrs[ARRAY_SIZE(policy)];
>-
>-    UNREFERENCED_PARAMETER(replyLen);
>-
>-    POVS_OPEN_INSTANCE instance =
>-        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
>-    POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;
>-
>-    rc = NlAttrParse(&msgIn->nlMsg, sizeof (*msgIn),
>-         NlMsgAttrsLen((PNL_MSG_HDR)msgIn), policy, ARRAY_SIZE(policy),
>-                       attrs, ARRAY_SIZE(attrs));
>-    if (!rc) {
>-        status = STATUS_INVALID_PARAMETER;
>-        goto done;
>-    }
>-
>-    join = NlAttrGetU8(attrs[OVS_NL_ATTR_PACKET_PID]);
>-    pid = NlAttrGetU32(attrs[OVS_NL_ATTR_PACKET_PID]);
>-
>-    /* The socket subscribed with must be the same socket we perform
>receive*/
>-    ASSERT(pid == instance->pid);
>-
>-    status = OvsSubscribeDpIoctl(instance, pid, join);
>-
>-    /*
>-     * XXX Need to add this instance to a global data structure
>-     * which hold all packet based instances. The data structure (hash)
>-     * should be searched through the pid field of the instance for
>-     * placing the missed packet into the correct queue
>-     */
>-done:
>-    return status;
>-}
>-
>-/*
>- * 
>--------------------------------------------------------------------------
>- * Handler for queueing an IRP used for missed packet notification. The
>IRP is
>- * completed when a packet received and mismatched. STATUS_PENDING is
>returned
>- * on success. User mode keep a pending IRP at all times.
>- * 
>--------------------------------------------------------------------------
>- */
>-static NTSTATUS
>-OvsPendPacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
>-                       UINT32 *replyLen)
>-{
>-    UNREFERENCED_PARAMETER(replyLen);
>-
>-    POVS_OPEN_INSTANCE instance =
>-        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
>-
>-    /*
>-     * XXX access to packet queue must be through acquiring a lock as
>user mode
>-     * could unsubscribe and the instnace will be freed.
>-     */
>-    return OvsWaitDpIoctl(usrParamsCtx->irp, instance->fileObject);
>-}
>+}
>\ No newline at end of file
>diff --git a/datapath-windows/ovsext/User.c
>b/datapath-windows/ovsext/User.c
>index 8045e9a..0bbf690 100644
>--- a/datapath-windows/ovsext/User.c
>+++ b/datapath-windows/ovsext/User.c
>@@ -1156,3 +1156,111 @@ fail:
>     OvsFreeMemoryWithTag(elem, OVS_USER_POOL_TAG);
>     return NULL;
> }
>+
>+/*
>+ * 
>--------------------------------------------------------------------------
>+ *  Handler for the subscription for a packet queue
>+ * 
>--------------------------------------------------------------------------
>+ */
>+NTSTATUS
>+OvsSubscribePacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
>+                            UINT32 *replyLen)
>+{
>+    NDIS_STATUS status;
>+    BOOLEAN rc;
>+    UINT8 join;
>+    UINT32 pid;
>+    const NL_POLICY policy[] =  {
>+        [OVS_NL_ATTR_PACKET_PID] = {.type = NL_A_U32 },
>+        [OVS_NL_ATTR_PACKET_SUBSCRIBE] = {.type = NL_A_U8 }
>+        };
>+    PNL_ATTR attrs[ARRAY_SIZE(policy)];
>+
>+    UNREFERENCED_PARAMETER(replyLen);
>+
>+    POVS_OPEN_INSTANCE instance =
>+        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
>+    POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;
>+
>+    rc = NlAttrParse(&msgIn->nlMsg, sizeof (*msgIn),
>+         NlMsgAttrsLen((PNL_MSG_HDR)msgIn), policy, ARRAY_SIZE(policy),
>+                       attrs, ARRAY_SIZE(attrs));
>+    if (!rc) {
>+        status = STATUS_INVALID_PARAMETER;
>+        goto done;
>+    }
>+
>+    join = NlAttrGetU8(attrs[OVS_NL_ATTR_PACKET_PID]);
>+    pid = NlAttrGetU32(attrs[OVS_NL_ATTR_PACKET_PID]);
>+
>+    /* The socket subscribed with must be the same socket we perform
>receive*/
>+    ASSERT(pid == instance->pid);
>+
>+    status = OvsSubscribeDpIoctl(instance, pid, join);
>+
>+    /*
>+     * XXX Need to add this instance to a global data structure
>+     * which hold all packet based instances. The data structure (hash)
>+     * should be searched through the pid field of the instance for
>+     * placing the missed packet into the correct queue
>+     */
>+done:
>+    return status;
>+}
>+
>+/*
>+ * 
>--------------------------------------------------------------------------
>+ * Handler for queueing an IRP used for missed packet notification. The
>IRP is
>+ * completed when a packet received and mismatched. STATUS_PENDING is
>returned
>+ * on success. User mode keep a pending IRP at all times.
>+ * 
>--------------------------------------------------------------------------
>+ */
>+NTSTATUS
>+OvsPendPacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
>+                       UINT32 *replyLen)
>+{
>+    UNREFERENCED_PARAMETER(replyLen);
>+
>+    POVS_OPEN_INSTANCE instance =
>+        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
>+
>+    /*
>+     * XXX access to packet queue must be through acquiring a lock as
>user mode
>+     * could unsubscribe and the instnace will be freed.
>+     */
>+    return OvsWaitDpIoctl(usrParamsCtx->irp, instance->fileObject);
>+}
>+
>+/*
>+ * 
>--------------------------------------------------------------------------
>+ * Handler for reading missed pacckets from the driver event queue. This
>+ * handler is executed when user modes issues a socket receive on a
>socket
>+ * 
>--------------------------------------------------------------------------
>+ */
>+NTSTATUS
>+OvsReadPacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
>+                       UINT32 *replyLen)
>+{
>+#ifdef DBG
>+    POVS_MESSAGE msgOut = (POVS_MESSAGE)usrParamsCtx->outputBuffer;
>+#endif
>+    POVS_OPEN_INSTANCE instance =
>+        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
>+    NTSTATUS status;
>+
>+    ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
>+
>+    /* Should never read events with a dump socket */
>+    ASSERT(instance->dumpState.ovsMsg == NULL);
>+
>+    /* Must have an packet queue */
>+    ASSERT(instance->packetQueue != NULL);
>+
>+    /* Output buffer has been validated while validating read dev op. */
>+    ASSERT(msgOut != NULL && usrParamsCtx->outputLength >= sizeof
>*msgOut);
>+
>+    /* Read a packet from the instance queue */
>+    status = OvsReadDpIoctl(instance->fileObject,
>usrParamsCtx->outputBuffer,
>+                            usrParamsCtx->outputLength, replyLen);
>+    return status;
>+}
>\ No newline at end of file
>diff --git a/datapath-windows/ovsext/User.h
>b/datapath-windows/ovsext/User.h
>index 139b0ca..8b80ded 100644
>--- a/datapath-windows/ovsext/User.h
>+++ b/datapath-windows/ovsext/User.h
>@@ -118,4 +118,11 @@ OvsAddPidInstance(POVS_SWITCH_CONTEXT switchContext,
>UINT32 pid,
> VOID
> OvsDelPidInstance(POVS_SWITCH_CONTEXT switchContext, UINT32 pid);
> 
>+NTSTATUS OvsReadPacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
>+                                 UINT32 *replyLen);
>+NTSTATUS OvsSubscribePacketCmdHandler(POVS_USER_PARAMS_CONTEXT
>usrParamsCtx,
>+                                      UINT32 *replyLen);
>+NTSTATUS OvsPendPacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
>+                                 UINT32 *replyLen);
>+
> #endif /* __USER_H_ */
>-- 
>1.8.5.6
>
>_______________________________________________
>dev mailing list
>dev@openvswitch.org
>https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma
>n_listinfo_dev&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=Dc
>ruz40PROJ40ROzSpxyQSLw6fcrOWpJgEcEmNR3JEQ&m=j63Wo7rMWKCOZgiXRmKU-B22tSUBQf
>ctzAxumlVHz0Q&s=ybInz0uRptiIxYqRL_9yoQVj9YUnTo0elcTJ-OeykcU&e=
Alin Serdean Sept. 23, 2015, 2:50 p.m. UTC | #2
I could not get the patch to apply. You will probably need to rebase.

Other comments inline.

Alin.

> -----Mesaj original-----

> De la: dev [mailto:dev-bounces@openvswitch.org] În numele Nithin Raju

> Trimis: Tuesday, September 15, 2015 9:52 PM

> Către: dev@openvswitch.org

> Subiect: [ovs-dev] [PATCH 1/4] datapath-windows: move packet read code

> to User.c

> 

> Simple code motion.

> 

> Signed-off-by: Nithin Raju <nithin@vmware.com>

> ---

>  datapath-windows/ovsext/Datapath.c | 118 ++-----------------------------------

>  datapath-windows/ovsext/User.c     | 108

> +++++++++++++++++++++++++++++++++

>  datapath-windows/ovsext/User.h     |   7 +++

>  3 files changed, 120 insertions(+), 113 deletions(-)

> 

> diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-

> windows/ovsext/Datapath.c

> index b7bbf80..409c4bb 100644

> --- a/datapath-windows/ovsext/Datapath.c

> +++ b/datapath-windows/ovsext/Datapath.c

> @@ -89,11 +89,8 @@ typedef struct _NETLINK_FAMILY {

> 

>  /* Handlers for the various netlink commands. */  static NetlinkCmdHandler

> OvsPendEventCmdHandler,

> -                         OvsPendPacketCmdHandler,

>                           OvsSubscribeEventCmdHandler,

> -                         OvsSubscribePacketCmdHandler,

>                           OvsReadEventCmdHandler,

> -                         OvsReadPacketCmdHandler,

>                           OvsNewDpCmdHandler,

>                           OvsGetDpCmdHandler,

>                           OvsSetDpCmdHandler;

> @@ -102,7 +99,10 @@ NetlinkCmdHandler        OvsGetNetdevCmdHandler,

>                           OvsGetVportCmdHandler,

>                           OvsSetVportCmdHandler,

>                           OvsNewVportCmdHandler,

> -                         OvsDeleteVportCmdHandler;

> +                         OvsDeleteVportCmdHandler,

> +                         OvsPendPacketCmdHandler,

> +                         OvsSubscribePacketCmdHandler,

> +                         OvsReadPacketCmdHandler;

> 

>  static NTSTATUS HandleGetDpTransaction(POVS_USER_PARAMS_CONTEXT

> usrParamsCtx,

>                                         UINT32 *replyLen); @@ -1591,112 +1591,4 @@

> OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,

> 

>  cleanup:

>      return status;

> -}

[Alin Gabriel Serdean: ] Miss delete probably :).
> -

> -/*

> - * --------------------------------------------------------------------------

> - * Handler for reading missed pacckets from the driver event queue. This

> - * handler is executed when user modes issues a socket receive on a socket

> - * --------------------------------------------------------------------------

> - */

> -static NTSTATUS

> -OvsReadPacketCmdHandler(POVS_USER_PARAMS_CONTEXT

> usrParamsCtx,

> -                       UINT32 *replyLen)

> -{

> -#ifdef DBG

> -    POVS_MESSAGE msgOut = (POVS_MESSAGE)usrParamsCtx-

> >outputBuffer;

> -#endif

> -    POVS_OPEN_INSTANCE instance =

> -        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;

> -    NTSTATUS status;

> -

> -    ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);

> -

> -    /* Should never read events with a dump socket */

> -    ASSERT(instance->dumpState.ovsMsg == NULL);

> -

> -    /* Must have an packet queue */

> -    ASSERT(instance->packetQueue != NULL);

> -

> -    /* Output buffer has been validated while validating read dev op. */

> -    ASSERT(msgOut != NULL && usrParamsCtx->outputLength >= sizeof

> *msgOut);

> -

> -    /* Read a packet from the instance queue */

> -    status = OvsReadDpIoctl(instance->fileObject, usrParamsCtx-

> >outputBuffer,

> -                            usrParamsCtx->outputLength, replyLen);

> -    return status;

> -}

> -

> -/*

> - * --------------------------------------------------------------------------

> - *  Handler for the subscription for a packet queue

> - * --------------------------------------------------------------------------

> - */

> -static NTSTATUS

> -OvsSubscribePacketCmdHandler(POVS_USER_PARAMS_CONTEXT

> usrParamsCtx,

> -                            UINT32 *replyLen)

> -{

> -    NDIS_STATUS status;

> -    BOOLEAN rc;

> -    UINT8 join;

> -    UINT32 pid;

> -    const NL_POLICY policy[] =  {

> -        [OVS_NL_ATTR_PACKET_PID] = {.type = NL_A_U32 },

> -        [OVS_NL_ATTR_PACKET_SUBSCRIBE] = {.type = NL_A_U8 }

> -        };

> -    PNL_ATTR attrs[ARRAY_SIZE(policy)];

> -

> -    UNREFERENCED_PARAMETER(replyLen);

> -

> -    POVS_OPEN_INSTANCE instance =

> -        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;

> -    POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;

> -

> -    rc = NlAttrParse(&msgIn->nlMsg, sizeof (*msgIn),

> -         NlMsgAttrsLen((PNL_MSG_HDR)msgIn), policy, ARRAY_SIZE(policy),

> -                       attrs, ARRAY_SIZE(attrs));

> -    if (!rc) {

> -        status = STATUS_INVALID_PARAMETER;

> -        goto done;

> -    }

> -

> -    join = NlAttrGetU8(attrs[OVS_NL_ATTR_PACKET_PID]);

> -    pid = NlAttrGetU32(attrs[OVS_NL_ATTR_PACKET_PID]);

> -

> -    /* The socket subscribed with must be the same socket we perform

> receive*/

> -    ASSERT(pid == instance->pid);

> -

> -    status = OvsSubscribeDpIoctl(instance, pid, join);

> -

> -    /*

> -     * XXX Need to add this instance to a global data structure

> -     * which hold all packet based instances. The data structure (hash)

> -     * should be searched through the pid field of the instance for

> -     * placing the missed packet into the correct queue

> -     */

> -done:

> -    return status;

> -}

> -

> -/*

> - * --------------------------------------------------------------------------

> - * Handler for queueing an IRP used for missed packet notification. The IRP

> is

> - * completed when a packet received and mismatched. STATUS_PENDING is

> returned

> - * on success. User mode keep a pending IRP at all times.

> - * --------------------------------------------------------------------------

> - */

> -static NTSTATUS

> -OvsPendPacketCmdHandler(POVS_USER_PARAMS_CONTEXT

> usrParamsCtx,

> -                       UINT32 *replyLen)

> -{

> -    UNREFERENCED_PARAMETER(replyLen);

> -

> -    POVS_OPEN_INSTANCE instance =

> -        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;

> -

> -    /*

> -     * XXX access to packet queue must be through acquiring a lock as user

> mode

> -     * could unsubscribe and the instnace will be freed.

> -     */

> -    return OvsWaitDpIoctl(usrParamsCtx->irp, instance->fileObject);

> -}

> +}

> \ No newline at end of file

[Alin Gabriel Serdean: ] Could you also add a newline to the file.
> diff --git a/datapath-windows/ovsext/User.c b/datapath-

> windows/ovsext/User.c index 8045e9a..0bbf690 100644

> --- a/datapath-windows/ovsext/User.c

> +++ b/datapath-windows/ovsext/User.c

> @@ -1156,3 +1156,111 @@ fail:

>      OvsFreeMemoryWithTag(elem, OVS_USER_POOL_TAG);

>      return NULL;

>  }

> +

> +/*

> + *

> +-----------------------------------------------------------------------

> +---

> + *  Handler for the subscription for a packet queue

> + *

> +-----------------------------------------------------------------------

> +---

> + */

> +NTSTATUS

> +OvsSubscribePacketCmdHandler(POVS_USER_PARAMS_CONTEXT

> usrParamsCtx,

> +                            UINT32 *replyLen) {

> +    NDIS_STATUS status;

> +    BOOLEAN rc;

> +    UINT8 join;

> +    UINT32 pid;

> +    const NL_POLICY policy[] =  {

> +        [OVS_NL_ATTR_PACKET_PID] = {.type = NL_A_U32 },

> +        [OVS_NL_ATTR_PACKET_SUBSCRIBE] = {.type = NL_A_U8 }

> +        };

> +    PNL_ATTR attrs[ARRAY_SIZE(policy)];

> +

> +    UNREFERENCED_PARAMETER(replyLen);

> +

> +    POVS_OPEN_INSTANCE instance =

> +        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;

> +    POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;

> +

> +    rc = NlAttrParse(&msgIn->nlMsg, sizeof (*msgIn),

> +         NlMsgAttrsLen((PNL_MSG_HDR)msgIn), policy, ARRAY_SIZE(policy),

> +                       attrs, ARRAY_SIZE(attrs));

> +    if (!rc) {

> +        status = STATUS_INVALID_PARAMETER;

> +        goto done;

> +    }

> +

> +    join = NlAttrGetU8(attrs[OVS_NL_ATTR_PACKET_PID]);

> +    pid = NlAttrGetU32(attrs[OVS_NL_ATTR_PACKET_PID]);

> +

> +    /* The socket subscribed with must be the same socket we perform

> receive*/

> +    ASSERT(pid == instance->pid);

> +

> +    status = OvsSubscribeDpIoctl(instance, pid, join);

> +

> +    /*

> +     * XXX Need to add this instance to a global data structure

> +     * which hold all packet based instances. The data structure (hash)

> +     * should be searched through the pid field of the instance for

> +     * placing the missed packet into the correct queue

> +     */

> +done:

> +    return status;

> +}

> +

> +/*

> + *

> +-----------------------------------------------------------------------

> +---

> + * Handler for queueing an IRP used for missed packet notification. The

> +IRP is

> + * completed when a packet received and mismatched. STATUS_PENDING

> is

> +returned

> + * on success. User mode keep a pending IRP at all times.

> + *

> +-----------------------------------------------------------------------

> +---

> + */

> +NTSTATUS

> +OvsPendPacketCmdHandler(POVS_USER_PARAMS_CONTEXT

> usrParamsCtx,

> +                       UINT32 *replyLen) {

> +    UNREFERENCED_PARAMETER(replyLen);

> +

> +    POVS_OPEN_INSTANCE instance =

> +        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;

> +

> +    /*

> +     * XXX access to packet queue must be through acquiring a lock as user

> mode

> +     * could unsubscribe and the instnace will be freed.

> +     */

> +    return OvsWaitDpIoctl(usrParamsCtx->irp, instance->fileObject); }

> +

> +/*

> + *

> +-----------------------------------------------------------------------

> +---

> + * Handler for reading missed pacckets from the driver event queue.

> +This

> + * handler is executed when user modes issues a socket receive on a

> +socket

> + *

> +-----------------------------------------------------------------------

> +---

> + */

> +NTSTATUS

> +OvsReadPacketCmdHandler(POVS_USER_PARAMS_CONTEXT

> usrParamsCtx,

> +                       UINT32 *replyLen) { #ifdef DBG

> +    POVS_MESSAGE msgOut = (POVS_MESSAGE)usrParamsCtx-

> >outputBuffer;

> +#endif

> +    POVS_OPEN_INSTANCE instance =

> +        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;

> +    NTSTATUS status;

> +

> +    ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);

> +

> +    /* Should never read events with a dump socket */

> +    ASSERT(instance->dumpState.ovsMsg == NULL);

> +

> +    /* Must have an packet queue */

> +    ASSERT(instance->packetQueue != NULL);

> +

> +    /* Output buffer has been validated while validating read dev op. */

> +    ASSERT(msgOut != NULL && usrParamsCtx->outputLength >= sizeof

> + *msgOut);

> +

> +    /* Read a packet from the instance queue */

> +    status = OvsReadDpIoctl(instance->fileObject, usrParamsCtx-

> >outputBuffer,

> +                            usrParamsCtx->outputLength, replyLen);

> +    return status;

> +}

> \ No newline at end of file

[Alin Gabriel Serdean: ] Could you also add a new line here as well.
> diff --git a/datapath-windows/ovsext/User.h b/datapath-

> windows/ovsext/User.h index 139b0ca..8b80ded 100644

> --- a/datapath-windows/ovsext/User.h

> +++ b/datapath-windows/ovsext/User.h

> @@ -118,4 +118,11 @@ OvsAddPidInstance(POVS_SWITCH_CONTEXT

> switchContext, UINT32 pid,  VOID

> OvsDelPidInstance(POVS_SWITCH_CONTEXT switchContext, UINT32 pid);

> 

> +NTSTATUS OvsReadPacketCmdHandler(POVS_USER_PARAMS_CONTEXT

> usrParamsCtx,

> +                                 UINT32 *replyLen); NTSTATUS

> +OvsSubscribePacketCmdHandler(POVS_USER_PARAMS_CONTEXT

> usrParamsCtx,

> +                                      UINT32 *replyLen); NTSTATUS

> +OvsPendPacketCmdHandler(POVS_USER_PARAMS_CONTEXT

> usrParamsCtx,

> +                                 UINT32 *replyLen);

> +

>  #endif /* __USER_H_ */

> --

> 1.8.5.6

> 

> _______________________________________________

> dev mailing list

> dev@openvswitch.org

> http://openvswitch.org/mailman/listinfo/dev
Nithin Raju Sept. 23, 2015, 3:46 p.m. UTC | #3
I didn’t have any issues in rebasing. Will be sending out the v2 in a bit.

-- Nithin


> On Sep 23, 2015, at 7:50 AM, Alin Serdean <aserdean@cloudbasesolutions.com> wrote:

> 

> I could not get the patch to apply. You will probably need to rebase.

> 

> Other comments inline.

> 

> Alin.

> 

>> -----Mesaj original-----

>> De la: dev [mailto:dev-bounces@openvswitch.org] În numele Nithin Raju

>> Trimis: Tuesday, September 15, 2015 9:52 PM

>> Către: dev@openvswitch.org

>> Subiect: [ovs-dev] [PATCH 1/4] datapath-windows: move packet read code

>> to User.c

>> 

>> Simple code motion.

>> 

>> Signed-off-by: Nithin Raju <nithin@vmware.com>

>> ---

>> datapath-windows/ovsext/Datapath.c | 118 ++-----------------------------------

>> datapath-windows/ovsext/User.c     | 108

>> +++++++++++++++++++++++++++++++++

>> datapath-windows/ovsext/User.h     |   7 +++

>> 3 files changed, 120 insertions(+), 113 deletions(-)

>> 

>> diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-

>> windows/ovsext/Datapath.c

>> index b7bbf80..409c4bb 100644

>> --- a/datapath-windows/ovsext/Datapath.c

>> +++ b/datapath-windows/ovsext/Datapath.c

>> @@ -89,11 +89,8 @@ typedef struct _NETLINK_FAMILY {

>> 

>> /* Handlers for the various netlink commands. */  static NetlinkCmdHandler

>> OvsPendEventCmdHandler,

>> -                         OvsPendPacketCmdHandler,

>>                          OvsSubscribeEventCmdHandler,

>> -                         OvsSubscribePacketCmdHandler,

>>                          OvsReadEventCmdHandler,

>> -                         OvsReadPacketCmdHandler,

>>                          OvsNewDpCmdHandler,

>>                          OvsGetDpCmdHandler,

>>                          OvsSetDpCmdHandler;

>> @@ -102,7 +99,10 @@ NetlinkCmdHandler        OvsGetNetdevCmdHandler,

>>                          OvsGetVportCmdHandler,

>>                          OvsSetVportCmdHandler,

>>                          OvsNewVportCmdHandler,

>> -                         OvsDeleteVportCmdHandler;

>> +                         OvsDeleteVportCmdHandler,

>> +                         OvsPendPacketCmdHandler,

>> +                         OvsSubscribePacketCmdHandler,

>> +                         OvsReadPacketCmdHandler;

>> 

>> static NTSTATUS HandleGetDpTransaction(POVS_USER_PARAMS_CONTEXT

>> usrParamsCtx,

>>                                        UINT32 *replyLen); @@ -1591,112 +1591,4 @@

>> OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,

>> 

>> cleanup:

>>     return status;

>> -}

> [Alin Gabriel Serdean: ] Miss delete probably :).

>> -

>> -/*

>> - * --------------------------------------------------------------------------

>> - * Handler for reading missed pacckets from the driver event queue. This

>> - * handler is executed when user modes issues a socket receive on a socket

>> - * --------------------------------------------------------------------------

>> - */

>> -static NTSTATUS

>> -OvsReadPacketCmdHandler(POVS_USER_PARAMS_CONTEXT

>> usrParamsCtx,

>> -                       UINT32 *replyLen)

>> -{

>> -#ifdef DBG

>> -    POVS_MESSAGE msgOut = (POVS_MESSAGE)usrParamsCtx-

>>> outputBuffer;

>> -#endif

>> -    POVS_OPEN_INSTANCE instance =

>> -        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;

>> -    NTSTATUS status;

>> -

>> -    ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);

>> -

>> -    /* Should never read events with a dump socket */

>> -    ASSERT(instance->dumpState.ovsMsg == NULL);

>> -

>> -    /* Must have an packet queue */

>> -    ASSERT(instance->packetQueue != NULL);

>> -

>> -    /* Output buffer has been validated while validating read dev op. */

>> -    ASSERT(msgOut != NULL && usrParamsCtx->outputLength >= sizeof

>> *msgOut);

>> -

>> -    /* Read a packet from the instance queue */

>> -    status = OvsReadDpIoctl(instance->fileObject, usrParamsCtx-

>>> outputBuffer,

>> -                            usrParamsCtx->outputLength, replyLen);

>> -    return status;

>> -}

>> -

>> -/*

>> - * --------------------------------------------------------------------------

>> - *  Handler for the subscription for a packet queue

>> - * --------------------------------------------------------------------------

>> - */

>> -static NTSTATUS

>> -OvsSubscribePacketCmdHandler(POVS_USER_PARAMS_CONTEXT

>> usrParamsCtx,

>> -                            UINT32 *replyLen)

>> -{

>> -    NDIS_STATUS status;

>> -    BOOLEAN rc;

>> -    UINT8 join;

>> -    UINT32 pid;

>> -    const NL_POLICY policy[] =  {

>> -        [OVS_NL_ATTR_PACKET_PID] = {.type = NL_A_U32 },

>> -        [OVS_NL_ATTR_PACKET_SUBSCRIBE] = {.type = NL_A_U8 }

>> -        };

>> -    PNL_ATTR attrs[ARRAY_SIZE(policy)];

>> -

>> -    UNREFERENCED_PARAMETER(replyLen);

>> -

>> -    POVS_OPEN_INSTANCE instance =

>> -        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;

>> -    POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;

>> -

>> -    rc = NlAttrParse(&msgIn->nlMsg, sizeof (*msgIn),

>> -         NlMsgAttrsLen((PNL_MSG_HDR)msgIn), policy, ARRAY_SIZE(policy),

>> -                       attrs, ARRAY_SIZE(attrs));

>> -    if (!rc) {

>> -        status = STATUS_INVALID_PARAMETER;

>> -        goto done;

>> -    }

>> -

>> -    join = NlAttrGetU8(attrs[OVS_NL_ATTR_PACKET_PID]);

>> -    pid = NlAttrGetU32(attrs[OVS_NL_ATTR_PACKET_PID]);

>> -

>> -    /* The socket subscribed with must be the same socket we perform

>> receive*/

>> -    ASSERT(pid == instance->pid);

>> -

>> -    status = OvsSubscribeDpIoctl(instance, pid, join);

>> -

>> -    /*

>> -     * XXX Need to add this instance to a global data structure

>> -     * which hold all packet based instances. The data structure (hash)

>> -     * should be searched through the pid field of the instance for

>> -     * placing the missed packet into the correct queue

>> -     */

>> -done:

>> -    return status;

>> -}

>> -

>> -/*

>> - * --------------------------------------------------------------------------

>> - * Handler for queueing an IRP used for missed packet notification. The IRP

>> is

>> - * completed when a packet received and mismatched. STATUS_PENDING is

>> returned

>> - * on success. User mode keep a pending IRP at all times.

>> - * --------------------------------------------------------------------------

>> - */

>> -static NTSTATUS

>> -OvsPendPacketCmdHandler(POVS_USER_PARAMS_CONTEXT

>> usrParamsCtx,

>> -                       UINT32 *replyLen)

>> -{

>> -    UNREFERENCED_PARAMETER(replyLen);

>> -

>> -    POVS_OPEN_INSTANCE instance =

>> -        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;

>> -

>> -    /*

>> -     * XXX access to packet queue must be through acquiring a lock as user

>> mode

>> -     * could unsubscribe and the instnace will be freed.

>> -     */

>> -    return OvsWaitDpIoctl(usrParamsCtx->irp, instance->fileObject);

>> -}

>> +}

>> \ No newline at end of file

> [Alin Gabriel Serdean: ] Could you also add a newline to the file.

>> diff --git a/datapath-windows/ovsext/User.c b/datapath-

>> windows/ovsext/User.c index 8045e9a..0bbf690 100644

>> --- a/datapath-windows/ovsext/User.c

>> +++ b/datapath-windows/ovsext/User.c

>> @@ -1156,3 +1156,111 @@ fail:

>>     OvsFreeMemoryWithTag(elem, OVS_USER_POOL_TAG);

>>     return NULL;

>> }

>> +

>> +/*

>> + *

>> +-----------------------------------------------------------------------

>> +---

>> + *  Handler for the subscription for a packet queue

>> + *

>> +-----------------------------------------------------------------------

>> +---

>> + */

>> +NTSTATUS

>> +OvsSubscribePacketCmdHandler(POVS_USER_PARAMS_CONTEXT

>> usrParamsCtx,

>> +                            UINT32 *replyLen) {

>> +    NDIS_STATUS status;

>> +    BOOLEAN rc;

>> +    UINT8 join;

>> +    UINT32 pid;

>> +    const NL_POLICY policy[] =  {

>> +        [OVS_NL_ATTR_PACKET_PID] = {.type = NL_A_U32 },

>> +        [OVS_NL_ATTR_PACKET_SUBSCRIBE] = {.type = NL_A_U8 }

>> +        };

>> +    PNL_ATTR attrs[ARRAY_SIZE(policy)];

>> +

>> +    UNREFERENCED_PARAMETER(replyLen);

>> +

>> +    POVS_OPEN_INSTANCE instance =

>> +        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;

>> +    POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;

>> +

>> +    rc = NlAttrParse(&msgIn->nlMsg, sizeof (*msgIn),

>> +         NlMsgAttrsLen((PNL_MSG_HDR)msgIn), policy, ARRAY_SIZE(policy),

>> +                       attrs, ARRAY_SIZE(attrs));

>> +    if (!rc) {

>> +        status = STATUS_INVALID_PARAMETER;

>> +        goto done;

>> +    }

>> +

>> +    join = NlAttrGetU8(attrs[OVS_NL_ATTR_PACKET_PID]);

>> +    pid = NlAttrGetU32(attrs[OVS_NL_ATTR_PACKET_PID]);

>> +

>> +    /* The socket subscribed with must be the same socket we perform

>> receive*/

>> +    ASSERT(pid == instance->pid);

>> +

>> +    status = OvsSubscribeDpIoctl(instance, pid, join);

>> +

>> +    /*

>> +     * XXX Need to add this instance to a global data structure

>> +     * which hold all packet based instances. The data structure (hash)

>> +     * should be searched through the pid field of the instance for

>> +     * placing the missed packet into the correct queue

>> +     */

>> +done:

>> +    return status;

>> +}

>> +

>> +/*

>> + *

>> +-----------------------------------------------------------------------

>> +---

>> + * Handler for queueing an IRP used for missed packet notification. The

>> +IRP is

>> + * completed when a packet received and mismatched. STATUS_PENDING

>> is

>> +returned

>> + * on success. User mode keep a pending IRP at all times.

>> + *

>> +-----------------------------------------------------------------------

>> +---

>> + */

>> +NTSTATUS

>> +OvsPendPacketCmdHandler(POVS_USER_PARAMS_CONTEXT

>> usrParamsCtx,

>> +                       UINT32 *replyLen) {

>> +    UNREFERENCED_PARAMETER(replyLen);

>> +

>> +    POVS_OPEN_INSTANCE instance =

>> +        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;

>> +

>> +    /*

>> +     * XXX access to packet queue must be through acquiring a lock as user

>> mode

>> +     * could unsubscribe and the instnace will be freed.

>> +     */

>> +    return OvsWaitDpIoctl(usrParamsCtx->irp, instance->fileObject); }

>> +

>> +/*

>> + *

>> +-----------------------------------------------------------------------

>> +---

>> + * Handler for reading missed pacckets from the driver event queue.

>> +This

>> + * handler is executed when user modes issues a socket receive on a

>> +socket

>> + *

>> +-----------------------------------------------------------------------

>> +---

>> + */

>> +NTSTATUS

>> +OvsReadPacketCmdHandler(POVS_USER_PARAMS_CONTEXT

>> usrParamsCtx,

>> +                       UINT32 *replyLen) { #ifdef DBG

>> +    POVS_MESSAGE msgOut = (POVS_MESSAGE)usrParamsCtx-

>>> outputBuffer;

>> +#endif

>> +    POVS_OPEN_INSTANCE instance =

>> +        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;

>> +    NTSTATUS status;

>> +

>> +    ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);

>> +

>> +    /* Should never read events with a dump socket */

>> +    ASSERT(instance->dumpState.ovsMsg == NULL);

>> +

>> +    /* Must have an packet queue */

>> +    ASSERT(instance->packetQueue != NULL);

>> +

>> +    /* Output buffer has been validated while validating read dev op. */

>> +    ASSERT(msgOut != NULL && usrParamsCtx->outputLength >= sizeof

>> + *msgOut);

>> +

>> +    /* Read a packet from the instance queue */

>> +    status = OvsReadDpIoctl(instance->fileObject, usrParamsCtx-

>>> outputBuffer,

>> +                            usrParamsCtx->outputLength, replyLen);

>> +    return status;

>> +}

>> \ No newline at end of file

> [Alin Gabriel Serdean: ] Could you also add a new line here as well.

>> diff --git a/datapath-windows/ovsext/User.h b/datapath-

>> windows/ovsext/User.h index 139b0ca..8b80ded 100644

>> --- a/datapath-windows/ovsext/User.h

>> +++ b/datapath-windows/ovsext/User.h

>> @@ -118,4 +118,11 @@ OvsAddPidInstance(POVS_SWITCH_CONTEXT

>> switchContext, UINT32 pid,  VOID

>> OvsDelPidInstance(POVS_SWITCH_CONTEXT switchContext, UINT32 pid);

>> 

>> +NTSTATUS OvsReadPacketCmdHandler(POVS_USER_PARAMS_CONTEXT

>> usrParamsCtx,

>> +                                 UINT32 *replyLen); NTSTATUS

>> +OvsSubscribePacketCmdHandler(POVS_USER_PARAMS_CONTEXT

>> usrParamsCtx,

>> +                                      UINT32 *replyLen); NTSTATUS

>> +OvsPendPacketCmdHandler(POVS_USER_PARAMS_CONTEXT

>> usrParamsCtx,

>> +                                 UINT32 *replyLen);

>> +

>> #endif /* __USER_H_ */

>> --

>> 1.8.5.6

>> 

>> _______________________________________________

>> dev mailing list

>> dev@openvswitch.org

>> https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailman_listinfo_dev&d=BQIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=pNHQcdr7B40b4h6Yb7FIedI1dnBsxdDuTLBYD3JqV80&m=-Y4hlW7yhN-E0_PMVwjFLop-42cI4ONzZjK1l0XaURs&s=O3P3RWIneV68cIa1tGn_X2GvhyrhX9ETt5dvuewMJrw&e=
diff mbox

Patch

diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-windows/ovsext/Datapath.c
index b7bbf80..409c4bb 100644
--- a/datapath-windows/ovsext/Datapath.c
+++ b/datapath-windows/ovsext/Datapath.c
@@ -89,11 +89,8 @@  typedef struct _NETLINK_FAMILY {
 
 /* Handlers for the various netlink commands. */
 static NetlinkCmdHandler OvsPendEventCmdHandler,
-                         OvsPendPacketCmdHandler,
                          OvsSubscribeEventCmdHandler,
-                         OvsSubscribePacketCmdHandler,
                          OvsReadEventCmdHandler,
-                         OvsReadPacketCmdHandler,
                          OvsNewDpCmdHandler,
                          OvsGetDpCmdHandler,
                          OvsSetDpCmdHandler;
@@ -102,7 +99,10 @@  NetlinkCmdHandler        OvsGetNetdevCmdHandler,
                          OvsGetVportCmdHandler,
                          OvsSetVportCmdHandler,
                          OvsNewVportCmdHandler,
-                         OvsDeleteVportCmdHandler;
+                         OvsDeleteVportCmdHandler,
+                         OvsPendPacketCmdHandler,
+                         OvsSubscribePacketCmdHandler,
+                         OvsReadPacketCmdHandler;
 
 static NTSTATUS HandleGetDpTransaction(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
                                        UINT32 *replyLen);
@@ -1591,112 +1591,4 @@  OvsReadEventCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
 
 cleanup:
     return status;
-}
-
-/*
- * --------------------------------------------------------------------------
- * Handler for reading missed pacckets from the driver event queue. This
- * handler is executed when user modes issues a socket receive on a socket
- * --------------------------------------------------------------------------
- */
-static NTSTATUS
-OvsReadPacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
-                       UINT32 *replyLen)
-{
-#ifdef DBG
-    POVS_MESSAGE msgOut = (POVS_MESSAGE)usrParamsCtx->outputBuffer;
-#endif
-    POVS_OPEN_INSTANCE instance =
-        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
-    NTSTATUS status;
-
-    ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
-
-    /* Should never read events with a dump socket */
-    ASSERT(instance->dumpState.ovsMsg == NULL);
-
-    /* Must have an packet queue */
-    ASSERT(instance->packetQueue != NULL);
-
-    /* Output buffer has been validated while validating read dev op. */
-    ASSERT(msgOut != NULL && usrParamsCtx->outputLength >= sizeof *msgOut);
-
-    /* Read a packet from the instance queue */
-    status = OvsReadDpIoctl(instance->fileObject, usrParamsCtx->outputBuffer,
-                            usrParamsCtx->outputLength, replyLen);
-    return status;
-}
-
-/*
- * --------------------------------------------------------------------------
- *  Handler for the subscription for a packet queue
- * --------------------------------------------------------------------------
- */
-static NTSTATUS
-OvsSubscribePacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
-                            UINT32 *replyLen)
-{
-    NDIS_STATUS status;
-    BOOLEAN rc;
-    UINT8 join;
-    UINT32 pid;
-    const NL_POLICY policy[] =  {
-        [OVS_NL_ATTR_PACKET_PID] = {.type = NL_A_U32 },
-        [OVS_NL_ATTR_PACKET_SUBSCRIBE] = {.type = NL_A_U8 }
-        };
-    PNL_ATTR attrs[ARRAY_SIZE(policy)];
-
-    UNREFERENCED_PARAMETER(replyLen);
-
-    POVS_OPEN_INSTANCE instance =
-        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
-    POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;
-
-    rc = NlAttrParse(&msgIn->nlMsg, sizeof (*msgIn),
-         NlMsgAttrsLen((PNL_MSG_HDR)msgIn), policy, ARRAY_SIZE(policy),
-                       attrs, ARRAY_SIZE(attrs));
-    if (!rc) {
-        status = STATUS_INVALID_PARAMETER;
-        goto done;
-    }
-
-    join = NlAttrGetU8(attrs[OVS_NL_ATTR_PACKET_PID]);
-    pid = NlAttrGetU32(attrs[OVS_NL_ATTR_PACKET_PID]);
-
-    /* The socket subscribed with must be the same socket we perform receive*/
-    ASSERT(pid == instance->pid);
-
-    status = OvsSubscribeDpIoctl(instance, pid, join);
-
-    /*
-     * XXX Need to add this instance to a global data structure
-     * which hold all packet based instances. The data structure (hash)
-     * should be searched through the pid field of the instance for
-     * placing the missed packet into the correct queue
-     */
-done:
-    return status;
-}
-
-/*
- * --------------------------------------------------------------------------
- * Handler for queueing an IRP used for missed packet notification. The IRP is
- * completed when a packet received and mismatched. STATUS_PENDING is returned
- * on success. User mode keep a pending IRP at all times.
- * --------------------------------------------------------------------------
- */
-static NTSTATUS
-OvsPendPacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
-                       UINT32 *replyLen)
-{
-    UNREFERENCED_PARAMETER(replyLen);
-
-    POVS_OPEN_INSTANCE instance =
-        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
-
-    /*
-     * XXX access to packet queue must be through acquiring a lock as user mode
-     * could unsubscribe and the instnace will be freed.
-     */
-    return OvsWaitDpIoctl(usrParamsCtx->irp, instance->fileObject);
-}
+}
\ No newline at end of file
diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c
index 8045e9a..0bbf690 100644
--- a/datapath-windows/ovsext/User.c
+++ b/datapath-windows/ovsext/User.c
@@ -1156,3 +1156,111 @@  fail:
     OvsFreeMemoryWithTag(elem, OVS_USER_POOL_TAG);
     return NULL;
 }
+
+/*
+ * --------------------------------------------------------------------------
+ *  Handler for the subscription for a packet queue
+ * --------------------------------------------------------------------------
+ */
+NTSTATUS
+OvsSubscribePacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
+                            UINT32 *replyLen)
+{
+    NDIS_STATUS status;
+    BOOLEAN rc;
+    UINT8 join;
+    UINT32 pid;
+    const NL_POLICY policy[] =  {
+        [OVS_NL_ATTR_PACKET_PID] = {.type = NL_A_U32 },
+        [OVS_NL_ATTR_PACKET_SUBSCRIBE] = {.type = NL_A_U8 }
+        };
+    PNL_ATTR attrs[ARRAY_SIZE(policy)];
+
+    UNREFERENCED_PARAMETER(replyLen);
+
+    POVS_OPEN_INSTANCE instance =
+        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
+    POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;
+
+    rc = NlAttrParse(&msgIn->nlMsg, sizeof (*msgIn),
+         NlMsgAttrsLen((PNL_MSG_HDR)msgIn), policy, ARRAY_SIZE(policy),
+                       attrs, ARRAY_SIZE(attrs));
+    if (!rc) {
+        status = STATUS_INVALID_PARAMETER;
+        goto done;
+    }
+
+    join = NlAttrGetU8(attrs[OVS_NL_ATTR_PACKET_PID]);
+    pid = NlAttrGetU32(attrs[OVS_NL_ATTR_PACKET_PID]);
+
+    /* The socket subscribed with must be the same socket we perform receive*/
+    ASSERT(pid == instance->pid);
+
+    status = OvsSubscribeDpIoctl(instance, pid, join);
+
+    /*
+     * XXX Need to add this instance to a global data structure
+     * which hold all packet based instances. The data structure (hash)
+     * should be searched through the pid field of the instance for
+     * placing the missed packet into the correct queue
+     */
+done:
+    return status;
+}
+
+/*
+ * --------------------------------------------------------------------------
+ * Handler for queueing an IRP used for missed packet notification. The IRP is
+ * completed when a packet received and mismatched. STATUS_PENDING is returned
+ * on success. User mode keep a pending IRP at all times.
+ * --------------------------------------------------------------------------
+ */
+NTSTATUS
+OvsPendPacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
+                       UINT32 *replyLen)
+{
+    UNREFERENCED_PARAMETER(replyLen);
+
+    POVS_OPEN_INSTANCE instance =
+        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
+
+    /*
+     * XXX access to packet queue must be through acquiring a lock as user mode
+     * could unsubscribe and the instnace will be freed.
+     */
+    return OvsWaitDpIoctl(usrParamsCtx->irp, instance->fileObject);
+}
+
+/*
+ * --------------------------------------------------------------------------
+ * Handler for reading missed pacckets from the driver event queue. This
+ * handler is executed when user modes issues a socket receive on a socket
+ * --------------------------------------------------------------------------
+ */
+NTSTATUS
+OvsReadPacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
+                       UINT32 *replyLen)
+{
+#ifdef DBG
+    POVS_MESSAGE msgOut = (POVS_MESSAGE)usrParamsCtx->outputBuffer;
+#endif
+    POVS_OPEN_INSTANCE instance =
+        (POVS_OPEN_INSTANCE)usrParamsCtx->ovsInstance;
+    NTSTATUS status;
+
+    ASSERT(usrParamsCtx->devOp == OVS_READ_DEV_OP);
+
+    /* Should never read events with a dump socket */
+    ASSERT(instance->dumpState.ovsMsg == NULL);
+
+    /* Must have an packet queue */
+    ASSERT(instance->packetQueue != NULL);
+
+    /* Output buffer has been validated while validating read dev op. */
+    ASSERT(msgOut != NULL && usrParamsCtx->outputLength >= sizeof *msgOut);
+
+    /* Read a packet from the instance queue */
+    status = OvsReadDpIoctl(instance->fileObject, usrParamsCtx->outputBuffer,
+                            usrParamsCtx->outputLength, replyLen);
+    return status;
+}
\ No newline at end of file
diff --git a/datapath-windows/ovsext/User.h b/datapath-windows/ovsext/User.h
index 139b0ca..8b80ded 100644
--- a/datapath-windows/ovsext/User.h
+++ b/datapath-windows/ovsext/User.h
@@ -118,4 +118,11 @@  OvsAddPidInstance(POVS_SWITCH_CONTEXT switchContext, UINT32 pid,
 VOID
 OvsDelPidInstance(POVS_SWITCH_CONTEXT switchContext, UINT32 pid);
 
+NTSTATUS OvsReadPacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
+                                 UINT32 *replyLen);
+NTSTATUS OvsSubscribePacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
+                                      UINT32 *replyLen);
+NTSTATUS OvsPendPacketCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
+                                 UINT32 *replyLen);
+
 #endif /* __USER_H_ */