net/packets.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef EQNET_PACKETS_H
00019 #define EQNET_PACKETS_H
00020
00021 #include <eq/net/commands.h>
00022 #include <eq/net/types.h>
00023
00024 #include <eq/base/idPool.h>
00025
00026 namespace eq
00027 {
00028 namespace net
00029 {
00030 enum
00031 {
00032 DATATYPE_EQNET_NODE,
00033 DATATYPE_EQNET_SESSION,
00034 DATATYPE_EQNET_OBJECT,
00035 DATATYPE_EQNET_CUSTOM = 1<<7
00036 };
00037
00041 struct Packet
00042 {
00043 Packet(){}
00044 uint64_t size;
00045 uint32_t datatype;
00046 uint32_t command;
00047
00048 #if 0
00049 union
00050 {
00051 Foo foo;
00052 uint64_t paddingPacket;
00053 };
00054 #endif
00055
00056 static size_t minSize;
00057 bool exceedsMinSize() const { return (size > minSize); }
00058 };
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 struct NodePacket: public Packet
00069 {
00070 NodePacket(){ datatype = DATATYPE_EQNET_NODE; }
00071 };
00072
00074 struct NodeStopPacket : public NodePacket
00075 {
00076 NodeStopPacket()
00077 {
00078 command = CMD_NODE_STOP;
00079 size = sizeof( NodeStopPacket );
00080 }
00081 };
00082
00083 struct NodeRegisterSessionPacket : public NodePacket
00084 {
00085 NodeRegisterSessionPacket()
00086 {
00087 command = CMD_NODE_REGISTER_SESSION;
00088 size = sizeof(NodeRegisterSessionPacket);
00089 }
00090
00091 uint32_t requestID;
00092 };
00093
00094 struct NodeRegisterSessionReplyPacket : public NodePacket
00095 {
00096 NodeRegisterSessionReplyPacket(const NodeRegisterSessionPacket* request)
00097 {
00098 command = CMD_NODE_REGISTER_SESSION_REPLY;
00099 size = sizeof( NodeRegisterSessionReplyPacket );
00100 requestID = request->requestID;
00101 }
00102
00103 uint32_t requestID;
00104 uint32_t sessionID;
00105 };
00106
00107 struct NodeMapSessionPacket : public NodePacket
00108 {
00109 NodeMapSessionPacket()
00110 {
00111 command = CMD_NODE_MAP_SESSION;
00112 size = sizeof(NodeMapSessionPacket);
00113 }
00114
00115 uint32_t requestID;
00116 uint32_t sessionID;
00117 };
00118
00119 struct NodeMapSessionReplyPacket : public NodePacket
00120 {
00121 NodeMapSessionReplyPacket( const NodeMapSessionPacket* requestPacket )
00122 {
00123 command = CMD_NODE_MAP_SESSION_REPLY;
00124 size = sizeof( NodeMapSessionReplyPacket );
00125 requestID = requestPacket->requestID;
00126 sessionID = requestPacket->sessionID;
00127 }
00128
00129 uint32_t requestID;
00130 uint32_t sessionID;
00131 };
00132
00133 struct NodeUnmapSessionPacket : public NodePacket
00134 {
00135 NodeUnmapSessionPacket()
00136 {
00137 command = CMD_NODE_UNMAP_SESSION;
00138 size = sizeof(NodeUnmapSessionPacket);
00139 sessionID = EQ_ID_INVALID;
00140 }
00141
00142 uint32_t requestID;
00143 uint32_t sessionID;
00144 };
00145
00146 struct NodeUnmapSessionReplyPacket : public NodePacket
00147 {
00148 NodeUnmapSessionReplyPacket( const NodeUnmapSessionPacket* request )
00149 {
00150 command = CMD_NODE_UNMAP_SESSION_REPLY;
00151 size = sizeof( NodeUnmapSessionReplyPacket );
00152 requestID = request->requestID;
00153 }
00154
00155 uint32_t requestID;
00156 bool result;
00157 };
00158
00159 struct NodeConnectPacket : public NodePacket
00160 {
00161 NodeConnectPacket()
00162 {
00163 command = CMD_NODE_CONNECT;
00164 size = sizeof( NodeConnectPacket );
00165 requestID = EQ_ID_INVALID;
00166 launchID = EQ_ID_INVALID;
00167 nodeData[0] = '\0';
00168 }
00169
00170 NodeID nodeID;
00171 uint32_t requestID;
00172 uint32_t type;
00173 uint32_t launchID;
00174 EQ_ALIGN8( char nodeData[8] );
00175 };
00176
00177 struct NodeConnectReplyPacket : public NodePacket
00178 {
00179 NodeConnectReplyPacket( const NodeConnectPacket* request )
00180 {
00181 command = CMD_NODE_CONNECT_REPLY;
00182 size = sizeof( NodeConnectReplyPacket );
00183 requestID = request->requestID;
00184 nodeData[0] = '\0';
00185 }
00186
00187 NodeID nodeID;
00188 uint32_t requestID;
00189 uint32_t type;
00190 EQ_ALIGN8( char nodeData[8] );
00191 };
00192
00193 struct NodeDisconnectPacket : public NodePacket
00194 {
00195 NodeDisconnectPacket()
00196 {
00197 command = CMD_NODE_DISCONNECT;
00198 size = sizeof( NodeDisconnectPacket );
00199 }
00200
00201 uint32_t requestID;
00202 };
00203
00204 struct NodeGetNodeDataPacket : public NodePacket
00205 {
00206 NodeGetNodeDataPacket()
00207 {
00208 command = CMD_NODE_GET_NODE_DATA;
00209 size = sizeof( NodeGetNodeDataPacket );
00210 }
00211
00212 NodeID nodeID;
00213 uint32_t requestID;
00214 };
00215
00216 struct NodeGetNodeDataReplyPacket : public NodePacket
00217 {
00218 NodeGetNodeDataReplyPacket(
00219 const NodeGetNodeDataPacket* request )
00220 {
00221 command = CMD_NODE_GET_NODE_DATA_REPLY;
00222 size = sizeof( NodeGetNodeDataReplyPacket );
00223 nodeID = request->nodeID;
00224 requestID = request->requestID;
00225 nodeData[0] = '\0';
00226 }
00227
00228 NodeID nodeID;
00229 uint32_t requestID;
00230 uint32_t type;
00231 EQ_ALIGN8( char nodeData[8] );
00232 };
00233
00234 struct NodeAcquireSendTokenPacket : public NodePacket
00235 {
00236 NodeAcquireSendTokenPacket()
00237 {
00238 command = CMD_NODE_ACQUIRE_SEND_TOKEN;
00239 size = sizeof( NodeAcquireSendTokenPacket );
00240 }
00241
00242 uint32_t requestID;
00243 };
00244
00245 struct NodeAcquireSendTokenReplyPacket : public NodePacket
00246 {
00247 NodeAcquireSendTokenReplyPacket(
00248 const NodeAcquireSendTokenPacket* request )
00249
00250 {
00251 command = CMD_NODE_ACQUIRE_SEND_TOKEN_REPLY;
00252 size = sizeof( NodeAcquireSendTokenReplyPacket );
00253 requestID = request->requestID;
00254 }
00255
00256 uint32_t requestID;
00257 };
00258
00259 struct NodeReleaseSendTokenPacket : public NodePacket
00260 {
00261 NodeReleaseSendTokenPacket()
00262 {
00263 command = CMD_NODE_RELEASE_SEND_TOKEN;
00264 size = sizeof( NodeReleaseSendTokenPacket );
00265 }
00266 };
00269
00270
00271
00272 struct SessionPacket : public NodePacket
00273 {
00274 SessionPacket() { datatype = DATATYPE_EQNET_SESSION; }
00275 uint32_t sessionID;
00276 uint32_t paddingSessionPacket;
00277 };
00278
00280 struct SessionAckRequestPacket : public SessionPacket
00281 {
00282 SessionAckRequestPacket( const uint32_t requestID_ )
00283 {
00284 command = CMD_SESSION_ACK_REQUEST;
00285 size = sizeof( SessionAckRequestPacket );
00286 requestID = requestID_;
00287 }
00288
00289 uint32_t requestID;
00290 };
00291
00292 struct SessionGenIDsPacket : public SessionPacket
00293 {
00294 SessionGenIDsPacket()
00295 {
00296 command = CMD_SESSION_GEN_IDS;
00297 size = sizeof( SessionGenIDsPacket );
00298 }
00299
00300 uint32_t requestID;
00301 uint32_t range;
00302 };
00303
00304 struct SessionGenIDsReplyPacket : public SessionPacket
00305 {
00306 SessionGenIDsReplyPacket( const SessionGenIDsPacket* request )
00307 {
00308 command = CMD_SESSION_GEN_IDS_REPLY;
00309 size = sizeof( SessionGenIDsReplyPacket );
00310 requestID = request->requestID;
00311 requested = request->range;
00312 }
00313
00314 uint32_t requestID;
00315 uint32_t id;
00316 uint32_t requested;
00317 uint32_t allocated;
00318 };
00319
00320 struct SessionSetIDMasterPacket : public SessionPacket
00321 {
00322 SessionSetIDMasterPacket()
00323 {
00324 command = CMD_SESSION_SET_ID_MASTER;
00325 size = sizeof( SessionSetIDMasterPacket );
00326 requestID = EQ_ID_INVALID;
00327 }
00328
00329 NodeID masterID;
00330 uint32_t id;
00331 uint32_t requestID;
00332 };
00333
00334 struct SessionGetIDMasterPacket : public SessionPacket
00335 {
00336 SessionGetIDMasterPacket()
00337 {
00338 command = CMD_SESSION_GET_ID_MASTER;
00339 size = sizeof( SessionGetIDMasterPacket );
00340 }
00341
00342 uint32_t requestID;
00343 uint32_t id;
00344 };
00345
00346 struct SessionGetIDMasterReplyPacket : public SessionPacket
00347 {
00348 SessionGetIDMasterReplyPacket( const SessionGetIDMasterPacket* request )
00349 {
00350 command = CMD_SESSION_GET_ID_MASTER_REPLY;
00351 size = sizeof( SessionGetIDMasterReplyPacket );
00352 requestID = request->requestID;
00353 id = request->id;
00354 }
00355
00356 NodeID masterID;
00357 uint32_t requestID;
00358 uint32_t id;
00359 };
00360
00361 struct SessionGetObjectPacket : public SessionPacket
00362 {
00363 SessionGetObjectPacket()
00364 {
00365 command = CMD_SESSION_GET_OBJECT;
00366 size = sizeof( SessionGetObjectPacket );
00367 }
00368
00369 uint32_t requestID;
00370 };
00371
00372 struct SessionAttachObjectPacket : public SessionPacket
00373 {
00374 SessionAttachObjectPacket()
00375 {
00376 command = CMD_SESSION_ATTACH_OBJECT;
00377 size = sizeof( SessionAttachObjectPacket );
00378 }
00379
00380 uint32_t requestID;
00381 uint32_t objectID;
00382 uint32_t objectInstanceID;
00383 };
00384
00385 struct SessionMapObjectPacket : public SessionPacket
00386 {
00387 SessionMapObjectPacket()
00388 {
00389 command = CMD_SESSION_MAP_OBJECT;
00390 size = sizeof( SessionMapObjectPacket );
00391 }
00392
00393 NodeID masterNodeID;
00394 uint32_t requestID;
00395 uint32_t objectID;
00396 uint32_t version;
00397 };
00398
00399 struct SessionSubscribeObjectPacket : public SessionPacket
00400 {
00401 SessionSubscribeObjectPacket( const SessionMapObjectPacket* mapPacket )
00402 {
00403 command = CMD_SESSION_SUBSCRIBE_OBJECT;
00404 size = sizeof( SessionSubscribeObjectPacket );
00405 requestID = mapPacket->requestID;
00406 version = mapPacket->version;
00407 objectID = mapPacket->objectID;
00408 }
00409
00410 uint32_t requestID;
00411 uint32_t objectID;
00412 uint32_t version;
00413 uint32_t instanceID;
00414 };
00415
00416 struct SessionSubscribeObjectSuccessPacket : public SessionPacket
00417 {
00418 SessionSubscribeObjectSuccessPacket(
00419 const SessionSubscribeObjectPacket* request )
00420 {
00421 command = CMD_SESSION_SUBSCRIBE_OBJECT_SUCCESS;
00422 size = sizeof( SessionSubscribeObjectSuccessPacket );
00423 requestID = request->requestID;
00424 objectID = request->objectID;
00425 instanceID = request->instanceID;
00426 }
00427
00428 uint32_t requestID;
00429 uint32_t objectID;
00430 uint32_t instanceID;
00431 uint32_t changeType;
00432 uint32_t masterInstanceID;
00433 };
00434
00435 struct SessionSubscribeObjectReplyPacket : public SessionPacket
00436 {
00437 SessionSubscribeObjectReplyPacket(
00438 const SessionSubscribeObjectPacket* request )
00439 {
00440 command = CMD_SESSION_SUBSCRIBE_OBJECT_REPLY;
00441 size = sizeof( SessionSubscribeObjectReplyPacket );
00442 requestID = request->requestID;
00443 objectID = request->objectID;
00444 version = request->version;
00445 }
00446
00447 uint32_t requestID;
00448 uint32_t objectID;
00449 uint32_t version;
00450 bool result;
00451 };
00452
00453 struct SessionUnsubscribeObjectPacket : public SessionPacket
00454 {
00455 SessionUnsubscribeObjectPacket()
00456 {
00457 command = CMD_SESSION_UNSUBSCRIBE_OBJECT;
00458 size = sizeof( SessionUnsubscribeObjectPacket );
00459 }
00460
00461 uint32_t requestID;
00462 uint32_t objectID;
00463 uint32_t masterInstanceID;
00464 uint32_t slaveInstanceID;
00465 };
00466
00467 struct SessionDetachObjectPacket : public SessionPacket
00468 {
00469 SessionDetachObjectPacket()
00470 {
00471 command = CMD_SESSION_DETACH_OBJECT;
00472 size = sizeof( SessionDetachObjectPacket );
00473 requestID = EQ_ID_INVALID;
00474 }
00475
00476 SessionDetachObjectPacket(const SessionUnsubscribeObjectPacket* request)
00477 {
00478 command = CMD_SESSION_DETACH_OBJECT;
00479 size = sizeof( SessionDetachObjectPacket );
00480 requestID = request->requestID;
00481 objectID = request->objectID;
00482 objectInstanceID = request->slaveInstanceID;
00483 }
00484
00485 uint32_t requestID;
00486 uint32_t objectID;
00487 uint32_t objectInstanceID;
00488 };
00491
00492
00493
00494 struct ObjectPacket : public SessionPacket
00495 {
00496 ObjectPacket()
00497 {
00498 datatype = DATATYPE_EQNET_OBJECT;
00499 instanceID = EQ_ID_ANY;
00500 }
00501 uint32_t objectID;
00502 uint32_t instanceID;
00503 };
00504
00506 struct ObjectInstanceDataPacket : public ObjectPacket
00507 {
00508 ObjectInstanceDataPacket()
00509 {
00510 command = CMD_OBJECT_INSTANCE_DATA;
00511 size = sizeof( ObjectInstanceDataPacket );
00512 data[0] = '\0';
00513 }
00514
00515 uint64_t dataSize;
00516 uint32_t sequence;
00517 EQ_ALIGN8( uint8_t data[8] );
00518 };
00519
00520 struct ObjectInstancePacket : public ObjectPacket
00521 {
00522 ObjectInstancePacket()
00523 {
00524 command = CMD_OBJECT_INSTANCE;
00525 size = sizeof( ObjectInstancePacket );
00526 data[0] = '\0';
00527 }
00528
00529 uint64_t dataSize;
00530 uint32_t version;
00531 uint32_t sequence;
00532 EQ_ALIGN8( uint8_t data[8] );
00533 };
00534
00535 struct ObjectCommitPacket : public ObjectPacket
00536 {
00537 ObjectCommitPacket()
00538 {
00539 command = CMD_OBJECT_COMMIT;
00540 size = sizeof( ObjectCommitPacket );
00541 }
00542
00543 uint32_t requestID;
00544 };
00545
00546 struct ObjectDeltaDataPacket : public ObjectPacket
00547 {
00548 ObjectDeltaDataPacket()
00549 {
00550 command = CMD_OBJECT_DELTA_DATA;
00551 size = sizeof( ObjectDeltaDataPacket );
00552 delta[0] = '\0';
00553 }
00554
00555 uint64_t deltaSize;
00556 EQ_ALIGN8( uint8_t delta[8] );
00557 };
00558
00559 struct ObjectDeltaPacket : public ObjectPacket
00560 {
00561 ObjectDeltaPacket()
00562 {
00563 command = CMD_OBJECT_DELTA;
00564 size = sizeof( ObjectDeltaPacket );
00565 delta[0] = '\0';
00566 }
00567
00568 uint64_t deltaSize;
00569 uint32_t version;
00570 EQ_ALIGN8( uint8_t delta[8] );
00571 };
00572
00573 struct ObjectNewMasterPacket : public ObjectPacket
00574 {
00575 ObjectNewMasterPacket()
00576 {
00577 command = CMD_OBJECT_NEW_MASTER;
00578 size = sizeof( ObjectNewMasterPacket );
00579 };
00580
00581 uint32_t newMasterID;
00582 uint32_t newMasterInstanceID;
00583 uint32_t changeType;
00584 };
00585
00586 struct ObjectVersionPacket : public ObjectPacket
00587 {
00588 ObjectVersionPacket()
00589 {
00590 command = CMD_OBJECT_VERSION;
00591 size = sizeof( ObjectVersionPacket );
00592 };
00593
00594 uint32_t version;
00595 };
00596
00597
00598
00599
00600 struct BarrierEnterPacket : public ObjectPacket
00601 {
00602 BarrierEnterPacket()
00603 {
00604 command = CMD_BARRIER_ENTER;
00605 size = sizeof( BarrierEnterPacket );
00606 }
00607 uint32_t version;
00608 };
00609
00610 struct BarrierEnterReplyPacket : public ObjectPacket
00611 {
00612 BarrierEnterReplyPacket()
00613 {
00614 command = CMD_BARRIER_ENTER_REPLY;
00615 size = sizeof( BarrierEnterReplyPacket );
00616 }
00617 };
00620
00621
00622
00623 inline std::ostream& operator << ( std::ostream& os,
00624 const Packet* packet )
00625 {
00626 os << "packet dt " << packet->datatype << " cmd "
00627 << packet->command;
00628 return os;
00629 }
00630 inline std::ostream& operator << ( std::ostream& os,
00631 const NodePacket* packet )
00632 {
00633 os << (Packet*)packet;
00634 return os;
00635 }
00636 inline std::ostream& operator << ( std::ostream& os,
00637 const NodeMapSessionPacket* packet )
00638 {
00639 os << (NodePacket*)packet << " req " << packet->requestID
00640 << " sessionID " << packet->sessionID;
00641 return os;
00642 }
00643 inline std::ostream& operator << ( std::ostream& os,
00644 const NodeMapSessionReplyPacket* packet )
00645 {
00646 os << (NodePacket*)packet << " req " << packet->requestID
00647 << " sessionID " << packet->sessionID;
00648 return os;
00649 }
00650 inline std::ostream& operator << ( std::ostream& os,
00651 const NodeConnectPacket* packet )
00652 {
00653 os << (NodePacket*)packet << " req " << packet->requestID << " type "
00654 << packet->type << " launchID " << packet->launchID << " data "
00655 << packet->nodeData;
00656 return os;
00657 }
00658 inline std::ostream& operator << ( std::ostream& os,
00659 const NodeConnectReplyPacket* packet )
00660 {
00661 os << (NodePacket*)packet << " req " << packet->requestID << " type "
00662 << packet->type << " data " << packet->nodeData;
00663 return os;
00664 }
00665 inline std::ostream& operator << ( std::ostream& os,
00666 const NodeGetNodeDataPacket* packet )
00667 {
00668 os << (NodePacket*)packet << " req " << packet->requestID << " nodeID "
00669 << packet->nodeID;
00670 return os;
00671 }
00672 inline std::ostream& operator << ( std::ostream& os,
00673 const NodeGetNodeDataReplyPacket* packet)
00674 {
00675 os << (NodePacket*)packet << " req " << packet->requestID << " type "
00676 << packet->type << " data " << packet->nodeData;
00677 return os;
00678 }
00679
00680
00681 inline std::ostream& operator << ( std::ostream& os,
00682 const SessionPacket* packet )
00683 {
00684 os << (NodePacket*)packet << " session id " << packet->sessionID;
00685 return os;
00686 }
00687
00688 inline std::ostream& operator << ( std::ostream& os,
00689 const SessionGenIDsReplyPacket* packet )
00690 {
00691 os << (SessionPacket*)packet << " id start " << packet->id;
00692 return os;
00693 }
00694 inline std::ostream& operator << ( std::ostream& os,
00695 const SessionGetIDMasterPacket* packet )
00696 {
00697 os << (SessionPacket*)packet << " id " << packet->id;
00698 return os;
00699 }
00700 inline std::ostream& operator << ( std::ostream& os,
00701 const SessionGetIDMasterReplyPacket* packet )
00702 {
00703 os << (SessionPacket*)packet << " ID " << packet->id << " master "
00704 << packet->masterID;
00705 return os;
00706 }
00707 inline std::ostream& operator << ( std::ostream& os,
00708 const SessionMapObjectPacket* packet )
00709 {
00710 os << (SessionPacket*)packet << " requestID " << packet->requestID;
00711 return os;
00712 }
00713
00714
00715 inline std::ostream& operator << ( std::ostream& os,
00716 const ObjectPacket* packet )
00717 {
00718 os << (SessionPacket*)packet << " objectID " << packet->objectID
00719 << "." << packet->instanceID;
00720 return os;
00721 }
00722
00723 inline std::ostream& operator << ( std::ostream& os,
00724 const ObjectInstanceDataPacket* packet )
00725 {
00726 os << (ObjectPacket*)packet << " size " << packet->dataSize;
00727 return os;
00728 }
00729
00730 inline std::ostream& operator << ( std::ostream& os,
00731 const ObjectInstancePacket* packet )
00732 {
00733 os << (ObjectPacket*)packet << " v" << packet->version
00734 << " size " << packet->dataSize;
00735 return os;
00736 }
00737
00738 inline std::ostream& operator << ( std::ostream& os,
00739 const ObjectDeltaDataPacket* packet )
00740 {
00741 os << (ObjectPacket*)packet << " size " << packet->deltaSize;
00742 return os;
00743 }
00744
00745 inline std::ostream& operator << ( std::ostream& os,
00746 const ObjectDeltaPacket* packet )
00747 {
00748 os << (ObjectPacket*)packet << " v" << packet->version
00749 << " size " << packet->deltaSize;
00750 return os;
00751 }
00752
00753 inline std::ostream& operator << ( std::ostream& os,
00754 const BarrierEnterPacket* packet )
00755 {
00756 os << (ObjectPacket*)packet << " v" << packet->version;
00757 return os;
00758 }
00759 }
00760 }
00761
00762 #endif // EQNET_PACKETS_H
00763