From: Adrian Mamolea (admamole) Date: Thu, 18 Sep 2025 12:23:03 +0000 (+0000) Subject: Pull request #4900: codecs: fix encode for pppoe and ppp X-Git-Tag: 3.9.6.0~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e9c4d284f224b73cda55f053ac6159d1b9d402d;p=thirdparty%2Fsnort3.git Pull request #4900: codecs: fix encode for pppoe and ppp Merge in SNORT/snort3 from ~ADMAMOLE/snort3:pppoe to master Squashed commit of the following: commit 4ef9bddc76477afe8f05e6367991852ba6b4ba48 Author: Adrian Mamolea Date: Wed Sep 10 11:08:15 2025 -0400 codecs: fix encode for pppoe and ppp --- diff --git a/src/codecs/link/cd_ppp_encap.cc b/src/codecs/link/cd_ppp_encap.cc index daf7c5d66..00648a4eb 100644 --- a/src/codecs/link/cd_ppp_encap.cc +++ b/src/codecs/link/cd_ppp_encap.cc @@ -38,6 +38,7 @@ public: void get_protocol_ids(std::vector& v) override; bool decode(const RawData&, CodecData&, DecodeData&) override; + bool encode(const uint8_t* const raw_in, const uint16_t raw_len, EncState&, Buffer&, Flow*) override; }; static const uint16_t PPP_IP = 0x0021; /* Internet Protocol */ @@ -115,6 +116,20 @@ bool PppEncap::decode(const RawData& raw, CodecData& codec, DecodeData&) return true; } +bool PppEncap::encode(const uint8_t* const raw_in, const uint16_t raw_len, EncState& enc, + Buffer& buf, Flow*) +{ + if (!buf.allocate(raw_len)) + return false; + + memcpy(buf.data(), raw_in, raw_len); + + enc.next_ethertype = ProtocolId::ETHERTYPE_NOT_SET; + enc.next_proto = IpProtocol::PROTO_NOT_SET; + + return true; +} + //------------------------------------------------------------------------- // api //------------------------------------------------------------------------- diff --git a/src/codecs/link/cd_pppoe.cc b/src/codecs/link/cd_pppoe.cc index 192939d44..cc7c91ea2 100644 --- a/src/codecs/link/cd_pppoe.cc +++ b/src/codecs/link/cd_pppoe.cc @@ -120,15 +120,17 @@ bool PPPoECodec::decode(const RawData& raw, ******************************************************************/ bool PPPoECodec::encode(const uint8_t* const raw_in, const uint16_t raw_len, - EncState&, Buffer& buf, Flow*) + EncState& enc, Buffer& buf, Flow*) { if (!buf.allocate(raw_len)) return false; memcpy(buf.data(), raw_in, raw_len); PPPoEHdr* const ppph = reinterpret_cast(buf.data()); - ppph->length = htons((uint16_t)buf.size()); + ppph->length = htons((uint16_t)buf.size() - raw_len); + enc.next_ethertype = ProtocolId::ETHERTYPE_NOT_SET; + enc.next_proto = IpProtocol::PROTO_NOT_SET; return true; }