Skip to content
Snippets Groups Projects
Commit e9adbe8a authored by hoelscher's avatar hoelscher
Browse files

Add support for [gs]etsockopt for SCTP_PEER_ADDR_INFO

parent ff94828d
No related branches found
No related tags found
No related merge requests found
...@@ -222,6 +222,7 @@ sstat_instrms return SSTAT_INSTRMS; ...@@ -222,6 +222,7 @@ sstat_instrms return SSTAT_INSTRMS;
sstat_outstrms return SSTAT_OUTSTRMS; sstat_outstrms return SSTAT_OUTSTRMS;
sstat_fragmentation_point return SSTAT_FRAGMENTATION_POINT; sstat_fragmentation_point return SSTAT_FRAGMENTATION_POINT;
sstat_primary return SSTAT_PRIMARY; sstat_primary return SSTAT_PRIMARY;
spinfo_address return SPINFO_ADDRESS;
spinfo_state return SPINFO_STATE; spinfo_state return SPINFO_STATE;
spinfo_cwnd return SPINFO_CWND; spinfo_cwnd return SPINFO_CWND;
spinfo_srtt return SPINFO_SRTT; spinfo_srtt return SPINFO_SRTT;
......
...@@ -511,7 +511,8 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string, ...@@ -511,7 +511,8 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
%token <reserved> SSTAT_STATE SSTAT_RWND SSTAT_UNACKDATA SSTAT_PENDDATA %token <reserved> SSTAT_STATE SSTAT_RWND SSTAT_UNACKDATA SSTAT_PENDDATA
%token <reserved> SSTAT_INSTRMS SSTAT_OUTSTRMS SSTAT_FRAGMENTATION_POINT %token <reserved> SSTAT_INSTRMS SSTAT_OUTSTRMS SSTAT_FRAGMENTATION_POINT
%token <reserved> SSTAT_PRIMARY %token <reserved> SSTAT_PRIMARY
%token <reserved> SPINFO_STATE SPINFO_CWND SPINFO_SRTT SPINFO_RTO SPINFO_MTU %token <reserved> SPINFO_ADDRESS SPINFO_STATE SPINFO_CWND SPINFO_SRTT SPINFO_RTO
%token <reserved> SPINFO_MTU
%token <reserved> CHUNK DATA INIT INIT_ACK HEARTBEAT HEARTBEAT_ACK ABORT %token <reserved> CHUNK DATA INIT INIT_ACK HEARTBEAT HEARTBEAT_ACK ABORT
%token <reserved> SHUTDOWN SHUTDOWN_ACK ERROR COOKIE_ECHO COOKIE_ACK ECNE CWR %token <reserved> SHUTDOWN SHUTDOWN_ACK ERROR COOKIE_ECHO COOKIE_ACK ECNE CWR
%token <reserved> SHUTDOWN_COMPLETE I_DATA PAD %token <reserved> SHUTDOWN_COMPLETE I_DATA PAD
...@@ -579,7 +580,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string, ...@@ -579,7 +580,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
%type <expression> sctp_rtoinfo srto_initial srto_max srto_min sctp_paddrinfo %type <expression> sctp_rtoinfo srto_initial srto_max srto_min sctp_paddrinfo
%type <expression> sctp_paddrparams spp_address spp_hbinterval spp_pathmtu spp_pathmaxrxt %type <expression> sctp_paddrparams spp_address spp_hbinterval spp_pathmtu spp_pathmaxrxt
%type <expression> spp_flags spp_ipv6_flowlabel spp_dscp %type <expression> spp_flags spp_ipv6_flowlabel spp_dscp
%type <expression> spinfo_state spinfo_cwnd spinfo_srtt spinfo_rto spinfo_mtu %type <expression> spinfo_address spinfo_state spinfo_cwnd spinfo_srtt spinfo_rto spinfo_mtu
%type <errno_info> opt_errno %type <errno_info> opt_errno
%type <chunk_list> sctp_chunk_list_spec %type <chunk_list> sctp_chunk_list_spec
%type <chunk_list_item> sctp_chunk_spec %type <chunk_list_item> sctp_chunk_spec
...@@ -2730,6 +2731,11 @@ sstat_primary ...@@ -2730,6 +2731,11 @@ sstat_primary
| SSTAT_PRIMARY '=' sctp_paddrinfo { $$ = $3; } | SSTAT_PRIMARY '=' sctp_paddrinfo { $$ = $3; }
; ;
spinfo_address
: SPINFO_ADDRESS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
| SPINFO_ADDRESS '=' sockaddr { $$ = $3; }
;
spinfo_state spinfo_state
: SPINFO_STATE '=' INTEGER { : SPINFO_STATE '=' INTEGER {
if (!is_valid_s32($3)) { if (!is_valid_s32($3)) {
...@@ -2785,14 +2791,15 @@ spinfo_mtu ...@@ -2785,14 +2791,15 @@ spinfo_mtu
; ;
sctp_paddrinfo sctp_paddrinfo
: '{' spinfo_state ',' spinfo_cwnd ',' spinfo_srtt ',' spinfo_rto ',' spinfo_mtu '}' { : '{' spinfo_address ',' spinfo_state ',' spinfo_cwnd ',' spinfo_srtt ',' spinfo_rto ',' spinfo_mtu '}' {
$$ = new_expression(EXPR_SCTP_PADDRINFO); $$ = new_expression(EXPR_SCTP_PADDRINFO);
$$->value.sctp_paddrinfo = calloc(1, sizeof(struct sctp_paddrinfo_expr)); $$->value.sctp_paddrinfo = calloc(1, sizeof(struct sctp_paddrinfo_expr));
$$->value.sctp_paddrinfo->spinfo_state = $2; $$->value.sctp_paddrinfo->spinfo_address = $2;
$$->value.sctp_paddrinfo->spinfo_cwnd = $4; $$->value.sctp_paddrinfo->spinfo_state = $4;
$$->value.sctp_paddrinfo->spinfo_srtt = $6; $$->value.sctp_paddrinfo->spinfo_cwnd = $6;
$$->value.sctp_paddrinfo->spinfo_rto = $8; $$->value.sctp_paddrinfo->spinfo_srtt = $8;
$$->value.sctp_paddrinfo->spinfo_mtu = $10; $$->value.sctp_paddrinfo->spinfo_rto = $10;
$$->value.sctp_paddrinfo->spinfo_mtu = $12;
} }
; ;
......
...@@ -2206,10 +2206,36 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, ...@@ -2206,10 +2206,36 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
live_optlen = (socklen_t)sizeof(struct sctp_status); live_optlen = (socklen_t)sizeof(struct sctp_status);
((struct sctp_status*) live_optval)->sstat_assoc_id = 0; ((struct sctp_status*) live_optval)->sstat_assoc_id = 0;
#endif #endif
#ifdef SCTP_GET_PEER_ADDR_INFO
} else if (val_expression->type == EXPR_SCTP_PADDRINFO) {
struct sctp_paddrinfo_expr *expr_paddrinfo = val_expression->value.sctp_paddrinfo;
struct sctp_paddrinfo *live_paddrinfo = malloc(sizeof(struct sctp_paddrinfo));
live_optlen = (socklen_t)sizeof(struct sctp_paddrinfo);
memset(live_paddrinfo, 0, sizeof(struct sctp_paddrinfo));
live_paddrinfo->spinfo_assoc_id = 0;
if (expr_paddrinfo->spinfo_address->type == EXPR_ELLIPSIS) {
socklen_t len_addr = sizeof(live_paddrinfo->spinfo_address);
if (getpeername(live_fd, (struct sockaddr*) &live_paddrinfo->spinfo_address, &len_addr)) {
asprintf(error, "Bad setsockopt, bad get primary peer address");
free(live_paddrinfo);
return STATUS_ERR;
}
} else if (expr_paddrinfo->spinfo_address->type == EXPR_SOCKET_ADDRESS_IPV4) {
memcpy(&live_paddrinfo->spinfo_address, expr_paddrinfo->spinfo_address->value.socket_address_ipv4, sizeof(struct sockaddr_in));
} else if (expr_paddrinfo->spinfo_address->type == EXPR_SOCKET_ADDRESS_IPV6) {
memcpy(&live_paddrinfo->spinfo_address, expr_paddrinfo->spinfo_address->value.socket_address_ipv6, sizeof(struct sockaddr_in6));
} else {
asprintf(error, "Bad setsockopt, bad get input for spinfo_address");
free(live_paddrinfo);
return STATUS_ERR;
}
live_optval = live_paddrinfo;
#endif
#ifdef SCTP_PEER_ADDR_PARAMS #ifdef SCTP_PEER_ADDR_PARAMS
} else if (val_expression->type == EXPR_SCTP_PEER_ADDR_PARAMS) { } else if (val_expression->type == EXPR_SCTP_PEER_ADDR_PARAMS) {
struct sctp_paddrparams_expr *expr_params = val_expression->value.sctp_paddrparams; struct sctp_paddrparams_expr *expr_params = val_expression->value.sctp_paddrparams;
struct sctp_paddrparams *live_params = malloc(sizeof(struct sctp_paddrparams)); struct sctp_paddrparams *live_params = malloc(sizeof(struct sctp_paddrparams));
memset(live_params, 0, sizeof(struct sctp_paddrparams));
live_optlen = sizeof(struct sctp_paddrparams); live_optlen = sizeof(struct sctp_paddrparams);
if (expr_params->spp_address->type == EXPR_ELLIPSIS) { if (expr_params->spp_address->type == EXPR_ELLIPSIS) {
socklen_t len_addr = sizeof(live_params->spp_address); socklen_t len_addr = sizeof(live_params->spp_address);
...@@ -2301,6 +2327,13 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall, ...@@ -2301,6 +2327,13 @@ static int syscall_getsockopt(struct state *state, struct syscall_spec *syscall,
return STATUS_ERR; return STATUS_ERR;
} }
#endif #endif
#ifdef SCTP_GET_PEER_ADDR_INFO
} else if (val_expression->type == EXPR_SCTP_PADDRINFO) {
if (check_sctp_paddrinfo(val_expression->value.sctp_paddrinfo, live_optval, error)) {
free(live_optval);
return STATUS_ERR;
}
#endif
#ifdef SCTP_PEER_ADDR_PARAMS #ifdef SCTP_PEER_ADDR_PARAMS
} else if (val_expression->type == EXPR_SCTP_PEER_ADDR_PARAMS) { } else if (val_expression->type == EXPR_SCTP_PEER_ADDR_PARAMS) {
if (check_sctp_paddrparams(val_expression->value.sctp_paddrparams, live_optval, error)) { if (check_sctp_paddrparams(val_expression->value.sctp_paddrparams, live_optval, error)) {
...@@ -2356,6 +2389,9 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, ...@@ -2356,6 +2389,9 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
#ifdef SCTP_STATUS #ifdef SCTP_STATUS
struct sctp_status status; struct sctp_status status;
#endif #endif
#ifdef SCTP_GET_PEER_ADDR_INFO
struct sctp_paddrinfo paddrinfo;
#endif
#if defined(SCTP_SS_VALUE) #if defined(SCTP_SS_VALUE)
struct sctp_stream_value stream_value; struct sctp_stream_value stream_value;
#endif #endif
...@@ -2482,6 +2518,32 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall, ...@@ -2482,6 +2518,32 @@ static int syscall_setsockopt(struct state *state, struct syscall_spec *syscall,
optval = &status; optval = &status;
break; break;
#endif #endif
#ifdef SCTP_GET_PEER_ADDR_INFO
case EXPR_SCTP_PADDRINFO:
paddrinfo.spinfo_assoc_id = 0;
if (val_expression->value.sctp_paddrinfo->spinfo_address->type == EXPR_SOCKET_ADDRESS_IPV4) {
memcpy(&paddrinfo.spinfo_address,
val_expression->value.sctp_paddrinfo->spinfo_address->value.socket_address_ipv4,
sizeof(struct sockaddr_in));
} else if (val_expression->value.sctp_paddrinfo->spinfo_address->type == EXPR_SOCKET_ADDRESS_IPV6) {
memcpy(&paddrinfo.spinfo_address,
val_expression->value.sctp_paddrinfo->spinfo_address->value.socket_address_ipv6,
sizeof(struct sockaddr_in6));
} else if (val_expression->value.sctp_paddrinfo->spinfo_address->type == EXPR_ELLIPSIS) {
socklen_t len_addr = sizeof(struct sockaddr_storage);
if (getpeername(live_fd,
(struct sockaddr*)&paddrinfo.spinfo_address,
&len_addr)) {
asprintf(error, "Bad setsockopt, bad get primary peer address");
return STATUS_ERR;
}
} else {
asprintf(error, "Bad setsockopt, bad input for spinfo_address for socketoption SCTP_GET_PEER_ADDR_INFO");
return STATUS_ERR;
}
optval = &paddrinfo;
break;
#endif
#ifdef SCTP_PEER_ADDR_PARAMS #ifdef SCTP_PEER_ADDR_PARAMS
case EXPR_SCTP_PEER_ADDR_PARAMS: case EXPR_SCTP_PEER_ADDR_PARAMS:
paddrparams.spp_assoc_id = 0; paddrparams.spp_assoc_id = 0;
......
...@@ -331,9 +331,7 @@ void free_expression(struct expression *expression) ...@@ -331,9 +331,7 @@ void free_expression(struct expression *expression)
#ifdef SCTP_STATUS #ifdef SCTP_STATUS
case EXPR_SCTP_PADDRINFO: case EXPR_SCTP_PADDRINFO:
assert(expression->value.sctp_paddrinfo); assert(expression->value.sctp_paddrinfo);
#if 0
free_expression(expression->value.sctp_paddrinfo->spinfo_address); free_expression(expression->value.sctp_paddrinfo->spinfo_address);
#endif
free_expression(expression->value.sctp_paddrinfo->spinfo_state); free_expression(expression->value.sctp_paddrinfo->spinfo_state);
free_expression(expression->value.sctp_paddrinfo->spinfo_cwnd); free_expression(expression->value.sctp_paddrinfo->spinfo_cwnd);
free_expression(expression->value.sctp_paddrinfo->spinfo_srtt); free_expression(expression->value.sctp_paddrinfo->spinfo_srtt);
...@@ -700,12 +698,10 @@ static int evaluate_sctp_paddrinfo_expression(struct expression *in, ...@@ -700,12 +698,10 @@ static int evaluate_sctp_paddrinfo_expression(struct expression *in,
in_paddrinfo = in->value.sctp_paddrinfo; in_paddrinfo = in->value.sctp_paddrinfo;
out_paddrinfo = out->value.sctp_paddrinfo; out_paddrinfo = out->value.sctp_paddrinfo;
#if 0
if (evaluate(in_paddrinfo->spinfo_address, if (evaluate(in_paddrinfo->spinfo_address,
&out_value->spinfo_addresss, &out_paddrinfo->spinfo_address,
error)) error))
return STATUS_ERR; return STATUS_ERR;
#endif
if (evaluate(in_paddrinfo->spinfo_state, if (evaluate(in_paddrinfo->spinfo_state,
&out_paddrinfo->spinfo_state, &out_paddrinfo->spinfo_state,
error)) error))
......
...@@ -212,6 +212,7 @@ struct sctp_status_expr { ...@@ -212,6 +212,7 @@ struct sctp_status_expr {
/* Parse tree for a sctp_paddrinfo struct in a [gs]etsockopt syscall. */ /* Parse tree for a sctp_paddrinfo struct in a [gs]etsockopt syscall. */
struct sctp_paddrinfo_expr { struct sctp_paddrinfo_expr {
struct expression *spinfo_address;
struct expression *spinfo_state; struct expression *spinfo_state;
struct expression *spinfo_cwnd; struct expression *spinfo_cwnd;
struct expression *spinfo_srtt; struct expression *spinfo_srtt;
......
...@@ -87,6 +87,7 @@ struct int_symbol platform_symbols_table[] = { ...@@ -87,6 +87,7 @@ struct int_symbol platform_symbols_table[] = {
{ SCTP_MAX_BURST, "SCTP_MAX_BURST" }, { SCTP_MAX_BURST, "SCTP_MAX_BURST" },
{ SCTP_PEER_ADDR_PARAMS, "SCTP_PEER_ADDR_PARAMS" }, { SCTP_PEER_ADDR_PARAMS, "SCTP_PEER_ADDR_PARAMS" },
{ SCTP_STATUS, "SCTP_STATUS" }, { SCTP_STATUS, "SCTP_STATUS" },
{ SCTP_GET_PEER_ADDR_INFO, "SCTP_GET_PEER_ADDR_INFO" },
{ SCTP_FRAGMENT_INTERLEAVE, "SCTP_FRAGMENT_INTERLEAVE" }, { SCTP_FRAGMENT_INTERLEAVE, "SCTP_FRAGMENT_INTERLEAVE" },
#if defined(SCTP_INTERLEAVING_SUPPORTED) #if defined(SCTP_INTERLEAVING_SUPPORTED)
{ SCTP_INTERLEAVING_SUPPORTED, "SCTP_INTERLEAVING_SUPPORTED" }, { SCTP_INTERLEAVING_SUPPORTED, "SCTP_INTERLEAVING_SUPPORTED" },
......
...@@ -108,6 +108,7 @@ struct int_symbol platform_symbols_table[] = { ...@@ -108,6 +108,7 @@ struct int_symbol platform_symbols_table[] = {
{ SCTP_MAX_BURST, "SCTP_MAX_BURST" }, { SCTP_MAX_BURST, "SCTP_MAX_BURST" },
{ SCTP_PEER_ADDR_PARAMS, "SCTP_PEER_ADDR_PARAMS" }, { SCTP_PEER_ADDR_PARAMS, "SCTP_PEER_ADDR_PARAMS" },
{ SCTP_STATUS, "SCTP_STATUS" }, { SCTP_STATUS, "SCTP_STATUS" },
{ SCTP_GET_PEER_ADDR_INFO, "SCTP_GET_PEER_ADDR_INFO" },
{ SCTP_FRAGMENT_INTERLEAVE, "SCTP_FRAGMENT_INTERLEAVE" }, { SCTP_FRAGMENT_INTERLEAVE, "SCTP_FRAGMENT_INTERLEAVE" },
#if 0 #if 0
{ SCTP_INTERLEAVING_SUPPORTED, "SCTP_INTERLEAVING_SUPPORTED" }, { SCTP_INTERLEAVING_SUPPORTED, "SCTP_INTERLEAVING_SUPPORTED" },
......
...@@ -38,8 +38,24 @@ sstat_penddata=0, sstat_instrms=1, sstat_outstrms=..., sstat_fragmentation_point ...@@ -38,8 +38,24 @@ sstat_penddata=0, sstat_instrms=1, sstat_outstrms=..., sstat_fragmentation_point
sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=..., sstat_primary=...}, [176]) = 0 sstat_penddata=0, sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=..., sstat_primary=...}, [176]) = 0
+0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=SCTP_ESTABLISHED, sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=0, +0 getsockopt(3, IPPROTO_SCTP, SCTP_STATUS, {sstat_state=SCTP_ESTABLISHED, sstat_rwnd=1500, sstat_unackdata=0, sstat_penddata=0,
sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=..., sstat_instrms=1, sstat_outstrms=1, sstat_fragmentation_point=..., sstat_primary={spinfo_address={sa_family=AF_INET,sin_port=htons(8080),
sstat_primary={ spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=1468} }, [176]) = 0 sin_addr=inet_addr("192.0.2.1")}, spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=1468} }, [176]) = 0
+0 setsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=111, spinfo_rto=1000, spinfo_mtu=1468}, 152) = -1 (ENOPROTOOPT)
+0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
spinfo_state=..., spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=1468}, [152]) = 0
+0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
spinfo_state=SCTP_ACTIVE, spinfo_cwnd=..., spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=1468}, [152]) = 0
+0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=..., spinfo_mtu=1468}, [152]) = 0
+0 getsockopt(3, IPPROTO_SCTP, SCTP_GET_PEER_ADDR_INFO, {spinfo_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
spinfo_state=SCTP_ACTIVE, spinfo_cwnd=4464, spinfo_srtt=..., spinfo_rto=1000, spinfo_mtu=...}, [152]) = 0
+0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, +0 setsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
...@@ -60,6 +76,7 @@ spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv ...@@ -60,6 +76,7 @@ spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv
+0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")}, +0 getsockopt(3, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, {spp_address={sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr("192.0.2.1")},
spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv6_flowlabel=0, spp_dscp=...}, [152]) = 0 spp_hbinterval=300, spp_pathmaxrxt=..., spp_pathmtu=1468, spp_flags=521, spp_ipv6_flowlabel=0, spp_dscp=...}, [152]) = 0
+0 setsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=1, linger=30}, 8) = 0 +0 setsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=1, linger=30}, 8) = 0
+0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=128, linger=30}, [8]) = 0 +0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=128, linger=30}, [8]) = 0
+0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=128, linger=...}, [8]) = 0 +0 getsockopt(3, SOL_SOCKET, SO_LINGER, {onoff=128, linger=...}, [8]) = 0
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment