|
|
1.1 root 1: /* udp_output.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: #define IPPROTO_UDP 17
13: #define UDP_DATA_LEN (1500-sizeof(struct udpiphdr))
14:
15: /*
16: * send out list data,
17: * as a UDP packet
18: * allocate, prepend, and fill in UDP headers here
19: */
20: udp_output(data, udp)
21: register struct block *data;
22: register struct udp *udp;
23: {
24: register struct block *head;
25: register struct udpiphdr *ui;
26: register int len;
27:
28: len = bp_len(data);
29: if ((head = allocb(sizeof(struct udpiphdr))) == NULL) {
30: bp_free(data);
31: return;
32: }
33: if (head == data) panic("udp_output");
34: head->wptr += sizeof(struct udpiphdr);
35: head->next = data;
36: /*
37: * Fill in block with extended UDP header
38: * and addresses and length put into network format.
39: */
40: ui = (struct udpiphdr *)head->rptr;
41: ui->ui_next = 0;
42: ui->ui_bp = 0;
43: ui->ui_x1 = 0;
44: ui->ui_pr = IPPROTO_UDP;
45: ui->ui_len = (u_short)len + sizeof (struct udphdr);
46: ui->ui_len = htons((u_short)(ui->ui_len));
47: ui->ui_src = htonl(udp->src);
48: ui->ui_dst = htonl(udp->dst);
49: ui->ui_sport = htons(udp->sport);
50: ui->ui_dport = htons(udp->dport);
51: ui->ui_ulen = ui->ui_len;
52:
53: /* Stuff checksum and output datagram. */
54: ui->ui_sum = 0;
55: if ((ui->ui_sum = in_cksum(head, sizeof(struct udpiphdr)+len)) == 0)
56: ui->ui_sum = -1;
57:
58:
59: /* Put length and timeout time into the `real' ip header. */
60: ((struct ip *)ui)->ip_len = sizeof(struct udpiphdr)+len;
61: ((struct ip *)ui)->ip_ttl = MAXTTL;
62:
63: /* Ip expects internet addresses in host order. */
64: ui->ui_src = ntohl(ui->ui_src);
65: ui->ui_dst = ntohl(ui->ui_dst);
66: udp_ldout(head);
67: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.