mirror of
https://repo.or.cz/socat.git
synced 2024-12-23 07:52:32 +00:00
Option so-reuseport did not work
This commit is contained in:
parent
6f48016ed8
commit
2ea6da3839
4 changed files with 160 additions and 5 deletions
3
CHANGES
3
CHANGES
|
@ -14,6 +14,9 @@ corrections:
|
||||||
|
|
||||||
Some minor corrections with includes etc.
|
Some minor corrections with includes etc.
|
||||||
|
|
||||||
|
Option so-reuseport did not work. Thanks to Some Raghavendra Prabhu
|
||||||
|
for sending a patch.
|
||||||
|
|
||||||
porting:
|
porting:
|
||||||
Type conflict between int and sig_atomic_t between declaration and
|
Type conflict between int and sig_atomic_t between declaration and
|
||||||
definition of diag_immediate_type and diag_immediate_exit broke
|
definition of diag_immediate_type and diag_immediate_exit broke
|
||||||
|
|
|
@ -1911,8 +1911,8 @@ COMMENT(label(OPTION_PASSCRED)dit(bf(tt(passcred)))
|
||||||
Set the code(SO_PASSCRED) socket option.)
|
Set the code(SO_PASSCRED) socket option.)
|
||||||
COMMENT(label(OPTION_PEERCRED)dit(bf(tt(peercred)))
|
COMMENT(label(OPTION_PEERCRED)dit(bf(tt(peercred)))
|
||||||
This is a read-only socket option.)
|
This is a read-only socket option.)
|
||||||
COMMENT(label(OPTION_REUSEPORT)dit(bf(tt(reuseport)))
|
label(OPTION_REUSEPORT)dit(bf(tt(reuseport)))
|
||||||
Set the code(SO_REUSEPORT) socket option.)
|
Set the code(SO_REUSEPORT) socket option.
|
||||||
COMMENT(label(OPTION_SECUTIYAUTHENTICATION)dit(bf(tt(securityauthentication)))
|
COMMENT(label(OPTION_SECUTIYAUTHENTICATION)dit(bf(tt(securityauthentication)))
|
||||||
Set the code(SO_SECURITY_AUTHENTICATION) socket option.)
|
Set the code(SO_SECURITY_AUTHENTICATION) socket option.)
|
||||||
COMMENT(label(OPTION_SECURITYENCRYPTIONNETWORK)dit(bf(tt(securityencryptionnetwork)))
|
COMMENT(label(OPTION_SECURITYENCRYPTIONNETWORK)dit(bf(tt(securityencryptionnetwork)))
|
||||||
|
|
154
test.sh
154
test.sh
|
@ -10647,7 +10647,7 @@ TEST="$NAME: test the setsockopt-int option"
|
||||||
# (generically specified) SO_REUSEADDR socket options did not work
|
# (generically specified) SO_REUSEADDR socket options did not work
|
||||||
# process 3 connects to this port; only if it is successful the test is ok
|
# process 3 connects to this port; only if it is successful the test is ok
|
||||||
if ! eval $NUMCOND; then :;
|
if ! eval $NUMCOND; then :;
|
||||||
elif [ -z "SO_REUSEADDR" ]; then
|
elif [ -z "$SO_REUSEADDR" ]; then
|
||||||
# we use the numeric value of SO_REUSEADDR which might be system dependent
|
# we use the numeric value of SO_REUSEADDR which might be system dependent
|
||||||
$PRINTF "test $F_n $TEST... ${YELLOW}value of SO_REUSEADDR not known${NORMAL}\n" $N
|
$PRINTF "test $F_n $TEST... ${YELLOW}value of SO_REUSEADDR not known${NORMAL}\n" $N
|
||||||
numCANT=$((numCANT+1))
|
numCANT=$((numCANT+1))
|
||||||
|
@ -10681,6 +10681,8 @@ if ! echo "$da" |diff - "$tf"; then
|
||||||
numCANT=$((numCANT+1))
|
numCANT=$((numCANT+1))
|
||||||
elif [ $rc3 -ne 0 ]; then
|
elif [ $rc3 -ne 0 ]; then
|
||||||
$PRINTF "$FAILED: $TRACE $SOCAT:\n"
|
$PRINTF "$FAILED: $TRACE $SOCAT:\n"
|
||||||
|
echo "$CMD0 &"
|
||||||
|
echo "$CMD1"
|
||||||
echo "$CMD2 &"
|
echo "$CMD2 &"
|
||||||
echo "$CMD3"
|
echo "$CMD3"
|
||||||
cat "${te}2" "${te}3"
|
cat "${te}2" "${te}3"
|
||||||
|
@ -10688,6 +10690,8 @@ elif [ $rc3 -ne 0 ]; then
|
||||||
listFAIL="$listFAIL $N"
|
listFAIL="$listFAIL $N"
|
||||||
elif ! echo "$da" |diff - "${tf}3"; then
|
elif ! echo "$da" |diff - "${tf}3"; then
|
||||||
$PRINTF "$FAILED: $TRACE $SOCAT:\n"
|
$PRINTF "$FAILED: $TRACE $SOCAT:\n"
|
||||||
|
echo "$CMD0 &"
|
||||||
|
echo "$CMD1"
|
||||||
echo "$CMD2 &"
|
echo "$CMD2 &"
|
||||||
echo "$CMD3"
|
echo "$CMD3"
|
||||||
echo "$da" |diff - "${tf}3"
|
echo "$da" |diff - "${tf}3"
|
||||||
|
@ -12234,6 +12238,154 @@ PORT=$((PORT+1))
|
||||||
N=$((N+1))
|
N=$((N+1))
|
||||||
|
|
||||||
|
|
||||||
|
# test the so-reuseaddr option
|
||||||
|
NAME=SO_REUSEADDR
|
||||||
|
case "$TESTS" in
|
||||||
|
*%$N%*|*%functions%*|*%ip4%*|*%tcp%*|*%socket%*|*%$NAME%*)
|
||||||
|
TEST="$NAME: test the so-reuseaddr option"
|
||||||
|
# process 0 provides a tcp listening socket with so-reuseaddr;
|
||||||
|
# process 1 connects to this port; thus the port is connected but no longer
|
||||||
|
# listening
|
||||||
|
# process 2 tries to listen on this port with SO_REUSEADDR, will fail if the
|
||||||
|
# SO_REUSEADDR socket options did not work
|
||||||
|
# process 3 connects to this port; only if it is successful the test is ok
|
||||||
|
if ! eval $NUMCOND; then :; else
|
||||||
|
tp="$PORT"
|
||||||
|
tf="$td/test$N.stdout"
|
||||||
|
te="$td/test$N.stderr"
|
||||||
|
tdiff="$td/test$N.diff"
|
||||||
|
da="test$N $(date) $RANDOM"
|
||||||
|
CMD0="$TRACE $SOCAT $opts TCP4-L:$tp,so-reuseaddr PIPE"
|
||||||
|
CMD1="$TRACE $SOCAT $opts - TCP:localhost:$tp"
|
||||||
|
CMD2="$CMD0"
|
||||||
|
CMD3="$CMD1"
|
||||||
|
printf "test $F_n $TEST... " $N
|
||||||
|
$CMD0 >/dev/null 2>"${te}0" &
|
||||||
|
pid0=$!
|
||||||
|
waittcp4port $tp 1
|
||||||
|
(echo "$da"; sleep 3) |$CMD1 >"$tf" 2>"${te}1" & # this should always work
|
||||||
|
pid1=$!
|
||||||
|
usleep 1000000
|
||||||
|
$CMD2 >/dev/null 2>"${te}2" &
|
||||||
|
pid2=$!
|
||||||
|
waittcp4port $tp 1
|
||||||
|
(echo "$da") |$CMD3 >"${tf}3" 2>"${te}3"
|
||||||
|
rc3=$?
|
||||||
|
kill $pid0 $pid1 $pid2 2>/dev/null; wait
|
||||||
|
if ! echo "$da" |diff - "$tf"; then
|
||||||
|
$PRINTF "${YELLOW}phase 1 failed${NORMAL}\n"
|
||||||
|
echo "$CMD0 &"
|
||||||
|
echo "$CMD1"
|
||||||
|
numCANT=$((numCANT+1))
|
||||||
|
elif [ $rc3 -ne 0 ]; then
|
||||||
|
$PRINTF "$FAILED: $TRACE $SOCAT:\n"
|
||||||
|
echo "$CMD0 &"
|
||||||
|
echo "$CMD1"
|
||||||
|
echo "$CMD2 &"
|
||||||
|
echo "$CMD3"
|
||||||
|
cat "${te}2" "${te}3"
|
||||||
|
numFAIL=$((numFAIL+1))
|
||||||
|
listFAIL="$listFAIL $N"
|
||||||
|
elif ! echo "$da" |diff - "${tf}3"; then
|
||||||
|
$PRINTF "$FAILED: $TRACE $SOCAT:\n"
|
||||||
|
echo "$CMD0 &"
|
||||||
|
echo "$CMD1"
|
||||||
|
echo "$CMD2 &"
|
||||||
|
echo "$CMD3"
|
||||||
|
echo "$da" |diff - "${tf}3"
|
||||||
|
numCANT=$((numCANT+1))
|
||||||
|
else
|
||||||
|
$PRINTF "$OK\n"
|
||||||
|
if [ -n "$debug" ]; then cat "${te}0" "${te}1" "${te}2" "${te}3"; fi
|
||||||
|
numOK=$((numOK+1))
|
||||||
|
fi
|
||||||
|
fi # NUMCOND, SO_REUSEADDR
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
PORT=$((PORT+1))
|
||||||
|
N=$((N+1))
|
||||||
|
|
||||||
|
|
||||||
|
# test the so-reuseport option
|
||||||
|
NAME=SO_REUSEPORT
|
||||||
|
case "$TESTS" in
|
||||||
|
*%$N%*|*%functions%*|*%ip4%*|*%tcp%*|*%socket%*|*%$NAME%*)
|
||||||
|
TEST="$NAME: test the so-reuseport option"
|
||||||
|
# process 0 provides a tcp listening socket with so-reuseport;
|
||||||
|
# process 1 provides an equivalent tcp listening socket with so-reuseport;
|
||||||
|
# process 2 connects to this port and transfers data
|
||||||
|
# process 3 connects to this port and transfers data
|
||||||
|
# test succeeds when both data transfers work
|
||||||
|
if ! eval $NUMCOND; then :; else
|
||||||
|
tp="$PORT"
|
||||||
|
tf="$td/test$N.stdout"
|
||||||
|
te="$td/test$N.stderr"
|
||||||
|
tdiff="$td/test$N.diff"
|
||||||
|
da2="test$N $(date) $RANDOM"
|
||||||
|
da3="test$N $(date) $RANDOM"
|
||||||
|
CMD0="$TRACE $SOCAT $opts TCP4-L:$tp,so-reuseport PIPE"
|
||||||
|
CMD1="$CMD0"
|
||||||
|
CMD2="$TRACE $SOCAT $opts - TCP:localhost:$tp"
|
||||||
|
CMD3="$CMD2"
|
||||||
|
printf "test $F_n $TEST... " $N
|
||||||
|
$CMD0 >/dev/null 2>"${te}0" &
|
||||||
|
pid0=$!
|
||||||
|
$CMD1 >/dev/null 2>"${te}1" &
|
||||||
|
pid1=$!
|
||||||
|
waittcp4port $tp 1
|
||||||
|
(echo "$da2") |$CMD2 >"${tf}2" 2>"${te}2" # this should always work
|
||||||
|
rc2=$?
|
||||||
|
(echo "$da3") |$CMD3 >"${tf}3" 2>"${te}3"
|
||||||
|
rc3=$?
|
||||||
|
kill $pid0 $pid1 $pid2 2>/dev/null; wait
|
||||||
|
if ! echo "$da2" |diff - "${tf}2"; then
|
||||||
|
$PRINTF "${YELLOW}phase 1 failed${NORMAL}\n"
|
||||||
|
echo "$CMD0 &"
|
||||||
|
echo "$CMD1 &"
|
||||||
|
echo "$CMD2"
|
||||||
|
cat "${te}0" "${te}1" "${te}2"
|
||||||
|
numCANT=$((numCANT+1))
|
||||||
|
elif [ $rc3 -ne 0 ]; then
|
||||||
|
$PRINTF "$FAILED:\n"
|
||||||
|
echo "$CMD0 &"
|
||||||
|
echo "$CMD1 &"
|
||||||
|
echo "$CMD2"
|
||||||
|
echo "$CMD3"
|
||||||
|
cat "${te}0" "${te}1" "${te}2" "${te}3"
|
||||||
|
numFAIL=$((numFAIL+1))
|
||||||
|
listFAIL="$listFAIL $N"
|
||||||
|
elif ! echo "$da2" |diff - "${tf}2"; then
|
||||||
|
$PRINTF "$FAILED:\n"
|
||||||
|
echo "$CMD0 &"
|
||||||
|
echo "$CMD1"
|
||||||
|
echo "$CMD2"
|
||||||
|
echo "$CMD3"
|
||||||
|
cat "${te}0" "${te}1" "${te}2" "${te}3"
|
||||||
|
echo "$da2" |diff - "${tf}2"
|
||||||
|
numFAIL=$((numFAIL+1))
|
||||||
|
listFAIL="$listFAIL $N"
|
||||||
|
elif ! echo "$da3" |diff - "${tf}3"; then
|
||||||
|
$PRINTF "$FAILED:\n"
|
||||||
|
echo "$CMD0 &"
|
||||||
|
echo "$CMD1"
|
||||||
|
echo "$CMD2"
|
||||||
|
echo "$CMD3"
|
||||||
|
cat "${te}0" "${te}1" "${te}2" "${te}3"
|
||||||
|
echo "$da3" |diff - "${tf}3"
|
||||||
|
numFAIL=$((numFAIL+1))
|
||||||
|
listFAIL="$listFAIL $N"
|
||||||
|
else
|
||||||
|
$PRINTF "$OK\n"
|
||||||
|
if [ -n "$debug" ]; then cat "${te}0" "${te}1" "${te}2" "${te}3"; fi
|
||||||
|
numOK=$((numOK+1))
|
||||||
|
fi
|
||||||
|
fi # NUMCOND, SO_REUSEPORT
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
PORT=$((PORT+1))
|
||||||
|
N=$((N+1))
|
||||||
|
|
||||||
|
|
||||||
##################################################################################
|
##################################################################################
|
||||||
#=================================================================================
|
#=================================================================================
|
||||||
# here come tests that might affect your systems integrity. Put normal tests
|
# here come tests that might affect your systems integrity. Put normal tests
|
||||||
|
|
|
@ -153,8 +153,8 @@ const struct optdesc opt_so_peercred = { "so-peercred", "peercred", OPT_SO_PEERC
|
||||||
#ifdef SO_PRIORITY
|
#ifdef SO_PRIORITY
|
||||||
const struct optdesc opt_so_priority = { "so-priority", "priority", OPT_SO_PRIORITY, GROUP_SOCKET, PH_PASTSOCKET, TYPE_INT, OFUNC_SOCKOPT, SOL_SOCKET, SO_PRIORITY};
|
const struct optdesc opt_so_priority = { "so-priority", "priority", OPT_SO_PRIORITY, GROUP_SOCKET, PH_PASTSOCKET, TYPE_INT, OFUNC_SOCKOPT, SOL_SOCKET, SO_PRIORITY};
|
||||||
#endif
|
#endif
|
||||||
#ifdef SO_REUSEPORT /* AIX 4.3.3, BSD, HP-UX */
|
#ifdef SO_REUSEPORT /* AIX 4.3.3, BSD, HP-UX, Linux >=3.9 */
|
||||||
const struct optdesc opt_so_reuseport= { "so-reuseport","reuseport",OPT_SO_REUSEPORT,GROUP_SOCKET, PH_PASTSOCKET, TYPE_INT, OFUNC_SOCKOPT, SOL_SOCKET, SO_REUSEPORT };
|
const struct optdesc opt_so_reuseport= { "so-reuseport","reuseport",OPT_SO_REUSEPORT,GROUP_SOCKET, PH_PREBIND, TYPE_INT, OFUNC_SOCKOPT, SOL_SOCKET, SO_REUSEPORT };
|
||||||
#endif /* defined(SO_REUSEPORT) */
|
#endif /* defined(SO_REUSEPORT) */
|
||||||
#ifdef SO_SECURITY_AUTHENTICATION
|
#ifdef SO_SECURITY_AUTHENTICATION
|
||||||
const struct optdesc opt_so_security_authentication={"so-security-authentication","securityauthentication",OPT_SO_SECURITY_AUTHENTICATION,GROUP_SOCKET,PH_PASTSOCKET,TYPE_INT,OFUNC_SOCKOPT,SOL_SOCKET,SO_SECURITY_AUTHENTICATION};
|
const struct optdesc opt_so_security_authentication={"so-security-authentication","securityauthentication",OPT_SO_SECURITY_AUTHENTICATION,GROUP_SOCKET,PH_PASTSOCKET,TYPE_INT,OFUNC_SOCKOPT,SOL_SOCKET,SO_SECURITY_AUTHENTICATION};
|
||||||
|
|
Loading…
Reference in a new issue