From: guy Date: Thu, 21 Dec 2006 19:45:03 +0000 (+0000) Subject: From Florent Drouin: add support for filtering on MTP2 frame types. X-Git-Tag: libpcap-0.9.6~18 X-Git-Url: https://git.tcpdump.org/libpcap/commitdiff_plain/c6310f208b534b421f30dbe2457ae30eeebcf757 From Florent Drouin: add support for filtering on MTP2 frame types. --- diff --git a/CREDITS b/CREDITS index af937a7f..d63f6733 100644 --- a/CREDITS +++ b/CREDITS @@ -32,6 +32,7 @@ Additional people who have contributed patches: Dug Song Eric Anderson Erik de Castro Lopo + Florent Drouin Franz Schaefer Gianluca Varenni Gilbert Hoyek diff --git a/gencode.c b/gencode.c index 32474929..fcc9c1cc 100644 --- a/gencode.c +++ b/gencode.c @@ -21,7 +21,7 @@ */ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.221.2.44 2006-10-13 08:56:07 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/gencode.c,v 1.221.2.45 2006-12-21 19:45:03 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -724,6 +724,11 @@ static u_int off_vpi; static u_int off_vci; static u_int off_proto; +/* + * These are offsets for the MTP2 fields. + */ +static u_int off_li; + /* * These are offsets for the MTP3 fields. */ @@ -790,6 +795,7 @@ init_linktype(p) /* * And assume we're not doing SS7. */ + off_li = -1; off_sio = -1; off_opc = -1; off_dpc = -1; @@ -1217,6 +1223,7 @@ init_linktype(p) return; case DLT_MTP2: + off_li = 2; off_sio = 3; off_opc = 4; off_dpc = 4; @@ -6748,6 +6755,47 @@ gen_atmtype_abbrev(type) return b1; } +/* + * Filtering for MTP2 messages based on li value + * FISU, length is null + * LSU, length is 1 or 2 + * MSU, length is 3 or more + */ +struct block * +gen_mtp2type_abbrev(type) + int type; +{ + struct block *b0, *b1; + + switch (type) { + + case M_FISU: + if (linktype != DLT_MTP2) + 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_LSU: + if (linktype != DLT_MTP2) + bpf_error("'lsu' 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); + gen_and(b1, b0); + break; + + case M_MSU: + if (linktype != DLT_MTP2) + bpf_error("'msu' supported only on MTP2"); + b0 = gen_ncmp(OR_PACKET, off_li, BPF_B, 0x3f, BPF_JGT, 0, 2); + break; + + default: + abort(); + } + return b0; +} + struct block * gen_mtp3field_code(mtp3field, jvalue, jtype, reverse) int mtp3field; diff --git a/gencode.h b/gencode.h index 75c3e486..ceba77c0 100644 --- a/gencode.h +++ b/gencode.h @@ -18,7 +18,7 @@ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * @(#) $Header: /tcpdump/master/libpcap/gencode.h,v 1.60.2.8 2006-10-24 17:00:48 hannes Exp $ (LBL) + * @(#) $Header: /tcpdump/master/libpcap/gencode.h,v 1.60.2.9 2006-12-21 19:45:04 guy Exp $ (LBL) */ /* @@ -173,11 +173,16 @@ end-to-end circuits, ILMI circuits or connection signalling circuit. */ -/*MTP3 field types */ -#define M_SIO 1 -#define M_OPC 2 -#define M_DPC 3 -#define M_SLS 4 +/* MTP2 types */ +#define M_FISU 22 /* FISU */ +#define M_LSU 23 /* LSU */ +#define M_MSU 24 /* MSU */ + +/* MTP3 field types */ +#define M_SIO 1 +#define M_OPC 2 +#define M_DPC 3 +#define M_SLS 4 struct slist; @@ -296,6 +301,7 @@ struct block *gen_atmfield_code(int atmfield, bpf_int32 jvalue, bpf_u_int32 jtyp struct block *gen_atmtype_abbrev(int type); struct block *gen_atmmulti_abbrev(int type); +struct block *gen_mtp2type_abbrev(int type); struct block *gen_mtp3field_code(int mtp3field, bpf_u_int32 jvalue, bpf_u_int32 jtype, int reverse); struct block *gen_pf_ifname(const char *); diff --git a/grammar.y b/grammar.y index 0babac27..f08ae562 100644 --- a/grammar.y +++ b/grammar.y @@ -22,7 +22,7 @@ */ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/grammar.y,v 1.86.2.5 2005-09-05 09:08:06 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/grammar.y,v 1.86.2.6 2006-12-21 19:45:04 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -113,8 +113,9 @@ pcap_parse() %type atmtype atmmultitype %type atmfield %type atmfieldvalue atmvalue atmlistvalue -%type mtp3field -%type mtp3fieldvalue mtp3value mtp3listvalue +%type mtp2type +%type mtp3field +%type mtp3fieldvalue mtp3value mtp3listvalue %token DST SRC HOST GATEWAY @@ -140,7 +141,8 @@ pcap_parse() %token OAM OAMF4 CONNECTMSG METACONNECT %token VPI VCI %token RADIO -%token SIO OPC DPC SLS +%token FISU LSU MSU +%token SIO OPC DPC SLS %type ID %type EID @@ -261,6 +263,7 @@ rterm: head id { $$ = $2; } | atmtype { $$.b = gen_atmtype_abbrev($1); $$.q = qerr; } | atmmultitype { $$.b = gen_atmmulti_abbrev($1); $$.q = qerr; } | atmfield atmvalue { $$.b = $2.b; $$.q = qerr; } + | mtp2type { $$.b = gen_mtp2type_abbrev($1); $$.q = qerr; } | mtp3field mtp3value { $$.b = $2.b; $$.q = qerr; } ; /* protocol level qualifiers */ @@ -439,6 +442,11 @@ atmfieldvalue: NUM { atmlistvalue: atmfieldvalue | atmlistvalue or atmfieldvalue { gen_or($1.b, $3.b); $$ = $3; } ; + /* MTP2 types quantifier */ +mtp2type: FISU { $$ = M_FISU; } + | LSU { $$ = M_LSU; } + | MSU { $$ = M_MSU; } + ; /* MTP3 field types quantifier */ mtp3field: SIO { $$.mtp3fieldtype = M_SIO; } | OPC { $$.mtp3fieldtype = M_OPC; } diff --git a/scanner.l b/scanner.l index 9494b417..a84494ae 100644 --- a/scanner.l +++ b/scanner.l @@ -22,7 +22,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/scanner.l,v 1.99.2.6 2005-11-09 23:49:48 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/scanner.l,v 1.99.2.7 2006-12-21 19:45:04 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -288,6 +288,9 @@ srnr|subrulenum return PF_SRNR; reason return PF_REASON; action return PF_ACTION; +fisu return FISU; +lsu return LSU; +msu return MSU; sio return SIO; opc return OPC; dpc return DPC;