X-Git-Url: https://git.tcpdump.org/tcpdump/blobdiff_plain/0f9428904ade10d6cf116e00b4bcc63e233b0a79..b5068d5380c73e02bc35a96f641cad18d9b03f3d:/print-udp.c diff --git a/print-udp.c b/print-udp.c index 231d8b4f..b5254f0c 100644 --- a/print-udp.c +++ b/print-udp.c @@ -389,7 +389,8 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, const struct ip *ip; const u_char *cp; const u_char *ep = ndo->ndo_snapend; - uint16_t sport, dport, ulen; + uint16_t sport, dport; + u_int ulen; const struct ip6_hdr *ip6; ndo->ndo_protocol = "udp"; @@ -417,6 +418,13 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, goto trunc; } ulen = GET_BE_U_2(up->uh_ulen); + /* + * IPv6 Jumbo Datagrams; see RFC 2675. + * If the length is zero, and the length provided to us is + * > 65535, use the provided length as the length. + */ + if (ulen == 0 && length > 65535) + ulen = length; if (ulen < sizeof(struct udphdr)) { udpipaddr_print(ndo, ip, sport, dport); ND_PRINT("truncated-udplength %u", ulen); @@ -512,6 +520,18 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, udpipaddr_print(ndo, ip, sport, dport); lmp_print(ndo, cp, length); break; + case PT_PTP: + udpipaddr_print(ndo, ip, sport, dport); + ptp_print(ndo, cp, length); + break; + case PT_SOMEIP: + udpipaddr_print(ndo, ip, sport, dport); + someip_print(ndo, cp, length); + break; + case PT_DOMAIN: + udpipaddr_print(ndo, ip, sport, dport); + domain_print(ndo, (const u_char *)(up + 1), length, 0); + break; } return; } @@ -548,14 +568,14 @@ 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)) { + if (IP_V(ip) == 4 && (ndo->ndo_vflag > 1)) { ND_TCHECK_2(up->uh_sum); udp_sum = GET_BE_U_2(up->uh_sum); if (udp_sum == 0) { @@ -563,7 +583,7 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, } 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)); @@ -571,14 +591,14 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, ND_PRINT("[udp sum ok] "); } } - else if (IP_V(ip) == 6 && ip6->ip6_plen) { + 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)); @@ -604,11 +624,11 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int 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)) + 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)) + 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)) + 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); @@ -671,32 +691,34 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, (IP_V(ip) == 6) ? 1 : 0); else if (IS_SRC_OR_DST_PORT(MPLS_LSP_PING_PORT)) lspping_print(ndo, (const u_char *)(up + 1), length); + else if (sport == BCM_LI_PORT) + bcm_li_print(ndo, (const u_char *)(up+1), 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)) + else if (IS_SRC_OR_DST_PORT(LMP_PORT)) lmp_print(ndo, (const u_char *)(up + 1), length); 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) + 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)) + 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)) + 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)) + 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)) + 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)) + else if (IS_SRC_OR_DST_PORT(GENEVE_PORT)) geneve_print(ndo, (const u_char *)(up + 1), length); else if (IS_SRC_OR_DST_PORT(LISP_CONTROL_PORT)) lisp_print(ndo, (const u_char *)(up + 1), length); @@ -704,13 +726,20 @@ udp_print(netdissect_options *ndo, const u_char *bp, u_int length, vxlan_gpe_print(ndo, (const u_char *)(up + 1), length); else if (IS_SRC_OR_DST_PORT(ZEP_PORT)) zep_print(ndo, (const u_char *)(up + 1), length); + else if (IS_SRC_OR_DST_PORT(MPLS_PORT)) + mpls_print(ndo, (const u_char *)(up + 1), 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 { + } 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) ND_PRINT("UDP, bad length %u > %u", ulen, length);