- udpipaddr_print(ip, sport, dport);
-
- if (IP_V(ip) == 4 && (vflag > 1) && !Kflag && !fragmented) {
- int sum = up->uh_sum;
- if (sum == 0) {
- (void)printf("[no cksum] ");
- } else if (TTEST2(cp[0], length)) {
- sum = udp_cksum(ip, up, length + sizeof(struct udphdr));
- if (sum != 0)
- (void)printf("[bad udp cksum %x!] ", sum);
- else
- (void)printf("[udp sum ok] ");
+
+ if (ndo->ndo_vflag && !ndo->ndo_Kflag && !fragmented) {
+ /* 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)) {
+ udp_sum = EXTRACT_16BITS(&up->uh_sum);
+ if (udp_sum == 0) {
+ ND_PRINT((ndo, "[no cksum] "));
+ } else if (ND_TTEST2(cp[0], length)) {
+ sum = udp_cksum(ndo, ip, up, length + sizeof(struct udphdr));
+
+ if (sum != 0) {
+ ND_PRINT((ndo, "[bad udp cksum 0x%04x -> 0x%04x!] ",
+ udp_sum,
+ in_cksum_shouldbe(udp_sum, sum)));
+ } else
+ ND_PRINT((ndo, "[udp sum ok] "));
+ }