1 /* raw_pup.c 4.8 82/03/13 */ 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 in_addr in; 40 struct ifnet *ifp; 41 42 COUNT(RPUP_OUTPUT); 43 /* 44 * Verify user has supplied necessary space 45 * for the header and check parameters in it. 46 */ 47 if ((m->m_off > MMAXOFF || m->m_len < sizeof(struct pup_header)) && 48 (m = m_pullup(m, sizeof(struct pup_header))) == 0) 49 goto bad; 50 pup = mtod(m, struct pup_header *); 51 if (pup->pup_type == 0) 52 goto bad; 53 if (pup->pup_tcontrol && (pup->pup_tcontrol & ~PUP_TRACE)) 54 goto bad; 55 for (len = 0, n = m; n; n = n->m_next) 56 len += n->m_len; 57 pup->pup_length = len; 58 spup = (struct sockaddr_pup *)&(rp->rcb_socket->so_addr); 59 pup->pup_sport = spup->spup_addr; 60 /* for now, assume user generates PUP checksum. */ 61 spup = (struct sockaddr_pup *)&rp->rcb_addr; 62 pup->pup_dport = spup->spup_addr; 63 64 in.s_net = spup->spup_addr.pp_net; 65 ifp = if_ifonnetof(in); 66 if (ifp == 0) 67 goto bad; 68 return (enoutput(ifp, m, PF_PUP)); 69 70 bad: 71 m_freem(m); 72 return (0); 73 } 74