X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/246ca110d152b6483fd8c1c176a570858307f76b..296d466cd6bbf2f7e75e15bb6a01268e88c76ed0:/print-udp.c diff --git a/print-udp.c b/print-udp.c index 9cde3d89..26371f04 100644 --- a/print-udp.c +++ b/print-udp.c @@ -21,9 +21,7 @@ /* \summary: UDP printer */ -#ifdef HAVE_CONFIG_H #include -#endif #include "netdissect-stdinc.h" @@ -81,19 +79,19 @@ struct rtcp_rr { #define RTCP_PT_SR 200 #define RTCP_PT_RR 201 #define RTCP_PT_SDES 202 -#define RTCP_SDES_CNAME 1 -#define RTCP_SDES_NAME 2 -#define RTCP_SDES_EMAIL 3 -#define RTCP_SDES_PHONE 4 -#define RTCP_SDES_LOC 5 -#define RTCP_SDES_TOOL 6 -#define RTCP_SDES_NOTE 7 -#define RTCP_SDES_PRIV 8 +#define RTCP_SDES_CNAME 1 +#define RTCP_SDES_NAME 2 +#define RTCP_SDES_EMAIL 3 +#define RTCP_SDES_PHONE 4 +#define RTCP_SDES_LOC 5 +#define RTCP_SDES_TOOL 6 +#define RTCP_SDES_NOTE 7 +#define RTCP_SDES_PRIV 8 #define RTCP_PT_BYE 203 #define RTCP_PT_APP 204 static void -vat_print(netdissect_options *ndo, const void *hdr, u_int length) +vat_print(netdissect_options *ndo, const u_char *hdr, u_int length) { /* vat/vt audio */ u_int ts; @@ -103,7 +101,6 @@ vat_print(netdissect_options *ndo, const void *hdr, u_int length) ND_PRINT("udp/va/vat, length %u < 2", length); return; } - ND_TCHECK_2((const u_int *)hdr); ts = GET_BE_U_2(hdr); if ((ts & 0xf060) != 0) { /* probably vt */ @@ -118,9 +115,7 @@ vat_print(netdissect_options *ndo, const void *hdr, u_int length) ND_PRINT("udp/vat, length %u < 8", length); return; } - ND_TCHECK_4(&((const u_int *)hdr)[0]); i0 = GET_BE_U_4(&((const u_int *)hdr)[0]); - ND_TCHECK_4(&((const u_int *)hdr)[1]); i1 = GET_BE_U_4(&((const u_int *)hdr)[1]); ND_PRINT("udp/vat %u c%u %u%s", length - 8, @@ -132,14 +127,10 @@ vat_print(netdissect_options *ndo, const void *hdr, u_int length) if (i0 & 0x3f000000) ND_PRINT(" s%u", (i0 >> 24) & 0x3f); } - return; - -trunc: - nd_print_trunc(ndo); } static void -rtp_print(netdissect_options *ndo, const void *hdr, u_int len) +rtp_print(netdissect_options *ndo, const u_char *hdr, u_int len) { /* rtp v1 or v2 */ const u_int *ip = (const u_int *)hdr; @@ -152,9 +143,7 @@ rtp_print(netdissect_options *ndo, const void *hdr, u_int len) ND_PRINT("udp/rtp, length %u < 8", len); return; } - ND_TCHECK_4(&((const u_int *)hdr)[0]); i0 = GET_BE_U_4(&((const u_int *)hdr)[0]); - ND_TCHECK_4(&((const u_int *)hdr)[1]); i1 = GET_BE_U_4(&((const u_int *)hdr)[1]); dlen = len - 8; ip += 2; @@ -191,12 +180,10 @@ rtp_print(netdissect_options *ndo, const void *hdr, u_int len) i0 & 0xffff, i1); if (ndo->ndo_vflag) { - ND_TCHECK_4(&((const u_int *)hdr)[2]); ND_PRINT(" %u", GET_BE_U_4(&((const u_int *)hdr)[2])); if (hasopt) { u_int i2, optlen; do { - ND_TCHECK_4(ip); i2 = GET_BE_U_4(ip); optlen = (i2 >> 16) & 0xff; if (optlen == 0 || optlen > len) { @@ -209,7 +196,6 @@ rtp_print(netdissect_options *ndo, const void *hdr, u_int len) } if (hasext) { u_int i2, extlen; - ND_TCHECK_4(ip); i2 = GET_BE_U_4(ip); extlen = (i2 & 0xffff) + 1; if (extlen > len) { @@ -218,14 +204,9 @@ rtp_print(netdissect_options *ndo, const void *hdr, u_int len) } ip += extlen; } - ND_TCHECK_4(ip); if (contype == 0x1f) /*XXX H.261 */ ND_PRINT(" 0x%04x", GET_BE_U_4(ip) >> 16); } - return; - -trunc: - nd_print_trunc(ndo); } static const u_char * @@ -260,7 +241,7 @@ rtcp_print(netdissect_options *ndo, const u_char *hdr, const u_char *ep) ND_TCHECK_SIZE(sr); ts = (double)(GET_BE_U_4(sr->sr_ntp.upper)) + ((double)(GET_BE_U_4(sr->sr_ntp.lower)) / - 4294967296.0); + FMAXINT); ND_PRINT(" @%.2f %u %up %ub", ts, GET_BE_U_4(sr->sr_ts), GET_BE_U_4(sr->sr_np), GET_BE_U_4(sr->sr_nb)); rr = (const struct rtcp_rr *)(sr + 1); @@ -342,13 +323,13 @@ udpipaddr_print(netdissect_options *ndo, const struct ip *ip, int sport, int dpo if (GET_U_1(ip6->ip6_nxt) == IPPROTO_UDP) { if (sport == -1) { ND_PRINT("%s > %s: ", - ip6addr_string(ndo, ip6->ip6_src), - ip6addr_string(ndo, ip6->ip6_dst)); + GET_IP6ADDR_STRING(ip6->ip6_src), + GET_IP6ADDR_STRING(ip6->ip6_dst)); } else { ND_PRINT("%s.%s > %s.%s: ", - ip6addr_string(ndo, ip6->ip6_src), + GET_IP6ADDR_STRING(ip6->ip6_src), udpport_string(ndo, (uint16_t)sport), - ip6addr_string(ndo, ip6->ip6_dst), + GET_IP6ADDR_STRING(ip6->ip6_dst), udpport_string(ndo, (uint16_t)dport)); } } else { @@ -362,13 +343,13 @@ udpipaddr_print(netdissect_options *ndo, const struct ip *ip, int sport, int dpo if (GET_U_1(ip->ip_p) == IPPROTO_UDP) { if (sport == -1) { ND_PRINT("%s > %s: ", - ipaddr_string(ndo, ip->ip_src), - ipaddr_string(ndo, ip->ip_dst)); + GET_IPADDR_STRING(ip->ip_src), + GET_IPADDR_STRING(ip->ip_dst)); } else { ND_PRINT("%s.%s > %s.%s: ", - ipaddr_string(ndo, ip->ip_src), + GET_IPADDR_STRING(ip->ip_src), udpport_string(ndo, (uint16_t)sport), - ipaddr_string(ndo, ip->ip_dst), + GET_IPADDR_STRING(ip->ip_dst), udpport_string(ndo, (uint16_t)dport)); } } else { @@ -449,17 +430,16 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, case PT_VAT: udpipaddr_print(ndo, ip, sport, dport); - vat_print(ndo, (const void *)(up + 1), length); + vat_print(ndo, cp, length); break; case PT_WB: udpipaddr_print(ndo, ip, sport, dport); - wb_print(ndo, (const u_char *)(up + 1), length); + wb_print(ndo, cp, length); break; case PT_RPC: - rp = (const struct sunrpc_msg *)(up + 1); - ND_TCHECK_4(rp->rm_direction); + rp = (const struct sunrpc_msg *)cp; direction = (enum sunrpc_msg_type) GET_BE_U_4(rp->rm_direction); if (direction == SUNRPC_CALL) sunrpc_print(ndo, (const u_char *)rp, length, @@ -471,7 +451,7 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, case PT_RTP: udpipaddr_print(ndo, ip, sport, dport); - rtp_print(ndo, (const void *)(up + 1), length); + rtp_print(ndo, cp, length); break; case PT_RTCP: @@ -482,7 +462,7 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, case PT_SNMP: udpipaddr_print(ndo, ip, sport, dport); - snmp_print(ndo, (const u_char *)(up + 1), length); + snmp_print(ndo, cp, length); break; case PT_CNFP: @@ -497,8 +477,7 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, case PT_AODV: udpipaddr_print(ndo, ip, sport, dport); - aodv_print(ndo, (const u_char *)(up + 1), length, - ip6 != NULL); + aodv_print(ndo, cp, length, IP_V(ip) == 6); break; case PT_RADIUS: @@ -508,7 +487,7 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, case PT_VXLAN: udpipaddr_print(ndo, ip, sport, dport); - vxlan_print(ndo, (const u_char *)(up + 1), length); + vxlan_print(ndo, cp, length); break; case PT_PGM: @@ -528,6 +507,11 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, udpipaddr_print(ndo, ip, sport, dport); someip_print(ndo, cp, length); break; + case PT_DOMAIN: + udpipaddr_print(ndo, ip, sport, dport); + /* over_tcp: FALSE, is_mdns: FALSE */ + domain_print(ndo, cp, length, FALSE, FALSE); + break; } return; } @@ -537,7 +521,7 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, const struct sunrpc_msg *rp; enum sunrpc_msg_type direction; - rp = (const struct sunrpc_msg *)(up + 1); + rp = (const struct sunrpc_msg *)cp; if (ND_TTEST_4(rp->rm_direction)) { direction = (enum sunrpc_msg_type) GET_BE_U_4(rp->rm_direction); if (dport == NFS_PORT && direction == SUNRPC_CALL) { @@ -564,37 +548,34 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, } if (ndo->ndo_vflag && !ndo->ndo_Kflag && !fragmented) { - /* Check the checksum, if possible. */ - uint16_t sum, udp_sum; + /* Check the checksum, if possible. */ + uint16_t sum, udp_sum; /* * XXX - do this even if vflag == 1? * TCP does, and we do so for UDP-over-IPv6. */ - if (IP_V(ip) == 4 && (ndo->ndo_vflag > 1)) { - ND_TCHECK_2(up->uh_sum); + if (IP_V(ip) == 4 && (ndo->ndo_vflag > 1)) { udp_sum = GET_BE_U_2(up->uh_sum); if (udp_sum == 0) { ND_PRINT("[no cksum] "); } else if (ND_TTEST_LEN(cp, length)) { sum = udp_cksum(ndo, ip, up, length + sizeof(struct udphdr)); - if (sum != 0) { + if (sum != 0) { ND_PRINT("[bad udp cksum 0x%04x -> 0x%04x!] ", udp_sum, in_cksum_shouldbe(udp_sum, sum)); } else ND_PRINT("[udp sum ok] "); } - } - else if (IP_V(ip) == 6) { + } else if (IP_V(ip) == 6) { /* for IPv6, UDP checksum is mandatory */ if (ND_TTEST_LEN(cp, length)) { sum = udp6_cksum(ndo, ip6, up, length + sizeof(struct udphdr)); - ND_TCHECK_2(up->uh_sum); udp_sum = GET_BE_U_2(up->uh_sum); - if (sum != 0) { + if (sum != 0) { ND_PRINT("[bad udp cksum 0x%04x -> 0x%04x!] ", udp_sum, in_cksum_shouldbe(udp_sum, sum)); @@ -606,142 +587,149 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, if (!ndo->ndo_qflag) { if (IS_SRC_OR_DST_PORT(NAMESERVER_PORT)) - domain_print(ndo, (const u_char *)(up + 1), length, 0); - else if (IS_SRC_OR_DST_PORT(MULTICASTDNS_PORT)) - domain_print(ndo, (const u_char *)(up + 1), length, 1); - else if (IS_SRC_OR_DST_PORT(TIMED_PORT)) - timed_print(ndo, (const u_char *)(up + 1)); + /* over_tcp: FALSE, is_mdns: FALSE */ + domain_print(ndo, cp, length, FALSE, FALSE); + else if (IS_SRC_OR_DST_PORT(BOOTPC_PORT) || + IS_SRC_OR_DST_PORT(BOOTPS_PORT)) + bootp_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(TFTP_PORT)) - tftp_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(BOOTPC_PORT) || IS_SRC_OR_DST_PORT(BOOTPS_PORT)) - bootp_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(RIP_PORT)) - rip_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(AODV_PORT)) - aodv_print(ndo, (const u_char *)(up + 1), length, - ip6 != NULL); - else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT)) - isakmp_print(ndo, (const u_char *)(up + 1), length, bp2); - else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_NATT)) - isakmp_rfc3948_print(ndo, (const u_char *)(up + 1), length, bp2, IP_V(ip), fragmented, ttl_hl); - else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER1) || IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER2)) - isakmp_print(ndo, (const u_char *)(up + 1), length, bp2); - else if (IS_SRC_OR_DST_PORT(SNMP_PORT) || IS_SRC_OR_DST_PORT(SNMPTRAP_PORT)) - snmp_print(ndo, (const u_char *)(up + 1), length); + tftp_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(KERBEROS_PORT)) + krb_print(ndo, (const u_char *)cp); else if (IS_SRC_OR_DST_PORT(NTP_PORT)) - ntp_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(KERBEROS_PORT) || IS_SRC_OR_DST_PORT(KERBEROS_SEC_PORT)) - krb_print(ndo, (const u_char *)(up + 1)); - else if (IS_SRC_OR_DST_PORT(L2TP_PORT)) - l2tp_print(ndo, (const u_char *)(up + 1), length); + ntp_print(ndo, cp, length); #ifdef ENABLE_SMB else if (IS_SRC_OR_DST_PORT(NETBIOS_NS_PORT)) - nbt_udp137_print(ndo, (const u_char *)(up + 1), length); + nbt_udp137_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(NETBIOS_DGRAM_PORT)) - nbt_udp138_print(ndo, (const u_char *)(up + 1), length); + nbt_udp138_print(ndo, cp, length); #endif + else if (IS_SRC_OR_DST_PORT(SNMP_PORT) || + IS_SRC_OR_DST_PORT(SNMPTRAP_PORT)) + snmp_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(PTP_EVENT_PORT) || + IS_SRC_OR_DST_PORT(PTP_GENERAL_PORT)) + ptp_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(CISCO_AUTORP_PORT)) + cisco_autorp_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT)) + isakmp_print(ndo, cp, length, bp2); + else if (IS_SRC_OR_DST_PORT(SYSLOG_PORT)) + syslog_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(RIP_PORT)) + rip_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(RIPNG_PORT)) + ripng_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(TIMED_PORT)) + timed_print(ndo, (const u_char *)cp); + else if (IS_SRC_OR_DST_PORT(DHCP6_SERV_PORT) || + IS_SRC_OR_DST_PORT(DHCP6_CLI_PORT)) + dhcp6_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(LDP_PORT)) + ldp_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(AODV_PORT)) + aodv_print(ndo, cp, length, IP_V(ip) == 6); + else if (IS_SRC_OR_DST_PORT(OLSR_PORT)) + olsr_print(ndo, cp, length, IP_V(ip) == 6); + else if (IS_SRC_OR_DST_PORT(LMP_PORT)) + lmp_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(KERBEROS_SEC_PORT)) + krb_print(ndo, (const u_char *)cp); + else if (IS_SRC_OR_DST_PORT(LWRES_PORT)) + lwres_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(MULTICASTDNS_PORT)) + /* over_tcp: FALSE, is_mdns: TRUE */ + domain_print(ndo, cp, length, FALSE, TRUE); + else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_NATT)) + isakmp_rfc3948_print(ndo, cp, length, bp2, IP_V(ip), fragmented, ttl_hl); + else if (IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER1) || IS_SRC_OR_DST_PORT(ISAKMP_PORT_USER2)) + isakmp_print(ndo, cp, length, bp2); + else if (IS_SRC_OR_DST_PORT(L2TP_PORT)) + l2tp_print(ndo, cp, length); else if (dport == VAT_PORT) - vat_print(ndo, (const void *)(up + 1), length); + vat_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(ZEPHYR_SRV_PORT) || IS_SRC_OR_DST_PORT(ZEPHYR_CLT_PORT)) - zephyr_print(ndo, (const u_char *)(up + 1), length); + zephyr_print(ndo, cp, length); /* * Since there are 10 possible ports to check, I think * a <> test would be more efficient */ else if ((sport >= RX_PORT_LOW && sport <= RX_PORT_HIGH) || (dport >= RX_PORT_LOW && dport <= RX_PORT_HIGH)) - rx_print(ndo, (const u_char *)(up + 1), length, sport, dport, + rx_print(ndo, cp, length, sport, dport, (const u_char *) ip); - else if (IS_SRC_OR_DST_PORT(RIPNG_PORT)) - ripng_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(DHCP6_SERV_PORT) || IS_SRC_OR_DST_PORT(DHCP6_CLI_PORT)) - dhcp6_print(ndo, (const u_char *)(up + 1), length); else if (IS_SRC_OR_DST_PORT(AHCP_PORT)) - ahcp_print(ndo, (const u_char *)(up + 1), length); + ahcp_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(BABEL_PORT) || IS_SRC_OR_DST_PORT(BABEL_PORT_OLD)) - babel_print(ndo, (const u_char *)(up + 1), length); + babel_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(HNCP_PORT)) - hncp_print(ndo, (const u_char *)(up + 1), length); + hncp_print(ndo, cp, length); /* * Kludge in test for whiteboard packets. */ else if (dport == WB_PORT) - wb_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(CISCO_AUTORP_PORT)) - cisco_autorp_print(ndo, (const u_char *)(up + 1), length); + wb_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(RADIUS_PORT) || IS_SRC_OR_DST_PORT(RADIUS_NEW_PORT) || IS_SRC_OR_DST_PORT(RADIUS_ACCOUNTING_PORT) || IS_SRC_OR_DST_PORT(RADIUS_NEW_ACCOUNTING_PORT) || IS_SRC_OR_DST_PORT(RADIUS_CISCO_COA_PORT) || IS_SRC_OR_DST_PORT(RADIUS_COA_PORT) ) - radius_print(ndo, (const u_char *)(up+1), length); + radius_print(ndo, cp, length); else if (dport == HSRP_PORT) - hsrp_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(LWRES_PORT)) - lwres_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(LDP_PORT)) - ldp_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(OLSR_PORT)) - olsr_print(ndo, (const u_char *)(up + 1), length, - (IP_V(ip) == 6) ? 1 : 0); + hsrp_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(MPLS_LSP_PING_PORT)) - lspping_print(ndo, (const u_char *)(up + 1), length); + lspping_print(ndo, cp, length); else if (dport == BFD_CONTROL_PORT || dport == BFD_MULTIHOP_PORT || dport == BFD_LAG_PORT || dport == BFD_ECHO_PORT ) - bfd_print(ndo, (const u_char *)(up+1), length, dport); - else if (IS_SRC_OR_DST_PORT(LMP_PORT)) - lmp_print(ndo, (const u_char *)(up + 1), length); + bfd_print(ndo, cp, length, dport); else if (IS_SRC_OR_DST_PORT(VQP_PORT)) - vqp_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(SFLOW_PORT)) - sflow_print(ndo, (const u_char *)(up + 1), length); - else if (dport == LWAPP_CONTROL_PORT) - lwapp_control_print(ndo, (const u_char *)(up + 1), length, 1); - else if (sport == LWAPP_CONTROL_PORT) - lwapp_control_print(ndo, (const u_char *)(up + 1), length, 0); - else if (IS_SRC_OR_DST_PORT(LWAPP_DATA_PORT)) - lwapp_data_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(SIP_PORT)) - sip_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(SYSLOG_PORT)) - syslog_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(OTV_PORT)) - otv_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(VXLAN_PORT)) - vxlan_print(ndo, (const u_char *)(up + 1), length); - else if (IS_SRC_OR_DST_PORT(GENEVE_PORT)) - geneve_print(ndo, (const u_char *)(up + 1), length); + vqp_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(SFLOW_PORT)) + sflow_print(ndo, cp, length); + else if (dport == LWAPP_CONTROL_PORT) + lwapp_control_print(ndo, cp, length, 1); + else if (sport == LWAPP_CONTROL_PORT) + lwapp_control_print(ndo, cp, length, 0); + else if (IS_SRC_OR_DST_PORT(LWAPP_DATA_PORT)) + lwapp_data_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(SIP_PORT)) + sip_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(OTV_PORT)) + otv_print(ndo, cp, length); + else if (IS_SRC_OR_DST_PORT(VXLAN_PORT)) + vxlan_print(ndo, cp, length); + else if (dport == GENEVE_PORT) + geneve_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(LISP_CONTROL_PORT)) - lisp_print(ndo, (const u_char *)(up + 1), length); + lisp_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(VXLAN_GPE_PORT)) - vxlan_gpe_print(ndo, (const u_char *)(up + 1), length); + vxlan_gpe_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(ZEP_PORT)) - zep_print(ndo, (const u_char *)(up + 1), length); + zep_print(ndo, cp, length); else if (IS_SRC_OR_DST_PORT(MPLS_PORT)) - mpls_print(ndo, (const u_char *)(up + 1), length); + mpls_print(ndo, cp, length); else if (ND_TTEST_1(((const struct LAP *)cp)->type) && GET_U_1(((const struct LAP *)cp)->type) == lapDDP && (atalk_port(sport) || atalk_port(dport))) { if (ndo->ndo_vflag) ND_PRINT("kip "); llap_print(ndo, cp, length); - } else if (IS_SRC_OR_DST_PORT(PTP_EVENT_PORT) || - IS_SRC_OR_DST_PORT(PTP_GENERAL_PORT)) { - ptp_print(ndo, cp, length); - } else if (IS_SRC_OR_DST_PORT(SOMEIP_PORT)) - someip_print(ndo, (const u_char *)(up + 1), length); - else { - if (ulen > length) + } else if (IS_SRC_OR_DST_PORT(SOMEIP_PORT)) + someip_print(ndo, cp, length); + else if (sport == BCM_LI_PORT) + bcm_li_print(ndo, cp, length); + else { + if (ulen > length && !fragmented) ND_PRINT("UDP, bad length %u > %u", ulen, length); else ND_PRINT("UDP, length %u", ulen); } } else { - if (ulen > length) + if (ulen > length && !fragmented) ND_PRINT("UDP, bad length %u > %u", ulen, length); else