Not sure why the "From: Anand Kumar <[email protected]>” shows up in the commit description.
Since they are already listed as co-author, it should be safe to remove this. Acked-by: Sairam Venugopal <[email protected]> On 5/9/17, 3:59 PM, "[email protected] on behalf of Yin Lin" <[email protected] on behalf of [email protected]> wrote: >From: Anand Kumar <[email protected]> > >Add support for parsing netlink attributes related to NAT >in conntrack. > >Co-Authored-by: Anand Kumar <[email protected]> >Co-Authored-by: Darrell Ball <[email protected]> >Signed-off-by: Yin Lin <[email protected]> >--- > datapath-windows/ovsext/Conntrack.c | 73 ++++++++++++++++++++++++++++++++++++- > datapath-windows/ovsext/Conntrack.h | 17 +++++++++ > datapath-windows/ovsext/Flow.c | 4 +- > 3 files changed, 90 insertions(+), 4 deletions(-) > >diff --git a/datapath-windows/ovsext/Conntrack.c >b/datapath-windows/ovsext/Conntrack.c >index dce0c1b..9824368 100644 >--- a/datapath-windows/ovsext/Conntrack.c >+++ b/datapath-windows/ovsext/Conntrack.c >@@ -645,7 +645,8 @@ OvsCtExecute_(PNET_BUFFER_LIST curNbl, > UINT16 zone, > MD_MARK *mark, > MD_LABELS *labels, >- PCHAR helper) >+ PCHAR helper, >+ PNAT_ACTION_INFO natInfo) > { > NDIS_STATUS status = NDIS_STATUS_SUCCESS; > POVS_CT_ENTRY entry = NULL; >@@ -654,6 +655,9 @@ OvsCtExecute_(PNET_BUFFER_LIST curNbl, > UINT64 currentTime; > NdisGetCurrentSystemTime((LARGE_INTEGER *) ¤tTime); > >+ /* XXX: Not referenced for now */ >+ UNREFERENCED_PARAMETER(natInfo); >+ > /* Retrieve the Conntrack Key related fields from packet */ > OvsCtSetupLookupCtx(key, zone, &ctx, curNbl, layers->l4Offset); > >@@ -730,11 +734,14 @@ OvsExecuteConntrackAction(OvsForwardingContext *fwdCtx, > MD_MARK *mark = NULL; > MD_LABELS *labels = NULL; > PCHAR helper = NULL; >+ NAT_ACTION_INFO natActionInfo; > PNET_BUFFER_LIST curNbl = fwdCtx->curNbl; > OVS_PACKET_HDR_INFO *layers = &fwdCtx->layers; > PNET_BUFFER_LIST newNbl = NULL; >+ NAT_ACTION_INFO natActionInfo; > NDIS_STATUS status; > >+ memset(&natActionInfo, 0, sizeof natActionInfo); > status = OvsDetectCtPacket(fwdCtx, key, &newNbl); > if (status != NDIS_STATUS_SUCCESS) { > return status; >@@ -757,6 +764,68 @@ OvsExecuteConntrackAction(OvsForwardingContext *fwdCtx, > if (ctAttr) { > labels = NlAttrGet(ctAttr); > } >+ natActionInfo.natAction = NAT_ACTION_NONE; >+ ctAttr = NlAttrFindNested(a, OVS_CT_ATTR_NAT); >+ if (ctAttr) { >+ /* Pares Nested NAT attributes. */ >+ PNL_ATTR natAttr; >+ unsigned int left; >+ BOOLEAN hasMinIp = FALSE; >+ BOOLEAN hasMinPort = FALSE; >+ BOOLEAN hasMaxIp = FALSE; >+ BOOLEAN hasMaxPort = FALSE; >+ NL_NESTED_FOR_EACH_UNSAFE (natAttr, left, ctAttr) { >+ enum ovs_nat_attr sub_type_nest = NlAttrType(natAttr); >+ switch(sub_type_nest) { >+ case OVS_NAT_ATTR_SRC: >+ case OVS_NAT_ATTR_DST: >+ natActionInfo.natAction |= >+ ((sub_type_nest == OVS_NAT_ATTR_SRC) >+ ? NAT_ACTION_SRC : NAT_ACTION_DST); >+ break; >+ case OVS_NAT_ATTR_IP_MIN: >+ memcpy(&natActionInfo.minAddr, >+ NlAttrData(natAttr), natAttr->nlaLen - NLA_HDRLEN); >+ hasMinIp = TRUE; >+ break; >+ case OVS_NAT_ATTR_IP_MAX: >+ memcpy(&natActionInfo.maxAddr, >+ NlAttrData(natAttr), natAttr->nlaLen - NLA_HDRLEN); >+ hasMaxIp = TRUE; >+ break; >+ case OVS_NAT_ATTR_PROTO_MIN: >+ natActionInfo.minPort = NlAttrGetU16(natAttr); >+ hasMinPort = TRUE; >+ break; >+ case OVS_NAT_ATTR_PROTO_MAX: >+ natActionInfo.maxPort = NlAttrGetU16(natAttr); >+ hasMaxPort = TRUE; >+ break; >+ case OVS_NAT_ATTR_PERSISTENT: >+ case OVS_NAT_ATTR_PROTO_HASH: >+ case OVS_NAT_ATTR_PROTO_RANDOM: >+ break; >+ } >+ } >+ if (natActionInfo.natAction == NAT_ACTION_NONE) { >+ natActionInfo.natAction = NAT_ACTION_REVERSE; >+ } >+ if (hasMinIp && !hasMaxIp) { >+ memcpy(&natActionInfo.maxAddr, >+ &natActionInfo.minAddr, >+ sizeof(natActionInfo.maxAddr)); >+ } >+ if (hasMinPort && !hasMaxPort) { >+ natActionInfo.maxPort = natActionInfo.minPort; >+ } >+ if (hasMinPort || hasMaxPort) { >+ if (natActionInfo.natAction & NAT_ACTION_SRC) { >+ natActionInfo.natAction |= NAT_ACTION_SRC_PORT; >+ } else if (natActionInfo.natAction & NAT_ACTION_DST) { >+ natActionInfo.natAction |= NAT_ACTION_DST_PORT; >+ } >+ } >+ } > ctAttr = NlAttrFindNested(a, OVS_CT_ATTR_HELPER); > if (ctAttr) { > helper = NlAttrGetString(ctAttr); >@@ -776,7 +845,7 @@ OvsExecuteConntrackAction(OvsForwardingContext *fwdCtx, > } > /* If newNbl is not allocated, use the current Nbl*/ > status = OvsCtExecute_(newNbl != NULL ? newNbl : curNbl, key, layers, >- commit, force, zone, mark, labels, helper); >+ commit, force, zone, mark, labels, helper, >&natActionInfo); > return status; > } > >diff --git a/datapath-windows/ovsext/Conntrack.h >b/datapath-windows/ovsext/Conntrack.h >index 87d7eeb..1ad289f 100644 >--- a/datapath-windows/ovsext/Conntrack.h >+++ b/datapath-windows/ovsext/Conntrack.h >@@ -68,6 +68,15 @@ typedef struct MD_LABELS { > struct ovs_key_ct_labels mask; > } MD_LABELS; > >+typedef enum NAT_ACTION { >+ NAT_ACTION_NONE = 0, >+ NAT_ACTION_REVERSE = 1 << 0, >+ NAT_ACTION_SRC = 1 << 1, >+ NAT_ACTION_SRC_PORT = 1 << 2, >+ NAT_ACTION_DST = 1 << 3, >+ NAT_ACTION_DST_PORT = 1 << 4, >+}; >+ > typedef struct _OVS_CT_KEY { > struct ct_endpoint src; > struct ct_endpoint dst; >@@ -110,6 +119,14 @@ typedef struct OvsConntrackKeyLookupCtx { > BOOLEAN related; > } OvsConntrackKeyLookupCtx; > >+typedef struct _NAT_ACTION_INFO { >+ struct ct_addr minAddr; >+ struct ct_addr maxAddr; >+ uint16_t minPort; >+ uint16_t maxPort; >+ uint16_t natAction; >+} NAT_ACTION_INFO, *PNAT_ACTION_INFO; >+ > #define CT_HASH_TABLE_SIZE ((UINT32)1 << 10) > #define CT_HASH_TABLE_MASK (CT_HASH_TABLE_SIZE - 1) > #define CT_INTERVAL_SEC 10000000LL //1s >diff --git a/datapath-windows/ovsext/Flow.c b/datapath-windows/ovsext/Flow.c >index 96ff9fa..4396cee 100644 >--- a/datapath-windows/ovsext/Flow.c >+++ b/datapath-windows/ovsext/Flow.c >@@ -3086,9 +3086,9 @@ OvsProbeSupportedFeature(POVS_MESSAGE msgIn, > } > } else if (keyAttrs[OVS_KEY_ATTR_CT_STATE]) { > UINT32 state = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_CT_STATE]); >- if (state & OVS_CS_F_DST_NAT || state & OVS_CS_F_SRC_NAT) { >+ if (!state) { > status = STATUS_INVALID_PARAMETER; >- OVS_LOG_ERROR("Contrack NAT is not supported:%d", state); >+ OVS_LOG_ERROR("Invalid state specified."); > } > } else if (keyAttrs[OVS_KEY_ATTR_CT_ZONE]) { > UINT16 zone = (NlAttrGetU16(keyAttrs[OVS_KEY_ATTR_CT_ZONE])); >-- >2.10.2.windows.1 > >_______________________________________________ >dev mailing list >[email protected] >https://mail.openvswitch.org/mailman/listinfo/ovs-dev _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
