[ovs-dev] [PATCH 1/4] datapath-windows: move packet read code to User.c
Sairam Venugopal
vsairam at vmware.com
Sat Sep 19 00:45:15 UTC 2015
Acked-by: Sairam Venugopal <vsairam at vmware.com>
On 9/15/15, 11:52 AM, "Nithin Raju" <nithin at vmware.com> wrote:
>Simple code motion.
>
>Signed-off-by: Nithin Raju <nithin at 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 at 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=
More information about the dev
mailing list