HandleManager.cpp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. #include "HandleManager.h"
  2. #include "LocalConfig.h"
  3. #include "PacketAnalizer.h"
  4. #include "CDI.h"
  5. //#include "Logger.h"
  6. HandleManager g_HandleManager;
  7. HandleManager::HandleManager()
  8. {
  9. }
  10. HandleManager::~HandleManager()
  11. {
  12. Clear();
  13. }
  14. void HandleManager::Clear()
  15. {
  16. //m_HandleMap.clear();
  17. Thread_Lock();
  18. m_CrcMap.clear();
  19. Thread_UnLock();
  20. }
  21. void HandleManager::ClearLocalDrvHandles(vector<UINT64> &ServerSysIFList)
  22. {
  23. CcosTargetAddress DevID;
  24. vector<CcosDevFileHandle> HandleList;
  25. DevID[CCOS_PACK_TARGET_BUSID] = (const char*)getLocalEbusId();
  26. DevID[CCOS_PACK_TARGET_MACHINEID] = (const char*)getLocalMachineId();
  27. DevID[CCOS_PACK_TARGET_PROCID] = (UINT64)getpid();
  28. Thread_Lock();
  29. //kick all of dev's sysif
  30. for (DWORD i = 0; i < ServerSysIFList.size(); i++)
  31. {
  32. DevID[CCOS_PACK_TARGET_ADDR] = ServerSysIFList[i];
  33. //#ifdef _DEBUG
  34. // DevID.PrintOut();//for test
  35. //#endif
  36. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.begin();
  37. while (crc_iter != m_CrcMap.end())
  38. {
  39. //#ifdef _DEBUG
  40. // crc_iter->second.PrintOut();//for test
  41. //#endif
  42. if (crc_iter->second.GetTarget(false) == DevID)
  43. {
  44. HandleList.push_back(crc_iter->second);
  45. //for test
  46. ////mLog::FINFO("ClearLocalDrvHandles Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
  47. crc_iter = m_CrcMap.erase(crc_iter);
  48. continue;
  49. }
  50. ++crc_iter;
  51. }
  52. }
  53. Thread_UnLock();
  54. //notify close to owners
  55. for (DWORD i = 0; i < HandleList.size();i++)
  56. {
  57. ResDataObject Notify;
  58. PacketAnalizer::MakeCloseRequest(Notify, HandleList[i], PACKET_TYPE_NOTIFY);
  59. GetCommandDispathIF()->ReceivedFromDevice(Notify);
  60. }
  61. }
  62. void HandleManager::ClearRemoteHandles()
  63. {
  64. vector<CcosDevFileHandle> HandleList;
  65. Thread_Lock();
  66. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.begin();
  67. while (crc_iter != m_CrcMap.end())
  68. {
  69. if ((int)(crc_iter->second[CCOS_PACK_HANDLE_ROUTE]) == (int)CCOS_PACKET_ROUTE_ETH)
  70. //if (crc_iter->second.m_Owner.m_MachineID.GetVal() != MachineId)
  71. {
  72. HandleList.push_back(crc_iter->second);
  73. //for test
  74. ////mLog::FINFO("ClearRemoteHandles Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
  75. crc_iter = m_CrcMap.erase(crc_iter);
  76. continue;
  77. }
  78. ++crc_iter;
  79. }
  80. Thread_UnLock();
  81. //send notify here
  82. //send ...
  83. //notify close to owners
  84. for (DWORD i = 0; i < HandleList.size(); i++)
  85. {
  86. ResDataObject Notify;
  87. PacketAnalizer::MakeCloseRequest(Notify, HandleList[i], PACKET_TYPE_NOTIFY);
  88. GetCommandDispathIF()->ReceivedFromDevice(Notify);
  89. }
  90. }
  91. bool HandleManager::Registhandle(CcosDevFileHandle &Handle)
  92. {
  93. Thread_Lock();
  94. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.find((UINT64)Handle[CCOS_PACKET_HANDLE_KEY]);
  95. if (crc_iter != m_CrcMap.end())
  96. {
  97. Thread_UnLock();
  98. return false;
  99. }
  100. //if (RegistHandle(Handle.m_Dev.m_ProcID, Handle.m_Dev.m_Addr, Handle.m_Owner, Handle.m_Flags))
  101. //{
  102. // m_CrcMap[Handle.m_HandleId] = Handle;
  103. //}
  104. m_CrcMap[(UINT64)Handle[CCOS_PACKET_HANDLE_KEY]] = Handle;
  105. #ifdef _DEBUG
  106. //for test
  107. //mLog::FINFO("Registed Handle Count:{$}\n", m_CrcMap.size());
  108. crc_iter = m_CrcMap.begin();
  109. while (crc_iter != m_CrcMap.end())
  110. {
  111. //mLog::FINFO("Registed Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
  112. ++crc_iter;
  113. }
  114. #endif
  115. Thread_UnLock();
  116. return true;
  117. }
  118. bool HandleManager::UnRegistHandle(UINT64 CrcCode)
  119. {
  120. Thread_Lock();
  121. //for test
  122. //mLog::FINFO("Before UnRegistHandle,Map Count:{$},Req Handle Id:{$}\n", m_CrcMap.size(), CrcCode);
  123. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.find(CrcCode);
  124. if (crc_iter != m_CrcMap.end())
  125. {
  126. //for test
  127. //mLog::FINFO("UnRegistHandle Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
  128. m_CrcMap.erase(crc_iter);
  129. Thread_UnLock();
  130. return true;
  131. }
  132. //for test
  133. #ifdef _DEBUG
  134. //mLog::FINFO("Left Handle Count:{$}\n", m_CrcMap.size());
  135. crc_iter = m_CrcMap.begin();
  136. while (crc_iter != m_CrcMap.end())
  137. {
  138. //mLog::FINFO("LeftHandle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
  139. ++crc_iter;
  140. }
  141. #endif
  142. Thread_UnLock();
  143. return false;
  144. }
  145. bool HandleManager::GetHandle(UINT64 CrcCode, CcosDevFileHandle& filehandle)
  146. {
  147. Thread_Lock();
  148. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.find(CrcCode);
  149. if (crc_iter != m_CrcMap.end())
  150. {
  151. filehandle = crc_iter->second;
  152. Thread_UnLock();
  153. return true;
  154. }
  155. Thread_UnLock();
  156. return false;
  157. }
  158. bool HandleManager::GetFileFlag(UINT64 CrcCode,UINT64 DevAddr, DWORD &fileFlag)
  159. {
  160. bool ret = false;
  161. Thread_Lock();
  162. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.find(CrcCode);
  163. if (crc_iter != m_CrcMap.end())
  164. {
  165. if ((UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_ADDR] == DevAddr)
  166. {
  167. fileFlag = crc_iter->second[CCOS_PACK_HANDLE_FLAGS];
  168. ret = true;
  169. }
  170. else
  171. {
  172. //mLog::FERROR("Dev Addr not exist.Crc:{$}", DevAddr);
  173. }
  174. }
  175. else
  176. {
  177. //mLog::FERROR("Dev Crc not exist.Crc:{$}", CrcCode);
  178. }
  179. Thread_UnLock();
  180. return ret;
  181. }
  182. void HandleManager::DeviceDetached(UINT64 ProcId, UINT64 Addr)
  183. {
  184. //NOT FINISHED YET
  185. //it didn't send the close notify
  186. Thread_Lock();
  187. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.begin();
  188. while (crc_iter != m_CrcMap.end())
  189. {
  190. if ((UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_ADDR] == Addr && (UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_PROCID] == ProcId)
  191. {
  192. //send notify here
  193. //send ...
  194. //for test
  195. //mLog::FINFO("DeviceDetached Handle Id:{$}\n", (UINT64)(crc_iter->second[CCOS_PACKET_HANDLE_KEY]));
  196. crc_iter = m_CrcMap.erase(crc_iter);
  197. continue;
  198. }
  199. ++crc_iter;
  200. }
  201. Thread_UnLock();
  202. }
  203. bool HandleManager::CheckNotifyPacketAccessValidity(ResDataObject &packet, DWORD Flags)
  204. {
  205. bool ret = true;
  206. //CMD
  207. PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
  208. switch (cmd)
  209. {
  210. case PACKET_CMD_EXE:
  211. if ((Flags & NOTIFY_ACTION) == 0)
  212. {
  213. ret = false;
  214. }
  215. break;
  216. case PACKET_CMD_DATA:
  217. if ((Flags & NOTIFY_DATA) == 0)
  218. {
  219. ret = false;
  220. }
  221. break;
  222. case PACKET_CMD_MSG:
  223. if ((Flags & NOTIFY_MSG) == 0)
  224. {
  225. ret = false;
  226. }
  227. break;
  228. case PACKET_CMD_PART_UPDATE:
  229. case PACKET_CMD_UPDATE:
  230. case PACKET_CMD_ADD:
  231. case PACKET_CMD_DEL:
  232. if ((Flags & NOTIFY_UPDATE) == 0)
  233. {
  234. ret = false;
  235. }
  236. break;
  237. }
  238. return ret;
  239. }
  240. bool HandleManager::CheckNormalPacketAccessValidity(ResDataObject &packet,DWORD Flags)
  241. {
  242. bool ret = true;
  243. //CMD
  244. PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
  245. switch (cmd)
  246. {
  247. case PACKET_CMD_EXE:
  248. if ((Flags & ACTION) == 0)
  249. {
  250. ret = false;
  251. }
  252. break;
  253. case PACKET_CMD_DATA:
  254. case PACKET_CMD_MSG:
  255. case PACKET_CMD_UPDATE:
  256. case PACKET_CMD_ADD:
  257. case PACKET_CMD_DEL:
  258. ret = false;
  259. break;
  260. }
  261. return ret;
  262. }
  263. CMD_ECHO HandleManager::CheckReqPacketValidity(ResDataObject &packet, UINT64 &Addr)
  264. {
  265. CMD_ECHO ret = CMD_ECHO_IGNORE;//ignore
  266. UINT64 Crc;
  267. DWORD Flag;
  268. bool status = true;
  269. status &= PacketAnalizer::GetPacketHandleCrc(&packet, Crc);
  270. status &= PacketAnalizer::GetPacketHandleAddr(&packet, Addr, true);
  271. if (status)
  272. {
  273. if (GetFileFlag(Crc, Addr, Flag))
  274. {
  275. //REQ & RES
  276. status = CheckNormalPacketAccessValidity(packet, Flag);
  277. if (status)
  278. {
  279. ret = CMD_ECHO_OK;//ok
  280. }
  281. else
  282. {
  283. //mLog::FERROR("Dev AccessValidity not Match.AccessFlag: {$} packet {$}", Flag, packet.encode());
  284. ret = CMD_ECHO_NG;//failed
  285. }
  286. }
  287. else
  288. {
  289. //mLog::FERROR("fileFlag not right {$} ", packet.encode());
  290. ret = CMD_ECHO_NOTARGET;//no target
  291. }
  292. }
  293. return ret;
  294. }
  295. bool HandleManager::GetNotifyOwners(ResDataObject &packet, vector<CcosDevFileHandle> &OwnerList)
  296. {
  297. bool ret = true;
  298. //get device proc&address
  299. UINT64 Proc, Addr;
  300. ret &= PacketAnalizer::GetPacketHandleProcId(&packet, Proc, true);
  301. ret &= PacketAnalizer::GetPacketHandleAddr(&packet, Addr, true);
  302. if (ret == false)
  303. {
  304. return false;
  305. }
  306. OwnerList.clear();
  307. Thread_Lock();
  308. map<UINT64, CcosDevFileHandle>::iterator crc_iter = m_CrcMap.begin();
  309. while (crc_iter != m_CrcMap.end())
  310. {
  311. if (((UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_ADDR] == Addr)
  312. && ((UINT64)crc_iter->second.GetTarget(false)[CCOS_PACK_TARGET_PROCID] == Proc))
  313. {
  314. //
  315. if (CheckNotifyPacketAccessValidity(packet, crc_iter->second[CCOS_PACK_HANDLE_FLAGS]))
  316. {
  317. //match one
  318. OwnerList.push_back(crc_iter->second);
  319. }
  320. }
  321. ++crc_iter;
  322. }
  323. Thread_UnLock();
  324. return (OwnerList.size() > 0);
  325. }