diff options
author | Nithin Raju <nithin@vmware.com> | 2015-09-23 09:15:30 -0700 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2015-09-29 11:57:24 -0700 |
commit | 6375650aa2b77887e6174a477e0716448096a759 (patch) | |
tree | ca0350a53a34b0561608ed3a5b3d1d6b6e4ed597 /datapath-windows | |
parent | 4c470e88c289bcb0b80181b53aaf4f4d50c8b731 (diff) | |
download | openvswitch-6375650aa2b77887e6174a477e0716448096a759.tar.gz |
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>
Acked-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com>
Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'datapath-windows')
-rw-r--r-- | datapath-windows/ovsext/Datapath.c | 115 | ||||
-rw-r--r-- | datapath-windows/ovsext/User.c | 108 | ||||
-rw-r--r-- | 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 b7bbf8004..1e166041d 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 7af481653..81a1a20c6 100644 --- a/datapath-windows/ovsext/User.c +++ b/datapath-windows/ovsext/User.c @@ -1152,3 +1152,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 918258545..3a4288894 100644 --- a/datapath-windows/ovsext/User.h +++ b/datapath-windows/ovsext/User.h @@ -119,4 +119,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_ */ |