aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2012-03-06 09:02:06 +0000
committerAnders Broman <anders.broman@ericsson.com>2012-03-06 09:02:06 +0000
commit7fba54762bbd8b18aab65253071a0f375c626011 (patch)
treed5e66878eeb782fa468ec97e8040e1f23f5a4384
parent3b06ee6ca07223fe7594bfec7031a26d6219be0e (diff)
From Mike Wakerly: Add wiretap suport for LINKTYPE_NFC_LLCP
svn path=/trunk/; revision=41368
-rw-r--r--wiretap/pcap-common.c40
-rw-r--r--wiretap/wtap.c5
-rw-r--r--wiretap/wtap.h8
3 files changed, 52 insertions, 1 deletions
diff --git a/wiretap/pcap-common.c b/wiretap/pcap-common.c
index da08af1ae3..c5780cd47f 100644
--- a/wiretap/pcap-common.c
+++ b/wiretap/pcap-common.c
@@ -385,6 +385,8 @@ static const struct {
{ 242, WTAP_ENCAP_IP_OVER_IB },
/* ISO/IEC 13818-1 MPEG2-TS packets */
{ 243, WTAP_ENCAP_MPEG_2_TS },
+ /* NFC LLCP */
+ { 245, WTAP_ENCAP_NFC_LLCP },
/*
* To repeat:
@@ -717,6 +719,13 @@ wtap_wtap_encap_to_pcap_encap(int encap)
#define LAPD_SLL_LEN 16 /* length of the header */
/*
+ * The NFC LLCP per-packet header.
+ */
+#define LLCP_ADAPTER_OFFSET 0
+#define LLCP_FLAGS_OFFSET 1
+#define LLCP_HEADER_LEN 2
+
+/*
* I2C link-layer on-disk format
*/
struct i2c_file_hdr {
@@ -1217,6 +1226,26 @@ pcap_read_bt_pseudoheader(FILE_T fh,
}
static gboolean
+pcap_read_llcp_pseudoheader(FILE_T fh,
+ union wtap_pseudo_header *pseudo_header, int *err, gchar **err_info)
+{
+ int bytes_read;
+ guint8 phdr[LLCP_HEADER_LEN];
+
+ errno = WTAP_ERR_CANT_READ;
+ bytes_read = file_read(phdr, LLCP_HEADER_LEN, fh);
+ if (bytes_read != LLCP_HEADER_LEN) {
+ *err = file_error(fh, err_info);
+ if (*err == 0)
+ *err = WTAP_ERR_SHORT_READ;
+ return FALSE;
+ }
+ pseudo_header->llcp.adapter = phdr[LLCP_ADAPTER_OFFSET];
+ pseudo_header->llcp.flags = phdr[LLCP_FLAGS_OFFSET];
+ return TRUE;
+}
+
+static gboolean
pcap_read_ppp_pseudoheader(FILE_T fh,
union wtap_pseudo_header *pseudo_header, int *err, gchar **err_info)
{
@@ -1556,6 +1585,17 @@ pcap_process_pseudo_header(FILE_T fh, int file_type, int wtap_encap,
phdr_len = (int)sizeof (struct libpcap_bt_phdr);
break;
+ case WTAP_ENCAP_NFC_LLCP:
+ if (check_packet_size && packet_size < LLCP_HEADER_LEN) {
+ *err = WTAP_ERR_BAD_FILE;
+ *err_info = g_strdup_printf("pcap: libpcap llcp file too short");
+ return -1;
+ }
+ if (!pcap_read_llcp_pseudoheader(fh, pseudo_header, err, err_info))
+ return -1; /* Read error */
+ phdr_len = LLCP_HEADER_LEN;
+ break;
+
case WTAP_ENCAP_PPP_WITH_PHDR:
if (check_packet_size &&
packet_size < sizeof (struct libpcap_ppp_phdr)) {
diff --git a/wiretap/wtap.c b/wiretap/wtap.c
index 3def7c5c47..f1f8212ccd 100644
--- a/wiretap/wtap.c
+++ b/wiretap/wtap.c
@@ -558,7 +558,10 @@ static struct encap_type_info encap_table_base[] = {
{ "ISO/IEC 13818-1 MPEG2-TS", "mp2ts" },
/* WTAP_ENCAP_PPP_ETHER */
- { "PPP-over-Ethernet session", "pppoes" }
+ { "PPP-over-Ethernet session", "pppoes" },
+
+ /* WTAP_ENCAP_NFC_LLCP */
+ { "LLCP", "llcp" }
};
gint wtap_num_encap_types = sizeof(encap_table_base) / sizeof(struct encap_type_info);
diff --git a/wiretap/wtap.h b/wiretap/wtap.h
index 8a563e7426..6ac2322210 100644
--- a/wiretap/wtap.h
+++ b/wiretap/wtap.h
@@ -229,6 +229,7 @@ extern "C" {
#define WTAP_ENCAP_IP_OVER_IB 137
#define WTAP_ENCAP_MPEG_2_TS 138
#define WTAP_ENCAP_PPP_ETHER 139
+#define WTAP_ENCAP_NFC_LLCP 140
#define WTAP_NUM_ENCAP_TYPES wtap_get_num_encap_types()
@@ -685,6 +686,12 @@ struct erf_mc_phdr {
} subhdr;
};
+#define LLCP_PHDR_FLAG_SENT 0
+struct llcp_phdr {
+ guint8 adapter;
+ guint8 flags;
+};
+
#define SITA_FRAME_DIR_TXED (0x00) /* values of sita_phdr.flags */
#define SITA_FRAME_DIR_RXED (0x01)
#define SITA_FRAME_DIR (0x01) /* mask */
@@ -815,6 +822,7 @@ union wtap_pseudo_header {
struct i2c_phdr i2c;
struct gsm_um_phdr gsm_um;
struct nstr_phdr nstr;
+ struct llcp_phdr llcp;
};
struct wtap_nstime {