]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Pull request #4900: codecs: fix encode for pppoe and ppp
authorAdrian Mamolea (admamole) <admamole@cisco.com>
Thu, 18 Sep 2025 12:23:03 +0000 (12:23 +0000)
committerRayen Mohanty (ramohant) <ramohant@cisco.com>
Thu, 18 Sep 2025 12:23:03 +0000 (12:23 +0000)
Merge in SNORT/snort3 from ~ADMAMOLE/snort3:pppoe to master

Squashed commit of the following:

commit 4ef9bddc76477afe8f05e6367991852ba6b4ba48
Author: Adrian Mamolea <admamole@cisco.com>
Date:   Wed Sep 10 11:08:15 2025 -0400

    codecs: fix encode for pppoe and ppp

src/codecs/link/cd_ppp_encap.cc
src/codecs/link/cd_pppoe.cc

index daf7c5d66736f1a0c341be88cdaa1fe39eb139c0..00648a4eb289889274d9e7473e74415b682ca309 100644 (file)
@@ -38,6 +38,7 @@ public:
 
     void get_protocol_ids(std::vector<ProtocolId>& 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
 //-------------------------------------------------------------------------
index 192939d44c27b5ad1a22e28662b704f62fb52119..cc7c91ea23363bad3cf5497357d8b3be7a2071e2 100644 (file)
@@ -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<PPPoEHdr*>(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;
 }