Message ID | 1443024933-47622-1-git-send-email-nithin@vmware.com |
---|---|
State | Accepted |
Headers | show |
Still can't get it to apply: error: patch failed: datapath-windows/ovsext/Datapath.c:1593 error: datapath-windows/ovsext/Datapath.c: patch does not apply Maybe my git is acting up. Acked-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com> > -----Mesaj original----- > De la: dev [mailto:dev-bounces@openvswitch.org] În numele Nithin Raju > Trimis: Wednesday, September 23, 2015 7:16 PM > Către: dev@openvswitch.org > Subiect: [ovs-dev] [PATCH 1/4 v2] datapath-windows: move packet read > code to User.c > > Simple code motion. > > Signed-off-by: Nithin Raju <nithin@vmware.com> > Acked-by: Sairam Venugopal <vsairam@vmware.com> > --- > v2: addressed Alin's review comments > --- > datapath-windows/ovsext/Datapath.c | 115 ++----------------------------------- > datapath-windows/ovsext/User.c | 108 > ++++++++++++++++++++++++++++++++++ > datapath-windows/ovsext/User.h | 7 +++ > 3 files changed, 119 insertions(+), 111 deletions(-) > > diff --git a/datapath-windows/ovsext/Datapath.c b/datapath- > windows/ovsext/Datapath.c > index b7bbf80..1e16604 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); @@ -1593,110 +1593,3 @@ 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); > -} > 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: ] Newline :). > 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
Applied to master and branch-2.4, thanks everyone. On Wed, Sep 23, 2015 at 05:56:39PM +0000, Alin Serdean wrote: > Still can't get it to apply: > error: patch failed: datapath-windows/ovsext/Datapath.c:1593 > error: datapath-windows/ovsext/Datapath.c: patch does not apply > > Maybe my git is acting up. > > Acked-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com> > > > -----Mesaj original----- > > De la: dev [mailto:dev-bounces@openvswitch.org] În numele Nithin Raju > > Trimis: Wednesday, September 23, 2015 7:16 PM > > Către: dev@openvswitch.org > > Subiect: [ovs-dev] [PATCH 1/4 v2] datapath-windows: move packet read > > code to User.c > > > > Simple code motion. > > > > Signed-off-by: Nithin Raju <nithin@vmware.com> > > Acked-by: Sairam Venugopal <vsairam@vmware.com> > > --- > > v2: addressed Alin's review comments > > --- > > datapath-windows/ovsext/Datapath.c | 115 ++----------------------------------- > > datapath-windows/ovsext/User.c | 108 > > ++++++++++++++++++++++++++++++++++ > > datapath-windows/ovsext/User.h | 7 +++ > > 3 files changed, 119 insertions(+), 111 deletions(-) > > > > diff --git a/datapath-windows/ovsext/Datapath.c b/datapath- > > windows/ovsext/Datapath.c > > index b7bbf80..1e16604 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); @@ -1593,110 +1593,3 @@ 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); > > -} > > 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: ] Newline :). > > 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 > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev
diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-windows/ovsext/Datapath.c index b7bbf80..1e16604 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); @@ -1593,110 +1593,3 @@ 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); -} 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_ */