diff options
author | YASUOKA Masahiko <yasuoka@cvs.openbsd.org> | 2010-07-08 08:40:30 +0000 |
---|---|---|
committer | YASUOKA Masahiko <yasuoka@cvs.openbsd.org> | 2010-07-08 08:40:30 +0000 |
commit | 336ef4ecd2905dd5021f3d42af117efacf59e6d4 (patch) | |
tree | 9f1b7617ced9b9b29ada8f62e0315ad1e83dac00 | |
parent | e8c4f92166a70573af608433f8d8b8e749ef160f (diff) |
pipex didn't work on output. Fixed following problems:
- pipex failed to lookup the radix tree because address and netmask
were not initialized.
- pipex used wrong place as a ip header because it didn't adjust
32bit address family header that are added at tun_output.
-rw-r--r-- | sys/net/if_tun.c | 9 | ||||
-rw-r--r-- | sys/net/pipex.c | 48 | ||||
-rw-r--r-- | sys/net/pipex.h | 5 | ||||
-rw-r--r-- | sys/net/pipex_local.h | 3 |
4 files changed, 32 insertions, 33 deletions
diff --git a/sys/net/if_tun.c b/sys/net/if_tun.c index 844f9542826..2e4b3ee9391 100644 --- a/sys/net/if_tun.c +++ b/sys/net/if_tun.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_tun.c,v 1.106 2010/05/06 13:06:40 claudio Exp $ */ +/* $OpenBSD: if_tun.c,v 1.107 2010/07/08 08:40:29 yasuoka Exp $ */ /* $NetBSD: if_tun.c,v 1.24 1996/05/07 02:40:48 thorpej Exp $ */ /* @@ -574,9 +574,6 @@ tun_output(struct ifnet *ifp, struct mbuf *m0, struct sockaddr *dst, struct tun_softc *tp = ifp->if_softc; int s, len, error; u_int32_t *af; -#ifdef PIPEX - struct pipex_session *session; -#endif if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING)) { m_freem(m0); @@ -609,8 +606,8 @@ tun_output(struct ifnet *ifp, struct mbuf *m0, struct sockaddr *dst, bpf_mtap(ifp->if_bpf, m0, BPF_DIRECTION_OUT); #endif #ifdef PIPEX - if ((session = pipex_ip_lookup_session(m0, &tp->pipex_iface)) != NULL) { - pipex_ip_output(m0, session); + if ((m0 = pipex_output(m0, dst->sa_family, sizeof(u_int32_t), + &tp->pipex_iface)) == NULL) { splx(s); return (0); } diff --git a/sys/net/pipex.c b/sys/net/pipex.c index 3a0c1dc3b3b..e7586eb4c70 100644 --- a/sys/net/pipex.c +++ b/sys/net/pipex.c @@ -1,4 +1,4 @@ -/* $OpenBSD: pipex.c,v 1.5 2010/07/03 00:16:07 yasuoka Exp $ */ +/* $OpenBSD: pipex.c,v 1.6 2010/07/08 08:40:29 yasuoka Exp $ */ /*- * Copyright (c) 2009 Internet Initiative Japan Inc. @@ -537,9 +537,12 @@ pipex_lookup_by_ip_address(struct in_addr addr) struct pipex_session *session; struct sockaddr_in pipex_in4, pipex_in4mask; + bzero(&pipex_in4, sizeof(pipex_in4)); pipex_in4.sin_addr = addr; pipex_in4.sin_family = AF_INET; pipex_in4.sin_len = sizeof(pipex_in4); + + bzero(&pipex_in4mask, sizeof(pipex_in4mask)); pipex_in4mask.sin_addr.s_addr = htonl(0xFFFFFFFFL); pipex_in4mask.sin_family = AF_INET; pipex_in4mask.sin_len = sizeof(pipex_in4mask); @@ -773,38 +776,37 @@ pipex_timer(void *ignored_arg) /*********************************************************************** * Common network I/O functions. (tunnel protocol independent) ***********************************************************************/ -struct pipex_session * -pipex_ip_lookup_session(struct mbuf *m0, +struct mbuf * +pipex_output(struct mbuf *m0, int af, int off, struct pipex_iface_context *pipex_iface) { struct pipex_session *session; struct ip ip; - /* length check */ - if (m0->m_pkthdr.len < sizeof(struct ip)) { - PIPEX_DBG((NULL, LOG_DEBUG, - "<%s> packet length is too short", __func__)); - return (NULL); - } - - /* copy ip header info */ - m_copydata(m0, 0, sizeof(struct ip), (caddr_t)&ip); - - if (IN_MULTICAST(ip.ip_dst.s_addr) && pipex_iface != NULL) - return (pipex_iface->multicast_session); + session = NULL; + switch (af) { + case AF_INET: + if (m0->m_pkthdr.len >= sizeof(struct ip) + off) { + m_copydata(m0, off, sizeof(struct ip), (caddr_t)&ip); + if (IN_MULTICAST(ip.ip_dst.s_addr)) + session = pipex_iface->multicast_session; + else + session = pipex_lookup_by_ip_address(ip.ip_dst); + } + if (session != NULL) { + if (off > 0) + m_adj(m0, off); - /* lookup pipex session table */ - session = pipex_lookup_by_ip_address(ip.ip_dst); - if (session == NULL) { - PIPEX_DBG((NULL, LOG_DEBUG, "<%s> session not found.", - __func__)); - return (NULL); + pipex_ip_output(m0, session); + return (NULL); + } + break; } - return (session); + return (m0); } -void +Static void pipex_ip_output(struct mbuf *m0, struct pipex_session *session) { int is_idle; diff --git a/sys/net/pipex.h b/sys/net/pipex.h index 35426e67e06..2d064f29719 100644 --- a/sys/net/pipex.h +++ b/sys/net/pipex.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pipex.h,v 1.3 2010/07/03 00:16:07 yasuoka Exp $ */ +/* $OpenBSD: pipex.h,v 1.4 2010/07/08 08:40:29 yasuoka Exp $ */ /* * Copyright (c) 2009 Internet Initiative Japan Inc. @@ -152,8 +152,7 @@ void pipex_iface_stop (struct pipex_iface_context *); int pipex_notify_close_session(struct pipex_session *session); int pipex_notify_close_session_all(void); -struct pipex_session *pipex_ip_lookup_session (struct mbuf *, struct pipex_iface_context *); -void pipex_ip_output (struct mbuf *, struct pipex_session *); +struct mbuf *pipex_output (struct mbuf *, int, int, struct pipex_iface_context *); struct pipex_session *pipex_pppoe_lookup_session (struct mbuf *); struct mbuf *pipex_pppoe_input (struct mbuf *, struct pipex_session *); struct pipex_session *pipex_pptp_lookup_session (struct mbuf *); diff --git a/sys/net/pipex_local.h b/sys/net/pipex_local.h index c3f1caabba5..9580ab16a66 100644 --- a/sys/net/pipex_local.h +++ b/sys/net/pipex_local.h @@ -1,4 +1,4 @@ -/* $OpenBSD: pipex_local.h,v 1.5 2010/07/03 00:16:07 yasuoka Exp $ */ +/* $OpenBSD: pipex_local.h,v 1.6 2010/07/08 08:40:29 yasuoka Exp $ */ /* * Copyright (c) 2009 Internet Initiative Japan Inc. @@ -277,6 +277,7 @@ Static int pipex_get_closed (struct pipex_session_list_req *); Static int pipex_destroy_session (struct pipex_session *); Static struct pipex_session *pipex_lookup_by_ip_address (struct in_addr); Static struct pipex_session *pipex_lookup_by_session_id (int, int); +Static void pipex_ip_output (struct mbuf *, struct pipex_session *); Static void pipex_ppp_output (struct mbuf *, struct pipex_session *, int); Static inline int pipex_ppp_proto (struct mbuf *, struct pipex_session *, int, int *); Static void pipex_ppp_input (struct mbuf *, struct pipex_session *, int); |