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-boun...@openvswitch.org] În numele Nithin Raju > Trimis: Tuesday, September 15, 2015 9:52 PM > Către: dev@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 <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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev