diff --git a/VERSION b/VERSION index 3c08469..f3bc8c2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -"1.6.0.1+ip4bind+recvfromfork+x64+execstderr+execspaces+cosmetics+poll+udplistencont+ignoreeofunblock+escape+timestamp+ancillary+envvar+protocol+ioctl+setsockopt+genericsocket+sctp+interface" +"1.7.0-rc0" diff --git a/procan-cdefs.c b/procan-cdefs.c index f85ca8a..d5c1729 100644 --- a/procan-cdefs.c +++ b/procan-cdefs.c @@ -85,6 +85,9 @@ int procan_cdefs(FILE *outfile) { #endif /* socket constants */ +#ifdef PF_INET6 + fprintf(outfile, "#define PF_INET6 %d\n", PF_INET6); +#endif #ifdef SOCK_DGRAM fprintf(outfile, "#define SOCK_DGRAM %d\n", SOCK_DGRAM); #endif diff --git a/sysutils.c b/sysutils.c index 1e1aa57..4fd63fd 100644 --- a/sysutils.c +++ b/sysutils.c @@ -136,7 +136,7 @@ char *sockaddr_info(const struct sockaddr *sa, socklen_t salen, char *buff, size int n; #if HAVE_STRUCT_SOCKADDR_SALEN - if ((n = snprintf(cp, blen, "LEN=%d ", sas->soa.sa_len)) < 0) { + if ((n = snprintf(cp, blen, "LEN=%d ", sau->soa.sa_len)) < 0) { Warn1("sockaddr_info(): buffer too short ("F_Zu")", blen); *buff = '\0'; return buff; diff --git a/test.sh b/test.sh index 8f9e5e9..204a41a 100755 --- a/test.sh +++ b/test.sh @@ -1692,6 +1692,26 @@ runsip6 () { return $l; } +# check if SCTP on IPv4 is available on host +runssctp4 () { + PORT="$1" + $SOCAT /dev/null SCTP4-LISTEN:$PORT 2>"$td/sctp4.stderr" & + pid=$! + sleep 1 + kill "$pid" 2>/dev/null + test ! -s "$td/sctp4.stderr" +} + +# check if SCTP on IPv6 is available on host +runssctp6 () { + PORT="$1" + $SOCAT /dev/null SCTP6-LISTEN:$PORT 2>"$td/sctp6.stderr" & + pid=$! + sleep 1 + kill "$pid" 2>/dev/null + test ! -s "$td/sctp6.stderr" +} + # wait until an IP4 protocol is ready waitip4proto () { local proto="$1" @@ -8974,8 +8994,8 @@ IP4 UDP4 127.0.0.1 PORT ip-tos=7 ip-recvtos IP_TOS IP4 UDP4 127.0.0.1 PORT , ip-pktinfo IP_LOCADDR user 127.0.0.1 IP4 UDP4 127.0.0.1 PORT , ip-pktinfo IP_DSTADDR user 127.0.0.1 IP4 UDP4 127.0.0.1 PORT , ip-pktinfo IP_IF user lo -IP4 UDP4 127.0.0.1 PORT , ip-recvif IP_RECVIF user lo0 -IP4 UDP4 127.0.0.1 PORT , ip-recvdstaddr IP_RECVDSTADDR user 127.0.0.1 +IP4 UDP4 127.0.0.1 PORT , ip-recvif IP_IF user lo0 +IP4 UDP4 127.0.0.1 PORT , ip-recvdstaddr IP_DSTADDR user 127.0.0.1 IP4 IP4 127.0.0.1 PROTO ip-options=x01000000 ip-recvopts IP_OPTIONS root x01000000 IP4 IP4 127.0.0.1 PROTO , so-timestamp TIMESTAMP root $(date '+%a %b %e %H:%M:.. %Y'), ...... usecs IP4 IP4 127.0.0.1 PROTO ip-ttl=53 ip-recvttl IP_TTL root 53 @@ -8983,8 +9003,8 @@ IP4 IP4 127.0.0.1 PROTO ip-tos=7 ip-recvtos IP_TOS IP4 IP4 127.0.0.1 PROTO , ip-pktinfo IP_LOCADDR root 127.0.0.1 IP4 IP4 127.0.0.1 PROTO , ip-pktinfo IP_DSTADDR root 127.0.0.1 IP4 IP4 127.0.0.1 PROTO , ip-pktinfo IP_IF root lo -IP4 IP4 127.0.0.1 PROTO , ip-recvif IP_RECVIF root lo0 -IP4 IP4 127.0.0.1 PROTO , ip-recvdstaddr IP_RECVDSTADDR root 127.0.0.1 +IP4 IP4 127.0.0.1 PROTO , ip-recvif IP_IF root lo0 +IP4 IP4 127.0.0.1 PROTO , ip-recvdstaddr IP_DSTADDR root 127.0.0.1 IP6 UDP6 [::1] PORT , ipv6-recvpktinfo IPV6_DSTADDR user [[]0000:0000:0000:0000:0000:0000:0000:0001[]] IP6 UDP6 [::1] PORT ipv6-unicast-hops=35 ipv6-recvhoplimit IPV6_HOPLIMIT user 35 IP6 UDP6 [::1] PORT ipv6-tclass=0xaa ipv6-recvtclass IPV6_TCLASS user xaa000000 @@ -9045,6 +9065,8 @@ esac PORT=$((PORT+1)) N=$((N+1)) +PF_INET6="$($PROCAN -c |grep "^#define[[:space:]]*PF_INET6[[:space:]]" |cut -d' ' -f3)" + # test the SOCKET-CONNECT address (against TCP6-LISTEN) NAME=SOCKET_CONNECT_TCP6 case "$TESTS" in @@ -9058,12 +9080,12 @@ tdiff="$td/test$N.diff" ts0p=$PORT; PORT=$((PORT+1)) ts0a="[::1]" ts1p=$(printf "%04x" $ts0p); -ts1a="00000000000000000000000000000001" # "127.0.0.1" -ts1="x${ts1p}x000000000000x${ts1a}" +ts1a="00000000000000000000000000000001" # "[::1]" +ts1="x${ts1p}x00000000x${ts1a}x00000000" ts1b=$(printf "%04x" $PORT); PORT=$((PORT+1)) da="test$N $(date) $RANDOM" CMD0="$SOCAT $opts TCP6-LISTEN:$ts0p,reuseaddr,bind=$ts0a PIPE" -CMD1="$SOCAT $opts - SOCKET-CONNECT:10:6:$ts1,bind=x${ts1b}x000000000000x00000000000000000000000000000000" +CMD1="$SOCAT $opts - SOCKET-CONNECT:$PF_INET6:6:$ts1,bind=x${ts1b}x00000000x00000000000000000000000000000000x00000000" printf "test $F_n $TEST... " $N $CMD0 2>"${te}0" & pid0="$!" @@ -9553,7 +9575,8 @@ NAME=SCTP4STREAM case "$TESTS" in *%functions%*|*%ip4%*|*%ipapp%*|*%sctp%*|*%$NAME%*) TEST="$NAME: echo via connection to SCTP V4 socket" -if ! testaddrs sctp ip4 >/dev/null || ! runsip4 >/dev/null; then +PORT="$((PORT+1))" +if ! testaddrs sctp ip4 >/dev/null || ! runsip4 >/dev/null || ! runssctp4 "$((PORT-1))" >/dev/null; then $PRINTF "test $F_n $TEST... ${YELLOW}SCTP4 not available${NORMAL}\n" $N numCANT=$((numCANT+1)) elif [ "$UNAME" = Linux ] && ! grep ^sctp /proc/modules >/dev/null; then @@ -9603,7 +9626,8 @@ NAME=SCTP6STREAM case "$TESTS" in *%functions%*|*%ip6%*|*%ipapp%*|*%sctp%*|*%$NAME%*) TEST="$NAME: echo via connection to SCTP V6 socket" -if ! testaddrs sctp ip6 >/dev/null || ! runsip6 >/dev/null; then +PORT="$((PORT+1))" +if ! testaddrs sctp ip6 >/dev/null || ! runsip6 >/dev/null || ! runssctp6 "$((PORT-1))" >/dev/null; then $PRINTF "test $F_n $TEST... ${YELLOW}SCTP6 not available${NORMAL}\n" $N numCANT=$((numCANT+1)) elif [ "$UNAME" = Linux ] && ! grep ^sctp /proc/modules >/dev/null; then diff --git a/xioread.c b/xioread.c index 559d9be..e3d5342 100644 --- a/xioread.c +++ b/xioread.c @@ -146,12 +146,14 @@ ssize_t xioread(xiofile_t *file, void *buff, size_t bufsiz) { } /* on packet type we also receive outgoing packets, this is not desired */ +#ifdef PF_PACKET if (from.soa.sa_family == PF_PACKET) { if ((((struct sockaddr_ll *)&from.soa)->sll_pkttype & PACKET_OUTGOING) == 0) { errno = EAGAIN; return -1; } } +#endif /* PF_PACKET */ Notice2("received packet with "F_Zu" bytes from %s", bytes,