version 1.39, 1998/01/05 10:32:01 |
version 1.42.6.1, 1999/06/28 06:37:01 |
|
|
* @(#)raw_ip.c 8.7 (Berkeley) 5/15/95 |
* @(#)raw_ip.c 8.7 (Berkeley) 5/15/95 |
*/ |
*/ |
|
|
|
#include "opt_mrouting.h" |
|
|
#include <sys/param.h> |
#include <sys/param.h> |
#include <sys/malloc.h> |
#include <sys/malloc.h> |
#include <sys/mbuf.h> |
#include <sys/mbuf.h> |
|
|
|
|
#include <machine/stdarg.h> |
#include <machine/stdarg.h> |
|
|
|
#ifdef IPSEC |
|
#include <netinet6/ipsec.h> |
|
#endif /*IPSEC*/ |
|
|
struct inpcbtable rawcbtable; |
struct inpcbtable rawcbtable; |
|
|
int rip_bind __P((struct inpcb *, struct mbuf *)); |
int rip_bind __P((struct inpcb *, struct mbuf *)); |
|
|
in_pcbinit(&rawcbtable, 1, 1); |
in_pcbinit(&rawcbtable, 1, 1); |
} |
} |
|
|
|
static struct sockaddr_in ripsrc = { sizeof(ripsrc), AF_INET }; |
|
|
/* |
/* |
* Setup generic address and protocol structures |
* Setup generic address and protocol structures |
* for raw_input routine, then pass them along with |
* for raw_input routine, then pass them along with |
Line 98 rip_input(m, va_alist) |
|
Line 106 rip_input(m, va_alist) |
|
va_dcl |
va_dcl |
#endif |
#endif |
{ |
{ |
|
int off, proto; |
register struct ip *ip = mtod(m, struct ip *); |
register struct ip *ip = mtod(m, struct ip *); |
register struct inpcb *inp; |
register struct inpcb *inp; |
struct inpcb *last = 0; |
struct inpcb *last = 0; |
struct mbuf *opts = 0; |
struct mbuf *opts = 0; |
struct sockaddr_in ripsrc; |
struct sockaddr_in ripsrc; |
|
va_list ap; |
|
|
|
va_start(ap, m); |
|
off = va_arg(ap, int); |
|
proto = va_arg(ap, int); |
|
va_end(ap); |
|
|
ripsrc.sin_family = AF_INET; |
ripsrc.sin_family = AF_INET; |
ripsrc.sin_len = sizeof(struct sockaddr_in); |
ripsrc.sin_len = sizeof(struct sockaddr_in); |
Line 110 rip_input(m, va_alist) |
|
Line 125 rip_input(m, va_alist) |
|
ripsrc.sin_port = 0; |
ripsrc.sin_port = 0; |
bzero((caddr_t)ripsrc.sin_zero, sizeof(ripsrc.sin_zero)); |
bzero((caddr_t)ripsrc.sin_zero, sizeof(ripsrc.sin_zero)); |
|
|
|
/* |
|
* XXX Compatibility: programs using raw IP expect ip_len |
|
* XXX to have the header length subtracted. |
|
*/ |
|
ip->ip_len -= ip->ip_hl << 2; |
|
|
for (inp = rawcbtable.inpt_queue.cqh_first; |
for (inp = rawcbtable.inpt_queue.cqh_first; |
inp != (struct inpcb *)&rawcbtable.inpt_queue; |
inp != (struct inpcb *)&rawcbtable.inpt_queue; |
inp = inp->inp_queue.cqe_next) { |
inp = inp->inp_queue.cqe_next) { |
if (inp->inp_ip.ip_p && inp->inp_ip.ip_p != ip->ip_p) |
if (inp->inp_ip.ip_p && inp->inp_ip.ip_p != proto) |
continue; |
continue; |
if (!in_nullhost(inp->inp_laddr) && |
if (!in_nullhost(inp->inp_laddr) && |
!in_hosteq(inp->inp_laddr, ip->ip_dst)) |
!in_hosteq(inp->inp_laddr, ip->ip_dst)) |
Line 135 rip_input(m, va_alist) |
|
Line 156 rip_input(m, va_alist) |
|
m_freem(opts); |
m_freem(opts); |
} else |
} else |
sorwakeup(last->inp_socket); |
sorwakeup(last->inp_socket); |
|
opts = NULL; |
} |
} |
} |
} |
last = inp; |
last = inp; |
Line 155 rip_input(m, va_alist) |
|
Line 177 rip_input(m, va_alist) |
|
ipstat.ips_noproto++; |
ipstat.ips_noproto++; |
ipstat.ips_delivered--; |
ipstat.ips_delivered--; |
} |
} |
|
return; |
} |
} |
|
|
/* |
/* |
Line 220 rip_output(m, va_alist) |
|
Line 243 rip_output(m, va_alist) |
|
flags |= IP_RAWOUTPUT; |
flags |= IP_RAWOUTPUT; |
ipstat.ips_rawout++; |
ipstat.ips_rawout++; |
} |
} |
|
#ifdef IPSEC |
|
m->m_pkthdr.rcvif = (struct ifnet *)inp->inp_socket; /*XXX*/ |
|
#endif /*IPSEC*/ |
return (ip_output(m, opts, &inp->inp_route, flags, inp->inp_moptions, &inp->inp_errormtu)); |
return (ip_output(m, opts, &inp->inp_route, flags, inp->inp_moptions, &inp->inp_errormtu)); |
} |
} |
|
|
Line 400 rip_usrreq(so, req, m, nam, control, p) |
|
Line 426 rip_usrreq(so, req, m, nam, control, p) |
|
break; |
break; |
inp = sotoinpcb(so); |
inp = sotoinpcb(so); |
inp->inp_ip.ip_p = (long)nam; |
inp->inp_ip.ip_p = (long)nam; |
|
#ifdef IPSEC |
|
error = ipsec_init_policy(&inp->inp_sp); |
|
#endif /*IPSEC*/ |
break; |
break; |
|
|
case PRU_DETACH: |
case PRU_DETACH: |