summaryrefslogtreecommitdiff
path: root/cesar/mac/pbproc/src/fsm_tx_sound.c
blob: fbcd7cb759767036e02284993d42b1d662ac234a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/* Maria project {{{
 *
 * Copyright (C) 2007 Spidcom
 *
 * <<<Licence>>>
 *
 * }}} */
/**
 * \file    mac/pbproc/src/fsm_tx_sound.c
 * \brief   FSM TX SOUND part.
 * \ingroup mac_pbproc
 */
#include "common/std.h"

#include "inc/context.h"
#include "inc/fc.h"

#include "inc/fsm_top.h"
#include "inc/fsm_handle_fc.h"
#include "inc/prep_mpdu.h"
#include "inc/pbproc.h"

#include "inc/fsm_tx_sound.h"

void
pbproc_ftso_init (pbproc_t *ctx)
{
    dbg_assert (ctx);
    ctx->fsm.states[PBPROC_FSM_STATE_TX_SOUND_WAIT_ACK].rx_fc_cb =
        pbproc_ftso__tx_sound_wait_ack__rx_fc;
    ctx->fsm.states[PBPROC_FSM_STATE_TX_SOUND_WAIT_ACK].access_cb =
        pbproc_ftso__tx_sound_wait_ack__access;
}

void ARCH_ILRAM_PRIO (2)
pbproc_ftso__handle (pbproc_t *ctx)
{
    dbg_claim (ctx);
    if (PHY_FC_MODE_IS_HYBRID (ctx->prep_mpdu.fc_mode))
        phy_tx_fc10 (ctx->phy, ctx->prep_mpdu.tx_date, ctx->prep_mpdu.fc10);
    phy_tx_param_sound (ctx->phy, ctx->prep_mpdu.fc_mode, 1,
                        ctx->prep_mpdu.phy_combo_params, ctx->prep_mpdu.gil,
                        ctx->prep_mpdu.symb_nb);
    bool prp = ctx->access.prp && !ctx->prep_mpdu.rts_cts;
    phy_tx_frame (ctx->phy, ctx->prep_mpdu.tx_date, false, prp,
                  ctx->prep_mpdu.fc_av.words);
    ca_access_vcs_restart_eifs (ctx->ca, ctx->prep_mpdu.tx_date);
    phy_rx_activate (ctx->phy, false, ctx->prep_mpdu.tx_date
                     + ctx->prep_mpdu.flp_tck, true);
    pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_TX_SOUND_WAIT_ACK);
    ctx->stats.tx_sound++;
}

void ARCH_ILRAM_PRIO (2)
pbproc_ftso__tx_sound_wait_ack__rx_fc (pbproc_t *ctx, u32 rx_date,
                                       const pbproc_fc_t *fc_av)
{
    dbg_claim (ctx);
    /* Is it our ACK. */
    pbproc_prep_mpdu_t *prep = &ctx->prep_mpdu;
    if (fc_av
        && fc_av->generic.dt_av == PBPROC_FC_DT_SOUND
        && fc_av->generic.access == false
        && fc_av->generic.snid == ctx->alloc.snid
        && fc_av->sound.saf == true
        && fc_av->sound.stei == prep->dtei
        && fc_av->sound.dtei == prep->stei
        && less_mod2p32 (rx_date, prep->tx_date + prep->flp_tck
                         + MAC_TOLERANCE_TCK))
    {
        phy_rx_prepare_short (ctx->phy);
        /* Handle acknowledgement. */
        pbproc_prep_mpdu_sound_ack (ctx, fc_av->sound.scf);
        /* Next. */
        if (!ctx->access.cfp)
        {
            ca_backoff_success (ctx->ca);
            ca_access_vcs_restart (ctx->ca, rx_date + ctx->times.pre_fcs_tck
                                   + MAC_CIFS_TCK);
            pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
        }
        else
        {
            //handle_access ();
        }
        /* Update stats. */
        ctx->stats.tx_sound_ack++;
    }
    else
    {
        /* Cancel transmission. */
        pbproc_prep_mpdu_sound_ack (ctx, false);
        /* Update backoff. */
        pbproc_backoff_lost (ctx);
        /* Handle FC. */
        pbproc_fhfc_handle_fc (ctx, rx_date, fc_av);
        /* Update stats. */
        ctx->stats.tx_sound_noack++;
    }
}

void ARCH_ILRAM_PRIO (2)
pbproc_ftso__tx_sound_wait_ack__access (pbproc_t *ctx)
{
    dbg_claim (ctx);
    /* Cancel transmission. */
    pbproc_prep_mpdu_sound_ack (ctx, false);
    /* Update backoff. */
    pbproc_backoff_lost (ctx);
    /* Handle ACCESS. */
    pbproc_ftop__idle__access (ctx);
    /* Update stats. */
    ctx->stats.tx_sound_noack++;
}