summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/netinet
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-08-20 15:53:03 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-09-21 10:29:39 +0200
commit18fa92c2dcc6c52e0bf27d214d80f0c25a89b47d (patch)
treea3020ac5b1f366f2f0920941b589808e435dbcee /freebsd/sys/netinet
parentUpdate to FreeBSD head 2017-12-01 (diff)
downloadrtems-libbsd-18fa92c2dcc6c52e0bf27d214d80f0c25a89b47d.tar.bz2
Update to FreeBSD head 2018-02-01
Git mirror commit d079ae0442af8fa3cfd6d7ede190d04e64a2c0d4. Update #3472.
Diffstat (limited to 'freebsd/sys/netinet')
-rw-r--r--freebsd/sys/netinet/icmp6.h2
-rw-r--r--freebsd/sys/netinet/in_pcb.c8
-rw-r--r--freebsd/sys/netinet/ip_mroute.c4
-rw-r--r--freebsd/sys/netinet/ip_output.c7
-rw-r--r--freebsd/sys/netinet/ip_reass.c1
-rw-r--r--freebsd/sys/netinet/libalias/alias_mod.h2
-rw-r--r--freebsd/sys/netinet/libalias/alias_sctp.c641
-rw-r--r--freebsd/sys/netinet/sctp_constants.h33
-rw-r--r--freebsd/sys/netinet/sctp_crc32.c106
-rw-r--r--freebsd/sys/netinet/sctp_crc32.h4
-rw-r--r--freebsd/sys/netinet/sctp_indata.c28
-rw-r--r--freebsd/sys/netinet/sctp_input.c31
-rw-r--r--freebsd/sys/netinet/sctp_input.h2
-rw-r--r--freebsd/sys/netinet/sctp_output.c41
-rw-r--r--freebsd/sys/netinet/sctp_sysctl.c2
-rw-r--r--freebsd/sys/netinet/sctp_uio.h4
-rw-r--r--freebsd/sys/netinet/sctputil.c20
-rw-r--r--freebsd/sys/netinet/tcp_output.c122
-rw-r--r--freebsd/sys/netinet/tcp_timer.c7
-rw-r--r--freebsd/sys/netinet/tcp_timer.h1
-rw-r--r--freebsd/sys/netinet/tcp_var.h1
21 files changed, 513 insertions, 554 deletions
diff --git a/freebsd/sys/netinet/icmp6.h b/freebsd/sys/netinet/icmp6.h
index b0ae67fe..310684b8 100644
--- a/freebsd/sys/netinet/icmp6.h
+++ b/freebsd/sys/netinet/icmp6.h
@@ -628,7 +628,7 @@ struct icmp6stat {
uint64_t icp6s_nd_badopt; /* bad ND options */
uint64_t icp6s_badns; /* bad neighbor solicitation */
uint64_t icp6s_badna; /* bad neighbor advertisement */
- uint64_t icp6s_badrs; /* bad router advertisement */
+ uint64_t icp6s_badrs; /* bad router solicitation */
uint64_t icp6s_badra; /* bad router advertisement */
uint64_t icp6s_badredirect; /* bad redirect message */
};
diff --git a/freebsd/sys/netinet/in_pcb.c b/freebsd/sys/netinet/in_pcb.c
index 2783a276..2803126d 100644
--- a/freebsd/sys/netinet/in_pcb.c
+++ b/freebsd/sys/netinet/in_pcb.c
@@ -1331,9 +1331,7 @@ in_pcbfree(struct inpcb *inp)
if (inp->inp_moptions != NULL)
inp_freemoptions(inp->inp_moptions);
#endif
- RO_RTFREE(&inp->inp_route);
- if (inp->inp_route.ro_lle)
- LLE_FREE(inp->inp_route.ro_lle); /* zeros ro_lle */
+ RO_INVALIDATE_CACHE(&inp->inp_route);
inp->inp_vflag = 0;
inp->inp_flags2 |= INP_FREED;
@@ -2271,9 +2269,7 @@ void
in_losing(struct inpcb *inp)
{
- RO_RTFREE(&inp->inp_route);
- if (inp->inp_route.ro_lle)
- LLE_FREE(inp->inp_route.ro_lle); /* zeros ro_lle */
+ RO_INVALIDATE_CACHE(&inp->inp_route);
return;
}
diff --git a/freebsd/sys/netinet/ip_mroute.c b/freebsd/sys/netinet/ip_mroute.c
index eba4af63..3bf4fa91 100644
--- a/freebsd/sys/netinet/ip_mroute.c
+++ b/freebsd/sys/netinet/ip_mroute.c
@@ -2820,7 +2820,7 @@ static void
vnet_mroute_init(const void *unused __unused)
{
- MALLOC(V_nexpire, u_char *, mfchashsize, M_MRTABLE, M_WAITOK|M_ZERO);
+ V_nexpire = malloc(mfchashsize, M_MRTABLE, M_WAITOK|M_ZERO);
bzero(V_bw_meter_timers, sizeof(V_bw_meter_timers));
callout_init(&V_expire_upcalls_ch, 1);
callout_init(&V_bw_upcalls_ch, 1);
@@ -2834,7 +2834,7 @@ static void
vnet_mroute_uninit(const void *unused __unused)
{
- FREE(V_nexpire, M_MRTABLE);
+ free(V_nexpire, M_MRTABLE);
V_nexpire = NULL;
}
diff --git a/freebsd/sys/netinet/ip_output.c b/freebsd/sys/netinet/ip_output.c
index 62110ed1..4944c035 100644
--- a/freebsd/sys/netinet/ip_output.c
+++ b/freebsd/sys/netinet/ip_output.c
@@ -304,11 +304,8 @@ again:
!RT_LINK_IS_UP(rte->rt_ifp) ||
dst->sin_family != AF_INET ||
dst->sin_addr.s_addr != ip->ip_dst.s_addr)) {
- RTFREE(rte);
- rte = ro->ro_rt = (struct rtentry *)NULL;
- if (ro->ro_lle)
- LLE_FREE(ro->ro_lle); /* zeros ro_lle */
- ro->ro_lle = (struct llentry *)NULL;
+ RO_INVALIDATE_CACHE(ro);
+ rte = NULL;
}
ia = NULL;
have_ia_ref = 0;
diff --git a/freebsd/sys/netinet/ip_reass.c b/freebsd/sys/netinet/ip_reass.c
index 30cf3ba4..64660228 100644
--- a/freebsd/sys/netinet/ip_reass.c
+++ b/freebsd/sys/netinet/ip_reass.c
@@ -379,6 +379,7 @@ ip_reass(struct mbuf *m)
q->m_nextpkt = NULL;
m->m_pkthdr.csum_flags &= q->m_pkthdr.csum_flags;
m->m_pkthdr.csum_data += q->m_pkthdr.csum_data;
+ m_demote_pkthdr(q);
m_cat(m, q);
}
/*
diff --git a/freebsd/sys/netinet/libalias/alias_mod.h b/freebsd/sys/netinet/libalias/alias_mod.h
index d57798f7..c646f794 100644
--- a/freebsd/sys/netinet/libalias/alias_mod.h
+++ b/freebsd/sys/netinet/libalias/alias_mod.h
@@ -43,7 +43,7 @@ MALLOC_DECLARE(M_ALIAS);
#if defined(_SYS_MALLOC_H_)
#ifndef __rtems__
#define malloc(x) malloc(x, M_ALIAS, M_NOWAIT|M_ZERO)
-#define calloc(x, n) malloc(x*n)
+#define calloc(n, x) mallocarray((n), (x), M_ALIAS, M_NOWAIT|M_ZERO)
#define free(x) free(x, M_ALIAS)
#else /* __rtems__ */
#undef malloc
diff --git a/freebsd/sys/netinet/libalias/alias_sctp.c b/freebsd/sys/netinet/libalias/alias_sctp.c
index f7fda7bf..4f7d4940 100644
--- a/freebsd/sys/netinet/libalias/alias_sctp.c
+++ b/freebsd/sys/netinet/libalias/alias_sctp.c
@@ -29,7 +29,7 @@
*/
/*
- * Alias_sctp forms part of the libalias kernel module to handle
+ * Alias_sctp forms part of the libalias kernel module to handle
* Network Address Translation (NAT) for the SCTP protocol.
*
* This software was developed by David A. Hayes and Jason But
@@ -41,13 +41,13 @@
* proposed by Jason But and Grenville Armitage:
* http://caia.swin.edu.au/urp/sonata/
*
- *
+ *
* This project has been made possible in part by a grant from
* the Cisco University Research Program Fund at Community
* Foundation Silicon Valley.
*
*/
-/** @mainpage
+/** @mainpage
* Alias_sctp is part of the SONATA (http://caia.swin.edu.au/urp/sonata) project
* to develop and release a BSD licensed implementation of a Network Address
* Translation (NAT) module that supports the Stream Control Transmission
@@ -178,7 +178,7 @@ static void SctpAliasLog(const char *format, ...);
*
* Calls the higher level ShowAliasStats() in alias_db.c which logs all current
* statistics about the libalias instance - including SCTP statistics
- *
+ *
* @param la Pointer to the libalias instance
*/
void SctpShowAliasStats(struct libalias *la);
@@ -189,7 +189,7 @@ static MALLOC_DEFINE(M_SCTPNAT, "sctpnat", "sctp nat dbs");
/* Use kernel allocator. */
#ifdef _SYS_MALLOC_H_
#define sn_malloc(x) malloc(x, M_SCTPNAT, M_NOWAIT|M_ZERO)
-#define sn_calloc(n,x) sn_malloc(x * n)
+#define sn_calloc(n,x) mallocarray((n), (x), M_SCTPNAT, M_NOWAIT|M_ZERO)
#define sn_free(x) free(x, M_SCTPNAT)
#endif// #ifdef _SYS_MALLOC_H_
@@ -263,7 +263,7 @@ static MALLOC_DEFINE(M_SCTPNAT, "sctpnat", "sctp nat dbs");
* Define various log levels and a macro to call specified log functions only if
* the current log level (sysctl_log_level) matches the specified level @{
*/
-#define SN_LOG_LOW 0
+#define SN_LOG_LOW 0
#define SN_LOG_EVENT 1
#define SN_LOG_INFO 2
#define SN_LOG_DETAIL 3
@@ -424,9 +424,9 @@ int sysctl_chg_loglevel(SYSCTL_HANDLER_ARGS)
error = sysctl_handle_int(oidp, &level, 0, req);
if (error) return (error);
- sysctl_log_level = (level > SN_LOG_DEBUG_MAX)?(SN_LOG_DEBUG_MAX):(level);
- sysctl_log_level = (level < SN_LOG_LOW)?(SN_LOG_LOW):(level);
-
+ level = (level > SN_LOG_DEBUG_MAX) ? (SN_LOG_DEBUG_MAX) : (level);
+ level = (level < SN_LOG_LOW) ? (SN_LOG_LOW) : (level);
+ sysctl_log_level = level;
return (0);
}
@@ -445,12 +445,11 @@ int sysctl_chg_timer(SYSCTL_HANDLER_ARGS)
error = sysctl_handle_int(oidp, &timer, 0, req);
if (error) return (error);
- timer = (timer > SN_MAX_TIMER)?(SN_MAX_TIMER):(timer);
+ timer = (timer > SN_MAX_TIMER) ? (SN_MAX_TIMER) : (timer);
- if (((u_int *)arg1) != &sysctl_holddown_timer)
- {
- timer = (timer < SN_MIN_TIMER)?(SN_MIN_TIMER):(timer);
- }
+ if (((u_int *)arg1) != &sysctl_holddown_timer) {
+ timer = (timer < SN_MIN_TIMER) ? (SN_MIN_TIMER) : (timer);
+ }
*(u_int *)arg1 = timer;
@@ -474,11 +473,11 @@ int sysctl_chg_hashtable_size(SYSCTL_HANDLER_ARGS)
error = sysctl_handle_int(oidp, &size, 0, req);
if (error) return (error);
- size = (size < SN_MIN_HASH_SIZE)?(SN_MIN_HASH_SIZE):((size > SN_MAX_HASH_SIZE)?(SN_MAX_HASH_SIZE):(size));
+ size = (size < SN_MIN_HASH_SIZE) ? (SN_MIN_HASH_SIZE) : ((size > SN_MAX_HASH_SIZE) ? (SN_MAX_HASH_SIZE) : (size));
size |= 0x00000001; /* make odd */
- for(;(((size % 3) == 0) || ((size % 5) == 0) || ((size % 7) == 0) || ((size % 11) == 0)); size+=2);
+ for (;(((size % 3) == 0) || ((size % 5) == 0) || ((size % 7) == 0) || ((size % 11) == 0)); size+=2);
sysctl_hashtable_size = size;
return (0);
@@ -487,7 +486,7 @@ int sysctl_chg_hashtable_size(SYSCTL_HANDLER_ARGS)
/** @ingroup sysctl
* @brief sysctl callback for changing net.inet.ip.alias.sctp.error_on_ootb
*
- * Updates the error_on_clash sysctl variable.
+ * Updates the error_on_clash sysctl variable.
* If set to 0, no ErrorM will be sent if there is a look up table clash
* If set to 1, an ErrorM is sent only to the local side
* If set to 2, an ErrorM is sent to the local side and global side if there is
@@ -542,16 +541,16 @@ int sysctl_chg_initialising_chunk_proc_limit(SYSCTL_HANDLER_ARGS)
if (error) return (error);
sysctl_initialising_chunk_proc_limit = (proclimit < 1) ? 1: proclimit;
- sysctl_chunk_proc_limit =
+ sysctl_chunk_proc_limit =
(sysctl_chunk_proc_limit < sysctl_initialising_chunk_proc_limit) ? sysctl_initialising_chunk_proc_limit : sysctl_chunk_proc_limit;
-
+
return (0);
}
/** @ingroup sysctl
* @brief sysctl callback for changing net.inet.ip.alias.sctp.chunk_proc_limit
*
- * Updates the chunk_proc_limit sysctl variable.
+ * Updates the chunk_proc_limit sysctl variable.
* Number of chunks that should be processed to find key chunk:
* >= initialising_chunk_proc_limit (A high value is a DoS risk)
*/
@@ -563,7 +562,7 @@ int sysctl_chg_chunk_proc_limit(SYSCTL_HANDLER_ARGS)
error = sysctl_handle_int(oidp, &proclimit, 0, req);
if (error) return (error);
- sysctl_chunk_proc_limit =
+ sysctl_chunk_proc_limit =
(proclimit < sysctl_initialising_chunk_proc_limit) ? sysctl_initialising_chunk_proc_limit : proclimit;
return (0);
@@ -573,7 +572,7 @@ int sysctl_chg_chunk_proc_limit(SYSCTL_HANDLER_ARGS)
/** @ingroup sysctl
* @brief sysctl callback for changing net.inet.ip.alias.sctp.param_proc_limit
*
- * Updates the param_proc_limit sysctl variable.
+ * Updates the param_proc_limit sysctl variable.
* Number of parameters that should be processed to find key parameters:
* > 1 (A high value is a DoS risk)
*/
@@ -585,7 +584,7 @@ int sysctl_chg_param_proc_limit(SYSCTL_HANDLER_ARGS)
error = sysctl_handle_int(oidp, &proclimit, 0, req);
if (error) return (error);
- sysctl_param_proc_limit =
+ sysctl_param_proc_limit =
(proclimit < 2) ? 2 : proclimit;
return (0);
@@ -616,9 +615,9 @@ int sysctl_chg_track_global_addresses(SYSCTL_HANDLER_ARGS)
* CODE BEGINS HERE
* ----------------------------------------------------------------------
*/
-/**
+/**
* @brief Initialises the SCTP NAT Implementation
- *
+ *
* Creates the look-up tables and the timer queue and initialises all state
* variables
*
@@ -652,7 +651,7 @@ void AliasSctpInit(struct libalias *la)
la->sctpLinkCount = 0;
}
-/**
+/**
* @brief Cleans-up the SCTP NAT Implementation prior to unloading
*
* Removes all entries from the timer queue, freeing associations as it goes.
@@ -707,7 +706,7 @@ void AliasSctpTerm(struct libalias *la)
* @param la Pointer to the relevant libalias instance
* @param pip Pointer to IP packet to process
* @param direction SN_TO_LOCAL | SN_TO_GLOBAL
- *
+ *
* @return PKT_ALIAS_OK | PKT_ALIAS_IGNORE | PKT_ALIAS_ERROR
*/
int
@@ -719,10 +718,10 @@ SctpAlias(struct libalias *la, struct ip *pip, int direction)
if ((direction != SN_TO_LOCAL) && (direction != SN_TO_GLOBAL)) {
SctpAliasLog("ERROR: Invalid direction\n");
- return(PKT_ALIAS_ERROR);
+ return (PKT_ALIAS_ERROR);
}
- sctp_CheckTimers(la); /* Check timers */
+ sctp_CheckTimers(la); /* Check timers */
/* Parse the packet */
rtnval = sctp_PktParser(la, direction, pip, &msg, &assoc); //using *char (change to mbuf when get code from paolo)
@@ -737,24 +736,24 @@ SctpAlias(struct libalias *la, struct ip *pip, int direction)
}
SN_LOG(SN_LOG_EVENT,
logsctperror("SN_PARSE_ERROR", msg.sctp_hdr->v_tag, rtnval, direction));
- return(PKT_ALIAS_ERROR);
+ return (PKT_ALIAS_ERROR);
case SN_PARSE_ERROR_PARTIALLOOKUP:
if (sysctl_error_on_ootb > SN_LOCALandPARTIAL_ERROR_ON_OOTB) {
SN_LOG(SN_LOG_EVENT,
logsctperror("SN_PARSE_ERROR", msg.sctp_hdr->v_tag, rtnval, direction));
- return(PKT_ALIAS_ERROR);
+ return (PKT_ALIAS_ERROR);
}
case SN_PARSE_ERROR_LOOKUP:
if (sysctl_error_on_ootb == SN_ERROR_ON_OOTB ||
(sysctl_error_on_ootb == SN_LOCALandPARTIAL_ERROR_ON_OOTB && direction == SN_TO_LOCAL) ||
(sysctl_error_on_ootb == SN_LOCAL_ERROR_ON_OOTB && direction == SN_TO_GLOBAL)) {
TxAbortErrorM(la, &msg, assoc, SN_REFLECT_ERROR, direction); /*NB assoc=NULL */
- return(PKT_ALIAS_RESPOND);
+ return (PKT_ALIAS_RESPOND);
}
default:
SN_LOG(SN_LOG_EVENT,
logsctperror("SN_PARSE_ERROR", msg.sctp_hdr->v_tag, rtnval, direction));
- return(PKT_ALIAS_ERROR);
+ return (PKT_ALIAS_ERROR);
}
SN_LOG(SN_LOG_DETAIL,
@@ -772,9 +771,9 @@ SctpAlias(struct libalias *la, struct ip *pip, int direction)
);
SN_LOG(SN_LOG_DEBUG, logTimerQ(la));
- switch(rtnval){
+ switch (rtnval) {
case SN_NAT_PKT:
- switch(direction) {
+ switch (direction) {
case SN_TO_LOCAL:
DifferentialChecksum(&(msg.ip_hdr->ip_sum),
&(assoc->l_addr), &(msg.ip_hdr->ip_dst), 2);
@@ -796,7 +795,7 @@ SctpAlias(struct libalias *la, struct ip *pip, int direction)
break;
case SN_REPLY_ABORT:
case SN_REPLY_ERROR:
- case SN_SEND_ABORT:
+ case SN_SEND_ABORT:
TxAbortErrorM(la, &msg, assoc, rtnval, direction);
break;
default:
@@ -816,22 +815,22 @@ SctpAlias(struct libalias *la, struct ip *pip, int direction)
freeGlobalAddressList(assoc);
sn_free(assoc);
}
- switch(rtnval) {
+ switch (rtnval) {
case SN_NAT_PKT:
- return(PKT_ALIAS_OK);
+ return (PKT_ALIAS_OK);
case SN_SEND_ABORT:
- return(PKT_ALIAS_OK);
+ return (PKT_ALIAS_OK);
case SN_REPLY_ABORT:
case SN_REPLY_ERROR:
case SN_REFLECT_ERROR:
- return(PKT_ALIAS_RESPOND);
+ return (PKT_ALIAS_RESPOND);
case SN_DROP_PKT:
default:
- return(PKT_ALIAS_ERROR);
+ return (PKT_ALIAS_ERROR);
}
}
-/**
+/**
* @brief Send an AbortM or ErrorM
*
* We construct the new SCTP packet to send in place of the existing packet we
@@ -867,7 +866,7 @@ SctpAlias(struct libalias *la, struct ip *pip, int direction)
static uint32_t
local_sctp_finalize_crc32(uint32_t crc32c)
{
- /* This routine is duplicated from SCTP
+ /* This routine is duplicated from SCTP
* we need to do that since it MAY be that SCTP
* is NOT compiled into the kernel. The CRC32C routines
* however are always available in libkern.
@@ -926,7 +925,7 @@ TxAbortErrorM(struct libalias *la, struct sctp_nat_msg *sm, struct sctp_nat_asso
ip->ip_hl = 5; /* 5*32 bit words */
ip->ip_tos = 0;
ip->ip_len = htons(ip_size);
- ip->ip_id = sm->ip_hdr->ip_id;
+ ip->ip_id = sm->ip_hdr->ip_id;
ip->ip_off = 0;
ip->ip_ttl = 255;
ip->ip_p = IPPROTO_SCTP;
@@ -939,7 +938,7 @@ TxAbortErrorM(struct libalias *la, struct sctp_nat_msg *sm, struct sctp_nat_asso
chunk_hdr->chunk_type = (sndrply & SN_TX_ABORT) ? SCTP_ABORT_ASSOCIATION : SCTP_OPERATION_ERROR;
chunk_hdr->chunk_flags = SCTP_MIDDLEBOX_FLAG;
if (include_error_cause) {
- error_cause->code = htons((sndrply & SN_REFLECT_ERROR) ? SCTP_MISSING_NAT : SCTP_NAT_TABLE_COLLISION);
+ error_cause->code = htons((sndrply & SN_REFLECT_ERROR) ? SCTP_MISSING_NAT : SCTP_NAT_TABLE_COLLISION);
error_cause->length = htons(sizeof(struct sctp_error_cause));
chunk_hdr->chunk_length = htons(sizeof(*chunk_hdr) + sizeof(struct sctp_error_cause));
} else {
@@ -947,22 +946,22 @@ TxAbortErrorM(struct libalias *la, struct sctp_nat_msg *sm, struct sctp_nat_asso
}
/* set specific values */
- switch(sndrply) {
+ switch (sndrply) {
case SN_REFLECT_ERROR:
chunk_hdr->chunk_flags |= SCTP_HAD_NO_TCB; /* set Tbit */
- sctp_hdr->v_tag = sm->sctp_hdr->v_tag;
+ sctp_hdr->v_tag = sm->sctp_hdr->v_tag;
break;
case SN_REPLY_ERROR:
- sctp_hdr->v_tag = (direction == SN_TO_LOCAL) ? assoc->g_vtag : assoc->l_vtag ;
+ sctp_hdr->v_tag = (direction == SN_TO_LOCAL) ? assoc->g_vtag : assoc->l_vtag ;
break;
case SN_SEND_ABORT:
- sctp_hdr->v_tag = sm->sctp_hdr->v_tag;
+ sctp_hdr->v_tag = sm->sctp_hdr->v_tag;
break;
case SN_REPLY_ABORT:
sctp_hdr->v_tag = sm->sctpchnk.Init->initiate_tag;
break;
}
-
+
/* Set send/reply values */
if (sndrply == SN_SEND_ABORT) { /*pass through NAT */
ip->ip_src = (direction == SN_TO_LOCAL) ? sm->ip_hdr->ip_src : assoc->a_addr;
@@ -975,10 +974,10 @@ TxAbortErrorM(struct libalias *la, struct sctp_nat_msg *sm, struct sctp_nat_asso
sctp_hdr->src_port = sm->sctp_hdr->dest_port;
sctp_hdr->dest_port = sm->sctp_hdr->src_port;
}
-
+
/* Calculate IP header checksum */
ip->ip_sum = in_cksum_hdr(ip);
-
+
/* calculate SCTP header CRC32 */
sctp_hdr->checksum = 0;
sctp_hdr->checksum = local_sctp_finalize_crc32(calculate_crc32c(0xffffffff, (unsigned char *) sctp_hdr, sctp_size));
@@ -1005,18 +1004,18 @@ TxAbortErrorM(struct libalias *la, struct sctp_nat_msg *sm, struct sctp_nat_asso
*/
/** @ingroup packet_parser
* @brief Parses SCTP packets for the key SCTP chunk that will be processed
- *
+ *
* This module parses SCTP packets for the key SCTP chunk that will be processed
* The module completes the sctp_nat_msg structure and either retrieves the
* relevant (existing) stored association from the Hash Tables or creates a new
* association entity with state SN_ID
*
* @param la Pointer to the relevant libalias instance
- * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
- * @param pip
+ * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
+ * @param pip
* @param sm Pointer to sctp message information
* @param passoc Pointer to the association this SCTP Message belongs to
- *
+ *
* @return SN_PARSE_OK | SN_PARSE_ERROR_*
*/
static int
@@ -1051,26 +1050,26 @@ sctp_PktParser(struct libalias *la, int direction, struct ip *pip,
/* Check SCTP header length and move to first chunk */
if (bytes_left < sizeof(struct sctphdr)) {
sm->sctp_hdr = NULL;
- return(SN_PARSE_ERROR_IPSHL); /* packet not long enough*/
+ return (SN_PARSE_ERROR_IPSHL); /* packet not long enough*/
}
sm->sctp_hdr = sctp_hdr = (struct sctphdr *) ip_next(pip);
bytes_left -= sizeof(struct sctphdr);
-
+
/* Check for valid ports (zero valued ports would find partially initialised associations */
if (sctp_hdr->src_port == 0 || sctp_hdr->dest_port == 0)
- return(SN_PARSE_ERROR_PORT);
+ return (SN_PARSE_ERROR_PORT);
/* Check length of first chunk */
if (bytes_left < SN_MIN_CHUNK_SIZE) /* malformed chunk - could cause endless loop*/
- return(SN_PARSE_ERROR_CHHL); /* packet not long enough for this chunk */
-
+ return (SN_PARSE_ERROR_CHHL); /* packet not long enough for this chunk */
+
/* First chunk */
chunk_hdr = SN_SCTP_FIRSTCHUNK(sctp_hdr);
-
+
chunk_length = SCTP_SIZE32(ntohs(chunk_hdr->chunk_length));
if ((chunk_length < SN_MIN_CHUNK_SIZE) || (chunk_length > bytes_left)) /* malformed chunk - could cause endless loop*/
- return(SN_PARSE_ERROR_CHHL);
+ return (SN_PARSE_ERROR_CHHL);
if ((chunk_hdr->chunk_flags & SCTP_HAD_NO_TCB) &&
((chunk_hdr->chunk_type == SCTP_ABORT_ASSOCIATION) ||
@@ -1093,43 +1092,43 @@ sctp_PktParser(struct libalias *la, int direction, struct ip *pip,
sm->msg = SN_SCTP_OTHER;/* Initialise to largest value*/
sm->chunk_length = 0; /* only care about length for key chunks */
while (IS_SCTP_CONTROL(chunk_hdr)) {
- switch(chunk_hdr->chunk_type) {
+ switch (chunk_hdr->chunk_type) {
case SCTP_INITIATION:
if (chunk_length < sizeof(struct sctp_init_chunk)) /* malformed chunk*/
- return(SN_PARSE_ERROR_CHHL);
+ return (SN_PARSE_ERROR_CHHL);
sm->msg = SN_SCTP_INIT;
sm->sctpchnk.Init = (struct sctp_init *) ((char *) chunk_hdr + sizeof(struct sctp_chunkhdr));
sm->chunk_length = chunk_length;
/* if no existing association, create a new one */
if (*passoc == NULL) {
- if (sctp_hdr->v_tag == 0){ //Init requires vtag=0
+ if (sctp_hdr->v_tag == 0) { //Init requires vtag=0
*passoc = (struct sctp_nat_assoc *) sn_malloc(sizeof(struct sctp_nat_assoc));
- if (*passoc == NULL) {/* out of resources */
- return(SN_PARSE_ERROR_AS_MALLOC);
+ if (*passoc == NULL) {/* out of resources */
+ return (SN_PARSE_ERROR_AS_MALLOC);
}
- /* Initialise association - malloc initialises memory to zeros */
+ /* Initialize association - sn_malloc initializes memory to zeros */
(*passoc)->state = SN_ID;
LIST_INIT(&((*passoc)->Gaddr)); /* always initialise to avoid memory problems */
(*passoc)->TableRegister = SN_NULL_TBL;
- return(SN_PARSE_OK);
+ return (SN_PARSE_OK);
}
- return(SN_PARSE_ERROR_VTAG);
+ return (SN_PARSE_ERROR_VTAG);
}
- return(SN_PARSE_ERROR_LOOKUP);
+ return (SN_PARSE_ERROR_LOOKUP);
case SCTP_INITIATION_ACK:
if (chunk_length < sizeof(struct sctp_init_ack_chunk)) /* malformed chunk*/
- return(SN_PARSE_ERROR_CHHL);
+ return (SN_PARSE_ERROR_CHHL);
sm->msg = SN_SCTP_INITACK;
sm->sctpchnk.InitAck = (struct sctp_init_ack *) ((char *) chunk_hdr + sizeof(struct sctp_chunkhdr));
sm->chunk_length = chunk_length;
- return ((*passoc == NULL)?(SN_PARSE_ERROR_LOOKUP):(SN_PARSE_OK));
+ return ((*passoc == NULL) ? (SN_PARSE_ERROR_LOOKUP) : (SN_PARSE_OK));
case SCTP_ABORT_ASSOCIATION: /* access only minimum sized chunk */
sm->msg = SN_SCTP_ABORT;
sm->chunk_length = chunk_length;
- return ((*passoc == NULL)?(SN_PARSE_ERROR_LOOKUP_ABORT):(SN_PARSE_OK));
+ return ((*passoc == NULL) ? (SN_PARSE_ERROR_LOOKUP_ABORT) : (SN_PARSE_OK));
case SCTP_SHUTDOWN_ACK:
if (chunk_length < sizeof(struct sctp_shutdown_ack_chunk)) /* malformed chunk*/
- return(SN_PARSE_ERROR_CHHL);
+ return (SN_PARSE_ERROR_CHHL);
if (sm->msg > SN_SCTP_SHUTACK) {
sm->msg = SN_SCTP_SHUTACK;
sm->chunk_length = chunk_length;
@@ -1140,11 +1139,11 @@ sctp_PktParser(struct libalias *la, int direction, struct ip *pip,
sm->msg = SN_SCTP_SHUTCOMP;
sm->chunk_length = chunk_length;
}
- return ((*passoc == NULL)?(SN_PARSE_ERROR_LOOKUP):(SN_PARSE_OK));
+ return ((*passoc == NULL) ? (SN_PARSE_ERROR_LOOKUP) : (SN_PARSE_OK));
case SCTP_ASCONF:
if (sm->msg > SN_SCTP_ASCONF) {
if (chunk_length < (sizeof(struct sctp_asconf_chunk) + sizeof(struct sctp_ipv4addr_param))) /* malformed chunk*/
- return(SN_PARSE_ERROR_CHHL);
+ return (SN_PARSE_ERROR_CHHL);
//leave parameter searching to later, if required
param_hdr = (struct sctp_paramhdr *) ((char *) chunk_hdr + sizeof(struct sctp_asconf_chunk)); /*compulsory IP parameter*/
if (ntohs(param_hdr->param_type) == SCTP_IPV4_ADDRESS) {
@@ -1153,38 +1152,38 @@ sctp_PktParser(struct libalias *la, int direction, struct ip *pip,
ipv4addr.s_addr = ((struct sctp_ipv4addr_param *) param_hdr)->addr;
*passoc = FindSctpGlobal(la, ipv4addr, sctp_hdr->v_tag, sctp_hdr->src_port, sctp_hdr->dest_port, &partial_match);
}
- param_hdr = (struct sctp_paramhdr *)
+ param_hdr = (struct sctp_paramhdr *)
((char *) param_hdr + sizeof(struct sctp_ipv4addr_param)); /*asconf's compulsory address parameter */
sm->chunk_length = chunk_length - sizeof(struct sctp_asconf_chunk) - sizeof(struct sctp_ipv4addr_param); /* rest of chunk */
} else {
if (chunk_length < (sizeof(struct sctp_asconf_chunk) + sizeof(struct sctp_ipv6addr_param))) /* malformed chunk*/
- return(SN_PARSE_ERROR_CHHL);
- param_hdr = (struct sctp_paramhdr *)
- ((char *) param_hdr + sizeof(struct sctp_ipv6addr_param)); /*asconf's compulsory address parameter */
+ return (SN_PARSE_ERROR_CHHL);
+ param_hdr = (struct sctp_paramhdr *)
+ ((char *) param_hdr + sizeof(struct sctp_ipv6addr_param)); /*asconf's compulsory address parameter */
sm->chunk_length = chunk_length - sizeof(struct sctp_asconf_chunk) - sizeof(struct sctp_ipv6addr_param); /* rest of chunk */
}
sm->msg = SN_SCTP_ASCONF;
sm->sctpchnk.Asconf = param_hdr;
-
+
if (*passoc == NULL) { /* AddIP with no association */
*passoc = (struct sctp_nat_assoc *) sn_malloc(sizeof(struct sctp_nat_assoc));
- if (*passoc == NULL) {/* out of resources */
- return(SN_PARSE_ERROR_AS_MALLOC);
+ if (*passoc == NULL) {/* out of resources */
+ return (SN_PARSE_ERROR_AS_MALLOC);
}
- /* Initialise association - malloc initialises memory to zeros */
+ /* Initialize association - sn_malloc initializes memory to zeros */
(*passoc)->state = SN_ID;
LIST_INIT(&((*passoc)->Gaddr)); /* always initialise to avoid memory problems */
(*passoc)->TableRegister = SN_NULL_TBL;
- return(SN_PARSE_OK);
+ return (SN_PARSE_OK);
}
}
break;
case SCTP_ASCONF_ACK:
if (sm->msg > SN_SCTP_ASCONFACK) {
if (chunk_length < sizeof(struct sctp_asconf_ack_chunk)) /* malformed chunk*/
- return(SN_PARSE_ERROR_CHHL);
+ return (SN_PARSE_ERROR_CHHL);
//leave parameter searching to later, if required
- param_hdr = (struct sctp_paramhdr *) ((char *) chunk_hdr
+ param_hdr = (struct sctp_paramhdr *) ((char *) chunk_hdr
+ sizeof(struct sctp_asconf_ack_chunk));
sm->msg = SN_SCTP_ASCONFACK;
sm->sctpchnk.Asconf = param_hdr;
@@ -1197,33 +1196,33 @@ sctp_PktParser(struct libalias *la, int direction, struct ip *pip,
/* if no association is found exit - we need to find an Init or AddIP within sysctl_initialising_chunk_proc_limit */
if ((*passoc == NULL) && (chunk_count >= sysctl_initialising_chunk_proc_limit))
- return(SN_PARSE_ERROR_LOOKUP);
+ return (SN_PARSE_ERROR_LOOKUP);
/* finished with this chunk, on to the next chunk*/
bytes_left-= chunk_length;
/* Is this the end of the packet ? */
if (bytes_left == 0)
- return (*passoc == NULL)?(SN_PARSE_ERROR_LOOKUP):(SN_PARSE_OK);
+ return (*passoc == NULL) ? (SN_PARSE_ERROR_LOOKUP) : (SN_PARSE_OK);
/* Are there enough bytes in packet to at least retrieve length of next chunk ? */
if (bytes_left < SN_MIN_CHUNK_SIZE)
- return(SN_PARSE_ERROR_CHHL);
+ return (SN_PARSE_ERROR_CHHL);
chunk_hdr = SN_SCTP_NEXTCHUNK(chunk_hdr);
/* Is the chunk long enough to not cause endless look and are there enough bytes in packet to read the chunk ? */
chunk_length = SCTP_SIZE32(ntohs(chunk_hdr->chunk_length));
if ((chunk_length < SN_MIN_CHUNK_SIZE) || (chunk_length > bytes_left))
- return(SN_PARSE_ERROR_CHHL);
- if(++chunk_count > sysctl_chunk_proc_limit)
- return(SN_PARSE_OK); /* limit for processing chunks, take what we get */
+ return (SN_PARSE_ERROR_CHHL);
+ if (++chunk_count > sysctl_chunk_proc_limit)
+ return (SN_PARSE_OK); /* limit for processing chunks, take what we get */
}
if (*passoc == NULL)
- return (partial_match)?(SN_PARSE_ERROR_PARTIALLOOKUP):(SN_PARSE_ERROR_LOOKUP);
+ return (partial_match) ? (SN_PARSE_ERROR_PARTIALLOOKUP) : (SN_PARSE_ERROR_LOOKUP);
else
- return(SN_PARSE_OK);
+ return (SN_PARSE_OK);
}
/** @ingroup packet_parser
@@ -1231,7 +1230,7 @@ sctp_PktParser(struct libalias *la, int direction, struct ip *pip,
*
* GetAsconfVtags scans an Asconf Chunk for the vtags parameter, and then
* extracts the vtags.
- *
+ *
* GetAsconfVtags is not called from within sctp_PktParser. It is called only
* from within ID_process when an AddIP has been received.
*
@@ -1239,9 +1238,9 @@ sctp_PktParser(struct libalias *la, int direction, struct ip *pip,
* @param sm Pointer to sctp message information
* @param l_vtag Pointer to the local vtag in the association this SCTP Message belongs to
* @param g_vtag Pointer to the local vtag in the association this SCTP Message belongs to
- * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
- *
- * @return 1 - success | 0 - fail
+ * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
+ *
+ * @return 1 - success | 0 - fail
*/
static int
GetAsconfVtags(struct libalias *la, struct sctp_nat_msg *sm, uint32_t *l_vtag, uint32_t *g_vtag, int direction)
@@ -1253,7 +1252,7 @@ GetAsconfVtags(struct libalias *la, struct sctp_nat_msg *sm, uint32_t *l_vtag, u
uint32_t local_vtag;
uint32_t remote_vtag;
} __attribute__((packed));
-
+
struct sctp_vtag_param *vtag_param;
struct sctp_paramhdr *param;
int bytes_left;
@@ -1268,7 +1267,7 @@ GetAsconfVtags(struct libalias *la, struct sctp_nat_msg *sm, uint32_t *l_vtag, u
while((bytes_left >= param_size) && (bytes_left >= SN_VTAG_PARAM_SIZE)) {
if (ntohs(param->param_type) == SCTP_VTAG_PARAM) {
vtag_param = (struct sctp_vtag_param *) param;
- switch(direction) {
+ switch (direction) {
/* The Internet draft is a little ambigious as to order of these vtags.
We think it is this way around. If we are wrong, the order will need
to be changed. */
@@ -1281,11 +1280,11 @@ GetAsconfVtags(struct libalias *la, struct sctp_nat_msg *sm, uint32_t *l_vtag, u
*l_vtag = vtag_param->local_vtag;
break;
}
- return(1); /* found */
+ return (1); /* found */
}
bytes_left -= param_size;
- if (bytes_left < SN_MIN_PARAM_SIZE) return(0);
+ if (bytes_left < SN_MIN_PARAM_SIZE) return (0);
param = SN_SCTP_NEXTPARAM(param);
param_size = SCTP_SIZE32(ntohs(param->param_length));
@@ -1293,22 +1292,22 @@ GetAsconfVtags(struct libalias *la, struct sctp_nat_msg *sm, uint32_t *l_vtag, u
SN_LOG(SN_LOG_EVENT,
logsctperror("Parameter parse limit exceeded (GetAsconfVtags)",
sm->sctp_hdr->v_tag, sysctl_param_proc_limit, direction));
- return(0); /* not found limit exceeded*/
+ return (0); /* not found limit exceeded*/
}
}
- return(0); /* not found */
+ return (0); /* not found */
}
/** @ingroup packet_parser
* @brief AddGlobalIPAddresses from Init,InitAck,or AddIP packets
- *
+ *
* AddGlobalIPAddresses scans an SCTP chunk (in sm) for Global IP addresses, and
* adds them.
*
* @param sm Pointer to sctp message information
* @param assoc Pointer to the association this SCTP Message belongs to
- * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
- *
+ * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
+ *
*/
static void
AddGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int direction)
@@ -1321,7 +1320,7 @@ AddGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int
int param_size;
int param_count, addr_param_count = 0;
- switch(direction) {
+ switch (direction) {
case SN_TO_GLOBAL: /* does not contain global addresses */
g_addr = sm->ip_hdr->ip_dst;
bytes_left = 0; /* force exit */
@@ -1329,7 +1328,7 @@ AddGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int
case SN_TO_LOCAL:
g_addr = sm->ip_hdr->ip_src;
param_count = 1;
- switch(sm->msg) {
+ switch (sm->msg) {
case SN_SCTP_INIT:
bytes_left = sm->chunk_length - sizeof(struct sctp_init_chunk);
param = (struct sctp_paramhdr *)((char *)sm->sctpchnk.Init + sizeof(struct sctp_init));
@@ -1344,16 +1343,16 @@ AddGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int
break;
}
}
- if (bytes_left >= SN_MIN_PARAM_SIZE)
+ if (bytes_left >= SN_MIN_PARAM_SIZE)
param_size = SCTP_SIZE32(ntohs(param->param_length));
else
param_size = bytes_left+1; /* force skip loop */
-
- if ((assoc->state == SN_ID) && ((sm->msg == SN_SCTP_INIT) || (bytes_left < SN_MIN_PARAM_SIZE))) {/* add pkt address */
+
+ if ((assoc->state == SN_ID) && ((sm->msg == SN_SCTP_INIT) || (bytes_left < SN_MIN_PARAM_SIZE))) {/* add pkt address */
G_Addr = (struct sctp_GlobalAddress *) sn_malloc(sizeof(struct sctp_GlobalAddress));
- if (G_Addr == NULL) {/* out of resources */
+ if (G_Addr == NULL) {/* out of resources */
SN_LOG(SN_LOG_EVENT,
- logsctperror("AddGlobalIPAddress: No resources for adding global address - revert to no tracking",
+ logsctperror("AddGlobalIPAddress: No resources for adding global address - revert to no tracking",
sm->sctp_hdr->v_tag, 0, direction));
assoc->num_Gaddr = 0; /* don't track any more for this assoc*/
sysctl_track_global_addresses=0;
@@ -1362,7 +1361,7 @@ AddGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int
G_Addr->g_addr = g_addr;
if (!Add_Global_Address_to_List(assoc, G_Addr))
SN_LOG(SN_LOG_EVENT,
- logsctperror("AddGlobalIPAddress: Address already in list",
+ logsctperror("AddGlobalIPAddress: Address already in list",
sm->sctp_hdr->v_tag, assoc->num_Gaddr, direction));
}
@@ -1370,21 +1369,22 @@ AddGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int
while((bytes_left >= param_size) && (bytes_left >= sizeof(struct sctp_ipv4addr_param))) {
if (assoc->num_Gaddr >= sysctl_track_global_addresses) {
SN_LOG(SN_LOG_EVENT,
- logsctperror("AddGlobalIPAddress: Maximum Number of addresses reached",
+ logsctperror("AddGlobalIPAddress: Maximum Number of addresses reached",
sm->sctp_hdr->v_tag, sysctl_track_global_addresses, direction));
return;
}
- switch(ntohs(param->param_type)) {
+ switch (ntohs(param->param_type)) {
case SCTP_ADD_IP_ADDRESS:
/* skip to address parameter - leave param_size so bytes left will be calculated properly*/
param = (struct sctp_paramhdr *) &((struct sctp_asconf_addrv4_param *) param)->addrp;
+ /* FALLTHROUGH */
case SCTP_IPV4_ADDRESS:
ipv4_param = (struct sctp_ipv4addr_param *) param;
/* add addresses to association */
G_Addr = (struct sctp_GlobalAddress *) sn_malloc(sizeof(struct sctp_GlobalAddress));
- if (G_Addr == NULL) {/* out of resources */
+ if (G_Addr == NULL) {/* out of resources */
SN_LOG(SN_LOG_EVENT,
- logsctperror("AddGlobalIPAddress: No resources for adding global address - revert to no tracking",
+ logsctperror("AddGlobalIPAddress: No resources for adding global address - revert to no tracking",
sm->sctp_hdr->v_tag, 0, direction));
assoc->num_Gaddr = 0; /* don't track any more for this assoc*/
sysctl_track_global_addresses=0;
@@ -1396,22 +1396,22 @@ AddGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int
G_Addr->g_addr = g_addr;
if (!Add_Global_Address_to_List(assoc, G_Addr))
SN_LOG(SN_LOG_EVENT,
- logsctperror("AddGlobalIPAddress: Address already in list",
+ logsctperror("AddGlobalIPAddress: Address already in list",
sm->sctp_hdr->v_tag, assoc->num_Gaddr, direction));
return; /*shouldn't be any other addresses if the zero address is given*/
} else {
G_Addr->g_addr.s_addr = ipv4_param->addr;
if (!Add_Global_Address_to_List(assoc, G_Addr))
SN_LOG(SN_LOG_EVENT,
- logsctperror("AddGlobalIPAddress: Address already in list",
+ logsctperror("AddGlobalIPAddress: Address already in list",
sm->sctp_hdr->v_tag, assoc->num_Gaddr, direction));
}
- }
-
+ }
+
bytes_left -= param_size;
if (bytes_left < SN_MIN_PARAM_SIZE)
break;
-
+
param = SN_SCTP_NEXTPARAM(param);
param_size = SCTP_SIZE32(ntohs(param->param_length));
if (++param_count > sysctl_param_proc_limit) {
@@ -1423,39 +1423,39 @@ AddGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int
}
if (addr_param_count == 0) {
SN_LOG(SN_LOG_DETAIL,
- logsctperror("AddGlobalIPAddress: no address parameters to add",
+ logsctperror("AddGlobalIPAddress: no address parameters to add",
sm->sctp_hdr->v_tag, assoc->num_Gaddr, direction));
}
}
-/**
+/**
* @brief Add_Global_Address_to_List
*
* Adds a global IP address to an associations address list, if it is not
* already there. The first address added us usually the packet's address, and
* is most likely to be used, so it is added at the beginning. Subsequent
* addresses are added after this one.
- *
+ *
* @param assoc Pointer to the association this SCTP Message belongs to
* @param G_addr Pointer to the global address to add
*
- * @return 1 - success | 0 - fail
+ * @return 1 - success | 0 - fail
*/
static int Add_Global_Address_to_List(struct sctp_nat_assoc *assoc, struct sctp_GlobalAddress *G_addr)
{
- struct sctp_GlobalAddress *iter_G_Addr = NULL, *first_G_Addr = NULL;
- first_G_Addr = LIST_FIRST(&(assoc->Gaddr));
+ struct sctp_GlobalAddress *iter_G_Addr = NULL, *first_G_Addr = NULL;
+ first_G_Addr = LIST_FIRST(&(assoc->Gaddr));
if (first_G_Addr == NULL) {
LIST_INSERT_HEAD(&(assoc->Gaddr), G_addr, list_Gaddr); /* add new address to beginning of list*/
} else {
LIST_FOREACH(iter_G_Addr, &(assoc->Gaddr), list_Gaddr) {
if (G_addr->g_addr.s_addr == iter_G_Addr->g_addr.s_addr)
- return(0); /* already exists, so don't add */
+ return (0); /* already exists, so don't add */
}
LIST_INSERT_AFTER(first_G_Addr, G_addr, list_Gaddr); /* add address to end of list*/
}
- assoc->num_Gaddr++;
- return(1); /* success */
+ assoc->num_Gaddr++;
+ return (1); /* success */
}
/** @ingroup packet_parser
@@ -1468,8 +1468,8 @@ static int Add_Global_Address_to_List(struct sctp_nat_assoc *assoc, struct sct
*
* @param sm Pointer to sctp message information
* @param assoc Pointer to the association this SCTP Message belongs to
- * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
- *
+ * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
+ *
*/
static void
RmGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int direction)
@@ -1482,7 +1482,7 @@ RmGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int d
int param_size;
int param_count;
- if(direction == SN_TO_GLOBAL)
+ if (direction == SN_TO_GLOBAL)
g_addr = sm->ip_hdr->ip_dst;
else
g_addr = sm->ip_hdr->ip_src;
@@ -1490,29 +1490,29 @@ RmGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int d
bytes_left = sm->chunk_length;
param_count = 1;
param = sm->sctpchnk.Asconf;
- if (bytes_left >= SN_MIN_PARAM_SIZE) {
+ if (bytes_left >= SN_MIN_PARAM_SIZE) {
param_size = SCTP_SIZE32(ntohs(param->param_length));
} else {
SN_LOG(SN_LOG_EVENT,
- logsctperror("RmGlobalIPAddress: truncated packet - cannot remove IP addresses",
+ logsctperror("RmGlobalIPAddress: truncated packet - cannot remove IP addresses",
sm->sctp_hdr->v_tag, sysctl_track_global_addresses, direction));
return;
}
-
+
/* step through Asconf parameters */
while((bytes_left >= param_size) && (bytes_left >= sizeof(struct sctp_ipv4addr_param))) {
if (ntohs(param->param_type) == SCTP_DEL_IP_ADDRESS) {
asconf_ipv4_param = (struct sctp_asconf_addrv4_param *) param;
if (asconf_ipv4_param->addrp.addr == INADDR_ANY) { /* remove all bar pkt address */
LIST_FOREACH_SAFE(G_Addr, &(assoc->Gaddr), list_Gaddr, G_Addr_tmp) {
- if(G_Addr->g_addr.s_addr != sm->ip_hdr->ip_src.s_addr) {
+ if (G_Addr->g_addr.s_addr != sm->ip_hdr->ip_src.s_addr) {
if (assoc->num_Gaddr > 1) { /* only delete if more than one */
LIST_REMOVE(G_Addr, list_Gaddr);
sn_free(G_Addr);
assoc->num_Gaddr--;
} else {
SN_LOG(SN_LOG_EVENT,
- logsctperror("RmGlobalIPAddress: Request to remove last IP address (didn't)",
+ logsctperror("RmGlobalIPAddress: Request to remove last IP address (didn't)",
sm->sctp_hdr->v_tag, assoc->num_Gaddr, direction));
}
}
@@ -1520,7 +1520,7 @@ RmGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int d
return; /*shouldn't be any other addresses if the zero address is given*/
} else {
LIST_FOREACH_SAFE(G_Addr, &(assoc->Gaddr), list_Gaddr, G_Addr_tmp) {
- if(G_Addr->g_addr.s_addr == asconf_ipv4_param->addrp.addr) {
+ if (G_Addr->g_addr.s_addr == asconf_ipv4_param->addrp.addr) {
if (assoc->num_Gaddr > 1) { /* only delete if more than one */
LIST_REMOVE(G_Addr, list_Gaddr);
sn_free(G_Addr);
@@ -1528,22 +1528,22 @@ RmGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int d
break; /* Since add only adds new addresses, there should be no double entries */
} else {
SN_LOG(SN_LOG_EVENT,
- logsctperror("RmGlobalIPAddress: Request to remove last IP address (didn't)",
+ logsctperror("RmGlobalIPAddress: Request to remove last IP address (didn't)",
sm->sctp_hdr->v_tag, assoc->num_Gaddr, direction));
}
}
}
}
- }
+ }
bytes_left -= param_size;
if (bytes_left == 0) return;
else if (bytes_left < SN_MIN_PARAM_SIZE) {
SN_LOG(SN_LOG_EVENT,
- logsctperror("RmGlobalIPAddress: truncated packet - may not have removed all IP addresses",
+ logsctperror("RmGlobalIPAddress: truncated packet - may not have removed all IP addresses",
sm->sctp_hdr->v_tag, sysctl_track_global_addresses, direction));
return;
}
-
+
param = SN_SCTP_NEXTPARAM(param);
param_size = SCTP_SIZE32(ntohs(param->param_length));
if (++param_count > sysctl_param_proc_limit) {
@@ -1570,11 +1570,11 @@ RmGlobalIPAddresses(struct sctp_nat_msg *sm, struct sctp_nat_assoc *assoc, int d
* Since there is currently no connection on this path, there should be no other
* ASCONF configuration parameters outstanding, so we presume that if there is
* an ACK that it is responding to the AddIP and activate the new association.
- *
+ *
* @param la Pointer to the relevant libalias instance
* @param sm Pointer to sctp message information
- * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
- *
+ * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
+ *
* @return 1 - success | 0 - fail
*/
static int
@@ -1589,45 +1589,45 @@ IsASCONFack(struct libalias *la, struct sctp_nat_msg *sm, int direction)
param = sm->sctpchnk.Asconf;
param_size = SCTP_SIZE32(ntohs(param->param_length));
if (param_size == 8)
- return(1); /*success - default acknowledgement of everything */
+ return (1); /*success - default acknowledgement of everything */
bytes_left = sm->chunk_length;
if (bytes_left < param_size)
- return(0); /* not found */
+ return (0); /* not found */
/* step through Asconf parameters */
while(bytes_left >= SN_ASCONFACK_PARAM_SIZE) {
if (ntohs(param->param_type) == SCTP_SUCCESS_REPORT)
- return(1); /* success - but can't match correlation IDs - should only be one */
+ return (1); /* success - but can't match correlation IDs - should only be one */
/* check others just in case */
bytes_left -= param_size;
if (bytes_left >= SN_MIN_PARAM_SIZE) {
param = SN_SCTP_NEXTPARAM(param);
} else {
- return(0);
+ return (0);
}
param_size = SCTP_SIZE32(ntohs(param->param_length));
- if (bytes_left < param_size) return(0);
+ if (bytes_left < param_size) return (0);
if (++param_count > sysctl_param_proc_limit) {
SN_LOG(SN_LOG_EVENT,
- logsctperror("Parameter parse limit exceeded (IsASCONFack)",
+ logsctperror("Parameter parse limit exceeded (IsASCONFack)",
sm->sctp_hdr->v_tag, sysctl_param_proc_limit, direction));
- return(0); /* not found limit exceeded*/
+ return (0); /* not found limit exceeded*/
}
}
- return(0); /* not success */
+ return (0); /* not success */
}
/** @ingroup packet_parser
- * @brief Check to see if ASCONF contains an Add IP or Del IP parameter
- *
+ * @brief Check to see if ASCONF contains an Add IP or Del IP parameter
+ *
* IsADDorDEL scans an ASCONF packet to see if it contains an AddIP or DelIP
* parameter
*
* @param la Pointer to the relevant libalias instance
* @param sm Pointer to sctp message information
- * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
- *
+ * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
+ *
* @return SCTP_ADD_IP_ADDRESS | SCTP_DEL_IP_ADDRESS | 0 - fail
*/
static int
@@ -1644,31 +1644,31 @@ IsADDorDEL(struct libalias *la, struct sctp_nat_msg *sm, int direction)
bytes_left = sm->chunk_length;
if (bytes_left < param_size)
- return(0); /* not found */
+ return (0); /* not found */
/* step through Asconf parameters */
while(bytes_left >= SN_ASCONFACK_PARAM_SIZE) {
if (ntohs(param->param_type) == SCTP_ADD_IP_ADDRESS)
- return(SCTP_ADD_IP_ADDRESS);
- else if (ntohs(param->param_type) == SCTP_DEL_IP_ADDRESS)
- return(SCTP_DEL_IP_ADDRESS);
+ return (SCTP_ADD_IP_ADDRESS);
+ else if (ntohs(param->param_type) == SCTP_DEL_IP_ADDRESS)
+ return (SCTP_DEL_IP_ADDRESS);
/* check others just in case */
bytes_left -= param_size;
if (bytes_left >= SN_MIN_PARAM_SIZE) {
param = SN_SCTP_NEXTPARAM(param);
} else {
- return(0); /*Neither found */
+ return (0); /*Neither found */
}
param_size = SCTP_SIZE32(ntohs(param->param_length));
- if (bytes_left < param_size) return(0);
+ if (bytes_left < param_size) return (0);
if (++param_count > sysctl_param_proc_limit) {
SN_LOG(SN_LOG_EVENT,
- logsctperror("Parameter parse limit exceeded IsADDorDEL)",
+ logsctperror("Parameter parse limit exceeded IsADDorDEL)",
sm->sctp_hdr->v_tag, sysctl_param_proc_limit, direction));
- return(0); /* not found limit exceeded*/
+ return (0); /* not found limit exceeded*/
}
}
- return(0); /*Neither found */
+ return (0); /*Neither found */
}
/* ----------------------------------------------------------------------
@@ -1691,7 +1691,7 @@ IsADDorDEL(struct libalias *la, struct sctp_nat_msg *sm, int direction)
* each state.
*
* @param la Pointer to the relevant libalias instance
- * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
+ * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
* @param sm Pointer to sctp message information
* @param assoc Pointer to the association this SCTP Message belongs to
*
@@ -1708,17 +1708,17 @@ ProcessSctpMsg(struct libalias *la, int direction, struct sctp_nat_msg *sm, stru
if (rtnval != SN_NAT_PKT) {
assoc->state = SN_RM;/* Mark for removal*/
}
- return(rtnval);
+ return (rtnval);
case SN_INi: /* Initialising - Init */
- return(INi_process(la, direction, assoc, sm));
+ return (INi_process(la, direction, assoc, sm));
case SN_INa: /* Initialising - AddIP */
- return(INa_process(la, direction, assoc, sm));
+ return (INa_process(la, direction, assoc, sm));
case SN_UP: /* Association UP */
- return(UP_process(la, direction, assoc, sm));
+ return (UP_process(la, direction, assoc, sm));
case SN_CL: /* Association Closing */
- return(CL_process(la, direction, assoc, sm));
+ return (CL_process(la, direction, assoc, sm));
}
- return(SN_PROCESSING_ERROR);
+ return (SN_PROCESSING_ERROR);
}
/** @ingroup state_machine
@@ -1738,56 +1738,57 @@ ProcessSctpMsg(struct libalias *la, int direction, struct sctp_nat_msg *sm, stru
static int
ID_process(struct libalias *la, int direction, struct sctp_nat_assoc *assoc, struct sctp_nat_msg *sm)
{
- switch(sm->msg) {
+ switch (sm->msg) {
case SN_SCTP_ASCONF: /* a packet containing an ASCONF chunk with ADDIP */
if (!sysctl_accept_global_ootb_addip && (direction == SN_TO_LOCAL))
- return(SN_DROP_PKT);
+ return (SN_DROP_PKT);
/* if this Asconf packet does not contain the Vtag parameters it is of no use in Idle state */
if (!GetAsconfVtags(la, sm, &(assoc->l_vtag), &(assoc->g_vtag), direction))
- return(SN_DROP_PKT);
+ return (SN_DROP_PKT);
+ /* FALLTHROUGH */
case SN_SCTP_INIT: /* a packet containing an INIT chunk or an ASCONF AddIP */
if (sysctl_track_global_addresses)
AddGlobalIPAddresses(sm, assoc, direction);
- switch(direction){
+ switch (direction) {
case SN_TO_GLOBAL:
assoc->l_addr = sm->ip_hdr->ip_src;
assoc->a_addr = FindAliasAddress(la, assoc->l_addr);
assoc->l_port = sm->sctp_hdr->src_port;
assoc->g_port = sm->sctp_hdr->dest_port;
- if(sm->msg == SN_SCTP_INIT)
+ if (sm->msg == SN_SCTP_INIT)
assoc->g_vtag = sm->sctpchnk.Init->initiate_tag;
if (AddSctpAssocGlobal(la, assoc)) /* DB clash *///**** need to add dst address
- return((sm->msg == SN_SCTP_INIT) ? SN_REPLY_ABORT : SN_REPLY_ERROR);
- if(sm->msg == SN_SCTP_ASCONF) {
+ return ((sm->msg == SN_SCTP_INIT) ? SN_REPLY_ABORT : SN_REPLY_ERROR);
+ if (sm->msg == SN_SCTP_ASCONF) {
if (AddSctpAssocLocal(la, assoc, sm->ip_hdr->ip_dst)) /* DB clash */
- return(SN_REPLY_ERROR);
+ return (SN_REPLY_ERROR);
assoc->TableRegister |= SN_WAIT_TOLOCAL; /* wait for tolocal ack */
}
break;
case SN_TO_LOCAL:
assoc->l_addr = FindSctpRedirectAddress(la, sm);
- assoc->a_addr = sm->ip_hdr->ip_dst;
+ assoc->a_addr = sm->ip_hdr->ip_dst;
assoc->l_port = sm->sctp_hdr->dest_port;
assoc->g_port = sm->sctp_hdr->src_port;
- if(sm->msg == SN_SCTP_INIT)
+ if (sm->msg == SN_SCTP_INIT)
assoc->l_vtag = sm->sctpchnk.Init->initiate_tag;
if (AddSctpAssocLocal(la, assoc, sm->ip_hdr->ip_src)) /* DB clash */
- return((sm->msg == SN_SCTP_INIT) ? SN_REPLY_ABORT : SN_REPLY_ERROR);
- if(sm->msg == SN_SCTP_ASCONF) {
+ return ((sm->msg == SN_SCTP_INIT) ? SN_REPLY_ABORT : SN_REPLY_ERROR);
+ if (sm->msg == SN_SCTP_ASCONF) {
if (AddSctpAssocGlobal(la, assoc)) /* DB clash */ //**** need to add src address
- return(SN_REPLY_ERROR);
+ return (SN_REPLY_ERROR);
assoc->TableRegister |= SN_WAIT_TOGLOBAL; /* wait for toglobal ack */
}
break;
}
- assoc->state = (sm->msg == SN_SCTP_INIT) ? SN_INi : SN_INa;
- assoc->exp = SN_I_T(la);
- sctp_AddTimeOut(la,assoc);
- return(SN_NAT_PKT);
+ assoc->state = (sm->msg == SN_SCTP_INIT) ? SN_INi : SN_INa;
+ assoc->exp = SN_I_T(la);
+ sctp_AddTimeOut(la,assoc);
+ return (SN_NAT_PKT);
default: /* Any other type of SCTP message is not valid in Idle */
- return(SN_DROP_PKT);
+ return (SN_DROP_PKT);
}
-return(SN_DROP_PKT);/* shouldn't get here very bad: log, drop and hope for the best */
+ return (SN_DROP_PKT);/* shouldn't get here very bad: log, drop and hope for the best */
}
/** @ingroup state_machine
@@ -1795,30 +1796,30 @@ return(SN_DROP_PKT);/* shouldn't get here very bad: log, drop and hope for the b
*
* Only an INIT-ACK, resent INIT, or an ABORT SCTP packet are valid in this
* state, all other packets are dropped.
- *
+ *
* @param la Pointer to the relevant libalias instance
- * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
+ * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
* @param sm Pointer to sctp message information
* @param assoc Pointer to the association this SCTP Message belongs to
- *
- * @return SN_NAT_PKT | SN_DROP_PKT | SN_REPLY_ABORT
+ *
+ * @return SN_NAT_PKT | SN_DROP_PKT | SN_REPLY_ABORT
*/
static int
INi_process(struct libalias *la, int direction, struct sctp_nat_assoc *assoc, struct sctp_nat_msg *sm)
{
- switch(sm->msg) {
+ switch (sm->msg) {
case SN_SCTP_INIT: /* a packet containing a retransmitted INIT chunk */
sctp_ResetTimeOut(la, assoc, SN_I_T(la));
- return(SN_NAT_PKT);
+ return (SN_NAT_PKT);
case SN_SCTP_INITACK: /* a packet containing an INIT-ACK chunk */
- switch(direction){
+ switch (direction) {
case SN_TO_LOCAL:
if (assoc->num_Gaddr) /*If tracking global addresses for this association */
AddGlobalIPAddresses(sm, assoc, direction);
assoc->l_vtag = sm->sctpchnk.Init->initiate_tag;
if (AddSctpAssocLocal(la, assoc, sm->ip_hdr->ip_src)) { /* DB clash */
assoc->state = SN_RM;/* Mark for removal*/
- return(SN_SEND_ABORT);
+ return (SN_SEND_ABORT);
}
break;
case SN_TO_GLOBAL:
@@ -1826,97 +1827,97 @@ INi_process(struct libalias *la, int direction, struct sctp_nat_assoc *assoc, st
assoc->g_vtag = sm->sctpchnk.Init->initiate_tag;
if (AddSctpAssocGlobal(la, assoc)) { /* DB clash */
assoc->state = SN_RM;/* Mark for removal*/
- return(SN_SEND_ABORT);
+ return (SN_SEND_ABORT);
}
break;
}
assoc->state = SN_UP;/* association established for NAT */
sctp_ResetTimeOut(la,assoc, SN_U_T(la));
- return(SN_NAT_PKT);
+ return (SN_NAT_PKT);
case SN_SCTP_ABORT: /* a packet containing an ABORT chunk */
assoc->state = SN_RM;/* Mark for removal*/
- return(SN_NAT_PKT);
+ return (SN_NAT_PKT);
default:
- return(SN_DROP_PKT);
+ return (SN_DROP_PKT);
}
- return(SN_DROP_PKT);/* shouldn't get here very bad: log, drop and hope for the best */
+ return (SN_DROP_PKT);/* shouldn't get here very bad: log, drop and hope for the best */
}
/** @ingroup state_machine
* @brief Process SCTP message while waiting for an AddIp-ACK message
- *
+ *
* Only an AddIP-ACK, resent AddIP, or an ABORT message are valid, all other
* SCTP packets are dropped
*
* @param la Pointer to the relevant libalias instance
- * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
+ * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
* @param sm Pointer to sctp message information
* @param assoc Pointer to the association this SCTP Message belongs to
- *
- * @return SN_NAT_PKT | SN_DROP_PKT
+ *
+ * @return SN_NAT_PKT | SN_DROP_PKT
*/
static int
INa_process(struct libalias *la, int direction,struct sctp_nat_assoc *assoc, struct sctp_nat_msg *sm)
{
- switch(sm->msg) {
+ switch (sm->msg) {
case SN_SCTP_ASCONF: /* a packet containing an ASCONF chunk*/
sctp_ResetTimeOut(la,assoc, SN_I_T(la));
- return(SN_NAT_PKT);
+ return (SN_NAT_PKT);
case SN_SCTP_ASCONFACK: /* a packet containing an ASCONF chunk with a ADDIP-ACK */
- switch(direction){
+ switch (direction) {
case SN_TO_LOCAL:
if (!(assoc->TableRegister & SN_WAIT_TOLOCAL)) /* wrong direction */
- return(SN_DROP_PKT);
+ return (SN_DROP_PKT);
break;
case SN_TO_GLOBAL:
if (!(assoc->TableRegister & SN_WAIT_TOGLOBAL)) /* wrong direction */
- return(SN_DROP_PKT);
+ return (SN_DROP_PKT);
}
if (IsASCONFack(la,sm,direction)) {
assoc->TableRegister &= SN_BOTH_TBL; /* remove wait flags */
assoc->state = SN_UP; /* association established for NAT */
sctp_ResetTimeOut(la,assoc, SN_U_T(la));
- return(SN_NAT_PKT);
+ return (SN_NAT_PKT);
} else {
assoc->state = SN_RM;/* Mark for removal*/
- return(SN_NAT_PKT);
+ return (SN_NAT_PKT);
}
case SN_SCTP_ABORT: /* a packet containing an ABORT chunk */
assoc->state = SN_RM;/* Mark for removal*/
- return(SN_NAT_PKT);
+ return (SN_NAT_PKT);
default:
- return(SN_DROP_PKT);
+ return (SN_DROP_PKT);
}
- return(SN_DROP_PKT);/* shouldn't get here very bad: log, drop and hope for the best */
+ return (SN_DROP_PKT);/* shouldn't get here very bad: log, drop and hope for the best */
}
/** @ingroup state_machine
* @brief Process SCTP messages while association is UP redirecting packets
- *
+ *
* While in the SN_UP state, all packets for the particular association
* are passed. Only a SHUT-ACK or an ABORT will cause a change of state.
*
* @param la Pointer to the relevant libalias instance
- * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
+ * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
* @param sm Pointer to sctp message information
* @param assoc Pointer to the association this SCTP Message belongs to
- *
- * @return SN_NAT_PKT | SN_DROP_PKT
+ *
+ * @return SN_NAT_PKT | SN_DROP_PKT
*/
static int
UP_process(struct libalias *la, int direction, struct sctp_nat_assoc *assoc, struct sctp_nat_msg *sm)
{
- switch(sm->msg) {
+ switch (sm->msg) {
case SN_SCTP_SHUTACK: /* a packet containing a SHUTDOWN-ACK chunk */
assoc->state = SN_CL;
sctp_ResetTimeOut(la,assoc, SN_C_T(la));
- return(SN_NAT_PKT);
+ return (SN_NAT_PKT);
case SN_SCTP_ABORT: /* a packet containing an ABORT chunk */
assoc->state = SN_RM;/* Mark for removal*/
- return(SN_NAT_PKT);
+ return (SN_NAT_PKT);
case SN_SCTP_ASCONF: /* a packet containing an ASCONF chunk*/
if ((direction == SN_TO_LOCAL) && assoc->num_Gaddr) /*If tracking global addresses for this association & from global side */
- switch(IsADDorDEL(la,sm,direction)) {
+ switch (IsADDorDEL(la,sm,direction)) {
case SCTP_ADD_IP_ADDRESS:
AddGlobalIPAddresses(sm, assoc, direction);
break;
@@ -1926,9 +1927,9 @@ UP_process(struct libalias *la, int direction, struct sctp_nat_assoc *assoc, str
} /* fall through to default */
default:
sctp_ResetTimeOut(la,assoc, SN_U_T(la));
- return(SN_NAT_PKT); /* forward packet */
+ return (SN_NAT_PKT); /* forward packet */
}
- return(SN_DROP_PKT);/* shouldn't get here very bad: log, drop and hope for the best */
+ return (SN_DROP_PKT);/* shouldn't get here very bad: log, drop and hope for the best */
}
/** @ingroup state_machine
@@ -1940,34 +1941,34 @@ UP_process(struct libalias *la, int direction, struct sctp_nat_assoc *assoc, str
* ABORT packets are permitted in this state. All other packets are dropped.
*
* @param la Pointer to the relevant libalias instance
- * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
+ * @param direction SN_TO_LOCAL | SN_TO_GLOBAL
* @param sm Pointer to sctp message information
* @param assoc Pointer to the association this SCTP Message belongs to
- *
- * @return SN_NAT_PKT | SN_DROP_PKT
+ *
+ * @return SN_NAT_PKT | SN_DROP_PKT
*/
static int
CL_process(struct libalias *la, int direction,struct sctp_nat_assoc *assoc, struct sctp_nat_msg *sm)
{
- switch(sm->msg) {
+ switch (sm->msg) {
case SN_SCTP_SHUTCOMP: /* a packet containing a SHUTDOWN-COMPLETE chunk */
assoc->state = SN_CL; /* Stay in Close state until timeout */
if (sysctl_holddown_timer > 0)
sctp_ResetTimeOut(la, assoc, SN_X_T(la));/* allow to stay open for Tbit packets*/
else
assoc->state = SN_RM;/* Mark for removal*/
- return(SN_NAT_PKT);
+ return (SN_NAT_PKT);
case SN_SCTP_SHUTACK: /* a packet containing a SHUTDOWN-ACK chunk */
assoc->state = SN_CL; /* Stay in Close state until timeout */
sctp_ResetTimeOut(la, assoc, SN_C_T(la));
- return(SN_NAT_PKT);
+ return (SN_NAT_PKT);
case SN_SCTP_ABORT: /* a packet containing an ABORT chunk */
assoc->state = SN_RM;/* Mark for removal*/
- return(SN_NAT_PKT);
+ return (SN_NAT_PKT);
default:
- return(SN_DROP_PKT);
+ return (SN_DROP_PKT);
}
- return(SN_DROP_PKT);/* shouldn't get here very bad: log, drop and hope for the best */
+ return (SN_DROP_PKT);/* shouldn't get here very bad: log, drop and hope for the best */
}
/* ----------------------------------------------------------------------
@@ -1981,7 +1982,7 @@ CL_process(struct libalias *la, int direction,struct sctp_nat_assoc *assoc, stru
*/
/** @ingroup Hash
* @brief Find the SCTP association given the local address, port and vtag
- *
+ *
* Searches the local look-up table for the association entry matching the
* provided local <address:ports:vtag> tuple
*
@@ -1991,7 +1992,7 @@ CL_process(struct libalias *la, int direction,struct sctp_nat_assoc *assoc, stru
* @param l_vtag local Vtag
* @param l_port local Port
* @param g_port global Port
- *
+ *
* @return pointer to association or NULL
*/
static struct sctp_nat_assoc*
@@ -2000,7 +2001,7 @@ FindSctpLocal(struct libalias *la, struct in_addr l_addr, struct in_addr g_addr,
u_int i;
struct sctp_nat_assoc *assoc = NULL;
struct sctp_GlobalAddress *G_Addr = NULL;
-
+
if (l_vtag != 0) { /* an init packet, vtag==0 */
i = SN_TABLE_HASH(l_vtag, l_port, la->sctpNatTableSize);
LIST_FOREACH(assoc, &la->sctpTableLocal[i], list_L) {
@@ -2008,27 +2009,27 @@ FindSctpLocal(struct libalias *la, struct in_addr l_addr, struct in_addr g_addr,
&& (assoc->l_addr.s_addr == l_addr.s_addr)) {
if (assoc->num_Gaddr) {
LIST_FOREACH(G_Addr, &(assoc->Gaddr), list_Gaddr) {
- if(G_Addr->g_addr.s_addr == g_addr.s_addr)
- return(assoc);
+ if (G_Addr->g_addr.s_addr == g_addr.s_addr)
+ return (assoc);
}
} else {
- return(assoc);
+ return (assoc);
}
}
}
}
- return(NULL);
+ return (NULL);
}
/** @ingroup Hash
* @brief Check for Global Clash
- *
+ *
* Searches the global look-up table for the association entry matching the
* provided global <(addresses):ports:vtag> tuple
*
* @param la Pointer to the relevant libalias instance
* @param Cassoc association being checked for a clash
- *
+ *
* @return pointer to association or NULL
*/
static struct sctp_nat_assoc*
@@ -2038,7 +2039,7 @@ FindSctpGlobalClash(struct libalias *la, struct sctp_nat_assoc *Cassoc)
struct sctp_nat_assoc *assoc = NULL;
struct sctp_GlobalAddress *G_Addr = NULL;
struct sctp_GlobalAddress *G_AddrC = NULL;
-
+
if (Cassoc->g_vtag != 0) { /* an init packet, vtag==0 */
i = SN_TABLE_HASH(Cassoc->g_vtag, Cassoc->g_port, la->sctpNatTableSize);
LIST_FOREACH(assoc, &la->sctpTableGlobal[i], list_G) {
@@ -2046,22 +2047,22 @@ FindSctpGlobalClash(struct libalias *la, struct sctp_nat_assoc *Cassoc)
if (assoc->num_Gaddr) {
LIST_FOREACH(G_AddrC, &(Cassoc->Gaddr), list_Gaddr) {
LIST_FOREACH(G_Addr, &(assoc->Gaddr), list_Gaddr) {
- if(G_Addr->g_addr.s_addr == G_AddrC->g_addr.s_addr)
- return(assoc);
+ if (G_Addr->g_addr.s_addr == G_AddrC->g_addr.s_addr)
+ return (assoc);
}
}
} else {
- return(assoc);
+ return (assoc);
}
}
}
}
- return(NULL);
+ return (NULL);
}
/** @ingroup Hash
* @brief Find the SCTP association given the global port and vtag
- *
+ *
* Searches the global look-up table for the association entry matching the
* provided global <address:ports:vtag> tuple
*
@@ -2075,7 +2076,7 @@ FindSctpGlobalClash(struct libalias *la, struct sctp_nat_assoc *Cassoc)
* @param g_vtag global vtag
* @param g_port global port
* @param l_port local port
- *
+ *
* @return pointer to association or NULL
*/
static struct sctp_nat_assoc*
@@ -2084,7 +2085,7 @@ FindSctpGlobal(struct libalias *la, struct in_addr g_addr, uint32_t g_vtag, uint
u_int i;
struct sctp_nat_assoc *assoc = NULL;
struct sctp_GlobalAddress *G_Addr = NULL;
-
+
*partial_match = 0;
if (g_vtag != 0) { /* an init packet, vtag==0 */
i = SN_TABLE_HASH(g_vtag, g_port, la->sctpNatTableSize);
@@ -2093,21 +2094,21 @@ FindSctpGlobal(struct libalias *la, struct in_addr g_addr, uint32_t g_vtag, uint
*partial_match = 1;
if (assoc->num_Gaddr) {
LIST_FOREACH(G_Addr, &(assoc->Gaddr), list_Gaddr) {
- if(G_Addr->g_addr.s_addr == g_addr.s_addr)
- return(assoc);
+ if (G_Addr->g_addr.s_addr == g_addr.s_addr)
+ return (assoc);
}
} else {
- return(assoc);
+ return (assoc);
}
}
}
}
- return(NULL);
+ return (NULL);
}
/** @ingroup Hash
* @brief Find the SCTP association for a T-Flag message (given the global port and local vtag)
- *
+ *
* Searches the local look-up table for a unique association entry matching the
* provided global port and local vtag information
*
@@ -2116,40 +2117,40 @@ FindSctpGlobal(struct libalias *la, struct in_addr g_addr, uint32_t g_vtag, uint
* @param l_vtag local Vtag
* @param g_port global Port
* @param l_port local Port
- *
+ *
* @return pointer to association or NULL
*/
static struct sctp_nat_assoc*
-FindSctpLocalT(struct libalias *la, struct in_addr g_addr, uint32_t l_vtag, uint16_t g_port, uint16_t l_port)
+FindSctpLocalT(struct libalias *la, struct in_addr g_addr, uint32_t l_vtag, uint16_t g_port, uint16_t l_port)
{
u_int i;
struct sctp_nat_assoc *assoc = NULL, *lastmatch = NULL;
struct sctp_GlobalAddress *G_Addr = NULL;
int cnt = 0;
-
+
if (l_vtag != 0) { /* an init packet, vtag==0 */
i = SN_TABLE_HASH(l_vtag, g_port, la->sctpNatTableSize);
LIST_FOREACH(assoc, &la->sctpTableGlobal[i], list_G) {
if ((assoc->g_vtag == l_vtag) && (assoc->g_port == g_port) && (assoc->l_port == l_port)) {
if (assoc->num_Gaddr) {
LIST_FOREACH(G_Addr, &(assoc->Gaddr), list_Gaddr) {
- if(G_Addr->g_addr.s_addr == G_Addr->g_addr.s_addr)
- return(assoc); /* full match */
+ if (G_Addr->g_addr.s_addr == g_addr.s_addr)
+ return (assoc); /* full match */
}
} else {
- if (++cnt > 1) return(NULL);
+ if (++cnt > 1) return (NULL);
lastmatch = assoc;
}
}
}
}
/* If there is more than one match we do not know which local address to send to */
- return( cnt ? lastmatch : NULL );
+ return (cnt ? lastmatch : NULL);
}
/** @ingroup Hash
* @brief Find the SCTP association for a T-Flag message (given the local port and global vtag)
- *
+ *
* Searches the global look-up table for a unique association entry matching the
* provided local port and global vtag information
*
@@ -2158,7 +2159,7 @@ FindSctpLocalT(struct libalias *la, struct in_addr g_addr, uint32_t l_vtag, uin
* @param g_vtag global vtag
* @param l_port local port
* @param g_port global port
- *
+ *
* @return pointer to association or NULL
*/
static struct sctp_nat_assoc*
@@ -2167,28 +2168,28 @@ FindSctpGlobalT(struct libalias *la, struct in_addr g_addr, uint32_t g_vtag, uin
u_int i;
struct sctp_nat_assoc *assoc = NULL;
struct sctp_GlobalAddress *G_Addr = NULL;
-
+
if (g_vtag != 0) { /* an init packet, vtag==0 */
i = SN_TABLE_HASH(g_vtag, l_port, la->sctpNatTableSize);
LIST_FOREACH(assoc, &la->sctpTableLocal[i], list_L) {
if ((assoc->l_vtag == g_vtag) && (assoc->l_port == l_port) && (assoc->g_port == g_port)) {
if (assoc->num_Gaddr) {
LIST_FOREACH(G_Addr, &(assoc->Gaddr), list_Gaddr) {
- if(G_Addr->g_addr.s_addr == g_addr.s_addr)
- return(assoc);
+ if (G_Addr->g_addr.s_addr == g_addr.s_addr)
+ return (assoc);
}
} else {
- return(assoc);
+ return (assoc);
}
}
}
}
- return(NULL);
+ return (NULL);
}
/** @ingroup Hash
* @brief Add the sctp association information to the local look up table
- *
+ *
* Searches the local look-up table for an existing association with the same
* details. If a match exists and is ONLY in the local look-up table then this
* is a repeated INIT packet, we need to remove this association from the
@@ -2199,7 +2200,7 @@ FindSctpGlobalT(struct libalias *la, struct in_addr g_addr, uint32_t g_vtag, uin
* @param la Pointer to the relevant libalias instance
* @param assoc pointer to sctp association
* @param g_addr global address
- *
+ *
* @return SN_ADD_OK | SN_ADD_CLASH
*/
static int
@@ -2225,9 +2226,9 @@ AddSctpAssocLocal(struct libalias *la, struct sctp_nat_assoc *assoc, struct in_a
freeGlobalAddressList(found);
sn_free(found);
} else
- return(SN_ADD_CLASH);
+ return (SN_ADD_CLASH);
}
-
+
LIST_INSERT_HEAD(&la->sctpTableLocal[SN_TABLE_HASH(assoc->l_vtag, assoc->l_port, la->sctpNatTableSize)],
assoc, list_L);
assoc->TableRegister |= SN_LOCAL_TBL;
@@ -2241,7 +2242,7 @@ AddSctpAssocLocal(struct libalias *la, struct sctp_nat_assoc *assoc, struct in_a
SN_LOG(SN_LOG_INFO, logsctpassoc(assoc, "^"));
}
- return(SN_ADD_OK);
+ return (SN_ADD_OK);
}
/** @ingroup Hash
@@ -2274,9 +2275,9 @@ AddSctpAssocGlobal(struct libalias *la, struct sctp_nat_assoc *assoc)
freeGlobalAddressList(found);
sn_free(found);
} else
- return(SN_ADD_CLASH);
+ return (SN_ADD_CLASH);
}
-
+
LIST_INSERT_HEAD(&la->sctpTableGlobal[SN_TABLE_HASH(assoc->g_vtag, assoc->g_port, la->sctpNatTableSize)],
assoc, list_G);
assoc->TableRegister |= SN_GLOBAL_TBL;
@@ -2290,12 +2291,12 @@ AddSctpAssocGlobal(struct libalias *la, struct sctp_nat_assoc *assoc)
SN_LOG(SN_LOG_INFO, logsctpassoc(assoc, "^"));
}
- return(SN_ADD_OK);
+ return (SN_ADD_OK);
}
/** @ingroup Hash
* @brief Remove the sctp association information from the look up table
- *
+ *
* For each of the two (local/global) look-up tables, remove the association
* from that table IF it has been registered in that table.
*
@@ -2327,7 +2328,7 @@ RmSctpAssoc(struct libalias *la, struct sctp_nat_assoc *assoc)
la->sctpLinkCount--; //decrement link count
LIST_REMOVE(assoc, list_L);
}
-
+
if (assoc->TableRegister & SN_GLOBAL_TBL) {
assoc->TableRegister ^= SN_GLOBAL_TBL;
la->sctpLinkCount--; //decrement link count
@@ -2339,20 +2340,20 @@ RmSctpAssoc(struct libalias *la, struct sctp_nat_assoc *assoc)
SctpShowAliasStats(la);
}
-/**
+/**
* @ingroup Hash
* @brief free the Global Address List memory
- *
+ *
* freeGlobalAddressList deletes all global IP addresses in an associations
* global IP address list.
*
- * @param assoc
+ * @param assoc
*/
static void freeGlobalAddressList(struct sctp_nat_assoc *assoc)
{
struct sctp_GlobalAddress *gaddr1=NULL,*gaddr2=NULL;
/*free global address list*/
- gaddr1 = LIST_FIRST(&(assoc->Gaddr));
+ gaddr1 = LIST_FIRST(&(assoc->Gaddr));
while (gaddr1 != NULL) {
gaddr2 = LIST_NEXT(gaddr1, list_Gaddr);
sn_free(gaddr1);
@@ -2383,8 +2384,8 @@ static void freeGlobalAddressList(struct sctp_nat_assoc *assoc)
* Determine the location in the queue to add the timeout and insert the
* association into the list at that queue position
*
- * @param la
- * @param assoc
+ * @param la
+ * @param assoc
*/
static void
sctp_AddTimeOut(struct libalias *la, struct sctp_nat_assoc *assoc)
@@ -2440,7 +2441,7 @@ sctp_ResetTimeOut(struct libalias *la, struct sctp_nat_assoc *assoc, int newexp)
/** @ingroup Timer
* @brief Check timer Q against current time
- *
+ *
* Loop through each entry in the timer queue since the last time we processed
* the timer queue until now (the current time). For each association in the
* event list, we remove it from that position in the timer queue and check if
@@ -2451,22 +2452,22 @@ sctp_ResetTimeOut(struct libalias *la, struct sctp_nat_assoc *assoc, int newexp)
*
* If the timer hasn't really expired we place the association into its new
* correct position in the timer queue.
- *
+ *
* @param la Pointer to the relevant libalias instance
*/
void
sctp_CheckTimers(struct libalias *la)
{
struct sctp_nat_assoc *assoc;
-
+
LIBALIAS_LOCK_ASSERT(la);
while(la->timeStamp >= la->sctpNatTimer.loc_time) {
- while (!LIST_EMPTY(&la->sctpNatTimer.TimerQ[la->sctpNatTimer.cur_loc])) {
+ while (!LIST_EMPTY(&la->sctpNatTimer.TimerQ[la->sctpNatTimer.cur_loc])) {
assoc = LIST_FIRST(&la->sctpNatTimer.TimerQ[la->sctpNatTimer.cur_loc]);
//SLIST_REMOVE_HEAD(&la->sctpNatTimer.TimerQ[la->sctpNatTimer.cur_loc], timer_Q);
LIST_REMOVE(assoc, timer_Q);
if (la->timeStamp >= assoc->exp) { /* state expired */
- SN_LOG(((assoc->state == SN_CL)?(SN_LOG_DEBUG):(SN_LOG_INFO)),
+ SN_LOG(((assoc->state == SN_CL) ? (SN_LOG_DEBUG) : (SN_LOG_INFO)),
logsctperror("Timer Expired", assoc->g_vtag, assoc->state, SN_TO_NODIR));
RmSctpAssoc(la, assoc);
freeGlobalAddressList(assoc);
@@ -2483,7 +2484,7 @@ sctp_CheckTimers(struct libalias *la)
}
/* ----------------------------------------------------------------------
- * LOGGING CODE
+ * LOGGING CODE
* ----------------------------------------------------------------------
*/
/** @addtogroup Logging
@@ -2494,7 +2495,7 @@ sctp_CheckTimers(struct libalias *la)
*/
/** @ingroup Logging
* @brief Log sctp nat errors
- *
+ *
* @param errormsg Error message to be logged
* @param vtag Current Vtag
* @param error Error number
@@ -2504,7 +2505,7 @@ static void
logsctperror(char* errormsg, uint32_t vtag, int error, int direction)
{
char dir;
- switch(direction) {
+ switch (direction) {
case SN_TO_LOCAL:
dir = 'L';
break;
@@ -2520,7 +2521,7 @@ logsctperror(char* errormsg, uint32_t vtag, int error, int direction)
/** @ingroup Logging
* @brief Log what the parser parsed
- *
+ *
* @param direction Direction of packet
* @param sm Pointer to sctp message information
*/
@@ -2528,7 +2529,7 @@ static void
logsctpparse(int direction, struct sctp_nat_msg *sm)
{
char *ploc, *pstate;
- switch(direction) {
+ switch (direction) {
case SN_TO_LOCAL:
ploc = "TO_LOCAL -";
break;
@@ -2538,7 +2539,7 @@ logsctpparse(int direction, struct sctp_nat_msg *sm)
default:
ploc = "";
}
- switch(sm->msg) {
+ switch (sm->msg) {
case SN_SCTP_INIT:
pstate = "Init";
break;
@@ -2572,7 +2573,7 @@ logsctpparse(int direction, struct sctp_nat_msg *sm)
/** @ingroup Logging
* @brief Log an SCTP association's details
- *
+ *
* @param assoc pointer to sctp association
* @param s Character that indicates the state of processing for this packet
*/
@@ -2582,7 +2583,7 @@ static void logsctpassoc(struct sctp_nat_assoc *assoc, char* s)
char *sp;
char addrbuf[INET_ADDRSTRLEN];
- switch(assoc->state) {
+ switch (assoc->state) {
case SN_ID:
sp = "ID ";
break;
@@ -2618,15 +2619,15 @@ static void logsctpassoc(struct sctp_nat_assoc *assoc, char* s)
}
/** @ingroup Logging
- * @brief Output Global table to log
- *
+ * @brief Output Global table to log
+ *
* @param la Pointer to the relevant libalias instance
*/
static void logSctpGlobal(struct libalias *la)
{
u_int i;
struct sctp_nat_assoc *assoc = NULL;
-
+
SctpAliasLog("G->\n");
for (i=0; i < la->sctpNatTableSize; i++) {
LIST_FOREACH(assoc, &la->sctpTableGlobal[i], list_G) {
@@ -2636,15 +2637,15 @@ static void logSctpGlobal(struct libalias *la)
}
/** @ingroup Logging
- * @brief Output Local table to log
- *
+ * @brief Output Local table to log
+ *
* @param la Pointer to the relevant libalias instance
*/
static void logSctpLocal(struct libalias *la)
{
u_int i;
struct sctp_nat_assoc *assoc = NULL;
-
+
SctpAliasLog("L->\n");
for (i=0; i < la->sctpNatTableSize; i++) {
LIST_FOREACH(assoc, &la->sctpTableLocal[i], list_L) {
@@ -2655,7 +2656,7 @@ static void logSctpLocal(struct libalias *la)
/** @ingroup Logging
* @brief Output timer queue to log
- *
+ *
* @param la Pointer to the relevant libalias instance
*/
static void logTimerQ(struct libalias *la)
@@ -2674,12 +2675,12 @@ static void logTimerQ(struct libalias *la)
}
}
-/** @ingroup Logging
+/** @ingroup Logging
* @brief Sctp NAT logging function
- *
+ *
* This function is based on a similar function in alias_db.c
*
- * @param str/stream logging descriptor
+ * @param str/stream logging descriptor
* @param format printf type string
*/
#ifdef _KERNEL
diff --git a/freebsd/sys/netinet/sctp_constants.h b/freebsd/sys/netinet/sctp_constants.h
index 94378799..018cd282 100644
--- a/freebsd/sys/netinet/sctp_constants.h
+++ b/freebsd/sys/netinet/sctp_constants.h
@@ -400,43 +400,34 @@ __FBSDID("$FreeBSD$");
#define SCTP_HOSTNAME_ADDRESS 0x000b
#define SCTP_SUPPORTED_ADDRTYPE 0x000c
-/* draft-ietf-stewart-tsvwg-strreset-xxx */
+/* RFC 6525 */
#define SCTP_STR_RESET_OUT_REQUEST 0x000d
#define SCTP_STR_RESET_IN_REQUEST 0x000e
#define SCTP_STR_RESET_TSN_REQUEST 0x000f
#define SCTP_STR_RESET_RESPONSE 0x0010
#define SCTP_STR_RESET_ADD_OUT_STREAMS 0x0011
-#define SCTP_STR_RESET_ADD_IN_STREAMS 0x0012
+#define SCTP_STR_RESET_ADD_IN_STREAMS 0x0012
#define SCTP_MAX_RESET_PARAMS 2
-#define SCTP_STREAM_RESET_TSN_DELTA 0x1000
+#define SCTP_STREAM_RESET_TSN_DELTA 0x1000
/*************0x4000 series*************/
/*************0x8000 series*************/
#define SCTP_ECN_CAPABLE 0x8000
-/* draft-ietf-tsvwg-auth-xxx */
+/* RFC 4895 */
#define SCTP_RANDOM 0x8002
#define SCTP_CHUNK_LIST 0x8003
#define SCTP_HMAC_LIST 0x8004
-/*
- * draft-ietf-tsvwg-addip-sctp-xx param=0x8008 len=0xNNNN Byte | Byte | Byte
- * | Byte Byte | Byte ...
- *
- * Where each byte is a chunk type extension supported. For example, to support
- * all chunks one would have (in hex):
- *
- * 80 01 00 09 C0 C1 80 81 82 00 00 00
- *
- * Has the parameter. C0 = PR-SCTP (RFC3758) C1, 80 = ASCONF (addip draft) 81
- * = Packet Drop 82 = Stream Reset 83 = Authentication
- */
-#define SCTP_SUPPORTED_CHUNK_EXT 0x8008
+/* RFC 4820 */
+#define SCTP_PAD 0x8005
+/* RFC 5061 */
+#define SCTP_SUPPORTED_CHUNK_EXT 0x8008
/*************0xC000 series*************/
#define SCTP_PRSCTP_SUPPORTED 0xc000
-/* draft-ietf-tsvwg-addip-sctp */
+/* RFC 5061 */
#define SCTP_ADD_IP_ADDRESS 0xc001
#define SCTP_DEL_IP_ADDRESS 0xc002
#define SCTP_ERROR_CAUSE_IND 0xc003
@@ -444,8 +435,8 @@ __FBSDID("$FreeBSD$");
#define SCTP_SUCCESS_REPORT 0xc005
#define SCTP_ULP_ADAPTATION 0xc006
/* behave-nat-draft */
-#define SCTP_HAS_NAT_SUPPORT 0xc007
-#define SCTP_NAT_VTAGS 0xc008
+#define SCTP_HAS_NAT_SUPPORT 0xc007
+#define SCTP_NAT_VTAGS 0xc008
/* bits for TOS field */
#define SCTP_ECT0_BIT 0x02
@@ -624,7 +615,7 @@ __FBSDID("$FreeBSD$");
#define SCTP_RTO_INITIAL (3000) /* 3 sec in ms */
-#define SCTP_INP_KILL_TIMEOUT 20/* number of ms to retry kill of inpcb */
+#define SCTP_INP_KILL_TIMEOUT 20 /* number of ms to retry kill of inpcb */
#define SCTP_ASOC_KILL_TIMEOUT 10 /* number of ms to retry kill of inpcb */
#define SCTP_DEF_MAX_INIT 8
diff --git a/freebsd/sys/netinet/sctp_crc32.c b/freebsd/sys/netinet/sctp_crc32.c
index 82e361e1..e22abeb6 100644
--- a/freebsd/sys/netinet/sctp_crc32.c
+++ b/freebsd/sys/netinet/sctp_crc32.c
@@ -37,30 +37,36 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <rtems/bsd/local/opt_sctp.h>
+
+#ifdef SCTP
#include <netinet/sctp_os.h>
#include <netinet/sctp.h>
#include <netinet/sctp_crc32.h>
#include <netinet/sctp_pcb.h>
+#else
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/mbuf.h>
-
-#if !defined(SCTP_WITH_NO_CSUM)
+#include <netinet/sctp_crc32.h>
+#endif
static uint32_t
sctp_finalize_crc32c(uint32_t crc32c)
{
uint32_t result;
-
#if BYTE_ORDER == BIG_ENDIAN
uint8_t byte0, byte1, byte2, byte3;
-
#endif
+
/* Complement the result */
result = ~crc32c;
#if BYTE_ORDER == BIG_ENDIAN
/*
- * For BIG-ENDIAN.. aka Motorola byte order the result is in
- * little-endian form. So we must manually swap the bytes. Then we
- * can call htonl() which does nothing...
+ * For BIG-ENDIAN platforms the result is in little-endian form. So
+ * we must swap the bytes to return the result in network byte
+ * order.
*/
byte0 = result & 0x000000ff;
byte1 = (result >> 8) & 0x000000ff;
@@ -69,65 +75,57 @@ sctp_finalize_crc32c(uint32_t crc32c)
crc32c = ((byte0 << 24) | (byte1 << 16) | (byte2 << 8) | byte3);
#else
/*
- * For INTEL platforms the result comes out in network order. No
- * htonl is required or the swap above. So we optimize out both the
- * htonl and the manual swap above.
+ * For LITTLE ENDIAN platforms the result is in already in network
+ * byte order.
*/
crc32c = result;
#endif
return (crc32c);
}
+/*
+ * Compute the SCTP checksum in network byte order for a given mbuf chain m
+ * which contains an SCTP packet starting at offset.
+ * Since this function is also called by ipfw, don't assume that
+ * it is compiled on a kernel with SCTP support.
+ */
uint32_t
sctp_calculate_cksum(struct mbuf *m, uint32_t offset)
{
- /*
- * given a mbuf chain with a packetheader offset by 'offset'
- * pointing at a sctphdr (with csum set to 0) go through the chain
- * of SCTP_BUF_NEXT()'s and calculate the SCTP checksum. This also
- * has a side bonus as it will calculate the total length of the
- * mbuf chain. Note: if offset is greater than the total mbuf
- * length, checksum=1, pktlen=0 is returned (ie. no real error code)
- */
uint32_t base = 0xffffffff;
- struct mbuf *at;
- at = m;
- /* find the correct mbuf and offset into mbuf */
- while ((at != NULL) && (offset > (uint32_t)SCTP_BUF_LEN(at))) {
- offset -= SCTP_BUF_LEN(at); /* update remaining offset
- * left */
- at = SCTP_BUF_NEXT(at);
- }
- while (at != NULL) {
- if ((SCTP_BUF_LEN(at) - offset) > 0) {
- base = calculate_crc32c(base,
- (unsigned char *)(SCTP_BUF_AT(at, offset)),
- (unsigned int)(SCTP_BUF_LEN(at) - offset));
- }
- if (offset) {
- /* we only offset once into the first mbuf */
- if (offset < (uint32_t)SCTP_BUF_LEN(at))
- offset = 0;
- else
- offset -= SCTP_BUF_LEN(at);
+ while (offset > 0) {
+ KASSERT(m != NULL, ("sctp_calculate_cksum, offset > length of mbuf chain"));
+ if (offset < (uint32_t)m->m_len) {
+ break;
}
- at = SCTP_BUF_NEXT(at);
+ offset -= m->m_len;
+ m = m->m_next;
+ }
+ if (offset > 0) {
+ base = calculate_crc32c(base,
+ (unsigned char *)(m->m_data + offset),
+ (unsigned int)(m->m_len - offset));
+ m = m->m_next;
+ }
+ while (m != NULL) {
+ base = calculate_crc32c(base,
+ (unsigned char *)m->m_data,
+ (unsigned int)m->m_len);
+ m = m->m_next;
}
base = sctp_finalize_crc32c(base);
return (base);
}
-#endif /* !defined(SCTP_WITH_NO_CSUM) */
-
+#ifdef SCTP
+/*
+ * Compute and insert the SCTP checksum in network byte order for a given
+ * mbuf chain m which contains an SCTP packet starting at offset.
+ */
void
sctp_delayed_cksum(struct mbuf *m, uint32_t offset)
{
-#if defined(SCTP_WITH_NO_CSUM)
-#ifdef INVARIANTS
- panic("sctp_delayed_cksum() called when using no SCTP CRC.");
-#endif
-#else
uint32_t checksum;
checksum = sctp_calculate_cksum(m, offset);
@@ -136,15 +134,15 @@ sctp_delayed_cksum(struct mbuf *m, uint32_t offset)
offset += offsetof(struct sctphdr, checksum);
if (offset + sizeof(uint32_t) > (uint32_t)(m->m_len)) {
- SCTP_PRINTF("sctp_delayed_cksum(): m->len: %d, off: %d.\n",
- (uint32_t)m->m_len, offset);
- /*
- * XXX this shouldn't happen, but if it does, the correct
- * behavior may be to insert the checksum in the appropriate
- * next mbuf in the chain.
- */
+#ifdef INVARIANTS
+ panic("sctp_delayed_cksum(): m->m_len: %d, offset: %u.",
+ m->m_len, offset);
+#else
+ SCTP_PRINTF("sctp_delayed_cksum(): m->m_len: %d, offset: %u.\n",
+ m->m_len, offset);
+#endif
return;
}
*(uint32_t *)(m->m_data + offset) = checksum;
-#endif
}
+#endif
diff --git a/freebsd/sys/netinet/sctp_crc32.h b/freebsd/sys/netinet/sctp_crc32.h
index adc38afc..4bdf8265 100644
--- a/freebsd/sys/netinet/sctp_crc32.h
+++ b/freebsd/sys/netinet/sctp_crc32.h
@@ -39,9 +39,9 @@ __FBSDID("$FreeBSD$");
#define _NETINET_SCTP_CRC32_H_
#if defined(_KERNEL)
-#if !defined(SCTP_WITH_NO_CSUM)
uint32_t sctp_calculate_cksum(struct mbuf *, uint32_t);
-#endif
+#ifdef SCTP
void sctp_delayed_cksum(struct mbuf *, uint32_t offset);
+#endif
#endif /* _KERNEL */
#endif /* __crc32c_h__ */
diff --git a/freebsd/sys/netinet/sctp_indata.c b/freebsd/sys/netinet/sctp_indata.c
index c4522a39..3325dd03 100644
--- a/freebsd/sys/netinet/sctp_indata.c
+++ b/freebsd/sys/netinet/sctp_indata.c
@@ -3366,7 +3366,8 @@ sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc,
}
}
}
- if (SCTP_TSN_GT(tp1->rec.data.tsn, asoc->this_sack_highest_gap)) {
+ if (SCTP_TSN_GT(tp1->rec.data.tsn, asoc->this_sack_highest_gap) &&
+ !(accum_moved && asoc->fast_retran_loss_recovery)) {
/* we are beyond the tsn in the sack */
break;
}
@@ -3390,8 +3391,10 @@ sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc,
* FR using this SACK.
*/
continue;
- } else if (tp1->whoTo && SCTP_TSN_GT(tp1->rec.data.tsn,
- tp1->whoTo->this_sack_highest_newack)) {
+ } else if (tp1->whoTo &&
+ SCTP_TSN_GT(tp1->rec.data.tsn,
+ tp1->whoTo->this_sack_highest_newack) &&
+ !(accum_moved && asoc->fast_retran_loss_recovery)) {
/*
* CMT: New acks were receieved for data sent to
* this dest. But no new acks were seen for data
@@ -3676,7 +3679,7 @@ sctp_strike_gap_ack_chunks(struct sctp_tcb *stcb, struct sctp_association *asoc,
tp1->whoTo->find_pseudo_cumack = 1;
tp1->whoTo->find_rtx_pseudo_cumack = 1;
}
- } else {/* CMT is OFF */
+ } else { /* CMT is OFF */
#ifdef SCTP_FR_TO_ALTERNATE
/* Can we find an alternate? */
@@ -4605,6 +4608,13 @@ hopeless_peer:
if (stcb->asoc.cc_functions.sctp_cwnd_prepare_net_for_sack) {
(*stcb->asoc.cc_functions.sctp_cwnd_prepare_net_for_sack) (stcb, net);
}
+ /*
+ * CMT: SFR algo (and HTNA) - this_sack_highest_newack has
+ * to be greater than the cumack. Also reset saw_newack to 0
+ * for all dests.
+ */
+ net->saw_newack = 0;
+ net->this_sack_highest_newack = last_tsn;
}
/* process the new consecutive TSN first */
TAILQ_FOREACH(tp1, &asoc->sent_queue, sctp_next) {
@@ -4732,16 +4742,6 @@ hopeless_peer:
if ((num_seg > 0) || (num_nr_seg > 0)) {
/*
- * CMT: SFR algo (and HTNA) - this_sack_highest_newack has
- * to be greater than the cumack. Also reset saw_newack to 0
- * for all dests.
- */
- TAILQ_FOREACH(net, &asoc->nets, sctp_next) {
- net->saw_newack = 0;
- net->this_sack_highest_newack = last_tsn;
- }
-
- /*
* thisSackHighestGap will increase while handling NEW
* segments this_sack_highest_newack will increase while
* handling NEWLY ACKED chunks. this_sack_lowest_newack is
diff --git a/freebsd/sys/netinet/sctp_input.c b/freebsd/sys/netinet/sctp_input.c
index 9c552ff5..9a74ef4b 100644
--- a/freebsd/sys/netinet/sctp_input.c
+++ b/freebsd/sys/netinet/sctp_input.c
@@ -3209,9 +3209,9 @@ sctp_handle_ecn_cwr(struct sctp_cwr_chunk *cp, struct sctp_tcb *stcb, struct sct
stcb->asoc.ecn_echo_cnt_onq--;
TAILQ_REMOVE(&stcb->asoc.control_send_queue, chk,
sctp_next);
+ stcb->asoc.ctrl_queue_cnt--;
sctp_m_freem(chk->data);
chk->data = NULL;
- stcb->asoc.ctrl_queue_cnt--;
sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED);
if (override == 0) {
break;
@@ -3643,26 +3643,23 @@ static void
sctp_clean_up_stream_reset(struct sctp_tcb *stcb)
{
struct sctp_association *asoc;
- struct sctp_tmit_chunk *chk = stcb->asoc.str_reset;
+ struct sctp_tmit_chunk *chk;
- if (stcb->asoc.str_reset == NULL) {
+ asoc = &stcb->asoc;
+ chk = asoc->str_reset;
+ if (chk == NULL) {
return;
}
- asoc = &stcb->asoc;
-
+ asoc->str_reset = NULL;
sctp_timer_stop(SCTP_TIMER_TYPE_STRRESET, stcb->sctp_ep, stcb,
chk->whoTo, SCTP_FROM_SCTP_INPUT + SCTP_LOC_28);
- TAILQ_REMOVE(&asoc->control_send_queue,
- chk,
- sctp_next);
+ TAILQ_REMOVE(&asoc->control_send_queue, chk, sctp_next);
+ asoc->ctrl_queue_cnt--;
if (chk->data) {
sctp_m_freem(chk->data);
chk->data = NULL;
}
- asoc->ctrl_queue_cnt--;
sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED);
- /* sa_ignore NO_NULL_CHK */
- stcb->asoc.str_reset = NULL;
}
@@ -5509,9 +5506,7 @@ void
sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, int length,
struct sockaddr *src, struct sockaddr *dst,
struct sctphdr *sh, struct sctp_chunkhdr *ch,
-#if !defined(SCTP_WITH_NO_CSUM)
uint8_t compute_crc,
-#endif
uint8_t ecn_bits,
uint8_t mflowtype, uint32_t mflowid, uint16_t fibnum,
uint32_t vrf_id, uint16_t port)
@@ -5531,7 +5526,6 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, int lengt
sctp_audit_log(0xE0, 1);
sctp_auditing(0, inp, stcb, net);
#endif
-#if !defined(SCTP_WITH_NO_CSUM)
if (compute_crc != 0) {
uint32_t check, calc_check;
@@ -5576,7 +5570,6 @@ sctp_common_input_processing(struct mbuf **mm, int iphlen, int offset, int lengt
goto out;
}
}
-#endif
/* Destination port of 0 is illegal, based on RFC4960. */
if (sh->dest_port == 0) {
SCTP_STAT_INCR(sctps_hdrops);
@@ -5894,9 +5887,7 @@ sctp_input_with_port(struct mbuf *i_pak, int off, uint16_t port)
struct sctphdr *sh;
struct sctp_chunkhdr *ch;
int length, offset;
-#if !defined(SCTP_WITH_NO_CSUM)
uint8_t compute_crc;
-#endif
uint32_t mflowid;
uint8_t mflowtype;
uint16_t fibnum;
@@ -5966,9 +5957,6 @@ sctp_input_with_port(struct mbuf *i_pak, int off, uint16_t port)
goto out;
}
ecn_bits = ip->ip_tos;
-#if defined(SCTP_WITH_NO_CSUM)
- SCTP_STAT_INCR(sctps_recvnocrc);
-#else
if (m->m_pkthdr.csum_flags & CSUM_SCTP_VALID) {
SCTP_STAT_INCR(sctps_recvhwcrc);
compute_crc = 0;
@@ -5976,14 +5964,11 @@ sctp_input_with_port(struct mbuf *i_pak, int off, uint16_t port)
SCTP_STAT_INCR(sctps_recvswcrc);
compute_crc = 1;
}
-#endif
sctp_common_input_processing(&m, iphlen, offset, length,
(struct sockaddr *)&src,
(struct sockaddr *)&dst,
sh, ch,
-#if !defined(SCTP_WITH_NO_CSUM)
compute_crc,
-#endif
ecn_bits,
mflowtype, mflowid, fibnum,
vrf_id, port);
diff --git a/freebsd/sys/netinet/sctp_input.h b/freebsd/sys/netinet/sctp_input.h
index ff0916e7..f393ad89 100644
--- a/freebsd/sys/netinet/sctp_input.h
+++ b/freebsd/sys/netinet/sctp_input.h
@@ -43,9 +43,7 @@ void
sctp_common_input_processing(struct mbuf **, int, int, int,
struct sockaddr *, struct sockaddr *,
struct sctphdr *, struct sctp_chunkhdr *,
-#if !defined(SCTP_WITH_NO_CSUM)
uint8_t,
-#endif
uint8_t,
uint8_t, uint32_t, uint16_t,
uint32_t, uint16_t);
diff --git a/freebsd/sys/netinet/sctp_output.c b/freebsd/sys/netinet/sctp_output.c
index bc54ee96..9dd2e0fa 100644
--- a/freebsd/sys/netinet/sctp_output.c
+++ b/freebsd/sys/netinet/sctp_output.c
@@ -4228,23 +4228,15 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp,
}
SCTP_ATTACH_CHAIN(o_pak, m, packet_length);
if (port) {
-#if defined(SCTP_WITH_NO_CSUM)
- SCTP_STAT_INCR(sctps_sendnocrc);
-#else
sctphdr->checksum = sctp_calculate_cksum(m, sizeof(struct ip) + sizeof(struct udphdr));
SCTP_STAT_INCR(sctps_sendswcrc);
-#endif
if (V_udp_cksum) {
SCTP_ENABLE_UDP_CSUM(o_pak);
}
} else {
-#if defined(SCTP_WITH_NO_CSUM)
- SCTP_STAT_INCR(sctps_sendnocrc);
-#else
m->m_pkthdr.csum_flags = CSUM_SCTP;
m->m_pkthdr.csum_data = offsetof(struct sctphdr, checksum);
SCTP_STAT_INCR(sctps_sendhwcrc);
-#endif
}
#ifdef SCTP_PACKET_LOGGING
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING)
@@ -4568,23 +4560,15 @@ sctp_lowlevel_chunk_output(struct sctp_inpcb *inp,
}
SCTP_ATTACH_CHAIN(o_pak, m, packet_length);
if (port) {
-#if defined(SCTP_WITH_NO_CSUM)
- SCTP_STAT_INCR(sctps_sendnocrc);
-#else
sctphdr->checksum = sctp_calculate_cksum(m, sizeof(struct ip6_hdr) + sizeof(struct udphdr));
SCTP_STAT_INCR(sctps_sendswcrc);
-#endif
if ((udp->uh_sum = in6_cksum(o_pak, IPPROTO_UDP, sizeof(struct ip6_hdr), packet_length - sizeof(struct ip6_hdr))) == 0) {
udp->uh_sum = 0xffff;
}
} else {
-#if defined(SCTP_WITH_NO_CSUM)
- SCTP_STAT_INCR(sctps_sendnocrc);
-#else
m->m_pkthdr.csum_flags = CSUM_SCTP_IPV6;
m->m_pkthdr.csum_data = offsetof(struct sctphdr, checksum);
SCTP_STAT_INCR(sctps_sendhwcrc);
-#endif
}
/* send it out. table id is taken from stcb */
#if defined(__APPLE__) || defined(SCTP_SO_LOCK_TESTING)
@@ -6916,11 +6900,11 @@ sctp_toss_old_cookies(struct sctp_tcb *stcb, struct sctp_association *asoc)
TAILQ_FOREACH_SAFE(chk, &asoc->control_send_queue, sctp_next, nchk) {
if (chk->rec.chunk_id.id == SCTP_COOKIE_ECHO) {
TAILQ_REMOVE(&asoc->control_send_queue, chk, sctp_next);
+ asoc->ctrl_queue_cnt--;
if (chk->data) {
sctp_m_freem(chk->data);
chk->data = NULL;
}
- asoc->ctrl_queue_cnt--;
sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED);
}
}
@@ -6945,11 +6929,11 @@ sctp_toss_old_asconf(struct sctp_tcb *stcb)
}
}
TAILQ_REMOVE(&asoc->asconf_send_queue, chk, sctp_next);
+ asoc->ctrl_queue_cnt--;
if (chk->data) {
sctp_m_freem(chk->data);
chk->data = NULL;
}
- asoc->ctrl_queue_cnt--;
sctp_free_a_chunk(stcb, chk, SCTP_SO_NOT_LOCKED);
}
}
@@ -7073,13 +7057,14 @@ sctp_clean_up_ctl(struct sctp_tcb *stcb, struct sctp_association *asoc, int so_l
/* Stray chunks must be cleaned up */
clean_up_anyway:
TAILQ_REMOVE(&asoc->control_send_queue, chk, sctp_next);
+ asoc->ctrl_queue_cnt--;
if (chk->data) {
sctp_m_freem(chk->data);
chk->data = NULL;
}
- asoc->ctrl_queue_cnt--;
- if (chk->rec.chunk_id.id == SCTP_FORWARD_CUM_TSN)
+ if (chk->rec.chunk_id.id == SCTP_FORWARD_CUM_TSN) {
asoc->fwd_tsn_cnt--;
+ }
sctp_free_a_chunk(stcb, chk, so_locked);
} else if (chk->rec.chunk_id.id == SCTP_STREAM_RESET) {
/* special handling, we must look into the param */
@@ -11229,23 +11214,15 @@ sctp_send_resp_msg(struct sockaddr *src, struct sockaddr *dst,
}
ip->ip_len = htons(len);
if (port) {
-#if defined(SCTP_WITH_NO_CSUM)
- SCTP_STAT_INCR(sctps_sendnocrc);
-#else
shout->checksum = sctp_calculate_cksum(mout, sizeof(struct ip) + sizeof(struct udphdr));
SCTP_STAT_INCR(sctps_sendswcrc);
-#endif
if (V_udp_cksum) {
SCTP_ENABLE_UDP_CSUM(o_pak);
}
} else {
-#if defined(SCTP_WITH_NO_CSUM)
- SCTP_STAT_INCR(sctps_sendnocrc);
-#else
mout->m_pkthdr.csum_flags = CSUM_SCTP;
mout->m_pkthdr.csum_data = offsetof(struct sctphdr, checksum);
SCTP_STAT_INCR(sctps_sendhwcrc);
-#endif
}
#ifdef SCTP_PACKET_LOGGING
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) {
@@ -11259,23 +11236,15 @@ sctp_send_resp_msg(struct sockaddr *src, struct sockaddr *dst,
case AF_INET6:
ip6->ip6_plen = (uint16_t)(len - sizeof(struct ip6_hdr));
if (port) {
-#if defined(SCTP_WITH_NO_CSUM)
- SCTP_STAT_INCR(sctps_sendnocrc);
-#else
shout->checksum = sctp_calculate_cksum(mout, sizeof(struct ip6_hdr) + sizeof(struct udphdr));
SCTP_STAT_INCR(sctps_sendswcrc);
-#endif
if ((udp->uh_sum = in6_cksum(o_pak, IPPROTO_UDP, sizeof(struct ip6_hdr), len - sizeof(struct ip6_hdr))) == 0) {
udp->uh_sum = 0xffff;
}
} else {
-#if defined(SCTP_WITH_NO_CSUM)
- SCTP_STAT_INCR(sctps_sendnocrc);
-#else
mout->m_pkthdr.csum_flags = CSUM_SCTP_IPV6;
mout->m_pkthdr.csum_data = offsetof(struct sctphdr, checksum);
SCTP_STAT_INCR(sctps_sendhwcrc);
-#endif
}
#ifdef SCTP_PACKET_LOGGING
if (SCTP_BASE_SYSCTL(sctp_logging_level) & SCTP_LAST_PACKET_TRACING) {
diff --git a/freebsd/sys/netinet/sctp_sysctl.c b/freebsd/sys/netinet/sctp_sysctl.c
index 8259140f..f1a8d1d5 100644
--- a/freebsd/sys/netinet/sctp_sysctl.c
+++ b/freebsd/sys/netinet/sctp_sysctl.c
@@ -718,7 +718,6 @@ sctp_sysctl_handle_stats(SYSCTL_HANDLER_ARGS)
sb.sctps_recvauthfailed += sarry->sctps_recvauthfailed;
sb.sctps_recvexpress += sarry->sctps_recvexpress;
sb.sctps_recvexpressm += sarry->sctps_recvexpressm;
- sb.sctps_recvnocrc += sarry->sctps_recvnocrc;
sb.sctps_recvswcrc += sarry->sctps_recvswcrc;
sb.sctps_recvhwcrc += sarry->sctps_recvhwcrc;
sb.sctps_sendpackets += sarry->sctps_sendpackets;
@@ -731,7 +730,6 @@ sctp_sysctl_handle_stats(SYSCTL_HANDLER_ARGS)
sb.sctps_sendecne += sarry->sctps_sendecne;
sb.sctps_sendauth += sarry->sctps_sendauth;
sb.sctps_senderrors += sarry->sctps_senderrors;
- sb.sctps_sendnocrc += sarry->sctps_sendnocrc;
sb.sctps_sendswcrc += sarry->sctps_sendswcrc;
sb.sctps_sendhwcrc += sarry->sctps_sendhwcrc;
sb.sctps_pdrpfmbox += sarry->sctps_pdrpfmbox;
diff --git a/freebsd/sys/netinet/sctp_uio.h b/freebsd/sys/netinet/sctp_uio.h
index 93274a70..8732219c 100644
--- a/freebsd/sys/netinet/sctp_uio.h
+++ b/freebsd/sys/netinet/sctp_uio.h
@@ -986,7 +986,7 @@ struct sctpstat {
uint32_t sctps_recvexpress; /* total fast path receives all one
* chunk */
uint32_t sctps_recvexpressm; /* total fast path multi-part data */
- uint32_t sctps_recvnocrc;
+ uint32_t sctps_recv_spare; /* formerly sctps_recvnocrc */
uint32_t sctps_recvswcrc;
uint32_t sctps_recvhwcrc;
@@ -1006,7 +1006,7 @@ struct sctpstat {
uint32_t sctps_sendecne;/* total output ECNE chunks */
uint32_t sctps_sendauth;/* total output AUTH chunks FIXME */
uint32_t sctps_senderrors; /* ip_output error counter */
- uint32_t sctps_sendnocrc;
+ uint32_t sctps_send_spare; /* formerly sctps_sendnocrc */
uint32_t sctps_sendswcrc;
uint32_t sctps_sendhwcrc;
/* PCKDROPREP statistics: */
diff --git a/freebsd/sys/netinet/sctputil.c b/freebsd/sys/netinet/sctputil.c
index 98c2a708..5511df64 100644
--- a/freebsd/sys/netinet/sctputil.c
+++ b/freebsd/sys/netinet/sctputil.c
@@ -49,7 +49,7 @@ __FBSDID("$FreeBSD$");
#include <netinet/sctp_output.h>
#include <netinet/sctp_uio.h>
#include <netinet/sctp_timer.h>
-#include <netinet/sctp_indata.h>/* for sctp_deliver_data() */
+#include <netinet/sctp_indata.h>
#include <netinet/sctp_auth.h>
#include <netinet/sctp_asconf.h>
#include <netinet/sctp_bsd_addr.h>
@@ -6096,7 +6096,7 @@ sctp_m_free(struct mbuf *m)
return (m_free(m));
}
-void
+void
sctp_m_freem(struct mbuf *mb)
{
while (mb != NULL)
@@ -6166,6 +6166,7 @@ sctp_soreceive(struct socket *so,
struct sockaddr *from;
struct sctp_extrcvinfo sinfo;
int filling_sinfo = 1;
+ int flags;
struct sctp_inpcb *inp;
inp = (struct sctp_inpcb *)so->so_pcb;
@@ -6193,15 +6194,24 @@ sctp_soreceive(struct socket *so,
if (filling_sinfo) {
memset(&sinfo, 0, sizeof(struct sctp_extrcvinfo));
}
- error = sctp_sorecvmsg(so, uio, mp0, from, fromlen, flagsp,
+ if (flagsp != NULL) {
+ flags = *flagsp;
+ } else {
+ flags = 0;
+ }
+ error = sctp_sorecvmsg(so, uio, mp0, from, fromlen, &flags,
(struct sctp_sndrcvinfo *)&sinfo, filling_sinfo);
+ if (flagsp != NULL) {
+ *flagsp = flags;
+ }
if (controlp != NULL) {
/* copy back the sinfo in a CMSG format */
- if (filling_sinfo)
+ if (filling_sinfo && ((flags & MSG_NOTIFICATION) == 0)) {
*controlp = sctp_build_ctl_nchunk(inp,
(struct sctp_sndrcvinfo *)&sinfo);
- else
+ } else {
*controlp = NULL;
+ }
}
if (psa) {
/* copy back the address info */
diff --git a/freebsd/sys/netinet/tcp_output.c b/freebsd/sys/netinet/tcp_output.c
index 1cb622ac..d0f08e3a 100644
--- a/freebsd/sys/netinet/tcp_output.c
+++ b/freebsd/sys/netinet/tcp_output.c
@@ -200,7 +200,9 @@ tcp_output(struct tcpcb *tp)
int off, flags, error = 0; /* Keep compiler happy */
struct mbuf *m;
struct ip *ip = NULL;
+#ifdef TCPDEBUG
struct ipovly *ipov = NULL;
+#endif
struct tcphdr *th;
u_char opt[TCP_MAXOLEN];
unsigned ipoptlen, optlen, hdrlen;
@@ -489,59 +491,7 @@ after_sack_rexmit:
/* len will be >= 0 after this point. */
KASSERT(len >= 0, ("[%s:%d]: len < 0", __func__, __LINE__));
- /*
- * Automatic sizing of send socket buffer. Often the send buffer
- * size is not optimally adjusted to the actual network conditions
- * at hand (delay bandwidth product). Setting the buffer size too
- * small limits throughput on links with high bandwidth and high
- * delay (eg. trans-continental/oceanic links). Setting the
- * buffer size too big consumes too much real kernel memory,
- * especially with many connections on busy servers.
- *
- * The criteria to step up the send buffer one notch are:
- * 1. receive window of remote host is larger than send buffer
- * (with a fudge factor of 5/4th);
- * 2. send buffer is filled to 7/8th with data (so we actually
- * have data to make use of it);
- * 3. send buffer fill has not hit maximal automatic size;
- * 4. our send window (slow start and cogestion controlled) is
- * larger than sent but unacknowledged data in send buffer.
- *
- * The remote host receive window scaling factor may limit the
- * growing of the send buffer before it reaches its allowed
- * maximum.
- *
- * It scales directly with slow start or congestion window
- * and does at most one step per received ACK. This fast
- * scaling has the drawback of growing the send buffer beyond
- * what is strictly necessary to make full use of a given
- * delay*bandwidth product. However testing has shown this not
- * to be much of an problem. At worst we are trading wasting
- * of available bandwidth (the non-use of it) for wasting some
- * socket buffer memory.
- *
- * TODO: Shrink send buffer during idle periods together
- * with congestion window. Requires another timer. Has to
- * wait for upcoming tcp timer rewrite.
- *
- * XXXGL: should there be used sbused() or sbavail()?
- */
- if (V_tcp_do_autosndbuf && so->so_snd.sb_flags & SB_AUTOSIZE) {
- int lowat;
-
- lowat = V_tcp_sendbuf_auto_lowat ? so->so_snd.sb_lowat : 0;
- if ((tp->snd_wnd / 4 * 5) >= so->so_snd.sb_hiwat - lowat &&
- sbused(&so->so_snd) >=
- (so->so_snd.sb_hiwat / 8 * 7) - lowat &&
- sbused(&so->so_snd) < V_tcp_autosndbuf_max &&
- sendwin >= (sbused(&so->so_snd) -
- (tp->snd_nxt - tp->snd_una))) {
- if (!sbreserve_locked(&so->so_snd,
- min(so->so_snd.sb_hiwat + V_tcp_autosndbuf_inc,
- V_tcp_autosndbuf_max), so, curthread))
- so->so_snd.sb_flags &= ~SB_AUTOSIZE;
- }
- }
+ tcp_sndbuf_autoscale(tp, so, sendwin);
/*
* Decide if we can use TCP Segmentation Offloading (if supported by
@@ -1145,7 +1095,9 @@ send:
#endif /* INET6 */
{
ip = mtod(m, struct ip *);
+#ifdef TCPDEBUG
ipov = (struct ipovly *)ip;
+#endif
th = (struct tcphdr *)(ip + 1);
tcpip_fillheaders(tp->t_inpcb, ip, th);
}
@@ -1293,12 +1245,13 @@ send:
* NOTE: since TCP options buffer doesn't point into
* mbuf's data, calculate offset and use it.
*/
- if (!TCPMD5_ENABLED() || TCPMD5_OUTPUT(m, th,
- (u_char *)(th + 1) + (to.to_signature - opt)) != 0) {
+ if (!TCPMD5_ENABLED() || (error = TCPMD5_OUTPUT(m, th,
+ (u_char *)(th + 1) + (to.to_signature - opt))) != 0) {
/*
* Do not send segment if the calculation of MD5
* digest has failed.
*/
+ m_freem(m);
goto out;
}
}
@@ -1860,3 +1813,62 @@ tcp_addoptions(struct tcpopt *to, u_char *optp)
KASSERT(optlen <= TCP_MAXOLEN, ("%s: TCP options too long", __func__));
return (optlen);
}
+
+void
+tcp_sndbuf_autoscale(struct tcpcb *tp, struct socket *so, uint32_t sendwin)
+{
+
+ /*
+ * Automatic sizing of send socket buffer. Often the send buffer
+ * size is not optimally adjusted to the actual network conditions
+ * at hand (delay bandwidth product). Setting the buffer size too
+ * small limits throughput on links with high bandwidth and high
+ * delay (eg. trans-continental/oceanic links). Setting the
+ * buffer size too big consumes too much real kernel memory,
+ * especially with many connections on busy servers.
+ *
+ * The criteria to step up the send buffer one notch are:
+ * 1. receive window of remote host is larger than send buffer
+ * (with a fudge factor of 5/4th);
+ * 2. send buffer is filled to 7/8th with data (so we actually
+ * have data to make use of it);
+ * 3. send buffer fill has not hit maximal automatic size;
+ * 4. our send window (slow start and cogestion controlled) is
+ * larger than sent but unacknowledged data in send buffer.
+ *
+ * The remote host receive window scaling factor may limit the
+ * growing of the send buffer before it reaches its allowed
+ * maximum.
+ *
+ * It scales directly with slow start or congestion window
+ * and does at most one step per received ACK. This fast
+ * scaling has the drawback of growing the send buffer beyond
+ * what is strictly necessary to make full use of a given
+ * delay*bandwidth product. However testing has shown this not
+ * to be much of an problem. At worst we are trading wasting
+ * of available bandwidth (the non-use of it) for wasting some
+ * socket buffer memory.
+ *
+ * TODO: Shrink send buffer during idle periods together
+ * with congestion window. Requires another timer. Has to
+ * wait for upcoming tcp timer rewrite.
+ *
+ * XXXGL: should there be used sbused() or sbavail()?
+ */
+ if (V_tcp_do_autosndbuf && so->so_snd.sb_flags & SB_AUTOSIZE) {
+ int lowat;
+
+ lowat = V_tcp_sendbuf_auto_lowat ? so->so_snd.sb_lowat : 0;
+ if ((tp->snd_wnd / 4 * 5) >= so->so_snd.sb_hiwat - lowat &&
+ sbused(&so->so_snd) >=
+ (so->so_snd.sb_hiwat / 8 * 7) - lowat &&
+ sbused(&so->so_snd) < V_tcp_autosndbuf_max &&
+ sendwin >= (sbused(&so->so_snd) -
+ (tp->snd_nxt - tp->snd_una))) {
+ if (!sbreserve_locked(&so->so_snd,
+ min(so->so_snd.sb_hiwat + V_tcp_autosndbuf_inc,
+ V_tcp_autosndbuf_max), so, curthread))
+ so->so_snd.sb_flags &= ~SB_AUTOSIZE;
+ }
+ }
+}
diff --git a/freebsd/sys/netinet/tcp_timer.c b/freebsd/sys/netinet/tcp_timer.c
index a2f854d7..539913f4 100644
--- a/freebsd/sys/netinet/tcp_timer.c
+++ b/freebsd/sys/netinet/tcp_timer.c
@@ -120,9 +120,9 @@ SYSCTL_PROC(_net_inet_tcp, OID_AUTO, rexmit_slop, CTLTYPE_INT|CTLFLAG_RW,
&tcp_rexmit_slop, 0, sysctl_msec_to_ticks, "I",
"Retransmission Timer Slop");
-static int always_keepalive = 1;
+int tcp_always_keepalive = 1;
SYSCTL_INT(_net_inet_tcp, OID_AUTO, always_keepalive, CTLFLAG_RW,
- &always_keepalive , 0, "Assume SO_KEEPALIVE on all TCP connections");
+ &tcp_always_keepalive , 0, "Assume SO_KEEPALIVE on all TCP connections");
int tcp_fast_finwait2_recycle = 0;
SYSCTL_INT(_net_inet_tcp, OID_AUTO, fast_finwait2_recycle, CTLFLAG_RW,
@@ -473,7 +473,8 @@ tcp_timer_keep(void *xtp)
TCPSTAT_INC(tcps_keeptimeo);
if (tp->t_state < TCPS_ESTABLISHED)
goto dropit;
- if ((always_keepalive || inp->inp_socket->so_options & SO_KEEPALIVE) &&
+ if ((tcp_always_keepalive ||
+ inp->inp_socket->so_options & SO_KEEPALIVE) &&
tp->t_state <= TCPS_CLOSING) {
if (ticks - tp->t_rcvtime >= TP_KEEPIDLE(tp) + TP_MAXIDLE(tp))
goto dropit;
diff --git a/freebsd/sys/netinet/tcp_timer.h b/freebsd/sys/netinet/tcp_timer.h
index 9a26c95d..b0ff3809 100644
--- a/freebsd/sys/netinet/tcp_timer.h
+++ b/freebsd/sys/netinet/tcp_timer.h
@@ -197,6 +197,7 @@ extern int tcp_ttl; /* time to live for TCP segs */
extern int tcp_backoff[];
extern int tcp_syn_backoff[];
+extern int tcp_always_keepalive;
extern int tcp_finwait2_timeout;
extern int tcp_fast_finwait2_recycle;
diff --git a/freebsd/sys/netinet/tcp_var.h b/freebsd/sys/netinet/tcp_var.h
index 0bcb3dc6..35b44410 100644
--- a/freebsd/sys/netinet/tcp_var.h
+++ b/freebsd/sys/netinet/tcp_var.h
@@ -884,6 +884,7 @@ void tcp_sack_partialack(struct tcpcb *, struct tcphdr *);
void tcp_free_sackholes(struct tcpcb *tp);
int tcp_newreno(struct tcpcb *, struct tcphdr *);
int tcp_compute_pipe(struct tcpcb *);
+void tcp_sndbuf_autoscale(struct tcpcb *, struct socket *, uint32_t);
static inline void
tcp_fields_to_host(struct tcphdr *th)