-/* udp_usrreq.c 4.14 81/12/03 */
+/* udp_usrreq.c 4.18 81/12/23 */
#include "../h/param.h"
#include "../h/dir.h"
COUNT(UDP_INPUT);
/*
- * Get ip and udp header together in first mbuf.
+ * Get IP and UDP header together in first mbuf.
*/
m = m0;
- if (m->m_len < sizeof (struct udpiphdr) &&
- m_pullup(m, sizeof (struct udpiphdr)) == 0) {
+ if ((m->m_off > MMAXOFF || m->m_len < sizeof (struct udpiphdr)) &&
+ (m = m_pullup(m, sizeof (struct udpiphdr))) == 0) {
udpstat.udps_hdrops++;
- goto bad;
+ return;
}
ui = mtod(m, struct udpiphdr *);
- if (ui->ui_len > sizeof (struct ip))
- ip_stripoptions((struct ip *)ui, (char *)0);
+ if (((struct ip *)ui)->ip_hl > (sizeof (struct ip) >> 2))
+ ip_stripoptions((struct ip *)ui, (struct mbuf *)0);
/*
- * Make mbuf data length reflect udp length.
- * If not enough data to reflect udp length, drop.
+ * Make mbuf data length reflect UDP length.
+ * If not enough data to reflect UDP length, drop.
*/
ulen = ntohs((u_short)ui->ui_ulen);
- len = sizeof (struct udpiphdr) + ulen;
+ len = sizeof (struct udphdr) + ulen;
if (((struct ip *)ui)->ip_len != len) {
if (len > ((struct ip *)ui)->ip_len) {
udpstat.udps_badlen++;
}
/*
- * Checksum extended udp header and data.
+ * Checksum extended UDP header and data.
*/
if (udpcksum) {
ui->ui_next = ui->ui_prev = 0;
ui->ui_x1 = 0;
- ui->ui_len = htons((u_short)(sizeof (struct udpiphdr) + ulen));
- if ((ui->ui_sum = in_cksum(m, len)) != 0xffff) {
+ ui->ui_len = htons((u_short)(sizeof (struct udphdr) + ulen));
+ if (ui->ui_sum = in_cksum(m, len)) {
udpstat.udps_badsum++;
printf("udp cksum %x\n", ui->ui_sum);
m_freem(m);
}
/*
- * Convert addresses and ports to host format.
* Locate pcb for datagram.
*/
inp = in_pcblookup(&udb,
{
COUNT(UDP_CTLINPUT);
- printf("udp_ctlinput\n");
m_freem(m);
}
-/*ARGSUSED*/
udp_output(inp, m0)
struct inpcb *inp;
struct mbuf *m0;
COUNT(UDP_OUTPUT);
/*
* Calculate data length and get a mbuf
- * for udp and ip headers.
+ * for UDP and IP headers.
*/
for (m = m0; m; m = m->m_next)
len += m->m_len;
goto bad;
/*
- * Fill in mbuf with extended udp header
+ * Fill in mbuf with extended UDP header
* and addresses and length put into network format.
*/
m->m_off = MMAXOFF - sizeof (struct udpiphdr);
m_freem(m);
}
-/*ARGSUSED*/
udp_usrreq(so, req, m, addr)
struct socket *so;
int req;