Waiting for the respin. Just a couple of more remarks.
ovs-dev-v1-3-5-datapath-windows-Flow-Dump-handler.patch:50: trailing whitespace. { .cmd = OVS_FLOW_CMD_GET, ovs-dev-v1-3-5-datapath-windows-Flow-Dump-handler.patch:52: trailing whitespace. .supportedDevOp = OVS_TRANSACTION_DEV_OP | ovs-dev-v1-3-5-datapath-windows-Flow-Dump-handler.patch:93: trailing whitespace. /* ovs-dev-v1-3-5-datapath-windows-Flow-Dump-handler.patch:94: trailing whitespace. * Device operations to tag netlink commands with. This is a bitmask since it is ovs-dev-v1-3-5-datapath-windows-Flow-Dump-handler.patch:95: trailing whitespace. * possible that a particular command can be invoked via different device warning: squelched 4 whitespace errors warning: 9 lines add whitespace errors. ovs-dev-v1-4-5-datapath-windows-Flow-dump-implementation..patch:166: trailing whitespace. warning: 1 line adds whitespace errors. $ git apply ovs-dev-v1-5-5-datapath-windows-Flow-get-implementation..patch ovs-dev-v1-5-5-datapath-windows-Flow-get-implementation..patch:58: trailing whitespace. * We'll be copying the flow keys back from ovs-dev-v1-5-5-datapath-windows-Flow-get-implementation..patch:79: trailing whitespace. if ((NlAttrParseNested(nlMsgHdr, keyAttrOffset, ovs-dev-v1-5-5-datapath-windows-Flow-get-implementation..patch:114: trailing whitespace. ovs-dev-v1-5-5-datapath-windows-Flow-get-implementation..patch:117: trailing whitespace. * with our dpif-windows based interface. */ warning: 4 lines add whitespace errors. -----Mesaj original----- De la: dev [mailto:dev-boun...@openvswitch.org] În numele Ankur Sharma Trimis: Tuesday, September 30, 2014 1:35 AM Către: dev@openvswitch.org Subiect: [ovs-dev] [PATCH v1 5/5] datapath-windows: Flow get implementation. In this patch we have implemented the flow get. Signed-off-by: Ankur Sharma <ankursha...@vmware.com> --- datapath-windows/ovsext/Flow.c | 200 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 184 insertions(+), 16 deletions(-) diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c index e818e23..f6ddf7e 100644 --- a/datapath-windows/ovsext/Flow.c +++ b/datapath-windows/ovsext/Flow.c @@ -53,7 +53,7 @@ static NTSTATUS _MapNlToFlowPut(POVS_MESSAGE msgIn, PNL_ATTR keyAttr, OvsFlowPut *mappedFlow); static VOID _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs, PNL_ATTR *tunnelAttrs, - OvsFlowPut *mappedFlow); + OvsFlowKey *destKey); static VOID _MapTunAttrToFlowPut(PNL_ATTR *keyAttrs, PNL_ATTR *tunnelAttrs, @@ -359,19 +359,147 @@ OvsFlowNlGetCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx, return rc; } +/* + +*---------------------------------------------------------------------- +------ + * _FlowNlGetCmdHandler -- + * Handler for OVS_FLOW_CMD_GET command. + +*---------------------------------------------------------------------- +------ + */ NTSTATUS _FlowNlGetCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx, UINT32 *replyLen) { NTSTATUS rc = STATUS_SUCCESS; + UINT32 temp = 0; /* To keep compiler happy for calling OvsGetDumpFlow */ + + POVS_OPEN_INSTANCE instance = (POVS_OPEN_INSTANCE) + (usrParamsCtx->ovsInstance); + POVS_MESSAGE msgIn = instance->dumpState.ovsMsg; + PNL_MSG_HDR nlMsgHdr = &(msgIn->nlMsg); + POVS_HDR ovsHdr = &(msgIn->ovsHdr); + PNL_MSG_HDR nlMsgOutHdr = NULL; + UINT32 attrOffset = NLMSG_HDRLEN + GENL_HDRLEN + OVS_HDRLEN; + PNL_ATTR nlAttrs[__OVS_FLOW_ATTR_MAX]; - UNREFERENCED_PARAMETER(usrParamsCtx); + OvsFlowGetInput getInput; + OvsFlowGetOutput getOutput; + NL_BUFFER nlBuf; + PNL_ATTR keyAttrs[__OVS_KEY_ATTR_MAX]; + PNL_ATTR tunnelAttrs[__OVS_TUNNEL_KEY_ATTR_MAX]; + + NlBufInit(&nlBuf, usrParamsCtx->outputBuffer, + usrParamsCtx->outputLength); + RtlZeroMemory(&getInput, sizeof(OvsFlowGetInput)); + RtlZeroMemory(&getOutput, sizeof(OvsFlowGetOutput)); + UINT32 keyAttrOffset = 0; + UINT32 tunnelKeyAttrOffset = 0; *replyLen = 0; + if (usrParamsCtx->inputLength > usrParamsCtx->outputLength) { + /* Should not be the case. + * We'll be copying the flow keys back from + * input buffer to output buffer. */ + OVS_LOG_ERROR("inputLength: %d GREATER THEN outputLength: %d", + usrParamsCtx->inputLength, usrParamsCtx->outputLength); + goto done; + } + + /* Get all the top level Flow attributes */ + if ((NlAttrParse(nlMsgHdr, attrOffset, NlMsgAttrsLen(nlMsgHdr), + nlFlowPolicy, nlAttrs, ARRAY_SIZE(nlAttrs))) + != TRUE) { + OVS_LOG_ERROR("Attr Parsing failed for msg: %p", + nlMsgHdr); + rc = STATUS_UNSUCCESSFUL; + goto done; + } + + keyAttrOffset = (UINT32)((PCHAR) nlAttrs[OVS_FLOW_ATTR_KEY] - + (PCHAR)nlMsgHdr); + + /* Get flow keys attributes */ + if ((NlAttrParseNested(nlMsgHdr, keyAttrOffset, + NlAttrLen(nlAttrs[OVS_FLOW_ATTR_KEY]), + nlFlowKeyPolicy, keyAttrs, ARRAY_SIZE(keyAttrs))) + != TRUE) { + OVS_LOG_ERROR("Key Attr Parsing failed for msg: %p", + nlMsgHdr); + rc = STATUS_UNSUCCESSFUL; + goto done; + } + + if (keyAttrs[OVS_KEY_ATTR_TUNNEL]) { + tunnelKeyAttrOffset = (UINT32)((PCHAR) + (keyAttrs[OVS_KEY_ATTR_TUNNEL]) + - (PCHAR)nlMsgHdr); + + OVS_LOG_ERROR("Parse Flow Tunnel Key Policy"); + + /* Get tunnel keys attributes */ + if ((NlAttrParseNested(nlMsgHdr, tunnelKeyAttrOffset, + NlAttrLen(keyAttrs[OVS_KEY_ATTR_TUNNEL]), + nlFlowTunnelKeyPolicy, + tunnelAttrs, ARRAY_SIZE(tunnelAttrs))) + != TRUE) { + OVS_LOG_ERROR("Tunnel key Attr Parsing failed for msg: %p", + nlMsgHdr); + rc = STATUS_UNSUCCESSFUL; + goto done; + } + } + + _MapKeyAttrToFlowPut(keyAttrs, tunnelAttrs, + &(getInput.key)); + + getInput.dpNo = ovsHdr->dp_ifindex; + getInput.getFlags = FLOW_GET_STATS | FLOW_GET_ACTIONS; + + /* 4th argument is a no op. + * We are keeping this argument to be compatible + * with our dpif-windows based interface. */ + rc = OvsGetFlowIoctl(&getInput, sizeof(OvsFlowGetInput), &getOutput, + usrParamsCtx->outputLength, &temp); + if (rc != STATUS_SUCCESS) { + OVS_LOG_ERROR("OvsGetFlowIoctl failed."); + goto done; + } + + /* Lets prepare the reply. */ + nlMsgOutHdr = (PNL_MSG_HDR)(NlBufAt(&nlBuf, 0, 0)); + + /* Input already has all the attributes for the flow key. + * Lets copy the values back. */ + RtlCopyMemory(usrParamsCtx->outputBuffer, usrParamsCtx->inputBuffer, + usrParamsCtx->inputLength); + + rc = _MapFlowStatsToNlStats(&nlBuf, &((getOutput.info).stats)); + if (rc != STATUS_SUCCESS) { + OVS_LOG_ERROR("_OvsFlowMapFlowKeyToNlStats failed."); + goto done; + } + + rc = _MapFlowActionToNlAction(&nlBuf, ((getOutput.info).actionsLen), + getOutput.info.actions); + if (rc != STATUS_SUCCESS) { + OVS_LOG_ERROR("_MapFlowActionToNlAction failed."); + goto done; + } + + NlMsgSetSize(nlMsgOutHdr, NlBufSize(&nlBuf)); + NlMsgAlignSize(nlMsgOutHdr); + *replyLen += NlMsgSize(nlMsgOutHdr); + +done: return rc; } +/* + +*---------------------------------------------------------------------- +------ + * _FlowNlDumpCmdHandler -- + * Handler for OVS_FLOW_CMD_GET command. + +*---------------------------------------------------------------------- +------ + */ NTSTATUS _FlowNlDumpCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx, UINT32 *replyLen) @@ -479,6 +607,12 @@ done: return rc; } +/* + +*---------------------------------------------------------------------- +------ + * _MapFlowInfoToNl -- + * Maps OvsFlowInfo to Netlink attributes. + +*---------------------------------------------------------------------- +------ + */ static NTSTATUS _MapFlowInfoToNl(PNL_BUFFER nlBuf, OvsFlowInfo *flowInfo) { @@ -507,6 +641,12 @@ done: return rc; } +/* + +*---------------------------------------------------------------------- +------ + * _MapFlowStatsToNlStats -- + * Maps OvsFlowStats to OVS_FLOW_ATTR_STATS attribute. + +*---------------------------------------------------------------------- +------ + */ static NTSTATUS _MapFlowStatsToNlStats(PNL_BUFFER nlBuf, OvsFlowStats *flowStats) { @@ -541,6 +681,12 @@ done: return rc; } +/* + +*---------------------------------------------------------------------- +------ + * _MapFlowActionToNlAction -- + * Maps flow actions to OVS_FLOW_ATTR_ACTION attribute. + +*---------------------------------------------------------------------- +------ + */ static NTSTATUS _MapFlowActionToNlAction(PNL_BUFFER nlBuf, uint32_t actionsLen, PNL_ATTR actions) @@ -570,6 +716,12 @@ error_nested_start: } +/* + +*---------------------------------------------------------------------- +------ + * _MapFlowKeyToNlKey -- + * Maps OvsFlowKey to OVS_FLOW_ATTR_KEY attribute. + +*---------------------------------------------------------------------- +------ + */ static NTSTATUS _MapFlowKeyToNlKey(PNL_BUFFER nlBuf, OvsFlowKey *flowKey) { @@ -665,6 +817,12 @@ error_nested_start: return rc; } +/* + +*---------------------------------------------------------------------- +------ + * _MapFlowTunKeyToNlKey -- + * Maps OvsIPv4TunnelKey to OVS_TUNNEL_KEY_ATTR_ID attribute. + +*---------------------------------------------------------------------- +------ + */ static NTSTATUS _MapFlowTunKeyToNlKey(PNL_BUFFER nlBuf, OvsIPv4TunnelKey *tunKey) { @@ -720,6 +878,12 @@ error_nested_start: return rc; } +/* + +*---------------------------------------------------------------------- +------ + * _MapFlowTunKeyToNlKey -- + * Maps OvsIPv4FlowPutKey to OVS_KEY_ATTR_IPV4 attribute. + +*---------------------------------------------------------------------- +------ + */ static NTSTATUS _MapFlowIpv4KeyToNlKey(PNL_BUFFER nlBuf, IpKey *ipv4FlowPutKey) { @@ -808,6 +972,12 @@ done: return rc; } +/* + +*---------------------------------------------------------------------- +------ + * _MapFlowIpv6KeyToNlKey -- + * Maps _MapFlowIpv6KeyToNlKey to OVS_KEY_ATTR_IPV6 attribute. + +*---------------------------------------------------------------------- +------ + */ static NTSTATUS _MapFlowIpv6KeyToNlKey(PNL_BUFFER nlBuf, Ipv6Key *ipv6FlowPutKey, Icmp6Key *icmpv6FlowPutKey) @@ -918,6 +1088,12 @@ done: return rc; } +/* + +*---------------------------------------------------------------------- +------ + * _MapFlowArpKeyToNlKey -- + * Maps _MapFlowArpKeyToNlKey to OVS_KEY_ATTR_ARP attribute. + +*---------------------------------------------------------------------- +------ + */ static NTSTATUS _MapFlowArpKeyToNlKey(PNL_BUFFER nlBuf, ArpKey *arpFlowPutKey) { @@ -985,7 +1161,8 @@ _MapNlToFlowPut(POVS_MESSAGE msgIn, PNL_ATTR keyAttr, /* Get tunnel keys attributes */ if ((NlAttrParseNested(nlMsgHdr, tunnelKeyAttrOffset, - NlAttrLen(keyAttr), nlFlowTunnelKeyPolicy, + NlAttrLen(keyAttrs[OVS_KEY_ATTR_TUNNEL]), + nlFlowTunnelKeyPolicy, tunnelAttrs, ARRAY_SIZE(tunnelAttrs))) != TRUE) { OVS_LOG_ERROR("Tunnel key Attr Parsing failed for msg: %p", @@ -996,7 +1173,7 @@ _MapNlToFlowPut(POVS_MESSAGE msgIn, PNL_ATTR keyAttr, } _MapKeyAttrToFlowPut(keyAttrs, tunnelAttrs, - mappedFlow); + &(mappedFlow->key)); /* Map the action */ if (actionAttr) { @@ -1055,10 +1232,9 @@ _MapNlToFlowPutFlags(PGENL_MSG_HDR genlMsgHdr, static VOID _MapKeyAttrToFlowPut(PNL_ATTR *keyAttrs, PNL_ATTR *tunnelAttrs, - OvsFlowPut *mappedFlow) + OvsFlowKey *destKey) { const struct ovs_key_ethernet *eth_key; - OvsFlowKey *destKey = &(mappedFlow->key); _MapTunAttrToFlowPut(keyAttrs, tunnelAttrs, destKey); @@ -2095,21 +2271,13 @@ OvsGetFlowIoctl(PVOID inputBuffer, UINT32 dpNo; LOCK_STATE_EX dpLockState; - if (inputLength != sizeof(OvsFlowGetInput) - || inputBuffer == NULL) { - return STATUS_INFO_LENGTH_MISMATCH; - } + UNREFERENCED_PARAMETER(inputLength); getInput = (OvsFlowGetInput *) inputBuffer; getFlags = getInput->getFlags; getActionsLen = getInput->actionsLen; - if (getInput->getFlags & FLOW_GET_KEY) { - return STATUS_INVALID_PARAMETER; - } - if (outputBuffer == NULL - || outputLength != (sizeof *getOutput + - getInput->actionsLen)) { + if (outputBuffer == NULL) { return STATUS_INFO_LENGTH_MISMATCH; } -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev