version 1.101, 2007/11/27 22:45:29 |
version 1.107, 2008/04/24 11:38:38 |
Line 86 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 86 __KERNEL_RCSID(0, "$NetBSD$"); |
|
#include <netinet/in_systm.h> |
#include <netinet/in_systm.h> |
#include <netinet/ip.h> |
#include <netinet/ip.h> |
#include <netinet/ip_var.h> |
#include <netinet/ip_var.h> |
|
#include <netinet/ip_private.h> |
#include <netinet/ip_mroute.h> |
#include <netinet/ip_mroute.h> |
#include <netinet/ip_icmp.h> |
#include <netinet/ip_icmp.h> |
#include <netinet/in_pcb.h> |
#include <netinet/in_pcb.h> |
Line 96 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 97 __KERNEL_RCSID(0, "$NetBSD$"); |
|
|
|
#ifdef IPSEC |
#ifdef IPSEC |
#include <netinet6/ipsec.h> |
#include <netinet6/ipsec.h> |
#endif /*IPSEC*/ |
#include <netinet6/ipsec_private.h> |
|
#endif /* IPSEC */ |
|
|
#ifdef FAST_IPSEC |
#ifdef FAST_IPSEC |
#include <netipsec/ipsec.h> |
#include <netipsec/ipsec.h> |
#include <netipsec/ipsec_var.h> /* XXX ipsecstat namespace */ |
#include <netipsec/ipsec_var.h> |
#endif /* FAST_IPSEC*/ |
#include <netipsec/ipsec_private.h> |
|
#endif /* FAST_IPSEC */ |
|
|
struct inpcbtable rawcbtable; |
struct inpcbtable rawcbtable; |
|
|
Line 199 rip_input(struct mbuf *m, ...) |
|
Line 202 rip_input(struct mbuf *m, ...) |
|
#if defined(IPSEC) || defined(FAST_IPSEC) |
#if defined(IPSEC) || defined(FAST_IPSEC) |
/* check AH/ESP integrity. */ |
/* check AH/ESP integrity. */ |
else if (ipsec4_in_reject_so(m, last->inp_socket)) { |
else if (ipsec4_in_reject_so(m, last->inp_socket)) { |
ipsecstat.in_polvio++; |
IPSEC_STATINC(IPSEC_STAT_IN_POLVIO); |
/* do not inject data to pcb */ |
/* do not inject data to pcb */ |
} |
} |
#endif /*IPSEC*/ |
#endif /*IPSEC*/ |
Line 214 rip_input(struct mbuf *m, ...) |
|
Line 217 rip_input(struct mbuf *m, ...) |
|
/* check AH/ESP integrity. */ |
/* check AH/ESP integrity. */ |
if (last != NULL && ipsec4_in_reject_so(m, last->inp_socket)) { |
if (last != NULL && ipsec4_in_reject_so(m, last->inp_socket)) { |
m_freem(m); |
m_freem(m); |
ipsecstat.in_polvio++; |
IPSEC_STATINC(IPSEC_STAT_IN_POLVIO); |
ipstat.ips_delivered--; |
IP_STATDEC(IP_STAT_DELIVERED); |
/* do not inject data to pcb */ |
/* do not inject data to pcb */ |
} else |
} else |
#endif /*IPSEC*/ |
#endif /*IPSEC*/ |
if (last != NULL) |
if (last != NULL) |
rip_sbappendaddr(last, ip, sintosa(&ripsrc), hlen, opts, m); |
rip_sbappendaddr(last, ip, sintosa(&ripsrc), hlen, opts, m); |
else if (inetsw[ip_protox[ip->ip_p]].pr_input == rip_input) { |
else if (inetsw[ip_protox[ip->ip_p]].pr_input == rip_input) { |
|
uint64_t *ips; |
|
|
icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_PROTOCOL, |
icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_PROTOCOL, |
0, 0); |
0, 0); |
ipstat.ips_noproto++; |
ips = IP_STAT_GETREF(); |
ipstat.ips_delivered--; |
ips[IP_STAT_NOPROTO]++; |
|
ips[IP_STAT_DELIVERED]--; |
|
IP_STAT_PUTREF(); |
} else |
} else |
m_freem(m); |
m_freem(m); |
return; |
return; |
Line 358 rip_output(struct mbuf *m, ...) |
|
Line 365 rip_output(struct mbuf *m, ...) |
|
} |
} |
HTONS(ip->ip_len); |
HTONS(ip->ip_len); |
HTONS(ip->ip_off); |
HTONS(ip->ip_off); |
if (ip->ip_id == 0) |
if (ip->ip_id != 0 || m->m_pkthdr.len < IP_MINFRAGSIZE) |
ip->ip_id = ip_newid(); |
flags |= IP_NOIPNEWID; |
opts = NULL; |
opts = NULL; |
/* XXX prevent ip_output from overwriting header fields */ |
/* XXX prevent ip_output from overwriting header fields */ |
flags |= IP_RAWOUTPUT; |
flags |= IP_RAWOUTPUT; |
ipstat.ips_rawout++; |
IP_STATINC(IP_STAT_RAWOUT); |
} |
} |
return (ip_output(m, opts, &inp->inp_route, flags, inp->inp_moptions, |
return (ip_output(m, opts, &inp->inp_route, flags, inp->inp_moptions, |
inp->inp_socket, &inp->inp_errormtu)); |
inp->inp_socket, &inp->inp_errormtu)); |
Line 521 rip_usrreq(struct socket *so, int req, |
|
Line 528 rip_usrreq(struct socket *so, int req, |
|
s = splsoftnet(); |
s = splsoftnet(); |
|
|
if (req == PRU_PURGEIF) { |
if (req == PRU_PURGEIF) { |
|
mutex_enter(softnet_lock); |
in_pcbpurgeif0(&rawcbtable, (struct ifnet *)control); |
in_pcbpurgeif0(&rawcbtable, (struct ifnet *)control); |
in_purgeif((struct ifnet *)control); |
in_purgeif((struct ifnet *)control); |
in_pcbpurgeif(&rawcbtable, (struct ifnet *)control); |
in_pcbpurgeif(&rawcbtable, (struct ifnet *)control); |
|
mutex_exit(softnet_lock); |
splx(s); |
splx(s); |
return (0); |
return (0); |
} |
} |
Line 541 rip_usrreq(struct socket *so, int req, |
|
Line 550 rip_usrreq(struct socket *so, int req, |
|
switch (req) { |
switch (req) { |
|
|
case PRU_ATTACH: |
case PRU_ATTACH: |
|
sosetlock(so); |
if (inp != 0) { |
if (inp != 0) { |
error = EISCONN; |
error = EISCONN; |
break; |
break; |