hi Ankur,
Changes look good. I had some minor comments. You can get rid of the unused 
parameters in OvsGetFlowIoctl(). The code has diverged quite a bit from the 
non-NL interface now.

Acked-by: Nithin Raju <nit...@vmware.com>


On Sep 29, 2014, at 3:34 PM, Ankur Sharma <ankursha...@vmware.com> wrote:

> 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);

We should be setting the 'rc' to STATUS_INVALID_PARAMETER or 
STATUS_INSUFFICIENT_LENGTH.


> +        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");

This is not OVS_LOG_ERROR I suppose.


> +
> +        /* 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);

I think we can nuke the 4th argument. The code has kind of diverged a lot. I 
think we can nuke arg #2, and Arg #4 and Arg #5.

> +    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.

s/OvsIPv4FlowPutKey/IpKey 

> + 
> *----------------------------------------------------------------------------
> + */
> static NTSTATUS
> _MapFlowIpv4KeyToNlKey(PNL_BUFFER nlBuf, IpKey *ipv4FlowPutKey)
> {
> @@ -808,6 +972,12 @@ done:
>     return rc;
> }
> 
> +/*
> + 
> *----------------------------------------------------------------------------
> + *  _MapFlowIpv6KeyToNlKey --
> + *    Maps _MapFlowIpv6KeyToNlKey to OVS_KEY_ATTR_IPV6 attribute.

s/_MapFlowIpv6KeyToNlKey/Ipv6Key 

> + 
> *----------------------------------------------------------------------------
> + */
> 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.

s/_MapFlowArpKeyToNlKey/ArpKey

> + 
> *----------------------------------------------------------------------------
> + */
> 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
> https://urldefense.proofpoint.com/v1/url?u=http://openvswitch.org/mailman/listinfo/dev&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=ubrOpIWavCMqX4l4j1LEVpTfDj%2FD5Qyn8KCoJIBGvzo%3D%0A&m=5CgYuhwg3C7QDyrP7CnzkLQrn8mbY1GGvMwlLNSqSyA%3D%0A&s=629a4a102d4ffffe32375596885a7f692cfe54369d22679813a34545472ede8c

Thanks,
-- Nithin

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to