#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.148 2005-04-06 21:33:02 mcr Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-ip.c,v 1.149.2.4 2005-11-13 11:51:52 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
struct ip_print_demux_state {
const struct ip *ip;
const u_char *cp;
- u_int hlen, len, off;
+ u_int len, off;
u_char nh;
int advance;
};
case IPPROTO_SCTP:
sctp_print(ipds->cp, (const u_char *)ipds->ip, ipds->len);
break;
+
+ case IPPROTO_DCCP:
+ dccp_print(ipds->cp, (const u_char *)ipds->ip, ipds->len);
+ break;
case IPPROTO_TCP:
+ /* pass on the MF bit plus the offset to detect fragments */
tcp_print(ipds->cp, ipds->len, (const u_char *)ipds->ip,
- (ipds->off &~ 0x6000));
+ ipds->off & (IP_MF|IP_OFFMASK));
break;
case IPPROTO_UDP:
+ /* pass on the MF bit plus the offset to detect fragments */
udp_print(ipds->cp, ipds->len, (const u_char *)ipds->ip,
- (ipds->off &~ 0x6000));
+ ipds->off & (IP_MF|IP_OFFMASK));
break;
case IPPROTO_ICMP:
/* pass on the MF bit plus the offset to detect fragments */
icmp_print(ipds->cp, ipds->len, (const u_char *)ipds->ip,
- (ipds->off & 0x3fff));
+ ipds->off & (IP_MF|IP_OFFMASK));
break;
case IPPROTO_PIGP:
vrrp_print(ipds->cp, ipds->len, ipds->ip->ip_ttl);
break;
+ case IPPROTO_PGM:
+ pgm_print(ipds->cp, ipds->len, (const u_char *)ipds->ip);
+ break;
+
default:
if ((proto = getprotobynumber(ipds->nh)) != NULL)
ND_PRINT((ndo, " %s", proto->p_name));
}
}
+void
+ip_print_inner(netdissect_options *ndo,
+ const u_char *bp,
+ u_int length, u_int nh,
+ const u_char *bp2)
+{
+ struct ip_print_demux_state ipd;
+
+ ipd.ip = (const struct ip *)bp2;
+ ipd.cp = bp;
+ ipd.len = length;
+ ipd.off = 0;
+ ipd.nh = nh;
+ ipd.advance = 0;
+
+ ip_print_demux(ndo, &ipd);
+}
+
/*
* print an IP datagram.
struct ip_print_demux_state ipd;
struct ip_print_demux_state *ipds=&ipd;
const u_char *ipend;
+ u_int hlen;
u_int16_t sum, ip_sum;
struct protoent *proto;
(void)printf("truncated-ip %u", length);
return;
}
- ipds->hlen = IP_HL(ipds->ip) * 4;
- if (ipds->hlen < sizeof (struct ip)) {
- (void)printf("bad-hlen %u", ipds->hlen);
+ hlen = IP_HL(ipds->ip) * 4;
+ if (hlen < sizeof (struct ip)) {
+ (void)printf("bad-hlen %u", hlen);
return;
}
if (length < ipds->len)
(void)printf("truncated-ip - %u bytes missing! ",
ipds->len - length);
- if (ipds->len < ipds->hlen) {
+ if (ipds->len < hlen) {
#ifdef GUESS_TSO
if (ipds->len) {
(void)printf("bad-len %u", ipds->len);
if (ipend < snapend)
snapend = ipend;
- ipds->len -= ipds->hlen;
+ ipds->len -= hlen;
ipds->off = EXTRACT_16BITS(&ipds->ip->ip_off);
(void)printf(", length: %u", EXTRACT_16BITS(&ipds->ip->ip_len));
- if ((ipds->hlen - sizeof(struct ip)) > 0) {
+ if ((hlen - sizeof(struct ip)) > 0) {
printf(", options ( ");
- ip_optprint((u_char *)(ipds->ip + 1), ipds->hlen - sizeof(struct ip));
+ ip_optprint((u_char *)(ipds->ip + 1), hlen - sizeof(struct ip));
printf(" )");
}
- if ((u_char *)ipds->ip + ipds->hlen <= snapend) {
- sum = in_cksum((const u_short *)ipds->ip, ipds->hlen, 0);
+ if ((u_char *)ipds->ip + hlen <= snapend) {
+ sum = in_cksum((const u_short *)ipds->ip, hlen, 0);
if (sum != 0) {
ip_sum = EXTRACT_16BITS(&ipds->ip->ip_sum);
(void)printf(", bad cksum %x (->%x)!", ip_sum,
* level protocol.
*/
if ((ipds->off & 0x1fff) == 0) {
- ipds->cp = (const u_char *)ipds->ip + ipds->hlen;
+ ipds->cp = (const u_char *)ipds->ip + hlen;
ipds->nh = ipds->ip->ip_p;
if (ipds->nh != IPPROTO_TCP && ipds->nh != IPPROTO_UDP &&
- ipds->nh != IPPROTO_SCTP) {
+ ipds->nh != IPPROTO_SCTP && ipds->nh != IPPROTO_DCCP) {
(void)printf("%s > %s: ",
ipaddr_string(&ipds->ip->ip_src),
ipaddr_string(&ipds->ip->ip_dst));
}
}
+/*
+ * Local Variables:
+ * c-style: whitesmith
+ * c-basic-offset: 8
+ * End:
+ */