Skip to content

Commit 80ad34e

Browse files
committed
Supporting prefix <sync> layer in commsdsl2wireshark.
1 parent a7b331e commit 80ad34e

9 files changed

Lines changed: 102 additions & 6 deletions

File tree

app/commsdsl2comms/src/CommsSyncLayer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ CommsSyncLayer::CommsIncludesList CommsSyncLayer::commsDefIncludesImpl() const
6868
"comms/frame/SyncPrefixLayer.h"
6969
};
7070

71-
auto parseObj = genSyncLayerDslObj();
71+
auto parseObj = genSyncLayerParseObj();
7272

7373
if (parseObj.parseIsAfterPayload()) {
7474
result.push_back("comms/frame/SyncSuffixLayer.h");
@@ -104,7 +104,7 @@ std::string CommsSyncLayer::commsDefBaseTypeImpl(const std::string& prevName) co
104104
" #^#OPTS#$#\n"
105105
">";
106106

107-
auto parseObj = genSyncLayerDslObj();
107+
auto parseObj = genSyncLayerParseObj();
108108
std::string type = "Prefix";
109109
if (parseObj.parseIsAfterPayload()) {
110110
type = "Suffix";

app/commsdsl2comms/test/test36/Schema.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<int name="F2" type="uint8" />
1919
</optional>
2020
</message>
21+
2122
<frame name="Frame">
2223
<id name="ID" field="MsgId" />
2324
<payload name="Data" />

app/commsdsl2wireshark/src/WiresharkLayer.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,9 @@ std::string WiresharkLayer::wiresharkDissectFieldCode() const
160160

161161
static const std::string Templ =
162162
"#^#RESULT#$#, #^#NEXT_OFFSET#$# = #^#NAME#$#(#^#TVB#$#, #^#TREE#$#, #^#OFFSET#$#, #^#LIMIT#$#)\n"
163+
"if #^#RESULT#$# == #^#INVALID_MSG_DATA#$# then\n"
164+
" return #^#MALFORMED#$#, #^#NEXT_OFFSET#$#\n"
165+
"end\n"
163166
"if #^#RESULT#$# ~= #^#SUCCESS#$# then\n"
164167
" return #^#RESULT#$#, #^#NEXT_OFFSET#$#\n"
165168
"end\n"
@@ -169,6 +172,8 @@ std::string WiresharkLayer::wiresharkDissectFieldCode() const
169172
util::GenReplacementMap repl = {
170173
{"NAME", field->wiresharkDissectName()},
171174
{"SUCCESS", Wireshark::wiresharkStatusCodeStr(wiresharkGenerator, Wireshark::WiresharkStatusCode::Success)},
175+
{"INVALID_MSG_DATA", Wireshark::wiresharkStatusCodeStr(wiresharkGenerator, Wireshark::WiresharkStatusCode::InvalidMsgData)},
176+
{"MALFORMED", Wireshark::wiresharkStatusCodeStr(wiresharkGenerator, Wireshark::WiresharkStatusCode::MalformedPacket)},
172177
{"RESULT", WiresharkField::wiresharkResultStr()},
173178
{"NEXT_OFFSET", WiresharkField::wiresharkNextOffsetStr()},
174179
{"TVB", WiresharkField::wiresharkTvbStr()},

app/commsdsl2wireshark/src/WiresharkSetField.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,10 @@ std::string WiresharkSetField::wiresharkValueAccessStrImpl(const std::string& ac
238238
return WiresharkBase::wiresharkValueAccessStrImpl(std::string(), refField);
239239
}
240240

241+
if ((refField != nullptr) && (!refField->wiresharkIsBitfieldMember())) {
242+
refField = nullptr;
243+
}
244+
241245
static const std::string Templ =
242246
"#^#VALUE_FUNC#$#(#^#NAME#$#)"
243247
;

app/commsdsl2wireshark/src/WiresharkSyncLayer.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,17 @@
1515

1616
#include "WiresharkSyncLayer.h"
1717

18+
#include "WiresharkField.h"
1819
#include "WiresharkGenerator.h"
1920

21+
#include "commsdsl/gen/strings.h"
22+
#include "commsdsl/gen/util.h"
23+
24+
#include <cassert>
25+
26+
namespace strings = commsdsl::gen::strings;
27+
namespace util = commsdsl::gen::util;
28+
2029
namespace commsdsl2wireshark
2130
{
2231

@@ -26,4 +35,44 @@ WiresharkSyncLayer::WiresharkSyncLayer(WiresharkGenerator& generator, ParseLayer
2635
{
2736
}
2837

38+
std::string WiresharkSyncLayer::wiresharkDissectBodyImpl() const
39+
{
40+
auto parseObj = genSyncLayerParseObj();
41+
if (parseObj.parseIsAfterPayload()) {
42+
return wiresharkSuffixDissectCodeInternal();
43+
}
44+
45+
static const std::string Templ =
46+
"#^#FIELD#$#\n"
47+
"#^#OFFSET#$# = #^#NEXT_OFFSET#$#\n"
48+
"#^#NEXT#$#\n"
49+
;
50+
51+
util::GenReplacementMap repl = {
52+
{"FIELD", wiresharkDissectFieldCodeInternal()},
53+
{"NEXT", wiresharkNextFuncCode()},
54+
{"OFFSET", WiresharkField::wiresharkOffsetStr()},
55+
{"NEXT_OFFSET", WiresharkField::wiresharkNextOffsetStr()},
56+
};
57+
58+
return util::genProcessTemplate(Templ, repl);
59+
}
60+
61+
std::string WiresharkSyncLayer::wiresharkSuffixDissectCodeInternal() const
62+
{
63+
// TODO
64+
return "-- TODO: implement sync suffix";
65+
}
66+
67+
std::string WiresharkSyncLayer::wiresharkDissectFieldCodeInternal() const
68+
{
69+
auto parseObj = genSyncLayerParseObj();
70+
if (!parseObj.parseSeekField()) {
71+
return WiresharkLayer::wiresharkDissectFieldCode();
72+
}
73+
74+
// TODO
75+
return "-- TODO: implement seeked sync suffix";
76+
}
77+
2978
} // namespace commsdsl2wireshark

app/commsdsl2wireshark/src/WiresharkSyncLayer.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ class WiresharkSyncLayer final : public commsdsl::gen::GenSyncLayer, public Wire
3333
using GenElem = commsdsl::gen::GenElem;
3434

3535
WiresharkSyncLayer(WiresharkGenerator& generator, ParseLayer parseObj, GenElem* parent);
36+
37+
protected:
38+
virtual std::string wiresharkDissectBodyImpl() const override;
39+
40+
private:
41+
std::string wiresharkSuffixDissectCodeInternal() const;
42+
std::string wiresharkDissectFieldCodeInternal() const;
3643
};
3744

3845
} // namespace commsdsl2wireshark
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import sys
2+
3+
from commsdsl_pcap_gen import *
4+
5+
def do_frame(id, payload):
6+
prefix = struct.pack('>B', id)
7+
return prefix + payload
8+
9+
def pcap1(f):
10+
seq = 1000
11+
msg1_payload = struct.pack('>B', 0)
12+
msg1 = do_frame(1, msg1_payload)
13+
header = commsdsl_create_ethernet_ip_tcp_headers(len(msg1), seq)
14+
commsdsl_write_packet(f, header + msg1, time.time())
15+
16+
def pcap2(f):
17+
seq = 2000
18+
msg1_payload = struct.pack('>BB', 3, 5)
19+
msg1 = do_frame(1, msg1_payload)
20+
header = commsdsl_create_ethernet_ip_tcp_headers(len(msg1), seq)
21+
commsdsl_write_packet(f, header + msg1, time.time())
22+
23+
def main():
24+
with open(sys.argv[1], 'wb') as f:
25+
commsdsl_write_pcap_header(f)
26+
pcap1(f)
27+
pcap2(f)
28+
29+
if __name__ == '__main__':
30+
main()

lib/include/commsdsl/gen/GenSyncLayer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ class COMMSDSL_API GenSyncLayer : public GenLayer
5151
virtual bool genPrepareImpl() override;
5252
virtual bool genForceCommsOrderImpl(GenLayersAccessList& layers, bool& success) const override final;
5353

54-
ParseSyncLayer genSyncLayerDslObj() const;
54+
ParseSyncLayer genSyncLayerParseObj() const;
5555

5656
private:
5757
std::unique_ptr<GenSyncLayerImpl> m_impl;

lib/src/gen/GenSyncLayer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class GenSyncLayerImpl
9595

9696
GenSyncLayer::GenSyncLayer(GenGenerator& generator, ParseLayer parseObj, GenElem* parent) :
9797
Base(generator, parseObj, parent),
98-
m_impl(std::make_unique<GenSyncLayerImpl>(generator, genSyncLayerDslObj(), this))
98+
m_impl(std::make_unique<GenSyncLayerImpl>(generator, genSyncLayerParseObj(), this))
9999
{
100100
assert(parseObj.parseKind() == ParseLayer::ParseKind::Sync);
101101
}
@@ -129,7 +129,7 @@ bool GenSyncLayer::genPrepareImpl()
129129

130130
bool GenSyncLayer::genForceCommsOrderImpl(GenLayersAccessList& layers, bool& success) const
131131
{
132-
auto parseObj = genSyncLayerDslObj();
132+
auto parseObj = genSyncLayerParseObj();
133133
if (!parseObj.parseIsAfterPayload()) {
134134
return Base::genForceCommsOrderImpl(layers, success);
135135
}
@@ -194,7 +194,7 @@ bool GenSyncLayer::genForceCommsOrderImpl(GenLayersAccessList& layers, bool& suc
194194
return genAdjustSuffixLayersOrder(layers, success);
195195
}
196196

197-
GenSyncLayer::ParseSyncLayer GenSyncLayer::genSyncLayerDslObj() const
197+
GenSyncLayer::ParseSyncLayer GenSyncLayer::genSyncLayerParseObj() const
198198
{
199199
return ParseSyncLayer(genParseObj());
200200
}

0 commit comments

Comments
 (0)