@@ -208,7 +208,7 @@ namespace pcpp
208208 {
209209 if (m_LastExtension->getExtensionType () == IPv6Extension::IPv6Fragmentation)
210210 {
211- m_NextLayer = new PayloadLayer (payload, payloadLen, this , getAttachedPacket () );
211+ constructNextLayer< PayloadLayer> (payload, payloadLen);
212212 return ;
213213 }
214214
@@ -222,66 +222,94 @@ namespace pcpp
222222 switch (nextHdr)
223223 {
224224 case PACKETPP_IPPROTO_UDP:
225- m_NextLayer = UdpLayer::isDataValid (payload, payloadLen)
226- ? static_cast <Layer*>(new UdpLayer (payload, payloadLen, this , getAttachedPacket ()))
227- : static_cast <Layer*>(new PayloadLayer (payload, payloadLen, this , getAttachedPacket ()));
225+ {
226+ tryConstructNextLayerWithFallback<UdpLayer, PayloadLayer>(payload, payloadLen);
228227 break ;
228+ }
229229 case PACKETPP_IPPROTO_TCP:
230- m_NextLayer = TcpLayer::isDataValid (payload, payloadLen)
231- ? static_cast <Layer*>(new TcpLayer (payload, payloadLen, this , getAttachedPacket ()))
232- : static_cast <Layer*>(new PayloadLayer (payload, payloadLen, this , getAttachedPacket ()));
230+ {
231+ tryConstructNextLayerWithFallback<TcpLayer, PayloadLayer>(payload, payloadLen);
233232 break ;
233+ }
234234 case PACKETPP_IPPROTO_IPIP:
235235 {
236236 uint8_t ipVersion = *payload >> 4 ;
237- if (ipVersion == 4 && IPv4Layer::isDataValid (payload, payloadLen))
238- m_NextLayer = new IPv4Layer (payload, payloadLen, this , getAttachedPacket ());
239- else if (ipVersion == 6 && IPv6Layer::isDataValid (payload, payloadLen))
240- m_NextLayer = new IPv6Layer (payload, payloadLen, this , getAttachedPacket ());
241- else
242- m_NextLayer = new PayloadLayer (payload, payloadLen, this , getAttachedPacket ());
237+ switch (ipVersion)
238+ {
239+ case 4 :
240+ {
241+ tryConstructNextLayerWithFallback<IPv4Layer, PayloadLayer>(payload, payloadLen);
242+ break ;
243+ }
244+ case 6 :
245+ {
246+ tryConstructNextLayerWithFallback<IPv6Layer, PayloadLayer>(payload, payloadLen);
247+ break ;
248+ }
249+ default :
250+ {
251+ constructNextLayer<PayloadLayer>(payload, payloadLen);
252+ break ;
253+ }
254+ }
243255 break ;
244256 }
245257 case PACKETPP_IPPROTO_GRE:
246258 {
247259 ProtocolType greVer = GreLayer::getGREVersion (payload, payloadLen);
248- if (greVer == GREv0 && GREv0Layer::isDataValid (payload, payloadLen))
249- m_NextLayer = new GREv0Layer (payload, payloadLen, this , getAttachedPacket ());
250- else if (greVer == GREv1 && GREv1Layer::isDataValid (payload, payloadLen))
251- m_NextLayer = new GREv1Layer (payload, payloadLen, this , getAttachedPacket ());
252- else
253- m_NextLayer = new PayloadLayer (payload, payloadLen, this , getAttachedPacket ());
260+
261+ switch (greVer)
262+ {
263+ case GREv0:
264+ {
265+ tryConstructNextLayerWithFallback<GREv0Layer, PayloadLayer>(payload, payloadLen);
266+ break ;
267+ }
268+ case GREv1:
269+ {
270+ tryConstructNextLayerWithFallback<GREv1Layer, PayloadLayer>(payload, payloadLen);
271+ break ;
272+ }
273+ default :
274+ constructNextLayer<PayloadLayer>(payload, payloadLen);
275+ break ;
276+ }
254277 break ;
255278 }
256279 case PACKETPP_IPPROTO_AH:
257- m_NextLayer =
258- AuthenticationHeaderLayer::isDataValid (payload, payloadLen)
259- ? static_cast <Layer*>(new AuthenticationHeaderLayer (payload, payloadLen, this , getAttachedPacket ()))
260- : static_cast <Layer*>(new PayloadLayer (payload, payloadLen, this , getAttachedPacket ()));
280+ {
281+ tryConstructNextLayerWithFallback<AuthenticationHeaderLayer, PayloadLayer>(payload, payloadLen);
261282 break ;
283+ }
262284 case PACKETPP_IPPROTO_ESP:
263- m_NextLayer = ESPLayer::isDataValid (payload, payloadLen)
264- ? static_cast <Layer*>(new ESPLayer (payload, payloadLen, this , getAttachedPacket ()))
265- : static_cast <Layer*>(new PayloadLayer (payload, payloadLen, this , getAttachedPacket ()));
285+ {
286+ tryConstructNextLayerWithFallback<ESPLayer, PayloadLayer>(payload, payloadLen);
266287 break ;
288+ }
267289 case PACKETPP_IPPROTO_ICMPV6:
268290 {
269- m_NextLayer = IcmpV6Layer::parseIcmpV6Layer (payload, payloadLen, this , getAttachedPacket ());
291+ setNextLayer ( IcmpV6Layer::parseIcmpV6Layer (payload, payloadLen, this , getAttachedPacket () ));
270292 break ;
271293 }
272294 case PACKETPP_IPPROTO_VRRP:
273295 {
274296 auto vrrpVer = VrrpLayer::getVersionFromData (payload, payloadLen);
297+
275298 if (vrrpVer == VRRPv3)
276- m_NextLayer =
277- new VrrpV3Layer (payload, payloadLen, this , getAttachedPacket (), IPAddress::IPv6AddressType);
299+ {
300+ constructNextLayer<VrrpV3Layer>(payload, payloadLen, IPAddress::IPv6AddressType);
301+ }
278302 else
279- m_NextLayer = new PayloadLayer (payload, payloadLen, this , getAttachedPacket ());
303+ {
304+ constructNextLayer<PayloadLayer>(payload, payloadLen);
305+ }
280306 break ;
281307 }
282308 default :
283- m_NextLayer = new PayloadLayer (payload, payloadLen, this , getAttachedPacket ());
284- return ;
309+ {
310+ constructNextLayer<PayloadLayer>(payload, payloadLen);
311+ break ;
312+ }
285313 }
286314 }
287315
0 commit comments