FreakZ路由應(yīng)答機(jī)制

FreakZ路由應(yīng)答機(jī)制

路由應(yīng)答機(jī)制是建立在路由發(fā)現(xiàn)和路由請求完成之后進(jìn)行的恰矩,換句話說就是在通信鏈路建立完成之后记盒,幀信息被傳輸?shù)侥康墓?jié)點(diǎn)時(shí)憎蛤,由目的節(jié)點(diǎn)進(jìn)行的應(yīng)答機(jī)制;路由應(yīng)答機(jī)制在NWK.c下的mac_data_ind函數(shù)被調(diào)用,該函數(shù)的功能在另一篇文章《FreakZ學(xué)習(xí)筆記:接收過程詳解》中有解釋俩檬,這里不再贅述萎胰;相應(yīng)代碼如下:

switch (cmd.cmd_frm_id)

?????? ?{

??????? case NWK_CMD_RTE_REQ:

?????????? ?if(nib.dev_type != NWK_END_DEVICE)//Added by LiuTianmin

??????????? {???

??????????????? nwk_rte_mesh_rreq_handler(&hdr, &cmd);

??????????? }

??????????? break;

?????? ?case NWK_CMD_RTE_REP:

??????????? if(nib.dev_type != NWK_END_DEVICE)//Added by LiuTianmin

??????????? {?

??????????????? nwk_rte_mesh_rrep_handler(&hdr, &cmd);

??????????? }

??????????? break;

??????? case NWK_CMD_LEAVE:

??????????? nwk_leave_handler(&hdr, &cmd);

??????????? break;

??????? default:

??????????? break;

??????? }

這里的switch語句會(huì)分別對路由請求和路由應(yīng)答的ID進(jìn)行判斷,如果節(jié)點(diǎn)類型為終端節(jié)點(diǎn)的話棚辽,即執(zhí)行相應(yīng)的路由請求函數(shù)nwk_rte_mesh_rreq_handler或路由應(yīng)答函數(shù)nwk_rte_mesh_rrep_handler技竟。

路由應(yīng)答函數(shù)nwk_rte_mesh_rrep_handler的主要功能是處理傳入的路由線路并確定是否需要路由應(yīng)答;首先屈藐,需要確保本次路由應(yīng)答有一個(gè)對應(yīng)的發(fā)現(xiàn)表和路由表榔组,如果沒有,那么丟棄回復(fù)路線灭翔,同樣驶沼,如果路徑的成本比目前發(fā)現(xiàn)路由表里保存的鏈路成本高的話介劫,同樣放棄回復(fù)路線直到有一個(gè)更高效率的鏈路建立。如果這條路由應(yīng)答是給當(dāng)前鏈路的锨推,那么結(jié)束路由發(fā)現(xiàn)過程并發(fā)送路由應(yīng)答,否則公壤,在前進(jìn)的路由回復(fù)中更新記錄路由請求的發(fā)現(xiàn)表换可。代碼原型如下:

void nwk_rte_mesh_rrep_handler(const nwk_hdr_t *hdr_in, const nwk_cmd_t *cmd_in)

{

??? nwk_pcb_t *pcb = nwk_pcb_get();

??? nwk_nib_t *nib = nwk_nib_get();

??? mem_ptr_t *disc_mem_ptr;

??? mem_ptr_t *rte_mem_ptr;

??? U8 path_cost;

??? disc_mem_ptr? = nwk_rte_disc_find(cmd_in->rrep.rreq_id, cmd_in->rrep.originator);

??? rte_mem_ptr?? = nwk_rte_tbl_find(cmd_in->rrep.responder);

??? path_cost?? = cmd_in->rrep.path_cost + NWK_STATIC_PATH_COST;

??? // if the rte entry or discovery entry doesn't exist or the path cost is not less than the current resid cost, then drop

??? // the rrep.

?? ?if ((!rte_mem_ptr) || (!disc_mem_ptr) || (path_cost >= DISC_ENTRY(disc_mem_ptr)->resid_cost))

??? {

??????? if (!rte_mem_ptr || !disc_mem_ptr)

??????? {///????????這里似乎有問題

??????????? nwk_rte_tbl_free(rte_mem_ptr);

??????????? nwk_rte_disc_free(disc_mem_ptr);

??????? }

??????? pcb->drop_rrep_frm++;

??????? return;

??? }

??? // we've met all the criteria to keep the rrep. that means we should update the rrep and disc entry.

??? // any time we update the next hop in the rte entry, we need to reset the discovery entry's expiry

??? DISC_ENTRY(disc_mem_ptr)->resid_cost? = path_cost;

??? DISC_ENTRY(disc_mem_ptr)->expiry????? = NWK_RTE_DISC_TIME;

??? RTE_ENTRY(rte_mem_ptr)->next_hop????? = hdr_in->mac_hdr->src_addr.short_addr;

??? // update the entry to validation underway. once we send an actual frame through it, then we can change

??? // it to NWK_VALIDATION_UNDERWAY.

??? RTE_ENTRY(rte_mem_ptr)->status = (RTE_ENTRY(rte_mem_ptr)->status == NWK_DISCOVERY_UNDERWAY) ?

????????????????????????????????????? NWK_VALIDATION_UNDERWAY :

????????????????????????????????????? RTE_ENTRY(rte_mem_ptr)->status;

??? // check if the rrep is meant for us.

?? ?if (cmd_in->rrep.originator == nib->short_addr)

??? {

??????? /*We should remove the roter request from req_list added by LiuTianmin*/

??????? mem_ptr_t *mem_ptr;

??????? mem_ptr = nwk_rte_mesh_rreq_find(nib->short_addr,cmd_in->rrep.responder);

??????? nwk_rte_mesh_rreq_free(mem_ptr);

??????? /*We should remove the roter request from req_list added by LiuTianmin*/

??????? // send out pending xfers

??????? nwk_pend_send_pending();

??????? DBG_PRINT("\nNWK_RTE_MESH: Route established.\n");

??????? return;

??? }

??? // forward the route reply

?? ?nwk_rte_mesh_send_rrep(cmd_in->rrep.rreq_id, cmd_in->rrep.originator, cmd_in->rrep.responder,

?????????????????????????? path_cost, DISC_ENTRY(disc_mem_ptr)->sender_addr);

}

nwk_rte_mesh_send_rrep為發(fā)送路由應(yīng)答函數(shù),原型如下:

static void nwk_rte_mesh_send_rrep(U8 rreq_id, U16 originator, U16 responder, U8 path_cost, U16 sender_addr)

{

??? nwk_nib_t *nib = nwk_nib_get();

??? nwk_hdr_t hdr;

??? nwk_cmd_t cmd;

??? buffer_t *buf;

??? cmd.cmd_frm_id????????????? = NWK_CMD_RTE_REP;

??? cmd.rrep.cmd_opts?????????? = 0x00;

??? cmd.rrep.rreq_id??????????? = rreq_id;

??? cmd.rrep.originator???? ????= originator;

??? cmd.rrep.responder????????? = responder;

??? cmd.rrep.path_cost????????? = path_cost;

??? hdr.nwk_frm_ctrl.frame_type = NWK_CMD_FRM;

??? hdr.nwk_frm_ctrl.disc_route = false;

??? hdr.src_addr??????????????? = nib->short_addr;

??? hdr.dest_addr?????????????? = sender_addr;

??? hdr.radius????????????????? = (U8)(nib->max_depth << 1);

??? hdr.seq_num???????????????? = nib->seq_num;

??? BUF_ALLOC(buf, TX);

??? nwk_gen_cmd(buf, &cmd);

??? debug_dump_nwk_cmd(&cmd);

??? //nwk_fwd(buf, &hdr);?? //Delete by LiuTianmin

??? /*I think here should respone direct to the sender*/

??? mac_hdr_t mac_hdr_out;

??? buf->len = aMaxPHYPacketSize - (buf->dptr - buf->buf);

??? hdr.mac_hdr???????? = &mac_hdr_out;

??? hdr.mac_hdr->src_addr.mode????????? = SHORT_ADDR;

??? hdr.mac_hdr->dest_addr.mode???????? = SHORT_ADDR;

??? hdr.mac_hdr->src_addr.short_addr??? = nib->short_addr;

??? hdr.mac_hdr->dest_addr.short_addr?? = hdr.dest_addr;

? ??nwk_tx(buf, &hdr, false);

}

當(dāng)路由應(yīng)答產(chǎn)生之后厦幅,會(huì)通過nwk_tx函數(shù)將該路由應(yīng)答由NWK層傳遞到MAC層沾鳄,通過MAC層到達(dá)Radio層,然后將應(yīng)答信息發(fā)送确憨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洞渔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缚态,更是在濱河造成了極大的恐慌磁椒,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玫芦,死亡現(xiàn)場離奇詭異浆熔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)桥帆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門医增,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人老虫,你說我怎么就攤上這事叶骨。” “怎么了祈匙?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵忽刽,是天一觀的道長天揖。 經(jīng)常有香客問我,道長跪帝,這世上最難降的妖魔是什么今膊? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮伞剑,結(jié)果婚禮上斑唬,老公的妹妹穿的比我還像新娘。我一直安慰自己黎泣,他們只是感情好恕刘,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抒倚,像睡著了一般雪营。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衡便,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天献起,我揣著相機(jī)與錄音,去河邊找鬼镣陕。 笑死谴餐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的呆抑。 我是一名探鬼主播岂嗓,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鹊碍!你這毒婦竟也來了厌殉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤侈咕,失蹤者是張志新(化名)和其女友劉穎公罕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耀销,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡楼眷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熊尉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罐柳。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖狰住,靈堂內(nèi)的尸體忽然破棺而出张吉,到底是詐尸還是另有隱情,我是刑警寧澤催植,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布肮蛹,位于F島的核電站勺择,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蔗崎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一扰藕、第九天 我趴在偏房一處隱蔽的房頂上張望缓苛。 院中可真熱鬧,春花似錦邓深、人聲如沸未桥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冬耿。三九已至,卻和暖如春萌壳,著一層夾襖步出監(jiān)牢的瞬間亦镶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工袱瓮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缤骨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓尺借,卻偏偏與公主長得像绊起,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子燎斩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349