pcapparse: Add support for Linux "cooked" capture encapsulation v2

See https://www.tcpdump.org/linktypes/LINKTYPE_LINUX_SLL2.html

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4451>
This commit is contained in:
Edward Hervey 2023-04-19 09:55:14 +02:00 committed by Edward Hervey
parent 03ac969240
commit ab458eae56
2 changed files with 12 additions and 3 deletions

View file

@ -351,6 +351,7 @@ gst_pcap_parse_read_uint32 (GstPcapParse * self, const guint8 * p)
#define ETH_HEADER_LEN 14 #define ETH_HEADER_LEN 14
#define ETH_VLAN_HEADER_LEN 4 #define ETH_VLAN_HEADER_LEN 4
#define SLL_HEADER_LEN 16 #define SLL_HEADER_LEN 16
#define SLL2_HEADER_LEN 20
#define IP_HEADER_MIN_LEN 20 #define IP_HEADER_MIN_LEN 20
#define UDP_HEADER_LEN 8 #define UDP_HEADER_LEN 8
@ -404,6 +405,13 @@ gst_pcap_parse_scan_frame (GstPcapParse * self,
eth_type = GUINT16_FROM_BE (*((guint16 *) (buf + 14))); eth_type = GUINT16_FROM_BE (*((guint16 *) (buf + 14)));
buf_ip = buf + SLL_HEADER_LEN; buf_ip = buf + SLL_HEADER_LEN;
break; break;
case LINKTYPE_SLL2:
if (buf_size < SLL2_HEADER_LEN + IP_HEADER_MIN_LEN + UDP_HEADER_LEN)
return FALSE;
eth_type = GUINT16_FROM_BE (*((guint16 *) (buf)));
buf_ip = buf + SLL2_HEADER_LEN;
break;
case LINKTYPE_RAW: case LINKTYPE_RAW:
if (buf_size < IP_HEADER_MIN_LEN + UDP_HEADER_LEN) if (buf_size < IP_HEADER_MIN_LEN + UDP_HEADER_LEN)
return FALSE; return FALSE;
@ -641,9 +649,9 @@ gst_pcap_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
} }
if (linktype != LINKTYPE_ETHER && linktype != LINKTYPE_SLL && if (linktype != LINKTYPE_ETHER && linktype != LINKTYPE_SLL &&
linktype != LINKTYPE_RAW) { linktype != LINKTYPE_RAW && linktype != LINKTYPE_SLL2) {
GST_ELEMENT_ERROR (self, STREAM, WRONG_TYPE, (NULL), GST_ELEMENT_ERROR (self, STREAM, WRONG_TYPE, (NULL),
("Only dumps of type Ethernet, raw IP or Linux Cooked (SLL) " ("Only dumps of type Ethernet, raw IP or Linux Cooked (SLL/SLL2) "
"understood; type %d unknown", linktype)); "understood; type %d unknown", linktype));
ret = GST_FLOW_ERROR; ret = GST_FLOW_ERROR;
goto out; goto out;

View file

@ -49,7 +49,8 @@ typedef enum
{ {
LINKTYPE_ETHER = 1, LINKTYPE_ETHER = 1,
LINKTYPE_RAW = 101, LINKTYPE_RAW = 101,
LINKTYPE_SLL = 113 LINKTYPE_SLL = 113,
LINKTYPE_SLL2 = 276
} GstPcapParseLinktype; } GstPcapParseLinktype;
/** /**