summaryrefslogtreecommitdiff
path: root/saprotocol.cc
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2015-12-14 22:07:50 +0100
committerJavier <dev.git@javispedro.com>2015-12-14 22:07:50 +0100
commit5abd8e0359cfa1dc2437427f2f0446d8801441cb (patch)
treec02602e849cf47928411b8f0b3e9e6eb34facdc9 /saprotocol.cc
parent702e018ca9e780bb076033ce5d1d370d4eb7319e (diff)
downloadsapd-5abd8e0359cfa1dc2437427f2f0446d8801441cb.tar.gz
sapd-5abd8e0359cfa1dc2437427f2f0446d8801441cb.zip
initial ack controlflow implementation
Diffstat (limited to 'saprotocol.cc')
-rw-r--r--saprotocol.cc56
1 files changed, 54 insertions, 2 deletions
diff --git a/saprotocol.cc b/saprotocol.cc
index 22b3111..94594a1 100644
--- a/saprotocol.cc
+++ b/saprotocol.cc
@@ -219,11 +219,11 @@ QByteArray SAProtocol::packFrame(const Frame &frame)
return data.prepend(reinterpret_cast<char*>(&header), 2);
}
-QByteArray SAProtocol::packFrame(quint16 sessionId, const QByteArray &data)
+QByteArray SAProtocol::packFrame(quint16 sessionId, const QByteArray &data, FrameType type)
{
Frame frame;
frame.protocolVersion = currentProtocolVersion;
- frame.type = FrameData;
+ frame.type = type;
frame.sessionId = sessionId;
frame.data = data;
return packFrame(frame);
@@ -253,6 +253,58 @@ QByteArray SAProtocol::packDataFrame(const DataFrame &frame)
return data;
}
+SAProtocol::ControlFrame SAProtocol::unpackControlFrame(const QByteArray &data)
+{
+ ControlFrame frame;
+ int offset = 0;
+ int num_ranges;
+
+ frame.type = static_cast<ControlFrameType>(read<quint8>(data, offset));
+
+ switch (frame.type) {
+ case ControlFrameImmediateAck:
+ case ControlFrameBlockAck:
+ frame.seqNum = read<quint16>(data, offset);
+ break;
+ case ControlFrameNak:
+ num_ranges = read<quint8>(data, offset);
+ frame.seqNums.reserve(num_ranges);
+ for (int i = 0; i < num_ranges; i++) {
+ SeqNumRange r;
+ r.first = read<quint8>(data, offset);
+ r.second = read<quint8>(data, offset);
+ frame.seqNums.append(r);
+ }
+ break;
+ default:
+ qWarning() << "Unknown frame type";
+ break;
+ }
+
+ return frame;
+}
+
+QByteArray SAProtocol::packControlFrame(const ControlFrame &frame)
+{
+ QByteArray data;
+ append<quint8>(data, frame.type);
+ switch (frame.type) {
+ case ControlFrameImmediateAck:
+ case ControlFrameBlockAck:
+ Q_ASSERT(frame.seqNums.empty());
+ append<quint16>(data, frame.seqNum);
+ break;
+ case ControlFrameNak:
+ append<quint8>(data, frame.seqNums.size());
+ foreach (const SeqNumRange &r, frame.seqNums) {
+ append<quint16>(data, r.first);
+ append<quint16>(data, r.second);
+ }
+ break;
+ }
+ return data;
+}
+
SAProtocol::ServiceConnectionRequestFrame SAProtocol::unpackServiceConnectionRequestFrame(const QByteArray &data)
{
ServiceConnectionRequestFrame frame;