typo
[unix-history] / usr / src / sys / netinet / raw_ip.c
CommitLineData
fcfe450e 1/* raw_ip.c 4.14 82/10/09 */
2a598b25
BJ
2
3#include "../h/param.h"
4#include "../h/mbuf.h"
5#include "../h/socket.h"
94a62155 6#include "../h/protosw.h"
2a598b25 7#include "../h/socketvar.h"
126472ab 8#include "../net/if.h"
fcfe450e
BJ
9#include "../netinet/in.h"
10#include "../netinet/in_systm.h"
11#include "../netinet/ip.h"
12#include "../netinet/ip_var.h"
94a62155 13#include "../net/raw_cb.h"
a13c006d 14#include "../net/route.h"
126472ab 15#include <errno.h>
2a598b25
BJ
16
17/*
94a62155
BJ
18 * Raw interface to IP protocol.
19 */
20
ee787340
SL
21static struct sockaddr_in ripdst = { AF_INET };
22static struct sockaddr_in ripsrc = { AF_INET };
23static struct sockproto ripproto = { PF_INET };
94a62155
BJ
24/*
25 * Setup generic address and protocol structures
26 * for raw_input routine, then pass them along with
27 * mbuf chain.
2a598b25 28 */
2a598b25
BJ
29rip_input(m)
30 struct mbuf *m;
31{
94a62155 32 register struct ip *ip = mtod(m, struct ip *);
2a598b25 33
94a62155 34 ripproto.sp_protocol = ip->ip_p;
faad37c0
SL
35 ripdst.sin_addr = ip->ip_dst;
36 ripsrc.sin_addr = ip->ip_src;
02122dcc
SL
37 raw_input(m, &ripproto, (struct sockaddr *)&ripsrc,
38 (struct sockaddr *)&ripdst);
2a598b25
BJ
39}
40
94a62155
BJ
41/*
42 * Generate IP header and pass packet to ip_output.
43 * Tack on options user may have setup with control call.
44 */
45rip_output(m0, so)
46 struct mbuf *m0;
47 struct socket *so;
2a598b25 48{
94a62155
BJ
49 register struct mbuf *m;
50 register struct ip *ip;
126472ab
SL
51 int len = 0, error;
52 struct rawcb *rp = sotorawcb(so);
53 struct ifnet *ifp;
a13c006d 54 struct sockaddr_in *sin;
2a598b25 55
94a62155
BJ
56 /*
57 * Calculate data length and get an mbuf
58 * for IP header.
59 */
60 for (m = m0; m; m = m->m_next)
61 len += m->m_len;
62 m = m_get(M_DONTWAIT);
63 if (m == 0) {
126472ab
SL
64 error = ENOBUFS;
65 goto bad;
94a62155
BJ
66 }
67
68 /*
69 * Fill in IP header as needed.
70 */
71 m->m_off = MMAXOFF - sizeof(struct ip);
72 m->m_len = sizeof(struct ip);
73 m->m_next = m0;
74 ip = mtod(m, struct ip *);
75 ip->ip_p = so->so_proto->pr_protocol;
76 ip->ip_len = sizeof(struct ip) + len;
a13c006d
BJ
77 if (rp->rcb_flags & RAW_LADDR) {
78 sin = (struct sockaddr_in *)&rp->rcb_laddr;
79 if (sin->sin_family != AF_INET) {
126472ab
SL
80 error = EAFNOSUPPORT;
81 goto bad;
82 }
a13c006d
BJ
83 ip->ip_src.s_addr = sin->sin_addr.s_addr;
84 } else
85 ip->ip_src.s_addr = 0;
86 ip->ip_dst = ((struct sockaddr_in *)&rp->rcb_faddr)->sin_addr;
94a62155 87 ip->ip_ttl = MAXTTL;
a13c006d 88 return (ip_output(m, (struct mbuf *)0, &routetoif, 1));
126472ab
SL
89bad:
90 m_freem(m);
91 return (error);
2a598b25 92}