1.recv(p, h)
if(h == DOWN) //DOWN代表此pkt要傳送出去
send(p,h);
2.send(p, h)
先check energy model,若為sleep mode則丟棄封包,
否則將handler設給callback(upcall_)
接著call sendDATA(p)及sendRTS(ETHER_ADDR(dh->dh_ra))
之後檢查channel是否idle(檢驗defer time)
當Defer timer expires的時候,程式就會去呼叫deferHandler()。
3.deferHandler()
check_pktCTRL()及mhBackoff.busy()沒有資料,回傳-1
呼叫check_pktRTS()
4.check_pktRTS()
if channel busy
增加一個contention window並重新執行backoff,
else
設定傳輸狀態為MAC_RTS
等待CTS Timeout
傳送RTS packet
5.回到recv()中的mhRecv.start(TX_Time(p), "incoming recv")
packet接收完畢後call recvHandler()
6.recvHandler()
call recv_timer()
7.recv_timer()
若判斷收到的pcaket為CTS,表示RTS已傳送成功。
call recvCTS(pktRx)
8.recvCTS(pktRx)
set pktRTS = 0
set ssrc = 0(STA Short Count)
set rtsrc = 0(RTS Retry Count)
call tx_resume()
9.tx_resume()
RTS/CTS已交換完成,準備傳送資料。
檢查channel是否idle(檢驗defer time)
當Defer timer expires的時候,程式就會去呼叫deferHandler()。
10.deferHandler()
check_pktCTRL()、mhBackoff.busy()、check_pktRTS()沒有資料,回傳-1
呼叫check_pktTx()
11.check_pktTx()
if channel busy
增加一個contention window並重新執行backoff,
else
設定傳輸狀態為MAC_SEND
等待ACK Timeout
傳送DATA packet
12.回到recv()中的mhRecv.start(TX_Time(p), "incoming recv")
packet接收完畢後call recvHandler()
13.recvHandler()
call recv_timer()
14.recv_timer()
若判斷收到的pcaket為ACK,表示DATA已傳送完畢。
call recvACK(pktRx)
15.recvACK(pktRx)
由於data packet已成功送出,call mhSend.Stop()
if packet size <= RTSThreshold
slrc = 0(STA Long Retry Count)
else
ssrc = 0
call tx_resume()
16.tx_resume()
if no data to send nor receive
goto_sleep();
else
呼叫callback
封包傳送結束。
if(h == DOWN) //DOWN代表此pkt要傳送出去
send(p,h);
2.send(p, h)
先check energy model,若為sleep mode則丟棄封包,
否則將handler設給callback(upcall_)
接著call sendDATA(p)及sendRTS(ETHER_ADDR(dh->dh_ra))
之後檢查channel是否idle(檢驗defer time)
當Defer timer expires的時候,程式就會去呼叫deferHandler()。
3.deferHandler()
check_pktCTRL()及mhBackoff.busy()沒有資料,回傳-1
呼叫check_pktRTS()
4.check_pktRTS()
if channel busy
增加一個contention window並重新執行backoff,
else
設定傳輸狀態為MAC_RTS
等待CTS Timeout
傳送RTS packet
5.回到recv()中的mhRecv.start(TX_Time(p), "incoming recv")
packet接收完畢後call recvHandler()
6.recvHandler()
call recv_timer()
7.recv_timer()
若判斷收到的pcaket為CTS,表示RTS已傳送成功。
call recvCTS(pktRx)
8.recvCTS(pktRx)
set pktRTS = 0
set ssrc = 0(STA Short Count)
set rtsrc = 0(RTS Retry Count)
call tx_resume()
9.tx_resume()
RTS/CTS已交換完成,準備傳送資料。
檢查channel是否idle(檢驗defer time)
當Defer timer expires的時候,程式就會去呼叫deferHandler()。
10.deferHandler()
check_pktCTRL()、mhBackoff.busy()、check_pktRTS()沒有資料,回傳-1
呼叫check_pktTx()
11.check_pktTx()
if channel busy
增加一個contention window並重新執行backoff,
else
設定傳輸狀態為MAC_SEND
等待ACK Timeout
傳送DATA packet
12.回到recv()中的mhRecv.start(TX_Time(p), "incoming recv")
packet接收完畢後call recvHandler()
13.recvHandler()
call recv_timer()
14.recv_timer()
若判斷收到的pcaket為ACK,表示DATA已傳送完畢。
call recvACK(pktRx)
15.recvACK(pktRx)
由於data packet已成功送出,call mhSend.Stop()
if packet size <= RTSThreshold
slrc = 0(STA Long Retry Count)
else
ssrc = 0
call tx_resume()
16.tx_resume()
if no data to send nor receive
goto_sleep();
else
呼叫callback
封包傳送結束。
全站熱搜
留言列表