FediChordProtocol DEFINITIONS AUTOMATIC TAGS ::= BEGIN NodeID ::= INTEGER (0..115792089237316195423570985008687907853269984665640564039457584007913129639935) Domain ::= VisibleString Request ::= SEQUENCE { requestID INTEGER, senderID NodeID, parts INTEGER, -- number of message parts part INTEGER, -- part number of this message action ENUMERATED {queryID, join, leave, stabilise, ping}, actionPayload CHOICE { queryIDSendPayload QueryIDSendPayload, joinSendPayload JoinSendPayload, leaveSendPayload LeaveSendPayload, stabiliseSendPayload StabiliseSendPayload } } Response ::= SEQUENCE { responseTo INTEGER, senderID NodeID, parts INTEGER, part INTEGER, action ENUMERATED {queryID, join, leave, stabilise, ping}, actionPayload CHOICE { queryIDReceivePayload QueryIDReceivePayload, joinReceivePayload JoinReceivePayload, leaveReceivePayload LeaveReceivePayload, stabiliseReceivePayload StabiliseReceivePayload } } NodeState ::= SEQUENCE { nid NodeID, domain Domain, ipAddr OCTET STRING (SIZE(16)), dhtPort INTEGER, apPort INTEGER, vServer INTEGER } CacheEntry ::= SEQUENCE { node NodeState, -- use unix time stamp, as DATE-TIME isn't supported by the Haskell lib timestamp INTEGER } NodeCache ::= SEQUENCE OF CacheEntry JoinSendPayload ::= NodeState JoinReceivePayload ::= SEQUENCE { successors SEQUENCE OF NodeID, predecessors SEQUENCE OF NodeID, cache NodeCache } QueryIDSendPayload ::= SEQUENCE { targetID NodeID, lBestNodes INTEGER } QueryResult ::= ENUMERATED { found, forward } QueryIDReceivePayload ::= SEQUENCE { result QueryResult, nodeData NodeCache } StabiliseSendPayload ::= NodeState StabiliseReceivePayload ::= SEQUENCE { successors SEQUENCE OF NodeID, predecessors SEQUENCE OF NodeID -- ToDo: transfer of handled key data, if newly responsible for it } LeaveSendPayload ::= SEQUENCE { successors SEQUENCE OF NodeID, predecessors SEQUENCE OF NodeID -- ToDo: transfer of own data to newly responsible node } LeaveReceivePayload ::= NULL -- just a confirmation END