MAC层源码分析并移植

首先MAC顶层架构分析

(一)MAC静态数据结构变量

               1:static mac_pcb_t  pcb    :MAC protocol control block instantiation                          

 typedef struct
{
    U8              mac_state;                                                           ///< Current state
    struct ctimer   mlme_tmr;                                                    ///< Callback timer shared by MAC managment functions

    // association
    address_t       parent_addr;                                               ///< Address of parent this device is requesting to join
    U8              assoc_req_dsn;                                              ///< DSN of association request

    // channel scanning
    U16             original_pan_id;                                              ///< Original PAN ID before channel scan
    U8              curr_scan_channel;                                       ///< Current channel being scanned
    U32             channel_mask;                                              ///< Channel mask for this scan
    U8              duration;                                                            ///< Duration of this scan
    U8              nwk_cnt;                                                            ///< Number of networks found
    U8              scan_type;                                                       ///< Type of scan to be performed
    bool            coor_realign_rcvd;                                         ///< Coordinator alignment received for orphan scan
    U8              energy_list[MAC_MAX_CHANNELS];         ///< Energy list to store values from energy scan

    // statistics
    U16             total_xmit;                                                        ///< Total number of transmissions attempted
    U16             total_fail;                                                         ///< Total number of transmissions failed
} mac_pcb_t;

                     2:  static mac_pib_t  pib :  MAC information base instantiation

typedef struct
{
    U16         ack_wait_duration;                  ///< Time to wait for ACK from a tx'd frame
    bool        assoc_permit;                           ///< Association is allowed
    address_t   coord_addr;                          ///< Address of parent this device is joined to
    U8          dsn;                                              ///< Current data sequence number
    U8          min_be;                                       ///< Minimum backoff interval exponent (interval ~ 2^min_be)
    U8          max_csma_backoffs;               ///< Max number of CSMA backoffs before the tx is failed
    U16         pan_id;                                        ///< PAN ID that this device is joined to
    bool        rx_on_when_idle;                      ///< Receiver is always on
    U16         resp_wait_time;                        ///< Time to wait before polling potential parent for association response
    bool        security_enb;                              ///< Security is enabled
    U16         short_addr;                                 ///< Short (network) address of this device
    U64         ext_addr;                                      ///< Extended (IEEE) address of this device
    bool        coord;                                           ///< This device is the coordinator
    U8          curr_channel;                              ///< Current active channel
} mac_pib_t;

(二)MAC层函数接口

                 1:void mac_init();各处初始化,为通信做准备

                           {

mac_queue_init();

mac_indir_init();

mac_scan_init();

process_start(&mac_process,NULL);        这个为操作系统函数,功能为注册MAC_process进程

event_mac_rx = process_alloc_event();      这个其实就是一个整数,为事件和整数建立一个对应关系

memset(&pcb, 0, sizeof(mac_pcb_t));          初始化mac_pcb_t数据结构为0

初始化各mac_pcb_t数据成员

其中 pib.dsn = (U8)drvr_get_rand();pib.ext_addr = drvr_get_rand();drvr_set_pan_id(pib.pan_id);drvr_set_short_addr(pib.short_addr);drvr_set_ext_addr(pib.ext_addr);

这上面的五个函数来自底层驱动层,直接操作硬件的。

                            }

 

                 2:  mac_pcb_t * mac_pcb_get();  返回  (Return a pointer to the MAC protocol control block structure).

 

                 3:  mac_pib_t * mac_pib_get();      Return a pointer to the MAC information base structure.

 

                  4: void mac_data_req(mac_data_req_t *req);处理更高层发出的数据,并在此函数中添加MAC头,然后放置于特别发送缓存区

                       {

                                mac_hdr_t   hdr;

                                bool   indirect;

                                 memset(&hdr, 0, sizeof(mac_hdr_t));    

                                  hdr结构体的初始化,即实现MAC头

                                 mac_gen_header()                               MAC层子函数,添加头部

                                 indirect=req->tx_options & MAC_INDIRECT_TRANS);  合成发送标志

                                mac_tx_handler(req->buf, &hdr.dest_addr, indirect, hdr.mac_frm_ctrl.ack_req, hdr.dsn, req->msdu_handle);  MAC子层函数,发送数据帧

                        }

 

                   5: void mac_cmd_handler(mac_cmd_t *cmd,mac_hdr_t*hdr)     处理接收到的命令帧并转发到正确的层,并需要设置NWK层的信息,由nwk_nib_get()获得

                    {

buffer_t *buf_out;

mac_hdr_t hdr_out;

nwk_nib_t *nib = nwk_nib_get();             来自上层NWK的函数

switch(cmd->cmd_id)          

    case MAC_ASSOC_REQ:        绑定申请命令
        if (nib->joined)
        {

            if ((pib.assoc_permit) && (hdr->src_addr.mode == LONG_ADDR))
            {
                mac_assoc_ind_t assoc_args;
                assoc_args.capability = cmd->assoc_req.cap_info;
                memcpy(&assoc_args.dev_addr, &hdr->src_addr, sizeof(address_t));
                mac_assoc_ind(&assoc_args);                      MAC子层函数
            }
            else
            {
                mac_assoc_resp_t resp_args;
                memcpy(&resp_args.dev_addr, &hdr->src_addr, sizeof(address_t));
                resp_args.assoc_short_addr = 0xFFFF;
                resp_args.status = MAC_INVALID_PARAMETER;
                mac_assoc_resp(&resp_args);                    MAC子层函数
            }
        }
        break;

    case MAC_ASSOC_RESP:
        if ((pcb.mac_state == MLME_DATA_REQ) || (pcb.mac_state == MLME_ASSOC_REQ))
        {
            pcb.mac_state = MLME_IDLE;
        }
        mac_assoc_conf(cmd->assoc_resp.short_addr, cmd->assoc_resp.assoc_status);   MAC子层函数
        break;

    case MAC_DATA_REQ:
        if (nib->joined)
        {
            DBG_PRINT("MAC: MAC Data Request Command Received.\n");
            mac_indir_data_req_handler(&hdr->src_addr);             MAC子层函数
        }
        break;

    case MAC_BEACON_REQ:
        if (nib->joined)
        {
            DBG_PRINT("MAC: MAC Beacon Request Command Received.\n");
            BUF_ALLOC(buf_out, TX);     系统函数
            mac_gen_beacon_frm(buf_out, &hdr_out);      MAC子层函数
            mac_tx_handler(buf_out, &hdr_out.dest_addr, false, false, hdr_out.dsn, 0);         MAC子层函数
        }
        break;

    case MAC_ORPHAN_NOT:
        if (hdr->src_addr.mode == LONG_ADDR)
        {
            mac_orphan_ind(hdr->src_addr.long_addr);
        }
        break;

    case MAC_COORD_REALIGN:
        // check over the coord realign frame to make sure that the data is what we had previously
        if  ((cmd->coord_realign.pan_id == pib.pan_id) && (cmd->coord_realign.short_addr == pib.short_addr))
        {
            if ((pib.coord_addr.mode == SHORT_ADDR) && (cmd->coord_realign.coord_short_addr == pib.coord_addr.short_addr))
            {
                pcb.coor_realign_rcvd = true;
            }
            else if ((pib.coord_addr.mode == LONG_ADDR) && (hdr->src_addr.mode == LONG_ADDR) &&
                     (hdr->src_addr.long_addr == pib.coord_addr.long_addr))
            {
                pcb.coor_realign_rcvd = true;
            }
            else
            {
                return;
            }
        }
        else
        {
            return;
        }

        // stop the scan once we get a valid coord realignment command frame
        // the scan will end once the channel is beyond the channel range
        pcb.curr_scan_channel = MAC_PHY_CHANNEL_OFFSET + MAC_MAX_CHANNELS;
        ctimer_stop(&pcb.mlme_tmr);       系统函数
        mac_scan(NULL);                             MAC子层函数
        break;
    default:
        break;
    }

 

                      }

你可能感兴趣的:(MAC层源码分析并移植)