|
|
1.1 root 1: /* udp_input.c 6.1 83/07/29 */
2:
3: #include "sys/param.h"
4: #include "sys/stream.h"
5:
6: #include "sys/inet/in.h"
7: #include "sys/inet/ip.h"
8: #include "sys/inet/ip_var.h"
9: #include "sys/inet/udp.h"
10: #include "sys/inet/udp_var.h"
11:
12: int udpcksum = 0;
13:
14: /*
15: * UDP input routine
16: */
17: udp_input(bp)
18: struct block *bp;
19: {
20: register struct udpiphdr *ui;
21: register struct block *head;
22: int len, ulen;
23:
24: /*
25: * Get IP and UDP header together in first block.
26: * Note: IP leaves IP header in first block.
27: */
28: ui = (struct udpiphdr *)bp->rptr;
29: /*
30: * must strip options so udpiphdr is in the right place
31: */
32: if (((struct ip *)ui)->ip_hl > (sizeof (struct ip) >> 2))
33: ip_stripoptions(bp, (struct block *)0);
34:
35: if (BLEN(bp) < sizeof (struct udpiphdr)) {
36: if ((bp = bp_pullup(bp, sizeof (struct udpiphdr))) == 0) {
37: udpstat.udps_hdrops++;
38: return;
39: }
40: ui = (struct udpiphdr *)bp->rptr;
41: }
42:
43: /*
44: * Checksum extended UDP header and data.
45: */
46: ulen = ((struct ip *)ui)->ip_len;
47: len = sizeof (struct ip) + ulen;
48: ui->ui_src = htonl(ui->ui_src);
49: ui->ui_dst = htonl(ui->ui_dst);
50: if (udpcksum) {
51: ui->ui_next = 0;
52: ui->ui_x1 = 0;
53: ui->ui_len = htons((u_short)ulen);
54: if (ui->ui_sum = in_cksum(bp, len)) {
55: printf("udp_cksum: sum %x len %d src %x\n", ui->ui_sum,
56: len, ui->ui_src);
57: udpstat.udps_badsum++;
58: bp_free(bp);
59: return;
60: }
61: }
62: udpstat.udps_ipackets++;
63:
64: /*
65: * Drop UDP and IP headers.
66: */
67: bp->rptr += sizeof(struct udpiphdr);
68:
69: /*
70: * adjust size to reflect length
71: * find end of queue and adjust wptr accordingly
72: */
73: head = bp;
74: len = 0;
75: /*
76: * ulen is length of udphdr+data. since we've already shortened first buffer
77: * by sizeof(udpiphdr), shorten ulen by sizeof(udphdr)
78: */
79: ulen -= sizeof(struct udphdr);
80: while(bp) {
81: len += bp->wptr - bp->rptr;
82: if (len > ulen) {
83: bp->wptr -= len-ulen;
84: bp_free(bp->next);
85: bp->next = 0;
86: }
87: bp = bp->next;
88: }
89:
90: /*
91: * Convert UDP protocol specific fields to host format.
92: */
93: ui->ui_src = ntohl(ui->ui_src);
94: ui->ui_dst = ntohl(ui->ui_dst);
95: ui->ui_sport = ntohs(ui->ui_sport);
96: ui->ui_dport = ntohs(ui->ui_dport);
97:
98: udpdrint(head, ui);
99: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.