Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 25 Mar 2008 23:08:02 GMT
From:      Paolo Pisati <piso@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 138565 for review
Message-ID:  <200803252308.m2PN82QY026496@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
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
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803252308.m2PN82QY026496>