purge so_addr from socket structure and start cleaning up raw code
authorSam Leffler <sam@ucbvax.Berkeley.EDU>
Sun, 11 Apr 1982 14:42:33 +0000 (06:42 -0800)
committerSam Leffler <sam@ucbvax.Berkeley.EDU>
Sun, 11 Apr 1982 14:42:33 +0000 (06:42 -0800)
SCCS-vsn: sys/netinet/in_pcb.c 4.25
SCCS-vsn: sys/net/raw_cb.c 4.7
SCCS-vsn: sys/net/raw_cb.h 4.4
SCCS-vsn: sys/deprecated/netimp/raw_imp.c 4.10
SCCS-vsn: sys/netinet/raw_ip.c 4.10
SCCS-vsn: sys/deprecated/netpup/raw_pup.c 4.11
SCCS-vsn: sys/net/raw_usrreq.c 4.13
SCCS-vsn: sys/netinet/tcp_input.c 1.67
SCCS-vsn: sys/netinet/tcp_usrreq.c 1.56
SCCS-vsn: sys/netinet/udp_usrreq.c 4.26

usr/src/sys/deprecated/netimp/raw_imp.c
usr/src/sys/deprecated/netpup/raw_pup.c
usr/src/sys/net/raw_cb.c
usr/src/sys/net/raw_cb.h
usr/src/sys/net/raw_usrreq.c
usr/src/sys/netinet/in_pcb.c
usr/src/sys/netinet/raw_ip.c
usr/src/sys/netinet/tcp_input.c
usr/src/sys/netinet/tcp_usrreq.c
usr/src/sys/netinet/udp_usrreq.c

index ec93c5a..61082ba 100644 (file)
@@ -1,4 +1,4 @@
-/*     raw_imp.c       4.9     82/03/28        */
+/*     raw_imp.c       4.10    82/04/10        */
 
 #include "../h/param.h"
 #include "../h/mbuf.h"
 
 #include "../h/param.h"
 #include "../h/mbuf.h"
 #include "../net/if.h"
 #include "../net/if_imp.h"
 #include "../net/raw_cb.h"
 #include "../net/if.h"
 #include "../net/if_imp.h"
 #include "../net/raw_cb.h"
-#include "../errno.h"
+#include <errno.h>
 
 /*
  * Raw interface to IMP.
  */
 
 
 /*
  * Raw interface to IMP.
  */
 
-struct sockaddr_in rawimpaddr = { AF_IMPLINK };
 /*
  * Generate IMP leader and pass packet to impoutput.
  * The user must create a skeletal leader in order to
 /*
  * Generate IMP leader and pass packet to impoutput.
  * The user must create a skeletal leader in order to
@@ -29,7 +28,7 @@ rimp_output(m, so)
        struct socket *so;
 {
        struct mbuf *n;
        struct socket *so;
 {
        struct mbuf *n;
-       int len;
+       int len, error = 0;
        register struct imp_leader *ip;
        register struct sockaddr_in *sin;
        register struct rawcb *rp = sotorawcb(so);
        register struct imp_leader *ip;
        register struct sockaddr_in *sin;
        register struct rawcb *rp = sotorawcb(so);
@@ -42,20 +41,28 @@ COUNT(RIMP_OUTPUT);
         * for the leader and check parameters in it.
         */
        if ((m->m_off > MMAXOFF || m->m_len < sizeof(struct control_leader)) &&
         * for the leader and check parameters in it.
         */
        if ((m->m_off > MMAXOFF || m->m_len < sizeof(struct control_leader)) &&
-           (m = m_pullup(m, sizeof(struct control_leader))) == 0)
-               return (0);
+           (m = m_pullup(m, sizeof(struct control_leader))) == 0) {
+               error = EMSGSIZE;       /* XXX */
+               goto bad;
+       }
        cp = mtod(m, struct control_leader *);
        if (cp->dl_mtype == IMPTYPE_DATA)
                if (m->m_len < sizeof(struct imp_leader) &&
        cp = mtod(m, struct control_leader *);
        if (cp->dl_mtype == IMPTYPE_DATA)
                if (m->m_len < sizeof(struct imp_leader) &&
-                   (m = m_pullup(m, sizeof(struct imp_leader))) == 0)
-                       return (0);
+                   (m = m_pullup(m, sizeof(struct imp_leader))) == 0) {
+                       error = EMSGSIZE;       /* XXX */
+                       goto bad;
+               }
        ip = mtod(m, struct imp_leader *);
        ip = mtod(m, struct imp_leader *);
-       if (ip->il_format != IMP_NFF)
+       if (ip->il_format != IMP_NFF) {
+               error = EMSGSIZE;               /* XXX */
                goto bad;
                goto bad;
+       }
 #ifdef notdef
        if (ip->il_link != IMPLINK_IP &&
 #ifdef notdef
        if (ip->il_link != IMPLINK_IP &&
-           (ip->il_link < IMPLINK_LOWEXPER || ip->il_link > IMPLINK_HIGHEXPER))
+           (ip->il_link<IMPLINK_LOWEXPER || ip->il_link>IMPLINK_HIGHEXPER)) {
+               error = EPERM;
                goto bad;
                goto bad;
+       }
 #endif
 
        /*
 #endif
 
        /*
@@ -66,17 +73,16 @@ COUNT(RIMP_OUTPUT);
        for (len = 0, n = m; n; n = n->m_next)
                len += n->m_len;
        ip->il_length = htons((u_short)(len << 3));
        for (len = 0, n = m; n; n = n->m_next)
                len += n->m_len;
        ip->il_length = htons((u_short)(len << 3));
-       sin = (struct sockaddr_in *)&rp->rcb_addr;
+       sin = (struct sockaddr_in *)&rp->rcb_faddr;
        ip->il_network = sin->sin_addr.s_net;
        ip->il_host = sin->sin_addr.s_host;
        ip->il_imp = sin->sin_addr.s_imp;
        /* no routing here */
        ifp = if_ifonnetof(ip->il_network);
        ip->il_network = sin->sin_addr.s_net;
        ip->il_host = sin->sin_addr.s_host;
        ip->il_imp = sin->sin_addr.s_imp;
        /* no routing here */
        ifp = if_ifonnetof(ip->il_network);
-       if (ifp == 0)
-               goto bad;
-       return (impoutput(ifp, m, (struct sockaddr *)&rawimpaddr));
-
+       if (ifp)
+               return (impoutput(ifp, m, (struct sockaddr *)sin));
+       error = ENETUNREACH;
 bad:
        m_freem(m);
 bad:
        m_freem(m);
-       return (0);
+       return (error);
 }
 }
index 2ddb6d1..b74e47d 100644 (file)
@@ -1,4 +1,4 @@
-/*     raw_pup.c       4.10    82/04/04        */
+/*     raw_pup.c       4.11    82/04/10        */
 
 #include "../h/param.h"
 #include "../h/mbuf.h"
 
 #include "../h/param.h"
 #include "../h/mbuf.h"
@@ -26,9 +26,9 @@ rpup_output(m, so)
 {
        register struct rawcb *rp = sotorawcb(so);
        register struct pup_header *pup;
 {
        register struct rawcb *rp = sotorawcb(so);
        register struct pup_header *pup;
-       int len;
+       int len, error = 0;
        struct mbuf *n;
        struct mbuf *n;
-       struct sockaddr_pup *spup;
+       struct sockaddr_pup *dst;
        struct ifnet *ifp;
 
 COUNT(RPUP_OUTPUT);
        struct ifnet *ifp;
 
 COUNT(RPUP_OUTPUT);
@@ -37,31 +37,44 @@ COUNT(RPUP_OUTPUT);
         * for the header and check parameters in it.
         */
        if ((m->m_off > MMAXOFF || m->m_len < sizeof(struct pup_header)) &&
         * for the header and check parameters in it.
         */
        if ((m->m_off > MMAXOFF || m->m_len < sizeof(struct pup_header)) &&
-           (m = m_pullup(m, sizeof(struct pup_header))) == 0)
+           (m = m_pullup(m, sizeof(struct pup_header))) == 0) {
+               error = EMSGSIZE;       /* XXX */
                goto bad;
                goto bad;
+       }
        pup = mtod(m, struct pup_header *);
        pup = mtod(m, struct pup_header *);
-       if (pup->pup_type == 0)
+       if (pup->pup_type == 0) {
+               error = EPERM;          /* XXX */
                goto bad;
                goto bad;
-       if (pup->pup_tcontrol && (pup->pup_tcontrol & ~PUP_TRACE))
+       }
+       if (pup->pup_tcontrol && (pup->pup_tcontrol & ~PUP_TRACE)) {
+               error = EPERM;          /* XXX */
                goto bad;
                goto bad;
+       }
        for (len = 0, n = m; n; n = n->m_next)
                len += n->m_len;
        pup->pup_length = len;
 #if vax || pdp11
        pup->pup_length = htons(pup->pup_length);
 #endif
        for (len = 0, n = m; n; n = n->m_next)
                len += n->m_len;
        pup->pup_length = len;
 #if vax || pdp11
        pup->pup_length = htons(pup->pup_length);
 #endif
-       spup = (struct sockaddr_pup *)&(rp->rcb_socket->so_addr);
-       pup->pup_sport = spup->spup_addr;
-       /* for now, assume user generates PUP checksum. */
-       spup = (struct sockaddr_pup *)&rp->rcb_addr;
-       pup->pup_dport = spup->spup_addr;
-
+       /* assume user generates PUP checksum. */
+       dst = (struct sockaddr_pup *)&rp->rcb_faddr;
+       pup->pup_dport = dst->spup_addr;
        ifp = if_ifonnetof(pup->pup_dnet);
        ifp = if_ifonnetof(pup->pup_dnet);
-       if (ifp == 0)
-               goto bad;
-       return ((*ifp->if_output)(ifp, m, (struct sockaddr *)spup));
+       if (ifp) {
+               if (rp->rcb_flags & RAW_LADDR) {
+                       register struct sockaddr_pup *src;
 
 
+                       src = (struct sockaddr_pup *)&rp->rcb_laddr;
+                       pup->pup_sport = src->spup_addr;
+               } else {
+                       pup->pup_snet = ifp->if_net;
+                       pup->pup_shost = ifp->if_host[0];
+                       /* socket is specified by user */
+               }
+               return ((*ifp->if_output)(ifp, m, (struct sockaddr *)dst));
+       }
+       error = ENETUNREACH;
 bad:
        m_freem(m);
 bad:
        m_freem(m);
-       return (0);
+       return (error);
 }
 }
index 7cd10fd..c89bc4c 100644 (file)
@@ -1,4 +1,4 @@
-/*     raw_cb.c        4.6     82/03/28        */
+/*     raw_cb.c        4.7     82/04/10        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -62,6 +62,7 @@ COUNT(RAW_ATTACH);
                struct sockaddr_in inpup;
 
                bzero((caddr_t)&inpup, sizeof(inpup));
                struct sockaddr_in inpup;
 
                bzero((caddr_t)&inpup, sizeof(inpup));
+               inpup.sin_family = AF_INET;
                inpup.sin_addr.s_net = spup->sp_net;
                inpup.sin_addr.s_impno = spup->sp_host;
                if (inpup.sin_addr.s_addr &&
                inpup.sin_addr.s_net = spup->sp_net;
                inpup.sin_addr.s_impno = spup->sp_host;
                if (inpup.sin_addr.s_addr &&
@@ -87,7 +88,8 @@ COUNT(RAW_ATTACH);
        so->so_pcb = (caddr_t)rp;
        rp->rcb_pcb = 0;
        if (addr)
        so->so_pcb = (caddr_t)rp;
        rp->rcb_pcb = 0;
        if (addr)
-               bcopy((caddr_t)addr, (caddr_t)&so->so_addr, sizeof(*addr));
+               bcopy((caddr_t)addr, (caddr_t)&rp->rcb_laddr, sizeof(*addr));
+       rp->rcb_flags |= RAW_LADDR;
        return (0);
 bad2:
        sbrelease(&so->so_snd);
        return (0);
 bad2:
        sbrelease(&so->so_snd);
@@ -119,7 +121,7 @@ raw_disconnect(rp)
        struct rawcb *rp;
 {
 COUNT(RAW_DISCONNECT);
        struct rawcb *rp;
 {
 COUNT(RAW_DISCONNECT);
-       rp->rcb_flags &= ~RAW_ADDR;
+       rp->rcb_flags &= ~RAW_FADDR;
        if (rp->rcb_socket->so_state & SS_USERGONE)
                raw_detach(rp);
 }
        if (rp->rcb_socket->so_state & SS_USERGONE)
                raw_detach(rp);
 }
@@ -133,6 +135,6 @@ raw_connaddr(rp, addr)
        struct sockaddr *addr;
 {
 COUNT(RAW_CONNADDR);
        struct sockaddr *addr;
 {
 COUNT(RAW_CONNADDR);
-       bcopy((caddr_t)addr, (caddr_t)&rp->rcb_addr, sizeof(*addr));
-       rp->rcb_flags |= RAW_ADDR;
+       bcopy((caddr_t)addr, (caddr_t)&rp->rcb_faddr, sizeof(*addr));
+       rp->rcb_flags |= RAW_FADDR;
 }
 }
index 41edf71..987424e 100644 (file)
@@ -1,4 +1,4 @@
-/*     raw_cb.h        4.3     82/02/02        */
+/*     raw_cb.h        4.4     82/04/10        */
 
 /*
  * Raw protocol interface control block.  Used
 
 /*
  * Raw protocol interface control block.  Used
@@ -8,7 +8,8 @@ struct rawcb {
        struct  rawcb *rcb_next;        /* doubly linked list */
        struct  rawcb *rcb_prev;
        struct  socket *rcb_socket;     /* back pointer to socket */
        struct  rawcb *rcb_next;        /* doubly linked list */
        struct  rawcb *rcb_prev;
        struct  socket *rcb_socket;     /* back pointer to socket */
-       struct  sockaddr rcb_addr;      /* destination address */
+       struct  sockaddr rcb_faddr;     /* destination address */
+       struct  sockaddr rcb_laddr;     /* socket's address */
        caddr_t rcb_pcb;                /* protocol specific stuff */
        short   rcb_flags;
 };
        caddr_t rcb_pcb;                /* protocol specific stuff */
        short   rcb_flags;
 };
@@ -17,7 +18,8 @@ struct rawcb {
  * Since we can't interpret canonical addresses,
  * we mark an address present in the flags field.
  */
  * Since we can't interpret canonical addresses,
  * we mark an address present in the flags field.
  */
-#define        RAW_ADDR        01              /* got an address */
+#define        RAW_LADDR       01
+#define        RAW_FADDR       02
 
 #define        sotorawcb(so)           ((struct rawcb *)(so)->so_pcb)
 
 
 #define        sotorawcb(so)           ((struct rawcb *)(so)->so_pcb)
 
@@ -33,7 +35,7 @@ struct rawcb {
  * input routine.
  */
 struct raw_header {
  * input routine.
  */
 struct raw_header {
-       struct  sockproto raw_protocol; /* format of packet */
+       struct  sockproto raw_proto;    /* format of packet */
        struct  sockaddr raw_dst;       /* dst address for rawintr */
        struct  sockaddr raw_src;       /* src address for sbappendaddr */
 };
        struct  sockaddr raw_dst;       /* dst address for rawintr */
        struct  sockaddr raw_src;       /* src address for sbappendaddr */
 };
index c3cc019..732e6ce 100644 (file)
@@ -1,4 +1,4 @@
-/*     raw_usrreq.c    4.12    82/04/10        */
+/*     raw_usrreq.c    4.13    82/04/10        */
 
 #include "../h/param.h"
 #include "../h/mbuf.h"
 
 #include "../h/param.h"
 #include "../h/mbuf.h"
@@ -10,7 +10,7 @@
 #include "../net/in_systm.h"
 #include "../net/if.h"
 #include "../net/raw_cb.h"
 #include "../net/in_systm.h"
 #include "../net/if.h"
 #include "../net/raw_cb.h"
-#include "../errno.h"
+#include <errno.h>
 
 int    rawqmaxlen = IFQ_MAXLEN;
 
 
 int    rawqmaxlen = IFQ_MAXLEN;
 
@@ -28,10 +28,10 @@ COUNT(RAW_INIT);
 /*
  * Raw protocol interface.
  */
 /*
  * Raw protocol interface.
  */
-raw_input(m0, pf, daf, saf)
+raw_input(m0, proto, dst, src)
        struct mbuf *m0;
        struct mbuf *m0;
-       struct sockproto *pf;
-       struct sockaddr *daf, *saf;
+       struct sockproto *proto;
+       struct sockaddr *dst, *src;
 {
        register struct mbuf *m;
        struct raw_header *rh;
 {
        register struct mbuf *m;
        struct raw_header *rh;
@@ -50,9 +50,9 @@ COUNT(RAW_INPUT);
        m->m_off = MMINOFF;
        m->m_len = sizeof(struct raw_header);
        rh = mtod(m, struct raw_header *);
        m->m_off = MMINOFF;
        m->m_len = sizeof(struct raw_header);
        rh = mtod(m, struct raw_header *);
-       rh->raw_dst = *daf;
-       rh->raw_src = *saf;
-       rh->raw_protocol = *pf;
+       rh->raw_dst = *dst;
+       rh->raw_src = *src;
+       rh->raw_proto = *proto;
 
        /*
         * Header now contains enough info to decide
 
        /*
         * Header now contains enough info to decide
@@ -80,11 +80,9 @@ rawintr()
        int s;
        struct mbuf *m;
        register struct rawcb *rp;
        int s;
        struct mbuf *m;
        register struct rawcb *rp;
-       register struct socket *so;
-       register struct protosw *pr;
-       register struct sockproto *sp;
-       register struct sockaddr *sa;
-       struct raw_header *rawp;
+       register struct sockaddr *laddr;
+       register struct protosw *lproto;
+       struct raw_header *rh;
        struct socket *last;
 
 COUNT(RAWINTR);
        struct socket *last;
 
 COUNT(RAWINTR);
@@ -94,9 +92,7 @@ next:
        splx(s);
        if (m == 0)
                return;
        splx(s);
        if (m == 0)
                return;
-       rawp = mtod(m, struct raw_header *);
-       sp = &rawp->raw_protocol;
-       sa = &rawp->raw_dst;
+       rh = mtod(m, struct raw_header *);
 
        /*
         * Find the appropriate socket(s) in which to place this
 
        /*
         * Find the appropriate socket(s) in which to place this
@@ -106,25 +102,26 @@ next:
         */
        last = 0;
        for (rp = rawcb.rcb_next; rp != &rawcb; rp = rp->rcb_next) {
         */
        last = 0;
        for (rp = rawcb.rcb_next; rp != &rawcb; rp = rp->rcb_next) {
-               so = rp->rcb_socket;
-               pr = so->so_proto;
-               if (pr->pr_family != sp->sp_family ||
-                   (pr->pr_protocol && pr->pr_protocol != sp->sp_protocol))
+               lproto = rp->rcb_socket->so_proto;
+               if (lproto->pr_family != rh->raw_proto.sp_family)
                        continue;
                        continue;
-               if (so->so_addr.sa_family && 
-                   sa->sa_family != so->so_addr.sa_family)
+               if (lproto->pr_protocol &&
+                   lproto->pr_protocol != rh->raw_proto.sp_protocol)
+                       continue;
+               laddr = &rp->rcb_laddr;
+               if (laddr->sa_family &&
+                   laddr->sa_family != rh->raw_dst.sa_family)
                        continue;
                /*
                 * We assume the lower level routines have
                 * placed the address in a canonical format
                        continue;
                /*
                 * We assume the lower level routines have
                 * placed the address in a canonical format
-                * suitable for a structure comparison. Packets
-                * are duplicated for each receiving socket.
-                *
-                * SHOULD HAVE A NUMBER OF MECHANISMS FOR
-                * MATCHING BASED ON rcb_flags
+                * suitable for a structure comparison.
                 */
                 */
-               if ((rp->rcb_flags & RAW_ADDR) &&
-                   bcmp(sa->sa_data, so->so_addr.sa_data, 14) != 0)
+               if ((rp->rcb_flags & RAW_LADDR) &&
+                   bcmp(laddr->sa_data, rh->raw_dst.sa_data, 14) != 0)
+                       continue;
+               if ((rp->rcb_flags & RAW_FADDR) &&
+                   bcmp(rp->rcb_faddr.sa_data, rh->raw_src.sa_data, 14) != 0)
                        continue;
                /*
                 * To avoid extraneous packet copies, we keep
                        continue;
                /*
                 * To avoid extraneous packet copies, we keep
@@ -137,27 +134,21 @@ next:
 
                        if (n = m_copy(m->m_next, 0, (int)M_COPYALL))
                                goto nospace;
 
                        if (n = m_copy(m->m_next, 0, (int)M_COPYALL))
                                goto nospace;
-                       if (sbappendaddr(&last->so_rcv, &rawp->raw_src, n) == 0) {
-                               /*
-                                * Should drop notification of lost packet
-                                * into this guy's queue, but...
-                                */
+                       if (sbappendaddr(&last->so_rcv, &rh->raw_src, n)==0) {
+                               /* should notify about lost packet */
                                m_freem(n);
                                goto nospace;
                        }
                        sorwakeup(last);
                }
 nospace:
                                m_freem(n);
                                goto nospace;
                        }
                        sorwakeup(last);
                }
 nospace:
-               last = so;
+               last = rp->rcb_socket;
        }
        if (last == 0)
                goto drop;
        }
        if (last == 0)
                goto drop;
-       if (sbappendaddr(&last->so_rcv, &rawp->raw_src, m->m_next) == 0)
-{
-printf("rawintr: sbappendaddr failed\n");
+       m = m_free(m);          /* header */
+       if (sbappendaddr(&last->so_rcv, &rh->raw_src, m) == 0)
                goto drop;
                goto drop;
-}
-       (void) m_free(m);       /* generic header */
        sorwakeup(last);
        goto next;
 drop:
        sorwakeup(last);
        goto next;
 drop:
@@ -211,14 +202,14 @@ COUNT(RAW_USRREQ);
         * nothing else around it should go to). 
         */
        case PRU_CONNECT:
         * nothing else around it should go to). 
         */
        case PRU_CONNECT:
-               if (rp->rcb_flags & RAW_ADDR)
+               if (rp->rcb_flags & RAW_FADDR)
                        return (EISCONN);
                raw_connaddr(rp, (struct sockaddr *)addr);
                soisconnected(so);
                break;
 
        case PRU_DISCONNECT:
                        return (EISCONN);
                raw_connaddr(rp, (struct sockaddr *)addr);
                soisconnected(so);
                break;
 
        case PRU_DISCONNECT:
-               if ((rp->rcb_flags & RAW_ADDR) == 0)
+               if ((rp->rcb_flags & RAW_FADDR) == 0)
                        return (ENOTCONN);
                raw_disconnect(rp);
                soisdisconnected(so);
                        return (ENOTCONN);
                raw_disconnect(rp);
                soisdisconnected(so);
@@ -237,14 +228,14 @@ COUNT(RAW_USRREQ);
         */
        case PRU_SEND:
                if (addr) {
         */
        case PRU_SEND:
                if (addr) {
-                       if (rp->rcb_flags & RAW_ADDR)
+                       if (rp->rcb_flags & RAW_FADDR)
                                return (EISCONN);
                        raw_connaddr(rp, (struct sockaddr *)addr);
                                return (EISCONN);
                        raw_connaddr(rp, (struct sockaddr *)addr);
-               } else if ((rp->rcb_flags & RAW_ADDR) == 0)
+               } else if ((rp->rcb_flags & RAW_FADDR) == 0)
                        return (ENOTCONN);
                error = (*so->so_proto->pr_output)(m, so);
                if (addr)
                        return (ENOTCONN);
                error = (*so->so_proto->pr_output)(m, so);
                if (addr)
-                       rp->rcb_flags &= ~RAW_ADDR;
+                       rp->rcb_flags &= ~RAW_FADDR;
                break;
 
        case PRU_ABORT:
                break;
 
        case PRU_ABORT:
@@ -265,6 +256,10 @@ COUNT(RAW_USRREQ);
                error = EOPNOTSUPP;
                break;
 
                error = EOPNOTSUPP;
                break;
 
+       case PRU_SOCKADDR:
+               bcopy(addr, (caddr_t)&rp->rcb_laddr, sizeof (struct sockaddr));
+               break;
+
        default:
                panic("raw_usrreq");
        }
        default:
                panic("raw_usrreq");
        }
index ad13011..209c610 100644 (file)
@@ -1,4 +1,4 @@
-/*     in_pcb.c        4.24    82/03/30        */
+/*     in_pcb.c        4.25    82/04/10        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -117,7 +117,6 @@ COUNT(IN_PCBATTACH);
        inp->inp_socket = so;
        insque(inp, head);
        so->so_pcb = (caddr_t)inp;
        inp->inp_socket = so;
        insque(inp, head);
        so->so_pcb = (caddr_t)inp;
-       in_setsockaddr(inp);
        return (0);
 bad2:
        sbrelease(&so->so_snd);
        return (0);
 bad2:
        sbrelease(&so->so_snd);
@@ -160,29 +159,13 @@ COUNT(IN_PCBCONNECT);
            inp->inp_lport,
            0))
                return (EADDRINUSE);
            inp->inp_lport,
            0))
                return (EADDRINUSE);
-       if (inp->inp_laddr.s_addr == 0) {
-               struct sockaddr_in *sin2 =
-                   (struct sockaddr_in *)&inp->inp_socket->so_addr;
-
+       if (inp->inp_laddr.s_addr == 0)
                inp->inp_laddr = ifaddr->sin_addr;
                inp->inp_laddr = ifaddr->sin_addr;
-               sin2->sin_addr = inp->inp_laddr;
-       }
        inp->inp_faddr = sin->sin_addr;
        inp->inp_fport = sin->sin_port;
        return (0);
 }
 
        inp->inp_faddr = sin->sin_addr;
        inp->inp_fport = sin->sin_port;
        return (0);
 }
 
-in_setsockaddr(inp)
-       struct inpcb *inp;
-{
-       register struct sockaddr_in *sin =
-           (struct sockaddr_in *)&inp->inp_socket->so_addr;
-
-       sin->sin_family = AF_INET;
-       sin->sin_addr = inp->inp_laddr;
-       sin->sin_port = inp->inp_lport;
-}
-
 in_pcbdisconnect(inp)
        struct inpcb *inp;
 {
 in_pcbdisconnect(inp)
        struct inpcb *inp;
 {
@@ -207,6 +190,18 @@ in_pcbdetach(inp)
        (void) m_free(dtom(inp));
 }
 
        (void) m_free(dtom(inp));
 }
 
+in_setsockaddr(sin, inp)
+       register struct sockaddr_in *sin;
+       register struct inpcb *inp;
+{
+       if (sin == 0 || inp == 0)
+               panic("setsockaddr_in");
+       bzero((caddr_t)sin, sizeof (*sin));
+       sin->sin_family = AF_INET;
+       sin->sin_port = inp->inp_lport;
+       sin->sin_addr = inp->inp_laddr;
+}
+
 /*
  * SHOULD ALLOW MATCH ON MULTI-HOMING ONLY
  */
 /*
  * SHOULD ALLOW MATCH ON MULTI-HOMING ONLY
  */
index 46fedad..d33e352 100644 (file)
@@ -1,16 +1,17 @@
-/*     raw_ip.c        4.9     82/03/28        */
+/*     raw_ip.c        4.10    82/04/10        */
 
 #include "../h/param.h"
 #include "../h/mbuf.h"
 #include "../h/socket.h"
 #include "../h/protosw.h"
 #include "../h/socketvar.h"
 
 #include "../h/param.h"
 #include "../h/mbuf.h"
 #include "../h/socket.h"
 #include "../h/protosw.h"
 #include "../h/socketvar.h"
+#include "../net/if.h"
 #include "../net/in.h"
 #include "../net/in_systm.h"
 #include "../net/ip.h"
 #include "../net/ip_var.h"
 #include "../net/raw_cb.h"
 #include "../net/in.h"
 #include "../net/in_systm.h"
 #include "../net/ip.h"
 #include "../net/ip_var.h"
 #include "../net/raw_cb.h"
-#include "../errno.h"
+#include <errno.h>
 
 /*
  * Raw interface to IP protocol.
 
 /*
  * Raw interface to IP protocol.
@@ -19,7 +20,6 @@
 static struct sockaddr_in ripdst = { AF_INET };
 static struct sockaddr_in ripsrc = { AF_INET };
 static struct sockproto ripproto = { PF_INET };
 static struct sockaddr_in ripdst = { AF_INET };
 static struct sockaddr_in ripsrc = { AF_INET };
 static struct sockproto ripproto = { PF_INET };
-
 /*
  * Setup generic address and protocol structures
  * for raw_input routine, then pass them along with
 /*
  * Setup generic address and protocol structures
  * for raw_input routine, then pass them along with
@@ -48,8 +48,10 @@ rip_output(m0, so)
 {
        register struct mbuf *m;
        register struct ip *ip;
 {
        register struct mbuf *m;
        register struct ip *ip;
-       register int len = 0;
-       register struct rawcb *rp = sotorawcb(so);
+       int len = 0, error;
+       struct rawcb *rp = sotorawcb(so);
+       struct ifnet *ifp;
+       struct sockaddr_in *src;
 
 COUNT(RIP_OUTPUT);
        /*
 
 COUNT(RIP_OUTPUT);
        /*
@@ -60,8 +62,8 @@ COUNT(RIP_OUTPUT);
                len += m->m_len;
        m = m_get(M_DONTWAIT);
        if (m == 0) {
                len += m->m_len;
        m = m_get(M_DONTWAIT);
        if (m == 0) {
-               m_freem(m);
-               return (0);
+               error = ENOBUFS;
+               goto bad;
        }
        
        /*
        }
        
        /*
@@ -73,10 +75,26 @@ COUNT(RIP_OUTPUT);
        ip = mtod(m, struct ip *);
        ip->ip_p = so->so_proto->pr_protocol;
        ip->ip_len = sizeof(struct ip) + len;
        ip = mtod(m, struct ip *);
        ip->ip_p = so->so_proto->pr_protocol;
        ip->ip_len = sizeof(struct ip) + len;
-       ip->ip_dst =
-               ((struct sockaddr_in *)&rp->rcb_addr)->sin_addr;
-       ip->ip_src =
-               ((struct sockaddr_in *)&so->so_addr)->sin_addr;
+       ip->ip_dst = ((struct sockaddr_in *)&rp->rcb_faddr)->sin_addr;
+       /* local address may not be specified -- XXX */
+       ifp = if_ifonnetof(ip->ip_dst.s_net);
+       if (ifp == 0) {
+               error = ENETUNREACH;
+               goto bad;
+       }
+       if (rp->rcb_flags & RAW_LADDR)
+               src = (struct sockaddr_in *)&rp->rcb_laddr;
+       else {
+               if (ifp->if_addr.sa_family != AF_INET) {
+                       error = EAFNOSUPPORT;
+                       goto bad;
+               }
+               src = (struct sockaddr_in *)&ifp->if_addr;
+       }
+       ip->ip_src = src->sin_addr;
        ip->ip_ttl = MAXTTL;
        return (ip_output(m, (struct mbuf *)0, 0, 1));
        ip->ip_ttl = MAXTTL;
        return (ip_output(m, (struct mbuf *)0, 0, 1));
+bad:
+       m_freem(m);
+       return (error);
 }
 }
index 3819aec..9ac2aea 100644 (file)
@@ -1,4 +1,4 @@
-/*     tcp_input.c     1.66    82/04/01        */
+/*     tcp_input.c     1.67    82/04/10        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -216,7 +216,6 @@ COUNT(TCP_INPUT);
                        tp = 0;
                        goto drop;
                }
                        tp = 0;
                        goto drop;
                }
-               in_setsockaddr(inp);
                tp->iss = tcp_iss; tcp_iss += TCP_ISSINCR/2;
                tp->irs = ti->ti_seq;
                tcp_sendseqinit(tp);
                tp->iss = tcp_iss; tcp_iss += TCP_ISSINCR/2;
                tp->irs = ti->ti_seq;
                tcp_sendseqinit(tp);
index b471a42..ad81d19 100644 (file)
@@ -1,4 +1,4 @@
-/*     tcp_usrreq.c    1.55    82/04/10        */
+/*     tcp_usrreq.c    1.56    82/04/10        */
 
 #include "../h/param.h"
 #include "../h/systm.h"
 
 #include "../h/param.h"
 #include "../h/systm.h"
@@ -253,6 +253,10 @@ printf("sendoob seq now %x oobc %x\n", tp->t_oobseq, tp->t_oobc);
                tp->t_force = 0;
                break;
 
                tp->t_force = 0;
                break;
 
+       case PRU_SOCKADDR:
+               in_setsockaddr((struct sockaddr_in *)addr, inp);
+               break;
+
        /*
         * TCP slow timer went off; going through this
         * routine for tracing's sake.
        /*
         * TCP slow timer went off; going through this
         * routine for tracing's sake.
index baad4d3..db72620 100644 (file)
@@ -1,4 +1,4 @@
-/*     udp_usrreq.c    4.25    82/04/10        */
+/*     udp_usrreq.c    4.26    82/04/10        */
 
 #include "../h/param.h"
 #include "../h/dir.h"
 
 #include "../h/param.h"
 #include "../h/dir.h"
@@ -234,7 +234,6 @@ COUNT(UDP_USRREQ);
                if (addr) {
                        in_pcbdisconnect(inp);
                        inp->inp_laddr = laddr;
                if (addr) {
                        in_pcbdisconnect(inp);
                        inp->inp_laddr = laddr;
-                       in_setsockaddr(inp);
                }
                }
                break;
                }
                }
                break;
@@ -248,6 +247,10 @@ COUNT(UDP_USRREQ);
        case PRU_CONTROL:
                return (EOPNOTSUPP);
 
        case PRU_CONTROL:
                return (EOPNOTSUPP);
 
+       case PRU_SOCKADDR:
+               in_setsockaddr((struct sockaddr_in *)addr, inp);
+               break;
+
        default:
                panic("udp_usrreq");
        }
        default:
                panic("udp_usrreq");
        }