+ register struct mbuf *m;
+ register struct udpiphdr *ui;
+ register struct socket *so;
+ register int len = 0;
+ register struct route *ro;
+
+ /*
+ * Calculate data length and get a mbuf
+ * for UDP and IP headers.
+ */
+ for (m = m0; m; m = m->m_next)
+ len += m->m_len;
+ MGET(m, M_DONTWAIT, MT_HEADER);
+ if (m == 0) {
+ m_freem(m0);
+ return (ENOBUFS);
+ }
+
+ /*
+ * 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 = htons((u_short)len + sizeof (struct udphdr));
+ 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 = ui->ui_len;