version 1.59, 2008/04/12 05:58:22 |
version 1.59.10.1, 2008/12/13 01:15:26 |
|
|
in_gif_output(struct ifnet *ifp, int family, struct mbuf *m) |
in_gif_output(struct ifnet *ifp, int family, struct mbuf *m) |
{ |
{ |
struct rtentry *rt; |
struct rtentry *rt; |
struct gif_softc *sc = (struct gif_softc*)ifp; |
struct gif_softc *sc = ifp->if_softc; |
struct sockaddr_in *sin_src = (struct sockaddr_in *)sc->gif_psrc; |
struct sockaddr_in *sin_src = (struct sockaddr_in *)sc->gif_psrc; |
struct sockaddr_in *sin_dst = (struct sockaddr_in *)sc->gif_pdst; |
struct sockaddr_in *sin_dst = (struct sockaddr_in *)sc->gif_pdst; |
struct ip iphdr; /* capsule IP header, host byte ordered */ |
struct ip iphdr; /* capsule IP header, host byte ordered */ |
Line 156 in_gif_output(struct ifnet *ifp, int fam |
|
Line 156 in_gif_output(struct ifnet *ifp, int fam |
|
return EAFNOSUPPORT; |
return EAFNOSUPPORT; |
} |
} |
|
|
bzero(&iphdr, sizeof(iphdr)); |
memset(&iphdr, 0, sizeof(iphdr)); |
iphdr.ip_src = sin_src->sin_addr; |
iphdr.ip_src = sin_src->sin_addr; |
/* bidirectional configured tunnel mode */ |
/* bidirectional configured tunnel mode */ |
if (sin_dst->sin_addr.s_addr != INADDR_ANY) |
if (sin_dst->sin_addr.s_addr != INADDR_ANY) |
Line 225 in_gif_input(struct mbuf *m, ...) |
|
Line 225 in_gif_input(struct mbuf *m, ...) |
|
return; |
return; |
} |
} |
#ifndef GIF_ENCAPCHECK |
#ifndef GIF_ENCAPCHECK |
if (!gif_validate4(ip, (struct gif_softc *)gifp, m->m_pkthdr.rcvif)) { |
if (!gif_validate4(ip, gifp->if_softc, m->m_pkthdr.rcvif)) { |
m_freem(m); |
m_freem(m); |
ip_statinc(IP_STAT_NOGIF); |
ip_statinc(IP_STAT_NOGIF); |
return; |
return; |
Line 322 gif_validate4(const struct ip *ip, struc |
|
Line 322 gif_validate4(const struct ip *ip, struc |
|
|
|
/* ingress filters on outer source */ |
/* ingress filters on outer source */ |
if ((sc->gif_if.if_flags & IFF_LINK2) == 0 && ifp) { |
if ((sc->gif_if.if_flags & IFF_LINK2) == 0 && ifp) { |
struct sockaddr_in sin; |
union { |
|
struct sockaddr sa; |
|
struct sockaddr_in sin; |
|
} u; |
struct rtentry *rt; |
struct rtentry *rt; |
|
|
bzero(&sin, sizeof(sin)); |
sockaddr_in_init(&u.sin, &ip->ip_src, 0); |
sin.sin_family = AF_INET; |
rt = rtalloc1(&u.sa, 0); |
sin.sin_len = sizeof(struct sockaddr_in); |
if (rt == NULL || rt->rt_ifp != ifp) { |
sin.sin_addr = ip->ip_src; |
|
rt = rtalloc1((struct sockaddr *)&sin, 0); |
|
if (!rt || rt->rt_ifp != ifp) { |
|
#if 0 |
#if 0 |
log(LOG_WARNING, "%s: packet from 0x%x dropped " |
log(LOG_WARNING, "%s: packet from 0x%x dropped " |
"due to ingress filter\n", if_name(&sc->gif_if), |
"due to ingress filter\n", if_name(&sc->gif_if), |
(u_int32_t)ntohl(sin.sin_addr.s_addr)); |
(u_int32_t)ntohl(u.sin.sin_addr.s_addr)); |
#endif |
#endif |
if (rt) |
if (rt != NULL) |
rtfree(rt); |
rtfree(rt); |
return 0; |
return 0; |
} |
} |
Line 359 gif_encapcheck4(struct mbuf *m, int off, |
|
Line 359 gif_encapcheck4(struct mbuf *m, int off, |
|
struct ifnet *ifp; |
struct ifnet *ifp; |
|
|
/* sanity check done in caller */ |
/* sanity check done in caller */ |
sc = (struct gif_softc *)arg; |
sc = arg; |
|
|
m_copydata(m, 0, sizeof(ip), (void *)&ip); |
m_copydata(m, 0, sizeof(ip), &ip); |
ifp = ((m->m_flags & M_PKTHDR) != 0) ? m->m_pkthdr.rcvif : NULL; |
ifp = ((m->m_flags & M_PKTHDR) != 0) ? m->m_pkthdr.rcvif : NULL; |
|
|
return gif_validate4(&ip, sc, ifp); |
return gif_validate4(&ip, sc, ifp); |
Line 374 in_gif_attach(struct gif_softc *sc) |
|
Line 374 in_gif_attach(struct gif_softc *sc) |
|
#ifndef GIF_ENCAPCHECK |
#ifndef GIF_ENCAPCHECK |
struct sockaddr_in mask4; |
struct sockaddr_in mask4; |
|
|
bzero(&mask4, sizeof(mask4)); |
memset(&mask4, 0, sizeof(mask4)); |
mask4.sin_len = sizeof(struct sockaddr_in); |
mask4.sin_len = sizeof(struct sockaddr_in); |
mask4.sin_addr.s_addr = ~0; |
mask4.sin_addr.s_addr = ~0; |
|
|