/*inline*/ Arguments Runtime::CopyArguments ( const Arguments& src, const pI_bool copy_data /*= pI_TRUE*/) const { Arguments retval; for (pI_size lv = 0; lv < src.size(); ++lv) { retval.push_back (CopyArgument (src[lv], copy_data)); } return retval; } // Arguments Runtime::CopyArguments (...) const
BOOLEAN CopyArgumentGroup(_Out_ OVS_ARGUMENT_GROUP* pDest, _In_ const OVS_ARGUMENT_GROUP* pSource, UINT16 argsMore) { OVS_CHECK(pDest); OVS_CHECK(pSource); AllocateArgumentsToGroup(pSource->count + argsMore, pDest); pDest->count = pSource->count + argsMore; pDest->groupSize = pSource->groupSize; for (UINT i = 0; i < pSource->count; ++i) { if (!CopyArgument(pDest->args + i, pSource->args + i)) { return FALSE; } } return TRUE; }
static OVS_ARGUMENT* _CreateSetActionArg(const OVS_ARGUMENT* pArgument) { const OVS_ARGUMENT_GROUP* pGroupArg = NULL; OVS_ARGTYPE argType = OVS_ARGTYPE_INVALID; OVS_CHECK(IsArgTypeGroup(pArgument->type)); pGroupArg = pArgument->data; OVS_CHECK(pGroupArg->count == 1); pArgument = pGroupArg->args; argType = pArgument->type; switch (argType) { case OVS_ARGTYPE_PI_IPV4_TUNNEL: { OVS_ARGUMENT* pArg = _CreateIpv4TunnelGroup(pArgument->data); return pArg; } break; default: { OVS_ARGUMENT* pPacketInfoArg = KZAlloc(sizeof(OVS_ARGUMENT)); if (!pPacketInfoArg) { DEBUGP(LOG_ERROR, "could not alloc key arg\n"); return NULL; } CopyArgument(pPacketInfoArg, pArgument); return pPacketInfoArg; } break; } }
static BOOLEAN _CreateActionsArgsToList(const OVS_ARGUMENT_GROUP* pArgGroup, OVS_ARGUMENT_SLIST_ENTRY** ppArgList) { BOOLEAN ok = TRUE; for (UINT i = 0; i < pArgGroup->count; ++i) { const OVS_ARGUMENT* pArg = pArgGroup->args + i; OVS_ARGTYPE argType = pArg->type; switch (argType) { case OVS_ARGTYPE_ACTION_SETINFO_GROUP: { OVS_ARGUMENT_GROUP* pSetGroup = NULL; OVS_ARGUMENT* pPacketInfoArg = NULL, *pSetArg = NULL; pPacketInfoArg = _CreateSetActionArg(pArg); if (!pPacketInfoArg) { return FALSE; } pSetGroup = KZAlloc(sizeof(OVS_ARGUMENT_GROUP)); if (!pSetGroup) { return FALSE; } pSetGroup->args = pPacketInfoArg; pSetGroup->count = 1; pSetGroup->groupSize = pPacketInfoArg->length + OVS_ARGUMENT_HEADER_SIZE; pSetArg = KZAlloc(sizeof(OVS_ARGUMENT)); pSetArg->data = pSetGroup; pSetArg->type = OVS_ARGTYPE_ACTION_SETINFO_GROUP; pSetArg->length = pSetGroup->groupSize + OVS_ARGUMENT_GROUP_HEADER_SIZE; if (!AppendArgumentToList(pSetArg, ppArgList)) { return FALSE; } } break; case OVS_ARGTYPE_ACTION_SAMPLE_GROUP: ok = _SampleActionToList(pArg->data, ppArgList); if (!ok) { return FALSE; } break; case OVS_ARGTYPE_ACTION_UPCALL_GROUP: { OVS_ARGUMENT_GROUP* pUpcallGroup = NULL; OVS_ARGUMENT* pUpcallArg = NULL; BOOLEAN ok = TRUE; pUpcallGroup = KZAlloc(sizeof(OVS_ARGUMENT_GROUP)); if (NULL == pUpcallGroup) { return FALSE; } ok = CopyArgumentGroup(pUpcallGroup, pArg->data, /*actionsToAdd*/0); if (!ok) { DestroyArgumentGroup(pUpcallGroup); return FALSE; } pUpcallArg = CreateArgumentFromGroup(argType, pUpcallGroup); if (!AppendArgumentToList(pUpcallArg, ppArgList)) { return FALSE; } } break; default: { OVS_ARGUMENT* pDestArg = KAlloc(sizeof(OVS_ARGUMENT)); if (!pDestArg) { return FALSE; } CopyArgument(pDestArg, pArg); if (!AppendArgumentToList(pDestArg, ppArgList)) { return FALSE; } } break; } } return TRUE; }