Message ID | 1466795009-5328-4-git-send-email-vsairam@vmware.com |
---|---|
State | Superseded |
Delegated to: | Guru Shetty |
Headers | show |
CTA_ZONE is not defined yet, and I see it is defined in 4/9. DonĀ¹t you have to return anything upon success in OvsCtDeleteCmdHandler(). The operation type is a OVS_TRANSACTION_DEV_OP. See Flow.c for example: https://github.com/openvswitch/ovs/blob/master/datapath-windows/ovsext/Flow .c#L301 -- Nithin -----Original Message----- From: dev <dev-bounces@openvswitch.org> on behalf of Sairam Venugopal <vsairam@vmware.com> Date: Friday, June 24, 2016 at 12:03 PM To: "dev@openvswitch.org" <dev@openvswitch.org> Subject: [ovs-dev] [PATCH v3 3/9] datapath-windows: Add support for flushing conntrack entries >Flush out all conntrack entries or those that match a given zone. Since >the conntrack module is internal to OVS in Windows, this functionality >needs to be added in. > >Signed-off-by: Sairam Venugopal <vsairam@vmware.com> >Acked-by: Paul-Daniel Boca <pboca@cloudbasesolutions.com> >--- > datapath-windows/ovsext/Conntrack.c | 75 >+++++++++++++++++++++++++++++++++++++ > 1 file changed, 75 insertions(+) > >diff --git a/datapath-windows/ovsext/Conntrack.c >b/datapath-windows/ovsext/Conntrack.c >index 5fc9282..15c495d 100644 >--- a/datapath-windows/ovsext/Conntrack.c >+++ b/datapath-windows/ovsext/Conntrack.c >@@ -624,3 +624,78 @@ ovsConntrackEntryCleaner(PVOID data) > > PsTerminateSystemThread(STATUS_SUCCESS); > } >+ >+/* >+ >*------------------------------------------------------------------------- >--- >+ * OvsCtFlush >+ * Flushes out all Conntrack Entries that match the given zone >+ >*------------------------------------------------------------------------- >--- >+ */ >+static __inline NDIS_STATUS >+OvsCtFlush(UINT16 zone) >+{ >+ PLIST_ENTRY link, next; >+ POVS_CT_ENTRY entry; >+ >+ LOCK_STATE_EX lockState; >+ NdisAcquireRWLockWrite(ovsConntrackLockObj, &lockState, 0); >+ >+ for (int i = 0; i < CT_HASH_TABLE_SIZE; i++) { >+ LIST_FORALL_SAFE(&ovsConntrackTable[i], link, next) { >+ entry = CONTAINING_RECORD(link, OVS_CT_ENTRY, link); >+ if (!zone || zone == entry->key.zone) >+ OvsCtEntryDelete(entry); >+ } >+ } >+ >+ NdisReleaseRWLock(ovsConntrackLockObj, &lockState); >+ return NDIS_STATUS_SUCCESS; >+} >+ >+NTSTATUS >+OvsCtDeleteCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx, >+ UINT32 *replyLen) >+{ >+ POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer; >+ PNL_MSG_HDR nlMsgHdr = &(msgIn->nlMsg); >+ PNL_ATTR ctAttrs[__CTA_MAX]; >+ UINT32 attrOffset = NLMSG_HDRLEN + NF_GEN_MSG_HDRLEN + OVS_HDRLEN; >+ NL_ERROR nlError = NL_ERROR_SUCCESS; >+ NTSTATUS status; >+ UINT16 zone = 0; >+ >+ static const NL_POLICY ctZonePolicy[] = { >+ [CTA_ZONE] = { .type = NL_A_BE16, .optional = TRUE }, >+ }; >+ >+ if ((NlAttrParse(nlMsgHdr, attrOffset, NfNlMsgAttrsLen(nlMsgHdr), >+ ctZonePolicy, ARRAY_SIZE(ctZonePolicy), >+ ctAttrs, ARRAY_SIZE(ctAttrs))) >+ != TRUE) { >+ OVS_LOG_ERROR("Zone attr parsing failed for msg: %p", nlMsgHdr); >+ status = STATUS_INVALID_PARAMETER; >+ goto done; >+ } >+ >+ if (ctAttrs[CTA_ZONE]) { >+ zone = NlAttrGetU16(ctAttrs[CTA_ZONE]); >+ } >+ >+ status = OvsCtFlush(zone); >+ >+done: >+ if (status) { >+ nlError = NlMapStatusToNlErr(status); >+ } >+ if (nlError != NL_ERROR_SUCCESS) { >+ POVS_MESSAGE_ERROR msgError = (POVS_MESSAGE_ERROR) >+ usrParamsCtx->outputBuffer; >+ >+ ASSERT(msgError); >+ NlBuildErrorMsg(msgIn, msgError, nlError, replyLen); >+ ASSERT(*replyLen != 0); >+ status = STATUS_SUCCESS; >+ } >+ >+ return status; >+} >-- >2.5.0.windows.1 > >_______________________________________________ >dev mailing list >dev@openvswitch.org >https://urldefense.proofpoint.com/v2/url?u=http-3A__openvswitch.org_mailma >n_listinfo_dev&d=CwIGaQ&c=Sqcl0Ez6M0X8aeM67LKIiDJAXVeAw-YihVMNtXt-uEs&r=pN >HQcdr7B40b4h6Yb7FIedI1dnBsxdDuTLBYD3JqV80&m=sDVTDLzIeFV8CdglHvFqzyKhA4D5UY >7yjpBedaeSPVs&s=_p8ReK6W74YrArXBrNwcGs8vk_DSWMGS5Vbd6mfmXic&e=
diff --git a/datapath-windows/ovsext/Conntrack.c b/datapath-windows/ovsext/Conntrack.c index 5fc9282..15c495d 100644 --- a/datapath-windows/ovsext/Conntrack.c +++ b/datapath-windows/ovsext/Conntrack.c @@ -624,3 +624,78 @@ ovsConntrackEntryCleaner(PVOID data) PsTerminateSystemThread(STATUS_SUCCESS); } + +/* + *---------------------------------------------------------------------------- + * OvsCtFlush + * Flushes out all Conntrack Entries that match the given zone + *---------------------------------------------------------------------------- + */ +static __inline NDIS_STATUS +OvsCtFlush(UINT16 zone) +{ + PLIST_ENTRY link, next; + POVS_CT_ENTRY entry; + + LOCK_STATE_EX lockState; + NdisAcquireRWLockWrite(ovsConntrackLockObj, &lockState, 0); + + for (int i = 0; i < CT_HASH_TABLE_SIZE; i++) { + LIST_FORALL_SAFE(&ovsConntrackTable[i], link, next) { + entry = CONTAINING_RECORD(link, OVS_CT_ENTRY, link); + if (!zone || zone == entry->key.zone) + OvsCtEntryDelete(entry); + } + } + + NdisReleaseRWLock(ovsConntrackLockObj, &lockState); + return NDIS_STATUS_SUCCESS; +} + +NTSTATUS +OvsCtDeleteCmdHandler(POVS_USER_PARAMS_CONTEXT usrParamsCtx, + UINT32 *replyLen) +{ + POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer; + PNL_MSG_HDR nlMsgHdr = &(msgIn->nlMsg); + PNL_ATTR ctAttrs[__CTA_MAX]; + UINT32 attrOffset = NLMSG_HDRLEN + NF_GEN_MSG_HDRLEN + OVS_HDRLEN; + NL_ERROR nlError = NL_ERROR_SUCCESS; + NTSTATUS status; + UINT16 zone = 0; + + static const NL_POLICY ctZonePolicy[] = { + [CTA_ZONE] = { .type = NL_A_BE16, .optional = TRUE }, + }; + + if ((NlAttrParse(nlMsgHdr, attrOffset, NfNlMsgAttrsLen(nlMsgHdr), + ctZonePolicy, ARRAY_SIZE(ctZonePolicy), + ctAttrs, ARRAY_SIZE(ctAttrs))) + != TRUE) { + OVS_LOG_ERROR("Zone attr parsing failed for msg: %p", nlMsgHdr); + status = STATUS_INVALID_PARAMETER; + goto done; + } + + if (ctAttrs[CTA_ZONE]) { + zone = NlAttrGetU16(ctAttrs[CTA_ZONE]); + } + + status = OvsCtFlush(zone); + +done: + if (status) { + nlError = NlMapStatusToNlErr(status); + } + if (nlError != NL_ERROR_SUCCESS) { + POVS_MESSAGE_ERROR msgError = (POVS_MESSAGE_ERROR) + usrParamsCtx->outputBuffer; + + ASSERT(msgError); + NlBuildErrorMsg(msgIn, msgError, nlError, replyLen); + ASSERT(*replyLen != 0); + status = STATUS_SUCCESS; + } + + return status; +}