From owner-p4-projects@FreeBSD.ORG Tue Mar 25 23:08:03 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 68619106566C; Tue, 25 Mar 2008 23:08:03 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 26EE01065728 for ; Tue, 25 Mar 2008 23:08:03 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id ED3A88FC26 for ; Tue, 25 Mar 2008 23:08:02 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m2PN82sT026498 for ; Tue, 25 Mar 2008 23:08:02 GMT (envelope-from piso@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m2PN82QY026496 for perforce@freebsd.org; Tue, 25 Mar 2008 23:08:02 GMT (envelope-from piso@freebsd.org) Date: Tue, 25 Mar 2008 23:08:02 GMT Message-Id: <200803252308.m2PN82QY026496@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 138565 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: Tue, 25 Mar 2008 23:08:03 -0000 http://perforce.freebsd.org/chv.cgi?CH=138565 Change 138565 by piso@piso_newluxor on 2008/03/25 23:07:05 Teach LibAliasIn() & LibAliasOut() about mbuf while in kernel land. Affected files ... .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#73 edit .. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.h#21 edit Differences ... ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#73 (text+ko) ==== @@ -256,13 +256,14 @@ /* Local prototypes */ -static int IcmpAliasIn1(struct libalias *, struct ip *); -static int IcmpAliasIn2(struct libalias *, struct ip *); -static int IcmpAliasIn(struct libalias *, struct ip *); +static int IcmpAliasIn1(struct libalias *, struct ip *, struct icmp *); +static int IcmpAliasIn2(struct libalias *, pkt_t); +static int IcmpAliasIn(struct libalias *, pkt_t); -static int IcmpAliasOut1(struct libalias *, struct ip *, int create); -static int IcmpAliasOut2(struct libalias *, struct ip *); -static int IcmpAliasOut(struct libalias *, struct ip *, int create); +static int IcmpAliasOut1(struct libalias *, struct ip *, struct icmp *, + int create); +static int IcmpAliasOut2(struct libalias *, pkt_t); +static int IcmpAliasOut(struct libalias *, pkt_t, int create); static int ProtoAliasIn(struct libalias *la, struct in_addr ip_src, struct in_addr *ip_dst, u_char ip_p, u_short *ip_sum); @@ -270,15 +271,15 @@ struct in_addr ip_dst, u_char ip_p, u_short *ip_sum, int create); -static int UdpAliasIn(struct libalias *, struct ip *); -static int UdpAliasOut(struct libalias *, struct ip *, int create); +static int UdpAliasIn(struct libalias *, pkt_t); +static int UdpAliasOut(struct libalias *, pkt_t, int create); -static int TcpAliasIn(struct libalias *, struct ip *); -static int TcpAliasOut(struct libalias *, struct ip *, int, int create); +static int TcpAliasIn(struct libalias *, pkt_t); +static int TcpAliasOut(struct libalias *, pkt_t, int, int create); static int -IcmpAliasIn1(struct libalias *la, struct ip *pip) +IcmpAliasIn1(struct libalias *la, struct ip *pip, struct icmp *ic) { LIBALIAS_LOCK_ASSERT(la); @@ -287,10 +288,7 @@ Alias incoming echo and timestamp requests. */ struct alias_link *lnk; - struct icmp *ic; - ic = (struct icmp *)ip_next(pip); - /* Get source address from ICMP data field and restore original data */ lnk = FindIcmpIn(la, pip->ip_src, pip->ip_dst, ic->icmp_id, 1); if (lnk != NULL) { @@ -323,7 +321,7 @@ } static int -IcmpAliasIn2(struct libalias *la, struct ip *pip) +IcmpAliasIn2(struct libalias *la, pkt_t ptr) { LIBALIAS_LOCK_ASSERT(la); @@ -331,12 +329,13 @@ Alias incoming ICMP error messages containing IP header and first 64 bits of datagram. */ - struct ip *ip; + struct ip *ip, *pip; struct icmp *ic, *ic2; struct udphdr *ud; struct tcphdr *tc; struct alias_link *lnk; + PULLUP_ICMPIP64HDR(pip, ptr); ic = (struct icmp *)ip_next(pip); ip = &ic->icmp_ip; @@ -425,9 +424,10 @@ static int -IcmpAliasIn(struct libalias *la, struct ip *pip) +IcmpAliasIn(struct libalias *la, pkt_t ptr) { int iresult; + struct ip *pip; struct icmp *ic; LIBALIAS_LOCK_ASSERT(la); @@ -435,6 +435,7 @@ if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY) return (PKT_ALIAS_OK); + PULLUP_ICMPHDR(pip, ptr); ic = (struct icmp *)ip_next(pip); iresult = PKT_ALIAS_IGNORED; @@ -442,18 +443,18 @@ case ICMP_ECHOREPLY: case ICMP_TSTAMPREPLY: if (ic->icmp_code == 0) { - iresult = IcmpAliasIn1(la, pip); + iresult = IcmpAliasIn1(la, pip, ic); } break; case ICMP_UNREACH: case ICMP_SOURCEQUENCH: case ICMP_TIMXCEED: case ICMP_PARAMPROB: - iresult = IcmpAliasIn2(la, pip); + iresult = IcmpAliasIn2(la, ptr); break; case ICMP_ECHO: case ICMP_TSTAMP: - iresult = IcmpAliasIn1(la, pip); + iresult = IcmpAliasIn1(la, pip, ic); break; } return (iresult); @@ -461,17 +462,15 @@ static int -IcmpAliasOut1(struct libalias *la, struct ip *pip, int create) +IcmpAliasOut1(struct libalias *la, struct ip *pip, struct icmp *ic, int create) { /* Alias outgoing echo and timestamp requests. De-alias outgoing echo and timestamp replies. */ struct alias_link *lnk; - struct icmp *ic; LIBALIAS_LOCK_ASSERT(la); - ic = (struct icmp *)ip_next(pip); /* Save overwritten data for when echo packet returns */ lnk = FindIcmpOut(la, pip->ip_src, pip->ip_dst, ic->icmp_id, create); @@ -506,19 +505,20 @@ static int -IcmpAliasOut2(struct libalias *la, struct ip *pip) +IcmpAliasOut2(struct libalias *la, pkt_t ptr) { /* Alias outgoing ICMP error messages containing IP header and first 64 bits of datagram. */ - struct ip *ip; + struct ip *ip, *pip; struct icmp *ic, *ic2; struct udphdr *ud; struct tcphdr *tc; struct alias_link *lnk; LIBALIAS_LOCK_ASSERT(la); + PULLUP_ICMPIP64HDR(pip, ptr); ic = (struct icmp *)ip_next(pip); ip = &ic->icmp_ip; @@ -607,9 +607,10 @@ static int -IcmpAliasOut(struct libalias *la, struct ip *pip, int create) +IcmpAliasOut(struct libalias *la, pkt_t ptr, int create) { int iresult; + struct ip *pip; struct icmp *ic; LIBALIAS_LOCK_ASSERT(la); @@ -619,6 +620,7 @@ if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY) return (PKT_ALIAS_OK); + PULLUP_ICMPHDR(pip, ptr); ic = (struct icmp *)ip_next(pip); iresult = PKT_ALIAS_IGNORED; @@ -626,18 +628,18 @@ case ICMP_ECHO: case ICMP_TSTAMP: if (ic->icmp_code == 0) { - iresult = IcmpAliasOut1(la, pip, create); + iresult = IcmpAliasOut1(la, pip, ic, create); } break; case ICMP_UNREACH: case ICMP_SOURCEQUENCH: case ICMP_TIMXCEED: case ICMP_PARAMPROB: - iresult = IcmpAliasOut2(la, pip); + iresult = IcmpAliasOut2(la, ptr); break; case ICMP_ECHOREPLY: case ICMP_TSTAMPREPLY: - iresult = IcmpAliasOut1(la, pip, create); + iresult = IcmpAliasOut1(la, pip, ic, create); } return (iresult); } @@ -711,8 +713,9 @@ static int -UdpAliasIn(struct libalias *la, struct ip *pip) +UdpAliasIn(struct libalias *la, pkt_t ptr) { + struct ip *pip; struct udphdr *ud; struct alias_link *lnk; @@ -721,6 +724,7 @@ if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY) return (PKT_ALIAS_OK); + PULLUP_UDPHDR(pip, ptr); ud = (struct udphdr *)ip_next(pip); lnk = FindUdpTcpIn(la, pip->ip_src, pip->ip_dst, @@ -776,8 +780,9 @@ } static int -UdpAliasOut(struct libalias *la, struct ip *pip, int create) +UdpAliasOut(struct libalias *la, pkt_t ptr, int create) { + struct ip *pip; struct udphdr *ud; struct alias_link *lnk; int error; @@ -787,6 +792,7 @@ if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY) return (PKT_ALIAS_OK); + PULLUP_UDPHDR(pip, ptr); ud = (struct udphdr *)ip_next(pip); lnk = FindUdpTcpOut(la, pip->ip_src, pip->ip_dst, @@ -838,12 +844,14 @@ static int -TcpAliasIn(struct libalias *la, struct ip *pip) +TcpAliasIn(struct libalias *la, pkt_t ptr) { + struct ip *pip; struct tcphdr *tc; struct alias_link *lnk; LIBALIAS_LOCK_ASSERT(la); + PULLUP_TCPHDR(pip, ptr); tc = (struct tcphdr *)ip_next(pip); lnk = FindUdpTcpIn(la, pip->ip_src, pip->ip_dst, @@ -960,17 +968,19 @@ } static int -TcpAliasOut(struct libalias *la, struct ip *pip, int maxpacketsize, int create) +TcpAliasOut(struct libalias *la, pkt_t ptr, int maxpacketsize, int create) { int proxy_type, error; u_short dest_port; u_short proxy_server_port; struct in_addr dest_address; struct in_addr proxy_server_address; + struct ip *pip; struct tcphdr *tc; struct alias_link *lnk; LIBALIAS_LOCK_ASSERT(la); + PULLUP_TCPHDR(pip, ptr); tc = (struct tcphdr *)ip_next(pip); if (create) @@ -1221,14 +1231,14 @@ /* Local prototypes */ static int -LibAliasOutLocked(struct libalias *la, char *ptr, - int maxpacketsize, int create); +LibAliasOutLocked(struct libalias *la, pkt_t ptr, + int maxpacketsize, int create); static int -LibAliasInLocked(struct libalias *la, char *ptr, - int maxpacketsize); +LibAliasInLocked(struct libalias *la, pkt_t ptr, + int maxpacketsize); int -LibAliasIn(struct libalias *la, char *ptr, int maxpacketsize) +LibAliasIn(struct libalias *la, pkt_t ptr, int maxpacketsize) { int res; @@ -1239,7 +1249,7 @@ } static int -LibAliasInLocked(struct libalias *la, char *ptr, int maxpacketsize) +LibAliasInLocked(struct libalias *la, pkt_t ptr, int maxpacketsize) { struct in_addr alias_addr; struct ip *pip; @@ -1253,6 +1263,7 @@ } HouseKeeping(la); ClearCheckNewLink(la); + PULLUP_IPHDR(pip, ptr); pip = (struct ip *)ptr; alias_addr = pip->ip_dst; @@ -1267,13 +1278,13 @@ if ((ntohs(pip->ip_off) & IP_OFFMASK) == 0) { switch (pip->ip_p) { case IPPROTO_ICMP: - iresult = IcmpAliasIn(la, pip); + iresult = IcmpAliasIn(la, ptr); break; case IPPROTO_UDP: - iresult = UdpAliasIn(la, pip); + iresult = UdpAliasIn(la, ptr); break; case IPPROTO_TCP: - iresult = TcpAliasIn(la, pip); + iresult = TcpAliasIn(la, ptr); break; case IPPROTO_GRE: { int error; @@ -1339,7 +1350,7 @@ #define UNREG_ADDR_C_UPPER 0xc0a8ffff int -LibAliasOut(struct libalias *la, char *ptr, int maxpacketsize) +LibAliasOut(struct libalias *la, pkt_t ptr, int maxpacketsize) { int res; @@ -1350,7 +1361,7 @@ } int -LibAliasOutTry(struct libalias *la, char *ptr, int maxpacketsize, int create) +LibAliasOutTry(struct libalias *la, pkt_t ptr, int maxpacketsize, int create) { int res; @@ -1361,7 +1372,7 @@ } static int -LibAliasOutLocked(struct libalias *la, char *ptr, /* valid IP packet */ +LibAliasOutLocked(struct libalias *la, pkt_t ptr, /* valid IP packet */ int maxpacketsize, /* How much the packet data may grow (FTP * and IRC inline changes) */ int create /* Create new entries ? */ @@ -1379,7 +1390,7 @@ } HouseKeeping(la); ClearCheckNewLink(la); - pip = (struct ip *)ptr; + PULLUP_IPHDR(pip, ptr); /* Defense against mangled packets */ if (ntohs(pip->ip_len) > maxpacketsize @@ -1412,13 +1423,13 @@ if ((ntohs(pip->ip_off) & IP_OFFMASK) == 0) { switch (pip->ip_p) { case IPPROTO_ICMP: - iresult = IcmpAliasOut(la, pip, create); + iresult = IcmpAliasOut(la, ptr, create); break; case IPPROTO_UDP: - iresult = UdpAliasOut(la, pip, create); + iresult = UdpAliasOut(la, ptr, create); break; case IPPROTO_TCP: - iresult = TcpAliasOut(la, pip, maxpacketsize, create); + iresult = TcpAliasOut(la, ptr, maxpacketsize, create); break; case IPPROTO_GRE: { int error; @@ -1433,6 +1444,7 @@ }; /* Walk out chain. */ error = find_handler(OUT, IP, la, pip, &ad); + error = 0; if (error == 0) iresult = PKT_ALIAS_OK; else ==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.h#21 (text+ko) ==== @@ -118,13 +118,24 @@ pip = mtod(*ptr, struct ip *); \ PULLUP_SIZE(pip, ptr, (pip->ip_hl << 2) + sizeof(struct icmp)); \ } while (0) + +#define PULLUP_ICMPIP64HDR(pip, ptr) do { \ + int s; \ + struct icmp *ic; \ + pip = mtod(*ptr, struct ip *); \ + ic = (struct icmp *)&(((char *)pip)[pip->ip_hl << 2]); \ + s = (pip->ip_hl << 2) + sizeof(struct icmp) + \ + (ic->icmp_ip.ip_hl << 2) - sizeof(struct ip) + 8; \ + PULLUP_SIZE(pip, ptr, s); \ +} while (0) #else typedef char * pkt_t; #define PULLUP_IPHDR(pip, ptr) pip = (struct ip *)ptr -#define PULLUP_UDPHDR(pip, ptr) -#define PULLUP_TCPHDR(pip, ptr) -#define PULLUP_ICMPHDR(pip, ptr) +#define PULLUP_UDPHDR(pip, ptr) pip = (struct ip *)ptr +#define PULLUP_TCPHDR(pip, ptr) pip = (struct ip *)ptr +#define PULLUP_ICMPHDR(pip, ptr) pip = (struct ip *)ptr +#define PULLUP_ICMPIP64HDR(pip, ptr) pip = (struct ip *)ptr #endif /* Initialization and control functions. */ @@ -137,13 +148,17 @@ void LibAliasUninit(struct libalias *); /* Packet Handling functions. */ -int LibAliasIn (struct libalias *, char *_ptr, int _maxpacketsize); -int LibAliasOut(struct libalias *, char *_ptr, int _maxpacketsize); -int LibAliasOutTry(struct libalias *, char *_ptr, int _maxpacketsize, int _create); #ifdef _KERNEL +int LibAliasIn (struct libalias *, struct mbuf **_ptr, int _maxpacketsize); +int LibAliasOut(struct libalias *, struct mbuf **_ptr, int _maxpacketsize); +int LibAliasOutTry(struct libalias *, struct mbuf **_ptr, + int _maxpacketsize, int _create); int LibAliasUnaliasOut(struct libalias *, struct mbuf **_ptr, int _maxpacketsize); #else +int LibAliasIn (struct libalias *, char *_ptr, int _maxpacketsize); +int LibAliasOut(struct libalias *, char *_ptr, int _maxpacketsize); +int LibAliasOutTry(struct libalias *, char *_ptr, int _maxpacketsize, int _create); int LibAliasUnaliasOut(struct libalias *, char *_ptr, int _maxpacketsize); #endif