PERFORCE change 113800 for review

Paolo Pisati piso at FreeBSD.org
Thu Feb 1 00:18:16 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=113800

Change 113800 by piso at piso_newluxor on 2007/02/01 00:17:50

	Pass down the mbuf and pullup enough data for UdpAlias[In|Out]().

Affected files ...

.. //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#48 edit

Differences ...

==== //depot/projects/soc2005/libalias/sys/netinet/libalias/alias.c#48 (text+ko) ====

@@ -143,6 +143,26 @@
 #include "alias_mod.h"
 #endif
 
+#ifdef _KERNEL
+
+#define PULLUP_IPHDR(pip, ptr) do {             \
+        struct mbuf *m;                         \
+	m = m_pullup((ptr), sizeof(struct ip)); \
+        (pip) = mtod(m, struct ip *);           \
+} while (0)
+
+#define PULLUP_UDPHDR(pip, ptr) do {            \
+        struct mbuf *m;                         \
+	pip = ptr;                              \
+	m = m_pullup((ptr), (pip->ip_hl << 2) + sizeof(struct udphdr)); \
+	(pip) = mtod(m, struct ip *);           \
+} while (0)
+
+#else
+#define PULLUP_IPHDR(pip, ptr) pip = ptr
+#define PULLUP_UDPHDR(pip, ptr) pip = ptr
+#endif
+
 static __inline int
 twowords(void *p)
 {
@@ -753,18 +773,15 @@
 	struct ip *pip;
 	struct udphdr *ud;
 	struct alias_link *lnk;
-#ifdef _KERNEL
-	// XXX - m_pullup()
-	pip = ptr;
-#else
-	pip = ptr;
-#endif
 
 	LIBALIAS_LOCK_ASSERT(la);
 /* Return if proxy-only mode is enabled */
 	if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
 		return (PKT_ALIAS_OK);
 
+	PULLUP_UDPHDR(pip, ptr);
+	if (pip == NULL)
+		return (PKT_ALIAS_IGNORED);
 	ud = (struct udphdr *)ip_next(pip);
 
 	lnk = FindUdpTcpIn(la, pip->ip_src, pip->ip_dst,
@@ -791,9 +808,10 @@
 		alias_port = ud->uh_dport;
 		ud->uh_dport = GetOriginalPort(lnk);
 
-		/* Walk out chain. */		
+		/* XXX broken - Walk out chain. */		
 		error = find_handler(IN, UDP, la, pip, &ad);
-
+		// XXX m_pullup()
+		
 /* If UDP checksum is not zero, then adjust since destination port */
 /* is being unaliased and destination address is being altered.    */
 		if (ud->uh_sum != 0) {
@@ -826,18 +844,15 @@
 	struct udphdr *ud;
 	struct alias_link *lnk;
 	int error;
-#ifdef _KERNEL
-	// XXX m_pullup()
-	pip = ptr;
-#else
-	pip = ptr;
-#endif
 
 	LIBALIAS_LOCK_ASSERT(la);
 /* Return if proxy-only mode is enabled */
 	if (la->packetAliasMode & PKT_ALIAS_PROXY_ONLY)
 		return (PKT_ALIAS_OK);
 
+	PULLUP_UDPHDR(pip, ptr);
+	if (pip == NULL)
+		return (PKT_ALIAS_IGNORED);
 	ud = (struct udphdr *)ip_next(pip);
 
 	lnk = FindUdpTcpOut(la, pip->ip_src, pip->ip_dst,
@@ -859,8 +874,9 @@
 		alias_address = GetAliasAddress(lnk);
 		alias_port = GetAliasPort(lnk);
 
-		/* Walk out chain. */		
+		/* XXX broken - Walk out chain. */
 		error = find_handler(OUT, UDP, la, pip, &ad);
+		// XXX m_pullup()
 
 /* If UDP checksum is not zero, adjust since source port is */
 /* being aliased and source address is being altered        */
@@ -1290,16 +1306,6 @@
 	return (res);
 }
 
-#ifdef _KERNEL
-#define PULLUP_IPHDR(pip, ptr) do {             \
-        struct mbuf *m;                         \
-	m = m_pullup((ptr), sizeof(struct ip)); \
-        (pip) = mtod(m, struct ip *);           \
-} while (0)
-#else
-#define PULLUP_IPHDR(pip, ptr) pip = ptr
-#endif
-
 static int
 LibAliasInLocked(struct libalias *la, void *ptr, int maxpacketsize)
 {
@@ -1332,7 +1338,7 @@
 			iresult = IcmpAliasIn(la, pip);
 			break;
 		case IPPROTO_UDP:
-			iresult = UdpAliasIn(la, pip);
+			iresult = UdpAliasIn(la, ptr);
 			break;
 		case IPPROTO_TCP:
 			iresult = TcpAliasIn(la, pip);
@@ -1483,7 +1489,7 @@
 			iresult = IcmpAliasOut(la, pip, 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);


More information about the p4-projects mailing list