Skip to content

Commit 5b7fc3b

Browse files
committed
Supporint <string> field dissect in commsdsl2wireshark.
1 parent af01ff4 commit 5b7fc3b

10 files changed

Lines changed: 367 additions & 50 deletions

app/commsdsl2wireshark/src/WiresharkBundleField.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,23 @@ std::string WiresharkBundleField::wiresharkDissectBodyImpl([[maybe_unused]] cons
9999
};
100100

101101
members.push_back(util::genProcessTemplate(MemTempl, memRepl));
102+
103+
auto memParseObj = f->wiresharkGenField().genParseObj();
104+
if (memParseObj.parseSemanticType() != commsdsl::parse::ParseField::ParseSemanticType::Length) {
105+
continue;
106+
}
107+
108+
static const std::string LimitTempl =
109+
"#^#LIMIT#$# = #^#VALUE_FUNC#$#(#^#FIELD#$#)\n"
110+
;
111+
112+
util::GenReplacementMap limitRepl = {
113+
{"LIMIT", wiresharkOffsetLimitStr()},
114+
{"VALUE_FUNC", Wireshark::wiresharkFieldValueFuncName(wiresharkGenerator)},
115+
{"FIELD", f->wiresharkFieldObjName()},
116+
};
117+
118+
members.push_back(util::genProcessTemplate(LimitTempl, limitRepl));
102119
}
103120

104121
static const std::string Templ =

app/commsdsl2wireshark/src/WiresharkField.cpp

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,44 @@ std::string WiresharkField::wiresharkDissectCodeImpl(const WiresharkField* refFi
703703
return util::genProcessTemplate(Templ, repl);
704704
}
705705

706+
std::string WiresharkField::wiresharkValidCheckCodeImpl(const WiresharkField* refField) const
707+
{
708+
static const std::string Templ =
709+
"local valid, print_warn = #^#VALID_FUNC#$#(#^#FIELD#$#)\n"
710+
"if not valid then\n"
711+
" #^#CODE#$#\n"
712+
"end\n"
713+
;
714+
715+
auto& wiresharkGenerator = WiresharkGenerator::wiresharkCast(m_genField.genGenerator());
716+
util::GenReplacementMap repl = {
717+
{"VALID_FUNC", wiresharkValidFuncName(refField)},
718+
{"SUBTREE", wiresharkFieldSubtreeStr()},
719+
{"FIELD", wiresharkFieldStr()},
720+
{"ERROR", Wireshark::wiresharkStatusCodeStr(wiresharkGenerator, Wireshark::WiresharkStatusCode::InvalidMsgData)},
721+
{"OFFSET", wiresharkOffsetStr()},
722+
};
723+
724+
if (m_genField.genParseObj().parseIsFailOnInvalid()) {
725+
static const std::string FailTempl =
726+
"#^#SUBTREE#$#:set_hidden(true)\n"
727+
"return #^#ERROR#$#, #^#OFFSET#$#\n"
728+
;
729+
730+
repl["CODE"] = util::genProcessTemplate(FailTempl, repl);
731+
}
732+
else {
733+
static const std::string FailTempl =
734+
"if print_warn then\n"
735+
" #^#SUBTREE#$#:add_expert_info(PI_PROTOCOL, PI_WARN, \"Invalid field value\")\n"
736+
"end"
737+
;
738+
repl["CODE"] = util::genProcessTemplate(FailTempl, repl);
739+
}
740+
741+
return util::genProcessTemplate(Templ, repl);
742+
}
743+
706744
std::string WiresharkField::wiresharkExtractorsRegCodeImpl(const WiresharkField* refField) const
707745
{
708746
static const std::string Templ =
@@ -1265,37 +1303,7 @@ std::string WiresharkField::wiresharkDissectValidCheckInternal(const WiresharkFi
12651303
return strings::genEmptyString();
12661304
}
12671305

1268-
static const std::string Templ =
1269-
"local valid, print_warn = #^#VALID_FUNC#$#(#^#FIELD#$#)\n"
1270-
"if not valid then\n"
1271-
" #^#CODE#$#\n"
1272-
"end\n"
1273-
;
1274-
1275-
util::GenReplacementMap repl = {
1276-
{"VALID_FUNC", wiresharkValidFuncName(refField)},
1277-
{"SUBTREE", wiresharkFieldSubtreeStr()},
1278-
{"FIELD", wiresharkFieldStr()}
1279-
};
1280-
1281-
if (m_genField.genParseObj().parseIsFailOnInvalid()) {
1282-
static const std::string FailTempl =
1283-
"#^#SUBTREE#$#:set_hidden(true)\n"
1284-
"return result, offset"
1285-
;
1286-
1287-
repl["CODE"] = util::genProcessTemplate(FailTempl, repl);
1288-
}
1289-
else {
1290-
static const std::string FailTempl =
1291-
"if print_warn then\n"
1292-
" #^#SUBTREE#$#:add_expert_info(PI_PROTOCOL, PI_WARN, \"Invalid field value\")\n"
1293-
"end"
1294-
;
1295-
repl["CODE"] = util::genProcessTemplate(FailTempl, repl);
1296-
}
1297-
1298-
return util::genProcessTemplate(Templ, repl);
1306+
return wiresharkValidCheckCodeImpl(refField);
12991307
}
13001308

13011309
std::string WiresharkField::wiresharkValidFuncCodeInternal(const WiresharkField* refField) const

app/commsdsl2wireshark/src/WiresharkField.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ class WiresharkField
9898
virtual std::string wiresharkDissectNameImpl(const WiresharkField* refField) const;
9999
virtual std::string wiresharkValidFuncNameImpl(const WiresharkField* refField) const;
100100
virtual std::string wiresharkDissectCodeImpl(const WiresharkField* refField) const;
101+
virtual std::string wiresharkValidCheckCodeImpl(const WiresharkField* refField) const;
101102
virtual std::string wiresharkExtractorsRegCodeImpl(const WiresharkField* refField) const;
102103
virtual std::string wiresharkFieldObjNameImpl(const WiresharkField* refField) const;
103104
virtual std::string wiresharkFieldRegistrationImpl(const WiresharkField* refField) const;

app/commsdsl2wireshark/src/WiresharkOptionalField.cpp

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@ bool WiresharkOptionalField::genPrepareImpl()
5252
return true;
5353
}
5454

55+
std::string WiresharkOptionalField::wiresharkExtractorsRegCodeImpl(const WiresharkField* refField) const
56+
{
57+
auto* memField = WiresharkField::wiresharkCast(genMemberField());
58+
if (memField == nullptr) {
59+
return WiresharkBase::wiresharkExtractorsRegCodeImpl(refField);
60+
}
61+
62+
return WiresharkBase::wiresharkExtractorsRegCodeImpl(refField) + memField->wiresharkExtractorsRegCode();
63+
}
64+
5565
std::string WiresharkOptionalField::wiresharkFieldRegistrationImpl(const WiresharkField* refField) const
5666
{
5767
static const std::string Templ =
@@ -74,22 +84,8 @@ std::string WiresharkOptionalField::wiresharkFieldRegistrationImpl(const Wiresha
7484

7585
std::string WiresharkOptionalField::wiresharkMembersDissectCodeImpl() const
7686
{
77-
std::string extDissect;
78-
auto* extField = genExternalField();
79-
if (extField != nullptr) {
80-
extDissect = WiresharkField::wiresharkCast(extField)->wiresharkDissectCode();
81-
}
82-
83-
auto* memField = genMemberField();
84-
if (memField == nullptr) {
85-
return extDissect;
86-
}
87-
88-
if (!extDissect.empty()) {
89-
extDissect.push_back('\n');
90-
}
91-
92-
return extDissect + WiresharkField::wiresharkCast(memField)->wiresharkDissectCode();
87+
assert(m_wiresharkField != nullptr);
88+
return m_wiresharkField->wiresharkDissectCode();
9389
}
9490

9591
std::string WiresharkOptionalField::wiresharkDissectBodyImpl([[maybe_unused]] const WiresharkField* refField) const

app/commsdsl2wireshark/src/WiresharkOptionalField.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class WiresharkOptionalField final : public commsdsl::gen::GenOptionalField, pub
3636

3737
protected:
3838
virtual bool genPrepareImpl() override;
39+
virtual std::string wiresharkExtractorsRegCodeImpl(const WiresharkField* refField) const override;
3940
virtual std::string wiresharkFieldRegistrationImpl(const WiresharkField* refField) const override;
4041
virtual std::string wiresharkMembersDissectCodeImpl() const override;
4142
virtual std::string wiresharkDissectBodyImpl(const WiresharkField* refField) const override;

app/commsdsl2wireshark/src/WiresharkRefField.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,14 @@ std::string WiresharkRefField::wiresharkDissectCodeImpl(const WiresharkField* re
110110
return m_wiresharkField->wiresharkDissectCode(refField);
111111
}
112112

113+
std::string WiresharkRefField::wiresharkValidCheckCodeImpl([[maybe_unused]] const WiresharkField* refField) const
114+
{
115+
assert(!m_alias);
116+
assert(!wiresharkMustCopyDissectInternal());
117+
assert((!genRefFieldParseObj().parseIsFailOnInvalid()) || (m_wiresharkField->wiresharkGenField().genParseObj().parseIsFailOnInvalid()));
118+
return strings::genEmptyString();
119+
}
120+
113121
std::string WiresharkRefField::wiresharkExtractorsRegCodeImpl(const WiresharkField* refField) const
114122
{
115123
if (m_alias) {

app/commsdsl2wireshark/src/WiresharkRefField.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class WiresharkRefField final : public commsdsl::gen::GenRefField, public Wiresh
4040
virtual std::string wiresharkDissectNameImpl(const WiresharkField* refField) const override;
4141
virtual std::string wiresharkValidFuncNameImpl(const WiresharkField* refField) const override;
4242
virtual std::string wiresharkDissectCodeImpl(const WiresharkField* refField) const override;
43+
virtual std::string wiresharkValidCheckCodeImpl(const WiresharkField* refField) const override;
4344
virtual std::string wiresharkExtractorsRegCodeImpl(const WiresharkField* refField) const override;
4445
virtual std::string wiresharkFieldObjNameImpl(const WiresharkField* refField) const override;
4546
virtual std::string wiresharkFieldRegistrationImpl(const WiresharkField* refField) const override;

0 commit comments

Comments
 (0)