diff options
author | tuexen <tuexen@FreeBSD.org> | 2012-05-13 22:27:54 +0000 |
---|---|---|
committer | tuexen <tuexen@FreeBSD.org> | 2012-05-13 22:27:54 +0000 |
commit | c9c7be32d3e6a20382bc20e579c2ec450605389c (patch) | |
tree | 8eeaadc880398332a0539160f5de5970baf94f1d /sys/netinet/sctp_input.c | |
parent | ac466466802d3731b0bc71544f075caf39e5bf14 (diff) | |
download | FreeBSD-src-c9c7be32d3e6a20382bc20e579c2ec450605389c.zip FreeBSD-src-c9c7be32d3e6a20382bc20e579c2ec450605389c.tar.gz |
Support SCTP_REMOTE_ERROR notification.
MFC after: 3 days
Diffstat (limited to 'sys/netinet/sctp_input.c')
-rw-r--r-- | sys/netinet/sctp_input.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/sys/netinet/sctp_input.c b/sys/netinet/sctp_input.c index 49a0b27..755fb44 100644 --- a/sys/netinet/sctp_input.c +++ b/sys/netinet/sctp_input.c @@ -1111,7 +1111,7 @@ sctp_handle_error(struct sctp_chunkhdr *ch, { int chklen; struct sctp_paramhdr *phdr; - uint16_t error_type; + uint16_t error, error_type; uint16_t error_len; struct sctp_association *asoc; int adjust; @@ -1126,6 +1126,7 @@ sctp_handle_error(struct sctp_chunkhdr *ch, phdr = (struct sctp_paramhdr *)((caddr_t)ch + sizeof(struct sctp_chunkhdr)); chklen = ntohs(ch->chunk_length) - sizeof(struct sctp_chunkhdr); + error = 0; while ((size_t)chklen >= sizeof(struct sctp_paramhdr)) { /* Process an Error Cause */ error_type = ntohs(phdr->param_type); @@ -1136,6 +1137,10 @@ sctp_handle_error(struct sctp_chunkhdr *ch, chklen, error_len); return (0); } + if (error == 0) { + /* report the first error cause */ + error = error_type; + } switch (error_type) { case SCTP_CAUSE_INVALID_STREAM: case SCTP_CAUSE_MISSING_PARAM: @@ -1252,6 +1257,7 @@ sctp_handle_error(struct sctp_chunkhdr *ch, chklen -= adjust; phdr = (struct sctp_paramhdr *)((caddr_t)phdr + adjust); } + sctp_ulp_notify(SCTP_NOTIFY_REMOTE_ERROR, stcb, error, ch, SCTP_SO_NOT_LOCKED); return (0); } |