- spup = (struct sockaddr_pup *)&rp->rcb_addr;
- pup->pup_dport = spup->spup_addr;
-
- /*
- * Insure proper source address is included.
- */
- spup = (struct sockadrr_pup *)rp->rcb_socket->so_addr;
- pup->pup_sport = spup->spup_addr;
- /* for now, assume user generates PUP checksum. */
-
- if (rp->rcb_pcb == 0) /* XXX */
- panic("rawpup_output");
- return (enoutput((struct ifnet *)rp->rcb_pcb, m, PF_PUP));
-
-bad:
- m_freem(m);
- return (0);
-}
-
-/*
- * Intercept connects and sends to verify interface
- * exists for destination address. Disconnects are
- * also looked at to insure pointer is invalidated.
- */
-rawpup_usrreq(so, req, m, addr)
- struct socket *so;
- int req;
- struct mbuf *m;
- caddr_t addr;
-{
- register struct rawcb *rp = sotorawcb(so);
-
-COUNT(RAWPUP_USRREQ);
- if (rp == 0 && req != PRU_ATTACH)
- return (EINVAL);
-
- switch (req) {
-
- /*
- * Verify address has an interface to go with it
- * and record information for use in output routine.
- */
- case PRU_SEND:
- case PRU_CONNECT: {
- register struct sockaddr_pup *spup;
- register struct ifnet *ifp;
-
- spup = (struct sockaddr_pup *)addr;
- ifp = if_ifonnetof(spup->spup_addr);
- if (ifp == 0) {
- ifp = if_gatewayfor(spup->spup_addr);
- if (ifp == 0)
- return (EADDRNOTAVAIL); /* XXX */
+#if vax || pdp11
+ pup->pup_length = htons(pup->pup_length);
+#endif
+ /* assume user generates PUP checksum. */
+ dst = (struct sockaddr_pup *)&rp->rcb_faddr;
+ pup->pup_dport = dst->spup_addr;
+ ifp = if_ifonnetof(pup->pup_dnet);
+ 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 */