PERFORCE change 142850 for review
Gleb Kurtsou
gk at FreeBSD.org
Tue Jun 3 20:57:39 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=142850
Change 142850 by gk at gk_h1 on 2008/06/03 20:57:06
ifc
Affected files ...
.. //depot/projects/soc2008/gk_l2filter/sys-netinet/ip_carp.c#2 integrate
.. //depot/projects/soc2008/gk_l2filter/sys-netinet/ip_fw_nat.c#2 integrate
.. //depot/projects/soc2008/gk_l2filter/sys-netinet/libalias/alias.c#2 integrate
.. //depot/projects/soc2008/gk_l2filter/sys-netinet/libalias/alias_db.c#2 integrate
.. //depot/projects/soc2008/gk_l2filter/sys-netinet/libalias/alias_local.h#2 integrate
.. //depot/projects/soc2008/gk_l2filter/sys-netinet/tcp_subr.c#3 integrate
.. //depot/projects/soc2008/gk_l2filter/sys-netinet/tcp_timer.c#2 integrate
Differences ...
==== //depot/projects/soc2008/gk_l2filter/sys-netinet/ip_carp.c#2 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/ip_carp.c,v 1.53 2008/02/07 13:18:59 glebius Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/ip_carp.c,v 1.54 2008/06/02 18:58:07 mlaier Exp $");
#include "opt_carp.h"
#include "opt_bpf.h"
@@ -241,9 +241,12 @@
u_int8_t version = CARP_VERSION, type = CARP_ADVERTISEMENT;
u_int8_t vhid = sc->sc_vhid & 0xff;
struct ifaddr *ifa;
- int i;
+ int i, found;
+#ifdef INET
+ struct in_addr last, cur, in;
+#endif
#ifdef INET6
- struct in6_addr in6;
+ struct in6_addr last6, cur6, in6;
#endif
if (sc->sc_carpdev)
@@ -264,21 +267,44 @@
SHA1Update(&sc->sc_sha1, (void *)&type, sizeof(type));
SHA1Update(&sc->sc_sha1, (void *)&vhid, sizeof(vhid));
#ifdef INET
- TAILQ_FOREACH(ifa, &SC2IFP(sc)->if_addrlist, ifa_list) {
- if (ifa->ifa_addr->sa_family == AF_INET)
- SHA1Update(&sc->sc_sha1,
- (void *)&ifatoia(ifa)->ia_addr.sin_addr.s_addr,
- sizeof(struct in_addr));
- }
+ cur.s_addr = 0;
+ do {
+ found = 0;
+ last = cur;
+ cur.s_addr = 0xffffffff;
+ TAILQ_FOREACH(ifa, &SC2IFP(sc)->if_addrlist, ifa_list) {
+ in.s_addr = ifatoia(ifa)->ia_addr.sin_addr.s_addr;
+ if (ifa->ifa_addr->sa_family == AF_INET &&
+ ntohl(in.s_addr) > ntohl(last.s_addr) &&
+ ntohl(in.s_addr) < ntohl(cur.s_addr)) {
+ cur.s_addr = in.s_addr;
+ found++;
+ }
+ }
+ if (found)
+ SHA1Update(&sc->sc_sha1, (void *)&cur, sizeof(cur));
+ } while (found);
#endif /* INET */
#ifdef INET6
- TAILQ_FOREACH(ifa, &SC2IFP(sc)->if_addrlist, ifa_list) {
- if (ifa->ifa_addr->sa_family == AF_INET6) {
+ memset(&cur6, 0, sizeof(cur6));
+ do {
+ found = 0;
+ last6 = cur6;
+ memset(&cur6, 0xff, sizeof(cur6));
+ TAILQ_FOREACH(ifa, &SC2IFP(sc)->if_addrlist, ifa_list) {
in6 = ifatoia6(ifa)->ia_addr.sin6_addr;
- in6_clearscope(&in6);
- SHA1Update(&sc->sc_sha1, (void *)&in6, sizeof(in6));
+ if (IN6_IS_SCOPE_EMBED(&in6))
+ in6.s6_addr16[1] = 0;
+ if (ifa->ifa_addr->sa_family == AF_INET6 &&
+ memcmp(&in6, &last6, sizeof(in6)) > 0 &&
+ memcmp(&in6, &cur6, sizeof(in6)) < 0) {
+ cur6 = in6;
+ found++;
+ }
}
- }
+ if (found)
+ SHA1Update(&sc->sc_sha1, (void *)&cur6, sizeof(cur6));
+ } while (found);
#endif /* INET6 */
/* convert ipad to opad */
==== //depot/projects/soc2008/gk_l2filter/sys-netinet/ip_fw_nat.c#2 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/ip_fw_nat.c,v 1.2 2008/03/03 22:32:01 piso Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/ip_fw_nat.c,v 1.3 2008/06/01 12:29:23 mav Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -318,11 +318,12 @@
c = mtod(mcl, char *);
if (args->oif == NULL)
retval = LibAliasIn(t->lib, c,
- MCLBYTES);
+ mcl->m_len + M_TRAILINGSPACE(mcl));
else
retval = LibAliasOut(t->lib, c,
- MCLBYTES);
- if (retval != PKT_ALIAS_OK) {
+ mcl->m_len + M_TRAILINGSPACE(mcl));
+ if (retval != PKT_ALIAS_OK &&
+ retval != PKT_ALIAS_FOUND_HEADER_FRAGMENT) {
/* XXX - should i add some logging? */
m_free(mcl);
badnat:
==== //depot/projects/soc2008/gk_l2filter/sys-netinet/libalias/alias.c#2 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias.c,v 1.61 2008/05/02 18:54:36 marck Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias.c,v 1.63 2008/06/01 17:52:40 mav Exp $");
/*
Alias.c provides supervisory control for the functions of the
@@ -1092,13 +1092,13 @@
/* Local prototypes */
static int FragmentIn(struct libalias *la, struct in_addr ip_src,
- struct in_addr *ip_dst, u_char ip_p, u_short *ip_sum);
+ struct in_addr *ip_dst, u_short ip_id, u_short *ip_sum);
static int FragmentOut(struct libalias *, struct in_addr *ip_src,
u_short *ip_sum);
static int
FragmentIn(struct libalias *la, struct in_addr ip_src, struct in_addr *ip_dst,
- u_char ip_id, u_short *ip_sum)
+ u_short ip_id, u_short *ip_sum)
{
struct alias_link *lnk;
@@ -1656,29 +1656,49 @@
* m_megapullup() - this function is a big hack.
* Thankfully, it's only used in ng_nat and ipfw+nat.
*
- * It allocates an mbuf with cluster and copies the whole chain into cluster,
- * so that it is all contiguous and the whole packet can be accessed via a
- * plain (char *) pointer. This is required, because libalias doesn't know
- * how to handle mbuf chains.
+ * It allocates an mbuf with cluster and copies the specified part of the chain
+ * into cluster, so that it is all contiguous and can be accessed via a plain
+ * (char *) pointer. This is required, because libalias doesn't know how to
+ * handle mbuf chains.
*
- * On success, m_megapullup returns an mbuf with cluster containing the input
- * packet, on failure NULL. In both cases, the input packet is consumed.
+ * On success, m_megapullup returns an mbuf (possibly with cluster) containing
+ * the input packet, on failure NULL. The input packet is always consumed.
*/
struct mbuf *
m_megapullup(struct mbuf *m, int len) {
struct mbuf *mcl;
- caddr_t cp;
- if (len > MCLBYTES)
+ if (len > m->m_pkthdr.len)
goto bad;
- if ((mcl = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR)) == NULL)
+ /* Do not reallocate packet if it is sequentional,
+ * writable and has some extra space for expansion.
+ * XXX: Constant 100bytes is completely empirical. */
+#define RESERVE 100
+ if (m->m_next == NULL && M_WRITABLE(m) && M_TRAILINGSPACE(m) >= RESERVE)
+ return (m);
+
+ if (len <= MCLBYTES - RESERVE) {
+ mcl = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
+ } else if (len < MJUM16BYTES) {
+ int size;
+ if (len <= MJUMPAGESIZE - RESERVE) {
+ size = MJUMPAGESIZE;
+ } else if (len <= MJUM9BYTES - RESERVE) {
+ size = MJUM9BYTES;
+ } else {
+ size = MJUM16BYTES;
+ };
+ mcl = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, size);
+ } else {
+ goto bad;
+ }
+ if (mcl == NULL)
goto bad;
- cp = mtod(mcl, caddr_t);
- m_copydata(m, 0, len, cp);
m_move_pkthdr(mcl, m);
- mcl->m_len = mcl->m_pkthdr.len;
+ m_copydata(m, 0, len, mtod(mcl, caddr_t));
+ mcl->m_len = mcl->m_pkthdr.len = len;
m_freem(m);
return (mcl);
==== //depot/projects/soc2008/gk_l2filter/sys-netinet/libalias/alias_db.c#2 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_db.c,v 1.72 2008/03/06 21:50:40 piso Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/libalias/alias_db.c,v 1.73 2008/06/01 18:34:58 mav Exp $");
/*
Alias_db.c encapsulates all data structures used for storing
@@ -180,8 +180,9 @@
*/
/* Parameters used for cleanup of expired links */
-#define ALIAS_CLEANUP_INTERVAL_SECS 60
-#define ALIAS_CLEANUP_MAX_SPOKES 30
+/* NOTE: ALIAS_CLEANUP_INTERVAL_SECS must be less then LINK_TABLE_OUT_SIZE */
+#define ALIAS_CLEANUP_INTERVAL_SECS 64
+#define ALIAS_CLEANUP_MAX_SPOKES (LINK_TABLE_OUT_SIZE/5)
/* Timeouts (in seconds) for different link types */
#define ICMP_EXPIRE_TIME 60
@@ -814,20 +815,12 @@
CleanupAliasData(struct libalias *la)
{
struct alias_link *lnk;
- int i, icount;
+ int i;
LIBALIAS_LOCK_ASSERT(la);
- icount = 0;
for (i = 0; i < LINK_TABLE_OUT_SIZE; i++) {
- lnk = LIST_FIRST(&la->linkTableOut[i]);
- while (lnk != NULL) {
- struct alias_link *link_next;
-
- link_next = LIST_NEXT(lnk, list_out);
- icount++;
+ while ((lnk = LIST_FIRST(&la->linkTableOut[i])) != NULL)
DeleteLink(lnk);
- lnk = link_next;
- }
}
la->cleanupIndex = 0;
@@ -837,39 +830,13 @@
static void
IncrementalCleanup(struct libalias *la)
{
- int icount;
- struct alias_link *lnk;
+ struct alias_link *lnk, *lnk_tmp;
LIBALIAS_LOCK_ASSERT(la);
- icount = 0;
- lnk = LIST_FIRST(&la->linkTableOut[la->cleanupIndex++]);
- while (lnk != NULL) {
- int idelta;
- struct alias_link *link_next;
-
- link_next = LIST_NEXT(lnk, list_out);
- idelta = la->timeStamp - lnk->timestamp;
- switch (lnk->link_type) {
- case LINK_TCP:
- if (idelta > lnk->expire_time) {
- struct tcp_dat *tcp_aux;
-
- tcp_aux = lnk->data.tcp;
- if (tcp_aux->state.in != ALIAS_TCP_STATE_CONNECTED
- || tcp_aux->state.out != ALIAS_TCP_STATE_CONNECTED) {
- DeleteLink(lnk);
- icount++;
- }
- }
- break;
- default:
- if (idelta > lnk->expire_time) {
- DeleteLink(lnk);
- icount++;
- }
- break;
- }
- lnk = link_next;
+ LIST_FOREACH_SAFE(lnk, &la->linkTableOut[la->cleanupIndex++],
+ list_out, lnk_tmp) {
+ if (la->timeStamp - lnk->timestamp > lnk->expire_time)
+ DeleteLink(lnk);
}
if (la->cleanupIndex == LINK_TABLE_OUT_SIZE)
@@ -1137,12 +1104,12 @@
LIBALIAS_LOCK_ASSERT(la);
i = StartPointOut(src_addr, dst_addr, src_port, dst_port, link_type);
LIST_FOREACH(lnk, &la->linkTableOut[i], list_out) {
- if (lnk->src_addr.s_addr == src_addr.s_addr
- && lnk->server == NULL
- && lnk->dst_addr.s_addr == dst_addr.s_addr
- && lnk->dst_port == dst_port
- && lnk->src_port == src_port
- && lnk->link_type == link_type) {
+ if (lnk->dst_addr.s_addr == dst_addr.s_addr &&
+ lnk->src_addr.s_addr == src_addr.s_addr &&
+ lnk->src_port == src_port &&
+ lnk->dst_port == dst_port &&
+ lnk->link_type == link_type &&
+ lnk->server == NULL) {
lnk->timestamp = la->timeStamp;
break;
}
@@ -2189,7 +2156,7 @@
void
HouseKeeping(struct libalias *la)
{
- int i, n, n100;
+ int i, n;
#ifndef _KERNEL
struct timeval tv;
struct timezone tz;
@@ -2209,33 +2176,22 @@
#endif
/* Compute number of spokes (output table link chains) to cover */
- n100 = LINK_TABLE_OUT_SIZE * 100 + la->houseKeepingResidual;
- n100 *= la->timeStamp - la->lastCleanupTime;
- n100 /= ALIAS_CLEANUP_INTERVAL_SECS;
+ n = LINK_TABLE_OUT_SIZE * (la->timeStamp - la->lastCleanupTime);
+ n /= ALIAS_CLEANUP_INTERVAL_SECS;
- n = n100 / 100;
-
/* Handle different cases */
- if (n > ALIAS_CLEANUP_MAX_SPOKES) {
- n = ALIAS_CLEANUP_MAX_SPOKES;
+ if (n > 0) {
+ if (n > ALIAS_CLEANUP_MAX_SPOKES)
+ n = ALIAS_CLEANUP_MAX_SPOKES;
la->lastCleanupTime = la->timeStamp;
- la->houseKeepingResidual = 0;
-
for (i = 0; i < n; i++)
IncrementalCleanup(la);
- } else if (n > 0) {
- la->lastCleanupTime = la->timeStamp;
- la->houseKeepingResidual = n100 - 100 * n;
-
- for (i = 0; i < n; i++)
- IncrementalCleanup(la);
} else if (n < 0) {
#ifdef LIBALIAS_DEBUG
fprintf(stderr, "PacketAlias/HouseKeeping(): ");
fprintf(stderr, "something unexpected in time values\n");
#endif
la->lastCleanupTime = la->timeStamp;
- la->houseKeepingResidual = 0;
}
}
@@ -2529,7 +2485,6 @@
la->timeStamp = tv.tv_sec;
la->lastCleanupTime = tv.tv_sec;
#endif
- la->houseKeepingResidual = 0;
for (i = 0; i < LINK_TABLE_OUT_SIZE; i++)
LIST_INIT(&la->linkTableOut[i]);
==== //depot/projects/soc2008/gk_l2filter/sys-netinet/libalias/alias_local.h#2 (text+ko) ====
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: src/sys/netinet/libalias/alias_local.h,v 1.35 2008/03/06 21:50:40 piso Exp $
+ * $FreeBSD: src/sys/netinet/libalias/alias_local.h,v 1.36 2008/06/01 18:34:58 mav Exp $
*/
/*
@@ -60,7 +60,7 @@
#endif
/* Sizes of input and output link tables */
-#define LINK_TABLE_OUT_SIZE 101
+#define LINK_TABLE_OUT_SIZE 4001
#define LINK_TABLE_IN_SIZE 4001
struct proxy_entry;
@@ -110,8 +110,6 @@
* IncrementalCleanup() */
/* was called */
- int houseKeepingResidual; /* used by HouseKeeping() */
-
int deleteAllLinks; /* If equal to zero, DeleteLink() */
/* will not remove permanent links */
==== //depot/projects/soc2008/gk_l2filter/sys-netinet/tcp_subr.c#3 (text+ko) ====
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/tcp_subr.c,v 1.307 2008/05/29 14:28:26 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/tcp_subr.c,v 1.308 2008/06/02 14:20:26 rwatson Exp $");
#include "opt_compat.h"
#include "opt_inet.h"
@@ -385,17 +385,13 @@
struct tcptemp *
tcpip_maketemplate(struct inpcb *inp)
{
- struct mbuf *m;
- struct tcptemp *n;
+ struct tcptemp *t;
- m = m_get(M_DONTWAIT, MT_DATA);
- if (m == NULL)
- return (0);
- m->m_len = sizeof(struct tcptemp);
- n = mtod(m, struct tcptemp *);
-
- tcpip_fillheaders(inp, (void *)&n->tt_ipgen, (void *)&n->tt_t);
- return (n);
+ t = malloc(sizeof(*t), M_TEMP, M_NOWAIT);
+ if (t == NULL)
+ return (NULL);
+ tcpip_fillheaders(inp, (void *)&t->tt_ipgen, (void *)&t->tt_t);
+ return (t);
}
/*
==== //depot/projects/soc2008/gk_l2filter/sys-netinet/tcp_timer.c#2 (text+ko) ====
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netinet/tcp_timer.c,v 1.100 2008/04/17 21:38:16 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netinet/tcp_timer.c,v 1.101 2008/06/02 14:20:26 rwatson Exp $");
#include "opt_inet6.h"
#include "opt_tcpdebug.h"
@@ -313,7 +313,7 @@
tcp_respond(tp, t_template->tt_ipgen,
&t_template->tt_t, (struct mbuf *)NULL,
tp->rcv_nxt, tp->snd_una - 1, 0);
- (void) m_free(dtom(t_template));
+ free(t_template, M_TEMP);
}
callout_reset(&tp->t_timers->tt_keep, tcp_keepintvl, tcp_timer_keep, tp);
} else
More information about the p4-projects
mailing list