mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
pcapparse: Add support for Linux Cooked Capture (SLL) frames
This commit is contained in:
parent
16ec12371a
commit
7ad651c3ff
2 changed files with 33 additions and 8 deletions
|
@ -319,6 +319,7 @@ gst_pcap_parse_read_uint32 (GstPcapParse * self, const guint8 * p)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ETH_HEADER_LEN 14
|
#define ETH_HEADER_LEN 14
|
||||||
|
#define SLL_HEADER_LEN 16
|
||||||
#define IP_HEADER_MIN_LEN 20
|
#define IP_HEADER_MIN_LEN 20
|
||||||
#define UDP_HEADER_LEN 8
|
#define UDP_HEADER_LEN 8
|
||||||
|
|
||||||
|
@ -341,14 +342,29 @@ gst_pcap_parse_scan_frame (GstPcapParse * self,
|
||||||
guint16 udp_dst_port;
|
guint16 udp_dst_port;
|
||||||
guint16 udp_len;
|
guint16 udp_len;
|
||||||
|
|
||||||
if (buf_size < ETH_HEADER_LEN + IP_HEADER_MIN_LEN + UDP_HEADER_LEN)
|
switch (self->linktype) {
|
||||||
return FALSE;
|
case DLT_ETHER:
|
||||||
|
if (buf_size < ETH_HEADER_LEN + IP_HEADER_MIN_LEN + UDP_HEADER_LEN)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
eth_type = GUINT16_FROM_BE (*((guint16 *) (buf + 12)));
|
eth_type = GUINT16_FROM_BE (*((guint16 *) (buf + 12)));
|
||||||
if (eth_type != 0x800)
|
if (eth_type != 0x800)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
buf_ip = buf + ETH_HEADER_LEN;
|
buf_ip = buf + ETH_HEADER_LEN;
|
||||||
|
break;
|
||||||
|
case DLT_SLL:
|
||||||
|
if (buf_size < SLL_HEADER_LEN + IP_HEADER_MIN_LEN + UDP_HEADER_LEN)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
eth_type = GUINT16_FROM_BE (*((guint16 *) (buf + 2)));
|
||||||
|
|
||||||
|
if (eth_type != 1)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
buf_ip = buf + SLL_HEADER_LEN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
b = *buf_ip;
|
b = *buf_ip;
|
||||||
if (((b >> 4) & 0x0f) != 4)
|
if (((b >> 4) & 0x0f) != 4)
|
||||||
|
@ -501,14 +517,16 @@ gst_pcap_parse_chain (GstPad * pad, GstBuffer * buffer)
|
||||||
|
|
||||||
linktype = gst_pcap_parse_read_uint32 (self, data + 20);
|
linktype = gst_pcap_parse_read_uint32 (self, data + 20);
|
||||||
|
|
||||||
if (linktype != 1) {
|
if (linktype != DLT_ETHER && linktype != DLT_SLL) {
|
||||||
GST_ELEMENT_ERROR (self, STREAM, WRONG_TYPE, (NULL),
|
GST_ELEMENT_ERROR (self, STREAM, WRONG_TYPE, (NULL),
|
||||||
("Only Ethernet packets of type 1 understood,"
|
("Only dumps of type Ethernet or Linux Coooked (SLL) understood,"
|
||||||
" type %d unknown", linktype));
|
" type %d unknown", linktype));
|
||||||
ret = GST_FLOW_ERROR;
|
ret = GST_FLOW_ERROR;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self->linktype = linktype;
|
||||||
|
|
||||||
gst_adapter_flush (self->adapter, 24);
|
gst_adapter_flush (self->adapter, 24);
|
||||||
self->initialized = TRUE;
|
self->initialized = TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,6 +45,12 @@ typedef enum
|
||||||
PCAP_PARSE_STATE_PARSING,
|
PCAP_PARSE_STATE_PARSING,
|
||||||
} GstPcapParseState;
|
} GstPcapParseState;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
DLT_ETHER = 1,
|
||||||
|
DLT_SLL = 113
|
||||||
|
} GstPcapParseLinktype;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GstPcapParse:
|
* GstPcapParse:
|
||||||
*
|
*
|
||||||
|
@ -72,6 +78,7 @@ struct _GstPcapParse
|
||||||
gboolean swap_endian;
|
gboolean swap_endian;
|
||||||
gint64 cur_packet_size;
|
gint64 cur_packet_size;
|
||||||
GstClockTime cur_ts;
|
GstClockTime cur_ts;
|
||||||
|
GstPcapParseLinktype linktype;
|
||||||
|
|
||||||
gboolean newsegment_sent;
|
gboolean newsegment_sent;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue