+ nh = ip->ip_p;
+
+ if (nh != IPPROTO_TCP && nh != IPPROTO_UDP) {
+ (void)printf("%s > %s: ", ipaddr_string(&ip->ip_src),
+ ipaddr_string(&ip->ip_dst));
+ }
+again:
+ switch (nh) {
+
+ case IPPROTO_AH:
+ nh = *cp;
+ advance = ah_print(cp, (const u_char *)ip);
+ cp += advance;
+ len -= advance;
+ goto again;
+
+ case IPPROTO_ESP:
+ {
+ int enh;
+ advance = esp_print(cp, (const u_char *)ip, &enh);
+ cp += advance;
+ len -= advance;
+ if (enh < 0)
+ break;
+ nh = enh & 0xff;
+ goto again;
+ }
+
+#ifndef IPPROTO_IPCOMP
+#define IPPROTO_IPCOMP 108
+#endif
+ case IPPROTO_IPCOMP:
+ {
+ int enh;
+ advance = ipcomp_print(cp, (const u_char *)ip, &enh);
+ cp += advance;
+ len -= advance;
+ if (enh < 0)
+ break;
+ nh = enh & 0xff;
+ goto again;
+ }