summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/netinet/sctp_indata.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/sys/netinet/sctp_indata.c b/sys/netinet/sctp_indata.c
index e6713a3..83ab59f 100644
--- a/sys/netinet/sctp_indata.c
+++ b/sys/netinet/sctp_indata.c
@@ -2245,15 +2245,19 @@ sctp_slide_mapping_arrays(struct sctp_tcb *stcb)
/*
* Now we also need to check the mapping array in a couple of ways.
* 1) Did we move the cum-ack point?
+ *
+ * When you first glance at this you might think that all entries that
+ * make up the postion of the cum-ack would be in the nr-mapping
+ * array only.. i.e. things up to the cum-ack are always
+ * deliverable. Thats true with one exception, when its a fragmented
+ * message we may not deliver the data until some threshold (or all
+ * of it) is in place. So we must OR the nr_mapping_array and
+ * mapping_array to get a true picture of the cum-ack.
*/
struct sctp_association *asoc;
int at;
+ uint8_t val;
int slide_from, slide_end, lgap, distance;
-
- /* EY nr_mapping array variables */
- /* int nr_at; */
- /* int nr_last_all_ones = 0; */
- /* int nr_slide_from, nr_slide_end, nr_lgap, nr_distance; */
uint32_t old_cumack, old_base, old_highest, highest_tsn;
asoc = &stcb->asoc;
@@ -2268,11 +2272,12 @@ sctp_slide_mapping_arrays(struct sctp_tcb *stcb)
*/
at = 0;
for (slide_from = 0; slide_from < stcb->asoc.mapping_array_size; slide_from++) {
- if (asoc->nr_mapping_array[slide_from] == 0xff) {
+ val = asoc->nr_mapping_array[slide_from] | asoc->mapping_array[slide_from];
+ if (val == 0xff) {
at += 8;
} else {
/* there is a 0 bit */
- at += sctp_map_lookup_tab[asoc->nr_mapping_array[slide_from]];
+ at += sctp_map_lookup_tab[val];
break;
}
}
OpenPOWER on IntegriCloud