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