lltransfermanager.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:36k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltransfermanager.cpp
  3.  * @brief Improved transfer mechanism for moving data through the
  4.  * message system.
  5.  *
  6.  * $LicenseInfo:firstyear=2004&license=viewergpl$
  7.  * 
  8.  * Copyright (c) 2004-2010, Linden Research, Inc.
  9.  * 
  10.  * Second Life Viewer Source Code
  11.  * The source code in this file ("Source Code") is provided by Linden Lab
  12.  * to you under the terms of the GNU General Public License, version 2.0
  13.  * ("GPL"), unless you have obtained a separate licensing agreement
  14.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  15.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  16.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  17.  * 
  18.  * There are special exceptions to the terms and conditions of the GPL as
  19.  * it is applied to this Source Code. View the full text of the exception
  20.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  21.  * online at
  22.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  23.  * 
  24.  * By copying, modifying or distributing this software, you acknowledge
  25.  * that you have read and understood your obligations described above,
  26.  * and agree to abide by those obligations.
  27.  * 
  28.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  29.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  30.  * COMPLETENESS OR PERFORMANCE.
  31.  * $/LicenseInfo$
  32.  */
  33. #include "linden_common.h"
  34. #include "lltransfermanager.h"
  35. #include "llerror.h"
  36. #include "message.h"
  37. #include "lldatapacker.h"
  38. #include "lltransfersourcefile.h"
  39. #include "lltransfersourceasset.h"
  40. #include "lltransfertargetfile.h"
  41. #include "lltransfertargetvfile.h"
  42. const S32 MAX_PACKET_DATA_SIZE = 2048;
  43. const S32 MAX_PARAMS_SIZE = 1024;
  44. LLTransferManager gTransferManager;
  45. LLTransferSource::stype_scfunc_map LLTransferSource::sSourceCreateMap;
  46. //
  47. // LLTransferManager implementation
  48. //
  49. LLTransferManager::LLTransferManager() :
  50. mValid(FALSE)
  51. {
  52. S32 i;
  53. for (i = 0; i < LLTTT_NUM_TYPES; i++)
  54. {
  55. mTransferBitsIn[i] = 0;
  56. mTransferBitsOut[i] = 0;
  57. }
  58. }
  59. LLTransferManager::~LLTransferManager()
  60. {
  61. if (mValid)
  62. {
  63. llwarns << "LLTransferManager::~LLTransferManager - Should have been cleaned up by message system shutdown process" << llendl;
  64. cleanup();
  65. }
  66. }
  67. void LLTransferManager::init()
  68. {
  69. if (mValid)
  70. {
  71. llerrs << "Double initializing LLTransferManager!" << llendl;
  72. }
  73. mValid = TRUE;
  74. // Register message system handlers
  75. gMessageSystem->setHandlerFunc("TransferRequest", processTransferRequest, NULL);
  76. gMessageSystem->setHandlerFunc("TransferInfo", processTransferInfo, NULL);
  77. gMessageSystem->setHandlerFunc("TransferPacket", processTransferPacket, NULL);
  78. gMessageSystem->setHandlerFunc("TransferAbort", processTransferAbort, NULL);
  79. }
  80. void LLTransferManager::cleanup()
  81. {
  82. mValid = FALSE;
  83. host_tc_map::iterator iter;
  84. for (iter = mTransferConnections.begin(); iter != mTransferConnections.end(); iter++)
  85. {
  86. delete iter->second;
  87. }
  88. mTransferConnections.clear();
  89. }
  90. void LLTransferManager::updateTransfers()
  91. {
  92. host_tc_map::iterator iter,cur;
  93. iter = mTransferConnections.begin();
  94. while (iter !=mTransferConnections.end())
  95. {
  96. cur = iter;
  97. iter++;
  98. cur->second->updateTransfers();
  99. }
  100. }
  101. void LLTransferManager::cleanupConnection(const LLHost &host)
  102. {
  103. host_tc_map::iterator iter;
  104. iter = mTransferConnections.find(host);
  105. if (iter == mTransferConnections.end())
  106. {
  107. // This can happen legitimately if we've never done a transfer, and we're
  108. // cleaning up a circuit.
  109. //llwarns << "Cleaning up nonexistent transfer connection to " << host << llendl;
  110. return;
  111. }
  112. LLTransferConnection *connp = iter->second;
  113. delete connp;
  114. mTransferConnections.erase(iter);
  115. }
  116. LLTransferConnection *LLTransferManager::getTransferConnection(const LLHost &host)
  117. {
  118. host_tc_map::iterator iter;
  119. iter = mTransferConnections.find(host);
  120. if (iter == mTransferConnections.end())
  121. {
  122. mTransferConnections[host] = new LLTransferConnection(host);
  123. return mTransferConnections[host];
  124. }
  125. return iter->second;
  126. }
  127. LLTransferSourceChannel *LLTransferManager::getSourceChannel(const LLHost &host, const LLTransferChannelType type)
  128. {
  129. LLTransferConnection *tcp = getTransferConnection(host);
  130. if (!tcp)
  131. {
  132. return NULL;
  133. }
  134. return tcp->getSourceChannel(type);
  135. }
  136. LLTransferTargetChannel *LLTransferManager::getTargetChannel(const LLHost &host, const LLTransferChannelType type)
  137. {
  138. LLTransferConnection *tcp = getTransferConnection(host);
  139. if (!tcp)
  140. {
  141. return NULL;
  142. }
  143. return tcp->getTargetChannel(type);
  144. }
  145. // virtual
  146. LLTransferSourceParams::~LLTransferSourceParams()
  147. { }
  148. LLTransferSource *LLTransferManager::findTransferSource(const LLUUID &transfer_id)
  149. {
  150. // This linear traversal could screw us later if we do lots of
  151. // searches for sources.  However, this ONLY happens right now
  152. // in asset transfer callbacks, so this should be relatively quick.
  153. host_tc_map::iterator iter;
  154. for (iter = mTransferConnections.begin(); iter != mTransferConnections.end(); iter++)
  155. {
  156. LLTransferConnection *tcp = iter->second;
  157. LLTransferConnection::tsc_iter sc_iter;
  158. for (sc_iter = tcp->mTransferSourceChannels.begin(); sc_iter != tcp->mTransferSourceChannels.end(); sc_iter++)
  159. {
  160. LLTransferSourceChannel *scp = *sc_iter;
  161. LLTransferSource *sourcep = scp->findTransferSource(transfer_id);
  162. if (sourcep)
  163. {
  164. return sourcep;
  165. }
  166. }
  167. }
  168. return NULL;
  169. }
  170. //
  171. // Message handlers
  172. //
  173. //static
  174. void LLTransferManager::processTransferRequest(LLMessageSystem *msgp, void **)
  175. {
  176. //llinfos << "LLTransferManager::processTransferRequest" << llendl;
  177. LLUUID transfer_id;
  178. LLTransferSourceType source_type;
  179. LLTransferChannelType channel_type;
  180. F32 priority;
  181. msgp->getUUID("TransferInfo", "TransferID", transfer_id);
  182. msgp->getS32("TransferInfo", "SourceType", (S32 &)source_type);
  183. msgp->getS32("TransferInfo", "ChannelType", (S32 &)channel_type);
  184. msgp->getF32("TransferInfo", "Priority", priority);
  185. LLTransferSourceChannel *tscp = gTransferManager.getSourceChannel(msgp->getSender(), channel_type);
  186. if (!tscp)
  187. {
  188. llwarns << "Source channel not found" << llendl;
  189. return;
  190. }
  191. if (tscp->findTransferSource(transfer_id))
  192. {
  193. llwarns << "Duplicate request for transfer " << transfer_id << ", aborting!" << llendl;
  194. return;
  195. }
  196. S32 size = msgp->getSize("TransferInfo", "Params");
  197. if(size > MAX_PARAMS_SIZE)
  198. {
  199. llwarns << "LLTransferManager::processTransferRequest params too big."
  200. << llendl;
  201. return;
  202. }
  203. //llinfos << transfer_id << ":" << source_type << ":" << channel_type << ":" << priority << llendl;
  204. LLTransferSource* tsp = LLTransferSource::createSource(
  205. source_type,
  206. transfer_id,
  207. priority);
  208. if(!tsp)
  209. {
  210. llwarns << "LLTransferManager::processTransferRequest couldn't create"
  211. << " transfer source!" << llendl;
  212. return;
  213. }
  214. U8 tmp[MAX_PARAMS_SIZE];
  215. msgp->getBinaryData("TransferInfo", "Params", tmp, size);
  216. LLDataPackerBinaryBuffer dpb(tmp, MAX_PARAMS_SIZE);
  217. BOOL unpack_ok = tsp->unpackParams(dpb);
  218. if (!unpack_ok)
  219. {
  220. // This should only happen if the data is corrupt or
  221. // incorrectly packed.
  222. // *NOTE: We may want to call abortTransfer().
  223. llwarns << "LLTransferManager::processTransferRequest: bad parameters."
  224. << llendl;
  225. delete tsp;
  226. return;
  227. }
  228. tscp->addTransferSource(tsp);
  229. tsp->initTransfer();
  230. }
  231. //static
  232. void LLTransferManager::processTransferInfo(LLMessageSystem *msgp, void **)
  233. {
  234. //llinfos << "LLTransferManager::processTransferInfo" << llendl;
  235. LLUUID transfer_id;
  236. LLTransferTargetType target_type;
  237. LLTransferChannelType channel_type;
  238. LLTSCode status;
  239. S32 size;
  240. msgp->getUUID("TransferInfo", "TransferID", transfer_id);
  241. msgp->getS32("TransferInfo", "TargetType", (S32 &)target_type);
  242. msgp->getS32("TransferInfo", "ChannelType", (S32 &)channel_type);
  243. msgp->getS32("TransferInfo", "Status", (S32 &)status);
  244. msgp->getS32("TransferInfo", "Size", size);
  245. //llinfos << transfer_id << ":" << target_type<< ":" << channel_type << llendl;
  246. LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(msgp->getSender(), channel_type);
  247. if (!ttcp)
  248. {
  249. llwarns << "Target channel not found" << llendl;
  250. // Should send a message to abort the transfer.
  251. return;
  252. }
  253. LLTransferTarget *ttp = ttcp->findTransferTarget(transfer_id);
  254. if (!ttp)
  255. {
  256. llwarns << "TransferInfo for unknown transfer!  Not able to handle this yet!" << llendl;
  257. // This could happen if we're doing a push transfer, although to avoid confusion,
  258. // maybe it should be a different message.
  259. return;
  260. }
  261. if (status != LLTS_OK)
  262. {
  263. llwarns << transfer_id << ": Non-ok status, cleaning up" << llendl;
  264. ttp->completionCallback(status);
  265. // Clean up the transfer.
  266. ttcp->deleteTransfer(ttp);
  267. return;
  268. }
  269. // unpack the params
  270. S32 params_size = msgp->getSize("TransferInfo", "Params");
  271. if(params_size > MAX_PARAMS_SIZE)
  272. {
  273. llwarns << "LLTransferManager::processTransferInfo params too big."
  274. << llendl;
  275. return;
  276. }
  277. else if(params_size > 0)
  278. {
  279. U8 tmp[MAX_PARAMS_SIZE];
  280. msgp->getBinaryData("TransferInfo", "Params", tmp, params_size);
  281. LLDataPackerBinaryBuffer dpb(tmp, MAX_PARAMS_SIZE);
  282. if (!ttp->unpackParams(dpb))
  283. {
  284. // This should only happen if the data is corrupt or
  285. // incorrectly packed.
  286. llwarns << "LLTransferManager::processTransferRequest: bad params."
  287. << llendl;
  288. ttp->abortTransfer();
  289. ttcp->deleteTransfer(ttp);
  290. return;
  291. }
  292. }
  293. llinfos << "Receiving " << transfer_id << ", size " << size << " bytes" << llendl;
  294. ttp->setSize(size);
  295. ttp->setGotInfo(TRUE);
  296. // OK, at this point we to handle any delayed transfer packets (which could happen
  297. // if this packet was lost)
  298. // This is a lame cut and paste of code down below.  If we change the logic down there,
  299. // we HAVE to change the logic up here.
  300. while (1)
  301. {
  302. S32 packet_id = 0;
  303. U8 tmp_data[MAX_PACKET_DATA_SIZE];
  304. // See if we've got any delayed packets
  305. packet_id = ttp->getNextPacketID();
  306. if (ttp->mDelayedPacketMap.find(packet_id) != ttp->mDelayedPacketMap.end())
  307. {
  308. // Perhaps this stuff should be inside a method in LLTransferPacket?
  309. // I'm too lazy to do it now, though.
  310. //  llinfos << "Playing back delayed packet " << packet_id << llendl;
  311. LLTransferPacket *packetp = ttp->mDelayedPacketMap[packet_id];
  312. // This is somewhat inefficient, but avoids us having to duplicate
  313. // code between the off-the-wire and delayed paths.
  314. packet_id = packetp->mPacketID;
  315. size = packetp->mSize;
  316. if (size)
  317. {
  318. if ((packetp->mDatap != NULL) && (size<(S32)sizeof(tmp_data)))
  319. {
  320. memcpy(tmp_data, packetp->mDatap, size); /*Flawfinder: ignore*/
  321. }
  322. }
  323. status = packetp->mStatus;
  324. ttp->mDelayedPacketMap.erase(packet_id);
  325. delete packetp;
  326. }
  327. else
  328. {
  329. // No matching delayed packet, we're done.
  330. break;
  331. }
  332. LLTSCode ret_code = ttp->dataCallback(packet_id, tmp_data, size);
  333. if (ret_code == LLTS_OK)
  334. {
  335. ttp->setLastPacketID(packet_id);
  336. }
  337. if (status != LLTS_OK)
  338. {
  339. if (status != LLTS_DONE)
  340. {
  341. llwarns << "LLTransferManager::processTransferInfo Error in playback!" << llendl;
  342. }
  343. else
  344. {
  345. llinfos << "LLTransferManager::processTransferInfo replay FINISHED for " << transfer_id << llendl;
  346. }
  347. // This transfer is done, either via error or not.
  348. ttp->completionCallback(status);
  349. ttcp->deleteTransfer(ttp);
  350. return;
  351. }
  352. }
  353. }
  354. //static
  355. void LLTransferManager::processTransferPacket(LLMessageSystem *msgp, void **)
  356. {
  357. //llinfos << "LLTransferManager::processTransferPacket" << llendl;
  358. LLUUID transfer_id;
  359. LLTransferChannelType channel_type;
  360. S32 packet_id;
  361. LLTSCode status;
  362. S32 size;
  363. msgp->getUUID("TransferData", "TransferID", transfer_id);
  364. msgp->getS32("TransferData", "ChannelType", (S32 &)channel_type);
  365. msgp->getS32("TransferData", "Packet", packet_id);
  366. msgp->getS32("TransferData", "Status", (S32 &)status);
  367. // Find the transfer associated with this packet.
  368. //llinfos << transfer_id << ":" << channel_type << llendl;
  369. LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(msgp->getSender(), channel_type);
  370. if (!ttcp)
  371. {
  372. llwarns << "Target channel not found" << llendl;
  373. return;
  374. }
  375. LLTransferTarget *ttp = ttcp->findTransferTarget(transfer_id);
  376. if (!ttp)
  377. {
  378. llwarns << "Didn't find matching transfer for " << transfer_id
  379. << " processing packet " << packet_id
  380. << " from " << msgp->getSender() << llendl;
  381. return;
  382. }
  383. size = msgp->getSize("TransferData", "Data");
  384. S32 msg_bytes = 0;
  385. if (msgp->getReceiveCompressedSize())
  386. {
  387. msg_bytes = msgp->getReceiveCompressedSize();
  388. }
  389. else
  390. {
  391. msg_bytes = msgp->getReceiveSize();
  392. }
  393. gTransferManager.addTransferBitsIn(ttcp->mChannelType, msg_bytes*8);
  394. if ((size < 0) || (size > MAX_PACKET_DATA_SIZE))
  395. {
  396. llwarns << "Invalid transfer packet size " << size << llendl;
  397. return;
  398. }
  399. U8 tmp_data[MAX_PACKET_DATA_SIZE];
  400. if (size > 0)
  401. {
  402. // Only pull the data out if the size is > 0
  403. msgp->getBinaryData("TransferData", "Data", tmp_data, size);
  404. }
  405. if ((!ttp->gotInfo()) || (ttp->getNextPacketID() != packet_id))
  406. {
  407. // Put this on a list of packets to be delivered later.
  408. if(!ttp->addDelayedPacket(packet_id, status, tmp_data, size))
  409. {
  410. // Whoops - failed to add a delayed packet for some reason.
  411. llwarns << "Too many delayed packets processing transfer "
  412. << transfer_id << " from " << msgp->getSender() << llendl;
  413. ttp->abortTransfer();
  414. ttcp->deleteTransfer(ttp);
  415. return;
  416. }
  417. #if 0
  418. // Spammy!
  419. const S32 LL_TRANSFER_WARN_GAP = 10;
  420. if(!ttp->gotInfo())
  421. {
  422. llwarns << "Got data packet before information in transfer "
  423. << transfer_id << " from " << msgp->getSender()
  424. << ", got " << packet_id << llendl;
  425. }
  426. else if((packet_id - ttp->getNextPacketID()) > LL_TRANSFER_WARN_GAP)
  427. {
  428. llwarns << "Out of order packet in transfer " << transfer_id
  429. << " from " << msgp->getSender() << ", got " << packet_id
  430. << " expecting " << ttp->getNextPacketID() << llendl;
  431. }
  432. #endif
  433. return;
  434. }
  435. // Loop through this until we're done with all delayed packets
  436. //
  437. // NOTE: THERE IS A CUT AND PASTE OF THIS CODE IN THE TRANSFERINFO HANDLER
  438. // SO WE CAN PLAY BACK DELAYED PACKETS THERE!!!!!!!!!!!!!!!!!!!!!!!!!
  439. //
  440. BOOL done = FALSE;
  441. while (!done)
  442. {
  443. LLTSCode ret_code = ttp->dataCallback(packet_id, tmp_data, size);
  444. if (ret_code == LLTS_OK)
  445. {
  446. ttp->setLastPacketID(packet_id);
  447. }
  448. if (status != LLTS_OK)
  449. {
  450. if (status != LLTS_DONE)
  451. {
  452. llwarns << "LLTransferManager::processTransferPacket Error in transfer!" << llendl;
  453. }
  454. else
  455. {
  456. //  llinfos << "LLTransferManager::processTransferPacket done for " << transfer_id << llendl;
  457. }
  458. // This transfer is done, either via error or not.
  459. ttp->completionCallback(status);
  460. ttcp->deleteTransfer(ttp);
  461. return;
  462. }
  463. // See if we've got any delayed packets
  464. packet_id = ttp->getNextPacketID();
  465. if (ttp->mDelayedPacketMap.find(packet_id) != ttp->mDelayedPacketMap.end())
  466. {
  467. // Perhaps this stuff should be inside a method in LLTransferPacket?
  468. // I'm too lazy to do it now, though.
  469. //  llinfos << "Playing back delayed packet " << packet_id << llendl;
  470. LLTransferPacket *packetp = ttp->mDelayedPacketMap[packet_id];
  471. // This is somewhat inefficient, but avoids us having to duplicate
  472. // code between the off-the-wire and delayed paths.
  473. packet_id = packetp->mPacketID;
  474. size = packetp->mSize;
  475. if (size)
  476. {
  477. if ((packetp->mDatap != NULL) && (size<(S32)sizeof(tmp_data)))
  478. {
  479. memcpy(tmp_data, packetp->mDatap, size); /*Flawfinder: ignore*/
  480. }
  481. }
  482. status = packetp->mStatus;
  483. ttp->mDelayedPacketMap.erase(packet_id);
  484. delete packetp;
  485. }
  486. else
  487. {
  488. // No matching delayed packet, abort it.
  489. done = TRUE;
  490. }
  491. }
  492. }
  493. //static
  494. void LLTransferManager::processTransferAbort(LLMessageSystem *msgp, void **)
  495. {
  496. //llinfos << "LLTransferManager::processTransferPacket" << llendl;
  497. LLUUID transfer_id;
  498. LLTransferChannelType channel_type;
  499. msgp->getUUID("TransferInfo", "TransferID", transfer_id);
  500. msgp->getS32("TransferInfo", "ChannelType", (S32 &)channel_type);
  501. // See if it's a target that we're trying to abort
  502. // Find the transfer associated with this packet.
  503. LLTransferTargetChannel *ttcp = gTransferManager.getTargetChannel(msgp->getSender(), channel_type);
  504. if (ttcp)
  505. {
  506. LLTransferTarget *ttp = ttcp->findTransferTarget(transfer_id);
  507. if (ttp)
  508. {
  509. ttp->abortTransfer();
  510. ttcp->deleteTransfer(ttp);
  511. return;
  512. }
  513. }
  514. // Hmm, not a target.  Maybe it's a source.
  515. LLTransferSourceChannel *tscp = gTransferManager.getSourceChannel(msgp->getSender(), channel_type);
  516. if (tscp)
  517. {
  518. LLTransferSource *tsp = tscp->findTransferSource(transfer_id);
  519. if (tsp)
  520. {
  521. tsp->abortTransfer();
  522. tscp->deleteTransfer(tsp);
  523. return;
  524. }
  525. }
  526. llwarns << "Couldn't find transfer " << transfer_id << " to abort!" << llendl;
  527. }
  528. //static
  529. void LLTransferManager::reliablePacketCallback(void **user_data, S32 result)
  530. {
  531. LLUUID *transfer_idp = (LLUUID *)user_data;
  532. if (result)
  533. {
  534. llwarns << "Aborting reliable transfer " << *transfer_idp << " due to failed reliable resends!" << llendl;
  535. LLTransferSource *tsp = gTransferManager.findTransferSource(*transfer_idp);
  536. if (tsp)
  537. {
  538. LLTransferSourceChannel *tscp = tsp->mChannelp;
  539. tsp->abortTransfer();
  540. tscp->deleteTransfer(tsp);
  541. }
  542. }
  543. delete transfer_idp;
  544. }
  545. //
  546. // LLTransferConnection implementation
  547. //
  548. LLTransferConnection::LLTransferConnection(const LLHost &host)
  549. {
  550. mHost = host;
  551. }
  552. LLTransferConnection::~LLTransferConnection()
  553. {
  554. tsc_iter itersc;
  555. for (itersc = mTransferSourceChannels.begin(); itersc != mTransferSourceChannels.end(); itersc++)
  556. {
  557. delete *itersc;
  558. }
  559. mTransferSourceChannels.clear();
  560. ttc_iter itertc;
  561. for (itertc = mTransferTargetChannels.begin(); itertc != mTransferTargetChannels.end(); itertc++)
  562. {
  563. delete *itertc;
  564. }
  565. mTransferTargetChannels.clear();
  566. }
  567. void LLTransferConnection::updateTransfers()
  568. {
  569. // Do stuff for source transfers (basically, send data out).
  570. tsc_iter iter, cur;
  571. iter = mTransferSourceChannels.begin();
  572. while (iter !=mTransferSourceChannels.end())
  573. {
  574. cur = iter;
  575. iter++;
  576. (*cur)->updateTransfers();
  577. }
  578. // Do stuff for target transfers
  579. // Primarily, we should be aborting transfers that are irredeemably broken
  580. // (large packet gaps that don't appear to be getting filled in, most likely)
  581. // Probably should NOT be doing timeouts for other things, as new priority scheme
  582. // means that a high priority transfer COULD block a transfer for a long time.
  583. }
  584. LLTransferSourceChannel *LLTransferConnection::getSourceChannel(const LLTransferChannelType channel_type)
  585. {
  586. tsc_iter iter;
  587. for (iter = mTransferSourceChannels.begin(); iter != mTransferSourceChannels.end(); iter++)
  588. {
  589. if ((*iter)->getChannelType() == channel_type)
  590. {
  591. return *iter;
  592. }
  593. }
  594. LLTransferSourceChannel *tscp = new LLTransferSourceChannel(channel_type, mHost);
  595. mTransferSourceChannels.push_back(tscp);
  596. return tscp;
  597. }
  598. LLTransferTargetChannel *LLTransferConnection::getTargetChannel(const LLTransferChannelType channel_type)
  599. {
  600. ttc_iter iter;
  601. for (iter = mTransferTargetChannels.begin(); iter != mTransferTargetChannels.end(); iter++)
  602. {
  603. if ((*iter)->getChannelType() == channel_type)
  604. {
  605. return *iter;
  606. }
  607. }
  608. LLTransferTargetChannel *ttcp = new LLTransferTargetChannel(channel_type, mHost);
  609. mTransferTargetChannels.push_back(ttcp);
  610. return ttcp;
  611. }
  612. //
  613. // LLTransferSourceChannel implementation
  614. //
  615. const S32 DEFAULT_PACKET_SIZE = 1000;
  616. LLTransferSourceChannel::LLTransferSourceChannel(const LLTransferChannelType channel_type, const LLHost &host) :
  617. mChannelType(channel_type),
  618. mHost(host),
  619. mTransferSources(LLTransferSource::sSetPriority, LLTransferSource::sGetPriority),
  620. mThrottleID(TC_ASSET)
  621. {
  622. }
  623. LLTransferSourceChannel::~LLTransferSourceChannel()
  624. {
  625. LLPriQueueMap<LLTransferSource*>::pqm_iter iter =
  626. mTransferSources.mMap.begin();
  627. LLPriQueueMap<LLTransferSource*>::pqm_iter end =
  628. mTransferSources.mMap.end();
  629. for (; iter != end; ++iter)
  630. {
  631. // Just kill off all of the transfers
  632. (*iter).second->abortTransfer();
  633. delete iter->second;
  634. }
  635. mTransferSources.mMap.clear();
  636. }
  637. void LLTransferSourceChannel::updatePriority(LLTransferSource *tsp, const F32 priority)
  638. {
  639. mTransferSources.reprioritize(priority, tsp);
  640. }
  641. void LLTransferSourceChannel::updateTransfers()
  642. {
  643. // Actually, this should do the following:
  644. // Decide if we can actually send data.
  645. // If so, update priorities so we know who gets to send it.
  646. // Send data from the sources, while updating until we've sent our throttle allocation.
  647. LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(getHost());
  648. if (!cdp)
  649. {
  650. return;
  651. }
  652. if (cdp->isBlocked())
  653. {
  654. // *NOTE: We need to make sure that the throttle bits
  655. // available gets reset.
  656. // We DON'T want to send any packets if they're blocked, they'll just end up
  657. // piling up on the other end.
  658. //llwarns << "Blocking transfers due to blocked circuit for " << getHost() << llendl;
  659. return;
  660. }
  661. const S32 throttle_id = mThrottleID;
  662. LLThrottleGroup &tg = cdp->getThrottleGroup();
  663. if (tg.checkOverflow(throttle_id, 0.f))
  664. {
  665. return;
  666. }
  667. LLPriQueueMap<LLTransferSource *>::pqm_iter iter, next;
  668. BOOL done = FALSE;
  669. for (iter = mTransferSources.mMap.begin(); (iter != mTransferSources.mMap.end()) && !done;)
  670. {
  671. //llinfos << "LLTransferSourceChannel::updateTransfers()" << llendl;
  672. // Do stuff. 
  673. next = iter;
  674. next++;
  675. LLTransferSource *tsp = iter->second;
  676. U8 *datap = NULL;
  677. S32 data_size = 0;
  678. BOOL delete_data = FALSE;
  679. S32 packet_id = 0;
  680. S32 sent_bytes = 0;
  681. LLTSCode status = LLTS_OK;
  682. // Get the packetID for the next packet that we're transferring.
  683. packet_id = tsp->getNextPacketID();
  684. status = tsp->dataCallback(packet_id, DEFAULT_PACKET_SIZE, &datap, data_size, delete_data);
  685. if (status == LLTS_SKIP)
  686. {
  687. // We don't have any data, but we're not done, just go on.
  688. // This will presumably be used for streaming or async transfers that
  689. // are stalled waiting for data from another source.
  690. iter=next;
  691. continue;
  692. }
  693. LLUUID *cb_uuid = new LLUUID(tsp->getID());
  694. LLUUID transaction_id = tsp->getID();
  695. // Send the data now, even if it's an error.
  696. // The status code will tell the other end what to do.
  697. gMessageSystem->newMessage("TransferPacket");
  698. gMessageSystem->nextBlock("TransferData");
  699. gMessageSystem->addUUID("TransferID", tsp->getID());
  700. gMessageSystem->addS32("ChannelType", getChannelType());
  701. gMessageSystem->addS32("Packet", packet_id); // HACK!  Need to put in a REAL packet id
  702. gMessageSystem->addS32("Status", status);
  703. gMessageSystem->addBinaryData("Data", datap, data_size);
  704. sent_bytes = gMessageSystem->getCurrentSendTotal();
  705. gMessageSystem->sendReliable(getHost(), LL_DEFAULT_RELIABLE_RETRIES, TRUE, 0.f,
  706.  LLTransferManager::reliablePacketCallback, (void**)cb_uuid);
  707. // Do bookkeeping for the throttle
  708. done = tg.throttleOverflow(throttle_id, sent_bytes*8.f);
  709. gTransferManager.addTransferBitsOut(mChannelType, sent_bytes*8);
  710. // Clean up our temporary data.
  711. if (delete_data)
  712. {
  713. delete[] datap;
  714. datap = NULL;
  715. }
  716. if (findTransferSource(transaction_id) == NULL)
  717. {
  718. //Warning!  In the case of an aborted transfer, the sendReliable call above calls 
  719. //AbortTransfer which in turn calls deleteTransfer which means that somewhere way 
  720. //down the chain our current iter can get invalidated resulting in an infrequent
  721. //sim crash.  This check gets us to a valid transfer source in this event.
  722. iter=next;
  723. continue;
  724. }
  725. // Update the packet counter
  726. tsp->setLastPacketID(packet_id);
  727. switch (status)
  728. {
  729. case LLTS_OK:
  730. // We're OK, don't need to do anything.  Keep sending data.
  731. break;
  732. case LLTS_ERROR:
  733. llwarns << "Error in transfer dataCallback!" << llendl;
  734. // fall through
  735. case LLTS_DONE:
  736. // We need to clean up this transfer source.
  737. //llinfos << "LLTransferSourceChannel::updateTransfers() " << tsp->getID() << " done" << llendl;
  738. tsp->completionCallback(status);
  739. delete tsp;
  740. mTransferSources.mMap.erase(iter);
  741. iter = next;
  742. break;
  743. default:
  744. llerrs << "Unknown transfer error code!" << llendl;
  745. }
  746. // At this point, we should do priority adjustment (since some transfers like
  747. // streaming transfers will adjust priority based on how much they've sent and time,
  748. // but I'm not going to bother yet. - djs.
  749. }
  750. }
  751. void LLTransferSourceChannel::addTransferSource(LLTransferSource *sourcep)
  752. {
  753. sourcep->mChannelp = this;
  754. mTransferSources.push(sourcep->getPriority(), sourcep);
  755. }
  756. LLTransferSource *LLTransferSourceChannel::findTransferSource(const LLUUID &transfer_id)
  757. {
  758. LLPriQueueMap<LLTransferSource *>::pqm_iter iter;
  759. for (iter = mTransferSources.mMap.begin(); iter != mTransferSources.mMap.end(); iter++)
  760. {
  761. LLTransferSource *tsp = iter->second;
  762. if (tsp->getID() == transfer_id)
  763. {
  764. return tsp;
  765. }
  766. }
  767. return NULL;
  768. }
  769. BOOL LLTransferSourceChannel::deleteTransfer(LLTransferSource *tsp)
  770. {
  771. LLPriQueueMap<LLTransferSource *>::pqm_iter iter;
  772. for (iter = mTransferSources.mMap.begin(); iter != mTransferSources.mMap.end(); iter++)
  773. {
  774. if (iter->second == tsp)
  775. {
  776. delete tsp;
  777. mTransferSources.mMap.erase(iter);
  778. return TRUE;
  779. }
  780. }
  781. llerrs << "Unable to find transfer source to delete!" << llendl;
  782. return FALSE;
  783. }
  784. //
  785. // LLTransferTargetChannel implementation
  786. //
  787. LLTransferTargetChannel::LLTransferTargetChannel(const LLTransferChannelType channel_type, const LLHost &host) :
  788. mChannelType(channel_type),
  789. mHost(host)
  790. {
  791. }
  792. LLTransferTargetChannel::~LLTransferTargetChannel()
  793. {
  794. tt_iter iter;
  795. for (iter = mTransferTargets.begin(); iter != mTransferTargets.end(); iter++)
  796. {
  797. // Abort all of the current transfers
  798. (*iter)->abortTransfer();
  799. delete *iter;
  800. }
  801. mTransferTargets.clear();
  802. }
  803. void LLTransferTargetChannel::requestTransfer(
  804. const LLTransferSourceParams& source_params,
  805. const LLTransferTargetParams& target_params,
  806. const F32 priority)
  807. {
  808. LLUUID id;
  809. id.generate();
  810. LLTransferTarget* ttp = LLTransferTarget::createTarget(
  811. target_params.getType(),
  812. id,
  813. source_params.getType());
  814. if (!ttp)
  815. {
  816. llwarns << "LLTransferManager::requestTransfer aborting due to target creation failure!" << llendl;
  817. return;
  818. }
  819. ttp->applyParams(target_params);
  820. addTransferTarget(ttp);
  821. sendTransferRequest(ttp, source_params, priority);
  822. }
  823. void LLTransferTargetChannel::sendTransferRequest(LLTransferTarget *targetp,
  824.   const LLTransferSourceParams &params,
  825.   const F32 priority)
  826. {
  827. //
  828. // Pack the message with data which explains how to get the source, and
  829. // send it off to the source for this channel.
  830. //
  831. llassert(targetp);
  832. llassert(targetp->getChannel() == this);
  833. gMessageSystem->newMessage("TransferRequest");
  834. gMessageSystem->nextBlock("TransferInfo");
  835. gMessageSystem->addUUID("TransferID", targetp->getID());
  836. gMessageSystem->addS32("SourceType", params.getType());
  837. gMessageSystem->addS32("ChannelType", getChannelType());
  838. gMessageSystem->addF32("Priority", priority);
  839. U8 tmp[MAX_PARAMS_SIZE];
  840. LLDataPackerBinaryBuffer dp(tmp, MAX_PARAMS_SIZE);
  841. params.packParams(dp);
  842. S32 len = dp.getCurrentSize();
  843. gMessageSystem->addBinaryData("Params", tmp, len);
  844. gMessageSystem->sendReliable(mHost);
  845. }
  846. void LLTransferTargetChannel::addTransferTarget(LLTransferTarget *targetp)
  847. {
  848. targetp->mChannelp = this;
  849. mTransferTargets.push_back(targetp);
  850. }
  851. LLTransferTarget *LLTransferTargetChannel::findTransferTarget(const LLUUID &transfer_id)
  852. {
  853. tt_iter iter;
  854. for (iter = mTransferTargets.begin(); iter != mTransferTargets.end(); iter++)
  855. {
  856. LLTransferTarget *ttp = *iter;
  857. if (ttp->getID() == transfer_id)
  858. {
  859. return ttp;
  860. }
  861. }
  862. return NULL;
  863. }
  864. BOOL LLTransferTargetChannel::deleteTransfer(LLTransferTarget *ttp)
  865. {
  866. tt_iter iter;
  867. for (iter = mTransferTargets.begin(); iter != mTransferTargets.end(); iter++)
  868. {
  869. if (*iter == ttp)
  870. {
  871. delete ttp;
  872. mTransferTargets.erase(iter);
  873. return TRUE;
  874. }
  875. }
  876. llerrs << "Unable to find transfer target to delete!" << llendl;
  877. return FALSE;
  878. }
  879. //
  880. // LLTransferSource implementation
  881. //
  882. LLTransferSource::LLTransferSource(const LLTransferSourceType type,
  883.    const LLUUID &transfer_id,
  884.    const F32 priority) :
  885. mType(type),
  886. mID(transfer_id),
  887. mChannelp(NULL),
  888. mPriority(priority),
  889. mSize(0),
  890. mLastPacketID(-1)
  891. {
  892. setPriority(priority);
  893. }
  894. LLTransferSource::~LLTransferSource()
  895. {
  896. // No actual cleanup of the transfer is done here, this is purely for
  897. // memory cleanup.  The completionCallback is guaranteed to get called
  898. // before this happens.
  899. }
  900. void LLTransferSource::sendTransferStatus(LLTSCode status)
  901. {
  902. gMessageSystem->newMessage("TransferInfo");
  903. gMessageSystem->nextBlock("TransferInfo");
  904. gMessageSystem->addUUID("TransferID", getID());
  905. gMessageSystem->addS32("TargetType", LLTTT_UNKNOWN);
  906. gMessageSystem->addS32("ChannelType", mChannelp->getChannelType());
  907. gMessageSystem->addS32("Status", status);
  908. gMessageSystem->addS32("Size", mSize);
  909. U8 tmp[MAX_PARAMS_SIZE];
  910. LLDataPackerBinaryBuffer dp(tmp, MAX_PARAMS_SIZE);
  911. packParams(dp);
  912. S32 len = dp.getCurrentSize();
  913. gMessageSystem->addBinaryData("Params", tmp, len);
  914. gMessageSystem->sendReliable(mChannelp->getHost());
  915. // Abort if there was as asset system issue.
  916. if (status != LLTS_OK)
  917. {
  918. completionCallback(status);
  919. mChannelp->deleteTransfer(this);
  920. }
  921. }
  922. // This should never be called directly, the transfer manager is responsible for
  923. // aborting the transfer from the channel.  I might want to rethink this in the
  924. // future, though.
  925. void LLTransferSource::abortTransfer()
  926. {
  927. // Send a message down, call the completion callback
  928. llinfos << "LLTransferSource::Aborting transfer " << getID() << " to " << mChannelp->getHost() << llendl;
  929. gMessageSystem->newMessage("TransferAbort");
  930. gMessageSystem->nextBlock("TransferInfo");
  931. gMessageSystem->addUUID("TransferID", getID());
  932. gMessageSystem->addS32("ChannelType", mChannelp->getChannelType());
  933. gMessageSystem->sendReliable(mChannelp->getHost());
  934. completionCallback(LLTS_ABORT);
  935. }
  936. //static
  937. void LLTransferSource::registerSourceType(const LLTransferSourceType stype, LLTransferSourceCreateFunc func)
  938. {
  939. if (sSourceCreateMap.count(stype))
  940. {
  941. // Disallow changing what class handles a source type
  942. // Unclear when you would want to do this, and whether it would work.
  943. llerrs << "Reregistering source type " << stype << llendl;
  944. }
  945. else
  946. {
  947. sSourceCreateMap[stype] = func;
  948. }
  949. }
  950. //static
  951. LLTransferSource *LLTransferSource::createSource(const LLTransferSourceType stype,
  952.  const LLUUID &id,
  953.  const F32 priority)
  954. {
  955. switch (stype)
  956. {
  957. // *NOTE: The source file transfer mechanism is highly insecure and could
  958. // lead to easy exploitation of a server process.
  959. // I have removed all uses of it from the codebase. Phoenix.
  960. // 
  961. //case LLTST_FILE:
  962. // return new LLTransferSourceFile(id, priority);
  963. case LLTST_ASSET:
  964. return new LLTransferSourceAsset(id, priority);
  965. default:
  966. {
  967. if (!sSourceCreateMap.count(stype))
  968. {
  969. // Use the callback to create the source type if it's not there.
  970. llwarns << "Unknown transfer source type: " << stype << llendl;
  971. return NULL;
  972. }
  973. return (sSourceCreateMap[stype])(id, priority);
  974. }
  975. }
  976. }
  977. // static
  978. void LLTransferSource::sSetPriority(LLTransferSource *&tsp, const F32 priority)
  979. {
  980. tsp->setPriority(priority);
  981. }
  982. // static
  983. F32 LLTransferSource::sGetPriority(LLTransferSource *&tsp)
  984. {
  985. return tsp->getPriority();
  986. }
  987. //
  988. // LLTransferPacket implementation
  989. //
  990. LLTransferPacket::LLTransferPacket(const S32 packet_id, const LLTSCode status, const U8 *datap, const S32 size) :
  991. mPacketID(packet_id),
  992. mStatus(status),
  993. mDatap(NULL),
  994. mSize(size)
  995. {
  996. if (size == 0)
  997. {
  998. return;
  999. }
  1000. mDatap = new U8[size];
  1001. if (mDatap != NULL)
  1002. {
  1003. memcpy(mDatap, datap, size); /*Flawfinder: ignore*/
  1004. }
  1005. }
  1006. LLTransferPacket::~LLTransferPacket()
  1007. {
  1008. delete[] mDatap;
  1009. }
  1010. //
  1011. // LLTransferTarget implementation
  1012. //
  1013. LLTransferTarget::LLTransferTarget(
  1014. LLTransferTargetType type,
  1015. const LLUUID& transfer_id,
  1016. LLTransferSourceType source_type) : 
  1017. mType(type),
  1018. mSourceType(source_type),
  1019. mID(transfer_id),
  1020. mChannelp(NULL),
  1021. mGotInfo(FALSE),
  1022. mSize(0),
  1023. mLastPacketID(-1)
  1024. {
  1025. }
  1026. LLTransferTarget::~LLTransferTarget()
  1027. {
  1028. // No actual cleanup of the transfer is done here, this is purely for
  1029. // memory cleanup.  The completionCallback is guaranteed to get called
  1030. // before this happens.
  1031. tpm_iter iter;
  1032. for (iter = mDelayedPacketMap.begin(); iter != mDelayedPacketMap.end(); iter++)
  1033. {
  1034. delete iter->second;
  1035. }
  1036. mDelayedPacketMap.clear();
  1037. }
  1038. // This should never be called directly, the transfer manager is responsible for
  1039. // aborting the transfer from the channel.  I might want to rethink this in the
  1040. // future, though.
  1041. void LLTransferTarget::abortTransfer()
  1042. {
  1043. // Send a message up, call the completion callback
  1044. llinfos << "LLTransferTarget::Aborting transfer " << getID() << " from " << mChannelp->getHost() << llendl;
  1045. gMessageSystem->newMessage("TransferAbort");
  1046. gMessageSystem->nextBlock("TransferInfo");
  1047. gMessageSystem->addUUID("TransferID", getID());
  1048. gMessageSystem->addS32("ChannelType", mChannelp->getChannelType());
  1049. gMessageSystem->sendReliable(mChannelp->getHost());
  1050. completionCallback(LLTS_ABORT);
  1051. }
  1052. bool LLTransferTarget::addDelayedPacket(
  1053. const S32 packet_id,
  1054. const LLTSCode status,
  1055. U8* datap,
  1056. const S32 size)
  1057. {
  1058. const transfer_packet_map::size_type LL_MAX_DELAYED_PACKETS = 100;
  1059. if(mDelayedPacketMap.size() > LL_MAX_DELAYED_PACKETS)
  1060. {
  1061. // too many delayed packets
  1062. return false;
  1063. }
  1064. LLTransferPacket* tpp = new LLTransferPacket(
  1065. packet_id,
  1066. status,
  1067. datap,
  1068. size);
  1069. #ifdef _DEBUG
  1070. if (mDelayedPacketMap.find(packet_id) != mDelayedPacketMap.end())
  1071. {
  1072. llerrs << "Packet ALREADY in delayed packet map!" << llendl;
  1073. }
  1074. #endif
  1075. mDelayedPacketMap[packet_id] = tpp;
  1076. return true;
  1077. }
  1078. LLTransferTarget* LLTransferTarget::createTarget(
  1079. LLTransferTargetType type,
  1080. const LLUUID& id,
  1081. LLTransferSourceType source_type)
  1082. {
  1083. switch (type)
  1084. {
  1085. case LLTTT_FILE:
  1086. return new LLTransferTargetFile(id, source_type);
  1087. case LLTTT_VFILE:
  1088. return new LLTransferTargetVFile(id, source_type);
  1089. default:
  1090. llwarns << "Unknown transfer target type: " << type << llendl;
  1091. return NULL;
  1092. }
  1093. }
  1094. LLTransferSourceParamsInvItem::LLTransferSourceParamsInvItem() : LLTransferSourceParams(LLTST_SIM_INV_ITEM), mAssetType(LLAssetType::AT_NONE)
  1095. {
  1096. }
  1097. void LLTransferSourceParamsInvItem::setAgentSession(const LLUUID &agent_id, const LLUUID &session_id)
  1098. {
  1099. mAgentID = agent_id;
  1100. mSessionID = session_id;
  1101. }
  1102. void LLTransferSourceParamsInvItem::setInvItem(const LLUUID &owner_id, const LLUUID &task_id, const LLUUID &item_id)
  1103. {
  1104. mOwnerID = owner_id;
  1105. mTaskID = task_id;
  1106. mItemID = item_id;
  1107. }
  1108. void LLTransferSourceParamsInvItem::setAsset(const LLUUID &asset_id, const LLAssetType::EType asset_type)
  1109. {
  1110. mAssetID = asset_id;
  1111. mAssetType = asset_type;
  1112. }
  1113. void LLTransferSourceParamsInvItem::packParams(LLDataPacker &dp) const
  1114. {
  1115. lldebugs << "LLTransferSourceParamsInvItem::packParams()" << llendl;
  1116. dp.packUUID(mAgentID, "AgentID");
  1117. dp.packUUID(mSessionID, "SessionID");
  1118. dp.packUUID(mOwnerID, "OwnerID");
  1119. dp.packUUID(mTaskID, "TaskID");
  1120. dp.packUUID(mItemID, "ItemID");
  1121. dp.packUUID(mAssetID, "AssetID");
  1122. dp.packS32(mAssetType, "AssetType");
  1123. }
  1124. BOOL LLTransferSourceParamsInvItem::unpackParams(LLDataPacker &dp)
  1125. {
  1126. S32 tmp_at;
  1127. dp.unpackUUID(mAgentID, "AgentID");
  1128. dp.unpackUUID(mSessionID, "SessionID");
  1129. dp.unpackUUID(mOwnerID, "OwnerID");
  1130. dp.unpackUUID(mTaskID, "TaskID");
  1131. dp.unpackUUID(mItemID, "ItemID");
  1132. dp.unpackUUID(mAssetID, "AssetID");
  1133. dp.unpackS32(tmp_at, "AssetType");
  1134. mAssetType = (LLAssetType::EType)tmp_at;
  1135. return TRUE;
  1136. }
  1137. LLTransferSourceParamsEstate::LLTransferSourceParamsEstate() :
  1138. LLTransferSourceParams(LLTST_SIM_ESTATE),
  1139. mEstateAssetType(ET_NONE),
  1140. mAssetType(LLAssetType::AT_NONE)
  1141. {
  1142. }
  1143. void LLTransferSourceParamsEstate::setAgentSession(const LLUUID &agent_id, const LLUUID &session_id)
  1144. {
  1145. mAgentID = agent_id;
  1146. mSessionID = session_id;
  1147. }
  1148. void LLTransferSourceParamsEstate::setEstateAssetType(const EstateAssetType etype)
  1149. {
  1150. mEstateAssetType = etype;
  1151. }
  1152. void LLTransferSourceParamsEstate::setAsset(const LLUUID &asset_id, const LLAssetType::EType asset_type)
  1153. {
  1154. mAssetID = asset_id;
  1155. mAssetType = asset_type;
  1156. }
  1157. void LLTransferSourceParamsEstate::packParams(LLDataPacker &dp) const
  1158. {
  1159. dp.packUUID(mAgentID, "AgentID");
  1160. // *NOTE: We do not want to pass the session id from the server to
  1161. // the client, but I am not sure if anyone expects this value to
  1162. // be set on the client.
  1163. dp.packUUID(mSessionID, "SessionID");
  1164. dp.packS32(mEstateAssetType, "EstateAssetType");
  1165. }
  1166. BOOL LLTransferSourceParamsEstate::unpackParams(LLDataPacker &dp)
  1167. {
  1168. S32 tmp_et;
  1169. dp.unpackUUID(mAgentID, "AgentID");
  1170. dp.unpackUUID(mSessionID, "SessionID");
  1171. dp.unpackS32(tmp_et, "EstateAssetType");
  1172. mEstateAssetType = (EstateAssetType)tmp_et;
  1173. return TRUE;
  1174. }