123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395 |
- #include "HandleManager.h"
- #include "LocalConfig.h"
- #include "PacketAnalizer.h"
- #include "CDI.h"
- //#include "Logger.h"
- HandleManager g_HandleManager;
- HandleManager::HandleManager()
- {
- }
- HandleManager::~HandleManager()
- {
- Clear();
- }
- void HandleManager::Clear()
- {
- //m_HandleMap.clear();
- Thread_Lock();
- m_CrcMap.clear();
- Thread_UnLock();
- }
- void HandleManager::ClearLocalDrvHandles(vector<UINT64> &ServerSysIFList)
- {
- CcosTargetAddress DevID;
- vector<CcosDevFileHandle> HandleList;
- DevID[CCOS_PACK_TARGET_BUSID] = (const char*)getLocalEbusId();
- DevID[CCOS_PACK_TARGET_MACHINEID] = (const char*)getLocalMachineId();
- DevID[CCOS_PACK_TARGET_PROCID] = (UINT64)getpid();
- Thread_Lock();
- //kick all of dev's sysif
- for (DWORD i = 0; i < ServerSysIFList.size(); i++)
- {
- DevID[CCOS_PACK_TARGET_ADDR] = ServerSysIFList[i];
- //#ifdef _DEBUG
- // DevID.PrintOut();//for test
- //#endif
- map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.begin();
- while (crc_iter != m_CrcMap.end())
- {
- //#ifdef _DEBUG
- // crc_iter->second.PrintOut();//for test
- //#endif
- if (crc_iter->second.GetTarget(false) == DevID)
- {
- HandleList.push_back(crc_iter->second);
- //for test
- ////mLog::FINFO("ClearLocalDrvHandles Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
- crc_iter = m_CrcMap.erase(crc_iter);
- continue;
- }
- ++crc_iter;
- }
- }
- Thread_UnLock();
- //notify close to owners
- for (DWORD i = 0; i < HandleList.size();i++)
- {
- ResDataObject Notify;
- PacketAnalizer::MakeCloseRequest(Notify, HandleList[i], PACKET_TYPE_NOTIFY);
- GetCommandDispathIF()->ReceivedFromDevice(Notify);
- }
- }
- void HandleManager::ClearRemoteHandles()
- {
- vector<CcosDevFileHandle> HandleList;
- Thread_Lock();
- map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.begin();
- while (crc_iter != m_CrcMap.end())
- {
- if ((int)(crc_iter->second[CCOS_PACK_HANDLE_ROUTE]) == (int)CCOS_PACKET_ROUTE_ETH)
- //if (crc_iter->second.m_Owner.m_MachineID.GetVal() != MachineId)
- {
- HandleList.push_back(crc_iter->second);
- //for test
- ////mLog::FINFO("ClearRemoteHandles Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
- crc_iter = m_CrcMap.erase(crc_iter);
- continue;
- }
- ++crc_iter;
- }
-
- Thread_UnLock();
- //send notify here
- //send ...
- //notify close to owners
- for (DWORD i = 0; i < HandleList.size(); i++)
- {
- ResDataObject Notify;
- PacketAnalizer::MakeCloseRequest(Notify, HandleList[i], PACKET_TYPE_NOTIFY);
- GetCommandDispathIF()->ReceivedFromDevice(Notify);
- }
- }
- bool HandleManager::Registhandle(CcosDevFileHandle &Handle)
- {
- Thread_Lock();
- map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.find((UINT64)Handle[CCOS_PACKET_HANDLE_KEY]);
- if (crc_iter != m_CrcMap.end())
- {
- Thread_UnLock();
- return false;
- }
- //if (RegistHandle(Handle.m_Dev.m_ProcID, Handle.m_Dev.m_Addr, Handle.m_Owner, Handle.m_Flags))
- //{
- // m_CrcMap[Handle.m_HandleId] = Handle;
- //}
- m_CrcMap[(UINT64)Handle[CCOS_PACKET_HANDLE_KEY]] = Handle;
- #ifdef _DEBUG
- //for test
- //mLog::FINFO("Registed Handle Count:{$}\n", m_CrcMap.size());
- crc_iter = m_CrcMap.begin();
- while (crc_iter != m_CrcMap.end())
- {
- //mLog::FINFO("Registed Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
- ++crc_iter;
- }
- #endif
- Thread_UnLock();
- return true;
- }
- bool HandleManager::UnRegistHandle(UINT64 CrcCode)
- {
- Thread_Lock();
- //for test
- //mLog::FINFO("Before UnRegistHandle,Map Count:{$},Req Handle Id:{$}\n", m_CrcMap.size(), CrcCode);
- map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.find(CrcCode);
- if (crc_iter != m_CrcMap.end())
- {
- //for test
- //mLog::FINFO("UnRegistHandle Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
- m_CrcMap.erase(crc_iter);
- Thread_UnLock();
- return true;
- }
- //for test
- #ifdef _DEBUG
- //mLog::FINFO("Left Handle Count:{$}\n", m_CrcMap.size());
- crc_iter = m_CrcMap.begin();
- while (crc_iter != m_CrcMap.end())
- {
- //mLog::FINFO("LeftHandle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
- ++crc_iter;
- }
- #endif
- Thread_UnLock();
- return false;
- }
- bool HandleManager::GetHandle(UINT64 CrcCode, CcosDevFileHandle& filehandle)
- {
- Thread_Lock();
- map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.find(CrcCode);
- if (crc_iter != m_CrcMap.end())
- {
- filehandle = crc_iter->second;
- Thread_UnLock();
- return true;
- }
- Thread_UnLock();
- return false;
- }
- bool HandleManager::GetFileFlag(UINT64 CrcCode,UINT64 DevAddr, DWORD &fileFlag)
- {
- bool ret = false;
- Thread_Lock();
- map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.find(CrcCode);
- if (crc_iter != m_CrcMap.end())
- {
- if ((UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_ADDR] == DevAddr)
- {
- fileFlag = crc_iter->second[CCOS_PACK_HANDLE_FLAGS];
- ret = true;
- }
- else
- {
- //mLog::FERROR("Dev Addr not exist.Crc:{$}", DevAddr);
- }
- }
- else
- {
- //mLog::FERROR("Dev Crc not exist.Crc:{$}", CrcCode);
- }
- Thread_UnLock();
- return ret;
- }
- void HandleManager::DeviceDetached(UINT64 ProcId, UINT64 Addr)
- {
- //NOT FINISHED YET
- //it didn't send the close notify
- Thread_Lock();
- map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.begin();
- while (crc_iter != m_CrcMap.end())
- {
- if ((UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_ADDR] == Addr && (UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_PROCID] == ProcId)
- {
- //send notify here
- //send ...
- //for test
- //mLog::FINFO("DeviceDetached Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
- crc_iter = m_CrcMap.erase(crc_iter);
- continue;
- }
- ++crc_iter;
- }
- Thread_UnLock();
- }
- bool HandleManager::CheckNotifyPacketAccessValidity(ResDataObject &packet, DWORD Flags)
- {
- bool ret = true;
- //CMD
- PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
- switch (cmd)
- {
- case PACKET_CMD_EXE:
- if ((Flags & NOTIFY_ACTION) == 0)
- {
- ret = false;
- }
- break;
- case PACKET_CMD_DATA:
- if ((Flags & NOTIFY_DATA) == 0)
- {
- ret = false;
- }
- break;
- case PACKET_CMD_MSG:
- if ((Flags & NOTIFY_MSG) == 0)
- {
- ret = false;
- }
- break;
- case PACKET_CMD_PART_UPDATE:
- case PACKET_CMD_UPDATE:
- case PACKET_CMD_ADD:
- case PACKET_CMD_DEL:
- if ((Flags & NOTIFY_UPDATE) == 0)
- {
- ret = false;
- }
- break;
- }
- return ret;
- }
- bool HandleManager::CheckNormalPacketAccessValidity(ResDataObject &packet,DWORD Flags)
- {
- bool ret = true;
- //CMD
- PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
- switch (cmd)
- {
- case PACKET_CMD_EXE:
- if ((Flags & ACTION) == 0)
- {
- ret = false;
- }
- break;
- case PACKET_CMD_DATA:
- case PACKET_CMD_MSG:
- case PACKET_CMD_UPDATE:
- case PACKET_CMD_ADD:
- case PACKET_CMD_DEL:
- ret = false;
- break;
- }
- return ret;
- }
- CMD_ECHO HandleManager::CheckReqPacketValidity(ResDataObject &packet, UINT64 &Addr)
- {
- CMD_ECHO ret = CMD_ECHO_IGNORE;//ignore
- UINT64 Crc;
- DWORD Flag;
- bool status = true;
- status &= PacketAnalizer::GetPacketHandleCrc(&packet, Crc);
- status &= PacketAnalizer::GetPacketHandleAddr(&packet, Addr, true);
- if (status)
- {
- if (GetFileFlag(Crc, Addr, Flag))
- {
- //REQ & RES
- status = CheckNormalPacketAccessValidity(packet, Flag);
- if (status)
- {
- ret = CMD_ECHO_OK;//ok
- }
- else
- {
- //mLog::FERROR("Dev AccessValidity not Match.AccessFlag: {$} packet {$}", Flag, packet.encode());
- ret = CMD_ECHO_NG;//failed
- }
- }
- else
- {
- //mLog::FERROR("fileFlag not right {$} ", packet.encode());
- ret = CMD_ECHO_NOTARGET;//no target
- }
- }
-
- return ret;
- }
- bool HandleManager::GetNotifyOwners(ResDataObject &packet, vector<CcosDevFileHandle> &OwnerList)
- {
- bool ret = true;
- //get device proc&address
- UINT64 Proc, Addr;
- ret &= PacketAnalizer::GetPacketHandleProcId(&packet, Proc, true);
- ret &= PacketAnalizer::GetPacketHandleAddr(&packet, Addr, true);
- if (ret == false)
- {
- return false;
- }
- OwnerList.clear();
- Thread_Lock();
- map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.begin();
- while (crc_iter != m_CrcMap.end())
- {
- if (((UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_ADDR] == Addr)
- && ((UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_PROCID] == Proc))
- {
- //
- if (CheckNotifyPacketAccessValidity(packet, crc_iter->second[CCOS_PACK_HANDLE_FLAGS]))
- {
- //match one
- OwnerList.push_back(crc_iter->second);
- }
- }
- ++crc_iter;
- }
- Thread_UnLock();
- return (OwnerList.size() > 0);
- }
|