1 /* raw_ip.c 4.6 82/03/12 */ 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/ip.h" 11 #include "../net/ip_var.h" 12 #include "../net/raw_cb.h" 13 #include "../errno.h" 14 15 /* 16 * Raw interface to IP protocol. 17 */ 18 19 static struct sockaddr_in ripdst = { PF_INET }; 20 static struct sockaddr_in ripsrc = { PF_INET }; 21 static struct sockproto ripproto = { AF_INET }; 22 23 /* 24 * Setup generic address and protocol structures 25 * for raw_input routine, then pass them along with 26 * mbuf chain. 27 */ 28 rip_input(m) 29 struct mbuf *m; 30 { 31 register struct ip *ip = mtod(m, struct ip *); 32 33 COUNT(RIP_INPUT); 34 ripproto.sp_protocol = ip->ip_p; 35 ripdst.sin_addr = ip->ip_dst; 36 ripsrc.sin_addr = ip->ip_src; 37 raw_input(m, &ripproto, &ripdst, &ripsrc); 38 } 39 40 /*ARGSUSED*/ 41 rip_ctlinput(m) 42 struct mbuf *m; 43 { 44 COUNT(RIP_CTLINPUT); 45 } 46 47 /* 48 * Generate IP header and pass packet to ip_output. 49 * Tack on options user may have setup with control call. 50 */ 51 rip_output(m0, so) 52 struct mbuf *m0; 53 struct socket *so; 54 { 55 register struct mbuf *m; 56 register struct ip *ip; 57 register int len = 0; 58 register struct rawcb *rp = sotorawcb(so); 59 60 COUNT(RIP_OUTPUT); 61 /* 62 * Calculate data length and get an mbuf 63 * for IP header. 64 */ 65 for (m = m0; m; m = m->m_next) 66 len += m->m_len; 67 m = m_get(M_DONTWAIT); 68 if (m == 0) { 69 m_freem(m); 70 return (0); 71 } 72 73 /* 74 * Fill in IP header as needed. 75 */ 76 m->m_off = MMAXOFF - sizeof(struct ip); 77 m->m_len = sizeof(struct ip); 78 m->m_next = m0; 79 ip = mtod(m, struct ip *); 80 ip->ip_p = so->so_proto->pr_protocol; 81 ip->ip_len = sizeof(struct ip) + len; 82 ip->ip_dst = 83 ((struct sockaddr_in *)&rp->rcb_addr)->sin_addr; 84 ip->ip_src = 85 ((struct sockaddr_in *)&so->so_addr)->sin_addr; 86 ip->ip_ttl = MAXTTL; 87 return (ip_output(m, 0)); 88 } 89 90 /* 91 * Intercept control operations related to 92 * handling of IP options. Otherwise, 93 * just pass things on to the raw_usrreq 94 * routine for setup and tear down of 95 * raw control block data structures. 96 */ 97 rip_usrreq(so, req, m, addr) 98 struct socket *so; 99 int req; 100 struct mbuf *m; 101 caddr_t addr; 102 { 103 register struct rawcb *rp = sotorawcb(so); 104 105 COUNT(RAW_USRREQ); 106 if (rp == 0 && req != PRU_ATTACH) 107 return (EINVAL); 108 109 switch (req) { 110 111 /* 112 * SHOULD HAVE CONTROL TO SET PROTOCOL NUMBER (e.g. GGP) 113 */ 114 case PRU_CONTROL: 115 return (EOPNOTSUPP); 116 } 117 return (raw_usrreq(so, req, m, addr)); 118 } 119