PERFORCE change 116274 for review
John Baldwin
jhb at FreeBSD.org
Wed Mar 21 19:14:53 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=116274
Change 116274 by jhb at jhb_mutex on 2007/03/21 19:14:12
IFC @116273
Affected files ...
.. //depot/projects/smpng/sys/dev/iwi/if_iwi.c#27 integrate
.. //depot/projects/smpng/sys/netinet/tcp_input.c#99 integrate
.. //depot/projects/smpng/sys/netinet/tcp_output.c#45 integrate
Differences ...
==== //depot/projects/smpng/sys/dev/iwi/if_iwi.c#27 (text+ko) ====
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/iwi/if_iwi.c,v 1.51 2007/03/11 22:39:13 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/iwi/if_iwi.c,v 1.52 2007/03/21 18:40:31 jhb Exp $");
/*-
* Intel(R) PRO/Wireless 2200BG/2225BG/2915ABG driver
@@ -3093,7 +3093,7 @@
static int
iwi_init_fw_dma(struct iwi_softc *sc, int size)
{
- if (sc->fw_dma_size > size)
+ if (sc->fw_dma_size >= size)
return 0;
if (bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0,
BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
==== //depot/projects/smpng/sys/netinet/tcp_input.c#99 (text+ko) ====
@@ -27,10 +27,10 @@
* SUCH DAMAGE.
*
* @(#)tcp_input.c 8.12 (Berkeley) 5/24/95
- * $FreeBSD: src/sys/netinet/tcp_input.c,v 1.320 2007/03/21 18:25:28 andre Exp $
+ * $FreeBSD: src/sys/netinet/tcp_input.c,v 1.324 2007/03/21 18:56:03 andre Exp $
*/
-#include "opt_ipfw.h" /* for ipfw_fwd */
+#include "opt_ipfw.h" /* for ipfw_fwd */
#include "opt_inet.h"
#include "opt_inet6.h"
#include "opt_ipsec.h"
@@ -106,11 +106,11 @@
static int tcp_log_in_vain = 0;
SYSCTL_INT(_net_inet_tcp, OID_AUTO, log_in_vain, CTLFLAG_RW,
- &tcp_log_in_vain, 0, "Log all incoming TCP connections");
+ &tcp_log_in_vain, 0, "Log all incoming TCP segments to closed ports");
static int blackhole = 0;
SYSCTL_INT(_net_inet_tcp, OID_AUTO, blackhole, CTLFLAG_RW,
- &blackhole, 0, "Do not send RST when dropping refused connections");
+ &blackhole, 0, "Do not send RST on segments to closed ports");
int tcp_delack_enabled = 1;
SYSCTL_INT(_net_inet_tcp, OID_AUTO, delayed_ack, CTLFLAG_RW,
@@ -617,14 +617,7 @@
th->th_urp = ntohs(th->th_urp);
/*
- * Delay dropping TCP, IP headers, IPv6 ext headers, and TCP options,
- * until after ip6_savecontrol() is called and before other functions
- * which don't want those proto headers.
- * Because ip6_savecontrol() is going to parse the mbuf to
- * search for data to be passed up to user-land, it wants mbuf
- * parameters to be unchanged.
- * XXX: the call of ip6_savecontrol() has been obsoleted based on
- * latest version of the advanced API (20020110).
+ * Delay dropping TCP, IP headers, IPv6 ext headers, and TCP options.
*/
drop_hdrlen = off0 + off;
@@ -664,8 +657,9 @@
}
/* Remove the tag from the packet. We don't need it anymore. */
m_tag_delete(m, fwd_tag);
- } else {
+ } else
#endif /* IPFIREWALL_FORWARD */
+ {
if (isipv6) {
#ifdef INET6
inp = in6_pcblookup_hash(&tcbinfo,
@@ -680,9 +674,7 @@
ip->ip_dst, th->th_dport,
INPLOOKUP_WILDCARD,
m->m_pkthdr.rcvif);
-#ifdef IPFIREWALL_FORWARD
}
-#endif /* IPFIREWALL_FORWARD */
#if defined(IPSEC) || defined(FAST_IPSEC)
#ifdef INET6
@@ -704,62 +696,49 @@
#endif /*IPSEC || FAST_IPSEC*/
/*
- * If the state is CLOSED (i.e., TCB does not exist) then
- * all data in the incoming segment is discarded.
- * If the TCB exists but is in CLOSED state, it is embryonic,
- * but should either do a listen or a connect soon.
+ * If the INPCB does not exist then all data in the incoming
+ * segment is discarded and an appropriate RST is sent back.
*/
if (inp == NULL) {
- if (tcp_log_in_vain) {
-#ifdef INET6
+ /*
+ * Log communication attempts to ports that are not
+ * in use.
+ */
+ if ((tcp_log_in_vain == 1 && (thflags & TH_SYN)) ||
+ tcp_log_in_vain == 2) {
+#ifndef INET6
+ char dbuf[4*sizeof "123"], sbuf[4*sizeof "123"];
+#else
char dbuf[INET6_ADDRSTRLEN+2], sbuf[INET6_ADDRSTRLEN+2];
-#else
- char dbuf[4*sizeof "123"], sbuf[4*sizeof "123"];
-#endif
-
if (isipv6) {
-#ifdef INET6
strcpy(dbuf, "[");
- strcpy(sbuf, "[");
strcat(dbuf,
ip6_sprintf(ip6buf, &ip6->ip6_dst));
+ strcat(dbuf, "]");
+ strcpy(sbuf, "[");
strcat(sbuf,
ip6_sprintf(ip6buf, &ip6->ip6_src));
- strcat(dbuf, "]");
strcat(sbuf, "]");
-#endif
- } else {
+ } else
+#endif /* INET6 */
+ {
strcpy(dbuf, inet_ntoa(ip->ip_dst));
strcpy(sbuf, inet_ntoa(ip->ip_src));
}
- switch (tcp_log_in_vain) {
- case 1:
- if ((thflags & TH_SYN) == 0)
- break;
- /* FALLTHROUGH */
- case 2:
- log(LOG_INFO,
- "Connection attempt to TCP %s:%d "
- "from %s:%d flags:0x%02x\n",
- dbuf, ntohs(th->th_dport), sbuf,
- ntohs(th->th_sport), thflags);
- break;
- default:
- break;
- }
+ log(LOG_INFO,
+ "Connection attempt to TCP %s:%d "
+ "from %s:%d flags:0x%02x\n",
+ dbuf, ntohs(th->th_dport), sbuf,
+ ntohs(th->th_sport), thflags);
}
- if (blackhole) {
- switch (blackhole) {
- case 1:
- if (thflags & TH_SYN)
- goto drop;
- break;
- case 2:
- goto drop;
- default:
- goto drop;
- }
- }
+ /*
+ * When blackholing do not respond with a RST but
+ * completely ignore the segment and drop it.
+ */
+ if ((blackhole == 1 && (thflags & TH_SYN)) ||
+ blackhole == 2)
+ goto drop;
+
rstreason = BANDLIM_RST_CLOSEDPORT;
goto dropwithreset;
}
@@ -776,21 +755,26 @@
goto drop;
}
+ /*
+ * A previous connection in TIMEWAIT state is supposed to catch
+ * stray or duplicate segments arriving late. If this segment
+ * was a legitimate new connection attempt the old INPCB gets
+ * removed and we can try again to find a listening socket.
+ */
if (inp->inp_vflag & INP_TIMEWAIT) {
- /*
- * The only option of relevance is TOF_CC, and only if
- * present in a SYN segment. See tcp_timewait().
- */
if (thflags & TH_SYN)
tcp_dooptions(&to, optp, optlen, TO_SYN);
if (tcp_timewait(inp, &to, th, m, tlen))
goto findpcb;
- /*
- * tcp_timewait unlocks inp.
- */
+ /* tcp_timewait unlocks inp. */
INP_INFO_WUNLOCK(&tcbinfo);
return;
}
+ /*
+ * The TCPCB may no longer exist if the connection is winding
+ * down or it is in the CLOSED state. Either way we drop the
+ * segment and send an appropriate response.
+ */
tp = intotcpcb(inp);
if (tp == 0) {
INP_UNLOCK(inp);
@@ -817,13 +801,16 @@
tcp_savetcp = *th;
}
#endif
+ /*
+ * When the socket is accepting connections (the INPCB is in LISTEN
+ * state) we look into the SYN cache if this is a new connection
+ * attempt or the completion of a previous one.
+ */
if (so->so_options & SO_ACCEPTCONN) {
struct in_conninfo inc;
bzero(&inc, sizeof(inc));
-#ifdef INET6
inc.inc_isipv6 = isipv6;
-#endif
if (isipv6) {
inc.inc6_faddr = ip6->ip6_src;
inc.inc6_laddr = ip6->ip6_dst;
@@ -949,21 +936,12 @@
}
#endif
/*
+ * Basic sanity checks on incoming SYN requests:
+ *
+ * Don't bother responding if the destination was a
+ * broadcast according to RFC1122 4.2.3.10, p. 104.
+ *
* If it is from this socket, drop it, it must be forged.
- * Don't bother responding if the destination was a broadcast.
- */
- if (th->th_dport == th->th_sport) {
- if (isipv6) {
- if (IN6_ARE_ADDR_EQUAL(&ip6->ip6_dst,
- &ip6->ip6_src))
- goto drop;
- } else {
- if (ip->ip_dst.s_addr == ip->ip_src.s_addr)
- goto drop;
- }
- }
- /*
- * RFC1122 4.2.3.10, p. 104: discard bcast/mcast SYN
*
* Note that it is quite possible to receive unicast
* link-layer packets with a broadcast IP address. Use
@@ -972,10 +950,18 @@
if (m->m_flags & (M_BCAST|M_MCAST))
goto drop;
if (isipv6) {
+#ifdef INET6
+ if (th->th_dport == th->th_sport &&
+ IN6_ARE_ADDR_EQUAL(&ip6->ip6_dst, &ip6->ip6_src))
+ goto drop;
if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst) ||
IN6_IS_ADDR_MULTICAST(&ip6->ip6_src))
goto drop;
+#endif
} else {
+ if (th->th_dport == th->th_sport &&
+ ip->ip_dst.s_addr == ip->ip_src.s_addr)
+ goto drop;
if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr)) ||
IN_MULTICAST(ntohl(ip->ip_src.s_addr)) ||
ip->ip_src.s_addr == htonl(INADDR_BROADCAST) ||
@@ -983,8 +969,8 @@
goto drop;
}
/*
- * SYN appears to be valid; create compressed TCP state
- * for syncache, or perform t/tcp connection.
+ * SYN appears to be valid. Create compressed TCP state
+ * for syncache.
*/
if (so->so_qlen <= so->so_qlimit) {
#ifdef TCPDEBUG
@@ -994,47 +980,18 @@
#endif
tcp_dooptions(&to, optp, optlen, TO_SYN);
if (!syncache_add(&inc, &to, th, inp, &so, m))
- goto drop; /* XXX: does not happen */
- if (so == NULL) {
- /*
- * Entry added to syncache, mbuf used to
- * send SYN,ACK packet. Everything unlocked
- * already.
- */
- return;
- }
- panic("T/TCP not supported at the moment");
-#if 0 /* T/TCP */
+ goto drop;
/*
- * Segment passed TAO tests.
- * XXX: Can't happen at the moment.
+ * Entry added to syncache, mbuf used to
+ * send SYN-ACK packet. Everything unlocked
+ * already.
*/
- INP_UNLOCK(inp);
- inp = sotoinpcb(so);
- INP_LOCK(inp);
- tp = intotcpcb(inp);
- tp->t_starttime = ticks;
- tp->t_state = TCPS_ESTABLISHED;
-
- /*
- * T/TCP logic:
- * If there is a FIN or if there is data, then
- * delay SYN,ACK(SYN) in the hope of piggy-backing
- * it on a response segment. Otherwise must send
- * ACK now in case the other side is slow starting.
- */
- if (thflags & TH_FIN || tlen != 0)
- tp->t_flags |= (TF_DELACK | TF_NEEDSYN);
- else
- tp->t_flags |= (TF_ACKNOW | TF_NEEDSYN);
- tiwin = th->th_win << tp->snd_scale;
- tcpstat.tcps_connects++;
- soisconnected(so);
- goto trimthenstep6;
-#endif /* T/TCP */
+ return;
}
+ /* Catch all. Everthing that makes it down here is junk. */
goto drop;
}
+
after_listen:
KASSERT(headlocked, ("tcp_input: after_listen: head not locked"));
INP_LOCK_ASSERT(inp);
@@ -1481,9 +1438,6 @@
tp->t_state = TCPS_SYN_RECEIVED;
}
-#if 0 /* T/TCP */
-trimthenstep6:
-#endif
KASSERT(headlocked, ("tcp_input: trimthenstep6: head not "
"locked"));
INP_LOCK_ASSERT(inp);
==== //depot/projects/smpng/sys/netinet/tcp_output.c#45 (text+ko) ====
@@ -27,7 +27,7 @@
* SUCH DAMAGE.
*
* @(#)tcp_output.c 8.4 (Berkeley) 5/24/95
- * $FreeBSD: src/sys/netinet/tcp_output.c,v 1.128 2007/03/19 18:42:27 andre Exp $
+ * $FreeBSD: src/sys/netinet/tcp_output.c,v 1.129 2007/03/21 19:04:07 andre Exp $
*/
#include "opt_inet.h"
@@ -717,7 +717,7 @@
if (len + optlen + ipoptlen > tp->t_maxopd) {
flags &= ~TH_FIN;
if (tso) {
- if (len > TCP_MAXWIN - hdrlen) {
+ if (len > TCP_MAXWIN - hdrlen - optlen) {
len = TCP_MAXWIN - hdrlen - optlen;
len = len - (len % (tp->t_maxopd - optlen));
sendalot = 1;
More information about the p4-projects
mailing list