[ovs-dev] [PATCH 3/4] datapath-windows: return netlink error for read operation

Alin Serdean aserdean at cloudbasesolutions.com
Wed Sep 23 15:23:03 UTC 2015


You could probably use NlFillNlHdr to prepare the netlink message.

Shouldn't this be apply to OVS_IOCTL_READ also?

Alin.

> -----Mesaj original-----
> De la: dev [mailto:dev-bounces at openvswitch.org] În numele Nithin Raju
> Trimis: Tuesday, September 15, 2015 9:52 PM
> Către: dev at openvswitch.org
> Subiect: [ovs-dev] [PATCH 3/4] datapath-windows: return netlink error for
> read operation
> 
> The kernel datapath returns a NL error message upon any errors during read
> operations, and returns STATUS_SUCCESS as the return code. We reply on
> the input NL request to get the family ID, and the PID. However, when the
> request is of type OVS_CTRL_CMD_EVENT_NOTIFY and
> OVS_CTRL_CMD_READ_NOTIFY, there's no input buffer associated with the
> request. So, we use a temporary input buffer to be able to call the Netlink
> APIs for constructing the output NL error message.
> 
> Signed-off-by: Nithin Raju <nithin at vmware.com>
> ---
>  datapath-windows/ovsext/Datapath.c | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/datapath-windows/ovsext/Datapath.c b/datapath-
> windows/ovsext/Datapath.c
> index 409c4bb..8dce97d 100644
> --- a/datapath-windows/ovsext/Datapath.c
> +++ b/datapath-windows/ovsext/Datapath.c
> @@ -1020,10 +1020,25 @@
> InvokeNetlinkCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx,
>      if (status != STATUS_SUCCESS && status != STATUS_PENDING) {
>          if (usrParamsCtx->devOp != OVS_WRITE_DEV_OP && *replyLen == 0) {
>              NL_ERROR nlError = NlMapStatusToNlErr(status);
> -            POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx-
> >inputBuffer;
> +            OVS_MESSAGE msgInTmp = { 0 };
> +            POVS_MESSAGE msgIn = NULL;
>              POVS_MESSAGE_ERROR msgError = (POVS_MESSAGE_ERROR)
>                  usrParamsCtx->outputBuffer;
> 
> +            if (usrParamsCtx->ovsMsg->genlMsg.cmd ==
> OVS_CTRL_CMD_EVENT_NOTIFY ||
> +                usrParamsCtx->ovsMsg->genlMsg.cmd ==
> OVS_CTRL_CMD_READ_NOTIFY) {
> +                /* There's no input buffer associated with such requests. */
> +                msgInTmp.nlMsg.nlmsgLen = 0;
> +                msgInTmp.nlMsg.nlmsgType =  nlFamilyOps->id;
> +                msgInTmp.nlMsg.nlmsgFlags = 0;
> +                msgInTmp.nlMsg.nlmsgSeq = 0;
> +                msgInTmp.nlMsg.nlmsgPid = usrParamsCtx->ovsInstance->pid;
> +                msgIn = &msgInTmp;
> +            } else {
> +                msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;
> +            }
> +
> +            ASSERT(msgIn);
>              ASSERT(msgError);
>              NlBuildErrorMsg(msgIn, msgError, nlError);
>              *replyLen = msgError->nlMsg.nlmsgLen;
> --
> 1.8.5.6
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev


More information about the dev mailing list