patches for easier mirroring, to eliminate a special copy, to make www.freebsd.org/security a full copy of security.freebsd.org and be eventually be the same. For now files are just sitting there. The symlinks are missing. Discussed on: www (repository location) Discussed with: simon (so)
84 lines
2.4 KiB
Diff
84 lines
2.4 KiB
Diff
Index: sys/netinet/ip_input.c
|
|
===================================================================
|
|
RCS file: /mnt/ncvs/src/sys/netinet/ip_input.c,v
|
|
retrieving revision 1.111.2.9
|
|
retrieving revision 1.111.2.10
|
|
diff -u -r1.111.2.9 -r1.111.2.10
|
|
--- sys/netinet/ip_input.c 2000/06/13 07:12:34 1.111.2.9
|
|
+++ sys/netinet/ip_input.c 2001/08/06 09:20:57 1.111.2.10
|
|
@@ -175,6 +175,12 @@
|
|
#endif
|
|
|
|
|
|
+static int ip_nfragpackets = 0;
|
|
+static int ip_maxfragpackets; /* initialized in ip_init() */
|
|
+SYSCTL_INT(_net_inet_ip, OID_AUTO, maxfragpackets, CTLFLAG_RW,
|
|
+ &ip_maxfragpackets, 0,
|
|
+ "Maximum number of IPv4 fragment reassembly queue entries");
|
|
+
|
|
/*
|
|
* We need to save the IP options in case a protocol wants to respond
|
|
* to an incoming packet over the same route if the packet got here
|
|
@@ -235,7 +241,8 @@
|
|
for (i = 0; i < IPREASS_NHASH; i++)
|
|
ipq[i].next = ipq[i].prev = &ipq[i];
|
|
|
|
- maxnipq = nmbclusters/4;
|
|
+ maxnipq = nmbclusters / 4;
|
|
+ ip_maxfragpackets = nmbclusters / 4;
|
|
|
|
ip_id = time_second & 0xffff;
|
|
ipintrq.ifq_maxlen = ipqmaxlen;
|
|
@@ -766,6 +773,15 @@
|
|
* If first fragment to arrive, create a reassembly queue.
|
|
*/
|
|
if (fp == 0) {
|
|
+ /*
|
|
+ * Enforce upper bound on number of fragmented packets
|
|
+ * for which we attempt reassembly;
|
|
+ * If maxfrag is 0, never accept fragments.
|
|
+ * If maxfrag is -1, accept all fragments without limitation.
|
|
+ */
|
|
+ if ((ip_maxfragpackets >= 0) && (ip_nfragpackets >= ip_maxfragpackets))
|
|
+ goto dropfrag;
|
|
+ ip_nfragpackets++;
|
|
if ((t = m_get(M_DONTWAIT, MT_FTABLE)) == NULL)
|
|
goto dropfrag;
|
|
fp = mtod(t, struct ipq *);
|
|
@@ -908,6 +924,7 @@
|
|
remque(fp);
|
|
nipq--;
|
|
(void) m_free(dtom(fp));
|
|
+ ip_nfragpackets--;
|
|
m->m_len += (IP_VHL_HL(ip->ip_vhl) << 2);
|
|
m->m_data -= (IP_VHL_HL(ip->ip_vhl) << 2);
|
|
/* some debugging cruft by sklower, below, will go away soon */
|
|
@@ -948,6 +965,7 @@
|
|
}
|
|
remque(fp);
|
|
(void) m_free(dtom(fp));
|
|
+ ip_nfragpackets--;
|
|
nipq--;
|
|
}
|
|
|
|
@@ -973,6 +991,20 @@
|
|
if (fp->prev->ipq_ttl == 0) {
|
|
ipstat.ips_fragtimeout++;
|
|
ip_freef(fp->prev);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ /*
|
|
+ * If we are over the maximum number of fragments
|
|
+ * (due to the limit being lowered), drain off
|
|
+ * enough to get down to the new limit.
|
|
+ */
|
|
+ for (i = 0; i < IPREASS_NHASH; i++) {
|
|
+ if (ip_maxfragpackets >= 0) {
|
|
+ while ((ip_nfragpackets > ip_maxfragpackets) &&
|
|
+ (ipq[i].next != &ipq[i])) {
|
|
+ ipstat.ips_fragdropped++;
|
|
+ ip_freef(ipq[i].next);
|
|
}
|
|
}
|
|
}
|