ip: skip IP headers from fragments data

This commit is contained in:
Kaian 2021-05-10 11:55:27 +02:00
parent 90da49360c
commit e5f1053174

View File

@ -49,14 +49,12 @@ packet_ip_fragment_sort(const PacketIpFragment **a, const PacketIpFragment **b)
} }
static PacketIpFragment * static PacketIpFragment *
packet_ip_fragment_new(Packet *packet, GBytes *data) packet_ip_fragment_new(Packet *packet)
{ {
// Reserve memory for storing fragment information // Reserve memory for storing fragment information
PacketIpFragment *fragment = g_malloc0(sizeof(PacketIpFragment)); PacketIpFragment *fragment = g_malloc0(sizeof(PacketIpFragment));
// Store packet information // Store packet information
fragment->packet = packet_ref(packet); fragment->packet = packet_ref(packet);
// Set fragment payload for future reassembly
fragment->data = g_bytes_ref(data);
return fragment; return fragment;
} }
@ -69,6 +67,13 @@ packet_ip_fragment_free(PacketIpFragment *fragment)
g_free(fragment); g_free(fragment);
} }
static void
packet_ip_fragment_set_data(PacketIpFragment *fragment, GBytes *data)
{
// Set fragment payload for future reassembly
fragment->data = g_bytes_ref(data);
}
static PacketIpDatagram * static PacketIpDatagram *
packet_ip_datagram_new(const PacketIpFragment *fragment) packet_ip_datagram_new(const PacketIpFragment *fragment)
{ {
@ -160,7 +165,7 @@ packet_dissector_ip_dissect(PacketDissector *self, Packet *packet, GBytes *data)
#endif #endif
// Create an IP fragment for current data // Create an IP fragment for current data
PacketIpFragment *fragment = packet_ip_fragment_new(packet, data); PacketIpFragment *fragment = packet_ip_fragment_new(packet);
// Set IP version // Set IP version
fragment->version = ip4->ip_v; fragment->version = ip4->ip_v;
@ -227,6 +232,9 @@ packet_dissector_ip_dissect(PacketDissector *self, Packet *packet, GBytes *data)
// Get pending payload // Get pending payload
data = g_bytes_offset(data, fragment->hl); data = g_bytes_offset(data, fragment->hl);
// Set fragment data
packet_ip_fragment_set_data(fragment, data);
// If no fragmentation // If no fragmentation
if (fragment->frag == 0) { if (fragment->frag == 0) {
// Single fragment packet // Single fragment packet