In this patch we have implemented the handler for
OVS_PACKET_CMD_EXECUTE command.

Signed-off-by: Ankur Sharma <ankursha...@vmware.com>
---
 datapath-windows/ovsext/User.c | 74 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 73 insertions(+), 1 deletion(-)

diff --git a/datapath-windows/ovsext/User.c b/datapath-windows/ovsext/User.c
index 0e75e83..cecd82e 100644
--- a/datapath-windows/ovsext/User.c
+++ b/datapath-windows/ovsext/User.c
@@ -46,6 +46,8 @@ extern PNDIS_SPIN_LOCK gOvsCtrlLock;
 extern POVS_SWITCH_CONTEXT gOvsSwitchContext;
 OVS_USER_STATS ovsUserStats;
 
+static VOID _MapNlAttrToOvsPktExec(PNL_ATTR *nlAttrs, PNL_ATTR *keyAttrs,
+                                   OvsPacketExecute  *execute);
 
 NTSTATUS
 OvsUserInit()
@@ -311,13 +313,83 @@ OvsNlExecuteCmdHandler(POVS_USER_PARAMS_CONTEXT 
usrParamsCtx,
                        UINT32 *replyLen)
 {
     NTSTATUS rc = STATUS_SUCCESS;
+    POVS_MESSAGE msgIn = (POVS_MESSAGE)usrParamsCtx->inputBuffer;
+    PNL_MSG_HDR nlMsgHdr = &(msgIn->nlMsg);
+    POVS_HDR ovsHdr = &(msgIn->ovsHdr);
+
+    PNL_ATTR nlAttrs[__OVS_PACKET_ATTR_MAX];
+    PNL_ATTR keyAttrs[__OVS_KEY_ATTR_MAX] = {NULL};
+
+    UINT32 attrOffset = NLMSG_HDRLEN + GENL_HDRLEN + OVS_HDRLEN;
+    UINT32 keyAttrOffset = 0;
+    OvsPacketExecute execute;
 
-    UNREFERENCED_PARAMETER(usrParamsCtx);
     UNREFERENCED_PARAMETER(replyLen);
 
+    static const NL_POLICY nlPktExecPolicy[] = {
+        [OVS_PACKET_ATTR_PACKET] = {.type = NL_A_UNSPEC, .optional = FALSE},
+        [OVS_PACKET_ATTR_KEY] = {.type = NL_A_UNSPEC, .optional = FALSE},
+        [OVS_PACKET_ATTR_ACTIONS] = {.type = NL_A_UNSPEC, .optional = FALSE}
+    };
+
+    static const NL_POLICY nlFlowKeyPolicy[] = {
+        [OVS_KEY_ATTR_IN_PORT] = {.type = NL_A_UNSPEC, .optional = FALSE}
+    };
+
+    RtlZeroMemory(&execute, sizeof(OvsPacketExecute));
+
+    /* Get all the top level Flow attributes */
+    if ((NlAttrParse(nlMsgHdr, attrOffset, NlMsgAttrsLen(nlMsgHdr),
+                     nlPktExecPolicy, nlAttrs, ARRAY_SIZE(nlAttrs)))
+                     != TRUE) {
+        OVS_LOG_ERROR("Attr Parsing failed for msg: %p",
+                       nlMsgHdr);
+        rc = STATUS_UNSUCCESSFUL;
+        goto done;
+    }
+
+    keyAttrOffset = (UINT32)((PCHAR)nlAttrs[OVS_FLOW_ATTR_KEY] -
+                    (PCHAR)nlMsgHdr);
+
+    /* Get flow keys attributes */
+    if ((NlAttrParseNested(nlMsgHdr, keyAttrOffset,
+                           NlAttrLen(nlAttrs[OVS_FLOW_ATTR_KEY]),
+                           nlFlowKeyPolicy, keyAttrs,
+                           ARRAY_SIZE(keyAttrs))) != TRUE) {
+        OVS_LOG_ERROR("Key Attr Parsing failed for msg: %p", nlMsgHdr);
+        rc = STATUS_UNSUCCESSFUL;
+        goto done;
+    }
+
+    execute.dpNo = ovsHdr->dp_ifindex;
+
+    _MapNlAttrToOvsPktExec(nlAttrs, keyAttrs, &execute);
+
+    rc = OvsExecuteDpIoctl(&execute);
+
+done:
     return rc;
 }
 
+/*
+ *----------------------------------------------------------------------------
+ *  _MapNlAttrToOvsPktExec --
+ *    Maps input Netlink attributes to OvsPacketExecute.
+ *----------------------------------------------------------------------------
+ */
+static VOID
+_MapNlAttrToOvsPktExec(PNL_ATTR *nlAttrs, PNL_ATTR *keyAttrs,
+                       OvsPacketExecute *execute)
+{
+    execute->packetBuf = NlAttrGet(nlAttrs[OVS_PACKET_ATTR_PACKET]);
+    execute->packetLen = NlAttrGetSize(nlAttrs[OVS_PACKET_ATTR_PACKET]);
+
+    execute->actions = NlAttrGet(nlAttrs[OVS_PACKET_ATTR_ACTIONS]);
+    execute->actionsLen = NlAttrGetSize(nlAttrs[OVS_PACKET_ATTR_ACTIONS]);
+
+    execute->inPort = NlAttrGetU32(keyAttrs[OVS_KEY_ATTR_IN_PORT]);
+}
+
 NTSTATUS
 OvsExecuteDpIoctl(PVOID inputBuffer)
 {
-- 
1.9.1

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to