svn commit: r325788 - head/sys/netinet
Michael Tuexen
tuexen at FreeBSD.org
Tue Nov 14 02:30:23 UTC 2017
Author: tuexen
Date: Tue Nov 14 02:30:21 2017
New Revision: 325788
URL: https://svnweb.freebsd.org/changeset/base/325788
Log:
Simply the code and use the full buffer for contigous chunk representation.
MFC after: 1 week
Modified:
head/sys/netinet/sctp_input.c
Modified: head/sys/netinet/sctp_input.c
==============================================================================
--- head/sys/netinet/sctp_input.c Tue Nov 14 01:57:54 2017 (r325787)
+++ head/sys/netinet/sctp_input.c Tue Nov 14 02:30:21 2017 (r325788)
@@ -4524,7 +4524,7 @@ sctp_process_control(struct mbuf *m, int iphlen, int *
char msg[SCTP_DIAG_INFO_LEN];
uint32_t vtag_in;
int num_chunks = 0; /* number of control chunks processed */
- uint32_t chk_length;
+ uint32_t chk_length, contiguous;
int ret;
int abort_no_unlock = 0;
int ecne_seen = 0;
@@ -4750,58 +4750,30 @@ process_control_chunks:
}
SCTP_STAT_INCR_COUNTER64(sctps_incontrolchunks);
/*
- * INIT-ACK only gets the init ack "header" portion only
- * because we don't have to process the peer's COOKIE. All
- * others get a complete chunk.
+ * INIT and INIT-ACK only gets the init ack "header" portion
+ * only because we don't have to process the peer's COOKIE.
+ * All others get a complete chunk.
*/
- if ((ch->chunk_type == SCTP_INITIATION_ACK) ||
- (ch->chunk_type == SCTP_INITIATION)) {
- /* get an init-ack chunk */
- ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, *offset,
- sizeof(struct sctp_init_ack_chunk), chunk_buf);
- if (ch == NULL) {
- *offset = length;
- if (stcb != NULL) {
- SCTP_TCB_UNLOCK(stcb);
- }
- return (NULL);
+ switch (ch->chunk_type) {
+ case SCTP_INITIATION:
+ contiguous = sizeof(struct sctp_init_chunk);
+ break;
+ case SCTP_INITIATION_ACK:
+ contiguous = sizeof(struct sctp_init_ack_chunk);
+ break;
+ default:
+ contiguous = min(chk_length, sizeof(chunk_buf));
+ break;
+ }
+ ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, *offset,
+ contiguous,
+ chunk_buf);
+ if (ch == NULL) {
+ *offset = length;
+ if (stcb != NULL) {
+ SCTP_TCB_UNLOCK(stcb);
}
- } else {
- /* For cookies and all other chunks. */
- if (chk_length > sizeof(chunk_buf)) {
- /*
- * use just the size of the chunk buffer so
- * the front part of our chunks fit in
- * contiguous space up to the chunk buffer
- * size (508 bytes). For chunks that need to
- * get more than that they must use the
- * sctp_m_getptr() function or other means
- * (e.g. know how to parse mbuf chains).
- * Cookies do this already.
- */
- ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, *offset,
- (sizeof(chunk_buf) - 4),
- chunk_buf);
- if (ch == NULL) {
- *offset = length;
- if (stcb != NULL) {
- SCTP_TCB_UNLOCK(stcb);
- }
- return (NULL);
- }
- } else {
- /* We can fit it all */
- ch = (struct sctp_chunkhdr *)sctp_m_getptr(m, *offset,
- chk_length, chunk_buf);
- if (ch == NULL) {
- SCTP_PRINTF("sctp_process_control: Can't get the all data....\n");
- *offset = length;
- if (stcb != NULL) {
- SCTP_TCB_UNLOCK(stcb);
- }
- return (NULL);
- }
- }
+ return (NULL);
}
num_chunks++;
/* Save off the last place we got a control from */
@@ -5410,7 +5382,7 @@ process_control_chunks:
}
sctp_handle_packet_dropped((struct sctp_pktdrop_chunk *)ch,
stcb, *netp,
- min(chk_length, (sizeof(chunk_buf) - 4)));
+ min(chk_length, contiguous));
}
break;
case SCTP_AUTHENTICATION:
More information about the svn-src-head
mailing list