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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
pub mod areq;
pub mod sreq;
pub mod srsp;

use crate::error::Error;
use crate::subsystem::MTFramePayload;
use crate::types::CommandType;
use num_traits::FromPrimitive;

pub fn try_decode(cmd_type: &CommandType, id: u8, buffer: &[u8]) -> Result<MTFramePayload, Error> {
    use crate::types::MACCommandId::*;
    use MTFramePayload::*;

    let id = FromPrimitive::from_u8(id).ok_or(Error::InvalidCommandId(id))?;

    match cmd_type {
        CommandType::POLL => Err(Error::NotImplemented),
        CommandType::SREQ => match id {
            Init => sreq::Init::try_decode(buffer).map(|x| MAC_Init_SREQ(x)),
            DataReq => sreq::DataReq::try_decode(buffer).map(|x| MAC_DataReq_SREQ(x)),
            PurgeReq => sreq::PurgeReq::try_decode(buffer).map(|x| MAC_PurgeReq_SREQ(x)),
            AssociateReq => {
                sreq::AssociateReq::try_decode(buffer).map(|x| MAC_AssociateReq_SREQ(x))
            }
            AssociateRsp => {
                sreq::AssociateRsp::try_decode(buffer).map(|x| MAC_AssociateRsp_SREQ(x))
            }
            DisassociateReq => {
                sreq::DisassociateReq::try_decode(buffer).map(|x| MAC_DisassociateReq_SREQ(x))
            }
            GetReq => sreq::GetReq::try_decode(buffer).map(|x| MAC_GetReq_SREQ(x)),
            SetReq => sreq::SetReq::try_decode(buffer).map(|x| MAC_SetReq_SREQ(x)),
            SecurityGetReq => {
                sreq::SecurityGetReq::try_decode(buffer).map(|x| MAC_SecurityGetReq_SREQ(x))
            }
            SecuritySetReq => {
                sreq::SecuritySetReq::try_decode(buffer).map(|x| MAC_SecuritySetReq_SREQ(x))
            }
            UpdatePANIdReq => {
                sreq::UpdatePANIdReq::try_decode(buffer).map(|x| MAC_UpdatePANIdReq_SREQ(x))
            }
            AddDeviceReq => {
                sreq::AddDeviceReq::try_decode(buffer).map(|x| MAC_AddDeviceReq_SREQ(x))
            }
            DeleteDeviceReq => {
                sreq::DeleteDeviceReq::try_decode(buffer).map(|x| MAC_DeleteDeviceReq_SREQ(x))
            }
            DeleteAllDevicesReq => sreq::DeleteAllDevicesReq::try_decode(buffer)
                .map(|x| MAC_DeleteAllDevicesReq_SREQ(x)),
            DeleteKeyReq => {
                sreq::DeleteKeyReq::try_decode(buffer).map(|x| MAC_DeleteKeyReq_SREQ(x))
            }
            ReadKeyReq => sreq::ReadKeyReq::try_decode(buffer).map(|x| MAC_ReadKeyReq_SREQ(x)),
            WriteKeyReq => sreq::WriteKeyReq::try_decode(buffer).map(|x| MAC_WriteKeyReq_SREQ(x)),
            OrphanRsp => sreq::OrphanRsp::try_decode(buffer).map(|x| MAC_OrphanRsp_SREQ(x)),
            PollReq => sreq::PollReq::try_decode(buffer).map(|x| MAC_PollReq_SREQ(x)),
            ResetReq => sreq::ResetReq::try_decode(buffer).map(|x| MAC_ResetReq_SREQ(x)),
            ScanReq => sreq::ScanReq::try_decode(buffer).map(|x| MAC_ScanReq_SREQ(x)),
            StartReq => sreq::StartReq::try_decode(buffer).map(|x| MAC_StartReq_SREQ(x)),
            SyncReq => sreq::SyncReq::try_decode(buffer).map(|x| MAC_SyncReq_SREQ(x)),
            SetRxGainReq => {
                sreq::SetRxGainReq::try_decode(buffer).map(|x| MAC_SetRxGainReq_SREQ(x))
            }
            WSAsyncReq => sreq::WSAsyncReq::try_decode(buffer).map(|x| MAC_WSAsyncReq_SREQ(x)),
            FHEnableReq => sreq::FHEnableReq::try_decode(buffer).map(|x| MAC_FHEnableReq_SREQ(x)),
            FHStartReq => sreq::FHStartReq::try_decode(buffer).map(|x| MAC_FHStartReq_SREQ(x)),
            FHGetReq => sreq::FHGetReq::try_decode(buffer).map(|x| MAC_FHGetReq_SREQ(x)),
            FHSetReq => sreq::FHSetReq::try_decode(buffer).map(|x| MAC_FHSetReq_SREQ(x)),
            _ => Err(Error::NotImplemented),
        },
        CommandType::AREQ => match id {
            DataCnf => areq::DataCnf::try_decode(buffer).map(|x| MAC_DataCnf_AREQ(x)),
            DataInd => areq::DataInd::try_decode(buffer).map(|x| MAC_DataInd_AREQ(x)),
            PurgeCnf => areq::PurgeCnf::try_decode(buffer).map(|x| MAC_PurgeCnf_AREQ(x)),
            WSAsyncInd => areq::WSAsyncInd::try_decode(buffer).map(|x| MAC_WSAsyncInd_AREQ(x)),
            SyncLossInd => areq::SyncLossInd::try_decode(buffer).map(|x| MAC_SyncLossInd_AREQ(x)),
            AssociateInd => {
                areq::AssociateInd::try_decode(buffer).map(|x| MAC_AssociateInd_AREQ(x))
            }
            AssociateCnf => {
                areq::AssociateCnf::try_decode(buffer).map(|x| MAC_AssociateCnf_AREQ(x))
            }
            BeaconNotifyInd => {
                areq::BeaconNotifyInd::try_decode(buffer).map(|x| MAC_BeaconNotifyInd_AREQ(x))
            }
            DisassociateInd => {
                areq::DisassociateInd::try_decode(buffer).map(|x| MAC_DisassociateInd_AREQ(x))
            }
            DisassociateCnf => {
                areq::DisassociateCnf::try_decode(buffer).map(|x| MAC_DisassociateCnf_AREQ(x))
            }
            OrphanInd => areq::OrphanInd::try_decode(buffer).map(|x| MAC_OrphanInd_AREQ(x)),
            PollCnf => areq::PollCnf::try_decode(buffer).map(|x| MAC_PollCnf_AREQ(x)),
            PollInd => areq::PollInd::try_decode(buffer).map(|x| MAC_PollInd_AREQ(x)),
            ScanCnf => areq::ScanCnf::try_decode(buffer).map(|x| MAC_ScanCnf_AREQ(x)),
            CommStatusInd => {
                areq::CommStatusInd::try_decode(buffer).map(|x| MAC_CommStatusInd_AREQ(x))
            }
            StartCnf => areq::StartCnf::try_decode(buffer).map(|x| MAC_StartCnf_AREQ(x)),
            WSAsyncCnf => areq::WSAsyncCnf::try_decode(buffer).map(|x| MAC_WSAsyncCnf_AREQ(x)),
            _ => Err(Error::NotImplemented),
        },
        CommandType::SRSP => match id {
            Init => srsp::Init::try_decode(buffer).map(|x| MAC_Init_SRSP(x)),
            DataReq => srsp::DataReq::try_decode(buffer).map(|x| MAC_DataReq_SRSP(x)),
            PurgeReq => srsp::PurgeReq::try_decode(buffer).map(|x| MAC_PurgeReq_SRSP(x)),
            AssociateReq => {
                srsp::AssociateReq::try_decode(buffer).map(|x| MAC_AssociateReq_SRSP(x))
            }
            AssociateRsp => {
                srsp::AssociateRsp::try_decode(buffer).map(|x| MAC_AssociateRsp_SRSP(x))
            }
            DisassociateReq => {
                srsp::DisassociateReq::try_decode(buffer).map(|x| MAC_DisassociateReq_SRSP(x))
            }
            GetReq => srsp::GetReq::try_decode(buffer).map(|x| MAC_GetReq_SRSP(x)),
            SetReq => srsp::SetReq::try_decode(buffer).map(|x| MAC_SetReq_SRSP(x)),
            SecurityGetReq => {
                srsp::SecurityGetReq::try_decode(buffer).map(|x| MAC_SecurityGetReq_SRSP(x))
            }
            SecuritySetReq => {
                srsp::SecuritySetReq::try_decode(buffer).map(|x| MAC_SecuritySetReq_SRSP(x))
            }
            UpdatePANIdReq => {
                srsp::UpdatePANIdReq::try_decode(buffer).map(|x| MAC_UpdatePANIdReq_SRSP(x))
            }
            AddDeviceReq => {
                srsp::AddDeviceReq::try_decode(buffer).map(|x| MAC_AddDeviceReq_SRSP(x))
            }
            DeleteDeviceReq => {
                srsp::DeleteDeviceReq::try_decode(buffer).map(|x| MAC_DeleteDeviceReq_SRSP(x))
            }
            DeleteAllDevicesReq => srsp::DeleteAllDevicesReq::try_decode(buffer)
                .map(|x| MAC_DeleteAllDevicesReq_SRSP(x)),
            DeleteKeyReq => {
                srsp::DeleteKeyReq::try_decode(buffer).map(|x| MAC_DeleteKeyReq_SRSP(x))
            }
            ReadKeyReq => srsp::ReadKeyReq::try_decode(buffer).map(|x| MAC_ReadKeyReq_SRSP(x)),
            WriteKeyReq => srsp::WriteKeyReq::try_decode(buffer).map(|x| MAC_WriteKeyReq_SRSP(x)),
            OrphanRsp => srsp::OrphanRsp::try_decode(buffer).map(|x| MAC_OrphanRsp_SRSP(x)),
            PollReq => srsp::PollReq::try_decode(buffer).map(|x| MAC_PollReq_SRSP(x)),
            ResetReq => srsp::ResetReq::try_decode(buffer).map(|x| MAC_ResetReq_SRSP(x)),
            ScanReq => srsp::ScanReq::try_decode(buffer).map(|x| MAC_ScanReq_SRSP(x)),
            StartReq => srsp::StartReq::try_decode(buffer).map(|x| MAC_StartReq_SRSP(x)),
            SyncReq => srsp::SyncReq::try_decode(buffer).map(|x| MAC_SyncReq_SRSP(x)),
            SetRxGainReq => {
                srsp::SetRxGainReq::try_decode(buffer).map(|x| MAC_SetRxGainReq_SRSP(x))
            }
            WSAsyncReq => srsp::WSAsyncReq::try_decode(buffer).map(|x| MAC_WSAsyncReq_SRSP(x)),
            FHEnableReq => srsp::FHEnableReq::try_decode(buffer).map(|x| MAC_FHEnableReq_SRSP(x)),
            FHStartReq => srsp::FHStartReq::try_decode(buffer).map(|x| MAC_FHStartReq_SRSP(x)),
            FHGetReq => srsp::FHGetReq::try_decode(buffer).map(|x| MAC_FHGetReq_SRSP(x)),
            FHSetReq => srsp::FHSetReq::try_decode(buffer).map(|x| MAC_FHSetReq_SRSP(x)),
            _ => Err(Error::NotImplemented),
        },
    }
}