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

add support for event sctp_assoc_change

parents c0aa25a6 14024062
No related branches found
No related tags found
No related merge requests found
......@@ -27,9 +27,9 @@ For Linux the following tables are based on [sctp.h](https://github.com/sctp/lks
|`SCTP_ADAPTATION_INDICATION` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-6.1.6) | [RFC5061](https://tools.ietf.org/html/rfc5061) | unsupported | supported | supported |
|`SCTP_PARTIAL_DELIVERY_EVENT` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-6.1.7) | [RFC3758](https://tools.ietf.org/html/rfc3758) | unsupported | supported | supported |
|`SCTP_AUTHENTICATION_EVENT` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-6.1.8) | [RFC4895](https://tools.ietf.org/html/rfc4895) | unsupported | supported | supported |
|`SCTP_SENDER_DRY_EVENT` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-6.1.9) | [RFC4960](https://tools.ietf.org/html/rfc4960) | unsupported | supported | supported |
|`SCTP_SENDER_DRY_EVENT` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-6.1.9) | [RFC4960](https://tools.ietf.org/html/rfc4960) | supported | supported | supported |
|`SCTP_NOTIFICATIONS_STOPPED_EVENT` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-6.1.10) | [RFC4960](https://tools.ietf.org/html/rfc4960) | unsupported | unsupported | unsupported |
|`SCTP_SEND_FAILED_EVENT` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-6.1.10) | [RFC4960](https://tools.ietf.org/html/rfc4960) | unsupported | unsupported | supported |
|`SCTP_SEND_FAILED_EVENT` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-6.1.10) | [RFC4960](https://tools.ietf.org/html/rfc4960) | supported | unsupported | supported |
## SCTP Socket Options
|Name | API Spec | Protocol Spec | packetdrill | Linux | FreeBSD |
......@@ -85,8 +85,8 @@ For Linux the following tables are based on [sctp.h](https://github.com/sctp/lks
|`sctp_freepaddrs()` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-9.4) | [RFC4960](https://tools.ietf.org/html/rfc4960) | unsupported | supported | supported |
|`sctp_getladdrs()` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-9.5) | [RFC4960](https://tools.ietf.org/html/rfc4960) | unsupported | supported | supported |
|`sctp_freeladdrs()` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-9.6) | [RFC4960](https://tools.ietf.org/html/rfc4960) | unsupported | supported | supported |
|`sctp_sendmsg()` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-9.7) | [RFC5061](https://tools.ietf.org/html/rfc5061) | unsupported | supported | supported |
|`sctp_recvmsg()` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-9.8) | [RFC4960](https://tools.ietf.org/html/rfc4960) | unsupported | supported | supported |
|`sctp_sendmsg()` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-9.7) | [RFC5061](https://tools.ietf.org/html/rfc5061) | supported | supported | supported |
|`sctp_recvmsg()` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-9.8) | [RFC4960](https://tools.ietf.org/html/rfc4960) | supported | supported | supported |
|`sctp_connectx()` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-9.9) | [RFC4960](https://tools.ietf.org/html/rfc4960) | unsupported | supported | supported |
|`sctp_send()` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-9.10) | [RFC4960](https://tools.ietf.org/html/rfc4960) | unsupported | supported | supported |
|`sctp_sendx()` | [RFC6458](https://tools.ietf.org/html/rfc6458#section-9.11) | [RFC4960](https://tools.ietf.org/html/rfc4960) | unsupported | supported | supported |
......
packetdrill-ext-libs := -lpthread -lrt
packetdrill-ext-libs := -lpthread -lrt -lsctp
include Makefile.common
......@@ -275,6 +275,13 @@ sendv_flags return SENDV_FLAGS;
sendv_sndinfo return SENDV_SNDINFO;
sendv_prinfo return SENDV_PRINFO;
sendv_authinfo return SENDV_AUTHINFO;
ssfe_type return SSFE_TYPE;
ssfe_flags return SSFE_FLAGS;
ssfe_length return SSFE_LENGTH;
ssfe_error return SSFE_ERROR;
ssfe_info return SSFE_INFO;
ssfe_assoc_id return SSFE_ASSOC_ID;
ssfe_data return SSFE_DATA;
rcv_sid return RCV_SID;
rcv_ssn return RCV_SSN;
rcv_flags return RCV_FLAGS;
......
......@@ -555,6 +555,7 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
%token <reserved> _SCTP_AUTHENTICATION_EVENT_ _SCTP_SENDER_DRY_EVENT_
%token <reserved> SAC_TYPE SAC_FLAGS SAC_LENGTH SAC_STATE SAC_ERROR SAC_OUTBOUND_STREAMS
%token <reserved> SAC_INBOUND_STREAMS SAC_ASSOC_ID SAC_INFO
%token <reserved> SSFE_TYPE SSFE_FLAGS SSFE_LENGTH SSFE_ERROR SSFE_INFO SSFE_ASSOC_ID SSFE_DATA
%token <floating> FLOAT
%token <integer> INTEGER HEX_INTEGER
%token <string> WORD STRING BACK_QUOTED CODE IPV4_ADDR IPV6_ADDR
......@@ -613,8 +614,9 @@ static struct tcp_option *new_tcp_fast_open_option(const char *cookie_string,
%type <expression> sctp_shutdown_event sse_type sse_flags sse_length
%type <expression> sctp_sender_dry_event sender_dry_type sender_dry_flags sender_dry_length sender_dry_assoc_id
%type <expression> sctp_event_subscribe
%type <expression> sctp_assoc_change_event sac_type sac_flags sac_length sac_state sac_error sac_outbound_streams
%type <expression> sctp_assoc_change sac_type sac_flags sac_length sac_state sac_error sac_outbound_streams
%type <expression> sac_inbound_streams sac_assoc_id
%type <expression> sctp_send_failed_event ssfe_type ssfe_flags ssfe_length ssfe_error ssfe_assoc_id
%type <errno_info> opt_errno
%type <chunk_list> sctp_chunk_list_spec
%type <chunk_list_item> sctp_chunk_spec
......@@ -2589,9 +2591,10 @@ sockaddr
data
: ELLIPSIS { new_expression(EXPR_ELLIPSIS); }
| sctp_assoc_change_event { $$ = $1; }
| sctp_shutdown_event { $$ = $1; }
| sctp_sender_dry_event { $$ = $1; }
| sctp_assoc_change { $$ = $1; }
| sctp_shutdown_event { $$ = $1; }
| sctp_sender_dry_event { $$ = $1; }
| sctp_send_failed_event { $$ = $1; }
;
msghdr
......@@ -3631,6 +3634,76 @@ sctp_sender_dry_event
$$->value.sctp_sender_dry_event->sender_dry_assoc_id = $8;
}
;
ssfe_type
: SSFE_TYPE '=' INTEGER {
if (!is_valid_u16($3)) {
semantic_error("ssfe_type out of range");
}
$$ = new_integer_expression($3, "%hu");
}
| SSFE_TYPE '=' WORD {
$$ = new_expression(EXPR_WORD);
$$->value.string = $3;
}
| SSFE_TYPE '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
;
ssfe_flags
: SSFE_FLAGS '=' INTEGER {
if (!is_valid_u16($3)) {
semantic_error("ssfe_flags out of range");
}
$$ = new_integer_expression($3, "%hu");
}
| SSFE_FLAGS '=' WORD {
$$ = new_expression(EXPR_WORD);
$$->value.string = $3;
}
| SSFE_FLAGS '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
;
ssfe_length
: SSFE_LENGTH '=' INTEGER {
if (!is_valid_u32($3)) {
semantic_error("ssfe_length out of range");
}
$$ = new_integer_expression($3, "%u");
}
| SSFE_LENGTH '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
;
ssfe_error
: SSFE_ERROR '=' INTEGER {
if (!is_valid_u32($3)) {
semantic_error("ssfe_error out of range");
}
$$ = new_integer_expression($3, "%u");
}
| SSFE_ERROR '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
;
ssfe_assoc_id
: SSFE_ASSOC_ID '=' INTEGER {
if (!is_valid_u32($3)) {
semantic_error("ssfe_assoc_id out of range");
}
$$ = new_integer_expression($3, "%u");
}
| SSFE_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
;
sctp_send_failed_event
: '{' ssfe_type ',' ssfe_flags ',' ssfe_length ',' ssfe_error ',' SSFE_INFO '=' sctp_sndinfo ',' ssfe_assoc_id ',' SSFE_DATA '=' ELLIPSIS '}' {
$$ = new_expression(EXPR_SCTP_SEND_FAILED_EVENT);
$$->value.sctp_send_failed_event = calloc(1, sizeof(struct sctp_send_failed_event_expr));
$$->value.sctp_send_failed_event->ssfe_type = $2;
$$->value.sctp_send_failed_event->ssfe_flags = $4;
$$->value.sctp_send_failed_event->ssfe_length = $6;
$$->value.sctp_send_failed_event->ssfe_error = $8;
$$->value.sctp_send_failed_event->ssfe_info = $12;
$$->value.sctp_send_failed_event->ssfe_assoc_id = $14;
$$->value.sctp_send_failed_event->ssfe_data = new_expression(EXPR_ELLIPSIS);
};
sac_type
: SAC_TYPE '=' INTEGER {
......@@ -3720,20 +3793,20 @@ sac_assoc_id
| SAC_ASSOC_ID '=' ELLIPSIS { $$ = new_expression(EXPR_ELLIPSIS); }
;
sctp_assoc_change_event
sctp_assoc_change
: '{' sac_type ',' sac_flags ',' sac_length ',' sac_state ',' sac_error ',' sac_outbound_streams ','
sac_inbound_streams ',' sac_assoc_id ',' SAC_INFO '=' ELLIPSIS '}' {
$$ = new_expression(EXPR_SCTP_ASSOC_CHANGE_EVENT);
$$->value.sctp_assoc_change_event = calloc(1, sizeof(struct sctp_assoc_change_event_expr));
$$->value.sctp_assoc_change_event->sac_type = $2;
$$->value.sctp_assoc_change_event->sac_flags = $4;
$$->value.sctp_assoc_change_event->sac_length = $6;
$$->value.sctp_assoc_change_event->sac_state = $8;
$$->value.sctp_assoc_change_event->sac_error = $10;
$$->value.sctp_assoc_change_event->sac_outbound_streams = $12;
$$->value.sctp_assoc_change_event->sac_inbound_streams = $14;
$$->value.sctp_assoc_change_event->sac_assoc_id = $16;
$$->value.sctp_assoc_change_event->sac_info = new_expression(EXPR_ELLIPSIS);
$$ = new_expression(EXPR_SCTP_ASSOC_CHANGE);
$$->value.sctp_assoc_change = calloc(1, sizeof(struct sctp_assoc_change_expr));
$$->value.sctp_assoc_change->sac_type = $2;
$$->value.sctp_assoc_change->sac_flags = $4;
$$->value.sctp_assoc_change->sac_length = $6;
$$->value.sctp_assoc_change->sac_state = $8;
$$->value.sctp_assoc_change->sac_error = $10;
$$->value.sctp_assoc_change->sac_outbound_streams = $12;
$$->value.sctp_assoc_change->sac_inbound_streams = $14;
$$->value.sctp_assoc_change->sac_assoc_id = $16;
$$->value.sctp_assoc_change->sac_info = new_expression(EXPR_ELLIPSIS);
}
;
......
This diff is collapsed.
......@@ -86,9 +86,10 @@ struct expression_type_entry expression_type_table[] = {
{ EXPR_SCTP_RCVINFO, "sctp_rcvinfo" },
{ EXPR_SCTP_NXTINFO, "sctp_nxtinfo" },
{ EXPR_SCTP_RECVV_RN, "sctp_recvv_rn " },
{ EXPR_SCTP_ASSOC_CHANGE_EVENT,"sctp_assoc_change_event"},
{ EXPR_SCTP_ASSOC_CHANGE, "sctp_assoc_change"},
{ EXPR_SCTP_SHUTDOWN_EVENT, "sctp_shutdown_event"},
{ EXPR_SCTP_SENDER_DRY_EVENT,"sctp_sender_dry_event"},
{ EXPR_SCTP_SEND_FAILED_EVENT,"sctp_send_failed_event"},
{ NUM_EXPR_TYPES, NULL}
};
......@@ -432,16 +433,16 @@ void free_expression(struct expression *expression)
free_expression(expression->value.sctp_recvv_rn->recvv_rcvinfo);
free_expression(expression->value.sctp_recvv_rn->recvv_nxtinfo);
break;
case EXPR_SCTP_ASSOC_CHANGE_EVENT:
free_expression(expression->value.sctp_assoc_change_event->sac_type);
free_expression(expression->value.sctp_assoc_change_event->sac_flags);
free_expression(expression->value.sctp_assoc_change_event->sac_length);
free_expression(expression->value.sctp_assoc_change_event->sac_state);
free_expression(expression->value.sctp_assoc_change_event->sac_error);
free_expression(expression->value.sctp_assoc_change_event->sac_outbound_streams);
free_expression(expression->value.sctp_assoc_change_event->sac_inbound_streams);
free_expression(expression->value.sctp_assoc_change_event->sac_assoc_id);
free_expression(expression->value.sctp_assoc_change_event->sac_info);
case EXPR_SCTP_ASSOC_CHANGE:
free_expression(expression->value.sctp_assoc_change->sac_type);
free_expression(expression->value.sctp_assoc_change->sac_flags);
free_expression(expression->value.sctp_assoc_change->sac_length);
free_expression(expression->value.sctp_assoc_change->sac_state);
free_expression(expression->value.sctp_assoc_change->sac_error);
free_expression(expression->value.sctp_assoc_change->sac_outbound_streams);
free_expression(expression->value.sctp_assoc_change->sac_inbound_streams);
free_expression(expression->value.sctp_assoc_change->sac_assoc_id);
free_expression(expression->value.sctp_assoc_change->sac_info);
break;
case EXPR_SCTP_SHUTDOWN_EVENT:
free_expression(expression->value.sctp_shutdown_event->sse_type);
......@@ -454,6 +455,15 @@ void free_expression(struct expression *expression)
free_expression(expression->value.sctp_sender_dry_event->sender_dry_length);
free_expression(expression->value.sctp_sender_dry_event->sender_dry_assoc_id);
break;
case EXPR_SCTP_SEND_FAILED_EVENT:
free_expression(expression->value.sctp_send_failed_event->ssfe_type);
free_expression(expression->value.sctp_send_failed_event->ssfe_flags);
free_expression(expression->value.sctp_send_failed_event->ssfe_length);
free_expression(expression->value.sctp_send_failed_event->ssfe_error);
free_expression(expression->value.sctp_send_failed_event->ssfe_info);
free_expression(expression->value.sctp_send_failed_event->ssfe_assoc_id);
free_expression(expression->value.sctp_send_failed_event->ssfe_data);
break;
case EXPR_WORD:
assert(expression->value.string);
free(expression->value.string);
......@@ -576,7 +586,6 @@ static int evaluate_iovec_expression(struct expression *in,
in_iov = in->value.iovec;
out_iov = out->value.iovec;
if (evaluate(in_iov->iov_base, &out_iov->iov_base, error))
return STATUS_ERR;
if (evaluate(in_iov->iov_len, &out_iov->iov_len, error))
......@@ -1365,21 +1374,21 @@ static int evaluate_sctp_recvv_rn_expression(struct expression *in,
return STATUS_OK;
}
static int evaluate_sctp_assoc_change_event_expression(struct expression *in,
static int evaluate_sctp_assoc_change_expression(struct expression *in,
struct expression *out,
char **error)
{
struct sctp_assoc_change_event_expr *in_event;
struct sctp_assoc_change_event_expr *out_event;
struct sctp_assoc_change_expr *in_event;
struct sctp_assoc_change_expr *out_event;
assert(in->type == EXPR_SCTP_ASSOC_CHANGE_EVENT);
assert(in->value.sctp_assoc_change_event);
assert(out->type == EXPR_SCTP_ASSOC_CHANGE_EVENT);
assert(in->type == EXPR_SCTP_ASSOC_CHANGE);
assert(in->value.sctp_assoc_change);
assert(out->type == EXPR_SCTP_ASSOC_CHANGE);
out->value.sctp_assoc_change_event = calloc(1, sizeof(struct sctp_assoc_change_event_expr));
out->value.sctp_assoc_change = calloc(1, sizeof(struct sctp_assoc_change_expr));
in_event = in->value.sctp_assoc_change_event;
out_event = out->value.sctp_assoc_change_event;
in_event = in->value.sctp_assoc_change;
out_event = out->value.sctp_assoc_change;
if (evaluate(in_event->sac_type,
&out_event->sac_type,
......@@ -1489,6 +1498,54 @@ static int evaluate_sctp_sender_dry_event_expression(struct expression *in,
return STATUS_OK;
}
static int evaluate_sctp_send_failed_event_expression(struct expression *in,
struct expression *out,
char **error)
{
struct sctp_send_failed_event_expr *in_event;
struct sctp_send_failed_event_expr *out_event;
assert(in->type == EXPR_SCTP_SEND_FAILED_EVENT);
assert(in->value.sctp_send_failed_event);
assert(out->type == EXPR_SCTP_SEND_FAILED_EVENT);
out->value.sctp_send_failed_event = calloc(1, sizeof(struct sctp_send_failed_event_expr));
in_event = in->value.sctp_send_failed_event;
out_event = out->value.sctp_send_failed_event;
if (evaluate(in_event->ssfe_type,
&out_event->ssfe_type,
error))
return STATUS_ERR;
if (evaluate(in_event->ssfe_flags,
&out_event->ssfe_flags,
error))
return STATUS_ERR;
if (evaluate(in_event->ssfe_length,
&out_event->ssfe_length,
error))
return STATUS_ERR;
if (evaluate(in_event->ssfe_error,
&out_event->ssfe_error,
error))
return STATUS_ERR;
if (evaluate(in_event->ssfe_info,
&out_event->ssfe_info,
error))
return STATUS_ERR;
if (evaluate(in_event->ssfe_assoc_id,
&out_event->ssfe_assoc_id,
error))
return STATUS_ERR;
if (evaluate(in_event->ssfe_data,
&out_event->ssfe_data,
error))
return STATUS_ERR;
return STATUS_OK;
}
static int evaluate(struct expression *in,
struct expression **out_ptr, char **error)
{
......@@ -1574,8 +1631,8 @@ static int evaluate(struct expression *in,
case EXPR_SCTP_RECVV_RN:
result = evaluate_sctp_recvv_rn_expression(in, out, error);
break;
case EXPR_SCTP_ASSOC_CHANGE_EVENT:
result = evaluate_sctp_assoc_change_event_expression(in, out, error);
case EXPR_SCTP_ASSOC_CHANGE:
result = evaluate_sctp_assoc_change_expression(in, out, error);
break;
case EXPR_SCTP_SHUTDOWN_EVENT:
result = evaluate_sctp_shutdown_event_expression(in, out, error);
......@@ -1583,6 +1640,9 @@ static int evaluate(struct expression *in,
case EXPR_SCTP_SENDER_DRY_EVENT:
result = evaluate_sctp_sender_dry_event_expression(in, out, error);
break;
case EXPR_SCTP_SEND_FAILED_EVENT:
result = evaluate_sctp_send_failed_event_expression(in, out, error);
break;
case EXPR_WORD:
out->type = EXPR_INTEGER;
if (symbol_to_int(in->value.string,
......
......@@ -66,9 +66,10 @@ enum expression_t {
EXPR_SCTP_RCVINFO, /* struct sctp_rcvinfo for syscall sctp_recvv */
EXPR_SCTP_NXTINFO, /* struct sctp_nxtinfo for syscall sctp_recvv */
EXPR_SCTP_RECVV_RN, /* struct sctp_recvv_rn for syscall sctp_recvv */
EXPR_SCTP_ASSOC_CHANGE_EVENT, /* expression tree for sctp_assoc_change_event */
EXPR_SCTP_ASSOC_CHANGE, /* expression tree for sctp_assoc_change_event */
EXPR_SCTP_SHUTDOWN_EVENT, /* expression tree for sctp_shutdown_event */
EXPR_SCTP_SENDER_DRY_EVENT, /* expression tree for sctp_sender_dry_event */
EXPR_SCTP_SEND_FAILED_EVENT, /* expression tree for sctp_send_failed_event */
NUM_EXPR_TYPES,
};
/* Convert an expression type to a human-readable string */
......@@ -108,9 +109,10 @@ struct expression {
struct sctp_rcvinfo_expr *sctp_rcvinfo;
struct sctp_nxtinfo_expr *sctp_nxtinfo;
struct sctp_recvv_rn_expr *sctp_recvv_rn;
struct sctp_assoc_change_event_expr *sctp_assoc_change_event;
struct sctp_assoc_change_expr *sctp_assoc_change;
struct sctp_shutdown_event_expr *sctp_shutdown_event;
struct sctp_sender_dry_event_expr *sctp_sender_dry_event;
struct sctp_send_failed_event_expr *sctp_send_failed_event;
} value;
const char *format; /* the printf format for printing the value */
};
......@@ -321,8 +323,8 @@ struct sctp_recvv_rn_expr {
struct expression *recvv_nxtinfo;
};
/* Parse tree for sctp_assoc_change_event for notifications. */
struct sctp_assoc_change_event_expr {
/* Parse tree for sctp_assoc_change for notifications. */
struct sctp_assoc_change_expr {
struct expression *sac_type;
struct expression *sac_flags;
struct expression *sac_length;
......@@ -341,7 +343,7 @@ struct sctp_shutdown_event_expr {
struct expression *sse_length;
};
/* Parse tree for sctp_shutdown_event for notifications. */
/* Parse tree for sctp_sender_dry_event for notifications. */
struct sctp_sender_dry_event_expr {
struct expression *sender_dry_type;
struct expression *sender_dry_flags;
......@@ -349,6 +351,17 @@ struct sctp_sender_dry_event_expr {
struct expression *sender_dry_assoc_id;
};
/* Parse tree for sctp_send_failed_event for notifications. */
struct sctp_send_failed_event_expr {
struct expression *ssfe_type;
struct expression *ssfe_flags;
struct expression *ssfe_length;
struct expression *ssfe_error;
struct expression *ssfe_info;
struct expression *ssfe_assoc_id;
struct expression *ssfe_data;
};
/* The errno-related info from strace to summarize a system call error */
struct errno_spec {
const char *errno_macro; /* errno symbol (C macro name) */
......
......@@ -168,8 +168,10 @@ struct int_symbol platform_symbols_table[] = {
{ SCTP_PEER_ADDR_CHANGE, "SCTP_PEER_ADDR_CHANGE" },
{ SCTP_REMOTE_ERROR, "SCTP_REMOTE_ERROR" },
{ SCTP_SEND_FAILED, "SCTP_SEND_FAILED" },
{ SCTP_ASSOC_CHANGE, "SCTP_ASSOC_CHANGE" },
{ SCTP_SHUTDOWN_EVENT, "SCTP_SHUTDOWN_EVENT" },
{ SCTP_SENDER_DRY_EVENT, "SCTP_SENDER_DRY_EVENT" },
{ SCTP_SEND_FAILED_EVENT, "SCTP_SEND_FAILED_EVENT" },
{ SCTP_ADAPTATION_INDICATION, "SCTP_ADAPTATION_INDICATION" },
{ SCTP_ADAPTION_INDICATION, "SCTP_ADAPTION_INDICATION" },
{ SCTP_PARTIAL_DELIVERY_EVENT, "SCTP_PARTIAL_DELIVERY_EVENT" },
......@@ -203,6 +205,13 @@ struct int_symbol platform_symbols_table[] = {
{ SCTP_RECVV_RN, "SCTP_RECVV_RN" },
{ SCTP_RECVRCVINFO, "SCTP_RECVRCVINFO" },
{ SCTP_RECVNXTINFO, "SCTP_RECVNXTINFO" },
{ SCTP_DATA_SENT, "SCTP_DATA_SENT" },
{ SCTP_DATA_UNSENT, "SCTP_DATA_UNSENT" },
{ SCTP_COMM_UP, "SCTP_COMM_UP" },
{ SCTP_COMM_LOST, "SCTP_COMM_LOST" },
{ SCTP_RESTART, "SCTP_RESTART" },
{ SCTP_SHUTDOWN_COMP, "SCTP_SHUTDOWN_COMP" },
{ SCTP_CANT_STR_ASSOC, "SCTP_CANT_STR_ASSOC" },
/* /usr/include/netinet/tcp.h */
{ TCP_NODELAY, "TCP_NODELAY" },
{ TCP_MAXSEG, "TCP_MAXSEG" },
......
......@@ -9,21 +9,21 @@
+0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
+0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
+0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+0.0 > sctp: INIT[tag=1 tsn=0]
+0.0 < sctp: INIT_ACK[tag=2 a_rwnd=1500 os=1 is =1 tsn=3] // faked
+0.0 > sctp: COOKIE_ECHO[] // syntax not clear
+0.0 < sctp: COOKIE_ACK[]
+0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
+0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
+0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
+0.1 < sctp: COOKIE_ACK[flgs=0]
+0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
+1.0 write(3, ..., 1000) = 1000
+0.0 > sctp: DATA[tsn=0 sid=0 ssn=0 ppid=0]
+0.0 < sctp: SACK[tsn=0 a_rwnd=1500]
+1.0 < sctp: DATA[tsn=3 sid=0 ssn=0 ppid=0] // How to handle
+0.0 > sctp: SACK[tsn=3]
+0.0 > sctp: DATA[flgs=BE, len=1016, tsn=2, sid=0, ssn=0, ppid=0]
+0.0 < sctp: SACK[flgs=0, cum_tsn=2, a_rwnd=1500, gaps=[], dups=[]]
+1.0 < sctp: DATA[flgs=BE, len=1016, tsn=3, sid=0, ssn=0, ppid=0] // How to handle
+0.0 > sctp: SACK[flgs=0, cum_tsn=3, a_rwnd=1500, gaps=[], dups=[]]
+0.0 read(3, ..., 2000) = 1000
+1.0 < sctp: DATA[tsn=4 sid=0 ssn=1 ppid=0]
+1.0 < sctp: DATA[flgs=BE, len=1016, tsn=4, sid=0, ssn=0, ppid=0]
+0.0 read(3, ..., 2000) = 1000
+0.2 > sctp: SACK[tsn=4]
+0.2 > sctp: SACK[flgs=0, cum_tsn=4, a_rwnd=1500, gaps=[], dups=[]]
+0.0 close(3) = 0
+0.0 > sctp: SHUTDOWN[tsn=4]
+0.0 < sctp: SHUTDOWN_ACK[]
+0.0 > sctp: SHUTDOWN_COMPLETE[]
+0.0 > sctp: SHUTDOWN[flgs=0, cum_tsn=4]
+0.0 < sctp: SHUTDOWN_ACK[flgs=0]
+0.0 > sctp: SHUTDOWN_COMPLETE[flgs=0]
+0.0 socket(..., SOCK_STREAM, IPPROTO_SCTP) = 3
+0.0 fcntl(3, F_GETFL) = 0x2 (flags O_RDWR)
+0.0 fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
// Check the handshake with an empty(!) cookie
+0.1 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+0.0 > sctp: INIT[flgs=0, tag=1, a_rwnd=..., os=..., is=..., tsn=1, ...]
+0.1 < sctp: INIT_ACK[flgs=0, tag=2, a_rwnd=1500, os=1, is=1, tsn=1, STATE_COOKIE[len=4, val=...]]
+0.0 > sctp: COOKIE_ECHO[flgs=0, len=4, val=...]
+0.1 < sctp: COOKIE_ACK[flgs=0]
+0.0 getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
//enable shutdown events
+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, 8) = 0
+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0
+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, sctp_association_event=1, sctp_address_event=0, sctp_send_failure_event=1,
sctp_peer_error_event=0, sctp_shutdown_event=1, sctp_partial_delivery_event=0, sctp_adaptation_layer_event=0, sctp_authentication_event=0,
sctp_sender_dry_event=0}, 11) = 0
+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, [8]) = 0
+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENTS, {sctp_data_io_event=1, sctp_association_event=1, sctp_address_event=0, sctp_send_failure_event=1,
sctp_peer_error_event=0, sctp_shutdown_event=0, sctp_partial_delivery_event=0, sctp_adaptation_layer_event=0, sctp_authentication_event=0,
sctp_sender_dry_event=0}, 11) = 0
+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SENDER_DRY_EVENT, se_on=1}, 8) = 0
+0.0 sctp_recvv(3, [{iov_base={sender_dry_type=SCTP_SENDER_DRY_EVENT, sender_dry_flags=0, sender_dry_length=12, sender_dry_assoc_id=3}, iov_len=1000}], 1,
..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12
+0.0 getsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=0}, [8]) = 0
+0.0 setsockopt(3, IPPROTO_SCTP, SCTP_EVENT, {se_type=SCTP_SHUTDOWN_EVENT, se_on=1}, 8) = 0
// Tear down the association
+0.0 < sctp: SHUTDOWN[flgs=0, cum_tsn=0]
* > sctp: SHUTDOWN_ACK[flgs=0]
+0.0 < sctp: SHUTDOWN_COMPLETE[flgs=0]
+0.0 recvmsg(3, {msg_name(...)=...,
msg_iov(1)=[{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=0, sse_length=12}, iov_len=1000}],
msg_flags=MSG_NOTIFICATION|MSG_EOR}, 0) = 12
//+0.0 sctp_recvv(3, [{iov_base={sse_type=SCTP_SHUTDOWN_EVENT, sse_flags=1, sse_length=12}, iov_len=1000}], 1,
//..., 20, NULL, [0], [SCTP_RECVV_NOINFO], [MSG_NOTIFICATION|MSG_EOR]) = 12
......@@ -14,7 +14,7 @@
//sctp_sendv(int sd, const struct iovec *iov, int iovcnt, struct sockaddr *addrs, int addrcnt, void *info, socklen_t infolen, unsigned int infotype, int flags);
//test with sctp_sendv_authinfo
+1.0 sctp_sendv(3, [{iov_base=..., iov_len=500}, {iov_base=..., iov_len=500}], 2, ..., 1, {auth_keynumber=123}, 2, SCTP_SENDV_AUTHINFO, 0) = 1000
+1.0 sctp_sendv(3, [{iov_base=..., iov_len=500}, {iov_base=..., iov_len=500}], 2, NULL, 0, {auth_keynumber=123}, 2, SCTP_SENDV_AUTHINFO, 0) = 1000
* > sctp: DATA[flgs=BE, len=1016, tsn=1, sid=0, ssn=0, ppid=0]
+0.0 < sctp: SACK[flgs=0, cum_tsn=1, a_rwnd=1500, gaps=[], dups=[]]
......
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