1 /* raw_pup.c 4.6 82/03/05 */ 2 3 #include "../h/param.h" 4 #include "../h/mbuf.h" 5 #include "../h/socket.h" 6 #include "../h/protosw.h" 7 #include "../h/socketvar.h" 8 #include "../net/in.h" 9 #include "../net/in_systm.h" 10 #include "../net/pup.h" 11 #include "../net/raw_cb.h" 12 #include "../net/if.h" 13 #include "../errno.h" 14 15 /* 16 * Raw PUP protocol interface. 17 */ 18 19 /*ARGSUSED*/ 20 rpup_ctlinput(m) 21 struct mbuf *m; 22 { 23 COUNT(RPUP_CTLINPUT); 24 } 25 26 /* 27 * Encapsulate packet in PUP header which is supplied by the 28 * user. This is done to allow user to specify PUP identifier. 29 */ 30 rpup_output(m, so) 31 register struct mbuf *m; 32 struct socket *so; 33 { 34 register struct rawcb *rp = sotorawcb(so); 35 register struct pup_header *pup; 36 int len; 37 struct mbuf *n; 38 struct sockaddr_pup *spup; 39 struct ifnet *ifp; 40 41 COUNT(RPUP_OUTPUT); 42 /* 43 * Verify user has supplied necessary space 44 * for the header and check parameters in it. 45 */ 46 if ((m->m_off > MMAXOFF || m->m_len < sizeof(struct pup_header)) && 47 (m = m_pullup(m, sizeof(struct pup_header))) == 0) 48 goto bad; 49 pup = mtod(m, struct pup_header *); 50 if (pup->pup_type == 0) 51 goto bad; 52 if (pup->pup_tcontrol && (pup->pup_tcontrol & ~PUP_TRACE)) 53 goto bad; 54 for (len = 0, n = m; n; n = n->m_next) 55 len += n->m_len; 56 pup->pup_length = len; 57 spup = (struct sockaddr_pup *)&rp->rcb_addr; 58 pup->pup_dport = spup->spup_addr; 59 60 /* 61 * Insure proper source address is included. 62 */ 63 spup = (struct sockadrr_pup *)&(rp->rcb_socket->so_addr); 64 pup->pup_sport = spup->spup_addr; 65 /* for now, assume user generates PUP checksum. */ 66 67 ifp = if_ifonnetof(&rp->rcb_addr); 68 if (ifp == 0) { 69 ifp = if_gatewayfor(&rp->rcb_addr); 70 if (ifp == 0) 71 goto bad; 72 } 73 return (enoutput((struct ifnet *)rp->rcb_pcb, m, PF_PUP)); 74 75 bad: 76 m_freem(m); 77 return (0); 78 } 79