]> The Tcpdump Group git mirrors - libpcap/commitdiff
From Stephen Donnelly of Endace:
authorguy <guy>
Fri, 22 Jun 2007 06:32:06 +0000 (06:32 +0000)
committerguy <guy>
Fri, 22 Jun 2007 06:32:06 +0000 (06:32 +0000)
This patch introduces support for the DAG ERF type
TYPE_COLOR_MC_HDLC_POS.

The patch also allows appropriate DAG cards (DAG 3.7T, DAG 7.1S)
to optionally produce DLT_MTP2_WITH_PHDR (139) traces when
capturing from channelised HDLC links, as an alternative to
DLT_MTP2 (140).  When using the new DLT, the 'DAG channel' is
recorded in the pcap record pseudo header as the 'link_number'.

Basic BPF filtering support for DLT_MTP2_WITH_PHDR is also
added.

Fix some warnings.

gencode.c
pcap-dag.c
pcap.c

index 842a3ac6d3e40c5cbae8fd4f1c9e1181e23b9f8c..97712a1b3e4ba3e3b2b3476265305332ea2d2f41 100644 (file)
--- a/gencode.c
+++ b/gencode.c
@@ -21,7 +21,7 @@
  */
 #ifndef lint
 static const char rcsid[] _U_ =
  */
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.283 2007-06-14 20:55:44 gianluca Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.284 2007-06-22 06:32:06 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -243,7 +243,7 @@ static struct slist *xfer_to_a(struct arth *);
 static struct block *gen_mac_multicast(int);
 static struct block *gen_len(int, int);
 
 static struct block *gen_mac_multicast(int);
 static struct block *gen_len(int, int);
 
-static struct block *gen_ppi_dlt_check();
+static struct block *gen_ppi_dlt_check(void);
 static struct block *gen_msg_abbrev(int type);
 
 static void *
 static struct block *gen_msg_abbrev(int type);
 
 static void *
@@ -1267,6 +1267,17 @@ init_linktype(p)
                off_nl_nosnap = -1;
                return;
 
                off_nl_nosnap = -1;
                return;
 
+       case DLT_MTP2_WITH_PHDR:
+               off_li = 6;
+               off_sio = 7;
+               off_opc = 8;
+               off_dpc = 8;
+               off_sls = 11;
+               off_linktype = -1;
+               off_nl = -1;
+               off_nl_nosnap = -1;
+               return;
+
 #ifdef DLT_PFSYNC
        case DLT_PFSYNC:
                off_linktype = -1;
 #ifdef DLT_PFSYNC
        case DLT_PFSYNC:
                off_linktype = -1;
@@ -1996,7 +2007,7 @@ insert_ppi_load_llprefixlen(b)
 }
        
 static struct block *
 }
        
 static struct block *
-gen_ppi_dlt_check()
+gen_ppi_dlt_check(void)
 {
        struct slist *s_load_dlt;
        struct block *b;
 {
        struct slist *s_load_dlt;
        struct block *b;
@@ -7010,14 +7021,16 @@ gen_mtp2type_abbrev(type)
        switch (type) {
 
        case M_FISU:
        switch (type) {
 
        case M_FISU:
-               if (linktype != DLT_MTP2)
+               if ( (linktype != DLT_MTP2) &&
+                    (linktype != DLT_MTP2_WITH_PHDR) )
                        bpf_error("'fisu' supported only on MTP2");
                /* gen_ncmp(offrel, offset, size, mask, jtype, reverse, value) */
                b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JEQ, 0, 0);
                break;
 
        case M_LSSU:
                        bpf_error("'fisu' supported only on MTP2");
                /* gen_ncmp(offrel, offset, size, mask, jtype, reverse, value) */
                b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JEQ, 0, 0);
                break;
 
        case M_LSSU:
-               if (linktype != DLT_MTP2)
+               if ( (linktype != DLT_MTP2) &&
+                    (linktype != DLT_MTP2_WITH_PHDR) )
                        bpf_error("'lssu' supported only on MTP2");
                b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 1, 2);
                b1 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 0, 0);
                        bpf_error("'lssu' supported only on MTP2");
                b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 1, 2);
                b1 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 0, 0);
@@ -7025,7 +7038,8 @@ gen_mtp2type_abbrev(type)
                break;
 
        case M_MSU:
                break;
 
        case M_MSU:
-               if (linktype != DLT_MTP2)
+               if ( (linktype != DLT_MTP2) &&
+                    (linktype != DLT_MTP2_WITH_PHDR) )
                        bpf_error("'msu' supported only on MTP2");
                b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 0, 2);
                break;
                        bpf_error("'msu' supported only on MTP2");
                b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 0, 2);
                break;
index 8355934981352363ed157f51ea5cc73391665229..477c632aa608766cbd1156be00286ea7d2ec1f67 100644 (file)
@@ -17,7 +17,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
 
 #ifndef lint
 static const char rcsid[] _U_ =
-       "@(#) $Header: /tcpdump/master/libpcap/pcap-dag.c,v 1.28 2007-02-01 02:58:39 guy Exp $ (LBL)";
+       "@(#) $Header: /tcpdump/master/libpcap/pcap-dag.c,v 1.29 2007-06-22 06:32:06 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -49,6 +49,18 @@ struct rtentry;              /* declarations in <net/if.h> */
 #define ATM_CELL_SIZE          52
 #define ATM_HDR_SIZE           4
 
 #define ATM_CELL_SIZE          52
 #define ATM_HDR_SIZE           4
 
+/*
+ * A header containing additional MTP information.
+ */
+#define MTP2_SENT_OFFSET               0       /* 1 byte */
+#define MTP2_ANNEX_A_USED_OFFSET       1       /* 1 byte */
+#define MTP2_LINK_NUMBER_OFFSET                2       /* 2 bytes */
+#define MTP2_HDR_LEN                   4       /* length of the header */
+
+#define MTP2_ANNEX_A_NOT_USED      0
+#define MTP2_ANNEX_A_USED          1
+#define MTP2_ANNEX_A_USED_UNKNOWN  2
+
 /* SunATM pseudo header */
 struct sunatm_hdr {
        unsigned char   flags;          /* destination and traffic type */
 /* SunATM pseudo header */
 struct sunatm_hdr {
        unsigned char   flags;          /* destination and traffic type */
@@ -78,6 +90,10 @@ static const unsigned short endian_test_word = 0x0100;
 #define dag_platform_finddevs pcap_platform_finddevs
 #endif /* DAG_ONLY */
 
 #define dag_platform_finddevs pcap_platform_finddevs
 #endif /* DAG_ONLY */
 
+#define MAX_DAG_PACKET 65536
+
+static unsigned char TempPkt[MAX_DAG_PACKET];
+
 static int dag_setfilter(pcap_t *p, struct bpf_program *fp);
 static int dag_stats(pcap_t *p, struct pcap_stat *ps);
 static int dag_set_datalink(pcap_t *p, int dlt);
 static int dag_setfilter(pcap_t *p, struct bpf_program *fp);
 static int dag_stats(pcap_t *p, struct pcap_stat *ps);
 static int dag_set_datalink(pcap_t *p, int dlt);
@@ -340,6 +356,9 @@ dag_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
                                caplen = packet_len;
                        }
                        break;
                                caplen = packet_len;
                        }
                        break;
+#ifdef TYPE_COLOR_MC_HDLC_POS
+               case TYPE_COLOR_MC_HDLC_POS:
+#endif
 #ifdef TYPE_MC_HDLC
                case TYPE_MC_HDLC:
                        packet_len = ntohs(header->wlen);
 #ifdef TYPE_MC_HDLC
                case TYPE_MC_HDLC:
                        packet_len = ntohs(header->wlen);
@@ -348,7 +367,20 @@ dag_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
                        if (caplen > packet_len) {
                                caplen = packet_len;
                        }
                        if (caplen > packet_len) {
                                caplen = packet_len;
                        }
+                       /* jump the MC_HDLC_HEADER */
                        dp += 4;
                        dp += 4;
+                       if (p->linktype == DLT_MTP2_WITH_PHDR) {
+                               /* Add the MTP2 Pseudo Header */
+                               caplen += MTP2_HDR_LEN;
+                               packet_len += MTP2_HDR_LEN;
+
+                               TempPkt[MTP2_SENT_OFFSET] = 0;
+                               TempPkt[MTP2_ANNEX_A_USED_OFFSET] = MTP2_ANNEX_A_USED_UNKNOWN;
+                               *(TempPkt+MTP2_LINK_NUMBER_OFFSET) = ((header->rec.mc_hdlc.mc_header>>16)&0x01);
+                               *(TempPkt+MTP2_LINK_NUMBER_OFFSET+1) = ((header->rec.mc_hdlc.mc_header>>24)&0xff);
+                               memcpy(TempPkt+MTP2_HDR_LEN, dp, caplen);
+                               dp = TempPkt;
+                       }
                        break;
 #endif
                default:
                        break;
 #endif
                default:
@@ -383,6 +415,10 @@ dag_read(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
                case TYPE_DSM_COLOR_ETH:
                        break;
 #endif
                case TYPE_DSM_COLOR_ETH:
                        break;
 #endif
+#ifdef TYPE_COLOR_MC_HDLC_POS
+               case TYPE_COLOR_MC_HDLC_POS:
+                       break;
+#endif
 
                default:
                        if (header->lctr) {
 
                default:
                        if (header->lctr) {
@@ -936,6 +972,9 @@ dag_get_datalink(pcap_t *p)
                                p->linktype = DLT_ATM_RFC1483;
                        break;
 
                                p->linktype = DLT_ATM_RFC1483;
                        break;
 
+#ifdef TYPE_COLOR_MC_HDLC_POS
+               case TYPE_COLOR_MC_HDLC_POS:
+#endif
 #ifdef TYPE_MC_HDLC
                case TYPE_MC_HDLC:
                        if (p->dlt_list != NULL) {
 #ifdef TYPE_MC_HDLC
                case TYPE_MC_HDLC:
                        if (p->dlt_list != NULL) {
@@ -943,6 +982,7 @@ dag_get_datalink(pcap_t *p)
                                p->dlt_list[index++] = DLT_PPP_SERIAL;
                                p->dlt_list[index++] = DLT_FRELAY;
                                p->dlt_list[index++] = DLT_MTP2;
                                p->dlt_list[index++] = DLT_PPP_SERIAL;
                                p->dlt_list[index++] = DLT_FRELAY;
                                p->dlt_list[index++] = DLT_MTP2;
+                               p->dlt_list[index++] = DLT_MTP2_WITH_PHDR;
                        }
                        if(!p->linktype)
                                p->linktype = DLT_CHDLC;
                        }
                        if(!p->linktype)
                                p->linktype = DLT_CHDLC;
diff --git a/pcap.c b/pcap.c
index 7e2fb5d40bb9d519a691c502205009f3e71e6faa..22093b5843aa48f2f51dfd7b480dd7cce18c4afb 100644 (file)
--- a/pcap.c
+++ b/pcap.c
@@ -33,7 +33,7 @@
 
 #ifndef lint
 static const char rcsid[] _U_ =
 
 #ifndef lint
 static const char rcsid[] _U_ =
-    "@(#) $Header: /tcpdump/master/libpcap/pcap.c,v 1.105 2007-06-11 10:04:25 guy Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/libpcap/pcap.c,v 1.106 2007-06-22 06:32:06 guy Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -388,6 +388,7 @@ static struct dlt_choice dlt_choices[] = {
        DLT_CHOICE(DLT_BLUETOOTH_HCI_H4, "Bluetooth HCI UART transport layer"),
        DLT_CHOICE(DLT_USB_LINUX, "USB with Linux header"),
        DLT_CHOICE(DLT_CAN20B, "Controller Area Network (CAN) v. 2.0B"),
        DLT_CHOICE(DLT_BLUETOOTH_HCI_H4, "Bluetooth HCI UART transport layer"),
        DLT_CHOICE(DLT_USB_LINUX, "USB with Linux header"),
        DLT_CHOICE(DLT_CAN20B, "Controller Area Network (CAN) v. 2.0B"),
+       DLT_CHOICE(DLT_MTP2_WITH_PHDR, "SS7 MTP2 with Pseudo-header"),
        DLT_CHOICE_SENTINEL
 };
 
        DLT_CHOICE_SENTINEL
 };