+COUNT(UDP_OUTPUT);
+ /*
+ * Calculate data length and get a mbuf
+ * for udp and ip headers.
+ */
+ for (m = m0; m; m = m->m_next)
+ len += m->m_len;
+ m = m_get(0);
+ if (m == 0)
+ goto bad;
+
+ /*
+ * Fill in mbuf with extended udp header
+ * and addresses and length put into network format.
+ */
+ m->m_off = MMAXOFF - sizeof (struct udpiphdr);
+ m->m_len = sizeof (struct udpiphdr);
+ m->m_next = m0;
+ ui = mtod(m, struct udpiphdr *);
+ ui->ui_next = ui->ui_prev = 0;
+ ui->ui_x1 = 0;
+ ui->ui_pr = IPPROTO_UDP;
+ ui->ui_len = sizeof (struct udpiphdr) + len;
+ ui->ui_src = inp->inp_laddr;
+ ui->ui_dst = inp->inp_faddr;
+ ui->ui_sport = inp->inp_lport;
+ ui->ui_dport = inp->inp_fport;
+ ui->ui_ulen = htons((u_short)len);
+
+ /*
+ * Stuff checksum and output datagram.
+ */
+ ui->ui_sum = 0;
+ ui->ui_sum = in_cksum(m, sizeof (struct udpiphdr) + len);
+ ((struct ip *)ui)->ip_len = sizeof (struct udpiphdr) + len;
+ ((struct ip *)ui)->ip_ttl = MAXTTL;
+ ip_output(m, (struct mbuf *)0);
+ return;
+bad:
+ m_freem(m);