summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNélio Laranjeiro2010-09-21 17:42:12 +0200
committerNélio Laranjeiro2010-09-21 18:21:03 +0200
commitaafd412e27e3b8deaa06b06abbaaf9ce3a2bc0a8 (patch)
tree44bdb99e206a3e56a142038da7d962123aef3222
parentd0e0062cdb8028f998c4c77f4a3b38c087d68ee0 (diff)
cesar/mac/sar: change the way the SAR takes last PB from PBProc, refs #1868
-rw-r--r--cesar/mac/sar/src/sar.c57
-rw-r--r--cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override.c8
-rw-r--r--cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override_mfs.c1
-rw-r--r--cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override_sar_tx_mfs_extract.c27
-rw-r--r--cesar/mac/sar/test/unit_test/ecos/src/sar_tx_job_desc_create.c52
5 files changed, 33 insertions, 112 deletions
diff --git a/cesar/mac/sar/src/sar.c b/cesar/mac/sar/src/sar.c
index dae1867901..2dc34653b1 100644
--- a/cesar/mac/sar/src/sar.c
+++ b/cesar/mac/sar/src/sar.c
@@ -1695,47 +1695,6 @@ sar_rx_upper_layer_transmit_data (sar_t *sar_ctx, sar_reassembly_ctx_t *ctx)
}
}
-void ARCH_ILRAM
-sar_tx_mac_framing__take_last_pb (sar_t *ctx, sar_msdu_t *md_data,
- sar_job_mfs_t *job_mfs)
-{
- dbg_assert (ctx);
- dbg_assert (md_data);
- dbg_assert (job_mfs);
-
- job_mfs->pb_last_taken = false;
- if (md_data->mfs->last_seg_offset != 0)
- {
- int pending_seg_nb = md_data->mfs->pending_seg_nb;
- pb_t *last = pbproc_mfs_extract_tail (md_data->mfs);
- if (last)
- {
- if ((u16)(last->header.ssn + 1) == md_data->mfs->next_ssn)
- {
- job_mfs->job.first_pb_desc = (blk_t*) last;
- job_mfs->pb_last_taken = true;
- /* Add a reference on the PB. */
- blk_addref_desc (job_mfs->job.first_pb_desc);
- last->expiration_ntb = md_data->arrival_ntb
- + md_data->mfs->common.expiration_delay_tck;
- }
- else
- {
- /* Give back the taken segment to the PBproc only if the
- * PBProc owns it. */
- if (!pending_seg_nb)
- pbproc_mfs_provide (md_data->mfs, 1);
-
- md_data->mfs->last_seg_offset = 0;
- }
- }
- else
- md_data->mfs->last_seg_offset = 0;
- }
- else
- md_data->mfs->last_seg_offset = 0;
-}
-
void
sar_tx_mac_framing (sar_t *ctx, sar_msdu_t *md_data)
{
@@ -1748,9 +1707,21 @@ sar_tx_mac_framing (sar_t *ctx, sar_msdu_t *md_data)
/* initialise the job descriptor. */
ctx->job_tx->mfs = (mfs_t *) md_data->mfs;
ctx->job_tx->user_data = md_data->user_data;
- ctx->job_tx->job.first_pb_desc = NULL;
+ ctx->job_tx->pb_last_taken = false;
/* Take the last PB from the MFS if possible. */
- sar_tx_mac_framing__take_last_pb (ctx, md_data, ctx->job_tx);
+ if ((ctx->job_tx->job.first_pb_desc =
+ (blk_t*) pbproc_mfs_extract_tail (md_data->mfs)))
+ {
+ ctx->job_tx->pb_last_taken = true;
+ /* Add a reference on the PB. */
+ blk_addref_desc (ctx->job_tx->job.first_pb_desc);
+ ((pb_t*) ctx->job_tx->job.first_pb_desc)->expiration_ntb =
+ md_data->arrival_ntb + md_data->mfs->common.expiration_delay_tck;
+ }
+ dbg_assert ((ctx->job_tx->job.first_pb_desc == NULL
+ && ctx->job_tx->mfs->tx.last_seg_offset == 0)
+ || (ctx->job_tx->job.first_pb_desc
+ && ctx->job_tx->mfs->tx.last_seg_offset != 0));
/* Create the job for the Bridge DMA
* Fill the job and create allocate the PBs necessary to stock the MF
* contained in the md_data
diff --git a/cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override.c b/cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override.c
index 929df18f93..d1eedaae33 100644
--- a/cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override.c
+++ b/cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override.c
@@ -14,7 +14,7 @@
#include "common/std.h"
#include "lib/test.h"
#include "lib/blk.h"
-
+#include "lib/trace.h"
#include <cyg/kernel/kapi.h>
#include <cyg/hal/hal_arch.h>
@@ -26,17 +26,15 @@ main (int argc, char** argv)
{
test_t test;
test_init (test, argc, argv);
-
+ trace_init ();
test_suite_tx_job (test);
-
+ trace_uninit ();
test_begin (test, "Memory")
{
test_fail_if (blk_check_memory() == false, "Memory not freed");
}
test_end;
-
test_result (test);
HAL_PLATFORM_EXIT (test_nb_failed (test) == 0 ? 0 : 1);
return test_nb_failed (test) == 0 ? 0 : 1;
-
}
diff --git a/cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override_mfs.c b/cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override_mfs.c
index 8b0c151b7a..ee998726c5 100644
--- a/cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override_mfs.c
+++ b/cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override_mfs.c
@@ -21,6 +21,7 @@ pbproc_mfs_provide (mfs_tx_t *mfs, uint nb)
pb_t *
pbproc_mfs_extract_tail (mfs_tx_t *mfs)
{
+ mfs->last_seg_offset = 0;
return NULL;
}
diff --git a/cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override_sar_tx_mfs_extract.c b/cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override_sar_tx_mfs_extract.c
index 704cb6b3ae..c1a7dcf3fc 100644
--- a/cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override_sar_tx_mfs_extract.c
+++ b/cesar/mac/sar/test/unit_test/ecos/src/sar_pbproc_override_sar_tx_mfs_extract.c
@@ -13,15 +13,10 @@
*/
#include "common/std.h"
#include "lib/test.h"
-
-#include "mac/sar/inc/sar_context.h"
-
-void
-sar_job_mfs_fill (sar_job_mfs_t* job, bool tx);
+#include "mac/sar/test/unit_test/ecos/tests.h"
void
-sar_tx_mac_framing__take_last_pb (sar_t *ctx, sar_msdu_t *md_data,
- sar_job_mfs_t *job_mfs);
+sar_tx_mac_framing (sar_t *ctx, sar_msdu_t *md_data);
void
test_case_tx_job_take_last_pb (test_t test)
@@ -30,19 +25,27 @@ test_case_tx_job_take_last_pb (test_t test)
test_begin (test, "Extract return NULL")
{
+ u8 buffer[128];
+ sar_test_t t;
+ sar_test_init (&t, INVALID_PTR, INVALID_PTR);
sar_msdu_t msdu;
- sar_job_mfs_t job;
mfs_tx_t mfs;
mfs_tx_init (&mfs, false, false, 1, 1);
msdu.mfs = &mfs;
mfs.seg_nb = 1;
msdu.arrival_ntb = 0x12345678;
- sar_job_mfs_fill (&job, true);
+ msdu.buffer_address = buffer;
+ msdu.length = 60;
mfs.last_seg_offset = 139;
- sar_tx_mac_framing__take_last_pb (INVALID_PTR, &msdu, &job);
- test_fail_unless (job.pb_last_taken == false);
- test_fail_unless (mfs.last_seg_offset == 0);
+ sar_tx_mac_framing (t.sar, &msdu);
+ test_fail_unless (t.sar->job_tx->pb_last_taken == false);
+ test_fail_unless (mfs.last_seg_offset == 66);
test_fail_unless (mfs.head == NULL);
+ /* Release the reference of the job descriptor. */
+ blk_release_desc (t.sar->job_tx->job.first_pb_desc);
+ /* Release the reference of the bridge DMA. */
+ blk_release_desc (t.sar->job_tx->job.first_pb_desc);
+ sar_test_uninit (&t);
}
test_end;
}
diff --git a/cesar/mac/sar/test/unit_test/ecos/src/sar_tx_job_desc_create.c b/cesar/mac/sar/test/unit_test/ecos/src/sar_tx_job_desc_create.c
index 75765915e0..21623614dd 100644
--- a/cesar/mac/sar/test/unit_test/ecos/src/sar_tx_job_desc_create.c
+++ b/cesar/mac/sar/test/unit_test/ecos/src/sar_tx_job_desc_create.c
@@ -206,61 +206,9 @@ test_case_tx_job_desc_crate (test_t test)
}
void
-test_case_tx_job_take_last_pb (test_t test)
-{
- test_case_begin (test, "TX with last PB");
-
- test_begin (test, "last PB SSN < NEXT SSN")
- {
- sar_msdu_t msdu;
- sar_job_mfs_t job;
- mfs_tx_t mfs;
-
- mfs_tx_init (&mfs, false, false, 1, 1);
- msdu.mfs = &mfs;
- msdu.arrival_ntb = 0x12345678;
- sar_job_mfs_fill (&job, true);
- mfs.last_seg_offset = 139;
- sar_tx_mac_framing__take_last_pb (INVALID_PTR, &msdu, &job);
- test_fail_unless (mfs.last_seg_offset == 0);
- test_fail_unless (mfs.seg_nb == 0);
- test_fail_unless (mfs.pending_seg_nb == 0);
- test_fail_unless (mfs.head == NULL);
- mfs.head = (pb_t*) blk_alloc_desc ();
- mfs.head->header.ssn = 1;
- mfs.tail = mfs.head;
- mfs.seg_nb = 1;
- mfs.pending_seg_nb = 0;
- mfs.next_ssn = 3;
- mfs.last_seg_offset = 10;
- sar_tx_mac_framing__take_last_pb (INVALID_PTR, &msdu, &job);
- test_fail_unless (job.pb_last_taken == false);
- test_fail_unless (mfs.head == mfs.tail);
- test_fail_unless (mfs.seg_nb == 1);
- test_fail_unless (mfs.pending_seg_nb == 0);
- test_fail_unless (mfs.last_seg_offset == 0);
- /* PB header ssn == next_ssn */
- mfs.head->header.ssn = mfs.next_ssn - 1;
- mfs.last_seg_offset = 10;
- sar_tx_mac_framing__take_last_pb (INVALID_PTR, &msdu, &job);
- test_fail_unless (job.pb_last_taken == true);
- test_fail_unless (mfs.head == mfs.tail);
- test_fail_unless (mfs.seg_nb == 0);
- test_fail_unless (mfs.pending_seg_nb == 1);
- test_fail_unless (job.job.first_pb_desc == (blk_t*) mfs.tail);
- test_fail_unless (mfs.last_seg_offset == 10);
- blk_release_desc ((blk_t*) mfs.head);
- /* Reference on the job. */
- blk_release_desc ((blk_t*) mfs.head);
- }
- test_end;
-}
-
-void
test_suite_tx_job_desc_create (test_t test)
{
test_suite_begin (test, "SAR TX job desc create");
test_case_tx_job_desc_crate (test);
- test_case_tx_job_take_last_pb (test);
}