From 7baaf4939941c469c730e02e1461e64e52838317 Mon Sep 17 00:00:00 2001 From: Markus Amend Date: Mon, 23 Apr 2012 14:51:24 +0200 Subject: [PATCH] proto_icmpv6.h: upgrading message detection --- src/examples/icmpv6/icmpv6-mldv2.pcap | Bin 0 -> 516 bytes src/examples/icmpv6/icmpv6_diff_msg.pcap | Bin 0 -> 5356 bytes src/examples/icmpv6/icmpv6_type1.pcap | Bin 0 -> 754 bytes src/proto_icmpv6.h | 145 ++++++++++++++++++++++++++++--- 4 files changed, 133 insertions(+), 12 deletions(-) create mode 100644 src/examples/icmpv6/icmpv6-mldv2.pcap create mode 100644 src/examples/icmpv6/icmpv6_diff_msg.pcap create mode 100644 src/examples/icmpv6/icmpv6_type1.pcap diff --git a/src/examples/icmpv6/icmpv6-mldv2.pcap b/src/examples/icmpv6/icmpv6-mldv2.pcap new file mode 100644 index 0000000000000000000000000000000000000000..ea817d8142d62748d8ffc358bb8ac55fdc8a3d4e GIT binary patch literal 516 zcwW15c+)~A1{MYw`2U}Qfe}a>uhI3id&AA}3djaw21cML6PRRdyPE(K*~0Lj0S)|T zLg6x5F+v!uQ1N~S=`9Q(vzQn-(9|+ApaD|l3Gh*QsPc?Jk8s{wyYKzJwg29NeBStu ho8b{q;t^OD!{=*A_jwaT%MUE-K&m(x&;Y%C4glUbFNXjC literal 0 HcwPel00001 diff --git a/src/examples/icmpv6/icmpv6_diff_msg.pcap b/src/examples/icmpv6/icmpv6_diff_msg.pcap new file mode 100644 index 0000000000000000000000000000000000000000..99e7cde9cfb8c1d02193fc8e4d54345be710c25d GIT binary patch literal 5356 zcwWVrZEO@p7{{O4-Fw-)(q6+7OTl_UE0NS#QaNJL>qgsR6cEvXf+mI3q-`2Bv^|A> z;M&;ZEJWjnh7XEBz4H^L+5qvDT!Lwk5No1QV=y3~tx9?MAdNA(^_iJHdi#=Yn$5MF zY-e|8=Kuda^UUl{?}sxZM+J}|cYNmqAXr{GJ0AJ0-v^uVnx4>f(AWAGK*AIMCGl$$ zeG;zKvT@!^fP|LCnmhMR2emA=-v=#U(R=fALbwujkq-D^1J-R|E$CD3rMr~nx#+#k zu1Oe9XKY-ky86029fMUJW2nn|FlHdRUU%+w^?fk#AZ==XjxjJL>LToxr(>{=R9T*j z-rMY&gw09S#$^K4pZ&rq4^HZq7)*JfF701B<-uvBl5k;B#>R!Jlax~)oU&}0OQt+f zm#MT<9-L-u5>}L{HZD`B-m%VK;PpUVzFzMy(0ce6)tBG$!ybIL$6md@R&~m<2veJA zQ`TN7B{p-9NFj91T-35_#psc)-uFQ1-A`kr1piF>S-JHgdG1Nx2j$w+f=<$3C9`tx z!}CCL2$WcZsFP?bImrXhJCM{-C7c8TBRRGArj_LE;4Dc#0A*uT5;)0yt2v1_G!G<) zL7BYl(MkH=&61P|DAEb&@R~bCN3u0yC3DsZtr-+W`C!tR$zKXGwAtl%9n? zk(1nbIl#)1Tk}9N2+E?AUnhC-JSW*y5uAIH4?$_!E$bwn+nnT8f6>e&kC~OsPDENb z+f|$bWo&Ig;v|PEgPdsHg1IM2gQ6}A>Le?kDq^J^DV}?hk3bo`t4JpqeQp7eZ^k26 z*La~3J2o;g%eOO>_m0g|#tH)b5aN*D6$=AX`~DFxD>n}0saoR;)vhtCm|c1xWl$Bc zT-M;8wXQW5CQNPh6I``)zkAlGK~=cw(!I8fld zICUu*2^45AUV`c`R2D-NAJVg?hDL5s_gnXXngIES&<9;x=tT(C+M7j);dLyhMhqjO zTK9S;HIjhFN)>#5fUar)aUwSo9+nx;1yNEn5V;;_Crrnb6IhHC+pfw5-q%u>*zaK;dn7rp&LDIVz_O;4xU^Lx#MvneR7gsu=b;+f0*md{b7~d2BQ^`mpc36IG(sH zK@>Y$R(e}o+uFD95O==P39uAMrilIpC=Nl$Jkv5E?4{S4`{vh4%{x1)MXVIIHw$gA z0csMxPC7SHvSTI>b6?hzR6j#|3RUGeb_0{s`LC(bZ1Qi8J#Q8gjpe`d9eQK-&gGxF zj9hp65724#C*jl2FWI;V`kbdOlQ-nqzYh&+akwYe9p)>e{!$RA>iA80=J%oM#NGoH z7S%WZ4!UMN+1`y`1gduIPpZ4=sS<4No zOR+rtlY7=}@$Rt5)Px_o>balYvu-u0-i>9?Z|+%-ySaUg1*5M R!2A?N}|J<4FfPA2S21X`^w*UWt>KR#tgFs5b>O}+@(dE(gFDPwV!XR?q zor?wHg1M^PV4Bs3m;NqU${^yP#0_(OS z>-ZRSfKdg)5H~>F19izaD+g>Qdq^_CfDunused)); + tprintf(" Payload include as much of invoking packet"); +} + +static inline void dissect_icmpv6_type2(struct pkt_buff *pkt) +{ + struct icmpv6_type_2 *icmp_2; + + icmp_2 = (struct icmpv6_type_2 *) pkt_pull(pkt,sizeof(*icmp_2)); + if (icmp_2 == NULL) + return; + + tprintf(", MTU (0x%x)",ntohl(icmp_2->MTU)); + tprintf(" Payload include as much of invoking packet"); +} + +static char *icmpv6_type_3_codes[] = { + "Hop limit exceeded in transit", + "Fragment reassembly time exceeded", +}; + +static inline void dissect_icmpv6_type3(struct pkt_buff *pkt) +{ + struct icmpv6_type_1_3 *icmp_3; + + icmp_3 = (struct icmpv6_type_1_3 *) pkt_pull(pkt,sizeof(*icmp_3)); + if (icmp_3 == NULL) + return; + + tprintf(", Unused (0x%x)",ntohl(icmp_3->unused)); + tprintf(" Payload include as much of invoking packet"); +} + +static char *icmpv6_type_4_codes[] = { + "Erroneous header field encountered", + "Unrecognized Next Header type encountered", + "Unrecognized IPv6 option encountered", +}; + +static inline void dissect_icmpv6_type4(struct pkt_buff *pkt) +{ + struct icmpv6_type_4 *icmp_4; + + icmp_4 = (struct icmpv6_type_4 *) pkt_pull(pkt,sizeof(*icmp_4)); + if (icmp_4 == NULL) + return; + + tprintf(", Pointer (0x%x)",ntohl(icmp_4->pointer)); + tprintf(" Payload include as much of invoking packet"); +} + +static inline void dissect_icmpv6_type128(struct pkt_buff *pkt) +{ + struct icmpv6_type_128_129 *icmp_128; + + icmp_128 = (struct icmpv6_type_128_129 *) + pkt_pull(pkt,sizeof(*icmp_128)); + if (icmp_128 == NULL) + return; + + tprintf(", ID (0x%x)",ntohs(icmp_128->id)); + tprintf(", Seq. Nr. (%u)",ntohs(icmp_128->sn)); + tprintf(" Payload include Data"); +} + +static inline void dissect_icmpv6_type129(struct pkt_buff *pkt) +{ + struct icmpv6_type_128_129 *icmp_129; + + icmp_129 = (struct icmpv6_type_128_129 *) + pkt_pull(pkt,sizeof(*icmp_129)); + if (icmp_129 == NULL) + return; + + tprintf(", ID (0x%x)",ntohs(icmp_129->id)); + tprintf(", Seq. Nr. (%u)",ntohs(icmp_129->sn)); + tprintf(" Payload include Data"); +} + #define icmpv6_code_range_valid(code, sarr) ((code) < array_size((sarr))) -static inline void icmpv6_process(struct icmpv6hdr *icmp, char **type, - char **code, char **optional) +static inline void icmpv6_process(struct icmpv6_general_hdr *icmp, char **type, + char **code, + void (**optional)(struct pkt_buff *pkt)) { *type = "Unknown Type"; *code = "Unknown Code"; @@ -50,17 +160,25 @@ static inline void icmpv6_process(struct icmpv6hdr *icmp, char **type, switch (icmp->h_type) { case 1: *type = "Destination Unreachable"; - if (icmpv6_code_range_valid(icmp->h_code, icmpv6_type_1_strings)) - *code = icmpv6_type_1_strings[icmp->h_code]; + if (icmpv6_code_range_valid(icmp->h_code, icmpv6_type_1_codes)) + *code = icmpv6_type_1_codes[icmp->h_code]; + *optional = dissect_icmpv6_type1; return; case 2: *type = "Packet Too Big"; + *optional = dissect_icmpv6_type2; return; case 3: *type = "Time Exceeded"; + if (icmpv6_code_range_valid(icmp->h_code, icmpv6_type_3_codes)) + *code = icmpv6_type_3_codes[icmp->h_code]; + *optional = dissect_icmpv6_type3; return; case 4: *type = "Parameter Problem"; + if (icmpv6_code_range_valid(icmp->h_code, icmpv6_type_4_codes)) + *code = icmpv6_type_4_codes[icmp->h_code]; + *optional = dissect_icmpv6_type4; return; case 100: *type = "Private experimation"; @@ -73,9 +191,11 @@ static inline void icmpv6_process(struct icmpv6hdr *icmp, char **type, return; case 128: *type = "Echo Request"; + *optional = dissect_icmpv6_type128; return; case 129: *type = "Echo Reply"; + *optional = dissect_icmpv6_type129; return; case 130: *type = "Multicast Listener Query"; @@ -167,9 +287,10 @@ static inline void icmpv6_process(struct icmpv6hdr *icmp, char **type, static inline void icmpv6(struct pkt_buff *pkt) { - char *type = NULL, *code = NULL, *optional = NULL; - struct icmpv6hdr *icmp = - (struct icmpv6hdr *) pkt_pull(pkt, sizeof(*icmp)); + char *type = NULL, *code = NULL; + void (*optional)(struct pkt_buff *pkt) = NULL; + struct icmpv6_general_hdr *icmp = + (struct icmpv6_general_hdr *) pkt_pull(pkt, sizeof(*icmp)); if (icmp == NULL) return; @@ -181,14 +302,14 @@ static inline void icmpv6(struct pkt_buff *pkt) tprintf("%s (%u), ", code, icmp->h_code); tprintf("Chks (0x%x)", ntohs(icmp->h_chksum)); if (optional) - tprintf(" %s", optional); + (*optional) (pkt); tprintf(" ]\n\n"); } static inline void icmpv6_less(struct pkt_buff *pkt) { - struct icmpv6hdr *icmp = - (struct icmpv6hdr *) pkt_pull(pkt, sizeof(*icmp)); + struct icmpv6_general_hdr *icmp = + (struct icmpv6_general_hdr *) pkt_pull(pkt, sizeof(*icmp)); if (icmp == NULL) return; -- 2.11.4.GIT