From owner-p4-projects@FreeBSD.ORG Sun Feb 4 16:38:57 2007 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6A52916A406; Sun, 4 Feb 2007 16:38:57 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 29FEF16A401 for ; Sun, 4 Feb 2007 16:38:57 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id 1B68913C4A3 for ; Sun, 4 Feb 2007 16:38:57 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id l14Gcu0t034171 for ; Sun, 4 Feb 2007 16:38:56 GMT (envelope-from piso@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id l14GculD034168 for perforce@freebsd.org; Sun, 4 Feb 2007 16:38:56 GMT (envelope-from piso@freebsd.org) Date: Sun, 4 Feb 2007 16:38:56 GMT Message-Id: <200702041638.l14GculD034168@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to piso@freebsd.org using -f From: Paolo Pisati To: Perforce Change Reviews Cc: Subject: PERFORCE change 114002 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 04 Feb 2007 16:38:57 -0000 http://perforce.freebsd.org/chv.cgi?CH=114002 Change 114002 by piso@piso_newluxor on 2007/02/04 16:37:59 Teach mbuf to ProxyEncodeTcpStream(). Affected files ... .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#54 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_local.h#19 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_proxy.c#19 edit Differences ... ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#54 (text+ko) ==== @@ -1054,10 +1054,11 @@ if (proxy_type != 0) { SetProxyPort(lnk, dest_port); SetProxyAddress(lnk, dest_address); - // XXX broken ProxyModify(la, lnk, ptr, maxpacketsize, proxy_type, src_port); - // XXX m_pullup() + PULLUP_IPTCPHDR(pip, ptr); + if (pip == NULL) + return (PKT_ALIAS_IGNORED); tc = (struct tcphdr *)ip_next(pip); } /* Get alias address and port */ ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_local.h#19 (text+ko) ==== @@ -215,12 +215,21 @@ (pip) = mtod(m, struct ip *); \ } while (0) +#define PULLUP_IPTCPHDR(pip, ptr) do { \ + struct mbuf *m; \ + m = m_pullup((ptr), sizeof(struct ip)); \ + (pip) = mtod(m, struct ip *); \ + m = m_pullup((ptr), (pip->ip_hl << 2) + sizeof(struct tcphdr)); \ + (pip) = mtod(m, struct ip *); \ +} while (0) + #else #define PULLUP_IPHDR(pip, ptr) pip = (struct ip *)ptr #define PULLUP_UDPHDR(pip, ptr) pip = ptr #define PULLUP_TCPHDR(pip, ptr) pip = ptr #define PULLUP_ICMPHDR(pip, ptr) pip = (struct ip *)ptr #define PULLUP_ICMPIP64(pip, ptr, ic) pip = ptr +#define PULLUP_IPTCPHDR(pip, ptr) pip = (struct ip *)ptr #endif /* ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias_proxy.c#19 (text+ko) ==== @@ -146,7 +146,7 @@ static void RuleAdd(struct libalias *la, struct proxy_entry *); static void RuleDelete(struct proxy_entry *); static int RuleNumberDelete(struct libalias *la, int); -static void ProxyEncodeTcpStream(struct alias_link *, struct ip *, int); +static void ProxyEncodeTcpStream(struct alias_link *, void *, int); static void ProxyEncodeIpHeader(void *, u_short sport); #ifdef _KERNEL @@ -392,13 +392,17 @@ static void ProxyEncodeTcpStream(struct alias_link *lnk, - struct ip *pip, + void *ptr, int maxpacketsize) { int slen; char buffer[40]; + struct ip *pip; struct tcphdr *tc; + PULLUP_TCPHDR(pip, ptr); + if (pip == NULL) + return; /* Compute pointer to tcp header */ tc = (struct tcphdr *)ip_next(pip); @@ -431,7 +435,11 @@ { int dlen; int hlen; +#ifdef _KERNEL + struct mbuf *m; +#else u_char *p; +#endif hlen = (pip->ip_hl + tc->th_off) << 2; dlen = ntohs(pip->ip_len) - hlen; @@ -440,14 +448,25 @@ if (dlen == 0) return; - +#ifdef _KERNEL + m = m_split(ptr, hlen, M_TRYWAIT); + if (m == NULL) + return; + m_copyback(ptr, hlen, slen, buffer); + m_cat(ptr, m); +#else p = (char *)pip; p += hlen; bcopy(p, p + slen, dlen); memcpy(p, buffer, slen); +#endif } + PULLUP_IPTCPHDR(pip, ptr); + if (pip == NULL) + return; + /* Save information about modfied sequence number */ { int delta; @@ -626,7 +645,6 @@ ProxyModify(struct libalias *la, struct alias_link *lnk, void *ptr, int maxpacketsize, int proxy_type, u_short src_port) { - struct ip *pip; LIBALIAS_LOCK_ASSERT(la); (void)la; @@ -637,8 +655,7 @@ break; case PROXY_TYPE_ENCODE_TCPSTREAM: - PULLUP_IPHDR(pip, ptr); - ProxyEncodeTcpStream(lnk, pip, maxpacketsize); + ProxyEncodeTcpStream(lnk, ptr, maxpacketsize); break; } }