bug fixes for hlen
[unix-history] / usr / src / sys / netinet / udp_usrreq.c
index 85ef543..922e4cb 100644 (file)
@@ -1,4 +1,4 @@
-/*     udp_usrreq.c    4.7     81/11/20        */
+/*     udp_usrreq.c    4.14    81/12/03        */
 
 #include "../h/param.h"
 #include "../h/dir.h"
 
 #include "../h/param.h"
 #include "../h/dir.h"
@@ -7,9 +7,9 @@
 #include "../h/protosw.h"
 #include "../h/socket.h"
 #include "../h/socketvar.h"
 #include "../h/protosw.h"
 #include "../h/socket.h"
 #include "../h/socketvar.h"
-#include "../net/inet.h"
-#include "../net/inet_pcb.h"
-#include "../net/inet_systm.h"
+#include "../net/in.h"
+#include "../net/in_pcb.h"
+#include "../net/in_systm.h"
 #include "../net/ip.h"
 #include "../net/ip_var.h"
 #include "../net/udp.h"
 #include "../net/ip.h"
 #include "../net/ip_var.h"
 #include "../net/udp.h"
@@ -22,6 +22,7 @@
 udp_init()
 {
 
 udp_init()
 {
 
+COUNT(UDP_INIT);
        udb.inp_next = udb.inp_prev = &udb;
 }
 
        udb.inp_next = udb.inp_prev = &udb;
 }
 
@@ -36,18 +37,19 @@ udp_input(m0)
        register struct mbuf *m;
        int len, ulen;
 
        register struct mbuf *m;
        int len, ulen;
 
+COUNT(UDP_INPUT);
        /*
         * Get ip and udp header together in first mbuf.
         */
        m = m0;
        /*
         * Get ip and udp header together in first mbuf.
         */
        m = m0;
-       ui = mtod(m, struct udpiphdr *);
-       if (ui->ui_len > sizeof (struct ip))
-               ip_stripoptions((struct ip *)ui, (char *)0);
        if (m->m_len < sizeof (struct udpiphdr) &&
            m_pullup(m, sizeof (struct udpiphdr)) == 0) {
                udpstat.udps_hdrops++;
                goto bad;
        }
        if (m->m_len < sizeof (struct udpiphdr) &&
            m_pullup(m, sizeof (struct udpiphdr)) == 0) {
                udpstat.udps_hdrops++;
                goto bad;
        }
+       ui = mtod(m, struct udpiphdr *);
+       if (ui->ui_len > sizeof (struct ip))
+               ip_stripoptions((struct ip *)ui, (char *)0);
 
        /*
         * Make mbuf data length reflect udp length.
 
        /*
         * Make mbuf data length reflect udp length.
@@ -71,7 +73,7 @@ udp_input(m0)
                ui->ui_next = ui->ui_prev = 0;
                ui->ui_x1 = 0;
                ui->ui_len = htons((u_short)(sizeof (struct udpiphdr) + ulen));
                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 = inet_cksum(m, len)) {
+               if ((ui->ui_sum = in_cksum(m, len)) != 0xffff) {
                        udpstat.udps_badsum++;
                        printf("udp cksum %x\n", ui->ui_sum);
                        m_freem(m);
                        udpstat.udps_badsum++;
                        printf("udp cksum %x\n", ui->ui_sum);
                        m_freem(m);
@@ -83,10 +85,6 @@ udp_input(m0)
         * Convert addresses and ports to host format.
         * Locate pcb for datagram.
         */
         * Convert addresses and ports to host format.
         * Locate pcb for datagram.
         */
-       ui->ui_src.s_addr = ntohl(ui->ui_src.s_addr);
-       ui->ui_dst.s_addr = ntohl(ui->ui_dst.s_addr);
-       ui->ui_sport = ntohs(ui->ui_sport);
-       ui->ui_dport = ntohs(ui->ui_dport);
        inp = in_pcblookup(&udb,
            ui->ui_src, ui->ui_sport, ui->ui_dst, ui->ui_dport);
        if (inp == 0)
        inp = in_pcblookup(&udb,
            ui->ui_src, ui->ui_sport, ui->ui_dst, ui->ui_dport);
        if (inp == 0)
@@ -98,8 +96,11 @@ udp_input(m0)
         */
        udp_in.sin_port = ui->ui_sport;
        udp_in.sin_addr = ui->ui_src;
         */
        udp_in.sin_port = ui->ui_sport;
        udp_in.sin_addr = ui->ui_src;
-       if (sbappendaddr(&inp->inp_socket->so_snd, (struct sockaddr *)&udp_in, m) == 0)
+       m->m_len -= sizeof (struct udpiphdr);
+       m->m_off += sizeof (struct udpiphdr);
+       if (sbappendaddr(&inp->inp_socket->so_rcv, (struct sockaddr *)&udp_in, m) == 0)
                goto bad;
                goto bad;
+       sorwakeup(inp->inp_socket);
        return;
 bad:
        m_freem(m);
        return;
 bad:
        m_freem(m);
@@ -109,6 +110,8 @@ udp_ctlinput(m)
        struct mbuf *m;
 {
 
        struct mbuf *m;
 {
 
+COUNT(UDP_CTLINPUT);
+       printf("udp_ctlinput\n");
        m_freem(m);
 }
 
        m_freem(m);
 }
 
@@ -121,6 +124,7 @@ udp_output(inp, m0)
        register struct udpiphdr *ui;
        register int len = 0;
 
        register struct udpiphdr *ui;
        register int len = 0;
 
+COUNT(UDP_OUTPUT);
        /*
         * Calculate data length and get a mbuf
         * for udp and ip headers.
        /*
         * Calculate data length and get a mbuf
         * for udp and ip headers.
@@ -142,19 +146,21 @@ udp_output(inp, m0)
        ui->ui_next = ui->ui_prev = 0;
        ui->ui_x1 = 0;
        ui->ui_pr = IPPROTO_UDP;
        ui->ui_next = ui->ui_prev = 0;
        ui->ui_x1 = 0;
        ui->ui_pr = IPPROTO_UDP;
-       ui->ui_len = htons((u_short)(sizeof (struct udphdr) + len));
-       ui->ui_src.s_addr = htonl(inp->inp_laddr.s_addr);
-       ui->ui_dst.s_addr = htonl(inp->inp_faddr.s_addr);
-       ui->ui_sport = htons(inp->inp_lport);
-       ui->ui_dport = htons(inp->inp_fport);
+       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_ulen = htons((u_short)len);
 
        /*
         * Stuff checksum and output datagram.
         */
        ui->ui_sum = 0;
-       ui->ui_sum = inet_cksum(m, sizeof (struct udpiphdr) + len);
-       ip_output(m);
+       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;
+       (void) ip_output(m, (struct mbuf *)0);
        return;
 bad:
        m_freem(m);
        return;
 bad:
        m_freem(m);
@@ -170,27 +176,29 @@ udp_usrreq(so, req, m, addr)
        struct inpcb *inp = sotoinpcb(so);
        int error;
 
        struct inpcb *inp = sotoinpcb(so);
        int error;
 
+COUNT(UDP_USRREQ);
+       if (inp == 0 && req != PRU_ATTACH)
+               return (EINVAL);
        switch (req) {
 
        case PRU_ATTACH:
                if (inp != 0)
                        return (EINVAL);
        switch (req) {
 
        case PRU_ATTACH:
                if (inp != 0)
                        return (EINVAL);
-               error = in_pcballoc(so, &udb, 2048, 2048, (struct sockaddr_in *)addr);
+               error = in_pcbattach(so, &udb, 2048, 2048, (struct sockaddr_in *)addr);
                if (error)
                        return (error);
                if (error)
                        return (error);
-               so->so_pcb = (caddr_t)inp;
                break;
 
        case PRU_DETACH:
                if (inp == 0)
                        return (ENOTCONN);
                break;
 
        case PRU_DETACH:
                if (inp == 0)
                        return (ENOTCONN);
-               in_pcbfree(inp);
+               in_pcbdetach(inp);
                break;
 
        case PRU_CONNECT:
                if (inp->inp_faddr.s_addr)
                        return (EISCONN);
                break;
 
        case PRU_CONNECT:
                if (inp->inp_faddr.s_addr)
                        return (EISCONN);
-               error = in_pcbsetpeer(inp, (struct sockaddr_in *)addr);
+               error = in_pcbconnect(inp, (struct sockaddr_in *)addr);
                if (error)
                        return (error);
                soisconnected(so);
                if (error)
                        return (error);
                soisconnected(so);
@@ -202,7 +210,7 @@ udp_usrreq(so, req, m, addr)
        case PRU_DISCONNECT:
                if (inp->inp_faddr.s_addr == 0)
                        return (ENOTCONN);
        case PRU_DISCONNECT:
                if (inp->inp_faddr.s_addr == 0)
                        return (ENOTCONN);
-               inp->inp_faddr.s_addr = 0;
+               in_pcbdisconnect(inp);
                soisdisconnected(so);
                break;
 
                soisdisconnected(so);
                break;
 
@@ -214,7 +222,7 @@ udp_usrreq(so, req, m, addr)
                if (addr) {
                        if (inp->inp_faddr.s_addr)
                                return (EISCONN);
                if (addr) {
                        if (inp->inp_faddr.s_addr)
                                return (EISCONN);
-                       error = in_pcbsetpeer(inp, (struct sockaddr_in *)addr);
+                       error = in_pcbconnect(inp, (struct sockaddr_in *)addr);
                        if (error)
                                return (error);
                } else {
                        if (error)
                                return (error);
                } else {
@@ -223,11 +231,11 @@ udp_usrreq(so, req, m, addr)
                }
                udp_output(inp, m);
                if (addr)
                }
                udp_output(inp, m);
                if (addr)
-                       inp->inp_faddr.s_addr = 0;
+                       in_pcbdisconnect(inp);
                break;
 
        case PRU_ABORT:
                break;
 
        case PRU_ABORT:
-               in_pcbfree(inp);
+               in_pcbdetach(inp);
                sofree(so);
                soisdisconnected(so);
                break;
                sofree(so);
                soisdisconnected(so);
                break;
@@ -240,11 +248,3 @@ udp_usrreq(so, req, m, addr)
        }
        return (0);
 }
        }
        return (0);
 }
-
-/*ARGSUSED*/
-udp_sense(m)
-       struct mbuf *m;
-{
-
-       return (EOPNOTSUPP);
-}