/* Dump a UDP header */ void udp_dump(unsigned char *data, int length, int hexdump) { int hdr_length; int source; int dest; hdr_length = get16(data + 4); source = get16(data + 0); dest = get16(data + 2); lprintf(T_PROTOCOL, "UDP:"); lprintf(T_TCPHDR, " len %d %s->", hdr_length, servname(source, "udp")); lprintf(T_TCPHDR, "%s", servname(dest, "udp")); if (hdr_length > UDPHDR) { length -= UDPHDR; data += UDPHDR; switch (dest) { case RIP_PORT: lprintf(T_TCPHDR, "\n"); rip_dump(data, length); break; default: lprintf(T_TCPHDR, " Data %d\n", length); data_dump(data, length, hexdump); break; } } }
/* Dump a UDP header */ void udp_dump( FILE *fp, struct mbuf **bpp, int32 source,int32 dest, int check) /* If 0, bypass checksum verify */ { struct udp udp; struct pseudo_header ph; uint csum; if(bpp == NULL || *bpp == NULL) return; fprintf(fp,"UDP:"); /* Compute checksum */ ph.source = source; ph.dest = dest; ph.protocol = UDP_PTCL; ph.length = len_p(*bpp); if((csum = cksum(&ph,*bpp,ph.length)) == 0) check = 0; /* No checksum error */ ntohudp(&udp,bpp); fprintf(fp," len %u",udp.length); fprintf(fp," %u->%u",udp.source,udp.dest); if(udp.length > UDPHDR) fprintf(fp," Data %u",udp.length - UDPHDR); if(udp.checksum == 0) check = 0; if(check) fprintf(fp," CHECKSUM ERROR (%u)",csum); putc('\n',fp); switch(udp.dest){ case IPPORT_RIP: rip_dump(fp,bpp); } }