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 <nit...@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@openvswitch.org http://openvswitch.org/mailman/listinfo/dev