X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/fb47cfdaae3394096f1932afacc99d6703d06820..dff10c7f70d539c431a1eba9ab5e076d8b0f5c8e:/print-isakmp.c?ds=inline diff --git a/print-isakmp.c b/print-isakmp.c index 58c7344c..5f4abc00 100644 --- a/print-isakmp.c +++ b/print-isakmp.c @@ -30,7 +30,11 @@ #ifndef lint static const char rcsid[] = - "@(#) $Header: /tcpdump/master/tcpdump/print-isakmp.c,v 1.4 1999-10-30 05:30:20 itojun Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/tcpdump/print-isakmp.c,v 1.10 2000-01-17 06:24:25 itojun Exp $ (LBL)"; +#endif + +#ifdef HAVE_CONFIG_H +#include "config.h" #endif #include @@ -206,11 +210,15 @@ cookie_record(cookie_t *in, const u_char *bp2) sizeof(cookiecache[ninitiator].raddr)); sin = (struct sockaddr_in *)&cookiecache[ninitiator].iaddr; +#ifdef HAVE_SOCKADDR_SA_LEN sin->sin_len = sizeof(struct sockaddr_in); +#endif sin->sin_family = AF_INET; memcpy(&sin->sin_addr, &ip->ip_src, sizeof(ip->ip_src)); sin = (struct sockaddr_in *)&cookiecache[ninitiator].raddr; +#ifdef HAVE_SOCKADDR_SA_LEN sin->sin_len = sizeof(struct sockaddr_in); +#endif sin->sin_family = AF_INET; memcpy(&sin->sin_addr, &ip->ip_dst, sizeof(ip->ip_dst)); break; @@ -223,11 +231,15 @@ cookie_record(cookie_t *in, const u_char *bp2) ip6 = (struct ip6_hdr *)bp2; sin6 = (struct sockaddr_in6 *)&cookiecache[ninitiator].iaddr; +#ifdef HAVE_SOCKADDR_SA_LEN sin6->sin6_len = sizeof(struct sockaddr_in6); +#endif sin6->sin6_family = AF_INET6; memcpy(&sin6->sin6_addr, &ip6->ip6_src, sizeof(ip6->ip6_src)); sin6 = (struct sockaddr_in6 *)&cookiecache[ninitiator].raddr; +#ifdef HAVE_SOCKADDR_SA_LEN sin6->sin6_len = sizeof(struct sockaddr_in6); +#endif sin6->sin6_family = AF_INET6; memcpy(&sin6->sin6_addr, &ip6->ip6_dst, sizeof(ip6->ip6_dst)); break; @@ -252,13 +264,16 @@ cookie_sidecheck(int i, const u_char *bp2, int initiator) struct ip6_hdr *ip6; struct sockaddr_in6 *sin6; #endif + int salen; memset(&ss, 0, sizeof(ss)); ip = (struct ip *)bp2; switch (ip->ip_v) { case 4: sin = (struct sockaddr_in *)&ss; +#ifdef HAVE_SOCKADDR_SA_LEN sin->sin_len = sizeof(struct sockaddr_in); +#endif sin->sin_family = AF_INET; memcpy(&sin->sin_addr, &ip->ip_src, sizeof(ip->ip_src)); break; @@ -266,7 +281,9 @@ cookie_sidecheck(int i, const u_char *bp2, int initiator) case 6: ip6 = (struct ip6_hdr *)bp2; sin6 = (struct sockaddr_in6 *)&ss; +#ifdef HAVE_SOCKADDR_SA_LEN sin6->sin6_len = sizeof(struct sockaddr_in6); +#endif sin6->sin6_family = AF_INET6; memcpy(&sin6->sin6_addr, &ip6->ip6_src, sizeof(ip6->ip6_src)); break; @@ -279,16 +296,36 @@ cookie_sidecheck(int i, const u_char *bp2, int initiator) if (initiator) { if (sa->sa_family != ((struct sockaddr *)&cookiecache[i].iaddr)->sa_family) return 0; - if (sa->sa_len != ((struct sockaddr *)&cookiecache[i].iaddr)->sa_len) - return 0; - if (memcmp(&ss, &cookiecache[i].iaddr, sa->sa_len) == 0) +#ifdef HAVE_SOCKADDR_SA_LEN + salen = sa->sa_len; +#else +#ifdef INET6 + if (sa->sa_family == AF_INET6) + salen = sizeof(struct sockaddr_in6); + else + salen = sizeof(struct sockaddr); +#else + salen = sizeof(struct sockaddr); +#endif +#endif + if (memcmp(&ss, &cookiecache[i].iaddr, salen) == 0) return 1; } else { if (sa->sa_family != ((struct sockaddr *)&cookiecache[i].raddr)->sa_family) return 0; - if (sa->sa_len != ((struct sockaddr *)&cookiecache[i].raddr)->sa_len) - return 0; - if (memcmp(&ss, &cookiecache[i].raddr, sa->sa_len) == 0) +#ifdef HAVE_SOCKADDR_SA_LEN + salen = sa->sa_len; +#else +#ifdef INET6 + if (sa->sa_family == AF_INET6) + salen = sizeof(struct sockaddr_in6); + else + salen = sizeof(struct sockaddr); +#else + salen = sizeof(struct sockaddr); +#endif +#endif + if (memcmp(&ss, &cookiecache[i].raddr, salen) == 0) return 1; } return 0; @@ -964,6 +1001,7 @@ isakmp_print(const u_char *bp, u_int length, const u_char *bp2) u_char np; int i; int phase; + int major, minor; base = (struct isakmp *)bp; ep = (u_char *)snapend; @@ -974,8 +1012,13 @@ isakmp_print(const u_char *bp, u_int length, const u_char *bp2) } printf("isakmp"); - if (vflag) - printf(" %d.%d", base->v_maj, base->v_min); + if (vflag) { + major = (base->vers & ISAKMP_VERS_MAJOR) + >> ISAKMP_VERS_MAJOR_SHIFT; + minor = (base->vers & ISAKMP_VERS_MINOR) + >> ISAKMP_VERS_MINOR_SHIFT; + printf(" %d.%d", major, minor); + } if (vflag) { printf(" msgid ");