#include "config.h"
+#include <assert.h>
#include <errno.h>
#include <stddef.h>
#include <stdio.h>
* try to hug that initially.
*/
for (;;) {
+ assert(lo <= mtu && mtu <= hi);
+ if (pp->f & F_VERBOSE) moan("probe: %d <= %d <= %d", lo, mtu, hi);
rc = probe(&ps, st, mtu);
switch (rc) {
if (pp->f & F_VERBOSE) moan("probe returned: found correct MTU");
goto done;
}
- if (pp->f & F_VERBOSE) moan("probe returned: guessing higher");
lo = mtu;
+
+ /* Now we must make a new guess, between lo and hi. We know that lo
+ * is good; but we're not so sure about hi here. We know that hi >
+ * lo, so this will find an approximate midpoint, greater than lo and
+ * no more than hi.
+ */
+ if (pp->f & F_VERBOSE) moan("probe returned: guessing higher");
mtu += (hi - lo + 1)/2;
break;
case RC_LOWER:
lower:
- if (mtu == lo) {
+ /* If this didn't work, and we're already at the bottom of our
+ * possible range, then something has gone horribly wrong.
+ */
+ assert(lo < mtu);
+ hi = mtu - 1;
+ if (lo == hi) {
if (pp->f & F_VERBOSE) moan("error returned: found correct MTU");
+ mtu = lo;
goto done;
}
+
+ /* We must make a new guess, between lo and hi. We're probably
+ * fairly sure that lo will succeed, since either it's the minimum
+ * MTU or we've tested it already; but we're not quite sure about hi,
+ * so we want to aim high.
+ */
if (pp->f & F_VERBOSE) moan("error returned: guessing lower");
- hi = mtu - 1;
mtu -= (hi - lo + 1)/2;
break;