Skip to content

Commit

Permalink
Call pcap_set_immediate_mode to get results back immediately.
Browse files Browse the repository at this point in the history
  • Loading branch information
bonsaiviking committed Aug 21, 2018
1 parent 7f1485f commit d6a04c4
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 42 deletions.
5 changes: 5 additions & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
#Nmap Changelog ($Id$); -*-text-*-

o [GH#1291][GH#34] Use pcap_create instead of pcap_live_open in Nmap, and set
immediate mode on the pcap descriptor. This solves packet loss problems on
Linux and may improve performance on other platforms. [Daniel Cater, Mike
Pontillo, Daniel Miller]

o [GH#1150] Start host timeout clocks when the first probe is sent to a host,
not when the hostgroup is started. Sometimes a host doesn't get probes until
late in the hostgroup, increasing the chance it will time out. [jsiembida]
Expand Down
98 changes: 56 additions & 42 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -1948,48 +1948,6 @@ $as_echo "$ac_res" >&6; }

} # ac_fn_c_check_decl

# ac_fn_cxx_try_run LINENO
# ------------------------
# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
# that executables *can* be run.
ac_fn_cxx_try_run ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
{ { case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then :
ac_retval=0
else
$as_echo "$as_me: program exited with status $ac_status" >&5
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

ac_retval=$ac_status
fi
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval

} # ac_fn_cxx_try_run

# ac_fn_c_check_func LINENO FUNC VAR
# ----------------------------------
# Tests whether FUNC exists, setting the cache variable VAR accordingly
Expand Down Expand Up @@ -2056,6 +2014,48 @@ $as_echo "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_func

# ac_fn_cxx_try_run LINENO
# ------------------------
# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
# that executables *can* be run.
ac_fn_cxx_try_run ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
{ { case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then :
ac_retval=0
else
$as_echo "$as_me: program exited with status $ac_status" >&5
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

ac_retval=$ac_status
fi
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval

} # ac_fn_cxx_try_run
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
Expand Down Expand Up @@ -6413,6 +6413,9 @@ if test $have_libpcap != yes; then

$as_echo "#define PCAP_INCLUDED 1" >>confdefs.h


$as_echo "#define HAVE_PCAP_SET_IMMEDIATE_MODE 1" >>confdefs.h

else
# We assume our included libpcap doesn't need this check-and-define

Expand Down Expand Up @@ -6452,6 +6455,17 @@ $as_echo "#define PCAP_NETMASK_UNKNOWN 0" >>confdefs.h
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_pcap_netmask_unknown" >&5
$as_echo "$ac_cv_have_pcap_netmask_unknown" >&6; }

for ac_func in pcap_set_immediate_mode
do :
ac_fn_c_check_func "$LINENO" "pcap_set_immediate_mode" "ac_cv_func_pcap_set_immediate_mode"
if test "x$ac_cv_func_pcap_set_immediate_mode" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_PCAP_SET_IMMEDIATE_MODE 1
_ACEOF

fi
done



$as_echo "#define HAVE_LIBPCAP 1" >>confdefs.h
Expand Down
2 changes: 2 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -479,9 +479,11 @@ if test $have_libpcap != yes; then
PCAP_CLEAN="clean-pcap"
PCAP_DIST_CLEAN="distclean-pcap"
AC_DEFINE(PCAP_INCLUDED, 1, [Using included libpcap])
AC_DEFINE(HAVE_PCAP_SET_IMMEDIATE_MODE, 1, [Included libpcap has pcap_set_immediate_mode])
else
# We assume our included libpcap doesn't need this check-and-define
PCAP_DEFINE_NETMASK_UNKNOWN
AC_CHECK_FUNCS([pcap_set_immediate_mode])

AC_DEFINE(HAVE_LIBPCAP, 1, [Have libpcap library])
LIBPCAP_LIBS="-lpcap"
Expand Down
6 changes: 6 additions & 0 deletions libnetutil/netutil.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4127,6 +4127,9 @@ pcap_t *my_pcap_open_live(const char *device, int snaplen, int promisc, int to_m
MY_PCAP_SET(pcap_set_snaplen, pt, snaplen);
MY_PCAP_SET(pcap_set_promisc, pt, promisc);
MY_PCAP_SET(pcap_set_timeout, pt, to_ms);
#ifdef HAVE_PCAP_SET_IMMEDIATE_MODE
MY_PCAP_SET(pcap_set_immediate_mode, pt, 1);
#endif

failed = pcap_activate(pt);
if (failed < 0) {
Expand All @@ -4147,6 +4150,9 @@ pcap_t *my_pcap_open_live(const char *device, int snaplen, int promisc, int to_m
}
CloseHandle(pcapMutex);
/* We want any responses back ASAP */
/* This is unnecessary with Npcap since libpcap calls PacketSetMinToCopy(0)
* based on immediate mode. Have not determined if it is needed for WinPcap
* or not, but it's not hurting anything. */
pcap_setmintocopy(pt, 1);
#endif

Expand Down
1 change: 1 addition & 0 deletions nmap_config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -255,5 +255,6 @@ extern "C" int gethostname (char *, unsigned int);

#undef HAVE_IPV6_IPPROTO_RAW
#undef PCAP_NETMASK_UNKNOWN
#undef HAVE_PCAP_SET_IMMEDIATE_MODE

#endif /* CONFIG_H */

0 comments on commit d6a04c4

Please sign in to comment.