123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826 |
- #include "LocalConfig.h"
- #include "PacketCommon.h"
- #include "PacketAnalizer.h"
- #include "DrvTree.h"
- //#include "DevBusManager.h"
- #include "DeviceBus.h"
- #include "HandleManager.h"
- //#include "ClientManager.h"
- #include "DriverManager.h"
- //#include "shareMemWR.h"
- //#include "CCOSLogicDeviceStructure.h"
- //#include "sysif.h"
- //ShareMemWR g_SM;
- PacketCommon::PacketCommon()
- {
- }
- PacketCommon::~PacketCommon()
- {
- }
- /// <summary>
- /// 通过Bus发送Ccos包,包携带数据通过共享内存
- /// </summary>
- /// <param name="packet">要发送的包</param>
- /// <param name="Local">是否本地</param>
- /// <param name="TargetbusId">目标BusId</param>
- /// <param name="nShareMemID">共享内存ID</param>
- /// <returns></returns>
- bool SendSMpacket(ResDataObject &packet, bool Local, string &TargetbusId, unsigned long long nShareMemID)
- {
- if (BusSendSMPacket(packet, Local, TargetbusId, nShareMemID) == false)
- {
- //log here
- //NOT FINISHED YET
- //11.21版本为止,不添加功能
- //应该反馈错误,并进行对应的后续处理
- return false;
- }
- return true;
- }
- /// <summary>
- /// 通过Bus发走Ccos包
- /// </summary>
- /// <param name="packet">要处理的包</param>
- /// <param name="Local">是否本地</param>
- /// <param name="TargetbusId">目标BusId</param>
- /// <param name="pBlockData">消息块数据,默认NULL</param>
- /// <param name="Size">块数据长度,默认0</param>
- /// <returns></returns>
- bool Sendpacket(ResDataObject &packet, bool Local, string &TargetbusId, char* pBlockData, DWORD Size)
- {
- if (BusSendPacket(packet, Local, TargetbusId, pBlockData,Size) == false)
- {
- //log here
- //NOT FINISHED YET
- //11.21版本为止,不添加功能
- //应该反馈错误,并进行对应的后续处理
- return false;
- }
- return true;
- }
- CMD_ECHO DoSendPacket(ResDataObject &packet, bool Local,bool Block, string &TargetbusId)
- {
- //do send
- //block or packet
- //if (Block)
- //{
- // //get context
- // ResDataObject resImg;
- // ImgDataInfo ImgData;
- // string MachineId;
- // if (PacketAnalizer::GetDestinationMachineId(packet, MachineId) == false)
- // {
- // return CMD_ECHO_IGNORE;
- // }
- // //printf("Got Req of PACKET_CMD_DATA!!!---------------------\n");
- // if (MachineId != (const char*)getLocalMachineId())
- // {
- // PacketAnalizer::GetPacketContext(&packet, resImg);
- // ImgData.SetResDataObject(resImg);
- // //printf("Going to send SMPacket!!!---------------------\n");
- // //target is not in this machine
- // if (SendSMpacket(packet, Local, TargetbusId, ImgData.nShareMemID) == false)
- // {
- // //failed to send
- // return CMD_ECHO_NOTARGET;
- // }
- // return CMD_ECHO_OK;
- // }
- // //same machineId,just send it as normal packet
- //}
- //if (Sendpacket(packet, Local, TargetbusId) == false)
- //{
- // //failed to send
- // return CMD_ECHO_NOTARGET;
- //}
- return CMD_ECHO_OK;
- }
- ///当前eBusId的CcosProc的包
- CMD_ECHO DoThisProcDispatchPacket(ResDataObject &packet)
- {
- //packet cmd
- PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
- PACKET_TYPE type = PacketAnalizer::GetPacketType(&packet);
- if (cmd == PACKET_CMD_OPEN && type == PACKET_TYPE_REQ)
- {
- //open packet
- //find driver tree
- string path = PacketAnalizer::GetPacketKey(&packet);
- if (path.size() > 0)
- {
- DrvTreeNode Node;
- if (g_DrvTree.GetTreeNode(path.c_str(), Node))
- {
- //fill up
- if (Node.m_ProcId != (UINT64)getpid())
- {
- //going to sub proc
- BaseJsonDataObject<UINT64> translator;
- translator = (UINT64)Node.m_ProcId;//bug fix
- string TargetbusId = translator.GetVal();
- //this machine
- if (Sendpacket(packet, true, TargetbusId) == false)
- {
- //failed to send
- //mLog::FERROR("Failed send ebus.req dev:{$}", path.c_str());
- g_DrvTree.PrintExistTree();
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;//dispatch it
- }
- else
- {
- return CMD_ECHO_NG;//to this proc
- }
- }
- else
- {
- //mLog::FERROR("req dev:{$}", path.c_str());
- g_DrvTree.PrintExistTree();
- return CMD_ECHO_NOTARGET;
- }
- }
- else
- {
- return CMD_ECHO_IGNORE;
- }
- }
- else
- {
- //normal packet
- UINT64 ProcId = 0;
- if (PacketAnalizer::GetDestinationProcId(packet, ProcId) == false)
- {
- return CMD_ECHO_IGNORE;
- }
- UINT64 CurProcId = (UINT64)getpid();
- //sub proc
- if (ProcId != CurProcId)
- {
- BaseJsonDataObject<UINT64> translator;
- translator = ProcId;
- string TargetbusId = translator.GetVal();
- //dispatch it
- if (Sendpacket(packet, true, TargetbusId) == false)
- {
- //failed to send
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;
- }
- return CMD_ECHO_NG;//to this proc
- }
- return CMD_ECHO_NOTARGET;
- }
- //-1:ignore,0:Fail,1:local,2:Dispatch
- CMD_ECHO DispatchPacket(ResDataObject &packet)
- {
- CCOS_PACKET_ROUTE Route;
- CMD_ECHO ret = CMD_ECHO_IGNORE;
- try {
- //get destination Busid
- string DesBusId;
- if (PacketAnalizer::GetDestinationBusId(packet, DesBusId) == false)
- {
- return ret;
- }
- if (DesBusId == (const char*)getLocalEbusId())
- {
- //target is this proc
- return DoThisProcDispatchPacket(packet);
- }
- //below is not this proc
- //get target route
- if (PacketAnalizer::GetPacketRoute(&packet, Route) == false)
- {
- return ret;
- }
- bool sendtoLocalMachine = false;
- bool sendBlockData = false;
- //packet cmd
- PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
- if (cmd == PACKET_CMD_DATA)
- {
- sendBlockData = true;
- }
- //Precaculate direction
- if (Route == CCOS_PACKET_ROUTE_ANY)
- {
- //choose one
- Route = GetBusIdDirection(DesBusId);
- //if still any direction,then try local and try eth
- }
- //caculate again
- if (Route == CCOS_PACKET_ROUTE_LOCAL)
- {
- //target in this machine
- sendtoLocalMachine = true;
- }
- else if (Route == CCOS_PACKET_ROUTE_ETH)
- {
- //target is not in this machine
- }
- else if (Route == CCOS_PACKET_ROUTE_ANY)
- {
- //if still any direction,then try local and try eth
- //local first
- if (DoSendPacket(packet, true, sendBlockData, DesBusId) == CMD_ECHO_OK)
- {
- return CMD_ECHO_OK;
- }
- //try eth
- return DoSendPacket(packet, false, sendBlockData, DesBusId);
- }
- else
- {
- //ignore
- return CMD_ECHO_IGNORE;
- }
- //do send
- return DoSendPacket(packet, sendtoLocalMachine, sendBlockData, DesBusId);
- }
- catch (...)
- {
- }
- return ret;
- }
- /*
- //request target is device
- //Dispatch those packets of none match busId&procId
- CMD_ECHO From_RequestProcedure(ResDataObject &packet)
- {
- UINT64 ProcId;
- string TargetbusId;
- string DevMachineId;
- PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
- if (PacketAnalizer::GetPacketHandleBusId(&packet, TargetbusId, true) == false)
- {
- return CMD_ECHO_IGNORE;
- }
- //target is not this proc
- if ((TargetbusId != (const char*)getLocalEbusId()))
- {
- CCOS_PACKET_ROUTE route = Get_TargetDirection(packet);
- switch (route) {
- case CCOS_PACKET_ROUTE_NOTARGET:
- {
- return CMD_ECHO_NOTARGET;
- }
- break;
- case CCOS_PACKET_ROUTE_ANY:
- {
- //1.try local
- if (Sendpacket(packet, true, TargetbusId) == false)
- {
- //failed to send
- //2.try eth
- if (Sendpacket(packet, false, TargetbusId) == true)
- {
- return CMD_ECHO_OK;
- }
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;
- }
- break;
- case CCOS_PACKET_ROUTE_LOCAL:
- {
- //just try local
- if (Sendpacket(packet, true, TargetbusId) == true)
- {
- //failed to send
- return CMD_ECHO_OK;
- }
- return CMD_ECHO_NOTARGET;
- }
- break;
- case CCOS_PACKET_ROUTE_ETH:
- {
- //just try eth
- if (Sendpacket(packet, false, TargetbusId) == true)
- {
- return CMD_ECHO_OK;
- }
- return CMD_ECHO_NOTARGET;
- }
- break;
- default:
- return CMD_ECHO_NOTARGET;
- break;
- }
- }
- else
- {
- //find driver tree
- string path = PacketAnalizer::GetPacketKey(&packet);
- if (path.size() > 0)
- {
- DrvTreeNode Node;
- if (g_DrvTree.GetTreeNode(path.c_str(), Node))
- {
- //fill up
- if (Node.m_ProcId != (UINT64)GetCurrentProcessId())
- {
- //going to sub proc
- BaseJsonDataObject<UINT64> translator;
- translator = (UINT64)GetCurrentProcessId();
- string TargetbusId = translator.GetVal();
- //this machine
- if (Sendpacket(packet, true, TargetbusId) == false)
- {
- //failed to send
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;//dispatch it
- }
- else
- {
- return CMD_ECHO_NG;//to this proc
- }
- }
- }
- return CMD_ECHO_IGNORE;//ignore
- }
- //new change end---------------
- //below it's not open packet..so mid must exist!!!
- if (PacketAnalizer::GetPacketHandleMachineId(&packet, DevMachineId, true) == false)
- {
- return CMD_ECHO_IGNORE;
- }
- //target is not this proc
- if ((TargetbusId != (const char*)getLocalEbusId()))
- {
- //dispatch it
- if (cmd == PACKET_CMD_DATA)
- {
- //get context
- ResDataObject resImg;
- ImgDataInfo ImgData;
- printf("Got Req of PACKET_CMD_DATA!!!---------------------\n");
- if (DevMachineId != (const char*)getLocalMachineId())
- {
- PacketAnalizer::GetPacketContext(&packet, resImg);
- ImgData.SetResDataObject(resImg);
- printf("Going to send SMPacket!!!---------------------\n");
- //target is not in this machine
- if (SendSMpacket(packet, false, TargetbusId, ImgData.nShareMemID) == false)
- {
- //failed to send
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;
- }
- //target in this machine
- if (Sendpacket(packet, true, TargetbusId) == false)
- {
- //failed to send
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;
- }
- else
- {
- //normal packet to diffrent ebusid
- //remote machine
- if (DevMachineId != (const char*)getLocalMachineId())
- {
- if (Sendpacket(packet, false, TargetbusId) == false)
- {
- //failed to send
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;
- }
- //target in this machine
- if (Sendpacket(packet, true, TargetbusId) == false)
- {
- //failed to send
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;
- }
- }
- //This Proc
- if (PacketAnalizer::GetPacketHandleProcId(&packet, ProcId, true) == false)
- {
- return CMD_ECHO_IGNORE;
- }
- //sub proc
- if (ProcId != (UINT64)GetCurrentProcessId())
- {
- BaseJsonDataObject<UINT64> translator;
- translator = ProcId;
- TargetbusId = translator.GetVal();
- //dispatch it
- if (Sendpacket(packet, true, TargetbusId) == false)
- {
- //failed to send
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;
- }
- return CMD_ECHO_NG;//to this proc
- }
- //response target is client(owner)
- //Dispatch those packets of none match busId&procId
- CMD_ECHO From_ResponseProcedure(ResDataObject &packet)
- {
- string Temp;
- string OwnerbusId;
- UINT64 ProcId;
- if (PacketAnalizer::GetPacketHandleBusId(&packet, OwnerbusId, false) == false)
- {
- return CMD_ECHO_IGNORE;
- }
- //for test
- //if (Temp == "ccosChannel")
- //{
- // ret = ret;
- //}
- string OwnerMachineId;
- if (PacketAnalizer::GetPacketHandleMachineId(&packet, OwnerMachineId, false) == false)
- {
- printf("CMD_DATA:Ignore RES of PACKET_CMD_DATA!!!---------------------\n");
- return CMD_ECHO_IGNORE;
- }
- if ((OwnerbusId != (const char*)getLocalEbusId()))
- {
- //Dispatch here
- //dispatch it
- PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
- if (cmd == PACKET_CMD_DATA)
- {
- //for test
- //mLog::FDEBUG("SendEthBlock");
- //get context
- ResDataObject resImg;
- ImgDataInfo ImgData;
- printf("CMD_DATA:Got RES of PACKET_CMD_DATA!!!\n");
- if (OwnerMachineId == (const char*)getLocalMachineId())
- {
- printf("CMD_DATA:Normal send!!!\n");
- //same machine,diffrent busid,send to local
- if (Sendpacket(packet, true, OwnerbusId) == false)
- {
- //failed to send
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;
- }
- printf("CMD_DATA:OwnerMID:%s,LocalMID:%s\n", OwnerMachineId.c_str(), (const char*)getLocalMachineId());
- PacketAnalizer::GetPacketContext(&packet, resImg);
- ImgData.SetResDataObject(resImg);
- printf("CMD_DATA:Send SMPacket!!!---------------------\n");
- if (SendSMpacket(packet, false, OwnerbusId, ImgData.nShareMemID) == false)
- {
- //failed to send
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;
- }
- else
- {
- //normal packet
- //same machine,diffrent busid,send local
- if (OwnerMachineId == (const char*)getLocalMachineId())
- {
- if (Sendpacket(packet, true, OwnerbusId) == false)
- {
- //failed to send
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;
- }
- //diffrent machine,send eth
- if (Sendpacket(packet, false, OwnerbusId) == false)
- {
- //failed to send
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;
- }
- }
- //This Proc
- //for test
- //mLog::FDEBUG("LocalMsg");
- if (PacketAnalizer::GetPacketHandleProcId(&packet, ProcId, false) == false)
- {
- return CMD_ECHO_IGNORE;
- }
- //sub proc
- if (ProcId != (UINT64)GetCurrentProcessId())
- {
- //for test
- //mLog::FDEBUG("Send Local");
- BaseJsonDataObject<UINT64> translator;
- translator = ProcId;
- OwnerbusId = translator.GetVal();
- //dispatch it
- if (Sendpacket(packet, true, OwnerbusId) == false)
- {
- return CMD_ECHO_NOTARGET;
- }
- return CMD_ECHO_OK;
- }
- //for test
- //mLog::FDEBUG("Send ThisProc");
- return CMD_ECHO_NG;//this proc
- }
- //response target is client(owner)
- //Dispatch those packets of none match busId&procId
- CMD_ECHO From_NotifyProcedure(ResDataObject &packet)
- {
- return From_ResponseProcedure(packet);
- }
- */
- //suppose the packet is targeting this process
- /// <summary>
- /// 本驱动的命令请求处理
- /// </summary>
- /// <param name="packet"></param>
- /// <returns></returns>
- /*
- CMD_ECHO Do_LocalReqProcedure(ResDataObject &packet)
- {
- UINT64 Addr = 0;
- CMD_ECHO ret = g_HandleManager.CheckReqPacketValidity(packet, Addr);
- if (ret == CMD_ECHO_OK)
- {
- if (Addr && g_DrvManager.RequestToDevice(packet, Addr) >= RET_SUCCEED)
- {
- ret = CMD_ECHO_OK;
- }
- else
- {
- ret = CMD_ECHO_NOTARGET;
- }
- }
- return ret;
- }
- */
- /*
- CMD_ECHO Do_LocalResProcedure(ResDataObject &packet)
- {
- UINT64 Addr;
- CMD_ECHO ret = CMD_ECHO_IGNORE;
- //find driver tree
- //printf("Driver Thread:%d,Do_LocalResProcedure Entry\n", GetCurrentThreadId());
-
- if (PacketAnalizer::GetPacketHandleAddr(&packet, Addr, false))
- {
- if (g_ClientManager.ResToClient(packet, Addr) >= RET_SUCCEED)
- {
- ret = CMD_ECHO_OK;
- }
- else
- {
- ret = CMD_ECHO_NOTARGET;
- }
- }
- return ret;
- }
- CMD_ECHO Do_LocalNotifyProcedure(ResDataObject &packet)
- {
- return Do_LocalResProcedure(packet);
- }*/
- /// <summary>
- /// 本驱动的Open命令处理
- /// </summary>
- /// <param name="packet"></param>
- /// <returns></returns>
- /*
- CMD_ECHO Do_LocalOpenReqProcedure(ResDataObject &packet)
- {
- CMD_ECHO ret = CMD_ECHO_IGNORE;//ignore
- bool Exist = false;
- //find driver tree
- string path = PacketAnalizer::GetPacketKey(&packet);
- if (path.size() > 0)
- {
- DrvTreeNode Node;
- //need lock strategy
- g_DrvTree.Thread_Lock();
- Exist = g_DrvTree.GetTreeNode(path.c_str(), Node);
- g_DrvTree.Thread_UnLock();
-
- if (Exist)
- {
- //update request
- if (PacketAnalizer::UpdateOpenRequest(packet, getLocalMachineId(), getLocalEbusId(), Node.m_ProcId, Node.m_Address))
- {
- if (Node.m_Address && g_DrvManager.RequestToDevice(packet, Node.m_Address) >= RET_SUCCEED)
- {
- ret = CMD_ECHO_OK;
- }
- else
- {
- //mLog::FERROR("Dev exist.RequestToDevice Failed.:{$}", path.c_str());
- ret = CMD_ECHO_NOTARGET;//no exist
- }
- }
- }
- else
- {
- //mLog::FERROR("Dev not exist:{$}", path.c_str());
- g_DrvTree.PrintExistTree();
- ret = CMD_ECHO_NOTARGET;//no exist
- }
- }
- //failed status is returned by driverthread.so ignore 1 failed
- return ret;
- }*/
- /// <summary>
- /// 本驱动的请求处理过程
- /// </summary>
- /// <param name="packet"></param>
- /// <returns></returns>
- ///
- /*
- CMD_ECHO To_Local_RequestProcedure(ResDataObject &packet)
- {
- CMD_ECHO ret = CMD_ECHO_IGNORE;//ignore
- PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
- switch (cmd)
- {
- case PACKET_CMD_OPEN:
- return Do_LocalOpenReqProcedure(packet);
- break;
- case PACKET_CMD_CLOSE:
- case PACKET_CMD_GET:
- case PACKET_CMD_EXE:
- return Do_LocalReqProcedure(packet);
- break;
- default:
- break;
- }
- return ret;
- }*/
- /*
- CMD_ECHO To_Local_ResponseProcedure(ResDataObject &packet)
- {
- CMD_ECHO ret = CMD_ECHO_IGNORE;//ignore
- PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
- switch (cmd)
- {
- case PACKET_CMD_OPEN:
- case PACKET_CMD_CLOSE:
- case PACKET_CMD_GET:
- case PACKET_CMD_EXE:
- return Do_LocalResProcedure(packet);
- break;
- default:
- break;
- }
- return ret;
- }
- CMD_ECHO To_Local_NotifyProcedure(ResDataObject &packet)
- {
- CMD_ECHO ret = CMD_ECHO_IGNORE;//ignore
- PACKET_CMD cmd = PacketAnalizer::GetPacketCmd(&packet);
- switch (cmd)
- {
- case PACKET_CMD_CLOSE:
- case PACKET_CMD_PART_UPDATE:
- case PACKET_CMD_UPDATE:
- case PACKET_CMD_ADD:
- case PACKET_CMD_DEL:
- case PACKET_CMD_EXE:
- case PACKET_CMD_DATA:
- case PACKET_CMD_MSG:
- return Do_LocalNotifyProcedure(packet);
- break;
- default:
- break;
- }
- return ret;
- }
- */
|