PERFORCE change 114002 for review
Paolo Pisati
piso at FreeBSD.org
Sun Feb 4 16:38:57 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=114002
Change 114002 by piso at 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;
}
}
More information about the p4-projects
mailing list